php-src/ext/gmp/tests/overloading.phpt
Nikita Popov 0286decdb4 Accept GMP|string|int union in GMP functions
This changes GMP functions to accept a GMP|string|int union with
standard semantics (and thus also uses it in function signatures).

Relative to the previous behavior, this means that GMP functions
in weak mode now also accept float and null, and in strict mode no
longer accept bool, and have full type information.

Closes GH-6139.
2020-09-16 17:17:07 +02:00

321 lines
4.5 KiB
PHP

--TEST--
GMP operator overloading
--SKIPIF--
<?php if (!extension_loaded("gmp")) print "skip"; ?>
--FILE--
<?php
$a = gmp_init(42);
$b = gmp_init(17);
var_dump($a + $b);
var_dump($a + 17);
var_dump(42 + $b);
var_dump($a - $b);
var_dump($a - 17);
var_dump(42 - $b);
var_dump($a * $b);
var_dump($a * 17);
var_dump(42 * $b);
var_dump($a / $b);
var_dump($a / 17);
var_dump(42 / $b);
try {
var_dump($a / 0);
} catch (\DivisionByZeroError $e) {
echo $e->getMessage() . \PHP_EOL;
}
var_dump($a % $b);
var_dump($a % 17);
var_dump(42 % $b);
try {
var_dump($a % 0);
} catch (\DivisionByZeroError $e) {
echo $e->getMessage() . \PHP_EOL;
}
var_dump($a ** $b);
var_dump($a ** 17);
var_dump(42 ** $b);
var_dump($a | $b);
var_dump($a | 17);
var_dump(42 | $b);
var_dump($a & $b);
var_dump($a & 17);
var_dump(42 & $b);
var_dump($a ^ $b);
var_dump($a ^ 17);
var_dump(42 ^ $b);
var_dump($a << $b);
var_dump($a << 17);
var_dump(42 << $b);
var_dump($a >> 2);
var_dump(-$a >> 2);
try {
$a << -1;
} catch (ValueError $exception) {
echo $exception->getMessage() . "\n";
}
try {
$a >> -1;
} catch (ValueError $exception) {
echo $exception->getMessage() . "\n";
}
var_dump(~$a);
var_dump(-$a);
var_dump(+$a);
var_dump($a == $b);
var_dump($a != $b);
var_dump($a < $b);
var_dump($a <= $b);
var_dump($a > $b);
var_dump($a >= $b);
var_dump($a == $a);
var_dump($a != $a);
var_dump($a == 42);
var_dump($a != 42);
var_dump($a < 42);
var_dump($a <= 42);
var_dump($a > 42);
var_dump($a >= 42);
try {
var_dump($a == new stdClass);
} catch (\TypeError $e) {
echo $e->getMessage() . \PHP_EOL;
}
$a += 1;
var_dump($a);
$a -= 1;
var_dump($a);
var_dump(++$a);
var_dump($a++);
var_dump($a);
var_dump(--$a);
var_dump($a--);
var_dump($a);
// Test operator that was not overloaded
var_dump($a . $b);
var_dump($a . '17');
var_dump('42' . $b);
$a .= '17';
var_dump($a);
?>
--EXPECT--
object(GMP)#3 (1) {
["num"]=>
string(2) "59"
}
object(GMP)#3 (1) {
["num"]=>
string(2) "59"
}
object(GMP)#3 (1) {
["num"]=>
string(2) "59"
}
object(GMP)#3 (1) {
["num"]=>
string(2) "25"
}
object(GMP)#3 (1) {
["num"]=>
string(2) "25"
}
object(GMP)#3 (1) {
["num"]=>
string(2) "25"
}
object(GMP)#3 (1) {
["num"]=>
string(3) "714"
}
object(GMP)#3 (1) {
["num"]=>
string(3) "714"
}
object(GMP)#3 (1) {
["num"]=>
string(3) "714"
}
object(GMP)#3 (1) {
["num"]=>
string(1) "2"
}
object(GMP)#3 (1) {
["num"]=>
string(1) "2"
}
object(GMP)#3 (1) {
["num"]=>
string(1) "2"
}
Division by zero
object(GMP)#4 (1) {
["num"]=>
string(1) "8"
}
object(GMP)#4 (1) {
["num"]=>
string(1) "8"
}
object(GMP)#4 (1) {
["num"]=>
string(1) "8"
}
Modulo by zero
object(GMP)#3 (1) {
["num"]=>
string(28) "3937657486715347520027492352"
}
object(GMP)#3 (1) {
["num"]=>
string(28) "3937657486715347520027492352"
}
object(GMP)#3 (1) {
["num"]=>
string(28) "3937657486715347520027492352"
}
object(GMP)#3 (1) {
["num"]=>
string(2) "59"
}
object(GMP)#3 (1) {
["num"]=>
string(2) "59"
}
object(GMP)#3 (1) {
["num"]=>
string(2) "59"
}
object(GMP)#3 (1) {
["num"]=>
string(1) "0"
}
object(GMP)#3 (1) {
["num"]=>
string(1) "0"
}
object(GMP)#3 (1) {
["num"]=>
string(1) "0"
}
object(GMP)#3 (1) {
["num"]=>
string(2) "59"
}
object(GMP)#3 (1) {
["num"]=>
string(2) "59"
}
object(GMP)#3 (1) {
["num"]=>
string(2) "59"
}
object(GMP)#3 (1) {
["num"]=>
string(7) "5505024"
}
object(GMP)#3 (1) {
["num"]=>
string(7) "5505024"
}
object(GMP)#3 (1) {
["num"]=>
string(7) "5505024"
}
object(GMP)#3 (1) {
["num"]=>
string(2) "10"
}
object(GMP)#5 (1) {
["num"]=>
string(3) "-11"
}
Shift must be greater than or equal to 0
Shift must be greater than or equal to 0
object(GMP)#5 (1) {
["num"]=>
string(3) "-43"
}
object(GMP)#5 (1) {
["num"]=>
string(3) "-42"
}
object(GMP)#5 (1) {
["num"]=>
string(2) "42"
}
bool(false)
bool(true)
bool(false)
bool(false)
bool(true)
bool(true)
bool(true)
bool(false)
bool(true)
bool(false)
bool(false)
bool(true)
bool(false)
bool(true)
main(): Argument #2 must be of type GMP|string|int, stdClass given
object(GMP)#4 (1) {
["num"]=>
string(2) "43"
}
object(GMP)#1 (1) {
["num"]=>
string(2) "42"
}
object(GMP)#4 (1) {
["num"]=>
string(2) "43"
}
object(GMP)#4 (1) {
["num"]=>
string(2) "43"
}
object(GMP)#1 (1) {
["num"]=>
string(2) "44"
}
object(GMP)#4 (1) {
["num"]=>
string(2) "43"
}
object(GMP)#4 (1) {
["num"]=>
string(2) "43"
}
object(GMP)#1 (1) {
["num"]=>
string(2) "42"
}
string(4) "4217"
string(4) "4217"
string(4) "4217"
string(4) "4217"