12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520 |
- <?php
- namespace JMS\Serializer\Tests\Serializer;
- use Doctrine\Common\Annotations\AnnotationReader;
- use Doctrine\Common\Collections\ArrayCollection;
- use JMS\Serializer\Accessor\DefaultAccessorStrategy;
- use JMS\Serializer\Accessor\ExpressionAccessorStrategy;
- use JMS\Serializer\Construction\UnserializeObjectConstructor;
- use JMS\Serializer\Context;
- use JMS\Serializer\DeserializationContext;
- use JMS\Serializer\EventDispatcher\EventDispatcher;
- use JMS\Serializer\EventDispatcher\Subscriber\DoctrineProxySubscriber;
- use JMS\Serializer\Exclusion\DepthExclusionStrategy;
- use JMS\Serializer\Exclusion\GroupsExclusionStrategy;
- use JMS\Serializer\Expression\ExpressionEvaluator;
- use JMS\Serializer\GraphNavigator;
- use JMS\Serializer\Handler\ArrayCollectionHandler;
- use JMS\Serializer\Handler\ConstraintViolationHandler;
- use JMS\Serializer\Handler\DateHandler;
- use JMS\Serializer\Handler\FormErrorHandler;
- use JMS\Serializer\Handler\HandlerRegistry;
- use JMS\Serializer\Handler\PhpCollectionHandler;
- use JMS\Serializer\Handler\StdClassHandler;
- use JMS\Serializer\JsonDeserializationVisitor;
- use JMS\Serializer\JsonSerializationVisitor;
- use JMS\Serializer\Metadata\Driver\AnnotationDriver;
- use JMS\Serializer\Metadata\Driver\YamlDriver;
- use JMS\Serializer\Naming\CamelCaseNamingStrategy;
- use JMS\Serializer\Naming\SerializedNameAnnotationStrategy;
- use JMS\Serializer\SerializationContext;
- use JMS\Serializer\Serializer;
- use JMS\Serializer\Tests\Fixtures\AccessorOrderChild;
- use JMS\Serializer\Tests\Fixtures\AccessorOrderMethod;
- use JMS\Serializer\Tests\Fixtures\AccessorOrderParent;
- use JMS\Serializer\Tests\Fixtures\Article;
- use JMS\Serializer\Tests\Fixtures\Author;
- use JMS\Serializer\Tests\Fixtures\AuthorExpressionAccess;
- use JMS\Serializer\Tests\Fixtures\AuthorList;
- use JMS\Serializer\Tests\Fixtures\AuthorReadOnly;
- use JMS\Serializer\Tests\Fixtures\AuthorReadOnlyPerClass;
- use JMS\Serializer\Tests\Fixtures\BlogPost;
- use JMS\Serializer\Tests\Fixtures\CircularReferenceParent;
- use JMS\Serializer\Tests\Fixtures\Comment;
- use JMS\Serializer\Tests\Fixtures\CurrencyAwareOrder;
- use JMS\Serializer\Tests\Fixtures\CurrencyAwarePrice;
- use JMS\Serializer\Tests\Fixtures\CustomDeserializationObject;
- use JMS\Serializer\Tests\Fixtures\DateTimeArraysObject;
- use JMS\Serializer\Tests\Fixtures\Discriminator\Car;
- use JMS\Serializer\Tests\Fixtures\Discriminator\ImagePost;
- use JMS\Serializer\Tests\Fixtures\Discriminator\Moped;
- use JMS\Serializer\Tests\Fixtures\Discriminator\Post;
- use JMS\Serializer\Tests\Fixtures\Garage;
- use JMS\Serializer\Tests\Fixtures\GetSetObject;
- use JMS\Serializer\Tests\Fixtures\GroupsObject;
- use JMS\Serializer\Tests\Fixtures\GroupsUser;
- use JMS\Serializer\Tests\Fixtures\IndexedCommentsBlogPost;
- use JMS\Serializer\Tests\Fixtures\InitializedBlogPostConstructor;
- use JMS\Serializer\Tests\Fixtures\InitializedObjectConstructor;
- use JMS\Serializer\Tests\Fixtures\InlineChild;
- use JMS\Serializer\Tests\Fixtures\InlineChildEmpty;
- use JMS\Serializer\Tests\Fixtures\InlineChildWithGroups;
- use JMS\Serializer\Tests\Fixtures\InlineParent;
- use JMS\Serializer\Tests\Fixtures\Input;
- use JMS\Serializer\Tests\Fixtures\InvalidGroupsObject;
- use JMS\Serializer\Tests\Fixtures\Log;
- use JMS\Serializer\Tests\Fixtures\MaxDepth\Gh236Foo;
- use JMS\Serializer\Tests\Fixtures\NamedDateTimeArraysObject;
- use JMS\Serializer\Tests\Fixtures\NamedDateTimeImmutableArraysObject;
- use JMS\Serializer\Tests\Fixtures\Node;
- use JMS\Serializer\Tests\Fixtures\ObjectUsingTypeCasting;
- use JMS\Serializer\Tests\Fixtures\ObjectWithEmptyHash;
- use JMS\Serializer\Tests\Fixtures\ObjectWithEmptyNullableAndEmptyArrays;
- use JMS\Serializer\Tests\Fixtures\ObjectWithIntListAndIntMap;
- use JMS\Serializer\Tests\Fixtures\ObjectWithLifecycleCallbacks;
- use JMS\Serializer\Tests\Fixtures\ObjectWithNullProperty;
- use JMS\Serializer\Tests\Fixtures\ObjectWithToString;
- use JMS\Serializer\Tests\Fixtures\ObjectWithVersionedVirtualProperties;
- use JMS\Serializer\Tests\Fixtures\ObjectWithVirtualProperties;
- use JMS\Serializer\Tests\Fixtures\Order;
- use JMS\Serializer\Tests\Fixtures\ParentDoNotSkipWithEmptyChild;
- use JMS\Serializer\Tests\Fixtures\ParentSkipWithEmptyChild;
- use JMS\Serializer\Tests\Fixtures\PersonSecret;
- use JMS\Serializer\Tests\Fixtures\PersonSecretMore;
- use JMS\Serializer\Tests\Fixtures\PersonSecretMoreVirtual;
- use JMS\Serializer\Tests\Fixtures\PersonSecretVirtual;
- use JMS\Serializer\Tests\Fixtures\Price;
- use JMS\Serializer\Tests\Fixtures\Publisher;
- use JMS\Serializer\Tests\Fixtures\SimpleInternalObject;
- use JMS\Serializer\Tests\Fixtures\SimpleObject;
- use JMS\Serializer\Tests\Fixtures\SimpleObjectProxy;
- use JMS\Serializer\Tests\Fixtures\SimpleObjectWithStaticProp;
- use JMS\Serializer\Tests\Fixtures\Tag;
- use JMS\Serializer\Tests\Fixtures\Timestamp;
- use JMS\Serializer\Tests\Fixtures\Tree;
- use JMS\Serializer\Tests\Fixtures\VehicleInterfaceGarage;
- use JMS\Serializer\VisitorInterface;
- use JMS\Serializer\XmlDeserializationVisitor;
- use JMS\Serializer\XmlSerializationVisitor;
- use JMS\Serializer\YamlSerializationVisitor;
- use Metadata\Driver\FileLocator;
- use Metadata\MetadataFactory;
- use PhpCollection\Map;
- use PhpCollection\Sequence;
- use Symfony\Component\ExpressionLanguage\ExpressionFunction;
- use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
- use Symfony\Component\Form\Form;
- use Symfony\Component\Form\FormError;
- use Symfony\Component\Form\FormFactoryBuilder;
- use Symfony\Component\Translation\IdentityTranslator;
- use Symfony\Component\Translation\MessageSelector;
- use Symfony\Component\Validator\ConstraintViolation;
- use Symfony\Component\Validator\ConstraintViolationList;
- abstract class BaseSerializationTest extends \PHPUnit_Framework_TestCase
- {
- protected $factory;
- /**
- * @var EventDispatcher
- */
- protected $dispatcher;
- /** @var Serializer */
- protected $serializer;
- protected $handlerRegistry;
- protected $serializationVisitors;
- protected $deserializationVisitors;
- protected $objectConstructor;
- public function testSerializeNullArray()
- {
- $arr = array('foo' => 'bar', 'baz' => null, null);
- $this->assertEquals(
- $this->getContent('nullable'),
- $this->serializer->serialize($arr, $this->getFormat(), SerializationContext::create()->setSerializeNull(true))
- );
- }
- public function testSerializeNullArrayExcludingNulls()
- {
- $arr = array('foo' => 'bar', 'baz' => null, null);
- $this->assertEquals(
- $this->getContent('nullable_skip'),
- $this->serializer->serialize($arr, $this->getFormat(), SerializationContext::create()->setSerializeNull(false))
- );
- }
- public function testObjectUsingTypeCasting()
- {
- $typeAliasing = new ObjectUsingTypeCasting();
- $typeAliasing->asString = new ObjectWithToString("8");
- $this->assertEquals(
- $this->getContent('type_casting'),
- $this->serialize($typeAliasing)
- );
- }
- public function testSerializeNullObject()
- {
- $obj = new ObjectWithNullProperty('foo', 'bar');
- $this->assertEquals(
- $this->getContent('simple_object_nullable'),
- $this->serializer->serialize($obj, $this->getFormat(), SerializationContext::create()->setSerializeNull(true))
- );
- }
- public function testDeserializeNullObject()
- {
- if (!$this->hasDeserializer()) {
- $this->markTestSkipped(sprintf('No deserializer available for format `%s`', $this->getFormat()));
- }
- $obj = new ObjectWithNullProperty('foo', 'bar');
- /** @var ObjectWithNullProperty $dObj */
- $dObj = $this->serializer->deserialize(
- $this->getContent('simple_object_nullable'),
- ObjectWithNullProperty::class,
- $this->getFormat()
- );
- $this->assertEquals($obj, $dObj);
- $this->assertNull($dObj->getNullProperty());
- }
- /**
- * @dataProvider getTypes
- */
- public function testNull($type)
- {
- $this->assertEquals($this->getContent('null'), $this->serialize(null), $type);
- if ($this->hasDeserializer()) {
- $this->assertEquals(null, $this->deserialize($this->getContent('null'), $type));
- }
- }
- public function getTypes()
- {
- return array(
- array('NULL'),
- array('integer'),
- array('double'),
- array('float'),
- array('string'),
- array('DateTime'),
- );
- }
- public function testString()
- {
- $this->assertEquals($this->getContent('string'), $this->serialize('foo'));
- if ($this->hasDeserializer()) {
- $this->assertEquals('foo', $this->deserialize($this->getContent('string'), 'string'));
- }
- }
- /**
- * @expectedException \JMS\Serializer\Exception\ExpressionLanguageRequiredException
- * @expectedExceptionMessage To use conditional exclude/expose in JMS\Serializer\Tests\Fixtures\PersonSecret you must configure the expression language.
- */
- public function testExpressionExclusionNotConfigured()
- {
- $person = new PersonSecret();
- $person->gender = 'f';
- $person->name = 'mike';
- $this->serialize($person);
- }
- public function testExpressionExclusionConfiguredWithDisjunctStrategy()
- {
- $person = new PersonSecret();
- $person->gender = 'f';
- $person->name = 'mike';
- $language = new ExpressionLanguage();
- $language->addFunction(new ExpressionFunction('show_data', function () {
- return "true";
- }, function () {
- return true;
- }));
- $serializer = new Serializer($this->factory, $this->handlerRegistry, $this->objectConstructor, $this->serializationVisitors, $this->deserializationVisitors, $this->dispatcher, null, new ExpressionEvaluator($language));
- $this->assertEquals($this->getContent('person_secret_hide'), $serializer->serialize($person, $this->getFormat()));
- }
- public function expressionFunctionProvider()
- {
- $person = new PersonSecret();
- $person->gender = 'f';
- $person->name = 'mike';
- $personMoreSecret = new PersonSecretMore();
- $personMoreSecret->gender = 'f';
- $personMoreSecret->name = 'mike';
- $personVirtual = new PersonSecretVirtual();
- $personVirtual->gender = 'f';
- $personVirtual->name = 'mike';
- $personMoreSecretVirtual = new PersonSecretMoreVirtual();
- $personMoreSecretVirtual->gender = 'f';
- $personMoreSecretVirtual->name = 'mike';
- $showGender = new ExpressionFunction('show_data', function () {
- return "true";
- }, function () {
- return true;
- });
- $hideGender = new ExpressionFunction('show_data', function () {
- return "false";
- }, function () {
- return false;
- });
- return [
- [
- $person,
- $showGender,
- 'person_secret_hide'
- ],
- [
- $person,
- $hideGender,
- 'person_secret_show'
- ],
- [
- $personMoreSecret,
- $showGender,
- 'person_secret_show'
- ],
- [
- $personMoreSecret,
- $hideGender,
- 'person_secret_hide'
- ],
- [
- $personVirtual,
- $showGender,
- 'person_secret_hide'
- ],
- [
- $personVirtual,
- $hideGender,
- 'person_secret_show'
- ],
- [
- $personMoreSecretVirtual,
- $showGender,
- 'person_secret_show'
- ],
- [
- $personMoreSecretVirtual,
- $hideGender,
- 'person_secret_hide'
- ]
- ];
- }
- /**
- * @dataProvider expressionFunctionProvider
- * @param PersonSecret|PersonSecretMore $person
- * @param ExpressionFunction $function
- * @param $json
- */
- public function testExpressionExclusion($person, ExpressionFunction $function, $json)
- {
- $language = new ExpressionLanguage();
- $language->addFunction($function);
- $serializer = new Serializer($this->factory, $this->handlerRegistry, $this->objectConstructor, $this->serializationVisitors, $this->deserializationVisitors, $this->dispatcher, null, new ExpressionEvaluator($language));
- $this->assertEquals($this->getContent($json), $serializer->serialize($person, $this->getFormat()));
- }
- /**
- * @dataProvider getBooleans
- */
- public function testBooleans($strBoolean, $boolean)
- {
- $this->assertEquals($this->getContent('boolean_' . $strBoolean), $this->serialize($boolean));
- if ($this->hasDeserializer()) {
- $this->assertSame($boolean, $this->deserialize($this->getContent('boolean_' . $strBoolean), 'boolean'));
- }
- }
- public function getBooleans()
- {
- return array(array('true', true), array('false', false));
- }
- /**
- * @dataProvider getNumerics
- */
- public function testNumerics($key, $value, $type)
- {
- $this->assertEquals($this->getContent($key), $this->serialize($value));
- if ($this->hasDeserializer()) {
- $this->assertEquals($value, $this->deserialize($this->getContent($key), $type));
- }
- }
- public function getNumerics()
- {
- return array(
- array('integer', 1, 'integer'),
- array('float', 4.533, 'double'),
- array('float', 4.533, 'float'),
- array('float_trailing_zero', 1.0, 'double'),
- array('float_trailing_zero', 1.0, 'float'),
- );
- }
- public function testSimpleInternalObject()
- {
- $this->factory = new MetadataFactory(new YamlDriver(new FileLocator([
- 'JMS\Serializer\Tests\Fixtures' => __DIR__ .'/metadata/SimpleInternalObject',
- '' => __DIR__ .'/metadata/SimpleInternalObject'
- ])));
- $this->serializer = new Serializer($this->factory, $this->handlerRegistry, $this->objectConstructor, $this->serializationVisitors, $this->deserializationVisitors, $this->dispatcher);
- $obj = new SimpleInternalObject('foo', 'bar');
- $this->assertEquals($this->getContent('simple_object'), $this->serialize($obj));
- if ($this->hasDeserializer()) {
- $deserialized = $this->deserialize($this->getContent('simple_object'), get_class($obj));
- $this->assertEquals(get_class($obj), get_class($deserialized));
- }
- }
- public function testSimpleObjectStaticProp()
- {
- $this->assertEquals($this->getContent('simple_object'), $this->serialize($obj = new SimpleObjectWithStaticProp('foo', 'bar')));
- if ($this->hasDeserializer()) {
- $this->assertEquals($obj, $this->deserialize($this->getContent('simple_object'), get_class($obj)));
- }
- }
- public function testSimpleObject()
- {
- $this->assertEquals($this->getContent('simple_object'), $this->serialize($obj = new SimpleObject('foo', 'bar')));
- if ($this->hasDeserializer()) {
- $this->assertEquals($obj, $this->deserialize($this->getContent('simple_object'), get_class($obj)));
- }
- }
- public function testArrayStrings()
- {
- $data = array('foo', 'bar');
- $this->assertEquals($this->getContent('array_strings'), $this->serialize($data));
- if ($this->hasDeserializer()) {
- $this->assertEquals($data, $this->deserialize($this->getContent('array_strings'), 'array<string>'));
- }
- }
- public function testArrayBooleans()
- {
- $data = array(true, false);
- $this->assertEquals($this->getContent('array_booleans'), $this->serialize($data));
- if ($this->hasDeserializer()) {
- $this->assertEquals($data, $this->deserialize($this->getContent('array_booleans'), 'array<boolean>'));
- }
- }
- public function testArrayIntegers()
- {
- $data = array(1, 3, 4);
- $this->assertEquals($this->getContent('array_integers'), $this->serialize($data));
- if ($this->hasDeserializer()) {
- $this->assertEquals($data, $this->deserialize($this->getContent('array_integers'), 'array<integer>'));
- }
- }
- public function testArrayEmpty()
- {
- if ('xml' === $this->getFormat()) {
- $this->markTestSkipped('XML can\'t be tested for empty array');
- }
- $data = array('array' => []);
- $this->assertEquals($this->getContent('array_empty'), $this->serialize($data));
- if ($this->hasDeserializer()) {
- $this->assertEquals($data, $this->deserialize($this->getContent('array_empty'), 'array'));
- }
- }
- public function testArrayFloats()
- {
- $data = array(1.34, 3.0, 6.42);
- $this->assertEquals($this->getContent('array_floats'), $this->serialize($data));
- if ($this->hasDeserializer()) {
- $this->assertEquals($data, $this->deserialize($this->getContent('array_floats'), 'array<double>'));
- }
- }
- public function testArrayObjects()
- {
- $data = array(new SimpleObject('foo', 'bar'), new SimpleObject('baz', 'boo'));
- $this->assertEquals($this->getContent('array_objects'), $this->serialize($data));
- if ($this->hasDeserializer()) {
- $this->assertEquals($data, $this->deserialize($this->getContent('array_objects'), 'array<JMS\Serializer\Tests\Fixtures\SimpleObject>'));
- }
- }
- public function testArrayListAndMapDifference()
- {
- $arrayData = array(0 => 1, 2 => 2, 3 => 3); // Misses key 1
- $data = new ObjectWithIntListAndIntMap($arrayData, $arrayData);
- $this->assertEquals($this->getContent('array_list_and_map_difference'), $this->serialize($data));
- }
- public function testDateTimeArrays()
- {
- $data = array(
- new \DateTime('2047-01-01 12:47:47', new \DateTimeZone('UTC')),
- new \DateTime('2016-12-05 00:00:00', new \DateTimeZone('UTC'))
- );
- $object = new DateTimeArraysObject($data, $data);
- $serializedObject = $this->serialize($object);
- $this->assertEquals($this->getContent('array_datetimes_object'), $serializedObject);
- if ($this->hasDeserializer()) {
- /** @var DateTimeArraysObject $deserializedObject */
- $deserializedObject = $this->deserialize($this->getContent('array_datetimes_object'), 'Jms\Serializer\Tests\Fixtures\DateTimeArraysObject');
- /** deserialized object has a default timezone set depending on user's timezone settings. That's why we manually set the UTC timezone on the DateTime objects. */
- foreach ($deserializedObject->getArrayWithDefaultDateTime() as $dateTime) {
- $dateTime->setTimezone(new \DateTimeZone('UTC'));
- }
- foreach ($deserializedObject->getArrayWithFormattedDateTime() as $dateTime) {
- $dateTime->setTimezone(new \DateTimeZone('UTC'));
- }
- $this->assertEquals($object, $deserializedObject);
- }
- }
- public function testNamedDateTimeArrays()
- {
- $data = array(
- new \DateTime('2047-01-01 12:47:47', new \DateTimeZone('UTC')),
- new \DateTime('2016-12-05 00:00:00', new \DateTimeZone('UTC'))
- );
- $object = new NamedDateTimeArraysObject(array('testdate1' => $data[0], 'testdate2' => $data[1]));
- $serializedObject = $this->serialize($object);
- $this->assertEquals($this->getContent('array_named_datetimes_object'), $serializedObject);
- if ($this->hasDeserializer()) {
- // skip XML deserialization
- if ($this->getFormat() === 'xml') {
- return;
- }
- /** @var NamedDateTimeArraysObject $deserializedObject */
- $deserializedObject = $this->deserialize($this->getContent('array_named_datetimes_object'), 'Jms\Serializer\Tests\Fixtures\NamedDateTimeArraysObject');
- /** deserialized object has a default timezone set depending on user's timezone settings. That's why we manually set the UTC timezone on the DateTime objects. */
- foreach ($deserializedObject->getNamedArrayWithFormattedDate() as $dateTime) {
- $dateTime->setTimezone(new \DateTimeZone('UTC'));
- }
- $this->assertEquals($object, $deserializedObject);
- }
- }
- /**
- * @group datetime
- */
- public function testNamedDateTimeImmutableArrays()
- {
- $data = array(
- new \DateTimeImmutable('2047-01-01 12:47:47', new \DateTimeZone('UTC')),
- new \DateTimeImmutable('2016-12-05 00:00:00', new \DateTimeZone('UTC'))
- );
- $object = new NamedDateTimeImmutableArraysObject(array('testdate1' => $data[0], 'testdate2' => $data[1]));
- $serializedObject = $this->serialize($object);
- $this->assertEquals($this->getContent('array_named_datetimeimmutables_object'), $serializedObject);
- if ($this->hasDeserializer()) {
- if ('xml' == $this->getFormat()) {
- $this->markTestSkipped("XML deserialization does not support key-val pairs mode");
- }
- /** @var NamedDateTimeArraysObject $deserializedObject */
- $deserializedObject = $this->deserialize($this->getContent('array_named_datetimeimmutables_object'), 'Jms\Serializer\Tests\Fixtures\NamedDateTimeImmutableArraysObject');
- /** deserialized object has a default timezone set depending on user's timezone settings. That's why we manually set the UTC timezone on the DateTime objects. */
- foreach ($deserializedObject->getNamedArrayWithFormattedDate() as $dateTime) {
- $dateTime->setTimezone(new \DateTimeZone('UTC'));
- }
- $this->assertEquals($object, $deserializedObject);
- }
- }
- public function testArrayMixed()
- {
- $this->assertEquals($this->getContent('array_mixed'), $this->serialize(array('foo', 1, true, new SimpleObject('foo', 'bar'), array(1, 3, true))));
- }
- /**
- * @dataProvider getDateTime
- * @group datetime
- */
- public function testDateTime($key, $value, $type)
- {
- $this->assertEquals($this->getContent($key), $this->serialize($value));
- if ($this->hasDeserializer()) {
- $deserialized = $this->deserialize($this->getContent($key), $type);
- $this->assertTrue(is_object($deserialized));
- $this->assertEquals(get_class($value), get_class($deserialized));
- $this->assertEquals($value->getTimestamp(), $deserialized->getTimestamp());
- }
- }
- public function getDateTime()
- {
- return array(
- array('date_time', new \DateTime('2011-08-30 00:00', new \DateTimeZone('UTC')), 'DateTime'),
- );
- }
- /**
- * @dataProvider getDateTimeImmutable
- * @group datetime
- */
- public function testDateTimeImmutable($key, $value, $type)
- {
- $this->assertEquals($this->getContent($key), $this->serialize($value));
- if ($this->hasDeserializer()) {
- $deserialized = $this->deserialize($this->getContent($key), $type);
- $this->assertTrue(is_object($deserialized));
- $this->assertEquals(get_class($value), get_class($deserialized));
- $this->assertEquals($value->getTimestamp(), $deserialized->getTimestamp());
- }
- }
- public function getDateTimeImmutable()
- {
- return array(
- array('date_time_immutable', new \DateTimeImmutable('2011-08-30 00:00', new \DateTimeZone('UTC')), 'DateTimeImmutable'),
- );
- }
- public function testTimestamp()
- {
- $value = new Timestamp(new \DateTime('2016-02-11 00:00:00', new \DateTimeZone('UTC')));
- $this->assertEquals($this->getContent('timestamp'), $this->serialize($value));
- if ($this->hasDeserializer()) {
- $deserialized = $this->deserialize($this->getContent('timestamp'), Timestamp::class);
- $this->assertEquals($value, $deserialized);
- $this->assertEquals($value->getTimestamp()->getTimestamp(), $deserialized->getTimestamp()->getTimestamp());
- $deserialized = $this->deserialize($this->getContent('timestamp_prev'), Timestamp::class);
- $this->assertEquals($value, $deserialized);
- $this->assertEquals($value->getTimestamp()->getTimestamp(), $deserialized->getTimestamp()->getTimestamp());
- }
- }
- public function testDateInterval()
- {
- $duration = new \DateInterval('PT45M');
- $this->assertEquals($this->getContent('date_interval'), $this->serializer->serialize($duration, $this->getFormat()));
- if ($this->hasDeserializer()) {
- $deserialized = $this->deserialize($this->getContent('date_interval'), \DateInterval::class);
- $this->assertEquals($duration, $deserialized);
- $this->assertEquals($duration->i, $deserialized->i);
- }
- }
- public function testBlogPost()
- {
- $post = new BlogPost('This is a nice title.', $author = new Author('Foo Bar'), new \DateTime('2011-07-30 00:00', new \DateTimeZone('UTC')), new Publisher('Bar Foo'));
- $post->addComment($comment = new Comment($author, 'foo'));
- $post->addTag($tag1 = New Tag("tag1"));
- $post->addTag($tag2 = New Tag("tag2"));
- $this->assertEquals($this->getContent('blog_post'), $this->serialize($post));
- if ($this->hasDeserializer()) {
- $deserialized = $this->deserialize($this->getContent('blog_post'), get_class($post));
- $this->assertEquals('2011-07-30T00:00:00+0000', $this->getField($deserialized, 'createdAt')->format(\DateTime::ISO8601));
- $this->assertAttributeEquals('This is a nice title.', 'title', $deserialized);
- $this->assertAttributeSame(false, 'published', $deserialized);
- $this->assertAttributeSame(false, 'reviewed', $deserialized);
- $this->assertAttributeSame('1edf9bf60a32d89afbb85b2be849e3ceed5f5b10', 'etag', $deserialized);
- $this->assertAttributeEquals(new ArrayCollection(array($comment)), 'comments', $deserialized);
- $this->assertAttributeEquals(new Sequence(array($comment)), 'comments2', $deserialized);
- $this->assertAttributeEquals($author, 'author', $deserialized);
- $this->assertAttributeEquals(array($tag1, $tag2), 'tag', $deserialized);
- }
- }
- public function testDeserializingNull()
- {
- $objectConstructor = new InitializedBlogPostConstructor();
- $this->serializer = new Serializer($this->factory, $this->handlerRegistry, $objectConstructor, $this->serializationVisitors, $this->deserializationVisitors, $this->dispatcher);
- $post = new BlogPost('This is a nice title.', $author = new Author('Foo Bar'), new \DateTime('2011-07-30 00:00', new \DateTimeZone('UTC')), new Publisher('Bar Foo'));
- $this->setField($post, 'author', null);
- $this->setField($post, 'publisher', null);
- $this->assertEquals($this->getContent('blog_post_unauthored'), $this->serialize($post, SerializationContext::create()->setSerializeNull(true)));
- if ($this->hasDeserializer()) {
- $deserialized = $this->deserialize($this->getContent('blog_post_unauthored'), get_class($post), DeserializationContext::create()->setSerializeNull(true));
- $this->assertEquals('2011-07-30T00:00:00+0000', $this->getField($deserialized, 'createdAt')->format(\DateTime::ISO8601));
- $this->assertAttributeEquals('This is a nice title.', 'title', $deserialized);
- $this->assertAttributeSame(false, 'published', $deserialized);
- $this->assertAttributeSame(false, 'reviewed', $deserialized);
- $this->assertAttributeEquals(new ArrayCollection(), 'comments', $deserialized);
- $this->assertEquals(null, $this->getField($deserialized, 'author'));
- }
- }
- public function testExpressionAuthor()
- {
- $namingStrategy = new SerializedNameAnnotationStrategy(new CamelCaseNamingStrategy());
- $evaluator = new ExpressionEvaluator(new ExpressionLanguage());
- $accessor = new ExpressionAccessorStrategy($evaluator, new DefaultAccessorStrategy());
- $this->serializationVisitors = new Map(array(
- 'json' => new JsonSerializationVisitor($namingStrategy, $accessor),
- 'xml' => new XmlSerializationVisitor($namingStrategy, $accessor),
- 'yml' => new YamlSerializationVisitor($namingStrategy, $accessor),
- ));
- $serializer = new Serializer($this->factory, $this->handlerRegistry, $this->objectConstructor, $this->serializationVisitors, $this->deserializationVisitors, $this->dispatcher, null, $evaluator);
- $author = new AuthorExpressionAccess(123, "Ruud", "Kamphuis");
- $this->assertEquals($this->getContent('author_expression'), $serializer->serialize($author, $this->getFormat()));
- }
- /**
- * @expectedException \JMS\Serializer\Exception\ExpressionLanguageRequiredException
- * @expectedExceptionMessage The property firstName on JMS\Serializer\Tests\Fixtures\AuthorExpressionAccess requires the expression accessor strategy to be enabled.
- */
- public function testExpressionAccessorStrategNotEnabled()
- {
- $author = new AuthorExpressionAccess(123, "Ruud", "Kamphuis");
- $this->assertEquals($this->getContent('author_expression'), $this->serialize($author));
- }
- public function testReadOnly()
- {
- $author = new AuthorReadOnly(123, 'Ruud Kamphuis');
- $this->assertEquals($this->getContent('readonly'), $this->serialize($author));
- if ($this->hasDeserializer()) {
- $deserialized = $this->deserialize($this->getContent('readonly'), get_class($author));
- $this->assertNull($this->getField($deserialized, 'id'));
- $this->assertEquals('Ruud Kamphuis', $this->getField($deserialized, 'name'));
- }
- }
- public function testReadOnlyClass()
- {
- $author = new AuthorReadOnlyPerClass(123, 'Ruud Kamphuis');
- $this->assertEquals($this->getContent('readonly'), $this->serialize($author));
- if ($this->hasDeserializer()) {
- $deserialized = $this->deserialize($this->getContent('readonly'), get_class($author));
- $this->assertNull($this->getField($deserialized, 'id'));
- $this->assertEquals('Ruud Kamphuis', $this->getField($deserialized, 'name'));
- }
- }
- public function testPrice()
- {
- $price = new Price(3);
- $this->assertEquals($this->getContent('price'), $this->serialize($price));
- if ($this->hasDeserializer()) {
- $deserialized = $this->deserialize($this->getContent('price'), get_class($price));
- $this->assertEquals(3, $this->getField($deserialized, 'price'));
- }
- }
- public function testOrder()
- {
- $order = new Order(new Price(12.34));
- $this->assertEquals($this->getContent('order'), $this->serialize($order));
- if ($this->hasDeserializer()) {
- $this->assertEquals($order, $this->deserialize($this->getContent('order'), get_class($order)));
- }
- }
- public function testCurrencyAwarePrice()
- {
- $price = new CurrencyAwarePrice(2.34);
- $this->assertEquals($this->getContent('currency_aware_price'), $this->serialize($price));
- if ($this->hasDeserializer()) {
- $this->assertEquals($price, $this->deserialize($this->getContent('currency_aware_price'), get_class($price)));
- }
- }
- public function testOrderWithCurrencyAwarePrice()
- {
- $order = new CurrencyAwareOrder(new CurrencyAwarePrice(1.23));
- $this->assertEquals($this->getContent('order_with_currency_aware_price'), $this->serialize($order));
- if ($this->hasDeserializer()) {
- $this->assertEquals($order, $this->deserialize($this->getContent('order_with_currency_aware_price'), get_class($order)));
- }
- }
- /**
- * @group handlerCallback
- */
- public function testArticle()
- {
- $article = new Article();
- $article->element = 'custom';
- $article->value = 'serialized';
- $result = $this->serialize($article);
- $this->assertEquals($this->getContent('article'), $result);
- if ($this->hasDeserializer()) {
- $this->assertEquals($article, $this->deserialize($result, 'JMS\Serializer\Tests\Fixtures\Article'));
- }
- }
- public function testInline()
- {
- $inline = new InlineParent();
- $result = $this->serialize($inline);
- $this->assertEquals($this->getContent('inline'), $result);
- // no deserialization support
- }
- public function testInlineEmptyChild()
- {
- $inline = new InlineParent(new InlineChildEmpty());
- $result = $this->serialize($inline);
- $this->assertEquals($this->getContent('inline_child_empty'), $result);
- // no deserialization support
- }
- public function testEmptyChild()
- {
- // by empty object
- $inline = new ParentDoNotSkipWithEmptyChild(new InlineChildEmpty());
- $this->assertEquals($this->getContent('empty_child'), $this->serialize($inline));
- // by nulls
- $inner = new InlineChild();
- $inner->a = null;
- $inner->b = null;
- $inline = new ParentDoNotSkipWithEmptyChild($inner);
- $this->assertEquals($this->getContent('empty_child'), $this->serialize($inline));
- // by exclusion strategy
- $context = SerializationContext::create()->setGroups(['Default']);
- $inline = new ParentDoNotSkipWithEmptyChild(new InlineChildWithGroups());
- $this->assertEquals($this->getContent('empty_child'), $this->serialize($inline, $context));
- }
- public function testSkipEmptyChild()
- {
- // by empty object
- $inline = new ParentSkipWithEmptyChild(new InlineChildEmpty());
- $this->assertEquals($this->getContent('empty_child_skip'), $this->serialize($inline));
- // by nulls
- $inner = new InlineChild();
- $inner->a = null;
- $inner->b = null;
- $inline = new ParentSkipWithEmptyChild($inner);
- $this->assertEquals($this->getContent('empty_child_skip'), $this->serialize($inline));
- // by exclusion strategy
- $context = SerializationContext::create()->setGroups(['Default']);
- $inline = new ParentSkipWithEmptyChild(new InlineChildWithGroups());
- $this->assertEquals($this->getContent('empty_child_skip'), $this->serialize($inline, $context));
- }
- /**
- * @group log
- */
- public function testLog()
- {
- $this->assertEquals($this->getContent('log'), $this->serialize($log = new Log()));
- if ($this->hasDeserializer()) {
- $deserialized = $this->deserialize($this->getContent('log'), get_class($log));
- $this->assertEquals($log, $deserialized);
- }
- }
- public function testCircularReference()
- {
- $object = new CircularReferenceParent();
- $this->assertEquals($this->getContent('circular_reference'), $this->serialize($object));
- if ($this->hasDeserializer()) {
- $deserialized = $this->deserialize($this->getContent('circular_reference'), get_class($object));
- $col = $this->getField($deserialized, 'collection');
- $this->assertEquals(2, count($col));
- $this->assertEquals('child1', $col[0]->getName());
- $this->assertEquals('child2', $col[1]->getName());
- $this->assertSame($deserialized, $col[0]->getParent());
- $this->assertSame($deserialized, $col[1]->getParent());
- $col = $this->getField($deserialized, 'anotherCollection');
- $this->assertEquals(2, count($col));
- $this->assertEquals('child1', $col[0]->getName());
- $this->assertEquals('child2', $col[1]->getName());
- $this->assertSame($deserialized, $col[0]->getParent());
- $this->assertSame($deserialized, $col[1]->getParent());
- }
- }
- public function testLifecycleCallbacks()
- {
- $object = new ObjectWithLifecycleCallbacks();
- $this->assertEquals($this->getContent('lifecycle_callbacks'), $this->serialize($object));
- $this->assertAttributeSame(null, 'name', $object);
- if ($this->hasDeserializer()) {
- $deserialized = $this->deserialize($this->getContent('lifecycle_callbacks'), get_class($object));
- $this->assertEquals($object, $deserialized);
- }
- }
- public function testFormErrors()
- {
- $errors = array(
- new FormError('This is the form error'),
- new FormError('Another error')
- );
- $this->assertEquals($this->getContent('form_errors'), $this->serialize($errors));
- }
- public function testNestedFormErrors()
- {
- $dispatcher = $this->getMockBuilder('Symfony\Component\EventDispatcher\EventDispatcherInterface')->getMock();
- $formConfigBuilder = new \Symfony\Component\Form\FormConfigBuilder('foo', null, $dispatcher);
- $formConfigBuilder->setCompound(true);
- $formConfigBuilder->setDataMapper($this->getMockBuilder('Symfony\Component\Form\DataMapperInterface')->getMock());
- $fooConfig = $formConfigBuilder->getFormConfig();
- $form = new Form($fooConfig);
- $form->addError(new FormError('This is the form error'));
- $formConfigBuilder = new \Symfony\Component\Form\FormConfigBuilder('bar', null, $dispatcher);
- $barConfig = $formConfigBuilder->getFormConfig();
- $child = new Form($barConfig);
- $child->addError(new FormError('Error of the child form'));
- $form->add($child);
- $this->assertEquals($this->getContent('nested_form_errors'), $this->serialize($form));
- }
- public function testFormErrorsWithNonFormComponents()
- {
- if (!class_exists('Symfony\Component\Form\Extension\Core\Type\SubmitType')) {
- $this->markTestSkipped('Not using Symfony Form >= 2.3 with submit type');
- }
- $dispatcher = $this->getMockBuilder('Symfony\Component\EventDispatcher\EventDispatcherInterface')->getMock();
- $factoryBuilder = new FormFactoryBuilder();
- $factoryBuilder->addType(new \Symfony\Component\Form\Extension\Core\Type\SubmitType);
- $factoryBuilder->addType(new \Symfony\Component\Form\Extension\Core\Type\ButtonType);
- $factory = $factoryBuilder->getFormFactory();
- $formConfigBuilder = new \Symfony\Component\Form\FormConfigBuilder('foo', null, $dispatcher);
- $formConfigBuilder->setFormFactory($factory);
- $formConfigBuilder->setCompound(true);
- $formConfigBuilder->setDataMapper($this->getMockBuilder('Symfony\Component\Form\DataMapperInterface')->getMock());
- $fooConfig = $formConfigBuilder->getFormConfig();
- $form = new Form($fooConfig);
- $form->add('save', \Symfony\Component\Form\Extension\Core\Type\SubmitType::class);
- try {
- $this->serialize($form);
- } catch (\Exception $e) {
- $this->assertTrue(false, 'Serialization should not throw an exception');
- }
- }
- public function testConstraintViolation()
- {
- $violation = new ConstraintViolation('Message of violation', 'Message of violation', array(), null, 'foo', null);
- $this->assertEquals($this->getContent('constraint_violation'), $this->serialize($violation));
- }
- public function testConstraintViolationList()
- {
- $violations = new ConstraintViolationList();
- $violations->add(new ConstraintViolation('Message of violation', 'Message of violation', array(), null, 'foo', null));
- $violations->add(new ConstraintViolation('Message of another violation', 'Message of another violation', array(), null, 'bar', null));
- $this->assertEquals($this->getContent('constraint_violation_list'), $this->serialize($violations));
- }
- public function testDoctrineProxy()
- {
- if (!class_exists('Doctrine\ORM\Version')) {
- $this->markTestSkipped('Doctrine is not available.');
- }
- $object = new SimpleObjectProxy('foo', 'bar');
- $this->assertEquals($this->getContent('orm_proxy'), $this->serialize($object));
- }
- public function testInitializedDoctrineProxy()
- {
- if (!class_exists('Doctrine\ORM\Version')) {
- $this->markTestSkipped('Doctrine is not available.');
- }
- $object = new SimpleObjectProxy('foo', 'bar');
- $object->__load();
- $this->assertEquals($this->getContent('orm_proxy'), $this->serialize($object));
- }
- public function testCustomAccessor()
- {
- $post = new IndexedCommentsBlogPost();
- $this->assertEquals($this->getContent('custom_accessor'), $this->serialize($post));
- }
- public function testMixedAccessTypes()
- {
- $object = new GetSetObject();
- $this->assertEquals($this->getContent('mixed_access_types'), $this->serialize($object));
- if ($this->hasDeserializer()) {
- $object = $this->deserialize($this->getContent('mixed_access_types'), 'JMS\Serializer\Tests\Fixtures\GetSetObject');
- $this->assertAttributeEquals(1, 'id', $object);
- $this->assertAttributeEquals('Johannes', 'name', $object);
- $this->assertAttributeEquals(42, 'readOnlyProperty', $object);
- }
- }
- public function testAccessorOrder()
- {
- $this->assertEquals($this->getContent('accessor_order_child'), $this->serialize(new AccessorOrderChild()));
- $this->assertEquals($this->getContent('accessor_order_parent'), $this->serialize(new AccessorOrderParent()));
- $this->assertEquals($this->getContent('accessor_order_methods'), $this->serialize(new AccessorOrderMethod()));
- }
- public function testGroups()
- {
- $groupsObject = new GroupsObject();
- $this->assertEquals($this->getContent('groups_all'), $this->serializer->serialize($groupsObject, $this->getFormat()));
- $this->assertEquals(
- $this->getContent('groups_foo'),
- $this->serializer->serialize($groupsObject, $this->getFormat(), SerializationContext::create()->setGroups(array('foo')))
- );
- $this->assertEquals(
- $this->getContent('groups_foobar'),
- $this->serializer->serialize($groupsObject, $this->getFormat(), SerializationContext::create()->setGroups(array('foo', 'bar')))
- );
- $this->assertEquals(
- $this->getContent('groups_all'),
- $this->serializer->serialize($groupsObject, $this->getFormat())
- );
- $this->assertEquals(
- $this->getContent('groups_default'),
- $this->serializer->serialize($groupsObject, $this->getFormat(), SerializationContext::create()->setGroups(array(GroupsExclusionStrategy::DEFAULT_GROUP)))
- );
- $this->assertEquals(
- $this->getContent('groups_default'),
- $this->serializer->serialize($groupsObject, $this->getFormat(), SerializationContext::create()->setGroups(array(GroupsExclusionStrategy::DEFAULT_GROUP)))
- );
- }
- public function testAdvancedGroups()
- {
- $adrien = new GroupsUser(
- 'John',
- new GroupsUser(
- 'John Manager',
- null,
- array(
- new GroupsUser(
- 'John Manager friend 1',
- new GroupsUser('John Manager friend 1 manager')
- ),
- new GroupsUser('John Manager friend 2'),
- )
- ),
- array(
- new GroupsUser(
- 'John friend 1',
- new GroupsUser('John friend 1 manager')
- ),
- new GroupsUser(
- 'John friend 2',
- new GroupsUser('John friend 2 manager')
- )
- )
- );
- $this->assertEquals(
- $this->getContent('groups_advanced'),
- $this->serializer->serialize(
- $adrien,
- $this->getFormat(),
- SerializationContext::create()->setGroups(array(
- GroupsExclusionStrategy::DEFAULT_GROUP,
- 'manager_group',
- 'friends_group',
- 'manager' => array(
- GroupsExclusionStrategy::DEFAULT_GROUP,
- 'friends_group',
- 'friends' => array('nickname_group'),
- ),
- 'friends' => array(
- 'manager_group'
- )
- ))
- )
- );
- }
- /**
- * @expectedException JMS\Serializer\Exception\InvalidArgumentException
- * @expectedExceptionMessage Invalid group name "foo, bar" on "JMS\Serializer\Tests\Fixtures\InvalidGroupsObject->foo", did you mean to create multiple groups?
- */
- public function testInvalidGroupName()
- {
- $groupsObject = new InvalidGroupsObject();
- $this->serializer->serialize($groupsObject, $this->getFormat());
- }
- public function testVirtualProperty()
- {
- $this->assertEquals($this->getContent('virtual_properties'), $this->serialize(new ObjectWithVirtualProperties()));
- }
- public function testVirtualVersions()
- {
- $this->assertEquals(
- $this->getContent('virtual_properties_low'),
- $this->serialize(new ObjectWithVersionedVirtualProperties(), SerializationContext::create()->setVersion(2))
- );
- $this->assertEquals(
- $this->getContent('virtual_properties_all'),
- $this->serialize(new ObjectWithVersionedVirtualProperties(), SerializationContext::create()->setVersion(7))
- );
- $this->assertEquals(
- $this->getContent('virtual_properties_high'),
- $this->serialize(new ObjectWithVersionedVirtualProperties(), SerializationContext::create()->setVersion(9))
- );
- }
- public function testCustomHandler()
- {
- if (!$this->hasDeserializer()) {
- return;
- }
- $handler = function () {
- return new CustomDeserializationObject('customly_unserialized_value');
- };
- $this->handlerRegistry->registerHandler(GraphNavigator::DIRECTION_DESERIALIZATION, 'CustomDeserializationObject', $this->getFormat(), $handler);
- $serialized = $this->serializer->serialize(new CustomDeserializationObject('sometext'), $this->getFormat());
- $object = $this->serializer->deserialize($serialized, 'CustomDeserializationObject', $this->getFormat());
- $this->assertEquals('customly_unserialized_value', $object->someProperty);
- }
- public function testInput()
- {
- $this->assertEquals($this->getContent('input'), $this->serializer->serialize(new Input(), $this->getFormat()));
- }
- public function testObjectWithEmptyHash()
- {
- $this->assertEquals($this->getContent('hash_empty'), $this->serializer->serialize(new ObjectWithEmptyHash(), $this->getFormat()));
- }
- /**
- * @group null
- */
- public function testSerializeObjectWhenNull()
- {
- $this->assertEquals(
- $this->getContent('object_when_null'),
- $this->serialize(new Comment(null, 'foo'), SerializationContext::create()->setSerializeNull(false))
- );
- $this->assertEquals(
- $this->getContent('object_when_null_and_serialized'),
- $this->serialize(new Comment(null, 'foo'), SerializationContext::create()->setSerializeNull(true))
- );
- }
- /**
- * @group polymorphic
- */
- public function testPolymorphicObjectsWithGroup()
- {
- $context = SerializationContext::create();
- $context->setGroups(array("foo"));
- $this->assertEquals(
- $this->getContent('car'),
- $this->serialize(new \JMS\Serializer\Tests\Fixtures\DiscriminatorGroup\Car(5), $context)
- );
- }
- /**
- * @group polymorphic
- */
- public function testPolymorphicObjects()
- {
- $this->assertEquals(
- $this->getContent('car'),
- $this->serialize(new Car(5))
- );
- self::assertEquals(
- $this->getContent('post'),
- $this->serialize(new Post('Post Title'))
- );
- self::assertEquals(
- $this->getContent('image_post'),
- $this->serialize(new ImagePost('Image Post Title'))
- );
- if ($this->hasDeserializer()) {
- $this->assertEquals(
- new Car(5),
- $this->deserialize(
- $this->getContent('car'),
- 'JMS\Serializer\Tests\Fixtures\Discriminator\Car'
- ),
- 'Class is resolved correctly when concrete sub-class is used.'
- );
- $this->assertEquals(
- new Car(5),
- $this->deserialize(
- $this->getContent('car'),
- 'JMS\Serializer\Tests\Fixtures\Discriminator\Vehicle'
- ),
- 'Class is resolved correctly when least supertype is used.'
- );
- $this->assertEquals(
- new Car(5),
- $this->deserialize(
- $this->getContent('car_without_type'),
- 'JMS\Serializer\Tests\Fixtures\Discriminator\Car'
- ),
- 'Class is resolved correctly when concrete sub-class is used and no type is defined.'
- );
- self::assertEquals(
- new Post('Post Title'),
- $this->deserialize(
- $this->getContent('post'),
- 'JMS\Serializer\Tests\Fixtures\Discriminator\Post'
- ),
- 'Class is resolved correctly when parent class is used and type is set.'
- );
- self::assertEquals(
- new ImagePost('Image Post Title'),
- $this->deserialize(
- $this->getContent('image_post'),
- 'JMS\Serializer\Tests\Fixtures\Discriminator\Post'
- ),
- 'Class is resolved correctly when least supertype is used.'
- );
- self::assertEquals(
- new ImagePost('Image Post Title'),
- $this->deserialize(
- $this->getContent('image_post'),
- 'JMS\Serializer\Tests\Fixtures\Discriminator\ImagePost'
- ),
- 'Class is resolved correctly when concrete sub-class is used and no type is defined.'
- );
- }
- }
- /**
- * @group polymorphic
- */
- public function testNestedPolymorphicObjects()
- {
- $garage = new Garage(array(new Car(3), new Moped(1)));
- $this->assertEquals(
- $this->getContent('garage'),
- $this->serialize($garage)
- );
- if ($this->hasDeserializer()) {
- $this->assertEquals(
- $garage,
- $this->deserialize(
- $this->getContent('garage'),
- 'JMS\Serializer\Tests\Fixtures\Garage'
- )
- );
- }
- }
- /**
- * @group polymorphic
- */
- public function testNestedPolymorphicInterfaces()
- {
- $garage = new VehicleInterfaceGarage(array(new Car(3), new Moped(1)));
- $this->assertEquals(
- $this->getContent('garage'),
- $this->serialize($garage)
- );
- if ($this->hasDeserializer()) {
- $this->assertEquals(
- $garage,
- $this->deserialize(
- $this->getContent('garage'),
- 'JMS\Serializer\Tests\Fixtures\VehicleInterfaceGarage'
- )
- );
- }
- }
- /**
- * @group polymorphic
- * @expectedException LogicException
- */
- public function testPolymorphicObjectsInvalidDeserialization()
- {
- if (!$this->hasDeserializer()) {
- throw new \LogicException('No deserializer');
- }
- $this->deserialize(
- $this->getContent('car_without_type'),
- 'JMS\Serializer\Tests\Fixtures\Discriminator\Vehicle'
- );
- }
- public function testDepthExclusionStrategy()
- {
- $context = SerializationContext::create()
- ->addExclusionStrategy(new DepthExclusionStrategy());
- $data = new Tree(
- new Node(array(
- new Node(array(
- new Node(array(
- new Node(array(
- new Node(),
- )),
- )),
- )),
- ))
- );
- $this->assertEquals($this->getContent('tree'), $this->serializer->serialize($data, $this->getFormat(), $context));
- }
- public function testMaxDepthWithSkippableObject()
- {
- $data = new Gh236Foo();
- $context = SerializationContext::create()->enableMaxDepthChecks();
- $serialized = $this->serialize($data, $context);
- $this->assertEquals($this->getContent('maxdepth_skippabe_object'), $serialized);
- }
- public function testDeserializingIntoExistingObject()
- {
- if (!$this->hasDeserializer()) {
- return;
- }
- $objectConstructor = new InitializedObjectConstructor(new UnserializeObjectConstructor());
- $serializer = new Serializer(
- $this->factory, $this->handlerRegistry, $objectConstructor,
- $this->serializationVisitors, $this->deserializationVisitors, $this->dispatcher
- );
- $order = new Order(new Price(12));
- $context = new DeserializationContext();
- $context->attributes->set('target', $order);
- $deseralizedOrder = $serializer->deserialize(
- $this->getContent('order'),
- get_class($order),
- $this->getFormat(),
- $context
- );
- $this->assertSame($order, $deseralizedOrder);
- $this->assertEquals(new Order(new Price(12.34)), $deseralizedOrder);
- $this->assertAttributeInstanceOf('JMS\Serializer\Tests\Fixtures\Price', 'cost', $deseralizedOrder);
- }
- public function testObjectWithNullableArrays()
- {
- $object = new ObjectWithEmptyNullableAndEmptyArrays();
- $this->assertEquals($this->getContent('nullable_arrays'), $this->serializer->serialize($object, $this->getFormat()));
- }
- abstract protected function getContent($key);
- abstract protected function getFormat();
- protected function hasDeserializer()
- {
- return true;
- }
- protected function serialize($data, Context $context = null)
- {
- return $this->serializer->serialize($data, $this->getFormat(), $context);
- }
- protected function deserialize($content, $type, Context $context = null)
- {
- return $this->serializer->deserialize($content, $type, $this->getFormat(), $context);
- }
- protected function setUp()
- {
- $this->factory = new MetadataFactory(new AnnotationDriver(new AnnotationReader()));
- $this->handlerRegistry = new HandlerRegistry();
- $this->handlerRegistry->registerSubscribingHandler(new ConstraintViolationHandler());
- $this->handlerRegistry->registerSubscribingHandler(new StdClassHandler());
- $this->handlerRegistry->registerSubscribingHandler(new DateHandler());
- $this->handlerRegistry->registerSubscribingHandler(new FormErrorHandler(new IdentityTranslator(new MessageSelector())));
- $this->handlerRegistry->registerSubscribingHandler(new PhpCollectionHandler());
- $this->handlerRegistry->registerSubscribingHandler(new ArrayCollectionHandler());
- $this->handlerRegistry->registerHandler(GraphNavigator::DIRECTION_SERIALIZATION, 'AuthorList', $this->getFormat(),
- function (VisitorInterface $visitor, $object, array $type, Context $context) {
- return $visitor->visitArray(iterator_to_array($object), $type, $context);
- }
- );
- $this->handlerRegistry->registerHandler(GraphNavigator::DIRECTION_DESERIALIZATION, 'AuthorList', $this->getFormat(),
- function (VisitorInterface $visitor, $data, $type, Context $context) {
- $type = array(
- 'name' => 'array',
- 'params' => array(
- array('name' => 'integer', 'params' => array()),
- array('name' => 'JMS\Serializer\Tests\Fixtures\Author', 'params' => array()),
- ),
- );
- $elements = $visitor->getNavigator()->accept($data, $type, $context);
- $list = new AuthorList();
- foreach ($elements as $author) {
- $list->add($author);
- }
- return $list;
- }
- );
- $this->dispatcher = new EventDispatcher();
- $this->dispatcher->addSubscriber(new DoctrineProxySubscriber());
- $namingStrategy = new SerializedNameAnnotationStrategy(new CamelCaseNamingStrategy());
- $this->objectConstructor = new UnserializeObjectConstructor();
- $this->serializationVisitors = new Map(array(
- 'json' => new JsonSerializationVisitor($namingStrategy),
- 'xml' => new XmlSerializationVisitor($namingStrategy),
- 'yml' => new YamlSerializationVisitor($namingStrategy),
- ));
- $this->deserializationVisitors = new Map(array(
- 'json' => new JsonDeserializationVisitor($namingStrategy),
- 'xml' => new XmlDeserializationVisitor($namingStrategy),
- ));
- $this->serializer = new Serializer($this->factory, $this->handlerRegistry, $this->objectConstructor, $this->serializationVisitors, $this->deserializationVisitors, $this->dispatcher);
- }
- protected function getField($obj, $name)
- {
- $ref = new \ReflectionProperty($obj, $name);
- $ref->setAccessible(true);
- return $ref->getValue($obj);
- }
- private function setField($obj, $name, $value)
- {
- $ref = new \ReflectionProperty($obj, $name);
- $ref->setAccessible(true);
- $ref->setValue($obj, $value);
- }
- }
|