1
0
mirror of https://github.com/danog/psalm.git synced 2024-11-26 20:34:47 +01:00
psalm/tests/Php71Test.php

280 lines
8.7 KiB
PHP
Raw Normal View History

2016-12-04 05:03:51 +01:00
<?php
namespace Psalm\Tests;
class Php71Test extends TestCase
2016-12-04 05:03:51 +01:00
{
use Traits\FileCheckerInvalidCodeParseTestTrait;
use Traits\FileCheckerValidCodeParseTestTrait;
2016-12-04 19:35:38 +01:00
2017-01-13 20:07:23 +01:00
/**
* @return array
2017-01-13 20:07:23 +01:00
*/
public function providerFileCheckerValidCodeParse()
2016-12-04 19:35:38 +01:00
{
return [
'nullableReturnType' => [
'<?php
function a(): ?string
{
return rand(0, 10) ? "elePHPant" : null;
}
$a = a();',
'assertions' => [
['string|null' => '$a']
]
],
'nullableReturnTypeInDocblock' => [
'<?php
/** @return ?string */
function a() {
return rand(0, 10) ? "elePHPant" : null;
}
$a = a();',
'assertions' => [
2017-05-25 04:07:49 +02:00
['null|string' => '$a']
]
],
'nullableArgument' => [
'<?php
function test(?string $name) : ?string
{
return $name;
}
test("elePHPant");
test(null);'
],
'protectedClassConst' => [
'<?php
class A
{
protected const IS_PROTECTED = 1;
}
class B extends A
{
function fooFoo() : int {
return A::IS_PROTECTED;
}
}',
],
'privateClassConst' => [
'<?php
class A
{
private const IS_PRIVATE = 1;
function fooFoo() : int {
return A::IS_PRIVATE;
}
}'
],
'publicClassConstFetch' => [
'<?php
class A
{
public const IS_PUBLIC = 1;
const IS_ALSO_PUBLIC = 2;
}
class B extends A
{
function fooFoo() : int {
echo A::IS_PUBLIC;
return A::IS_ALSO_PUBLIC;
}
}
echo A::IS_PUBLIC;
echo A::IS_ALSO_PUBLIC;'
],
'arrayDestructuring' => [
'<?php
$data = [
[1, "Tom"],
[2, "Fred"],
];
// list() style
list($id1, $name1) = $data[0];
// [] style
[$id2, $name2] = $data[1];',
'assertions' => [
['string|int' => '$id1'],
['string|int' => '$name1'],
['string|int' => '$id2'],
['string|int' => '$name2']
]
],
'arrayDestructuringInForeach' => [
'<?php
$data = [
[1, "Tom"],
[2, "Fred"],
];
// [] style
foreach ($data as [$id, $name]) {
echo $id;
echo $name;
}'
],
'arrayDestructuringWithKeys' => [
'<?php
$data = [
["id" => 1, "name" => "Tom"],
["id" => 2, "name" => "Fred"],
];
// list() style
list("id" => $id1, "name" => $name1) = $data[0];
// [] style
["id" => $id2, "name" => $name2] = $data[1];',
'assertions' => [
['int' => '$id1'],
['string' => '$name1'],
['int' => '$id2'],
['string' => '$name2']
]
],
'arrayListDestructuringInForeachWithKeys' => [
'<?php
$data = [
["id" => 1, "name" => "Tom"],
["id" => 2, "name" => "Fred"],
];
$last_id = null;
$last_name = null;
// list() style
foreach ($data as list("id" => $id, "name" => $name)) {
$last_id = $id;
$last_name = $name;
}',
'assertions' => [
['null|int' => '$last_id'],
['null|string' => '$last_name']
]
],
'arrayDestructuringInForeachWithKeys' => [
'<?php
$data = [
["id" => 1, "name" => "Tom"],
["id" => 2, "name" => "Fred"],
];
$last_id = null;
$last_name = null;
// [] style
foreach ($data as ["id" => $id, "name" => $name]) {
$last_id = $id;
$last_name = $name;
}',
'assertions' => [
['null|int' => '$last_id'],
['null|string' => '$last_name']
]
],
'iterableArg' => [
'<?php
/**
* @param iterable<int, int> $iter
*/
function iterator(iterable $iter) : void
{
foreach ($iter as $val) {
//
}
}
iterator([1, 2, 3, 4]);
iterator(new SplFixedArray(5));'
],
'traversableObject' => [
'<?php
class IteratorObj implements Iterator {
function rewind() : void {}
/** @return mixed */
function current() { return null; }
function key() : int { return 0; }
function next() : void {}
function valid() : bool { return false; }
}
function foo(\Traversable $t) : void {
}
foo(new IteratorObj);'
]
];
}
2017-01-13 20:07:23 +01:00
/**
* @return array
2017-01-13 20:07:23 +01:00
*/
public function providerFileCheckerInvalidCodeParse()
{
return [
'invalidPrivateClassConstFetch' => [
'<?php
class A
{
private const IS_PRIVATE = 1;
}
echo A::IS_PRIVATE;',
'error_message' => 'InaccessibleClassConstant'
],
'invalidPrivateClassConstFetchFromSubclass' => [
'<?php
class A
{
private const IS_PRIVATE = 1;
}
class B extends A
{
function fooFoo() : int {
return A::IS_PRIVATE;
}
}',
'error_message' => 'InaccessibleClassConstant'
],
'invalidProtectedClassConstFetch' => [
'<?php
class A
{
protected const IS_PROTECTED = 1;
}
echo A::IS_PROTECTED;',
'error_message' => 'InaccessibleClassConstant'
],
'invalidIterableArg' => [
'<?php
/**
* @param iterable<string> $iter
*/
function iterator(iterable $iter) : void
{
foreach ($iter as $val) {
//
}
}
class A {
}
iterator(new A());',
'error_message' => 'InvalidArgument'
]
2016-12-04 19:35:38 +01:00
];
}
2016-12-04 05:03:51 +01:00
}