2017-01-15 21:58:40 +01:00
|
|
|
<?php
|
|
|
|
namespace Psalm\Tests;
|
|
|
|
|
2017-04-25 05:45:02 +02:00
|
|
|
class ConstantTest extends TestCase
|
2017-01-15 21:58:40 +01:00
|
|
|
{
|
2017-04-25 05:45:02 +02:00
|
|
|
use Traits\FileCheckerInvalidCodeParseTestTrait;
|
|
|
|
use Traits\FileCheckerValidCodeParseTestTrait;
|
2017-01-15 21:58:40 +01:00
|
|
|
|
|
|
|
/**
|
2017-04-25 05:45:02 +02:00
|
|
|
* @return array
|
2017-01-15 21:58:40 +01:00
|
|
|
*/
|
2017-04-25 05:45:02 +02:00
|
|
|
public function providerFileCheckerValidCodeParse()
|
2017-01-15 21:58:40 +01:00
|
|
|
{
|
2017-04-25 05:45:02 +02:00
|
|
|
return [
|
|
|
|
'constantInFunction' => [
|
|
|
|
'<?php
|
|
|
|
useTest();
|
|
|
|
const TEST = 2;
|
2017-12-06 06:05:01 +01:00
|
|
|
|
2018-01-11 21:50:45 +01:00
|
|
|
function useTest(): int {
|
2017-04-25 05:45:02 +02:00
|
|
|
return TEST;
|
2017-05-27 02:05:57 +02:00
|
|
|
}',
|
2017-04-25 05:45:02 +02:00
|
|
|
],
|
|
|
|
'constantInClosure' => [
|
|
|
|
'<?php
|
|
|
|
const TEST = 2;
|
2017-12-06 06:05:01 +01:00
|
|
|
|
2018-01-11 21:50:45 +01:00
|
|
|
$useTest = function(): int {
|
2017-04-25 05:45:02 +02:00
|
|
|
return TEST;
|
|
|
|
};
|
2017-05-27 02:05:57 +02:00
|
|
|
$useTest();',
|
2017-04-25 05:45:02 +02:00
|
|
|
],
|
|
|
|
'constantDefinedInFunction' => [
|
|
|
|
'<?php
|
|
|
|
/**
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
function defineConstant() {
|
|
|
|
define("CONSTANT", 1);
|
|
|
|
}
|
2017-12-06 06:05:01 +01:00
|
|
|
|
2017-04-25 05:45:02 +02:00
|
|
|
defineConstant();
|
2017-12-06 06:05:01 +01:00
|
|
|
|
2017-05-27 02:05:57 +02:00
|
|
|
echo CONSTANT;',
|
|
|
|
],
|
2017-12-06 06:05:01 +01:00
|
|
|
'magicConstant' => [
|
|
|
|
'<?php
|
|
|
|
$a = __LINE__;
|
|
|
|
$b = __file__;',
|
|
|
|
'assertions' => [
|
|
|
|
'$a' => 'int',
|
|
|
|
'$b' => 'string',
|
|
|
|
],
|
|
|
|
],
|
2017-12-19 15:48:01 +01:00
|
|
|
'getClassConstantValue' => [
|
|
|
|
'<?php
|
|
|
|
class A {
|
|
|
|
const B = [0, 1, 2];
|
|
|
|
}
|
|
|
|
|
|
|
|
$a = A::B[1];',
|
|
|
|
],
|
2018-01-25 16:47:15 +01:00
|
|
|
'staticConstEval' => [
|
|
|
|
'<?php
|
|
|
|
abstract class Enum {
|
|
|
|
/**
|
|
|
|
* @var string[]
|
|
|
|
*/
|
|
|
|
protected const VALUES = [];
|
|
|
|
public static function export(): string
|
|
|
|
{
|
|
|
|
assert(!empty(static::VALUES));
|
|
|
|
$values = array_map(
|
|
|
|
function(string $val): string {
|
|
|
|
return "\'" . $val . "\'";
|
|
|
|
},
|
|
|
|
static::VALUES
|
|
|
|
);
|
|
|
|
return join(",", $values);
|
|
|
|
}
|
|
|
|
}',
|
|
|
|
'assertions' => [],
|
|
|
|
'error_levels' => ['MixedArgument'],
|
|
|
|
],
|
2018-02-08 02:26:26 +01:00
|
|
|
'undefinedConstant' => [
|
|
|
|
'<?php
|
|
|
|
switch (rand(0, 50)) {
|
|
|
|
case FORTY: // Observed a valid UndeclaredConstant warning
|
|
|
|
$x = "value";
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
$x = "other";
|
|
|
|
}
|
|
|
|
|
|
|
|
echo $x;',
|
|
|
|
'assertions' => [],
|
|
|
|
'error_levels' => ['UndefinedConstant'],
|
|
|
|
],
|
2017-04-25 05:45:02 +02:00
|
|
|
];
|
2017-01-15 21:58:40 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2017-04-25 05:45:02 +02:00
|
|
|
* @return array
|
2017-01-15 21:58:40 +01:00
|
|
|
*/
|
2017-04-25 05:45:02 +02:00
|
|
|
public function providerFileCheckerInvalidCodeParse()
|
2017-01-15 21:58:40 +01:00
|
|
|
{
|
2017-04-25 05:45:02 +02:00
|
|
|
return [
|
|
|
|
'constantDefinedInFunctionButNotCalled' => [
|
|
|
|
'<?php
|
|
|
|
/**
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
function defineConstant() {
|
|
|
|
define("CONSTANT", 1);
|
|
|
|
}
|
2017-12-06 06:05:01 +01:00
|
|
|
|
2017-04-25 05:45:02 +02:00
|
|
|
echo CONSTANT;',
|
2017-05-27 02:05:57 +02:00
|
|
|
'error_message' => 'UndefinedConstant',
|
|
|
|
],
|
2018-02-16 02:27:42 +01:00
|
|
|
'undefinedClassConstantInParamDefault' => [
|
|
|
|
'<?php
|
|
|
|
class A {
|
|
|
|
public function doSomething(int $howManyTimes = self::DEFAULT_TIMES): void {}
|
|
|
|
}',
|
|
|
|
'error_message' => 'UndefinedConstant',
|
|
|
|
],
|
2017-04-25 05:45:02 +02:00
|
|
|
];
|
2017-01-15 22:43:49 +01:00
|
|
|
}
|
2017-01-15 21:58:40 +01:00
|
|
|
}
|