--- a/lib/Protobuf-PHP/tests/Protobuf.Codec.JsonIndexed.spec.php +++ b/lib/Protobuf-PHP/tests/Protobuf.Codec.JsonIndexed.spec.php @@ -1,1 +1,187 @@ +<?php +require_once __DIR__ . '/../library/DrSlump/Protobuf.php'; + +use \DrSlump\Protobuf; + +Protobuf::autoload(); + +include_once __DIR__ . '/protos/simple.php'; +include_once __DIR__ . '/protos/repeated.php'; +include_once __DIR__ . '/protos/addressbook.php'; + +describe "JSON Indexed Codec" + + before + Protobuf::setDefaultCodec(new Protobuf\Codec\JsonIndexed); + end + + describe "serialize" + + it "should serialize a simple message" + $simple = new Tests\Simple(); + $simple->string = 'FOO'; + $simple->int32 = 1000; + $json = Protobuf::encode($simple); + $json. should. eq. '["59",1000,"FOO"]'; + end. + + it. "a message with repeated fields" + + $repeated = new Tests\Repeated(); + $repeated->addString('one'); + $repeated->addString('two'); + $repeated->addString('three'); + $bin = Protobuf::encode($repeated); + $bin should be '["1",["one","two","three"]]'; + + $repeated = new Tests\Repeated(); + $repeated->addInt(1); + $repeated->addInt(2); + $repeated->addInt(3); + $bin = Protobuf::encode($repeated); + $bin should be '["2",[1,2,3]]'; + + $repeated = new Tests\Repeated(); + $nested = new Tests\Repeated\Nested(); + $nested->setId(1); + $repeated->addNested($nested); + $nested = new Tests\Repeated\Nested(); + $nested->setId(2); + $repeated->addNested($nested); + $nested = new Tests\Repeated\Nested(); + $nested->setId(3); + $repeated->addNested($nested); + $json = Protobuf::encode($repeated); + $json should eq '["3",[["1",1],["1",2],["1",3]]]'; + end. + + it. "a complex message" + + $book = new Tests\AddressBook(); + $person = new Tests\Person(); + $person->name = 'John Doe'; + $person->id = 2051; + $person->email = 'john.doe@gmail.com'; + $phone = new Tests\Person\PhoneNumber; + $phone->number = '1231231212'; + $phone->type = Tests\Person\PhoneType::HOME; + $person->addPhone($phone); + $phone = new Tests\Person\PhoneNumber; + $phone->number = '55512321312'; + $phone->type = Tests\Person\PhoneType::MOBILE; + $person->addPhone($phone); + $book->addPerson($person); + + $person = new Tests\Person(); + $person->name = 'Iván Montes'; + $person->id = 23; + $person->email = 'drslump@pollinimini.net'; + $phone = new Tests\Person\PhoneNumber; + $phone->number = '3493123123'; + $phone->type = Tests\Person\PhoneType::WORK; + $person->addPhone($phone); + $book->addPerson($person); + + $json = Protobuf::encode($book); + + $expected = '[ + "1", + [ + [ + "1234", + "John Doe", + 2051, + "john.doe@gmail.com", + [ + ["12","1231231212",1], + ["12","55512321312",0] + ] + ], + [ + "1234", + "Iv\u00e1n Montes", + 23, + "drslump@pollinimini.net", + [ + ["12","3493123123",2] + ] + ] + ] + ]'; + + $expected = preg_replace('/\n\s*/', '', $expected); + + $json should be $expected; + end. + end; + + describe "unserialize" + + it "should unserialize a simple message" + $json = '["59",1000,"FOO"]'; + $simple = Protobuf::decode('Tests\Simple', $json); + $simple should be instanceof 'Tests\Simple'; + $simple->string should equal 'FOO'; + $simple->int32 should equal 1000; + end. + + it "a message with repeated fields" + + $json = '["1",["one","two","three"]]'; + $repeated = Protobuf::decode('Tests\Repeated', $json); + $repeated->getString() should eq array('one', 'two', 'three'); + + $json = '["2",[1,2,3]]'; + $repeated = Protobuf::decode('Tests\Repeated', $json); + $repeated should be instanceof 'Tests\Repeated'; + $repeated->getInt() should eq array(1,2,3); + + $json = '["3",[["1",1],["1",2],["1",3]]]'; + $repeated = Protobuf::decode('Tests\Repeated', $json); + $repeated should be instanceof 'Tests\Repeated'; + foreach ($repeated->getNested() as $i=>$nested) { + $nested->getId() should eq ($i+1); + } + end. + + it "a complex message" + $json = '[ + "1", + [ + [ + "1234", + "John Doe", + 2051, + "john.doe@gmail.com", + [ + ["12","1231231212",1], + ["12","55512321312",0] + ] + ], + [ + "1234", + "Iv\u00e1n Montes", + 23, + "drslump@pollinimini.net", + [ + ["12","3493123123",2] + ] + ] + ] + ]'; + + $json = preg_replace('/\n\s*/', '', $json); + + $complex = Protobuf::decode('Tests\AddressBook', $json); + count($complex->person) should eq 2; + $complex->getPerson(0)->name should eq 'John Doe'; + $complex->getPerson(1)->name should eq 'Iván Montes'; + $complex->getPerson(0)->getPhone(1)->number should eq '55512321312'; + end. + + + + end; +end; +