blob: 7259c7f9fe3065f5e8bc44187e6599526eac79e6 [file]
<?php
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
namespace Apache\Avro\Tests;
use Apache\Avro\Avro;
use Apache\Avro\AvroGMP;
use Apache\Avro\Datum\AvroIOBinaryDecoder;
use Apache\Avro\Datum\AvroIOBinaryEncoder;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;
class LongEncodingTest extends TestCase
{
public function setUp(): void
{
Avro::checkPlatform();
}
#[DataProvider('bit_shift_provider')]
public function test_bit_shift(
string $val,
int $shift,
string $expected_lval,
string $expected_rval,
string $lbin,
string $rbin
): void {
$this->skip_64_bit_test_on_32_bit();
$lval = ((int) $val << $shift);
$this->assert_bit_shift(
expected: $expected_lval,
actual: (string) $lval,
shift_type: 'lshift',
expected_binary: $lbin,
actual_binary: decbin($lval)
);
$rval = ((int) $val >> $shift);
$this->assert_bit_shift(
expected: $expected_rval,
actual: (string) $rval,
shift_type: 'rshift',
expected_binary: $rbin,
actual_binary: decbin($rval)
);
}
public function skip_64_bit_test_on_32_bit(): void
{
if (!self::is_64_bit()) {
$this->markTestSkipped('Requires 64-bit platform');
}
}
public static function is_64_bit(): bool
{
return PHP_INT_SIZE === 8;
}
public function assert_bit_shift(
$expected,
$actual,
$shift_type,
$expected_binary,
$actual_binary
): void {
$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')]
public function test_left_shift_gmp(
string $val,
int $shift,
string $expected_lval,
string $expected_rval,
string $lbin,
string $rbin
): void {
$this->skip_if_no_gmp();
$lval = gmp_strval(AvroGMP::shiftLeft($val, $shift));
$this->assert_bit_shift(
$expected_lval,
$lval,
'gmp left shift',
$lbin,
decbin((int) $lval)
);
}
public function skip_if_no_gmp(): void
{
if (!extension_loaded('gmp')) {
$this->markTestSkipped('Requires GMP PHP Extension.');
}
}
#[DataProvider('bit_shift_provider')]
public function test_right_shift_gmp(
string $val,
int $shift,
string $expected_lval,
string $expected_rval,
string $lbin,
string $rbin
): void {
$this->skip_if_no_gmp();
$rval = gmp_strval(AvroGMP::shiftRight($val, $shift));
$this->assert_bit_shift(
$expected_rval,
$rval,
'gmp right shift',
$rbin,
decbin((int) $rval)
);
}
#[DataProvider('long_provider')]
public function test_encode_long(string $val, string $expected_bytes): void
{
$this->skip_64_bit_test_on_32_bit();
$bytes = AvroIOBinaryEncoder::encodeLong($val);
$this->assertEquals($expected_bytes, $bytes);
}
#[DataProvider('long_provider')]
public function test_gmp_encode_long(string $val, string $expected_bytes): void
{
$this->skip_if_no_gmp();
$bytes = AvroGMP::encodeLong($val);
$this->assertEquals($expected_bytes, $bytes);
}
#[DataProvider('long_provider')]
public function test_decode_long_from_array(string $expected_val, string $bytes): void
{
$this->skip_64_bit_test_on_32_bit();
$ary = array_map(ord(...), str_split($bytes));
$val = AvroIOBinaryDecoder::decodeLongFromArray($ary);
$this->assertEquals($expected_val, $val);
}
#[DataProvider('long_provider')]
public function test_gmp_decode_long_from_array(string $expected_val, string $bytes): void
{
$this->skip_if_no_gmp();
$ary = array_map(ord(...), str_split($bytes));
$val = AvroGMP::decodeLongFromArray($ary);
$this->assertEquals($expected_val, $val);
}
public static function long_provider()
{
return [
['0', "\x0"],
['1', "\x2"],
['7', "\xe"],
['10000', "\xa0\x9c\x1"],
['2147483647', "\xfe\xff\xff\xff\xf"],
['98765432109', "\xda\x94\x87\xee\xdf\x5"],
['-1', "\x1"],
['-7', "\xd"],
['-10000', "\x9f\x9c\x1"],
['-2147483648', "\xff\xff\xff\xff\xf"],
['-98765432109', "\xd9\x94\x87\xee\xdf\x5"],
];
}
public static function bit_shift_provider()
{
// val shift lval rval
return [
[
'0',
0,
'0',
'0',
'0',
'0',
],
[
'0',
1,
'0',
'0',
'0',
'0',
],
[
'0',
7,
'0',
'0',
'0',
'0',
],
[
'0',
63,
'0',
'0',
'0',
'0',
],
[
'1',
0,
'1',
'1',
'1',
'1',
],
[
'1',
1,
'2',
'0',
'10',
'0',
],
[
'1',
7,
'128',
'0',
'10000000',
'0',
],
[
'1',
63,
'-9223372036854775808',
'0',
'1000000000000000000000000000000000000000000000000000000000000000',
'0',
],
[
'100',
0,
'100',
'100',
'1100100',
'1100100',
],
[
'100',
1,
'200',
'50',
'11001000',
'110010',
],
[
'100',
7,
'12800',
'0',
'11001000000000',
'0',
],
[
'100',
63,
'0',
'0',
'0',
'0',
],
[
'1000000',
0,
'1000000',
'1000000',
'11110100001001000000',
'11110100001001000000',
],
[
'1000000',
1,
'2000000',
'500000',
'111101000010010000000',
'1111010000100100000',
],
[
'1000000',
7,
'128000000',
'7812',
'111101000010010000000000000',
'1111010000100',
],
[
'1000000',
63,
'0',
'0',
'0',
'0',
],
[
'2147483647',
0,
'2147483647',
'2147483647',
'1111111111111111111111111111111',
'1111111111111111111111111111111',
],
[
'2147483647',
1,
'4294967294',
'1073741823',
'11111111111111111111111111111110',
'111111111111111111111111111111',
],
[
'2147483647',
7,
'274877906816',
'16777215',
'11111111111111111111111111111110000000',
'111111111111111111111111',
],
[
'2147483647',
63,
'-9223372036854775808',
'0',
'1000000000000000000000000000000000000000000000000000000000000000',
'0',
],
[
'10000000000',
0,
'10000000000',
'10000000000',
'1001010100000010111110010000000000',
'1001010100000010111110010000000000',
],
[
'10000000000',
1,
'20000000000',
'5000000000',
'10010101000000101111100100000000000',
'100101010000001011111001000000000',
],
[
'10000000000',
7,
'1280000000000',
'78125000',
'10010101000000101111100100000000000000000',
'100101010000001011111001000',
],
[
'10000000000',
63,
'0',
'0',
'0',
'0',
],
[
'9223372036854775807',
0,
'9223372036854775807',
'9223372036854775807',
'111111111111111111111111111111111111111111111111111111111111111',
'111111111111111111111111111111111111111111111111111111111111111',
],
[
'9223372036854775807',
1,
'-2',
'4611686018427387903',
'1111111111111111111111111111111111111111111111111111111111111110',
'11111111111111111111111111111111111111111111111111111111111111',
],
[
'9223372036854775807',
7,
'-128',
'72057594037927935',
'1111111111111111111111111111111111111111111111111111111110000000',
'11111111111111111111111111111111111111111111111111111111',
],
[
'9223372036854775807',
63,
'-9223372036854775808',
'0',
'1000000000000000000000000000000000000000000000000000000000000000',
'0',
],
[
'-1',
0,
'-1',
'-1',
'1111111111111111111111111111111111111111111111111111111111111111',
'1111111111111111111111111111111111111111111111111111111111111111',
],
[
'-1',
1,
'-2',
'-1',
'1111111111111111111111111111111111111111111111111111111111111110',
'1111111111111111111111111111111111111111111111111111111111111111',
],
[
'-1',
7,
'-128',
'-1',
'1111111111111111111111111111111111111111111111111111111110000000',
'1111111111111111111111111111111111111111111111111111111111111111',
],
[
'-1',
63,
'-9223372036854775808',
'-1',
'1000000000000000000000000000000000000000000000000000000000000000',
'1111111111111111111111111111111111111111111111111111111111111111',
],
[
'-100',
0,
'-100',
'-100',
'1111111111111111111111111111111111111111111111111111111110011100',
'1111111111111111111111111111111111111111111111111111111110011100',
],
[
'-100',
1,
'-200',
'-50',
'1111111111111111111111111111111111111111111111111111111100111000',
'1111111111111111111111111111111111111111111111111111111111001110',
],
[
'-100',
7,
'-12800',
'-1',
'1111111111111111111111111111111111111111111111111100111000000000',
'1111111111111111111111111111111111111111111111111111111111111111',
],
[
'-100',
63,
'0',
'-1',
'0',
'1111111111111111111111111111111111111111111111111111111111111111',
],
[
'-1000000',
0,
'-1000000',
'-1000000',
'1111111111111111111111111111111111111111111100001011110111000000',
'1111111111111111111111111111111111111111111100001011110111000000',
],
[
'-1000000',
1,
'-2000000',
'-500000',
'1111111111111111111111111111111111111111111000010111101110000000',
'1111111111111111111111111111111111111111111110000101111011100000',
],
[
'-1000000',
7,
'-128000000',
'-7813',
'1111111111111111111111111111111111111000010111101110000000000000',
'1111111111111111111111111111111111111111111111111110000101111011',
],
[
'-1000000',
63,
'0',
'-1',
'0',
'1111111111111111111111111111111111111111111111111111111111111111',
],
[
'-2147483648',
0,
'-2147483648',
'-2147483648',
'1111111111111111111111111111111110000000000000000000000000000000',
'1111111111111111111111111111111110000000000000000000000000000000',
],
[
'-2147483648',
1,
'-4294967296',
'-1073741824',
'1111111111111111111111111111111100000000000000000000000000000000',
'1111111111111111111111111111111111000000000000000000000000000000',
],
[
'-2147483648',
7,
'-274877906944',
'-16777216',
'1111111111111111111111111100000000000000000000000000000000000000',
'1111111111111111111111111111111111111111000000000000000000000000',
],
[
'-2147483648',
63,
'0',
'-1',
'0',
'1111111111111111111111111111111111111111111111111111111111111111',
],
[
'-10000000000',
0,
'-10000000000',
'-10000000000',
'1111111111111111111111111111110110101011111101000001110000000000',
'1111111111111111111111111111110110101011111101000001110000000000',
],
[
'-10000000000',
1,
'-20000000000',
'-5000000000',
'1111111111111111111111111111101101010111111010000011100000000000',
'1111111111111111111111111111111011010101111110100000111000000000',
],
[
'-10000000000',
7,
'-1280000000000',
'-78125000',
'1111111111111111111111101101010111111010000011100000000000000000',
'1111111111111111111111111111111111111011010101111110100000111000',
],
[
'-10000000000',
63,
'0',
'-1',
'0',
'1111111111111111111111111111111111111111111111111111111111111111',
],
[
'-9223372036854775808',
0,
'-9223372036854775808',
'-9223372036854775808',
'1000000000000000000000000000000000000000000000000000000000000000',
'1000000000000000000000000000000000000000000000000000000000000000',
],
[
'-9223372036854775808',
1,
'0',
'-4611686018427387904',
'0',
'1100000000000000000000000000000000000000000000000000000000000000',
],
[
'-9223372036854775808',
7,
'0',
'-72057594037927936',
'0',
'1111111100000000000000000000000000000000000000000000000000000000',
],
[
'-9223372036854775808',
63,
'0',
'-1',
'0',
'1111111111111111111111111111111111111111111111111111111111111111',
],
];
}
}