markTestSkipped('Requires 64-bit platform'); } function skip_if_no_gmp() { if (!extension_loaded('gmp')) $this->markTestSkipped('Requires GMP PHP Extension.'); } function assert_bit_shift($expected, $actual, $shift_type, $expected_binary, $actual_binary) { $this->assertEquals( $expected, $actual, sprintf("%s\nexpected: %d\n actual: %d\nexpected b: %s\n actual b: %s", $shift_type, $expected, $actual, $expected_binary, $actual_binary)); } /** * @dataProvider bit_shift_provider */ function test_bit_shift($val, $shift, $expected_lval, $expected_rval, $lbin, $rbin) { $this->skip_64_bit_test_on_32_bit(); $lval = (int) ((int) $val << $shift); $this->assert_bit_shift($expected_lval, strval($lval), 'lshift', $lbin, decbin($lval)); $rval = ((int) $val >> $shift); $this->assert_bit_shift($expected_rval, strval($rval), 'rshift', $rbin, decbin($rval)); } /** * @dataProvider bit_shift_provider */ function test_left_shift_gmp($val, $shift, $expected_lval, $expected_rval, $lbin, $rbin) { $this->skip_if_no_gmp(); $lval = gmp_strval(AvroGMP::shift_left($val, $shift)); $this->assert_bit_shift($expected_lval, $lval, 'gmp left shift', $lbin, decbin((int) $lval)); } /** * @dataProvider bit_shift_provider */ function test_right_shift_gmp($val, $shift, $expected_lval, $expected_rval, $lbin, $rbin) { $this->skip_if_no_gmp(); $rval = gmp_strval(AvroGMP::shift_right($val, $shift)); $this->assert_bit_shift($expected_rval, $rval, 'gmp right shift', $rbin, decbin((int) $rval)); } /** * @dataProvider long_provider */ function test_encode_long($val, $expected_bytes) { $this->skip_64_bit_test_on_32_bit(); $bytes = AvroIOBinaryEncoder::encode_long($val); $this->assertEquals($expected_bytes, $bytes); } /** * @dataProvider long_provider */ function test_gmp_encode_long($val, $expected_bytes) { $this->skip_if_no_gmp(); $bytes = AvroGMP::encode_long($val); $this->assertEquals($expected_bytes, $bytes); } /** * @dataProvider long_provider */ function test_decode_long_from_array($expected_val, $bytes) { $this->skip_64_bit_test_on_32_bit(); $ary = array_map('ord', str_split($bytes)); $val = AvroIOBinaryDecoder::decode_long_from_array($ary); $this->assertEquals($expected_val, $val); } /** * @dataProvider long_provider */ function test_gmp_decode_long_from_array($expected_val, $bytes) { $this->skip_if_no_gmp(); $ary = array_map('ord', str_split($bytes)); $val = AvroGMP::decode_long_from_array($ary); $this->assertEquals($expected_val, $val); } function long_provider() { return array(array('0', "\x0"), array('1', "\x2"), array('7', "\xe"), array('10000', "\xa0\x9c\x1"), array('2147483647', "\xfe\xff\xff\xff\xf"), array('98765432109', "\xda\x94\x87\xee\xdf\x5"), array('-1', "\x1"), array('-7', "\xd"), array('-10000', "\x9f\x9c\x1"), array('-2147483648', "\xff\xff\xff\xff\xf"), array('-98765432109', "\xd9\x94\x87\xee\xdf\x5") ); } function bit_shift_provider() { // val shift lval rval return array( array('0', 0, '0', '0', '0', '0'), array('0', 1, '0', '0', '0', '0'), array('0', 7, '0', '0', '0', '0'), array('0', 63, '0', '0', '0', '0'), array('1', 0, '1', '1', '1', '1'), array('1', 1, '2', '0', '10', '0'), array('1', 7, '128', '0', '10000000', '0'), array('1', 63, '-9223372036854775808', '0', '1000000000000000000000000000000000000000000000000000000000000000', '0'), array('100', 0, '100', '100', '1100100', '1100100'), array('100', 1, '200', '50', '11001000', '110010'), array('100', 7, '12800', '0', '11001000000000', '0'), array('100', 63, '0', '0', '0', '0'), array('1000000', 0, '1000000', '1000000', '11110100001001000000', '11110100001001000000'), array('1000000', 1, '2000000', '500000', '111101000010010000000', '1111010000100100000'), array('1000000', 7, '128000000', '7812', '111101000010010000000000000', '1111010000100'), array('1000000', 63, '0', '0', '0', '0'), array('2147483647', 0, '2147483647', '2147483647', '1111111111111111111111111111111', '1111111111111111111111111111111'), array('2147483647', 1, '4294967294', '1073741823', '11111111111111111111111111111110', '111111111111111111111111111111'), array('2147483647', 7, '274877906816', '16777215', '11111111111111111111111111111110000000', '111111111111111111111111'), array('2147483647', 63, '-9223372036854775808', '0', '1000000000000000000000000000000000000000000000000000000000000000', '0'), array('10000000000', 0, '10000000000', '10000000000', '1001010100000010111110010000000000', '1001010100000010111110010000000000'), array('10000000000', 1, '20000000000', '5000000000', '10010101000000101111100100000000000', '100101010000001011111001000000000'), array('10000000000', 7, '1280000000000', '78125000', '10010101000000101111100100000000000000000', '100101010000001011111001000'), array('10000000000', 63, '0', '0', '0', '0'), array('9223372036854775807', 0, '9223372036854775807', '9223372036854775807', '111111111111111111111111111111111111111111111111111111111111111', '111111111111111111111111111111111111111111111111111111111111111'), array('9223372036854775807', 1, '-2', '4611686018427387903', '1111111111111111111111111111111111111111111111111111111111111110', '11111111111111111111111111111111111111111111111111111111111111'), array('9223372036854775807', 7, '-128', '72057594037927935', '1111111111111111111111111111111111111111111111111111111110000000', '11111111111111111111111111111111111111111111111111111111'), array('9223372036854775807', 63, '-9223372036854775808', '0', '1000000000000000000000000000000000000000000000000000000000000000', '0'), array('-1', 0, '-1', '-1', '1111111111111111111111111111111111111111111111111111111111111111', '1111111111111111111111111111111111111111111111111111111111111111'), array('-1', 1, '-2', '-1', '1111111111111111111111111111111111111111111111111111111111111110', '1111111111111111111111111111111111111111111111111111111111111111'), array('-1', 7, '-128', '-1', '1111111111111111111111111111111111111111111111111111111110000000', '1111111111111111111111111111111111111111111111111111111111111111'), array('-1', 63, '-9223372036854775808', '-1', '1000000000000000000000000000000000000000000000000000000000000000', '1111111111111111111111111111111111111111111111111111111111111111'), array('-100', 0, '-100', '-100', '1111111111111111111111111111111111111111111111111111111110011100', '1111111111111111111111111111111111111111111111111111111110011100'), array('-100', 1, '-200', '-50', '1111111111111111111111111111111111111111111111111111111100111000', '1111111111111111111111111111111111111111111111111111111111001110'), array('-100', 7, '-12800', '-1', '1111111111111111111111111111111111111111111111111100111000000000', '1111111111111111111111111111111111111111111111111111111111111111'), array('-100', 63, '0', '-1', '0', '1111111111111111111111111111111111111111111111111111111111111111'), array('-1000000', 0, '-1000000', '-1000000', '1111111111111111111111111111111111111111111100001011110111000000', '1111111111111111111111111111111111111111111100001011110111000000'), array('-1000000', 1, '-2000000', '-500000', '1111111111111111111111111111111111111111111000010111101110000000', '1111111111111111111111111111111111111111111110000101111011100000'), array('-1000000', 7, '-128000000', '-7813', '1111111111111111111111111111111111111000010111101110000000000000', '1111111111111111111111111111111111111111111111111110000101111011'), array('-1000000', 63, '0', '-1', '0', '1111111111111111111111111111111111111111111111111111111111111111'), array('-2147483648', 0, '-2147483648', '-2147483648', '1111111111111111111111111111111110000000000000000000000000000000', '1111111111111111111111111111111110000000000000000000000000000000'), array('-2147483648', 1, '-4294967296', '-1073741824', '1111111111111111111111111111111100000000000000000000000000000000', '1111111111111111111111111111111111000000000000000000000000000000'), array('-2147483648', 7, '-274877906944', '-16777216', '1111111111111111111111111100000000000000000000000000000000000000', '1111111111111111111111111111111111111111000000000000000000000000'), array('-2147483648', 63, '0', '-1', '0', '1111111111111111111111111111111111111111111111111111111111111111'), array('-10000000000', 0, '-10000000000', '-10000000000', '1111111111111111111111111111110110101011111101000001110000000000', '1111111111111111111111111111110110101011111101000001110000000000'), array('-10000000000', 1, '-20000000000', '-5000000000', '1111111111111111111111111111101101010111111010000011100000000000', '1111111111111111111111111111111011010101111110100000111000000000'), array('-10000000000', 7, '-1280000000000', '-78125000', '1111111111111111111111101101010111111010000011100000000000000000', '1111111111111111111111111111111111111011010101111110100000111000'), array('-10000000000', 63, '0', '-1', '0', '1111111111111111111111111111111111111111111111111111111111111111'), array('-9223372036854775808', 0, '-9223372036854775808', '-9223372036854775808', '1000000000000000000000000000000000000000000000000000000000000000', '1000000000000000000000000000000000000000000000000000000000000000'), array('-9223372036854775808', 1, '0', '-4611686018427387904', '0', '1100000000000000000000000000000000000000000000000000000000000000'), array('-9223372036854775808', 7, '0', '-72057594037927936', '0', '1111111100000000000000000000000000000000000000000000000000000000'), array('-9223372036854775808', 63, '0', '-1', '0', '1111111111111111111111111111111111111111111111111111111111111111'), ); } }