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()));