assertEquals( 'MyObject', (string) TypeChecker::reconcileTypes('!null', Type::parseString('MyObject')) ); $this->assertEquals( 'MyObject', (string) TypeChecker::reconcileTypes('!null', Type::parseString('MyObject|null')) ); $this->assertEquals( 'MyObject|false', (string) TypeChecker::reconcileTypes('!null', Type::parseString('MyObject|false')) ); $this->assertEquals( 'mixed', (string) TypeChecker::reconcileTypes('!null', Type::parseString('mixed')) ); } public function testNotEmpty() { $this->assertEquals( 'MyObject', (string) TypeChecker::reconcileTypes('!empty', Type::parseString('MyObject')) ); $this->assertEquals( 'MyObject', (string) TypeChecker::reconcileTypes('!empty', Type::parseString('MyObject|null')) ); $this->assertEquals( 'MyObject', (string) TypeChecker::reconcileTypes('!empty', Type::parseString('MyObject|false')) ); $this->assertEquals( 'mixed', (string) TypeChecker::reconcileTypes('!empty', Type::parseString('mixed')) ); // @todo in the future this should also work /* $this->assertEquals( 'MyObject|true', (string) TypeChecker::reconcileTypes('!empty', Type::parseString('MyObject|bool')) ); */ } public function testNull() { $this->assertEquals( 'null', (string) TypeChecker::reconcileTypes('null', Type::parseString('MyObject|null')) ); $this->assertEquals( 'null', (string) TypeChecker::reconcileTypes('null', Type::parseString('MyObject')) ); $this->assertEquals( 'null', (string) TypeChecker::reconcileTypes('null', Type::parseString('MyObject|false')) ); $this->assertEquals( 'null', (string) TypeChecker::reconcileTypes('null', Type::parseString('mixed')) ); } public function testEmpty() { $this->assertEquals( 'null', (string) TypeChecker::reconcileTypes('empty', Type::parseString('MyObject')) ); $this->assertEquals( 'false', (string) TypeChecker::reconcileTypes('empty', Type::parseString('MyObject|false')) ); $this->assertEquals( 'false', (string) TypeChecker::reconcileTypes('empty', Type::parseString('MyObject|bool')) ); $this->assertEquals( 'mixed', (string) TypeChecker::reconcileTypes('empty', Type::parseString('mixed')) ); $reconciled = TypeChecker::reconcileTypes('empty', Type::parseString('bool')); $this->assertEquals('false', (string) $reconciled); $this->assertInstanceOf('Psalm\Type\Atomic', $reconciled->types['false']); } public function testNotMyObject() { $this->assertEquals( 'bool', (string) TypeChecker::reconcileTypes('!MyObject', Type::parseString('MyObject|bool')) ); $this->assertEquals( 'null', (string) TypeChecker::reconcileTypes('!MyObject', Type::parseString('MyObject|null')) ); $this->assertEquals( 'MyObjectB', (string) TypeChecker::reconcileTypes('!MyObjectA', Type::parseString('MyObjectA|MyObjectB')) ); } public function testMyObject() { $this->assertEquals( 'MyObject', (string) TypeChecker::reconcileTypes('MyObject', Type::parseString('MyObject|bool')) ); $this->assertEquals( 'MyObjectA', (string) TypeChecker::reconcileTypes('MyObjectA', Type::parseString('MyObjectA|MyObjectB')) ); } public function testAllMixed() { $this->assertEquals( 'mixed', (string) TypeChecker::reconcileTypes('mixed', Type::parseString('mixed')) ); } }