Add php protobuffer support for transition to GTFS-realtime
[busui.git] / lib / Protobuf-PHP / tests / Protobuf.Codec.JsonIndexed.spec.php
blob:a/lib/Protobuf-PHP/tests/Protobuf.Codec.JsonIndexed.spec.php -> blob:b/lib/Protobuf-PHP/tests/Protobuf.Codec.JsonIndexed.spec.php
--- 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;
+