From 913e1ede12b7bfb86e48eab1f3fcc6668ab23a02 Mon Sep 17 00:00:00 2001 From: Andrei Nigmatulin Date: Tue, 3 Nov 2020 00:54:13 +0000 Subject: [PATCH 1/2] add missing has() method for oneof fields --- php/ext/google/protobuf/message.c | 34 +++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/php/ext/google/protobuf/message.c b/php/ext/google/protobuf/message.c index a4ae3d44f5fd..ec0349ea8c7b 100644 --- a/php/ext/google/protobuf/message.c +++ b/php/ext/google/protobuf/message.c @@ -904,6 +904,39 @@ PHP_METHOD(Message, whichOneof) { RETURN_STRING(field ? upb_fielddef_name(field) : ""); } +/** + * Message::hasOneof() + * + * Returns the presense of the given oneof field, given a field number. Called + * from generated code methods such as: + * + * public function hasDoubleValueOneof() + * { + * return $this->hasOneof(10); + * } + * + * @return boolean + */ +PHP_METHOD(Message, hasOneof) { + Message* intern = (Message*)Z_OBJ_P(getThis()); + zend_long field_num; + const upb_fielddef* f; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &field_num) == FAILURE) { + return; + } + + f = upb_msgdef_itof(intern->desc->msgdef, field_num); + + if (!f || !upb_fielddef_realcontainingoneof(f)) { + php_error_docref(NULL, E_USER_ERROR, + "Internal error, no such oneof field %d\n", + (int)field_num); + } + + RETVAL_BOOL(upb_msg_has(intern->msg, f)); +} + /** * Message::readOneof() * @@ -1014,6 +1047,7 @@ static zend_function_entry Message_methods[] = { PHP_ME(Message, mergeFrom, arginfo_mergeFrom, ZEND_ACC_PUBLIC) PHP_ME(Message, readWrapperValue, arginfo_read, ZEND_ACC_PROTECTED) PHP_ME(Message, writeWrapperValue, arginfo_write, ZEND_ACC_PROTECTED) + PHP_ME(Message, hasOneof, arginfo_read, ZEND_ACC_PROTECTED) PHP_ME(Message, readOneof, arginfo_read, ZEND_ACC_PROTECTED) PHP_ME(Message, writeOneof, arginfo_write, ZEND_ACC_PROTECTED) PHP_ME(Message, whichOneof, arginfo_read, ZEND_ACC_PROTECTED) From 52d3be327632d2e2c7c489ee44c917b2f795eff5 Mon Sep 17 00:00:00 2001 From: Andrei Nigmatulin Date: Tue, 3 Nov 2020 12:17:25 +0000 Subject: [PATCH 2/2] added tests for hasOneof() php methods --- php/ext/google/protobuf/message.c | 2 +- php/phpunit.xml | 1 + php/tests/HasOneofTest.php | 26 ++++++++++++++++++++++++++ php/tests/test.sh | 2 +- 4 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 php/tests/HasOneofTest.php diff --git a/php/ext/google/protobuf/message.c b/php/ext/google/protobuf/message.c index ec0349ea8c7b..f15b8ac1b466 100644 --- a/php/ext/google/protobuf/message.c +++ b/php/ext/google/protobuf/message.c @@ -907,7 +907,7 @@ PHP_METHOD(Message, whichOneof) { /** * Message::hasOneof() * - * Returns the presense of the given oneof field, given a field number. Called + * Returns the presence of the given oneof field, given a field number. Called * from generated code methods such as: * * public function hasDoubleValueOneof() diff --git a/php/phpunit.xml b/php/phpunit.xml index 8e7583596bfb..f00d4a3d1267 100644 --- a/php/phpunit.xml +++ b/php/phpunit.xml @@ -13,6 +13,7 @@ tests/DescriptorsTest.php tests/GeneratedServiceTest.php tests/WrapperTypeSettersTest.php + tests/HasOneofTest.php diff --git a/php/tests/HasOneofTest.php b/php/tests/HasOneofTest.php new file mode 100644 index 000000000000..e7f8954bfd27 --- /dev/null +++ b/php/tests/HasOneofTest.php @@ -0,0 +1,26 @@ + methods exists and working + ######################################################### + + public function testHasOneof() { + $m = new TestMessage(); + $this->assertFalse($m->hasOneofInt32()); + $m->setOneofInt32(42); + $this->assertTrue($m->hasOneofInt32()); + $m->setOneofString("bar"); + $this->assertFalse($m->hasOneofInt32()); + $this->assertTrue($m->hasOneofString()); + $m->clear(); + $this->assertFalse($m->hasOneofInt32()); + $this->assertFalse($m->hasOneofString()); + } + +} diff --git a/php/tests/test.sh b/php/tests/test.sh index 91ea56ec8f5b..f693fe612750 100755 --- a/php/tests/test.sh +++ b/php/tests/test.sh @@ -29,7 +29,7 @@ esac [ -f $PHPUNIT ] || wget https://phar.phpunit.de/$PHPUNIT -tests=( ArrayTest.php EncodeDecodeTest.php GeneratedClassTest.php MapFieldTest.php WellKnownTest.php DescriptorsTest.php WrapperTypeSettersTest.php) +tests=( ArrayTest.php EncodeDecodeTest.php GeneratedClassTest.php MapFieldTest.php WellKnownTest.php DescriptorsTest.php WrapperTypeSettersTest.php HasOneofTest.php) for t in "${tests[@]}" do