|  | <?php | 
|  |  | 
|  | # phpunit has memory leak by itself. Thus, it cannot be used to test memory leak. | 
|  |  | 
|  | class HasDestructor | 
|  | { | 
|  | function __construct() { | 
|  | $this->foo = $this; | 
|  | } | 
|  |  | 
|  | function __destruct() { | 
|  | new Foo\TestMessage(); | 
|  | } | 
|  | } | 
|  |  | 
|  | require_once('../vendor/autoload.php'); | 
|  | require_once('test_util.php'); | 
|  |  | 
|  | $has_destructor = new HasDestructor(); | 
|  |  | 
|  | use Google\Protobuf\Internal\RepeatedField; | 
|  | use Google\Protobuf\Internal\GPBType; | 
|  | use Foo\TestAny; | 
|  | use Foo\TestMessage; | 
|  | use Foo\TestMessage\Sub; | 
|  |  | 
|  | $from = new TestMessage(); | 
|  | TestUtil::setTestMessage($from); | 
|  | TestUtil::assertTestMessage($from); | 
|  |  | 
|  | $data = $from->serializeToString(); | 
|  |  | 
|  | $to = new TestMessage(); | 
|  | $to->mergeFromString($data); | 
|  |  | 
|  | TestUtil::assertTestMessage($to); | 
|  |  | 
|  | $from = new TestMessage(); | 
|  | TestUtil::setTestMessage2($from); | 
|  |  | 
|  | $data = $from->serializeToString(); | 
|  |  | 
|  | $to->mergeFromString($data); | 
|  |  | 
|  | // TODO: This causes following tests fail in php7. | 
|  | # $from->setRecursive($from); | 
|  |  | 
|  | $arr = new RepeatedField(GPBType::MESSAGE, TestMessage::class); | 
|  | $arr[] = new TestMessage; | 
|  | $arr[0]->SetRepeatedRecursive($arr); | 
|  |  | 
|  | // Test oneof fields. | 
|  | $m = new TestMessage(); | 
|  |  | 
|  | $m->setOneofInt32(1); | 
|  | assert(1 === $m->getOneofInt32()); | 
|  | assert(0.0 === $m->getOneofFloat()); | 
|  | assert('' === $m->getOneofString()); | 
|  | assert(NULL === $m->getOneofMessage()); | 
|  | $data = $m->serializeToString(); | 
|  | $n = new TestMessage(); | 
|  | $n->mergeFromString($data); | 
|  | assert(1 === $n->getOneofInt32()); | 
|  |  | 
|  | $m->setOneofFloat(2.0); | 
|  | assert(0 === $m->getOneofInt32()); | 
|  | assert(2.0 === $m->getOneofFloat()); | 
|  | assert('' === $m->getOneofString()); | 
|  | assert(NULL === $m->getOneofMessage()); | 
|  | $data = $m->serializeToString(); | 
|  | $n = new TestMessage(); | 
|  | $n->mergeFromString($data); | 
|  | assert(2.0 === $n->getOneofFloat()); | 
|  |  | 
|  | $m->setOneofString('abc'); | 
|  | assert(0 === $m->getOneofInt32()); | 
|  | assert(0.0 === $m->getOneofFloat()); | 
|  | assert('abc' === $m->getOneofString()); | 
|  | assert(NULL === $m->getOneofMessage()); | 
|  | $data = $m->serializeToString(); | 
|  | $n = new TestMessage(); | 
|  | $n->mergeFromString($data); | 
|  | assert('abc' === $n->getOneofString()); | 
|  |  | 
|  | $sub_m = new Sub(); | 
|  | $sub_m->setA(1); | 
|  | $m->setOneofMessage($sub_m); | 
|  | assert(0 === $m->getOneofInt32()); | 
|  | assert(0.0 === $m->getOneofFloat()); | 
|  | assert('' === $m->getOneofString()); | 
|  | assert(1 === $m->getOneofMessage()->getA()); | 
|  | $data = $m->serializeToString(); | 
|  | $n = new TestMessage(); | 
|  | $n->mergeFromString($data); | 
|  | assert(1 === $n->getOneofMessage()->getA()); | 
|  |  | 
|  | $m = new TestMessage(); | 
|  | $m->mergeFromString(hex2bin('F80601')); | 
|  | assert('f80601' === bin2hex($m->serializeToString())); | 
|  |  | 
|  | // Test create repeated field via array. | 
|  | $str_arr = array("abc"); | 
|  | $m = new TestMessage(); | 
|  | $m->setRepeatedString($str_arr); | 
|  |  | 
|  | // Test create map field via array. | 
|  | $str_arr = array("abc"=>"abc"); | 
|  | $m = new TestMessage(); | 
|  | $m->setMapStringString($str_arr); | 
|  |  | 
|  | // Test unset | 
|  | $from = new TestMessage(); | 
|  | TestUtil::setTestMessage($from); | 
|  | unset($from); | 
|  |  | 
|  | // Test wellknown | 
|  | $from = new \Google\Protobuf\Timestamp(); | 
|  | $from->setSeconds(1); | 
|  | assert(1, $from->getSeconds()); | 
|  |  | 
|  | $timestamp = new \Google\Protobuf\Timestamp(); | 
|  |  | 
|  | date_default_timezone_set('UTC'); | 
|  | $from = new DateTime('2011-01-01T15:03:01.012345UTC'); | 
|  | $timestamp->fromDateTime($from); | 
|  | assert($from->format('U') == $timestamp->getSeconds()); | 
|  | assert(1000 * $from->format('u') == $timestamp->getNanos()); | 
|  |  | 
|  | $to = $timestamp->toDateTime(); | 
|  | assert(\DateTime::class == get_class($to)); | 
|  | assert($from->format('U') == $to->format('U')); | 
|  |  | 
|  | $from = new \Google\Protobuf\Value(); | 
|  | $from->setNumberValue(1); | 
|  | assert(1, $from->getNumberValue()); | 
|  |  | 
|  | // Test discard unknown in message. | 
|  | $m = new TestMessage(); | 
|  | $from = hex2bin('F80601'); | 
|  | $m->mergeFromString($from); | 
|  | $m->discardUnknownFields(); | 
|  | $to = $m->serializeToString(); | 
|  | assert("" === bin2hex($to)); | 
|  |  | 
|  | // Test clear | 
|  | $m = new TestMessage(); | 
|  | TestUtil::setTestMessage($m); | 
|  | $m->clear(); | 
|  |  | 
|  | // Test unset map element | 
|  | $m = new TestMessage(); | 
|  | $map = $m->getMapStringString(); | 
|  | $map[1] = 1; | 
|  | unset($map[1]); | 
|  |  | 
|  | // Test descriptor | 
|  | $pool = \Google\Protobuf\DescriptorPool::getGeneratedPool(); | 
|  | $desc = $pool->getDescriptorByClassName("\Foo\TestMessage"); | 
|  | $field = $desc->getField(1); | 
|  |  | 
|  | $from = new TestMessage(); | 
|  | $to = new TestMessage(); | 
|  | TestUtil::setTestMessage($from); | 
|  | $to->mergeFrom($from); | 
|  | TestUtil::assertTestMessage($to); | 
|  |  | 
|  | // Test decode Any | 
|  | // Make sure packed message has been created at least once. | 
|  | $packed = new TestMessage(); | 
|  |  | 
|  | $m = new TestAny(); | 
|  | $m->mergeFromJsonString( | 
|  | "{\"any\":" . | 
|  | "  {\"@type\":\"type.googleapis.com/foo.TestMessage\"," . | 
|  | "   \"optionalInt32\":1}}"); | 
|  | assert("type.googleapis.com/foo.TestMessage" === | 
|  | $m->getAny()->getTypeUrl()); | 
|  | assert("0801" === bin2hex($m->getAny()->getValue())); |