blob: 35e3a7dec151fa1ad7ea873996d96be458e4b11f [file] [log] [blame]
<?php
require_once('test_base.php');
require_once('test_util.php');
use Foo\TestWrapperSetters;
use Google\Protobuf\BoolValue;
use Google\Protobuf\BytesValue;
use Google\Protobuf\DoubleValue;
use Google\Protobuf\FloatValue;
use Google\Protobuf\Int32Value;
use Google\Protobuf\Int64Value;
use Google\Protobuf\StringValue;
use Google\Protobuf\UInt32Value;
use Google\Protobuf\UInt64Value;
class WrapperTypeSettersTest extends TestBase
{
public function testConflictNormalVsWrapper()
{
$m = new Foo\TestWrapperAccessorConflicts();
$m->setNormalVsWrapperValue1(1);
$this->assertSame(1, $m->getNormalVsWrapperValue1());
$m->setNormalVsWrapperValue2(1);
$this->assertSame(1, $m->getNormalVsWrapperValue2());
$wrapper = new Int32Value(["value" => 1]);
$m->setNormalVsWrapper($wrapper);
$this->assertSame(1, $m->getNormalVsWrapper()->getValue());
}
public function testConflictNormalVsNormal()
{
$m = new Foo\TestWrapperAccessorConflicts();
$m->setNormalVsNormalValue(1);
$this->assertSame(1, $m->getNormalVsNormalValue());
$m->setNormalVsNormal(1);
$this->assertSame(1, $m->getNormalVsNormal());
}
public function testConflictWrapperVsWrapper()
{
$m = new Foo\TestWrapperAccessorConflicts();
$m->setWrapperVsWrapperValueValue(1);
$this->assertSame(1, $m->getWrapperVsWrapperValueValue());
$wrapper = new Int32Value(["value" => 1]);
$m->setWrapperVsWrapperValue5($wrapper);
$this->assertSame(1, $m->getWrapperVsWrapperValue5()->getValue());
}
/**
* @dataProvider gettersAndSettersDataProvider
*/
public function testGettersAndSetters(
$class,
$wrapperClass,
$setter,
$valueSetter,
$getter,
$valueGetter,
$sequence
) {
$oldSetterMsg = new $class();
$newSetterMsg = new $class();
foreach ($sequence as list($value, $expectedValue)) {
// Manually wrap the value to pass to the old setter
$wrappedValue = is_null($value) ? $value : new $wrapperClass(['value' => $value]);
// Set values using new and old setters
$oldSetterMsg->$setter($wrappedValue);
$newSetterMsg->$valueSetter($value);
// Get expected values old getter
$expectedValue = $oldSetterMsg->$getter();
// Check that old getter returns the same value after using the
// new setter
$actualValue = $newSetterMsg->$getter();
$this->assertEquals($expectedValue, $actualValue);
// Check that new getter returns the unwrapped value from
// $expectedValue
$actualValueNewGetter = $newSetterMsg->$valueGetter();
if (is_null($expectedValue)) {
$this->assertNull($actualValueNewGetter);
} else {
$this->assertEquals($expectedValue->getValue(), $actualValueNewGetter);
}
}
}
public function gettersAndSettersDataProvider()
{
return [
[TestWrapperSetters::class, DoubleValue::class, "setDoubleValue", "setDoubleValueValue", "getDoubleValue", "getDoubleValueValue", [
[1.1, new DoubleValue(["value" => 1.1])],
[2.2, new DoubleValue(["value" => 2.2])],
[null, null],
[0, new DoubleValue()],
]],
[TestWrapperSetters::class, FloatValue::class, "setFloatValue", "setFloatValueValue", "getFloatValue", "getFloatValueValue", [
[1.1, new FloatValue(["value" => 1.1])],
[2.2, new FloatValue(["value" => 2.2])],
[null, null],
[0, new FloatValue()],
]],
[TestWrapperSetters::class, Int64Value::class, "setInt64Value", "setInt64ValueValue", "getInt64Value", "getInt64ValueValue", [
[123, new Int64Value(["value" => 123])],
[-789, new Int64Value(["value" => -789])],
[null, null],
[0, new Int64Value()],
[5.5, new Int64Value(["value" => 5])], // Test conversion from float to int
]],
[TestWrapperSetters::class, UInt64Value::class, "setUInt64Value", "setUInt64ValueValue", "getUInt64Value", "getUInt64ValueValue", [
[123, new UInt64Value(["value" => 123])],
[789, new UInt64Value(["value" => 789])],
[null, null],
[0, new UInt64Value()],
[5.5, new UInt64Value(["value" => 5])], // Test conversion from float to int
[-7, new UInt64Value(["value" => -7])], // Test conversion from -ve to +ve
]],
[TestWrapperSetters::class, Int32Value::class, "setInt32Value", "setInt32ValueValue", "getInt32Value", "getInt32ValueValue", [
[123, new Int32Value(["value" => 123])],
[-789, new Int32Value(["value" => -789])],
[null, null],
[0, new Int32Value()],
[5.5, new Int32Value(["value" => 5])], // Test conversion from float to int
]],
[TestWrapperSetters::class, UInt32Value::class, "setUInt32Value", "setUInt32ValueValue", "getUInt32Value", "getUInt32ValueValue", [
[123, new UInt32Value(["value" => 123])],
[789, new UInt32Value(["value" => 789])],
[null, null],
[0, new UInt32Value()],
[5.5, new UInt32Value(["value" => 5])], // Test conversion from float to int
[-7, new UInt32Value(["value" => -7])], // Test conversion from -ve to +ve
]],
[TestWrapperSetters::class, BoolValue::class, "setBoolValue", "setBoolValueValue", "getBoolValue", "getBoolValueValue", [
[true, new BoolValue(["value" => true])],
[false, new BoolValue(["value" => false])],
[null, null],
]],
[TestWrapperSetters::class, StringValue::class, "setStringValue", "setStringValueValue", "getStringValue", "getStringValueValue", [
["asdf", new StringValue(["value" => "asdf"])],
["", new StringValue(["value" => ""])],
[null, null],
["", new StringValue()],
[5, new StringValue(["value" => "5"])], // Test conversion from number to string
[5.5, new StringValue(["value" => "5.5"])], // Test conversion from number to string
[-7, new StringValue(["value" => "-7"])], // Test conversion from number to string
[-7.5, new StringValue(["value" => "-7.5"])], // Test conversion from number to string
]],
[TestWrapperSetters::class, BytesValue::class, "setBytesValue", "setBytesValueValue", "getBytesValue", "getBytesValueValue", [
["asdf", new BytesValue(["value" => "asdf"])],
["", new BytesValue(["value" => ""])],
[null, null],
["", new BytesValue()],
[5, new BytesValue(["value" => "5"])], // Test conversion from number to bytes
[5.5, new BytesValue(["value" => "5.5"])], // Test conversion from number to bytes
[-7, new BytesValue(["value" => "-7"])], // Test conversion from number to bytes
[-7.5, new BytesValue(["value" => "-7.5"])], // Test conversion from number to bytes
]],
[TestWrapperSetters::class, DoubleValue::class, "setDoubleValueOneof", "setDoubleValueOneofValue", "getDoubleValueOneof", "getDoubleValueOneofValue", [
[1.1, new DoubleValue(["value" => 1.1])],
[2.2, new DoubleValue(["value" => 2.2])],
[null, null],
[0, new DoubleValue()],
]],[TestWrapperSetters::class, StringValue::class, "setStringValueOneof", "setStringValueOneofValue", "getStringValueOneof", "getStringValueOneofValue", [
["asdf", new StringValue(["value" => "asdf"])],
["", new StringValue(["value" => ""])],
[null, null],
["", new StringValue()],
[5, new StringValue(["value" => "5"])], // Test conversion from number to string
[5.5, new StringValue(["value" => "5.5"])], // Test conversion from number to string
[-7, new StringValue(["value" => "-7"])], // Test conversion from number to string
[-7.5, new StringValue(["value" => "-7.5"])], // Test conversion from number to string
]],
];
}
/**
* @dataProvider invalidSettersDataProvider
* @expectedException \Exception
*/
public function testInvalidSetters($class, $setter, $value)
{
(new $class())->$setter($value);
}
public function invalidSettersDataProvider()
{
return [
[TestWrapperSetters::class, "setDoubleValueValue", "abc"],
[TestWrapperSetters::class, "setDoubleValueValue", []],
[TestWrapperSetters::class, "setDoubleValueValue", new stdClass()],
[TestWrapperSetters::class, "setDoubleValueValue", new DoubleValue()],
[TestWrapperSetters::class, "setFloatValueValue", "abc"],
[TestWrapperSetters::class, "setFloatValueValue", []],
[TestWrapperSetters::class, "setFloatValueValue", new stdClass()],
[TestWrapperSetters::class, "setFloatValueValue", new FloatValue()],
[TestWrapperSetters::class, "setInt64ValueValue", "abc"],
[TestWrapperSetters::class, "setInt64ValueValue", []],
[TestWrapperSetters::class, "setInt64ValueValue", new stdClass()],
[TestWrapperSetters::class, "setInt64ValueValue", new Int64Value()],
[TestWrapperSetters::class, "setUInt64ValueValue", "abc"],
[TestWrapperSetters::class, "setUInt64ValueValue", []],
[TestWrapperSetters::class, "setUInt64ValueValue", new stdClass()],
[TestWrapperSetters::class, "setUInt64ValueValue", new UInt64Value()],
[TestWrapperSetters::class, "setInt32ValueValue", "abc"],
[TestWrapperSetters::class, "setInt32ValueValue", []],
[TestWrapperSetters::class, "setInt32ValueValue", new stdClass()],
[TestWrapperSetters::class, "setInt32ValueValue", new Int32Value()],
[TestWrapperSetters::class, "setUInt32ValueValue", "abc"],
[TestWrapperSetters::class, "setUInt32ValueValue", []],
[TestWrapperSetters::class, "setUInt32ValueValue", new stdClass()],
[TestWrapperSetters::class, "setUInt32ValueValue", new UInt32Value()],
[TestWrapperSetters::class, "setBoolValueValue", []],
[TestWrapperSetters::class, "setBoolValueValue", new stdClass()],
[TestWrapperSetters::class, "setBoolValueValue", new BoolValue()],
[TestWrapperSetters::class, "setStringValueValue", []],
[TestWrapperSetters::class, "setStringValueValue", new stdClass()],
[TestWrapperSetters::class, "setStringValueValue", new StringValue()],
[TestWrapperSetters::class, "setBytesValueValue", []],
[TestWrapperSetters::class, "setBytesValueValue", new stdClass()],
[TestWrapperSetters::class, "setBytesValueValue", new BytesValue()],
];
}
/**
* @dataProvider constructorWithWrapperTypeDataProvider
*/
public function testConstructorWithWrapperType($class, $wrapperClass, $wrapperField, $getter, $value)
{
$actualInstance = new $class([$wrapperField => $value]);
$expectedInstance = new $class([$wrapperField => new $wrapperClass(['value' => $value])]);
$this->assertEquals($expectedInstance->$getter()->getValue(), $actualInstance->$getter()->getValue());
}
public function constructorWithWrapperTypeDataProvider()
{
return [
[TestWrapperSetters::class, DoubleValue::class, 'double_value', 'getDoubleValue', 1.1],
[TestWrapperSetters::class, FloatValue::class, 'float_value', 'getFloatValue', 2.2],
[TestWrapperSetters::class, Int64Value::class, 'int64_value', 'getInt64Value', 3],
[TestWrapperSetters::class, UInt64Value::class, 'uint64_value', 'getUInt64Value', 4],
[TestWrapperSetters::class, Int32Value::class, 'int32_value', 'getInt32Value', 5],
[TestWrapperSetters::class, UInt32Value::class, 'uint32_value', 'getUInt32Value', 6],
[TestWrapperSetters::class, BoolValue::class, 'bool_value', 'getBoolValue', true],
[TestWrapperSetters::class, StringValue::class, 'string_value', 'getStringValue', "eight"],
[TestWrapperSetters::class, BytesValue::class, 'bytes_value', 'getBytesValue', "nine"],
];
}
/**
* @dataProvider constructorWithRepeatedWrapperTypeDataProvider
*/
public function testConstructorWithRepeatedWrapperType($wrapperField, $getter, $value)
{
$actualInstance = new TestWrapperSetters([$wrapperField => $value]);
foreach ($actualInstance->$getter() as $key => $actualWrapperValue) {
$actualInnerValue = $actualWrapperValue->getValue();
$expectedElement = $value[$key];
if (is_object($expectedElement) && is_a($expectedElement, '\Google\Protobuf\StringValue')) {
$expectedInnerValue = $expectedElement->getValue();
} else {
$expectedInnerValue = $expectedElement;
}
$this->assertEquals($expectedInnerValue, $actualInnerValue);
}
}
public function constructorWithRepeatedWrapperTypeDataProvider()
{
$sv7 = new StringValue(['value' => 'seven']);
$sv8 = new StringValue(['value' => 'eight']);
$testWrapperSetters = new TestWrapperSetters();
$testWrapperSetters->setRepeatedStringValue([$sv7, $sv8]);
$repeatedField = $testWrapperSetters->getRepeatedStringValue();
return [
['repeated_string_value', 'getRepeatedStringValue', []],
['repeated_string_value', 'getRepeatedStringValue', [$sv7]],
['repeated_string_value', 'getRepeatedStringValue', [$sv7, $sv8]],
['repeated_string_value', 'getRepeatedStringValue', ['seven']],
['repeated_string_value', 'getRepeatedStringValue', [7]],
['repeated_string_value', 'getRepeatedStringValue', [7.7]],
['repeated_string_value', 'getRepeatedStringValue', ['seven', 'eight']],
['repeated_string_value', 'getRepeatedStringValue', [$sv7, 'eight']],
['repeated_string_value', 'getRepeatedStringValue', ['seven', $sv8]],
['repeated_string_value', 'getRepeatedStringValue', $repeatedField],
];
}
/**
* @dataProvider constructorWithMapWrapperTypeDataProvider
*/
public function testConstructorWithMapWrapperType($wrapperField, $getter, $value)
{
$actualInstance = new TestWrapperSetters([$wrapperField => $value]);
foreach ($actualInstance->$getter() as $key => $actualWrapperValue) {
$actualInnerValue = $actualWrapperValue->getValue();
$expectedElement = $value[$key];
if (is_object($expectedElement) && is_a($expectedElement, '\Google\Protobuf\StringValue')) {
$expectedInnerValue = $expectedElement->getValue();
} elseif (is_object($expectedElement) && is_a($expectedElement, '\Google\Protobuf\Internal\MapEntry')) {
$expectedInnerValue = $expectedElement->getValue()->getValue();
} else {
$expectedInnerValue = $expectedElement;
}
$this->assertEquals($expectedInnerValue, $actualInnerValue);
}
}
public function constructorWithMapWrapperTypeDataProvider()
{
$sv7 = new StringValue(['value' => 'seven']);
$sv8 = new StringValue(['value' => 'eight']);
$testWrapperSetters = new TestWrapperSetters();
$testWrapperSetters->setMapStringValue(['key' => $sv7, 'key2' => $sv8]);
$mapField = $testWrapperSetters->getMapStringValue();
return [
['map_string_value', 'getMapStringValue', []],
['map_string_value', 'getMapStringValue', ['key' => $sv7]],
['map_string_value', 'getMapStringValue', ['key' => $sv7, 'key2' => $sv8]],
['map_string_value', 'getMapStringValue', ['key' => 'seven']],
['map_string_value', 'getMapStringValue', ['key' => 7]],
['map_string_value', 'getMapStringValue', ['key' => 7.7]],
['map_string_value', 'getMapStringValue', ['key' => 'seven', 'key2' => 'eight']],
['map_string_value', 'getMapStringValue', ['key' => $sv7, 'key2' => 'eight']],
['map_string_value', 'getMapStringValue', ['key' => 'seven', 'key2' => $sv8]],
['map_string_value', 'getMapStringValue', $mapField],
];
}
}