1
0
mirror of https://github.com/danog/psalm.git synced 2024-11-27 12:55:26 +01:00
psalm/tests/BinaryOperationTest.php

189 lines
5.8 KiB
PHP
Raw Normal View History

2016-12-24 00:52:34 +01:00
<?php
namespace Psalm\Tests;
class BinaryOperationTest extends TestCase
2016-12-24 00:52:34 +01:00
{
use Traits\FileCheckerInvalidCodeParseTestTrait;
use Traits\FileCheckerValidCodeParseTestTrait;
2016-12-24 00:52:34 +01:00
/**
* @return array
2016-12-24 00:52:34 +01:00
*/
public function providerFileCheckerValidCodeParse()
2016-12-24 00:52:34 +01:00
{
return [
'regularAddition' => [
'<?php
2017-05-27 02:05:57 +02:00
$a = 5 + 4;',
],
'differingNumericTypesAdditionInWeakMode' => [
'<?php
2017-05-27 02:05:57 +02:00
$a = 5 + 4.1;',
],
'numericAddition' => [
'<?php
$a = "5";
if (is_numeric($a)) {
$b = $a + 4;
2017-05-27 02:05:57 +02:00
}',
],
'concatenation' => [
'<?php
2017-05-27 02:05:57 +02:00
$a = "Hey " . "Jude,";',
],
'concatenationWithNumberInWeakMode' => [
'<?php
2017-05-27 02:05:57 +02:00
$a = "hi" . 5;',
],
'possiblyInvalidAdditionOnBothSides' => [
'<?php
function foo(string $s) : int {
return strpos($s, "a") + strpos($s, "b");
}',
'assertions' => [],
'error_levels' => ['PossiblyFalseOperand'],
],
'bitwiseoperations' => [
'<?php
$a = 4 & 5;
$b = 2 | 3;
$c = 4 ^ 3;
$d = 1 << 2;
2018-04-17 00:19:18 +02:00
$e = 15 >> 2;
$f = "a" & "b";',
'assertions' => [
'$a' => 'int',
'$b' => 'int',
'$c' => 'int',
'$d' => 'int',
'$e' => 'int',
2018-04-17 00:19:18 +02:00
'$f' => 'string',
],
],
2018-05-05 18:59:30 +02:00
'gmpOperations' => [
'<?php
$a = gmp_init(2);
$b = gmp_init(4);
$c = $a + $b;
2018-05-05 19:04:27 +02:00
$d = $c + 3;
echo $d;
$f = $a / $b;
$g = $a ** $b;
$h = $a % $b;
$i = 6 + $b;
$j = 6 - $b;
$k = 6 * $b;
$l = 6 / $b;
$m = 6 ** $b;
$n = 6 % $b;
$o = $a + 6;
$p = $a - 6;
$q = $a * 6;
$r = $a / 6;
$s = $a ** 6;
$t = $a % 6;',
2018-05-05 18:59:30 +02:00
'assertions' => [
'$a' => 'GMP',
'$b' => 'GMP',
'$c' => 'GMP',
'$d' => 'GMP',
'$f' => 'GMP',
'$g' => 'GMP',
'$h' => 'GMP',
'$i' => 'GMP',
'$j' => 'GMP',
'$k' => 'GMP',
'$l' => 'GMP',
'$m' => 'GMP',
'$n' => 'GMP',
'$o' => 'GMP',
'$p' => 'GMP',
'$q' => 'GMP',
'$r' => 'GMP',
'$s' => 'GMP',
'$t' => 'GMP',
2018-05-05 18:59:30 +02:00
],
],
'booleanXor' => [
'<?php
$a = true ^ false;
$b = false ^ false;
$c = (true xor false);
$d = (false xor false);',
'assertions' => [
'$a' => 'int',
'$b' => 'int',
'$c' => 'bool',
'$d' => 'bool',
],
],
'ternaryAssignment' => [
'<?php
rand(0, 1) ? $a = 1 : $a = 2;
echo $a;',
],
];
2016-12-24 00:52:34 +01:00
}
2017-01-13 20:07:23 +01:00
/**
* @return array
2017-01-13 20:07:23 +01:00
*/
public function providerFileCheckerInvalidCodeParse()
2016-12-24 00:52:34 +01:00
{
return [
'badAddition' => [
'<?php
$a = "b" + 5;',
2017-05-27 02:05:57 +02:00
'error_message' => 'InvalidOperand',
],
'differingNumericTypesAdditionInStrictMode' => [
'<?php
$a = 5 + 4.1;',
'error_message' => 'InvalidOperand',
'error_levels' => [],
2017-05-27 02:05:57 +02:00
'strict_mode' => true,
],
'concatenationWithNumberInStrictMode' => [
'<?php
$a = "hi" . 5;',
'error_message' => 'InvalidOperand',
'error_levels' => [],
2017-05-27 02:05:57 +02:00
'strict_mode' => true,
],
'addArrayToNumber' => [
'<?php
$a = [1] + 1;',
'error_message' => 'InvalidOperand',
'error_levels' => [],
2017-05-27 02:05:57 +02:00
'strict_mode' => true,
],
'additionWithClassInWeakMode' => [
'<?php
$a = "hi" + (new stdClass);',
'error_message' => 'InvalidOperand',
],
'possiblyInvalidOperand' => [
'<?php
$b = rand(0, 1) ? [] : 4;
echo $b + 5;',
'error_message' => 'PossiblyInvalidOperand',
],
'possiblyInvalidConcat' => [
'<?php
$b = rand(0, 1) ? [] : "hello";
echo $b . "goodbye";',
'error_message' => 'PossiblyInvalidOperand',
],
2018-05-05 18:59:30 +02:00
'invalidGMPOperation' => [
'<?php
$a = gmp_init(2);
$b = "a" + $a;',
'error_message' => 'InvalidOperand - src/somefile.php:3 - Cannot add GMP to non-numeric type',
],
];
2016-12-24 00:52:34 +01:00
}
}