commit 49977e7b4d3e4d0445d4e5d632afaa566f5dc140
parent 632547c2ea2d39cbdbfc43c9c126ba5061680a64
Author: Felicia Hummel <felicia@partkeepr.com>
Date: Tue, 24 Jan 2017 13:48:21 +0100
Added Unit Tests for Meta Parts, fixed single criteria part parameter matching, fixes #797
Diffstat:
3 files changed, 189 insertions(+), 3 deletions(-)
diff --git a/src/PartKeepr/PartBundle/DataFixtures/PartDataLoader.php b/src/PartKeepr/PartBundle/DataFixtures/PartDataLoader.php
@@ -4,8 +4,13 @@ namespace PartKeepr\PartBundle\DataFixtures;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\Persistence\ObjectManager;
+use PartKeepr\DoctrineReflectionBundle\Filter\Filter;
+use PartKeepr\PartBundle\Entity\MetaPartParameterCriteria;
use PartKeepr\PartBundle\Entity\Part;
+use PartKeepr\PartBundle\Entity\PartCategory;
use PartKeepr\PartBundle\Entity\PartMeasurementUnit;
+use PartKeepr\PartBundle\Entity\PartParameter;
+use PartKeepr\UnitBundle\Entity\Unit;
class PartDataLoader extends AbstractFixture
{
@@ -21,6 +26,9 @@ class PartDataLoader extends AbstractFixture
$part = new Part();
$part->setName('FOOBAR');
$part->setPartUnit($partUnit);
+ /**
+ * @var $category PartCategory
+ */
$category = $this->getReference('partcategory.first');
$storageLocation = $this->getReference('storagelocation.first');
@@ -41,9 +49,122 @@ class PartDataLoader extends AbstractFixture
$manager->persist($part);
$manager->persist($part2);
- $manager->flush();
-
$this->addReference('part.1', $part);
$this->addReference('part.2', $part2);
+
+
+ $ohms = new Unit();
+ $ohms->setName("Ohm");
+ $ohms->setSymbol("O");
+ $manager->persist($ohms);
+
+ $partParameterR1 = new PartParameter();
+ $partParameterR1->setName("Resistance");
+ $partParameterR1->setValueType(PartParameter::VALUE_TYPE_NUMERIC);
+ $partParameterR1->setUnit($ohms);
+ $partParameterR1->setValue(100);
+
+ $partParameterR2 = new PartParameter();
+ $partParameterR2->setName("Resistance");
+ $partParameterR2->setValueType(PartParameter::VALUE_TYPE_NUMERIC);
+ $partParameterR2->setUnit($ohms);
+ $partParameterR2->setValue(100);
+
+ $partParameterR3 = new PartParameter();
+ $partParameterR3->setName("Resistance");
+ $partParameterR3->setValueType(PartParameter::VALUE_TYPE_NUMERIC);
+ $partParameterR3->setUnit($ohms);
+ $partParameterR3->setValue(101);
+
+ $partParameterP1 = new PartParameter();
+ $partParameterP1->setName("Case");
+ $partParameterP1->setValueType(PartParameter::VALUE_TYPE_STRING);
+ $partParameterP1->setStringValue("1206");
+
+ $partParameterP2 = new PartParameter();
+ $partParameterP2->setName("Case");
+ $partParameterP2->setValueType(PartParameter::VALUE_TYPE_STRING);
+ $partParameterP2->setStringValue("0805");
+
+ $partParameterP3 = new PartParameter();
+ $partParameterP3->setName("Case");
+ $partParameterP3->setValueType(PartParameter::VALUE_TYPE_STRING);
+ $partParameterP3->setStringValue("0805");
+
+ $metaSourcePart1 = new Part();
+ $metaSourcePart1->setPartUnit($partUnit);
+ $metaSourcePart1->setName("100 Ohms 1206 FIRST");
+ $metaSourcePart1->setPartUnit($partUnit);
+ $metaSourcePart1->setCategory($category);
+ $metaSourcePart1->setStorageLocation($storageLocation);
+ $metaSourcePart1->addParameter($partParameterR1);
+ $metaSourcePart1->addParameter($partParameterP1);
+
+ $metaSourcePart2 = new Part();
+ $metaSourcePart2->setPartUnit($partUnit);
+ $metaSourcePart2->setName("100 Ohms 0805 SECOND");
+ $metaSourcePart2->setPartUnit($partUnit);
+ $metaSourcePart2->setCategory($category);
+ $metaSourcePart2->setStorageLocation($storageLocation);
+ $metaSourcePart2->addParameter($partParameterR2);
+ $metaSourcePart2->addParameter($partParameterP2);
+
+ $metaSourcePart3 = new Part();
+ $metaSourcePart3->setPartUnit($partUnit);
+ $metaSourcePart3->setName("100 Ohms 0805 THIRD");
+ $metaSourcePart3->setPartUnit($partUnit);
+ $metaSourcePart3->setCategory($category);
+ $metaSourcePart3->setStorageLocation($storageLocation);
+ $metaSourcePart3->addParameter($partParameterP3);
+ $metaSourcePart3->addParameter($partParameterR3);
+
+ $manager->persist($metaSourcePart1);
+ $manager->persist($metaSourcePart2);
+ $manager->persist($metaSourcePart3);
+
+ $this->addReference('metapart.source.1', $metaSourcePart1);
+ $this->addReference('metapart.source.2', $metaSourcePart2);
+ $this->addReference('metapart.source.3', $metaSourcePart3);
+
+ $metaPartParameterCriteria1 = new MetaPartParameterCriteria();
+ $metaPartParameterCriteria1->setPartParameterName("Resistance");
+ $metaPartParameterCriteria1->setValueType(PartParameter::VALUE_TYPE_NUMERIC);
+ $metaPartParameterCriteria1->setOperator(Filter::OPERATOR_EQUALS);
+ $metaPartParameterCriteria1->setValue(100);
+
+ $metaPartParameterCriteria2 = new MetaPartParameterCriteria();
+ $metaPartParameterCriteria2->setPartParameterName("Resistance");
+ $metaPartParameterCriteria2->setValueType(PartParameter::VALUE_TYPE_NUMERIC);
+ $metaPartParameterCriteria2->setOperator(Filter::OPERATOR_EQUALS);
+ $metaPartParameterCriteria2->setValue(100);
+
+ $metaPartParameterCriteria3 = new MetaPartParameterCriteria();
+ $metaPartParameterCriteria3->setValueType(PartParameter::VALUE_TYPE_STRING);
+ $metaPartParameterCriteria3->setPartParameterName("Case");
+ $metaPartParameterCriteria3->setOperator(Filter::OPERATOR_EQUALS);
+ $metaPartParameterCriteria3->setStringValue("0805");
+
+ $metaPart1 = new Part();
+ $metaPart1->setMetaPart(true);
+ $metaPart1->setName("all 100 ohms resistors");
+ $metaPart1->setCategory($category);
+ $metaPart1->setPartUnit($partUnit);
+ $metaPart1->addMetaPartParameterCriteria($metaPartParameterCriteria1);
+
+ $metaPart2 = new Part();
+ $metaPart2->setMetaPart(true);
+ $metaPart2->setName("all 100 ohms 0805 resistors");
+ $metaPart2->setCategory($category);
+ $metaPart2->setPartUnit($partUnit);
+ $metaPart2->addMetaPartParameterCriteria($metaPartParameterCriteria2);
+ $metaPart2->addMetaPartParameterCriteria($metaPartParameterCriteria3);
+
+ $manager->persist($metaPart2);
+ $manager->persist($metaPart1);
+
+ $this->addReference('metapart.1', $metaPart1);
+ $this->addReference('metapart.2', $metaPart2);
+
+ $manager->flush();
}
}
diff --git a/src/PartKeepr/PartBundle/Services/PartService.php b/src/PartKeepr/PartBundle/Services/PartService.php
@@ -113,6 +113,12 @@ class PartService
return false;
}
+ /**
+ * Returns the matching parts for a given meta part
+ * @param Part $metaPart
+ *
+ * @return Part[]
+ */
public function getMatchingMetaParts(Part $metaPart)
{
$paramCount = 0;
@@ -170,7 +176,7 @@ class PartService
if (count($results) > 1) {
$result = call_user_func_array("array_intersect", $results);
} else {
- $result = $results;
+ $result = $results[0];
}
$qb = $this->entityManager->createQueryBuilder();
diff --git a/src/PartKeepr/PartBundle/Tests/MetaPartTest.php b/src/PartKeepr/PartBundle/Tests/MetaPartTest.php
@@ -0,0 +1,59 @@
+<?php
+namespace PartKeepr\PartBundle\Tests;
+
+
+use Doctrine\Common\DataFixtures\ProxyReferenceRepository;
+use PartKeepr\CoreBundle\Tests\WebTestCase;
+use PartKeepr\PartBundle\Entity\Part;
+
+class MetaPartTest extends WebTestCase
+{
+ /**
+ * @var ProxyReferenceRepository
+ */
+ protected $fixtures;
+
+ public function setUp()
+ {
+ $this->fixtures = $this->loadFixtures(
+ [
+ 'PartKeepr\StorageLocationBundle\DataFixtures\CategoryDataLoader',
+ 'PartKeepr\StorageLocationBundle\DataFixtures\StorageLocationLoader',
+ 'PartKeepr\PartBundle\DataFixtures\CategoryDataLoader',
+ 'PartKeepr\PartBundle\DataFixtures\PartDataLoader',
+ 'PartKeepr\ManufacturerBundle\Tests\DataFixtures\ManufacturerDataLoader',
+ 'PartKeepr\DistributorBundle\Tests\DataFixtures\DistributorDataLoader',
+ ]
+ )->getReferenceRepository();
+ }
+
+ public function testMetaPartMatching () {
+ /**
+ * @var $metaPart1 Part
+ */
+ $metaPart1 = $this->fixtures->getReference("metapart.1");
+ $metaSourcePart1 = $this->fixtures->getReference("metapart.source.1");
+ $metaSourcePart2 = $this->fixtures->getReference("metapart.source.2");
+ $metaSourcePart3 = $this->fixtures->getReference("metapart.source.3");
+
+ $matches = $this->getContainer()->get("partkeepr.part_service")->getMatchingMetaParts($metaPart1);
+
+ $this->assertContains($metaSourcePart1, $matches);
+ $this->assertContains($metaSourcePart2, $matches);
+ $this->assertNotContains($metaSourcePart3, $matches);
+
+ /**
+ * @var $metaPart2 Part
+ */
+ $metaPart2 = $this->fixtures->getReference("metapart.2");
+
+ $matches2 = $this->getContainer()->get("partkeepr.part_service")->getMatchingMetaParts($metaPart2);
+
+ $this->assertNotContains($metaSourcePart1, $matches2);
+ $this->assertContains($metaSourcePart2, $matches2);
+ $this->assertNotContains($metaSourcePart3, $matches2);
+
+ }
+
+
+}