- 添加 Decimal 算术运算测试用例 - 添加 BigInt 复合赋值运算测试用例 - 添加 Decimal 复合赋值运算测试用例 - 添加 Decimal 比较和转换测试用例 - 添加 BigInt 二元运算符测试用例 - 添加 Decimal 运算符重载测试用例 - 添加 Decimal 一元负号测试用例 - 在编译器中实现对 BigInt、Decimal 和 BigFloat 类型的自增自减操作限制 - 添加 PHPUnit 测试验证自增自减操作错误提示 - 为 BigInt 和 Decimal 类型禁用 ++ 和 -- 操作符pull/1/head
parent
a459a8bd95
commit
69e4386454
12 changed files with 326 additions and 0 deletions
@ -0,0 +1,8 @@ |
||||
<?php |
||||
declare(strict_types=1); |
||||
use native_types; |
||||
function main() |
||||
{ |
||||
$a = std::bigInt(100); |
||||
$a++; |
||||
} |
||||
@ -0,0 +1,8 @@ |
||||
<?php |
||||
declare(strict_types=1); |
||||
use native_types; |
||||
function main() |
||||
{ |
||||
$a = std::bigInt(100); |
||||
++$a; |
||||
} |
||||
@ -0,0 +1,8 @@ |
||||
<?php |
||||
declare(strict_types=1); |
||||
use native_types; |
||||
function main() |
||||
{ |
||||
$a = std::decimal("100"); |
||||
--$a; |
||||
} |
||||
@ -0,0 +1,46 @@ |
||||
--TEST-- |
||||
BigInt compound assignment operators (+=, -=, *=, /=, %=) |
||||
--FILE-- |
||||
<?php |
||||
declare(strict_types=1); |
||||
use native_types; |
||||
|
||||
function main(): void { |
||||
// BigInt += |
||||
$a = std::bigInt(100); |
||||
$a += 50; |
||||
echo $a->toString(); echo "\n"; |
||||
|
||||
// BigInt += with BigInt |
||||
$b = std::bigInt("99999999999999999999"); |
||||
$b += std::bigInt(1); |
||||
echo $b->toString(); echo "\n"; |
||||
|
||||
// BigInt -= |
||||
$c = std::bigInt(1000); |
||||
$c -= 300; |
||||
echo $c->toString(); echo "\n"; |
||||
|
||||
// BigInt *= |
||||
$d = std::bigInt(100); |
||||
$d *= 5; |
||||
echo $d->toString(); echo "\n"; |
||||
|
||||
// BigInt /= |
||||
$e = std::bigInt(100); |
||||
$e /= 3; |
||||
echo $e->toString(); echo "\n"; |
||||
|
||||
// BigInt %= |
||||
$f = std::bigInt(100); |
||||
$f %= 7; |
||||
echo $f->toString(); echo "\n"; |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
150 |
||||
100000000000000000000 |
||||
700 |
||||
500 |
||||
33 |
||||
2 |
||||
@ -0,0 +1,49 @@ |
||||
--TEST-- |
||||
BigInt binary operators (+, -, *, /, %) and unary minus |
||||
--FILE-- |
||||
<?php |
||||
declare(strict_types=1); |
||||
use native_types; |
||||
|
||||
function main(): void { |
||||
$a = std::bigInt(100); |
||||
|
||||
// BigInt + Int |
||||
$b = $a + 50; |
||||
echo $b->toString(); echo "\n"; |
||||
// Int + BigInt |
||||
$c = 200 + $a; |
||||
echo $c->toString(); echo "\n"; |
||||
// BigInt - Int |
||||
$d = $a - 30; |
||||
echo $d->toString(); echo "\n"; |
||||
// BigInt * Int |
||||
$e = $a * 5; |
||||
echo $e->toString(); echo "\n"; |
||||
// BigInt / Int |
||||
$f = $a / 3; |
||||
echo $f->toString(); echo "\n"; |
||||
// BigInt % Int |
||||
$g = $a % 7; |
||||
echo $g->toString(); echo "\n"; |
||||
|
||||
// BigInt ** Int |
||||
$h = std::bigInt(2) ** 10; |
||||
echo $h->toString(); echo "\n"; |
||||
|
||||
// Unary minus |
||||
$i = -$a; |
||||
echo $i->toString(); echo "\n"; |
||||
echo (-$i)->toString(); echo "\n"; |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
150 |
||||
300 |
||||
70 |
||||
500 |
||||
33 |
||||
2 |
||||
1024 |
||||
-100 |
||||
100 |
||||
@ -0,0 +1,36 @@ |
||||
--TEST-- |
||||
Decimal arithmetic operations |
||||
--FILE-- |
||||
<?php |
||||
declare(strict_types=1); |
||||
use native_types; |
||||
|
||||
function main(): void { |
||||
$a = std::decimal("100.50"); |
||||
$b = std::decimal("50.25"); |
||||
|
||||
// Decimal + Decimal |
||||
echo $a->add($b)->toString(); echo "\n"; |
||||
// Decimal - Decimal |
||||
echo $a->sub($b)->toString(); echo "\n"; |
||||
// Decimal * Decimal |
||||
echo $a->mul($b)->toString(); echo "\n"; |
||||
// Decimal / Decimal |
||||
echo $a->div($b)->toString(); echo "\n"; |
||||
// Decimal mod |
||||
$c = std::decimal("17.5"); |
||||
echo $c->mod(std::decimal("5.0"))->toString(); echo "\n"; |
||||
// Decimal neg |
||||
echo $a->neg()->toString(); echo "\n"; |
||||
// Decimal abs |
||||
echo $a->neg()->abs()->toString(); echo "\n"; |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
150.75 |
||||
50.25 |
||||
5050.1250 |
||||
2 |
||||
2.5 |
||||
-100.50 |
||||
100.50 |
||||
@ -0,0 +1,45 @@ |
||||
--TEST-- |
||||
Decimal compound assignment operators (+=, -=, *=, /=, %=) |
||||
--FILE-- |
||||
<?php |
||||
declare(strict_types=1); |
||||
use native_types; |
||||
|
||||
function main(): void { |
||||
// Decimal += |
||||
$a = std::decimal("100.50"); |
||||
$a += 25.25; |
||||
echo $a->toString(); echo "\n"; |
||||
|
||||
// Decimal += with int |
||||
$a += 100; |
||||
echo $a->toString(); echo "\n"; |
||||
|
||||
// Decimal -= |
||||
$b = std::decimal("500.00"); |
||||
$b -= 123.45; |
||||
echo $b->toString(); echo "\n"; |
||||
|
||||
// Decimal *= |
||||
$c = std::decimal("50.5"); |
||||
$c *= 2; |
||||
echo $c->toString(); echo "\n"; |
||||
|
||||
// Decimal /= |
||||
$d = std::decimal("100.00"); |
||||
$d /= 4; |
||||
echo $d->toString(); echo "\n"; |
||||
|
||||
// Decimal %= |
||||
$e = std::decimal("17.5"); |
||||
$e %= 5.0; |
||||
echo $e->toString(); echo "\n"; |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
125.75 |
||||
225.75 |
||||
376.55 |
||||
101.0 |
||||
25.00 |
||||
2.5 |
||||
@ -0,0 +1,26 @@ |
||||
--TEST-- |
||||
Decimal comparison and conversions |
||||
--FILE-- |
||||
<?php |
||||
declare(strict_types=1); |
||||
use native_types; |
||||
|
||||
function main(): void { |
||||
$a = std::decimal("123.456"); |
||||
$b = std::decimal("789.012"); |
||||
|
||||
echo "cmp(a,b)="; echo $a->cmp($b); echo "\n"; |
||||
echo "cmp(b,a)="; echo $b->cmp($a); echo "\n"; |
||||
echo "cmp(a,a)="; echo $a->cmp($a); echo "\n"; |
||||
|
||||
// conversion |
||||
echo $a->toInt(); echo "\n"; |
||||
echo $a->toString(); echo "\n"; |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
cmp(a,b)=-1 |
||||
cmp(b,a)=1 |
||||
cmp(a,a)=0 |
||||
123 |
||||
123.456 |
||||
@ -0,0 +1,51 @@ |
||||
--TEST-- |
||||
Decimal operator overloading (+, -, *, /, %) and comparisons |
||||
--FILE-- |
||||
<?php |
||||
declare(strict_types=1); |
||||
use native_types; |
||||
|
||||
function main(): void { |
||||
$dec = std::decimal("100.25"); |
||||
|
||||
// Decimal + Int |
||||
$a = $dec + 50; |
||||
echo $a->toString(); echo "\n"; |
||||
// Int + Decimal |
||||
$b = 200 + $dec; |
||||
echo $b->toString(); echo "\n"; |
||||
// Decimal - Float |
||||
$c = $dec - 0.25; |
||||
echo $c->toString(); echo "\n"; |
||||
// Decimal * Int |
||||
$d = $dec * 4; |
||||
echo $d->toString(); echo "\n"; |
||||
// Decimal / Int |
||||
$e = $dec / 5; |
||||
echo $e->toString(); echo "\n"; |
||||
// Decimal % Int |
||||
$f = $dec % 7; |
||||
echo $f->toString(); echo "\n"; |
||||
|
||||
// Comparisons |
||||
echo (int)($dec > 50); echo "\n"; |
||||
echo (int)($dec < 200); echo "\n"; |
||||
echo (int)($dec == 100.25); echo "\n"; |
||||
echo (int)($dec != 100); echo "\n"; |
||||
echo (int)($dec <= 100.25); echo "\n"; |
||||
echo (int)($dec >= 100); echo "\n"; |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
150.25 |
||||
300.25 |
||||
100.00 |
||||
401.00 |
||||
20.05 |
||||
2.25 |
||||
1 |
||||
1 |
||||
1 |
||||
1 |
||||
1 |
||||
1 |
||||
@ -0,0 +1,21 @@ |
||||
--TEST-- |
||||
Decimal unary minus operator |
||||
--FILE-- |
||||
<?php |
||||
declare(strict_types=1); |
||||
use native_types; |
||||
|
||||
function main(): void { |
||||
$a = std::decimal("123.456"); |
||||
|
||||
// Unary minus |
||||
$b = -$a; |
||||
echo $b->toString(); echo "\n"; |
||||
// Double minus |
||||
$c = -$b; |
||||
echo $c->toString(); echo "\n"; |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
-123.456 |
||||
123.456 |
||||
Loading…
Reference in new issue