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

199 lines
5.2 KiB
PHP
Raw Normal View History

2016-06-16 02:16:40 +02:00
<?php
2016-07-26 00:37:44 +02:00
namespace Psalm\Tests;
2016-06-16 02:16:40 +02:00
2016-11-02 07:29:00 +01:00
use Psalm\Type;
2016-06-16 02:16:40 +02:00
class TypeCombinationTest extends TestCase
2016-06-16 02:16:40 +02:00
{
use Traits\FileCheckerValidCodeParseTestTrait;
2017-01-13 20:07:23 +01:00
/**
* @dataProvider providerTestValidTypeCombination
2017-05-27 02:16:18 +02:00
*
* @param string $expected
* @param array<int, string> $types
2017-05-27 02:16:18 +02:00
*
2017-01-13 20:07:23 +01:00
* @return void
*/
public function testValidTypeCombination($expected, $types)
2016-06-16 02:16:40 +02:00
{
foreach ($types as $k => $type) {
$types[$k] = self::getAtomic($type);
}
/** @psalm-suppress PossiblyInvalidArgument */
2017-05-27 02:05:57 +02:00
$this->assertSame(
$expected,
(string) Type::combineTypes($types)
);
2016-06-16 02:16:40 +02:00
}
2017-01-13 20:07:23 +01:00
/**
* @return array
*/
public function providerFileCheckerValidCodeParse()
{
return [
'multipleValuedArray' => [
'<?php
class A {}
class B {}
$var = [];
$var[] = new A();
2017-05-27 02:05:57 +02:00
$var[] = new B();',
],
];
}
/**
* @return array
*/
public function providerTestValidTypeCombination()
{
return [
'intOrString' => [
'int|string',
[
'int',
2017-05-27 02:05:57 +02:00
'string',
],
],
'arrayOfIntOrString' => [
'array<mixed, int|string>',
[
'array<int>',
2017-05-27 02:05:57 +02:00
'array<string>',
],
],
'arrayOfIntOrAlsoString' => [
'array<mixed, int>|string',
[
'array<int>',
2017-05-27 02:05:57 +02:00
'string',
],
],
'emptyArrays' => [
'array<empty, empty>',
[
'array<empty,empty>',
2017-05-27 02:05:57 +02:00
'array<empty,empty>',
],
],
'arrayStringOrEmptyArray' => [
'array<mixed, string>',
[
'array<empty>',
2017-05-27 02:05:57 +02:00
'array<string>',
],
],
'arrayMixedOrString' => [
'array<mixed, mixed>',
[
'array<mixed>',
2017-05-27 02:05:57 +02:00
'array<string>',
],
],
'arrayMixedOrStringKeys' => [
'array<mixed, string>',
[
'array<int|string,string>',
2017-05-27 02:05:57 +02:00
'array<mixed,string>',
],
],
'arrayMixedOrEmpty' => [
'array<mixed, mixed>',
[
'array<empty>',
2017-05-27 02:05:57 +02:00
'array<mixed>',
],
],
'arrayBigCombination' => [
'array<mixed, int|float|string>',
[
'array<int|float>',
2017-05-27 02:05:57 +02:00
'array<string>',
],
],
'falseDestruction' => [
'bool',
[
'false',
2017-05-27 02:05:57 +02:00
'bool',
],
],
'onlyFalse' => [
'bool',
[
2017-05-27 02:05:57 +02:00
'false',
],
],
'falseFalseDestruction' => [
'bool',
[
'false',
2017-05-27 02:05:57 +02:00
'false',
],
],
'aAndAOfB' => [
'A',
[
'A',
2017-05-27 02:05:57 +02:00
'A<B>',
],
],
'combineObjectType1' => [
'array{a:int, b:string}',
[
'array{a:int}',
2017-05-27 02:05:57 +02:00
'array{b:string}',
],
],
'combineObjectType2' => [
'array{a:int|string, b:string}',
[
'array{a:int}',
2017-05-27 02:05:57 +02:00
'array{a:string,b:string}',
],
],
'combineObjectTypeWithIntKeyedArray' => [
'array<int|string, string|int>',
[
'array{a:int}',
'array<int, string>',
],
],
'combineNestedObjectTypeWithObjectLikeIntKeyedArray' => [
'array{a:array<int|string, string|int>}',
[
'array{a:array{a:int}}',
'array{a:array<int, string>}',
],
],
'combineIntKeyedObjectTypeWithNestedIntKeyedArray' => [
'array<int, array<int|string, string|int>>',
[
'array<int, array{a:int}>',
'array<int, array<int, string>>',
],
],
'combineNestedObjectTypeWithNestedIntKeyedArray' => [
'array<int|string, array<int|string, string|int>>',
[
'array{a:array{a:int}}',
'array<int, array<int, string>>',
],
],
];
}
/**
* @param string $string
2017-05-27 02:16:18 +02:00
*
* @return Type\Atomic
*/
2016-06-28 20:28:45 +02:00
private static function getAtomic($string)
{
2016-06-28 21:25:28 +02:00
return array_values(Type::parseString($string)->types)[0];
2016-06-28 20:28:45 +02:00
}
2016-06-16 02:16:40 +02:00
}