From 676d5cb108a06cb479f106bf50559e445b1112be Mon Sep 17 00:00:00 2001 From: Francis Besset Date: Sun, 9 Oct 2011 22:17:39 +0200 Subject: [PATCH] [TypeConverterCollection] Added get, set, has and addCollection methods --- .../Converter/TypeConverterCollection.php | 62 ++++++++++++++----- .../Converter/TypeConverterCollectionTest.php | 28 +++++++++ 2 files changed, 76 insertions(+), 14 deletions(-) diff --git a/src/BeSimple/SoapCommon/Converter/TypeConverterCollection.php b/src/BeSimple/SoapCommon/Converter/TypeConverterCollection.php index 099d0eb..7f06142 100644 --- a/src/BeSimple/SoapCommon/Converter/TypeConverterCollection.php +++ b/src/BeSimple/SoapCommon/Converter/TypeConverterCollection.php @@ -17,16 +17,50 @@ namespace BeSimple\SoapCommon\Converter; */ class TypeConverterCollection { - private $typeConverters = array(); - - public function add(TypeConverterInterface $converter) - { - $this->typeConverters[] = $converter; - } + private $converters = array(); public function all() { - return $this->typeConverters; + return array_values($this->converters); + } + + public function get($namespace, $name) + { + if (!$this->has($namespace, $name)) { + throw new \InvalidArgumentException(sprintf('The converter "%s %s" does not exists', $namespace, $name)); + } + + return $this->converters[$namespace.':'.$name]; + } + + public function add(TypeConverterInterface $converter) + { + if ($this->has($converter->getTypeNamespace(), $converter->getTypeName())) { + throw new \InvalidArgumentException(sprintf('The converter "%s %s" already exists', $converter->getTypeNamespace(), $converter->getTypeName())); + } + + $this->converters[$converter->getTypeNamespace().':'.$converter->getTypeName()] = $converter; + } + + public function set(array $converters) + { + $this->converters = array(); + + foreach ($converters as $converter) { + $this->add($converter); + } + } + + public function has($namespace, $name) + { + return isset($this->converters[$namespace.':'.$name]); + } + + public function addCollection(TypeConverterCollection $converterCollection) + { + foreach ($converterCollection->all() as $converter) { + $this->add($converter); + } } /** @@ -36,15 +70,15 @@ class TypeConverterCollection { $typemap = array(); - foreach ($this->all() as $typeConverter) { + foreach ($this->converters as $converter) { $typemap[] = array( - 'type_name' => $typeConverter->getTypeName(), - 'type_ns' => $typeConverter->getTypeNamespace(), - 'from_xml' => function($input) use ($typeConverter) { - return $typeConverter->convertXmlToPhp($input); + 'type_name' => $converter->getTypeName(), + 'type_ns' => $converter->getTypeNamespace(), + 'from_xml' => function($input) use ($converter) { + return $converter->convertXmlToPhp($input); }, - 'to_xml' => function($input) use ($typeConverter) { - return $typeConverter->convertPhpToXml($input); + 'to_xml' => function($input) use ($converter) { + return $converter->convertPhpToXml($input); }, ); } diff --git a/tests/BeSimple/Tests/SoapCommon/Converter/TypeConverterCollectionTest.php b/tests/BeSimple/Tests/SoapCommon/Converter/TypeConverterCollectionTest.php index 19865f1..0a955cd 100644 --- a/tests/BeSimple/Tests/SoapCommon/Converter/TypeConverterCollectionTest.php +++ b/tests/BeSimple/Tests/SoapCommon/Converter/TypeConverterCollectionTest.php @@ -62,4 +62,32 @@ class TypeConverterCollectionTest extends \PHPUnit_Framework_TestCase $this->assertInstanceOf('Closure', $typemap[1]['from_xml']); $this->assertInstanceOf('Closure', $typemap[1]['to_xml']); } + + public function testSet() + { + $converters = new TypeConverterCollection(); + + $dateTimeTypeConverter = new DateTimeTypeConverter(); + $converters->add($dateTimeTypeConverter); + + $converter = array(new DateTypeConverter); + $converters->set($converter); + + $this->assertSame($converter, $converters->all()); + } + + public function testAddCollection() + { + $converters1 = new TypeConverterCollection(); + $converters2 = new TypeConverterCollection(); + + $dateTimeTypeConverter = new DateTimeTypeConverter(); + $converters2->add($dateTimeTypeConverter); + $converters1->addCollection($converters2); + + $this->assertSame(array($dateTimeTypeConverter), $converters1->all()); + + $this->setExpectedException('InvalidArgumentException'); + $converters1->addCollection($converters2); + } } \ No newline at end of file