Skip to content

Commit 5167184

Browse files
committed
add test
1 parent 06417d4 commit 5167184

File tree

1 file changed

+108
-0
lines changed

1 file changed

+108
-0
lines changed
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
<?php
2+
3+
namespace StaticWithThisChained;
4+
5+
use function PHPStan\Testing\assertType;
6+
7+
class Foo
8+
{
9+
/** @var $this */
10+
public $propThis;
11+
12+
/** @var static */
13+
public $propStatic;
14+
15+
/** @var static */
16+
public static $propStaticStatic;
17+
18+
/**
19+
* @return $this
20+
*/
21+
public function getThis()
22+
{
23+
return $this;
24+
}
25+
26+
/**
27+
* @return static
28+
*/
29+
public function newStatic()
30+
{
31+
return new static();
32+
}
33+
34+
/**
35+
* @return static
36+
*/
37+
public static function newStaticStatic()
38+
{
39+
return new static();
40+
}
41+
42+
public function testMethodChained(): void
43+
{
44+
assertType('$this(StaticWithThisChained\Foo)', $this->getThis());
45+
assertType('static(StaticWithThisChained\Foo)', $this->newStatic());
46+
assertType('static(StaticWithThisChained\Foo)', static::newStaticStatic());
47+
assertType('static(StaticWithThisChained\Foo)', self::newStaticStatic());
48+
assertType('StaticWithThisChained\Foo', Foo::newStaticStatic());
49+
50+
assertType('$this(StaticWithThisChained\Foo)', $this->getThis()->getThis());
51+
assertType('static(StaticWithThisChained\Foo)', $this->newStatic()->getThis());
52+
assertType('static(StaticWithThisChained\Foo)', static::newStaticStatic()->getThis());
53+
assertType('static(StaticWithThisChained\Foo)', self::newStaticStatic()->getThis());
54+
assertType('StaticWithThisChained\Foo', Foo::newStaticStatic()->getThis());
55+
}
56+
57+
public function testPropertyChained(): void
58+
{
59+
assertType('$this(StaticWithThisChained\Foo)', $this->propThis);
60+
assertType('static(StaticWithThisChained\Foo)', $this->propStatic);
61+
assertType('static(StaticWithThisChained\Foo)', static::$propStaticStatic);
62+
assertType('static(StaticWithThisChained\Foo)', self::$propStaticStatic);
63+
assertType('static(StaticWithThisChained\Foo)', Foo::$propStaticStatic); // should be StaticWithThisChained\Foo
64+
65+
assertType('$this(StaticWithThisChained\Foo)', $this->propThis->propThis);
66+
assertType('static(StaticWithThisChained\Foo)', $this->propStatic->propThis);
67+
assertType('static(StaticWithThisChained\Foo)', static::$propStaticStatic->propThis);
68+
assertType('static(StaticWithThisChained\Foo)', self::$propStaticStatic->propThis);
69+
assertType('static(StaticWithThisChained\Foo)', Foo::$propStaticStatic->propThis); // should be StaticWithThisChained\Foo
70+
}
71+
}
72+
73+
class Bar extends Foo
74+
{
75+
public function testMethodChained(): void
76+
{
77+
assertType('$this(StaticWithThisChained\Bar)', $this->getThis());
78+
assertType('static(StaticWithThisChained\Bar)', $this->newStatic());
79+
assertType('static(StaticWithThisChained\Bar)', static::newStaticStatic());
80+
assertType('static(StaticWithThisChained\Bar)', self::newStaticStatic());
81+
assertType('StaticWithThisChained\Foo', Foo::newStaticStatic());
82+
assertType('StaticWithThisChained\Bar', Bar::newStaticStatic());
83+
84+
assertType('$this(StaticWithThisChained\Bar)', $this->getThis()->getThis());
85+
assertType('static(StaticWithThisChained\Bar)', $this->newStatic()->getThis());
86+
assertType('static(StaticWithThisChained\Bar)', static::newStaticStatic()->getThis());
87+
assertType('static(StaticWithThisChained\Bar)', self::newStaticStatic()->getThis());
88+
assertType('StaticWithThisChained\Foo', Foo::newStaticStatic()->getThis());
89+
assertType('StaticWithThisChained\Bar', Bar::newStaticStatic()->getThis());
90+
}
91+
92+
public function testPropertyChained(): void
93+
{
94+
assertType('$this(StaticWithThisChained\Bar)', $this->propThis);
95+
assertType('static(StaticWithThisChained\Bar)', $this->propStatic);
96+
assertType('static(StaticWithThisChained\Bar)', static::$propStaticStatic);
97+
assertType('static(StaticWithThisChained\Bar)', self::$propStaticStatic);
98+
assertType('static(StaticWithThisChained\Bar)', Foo::$propStaticStatic); // should be StaticWithThisChained\Foo (non-static and Foo, not Bar)
99+
assertType('static(StaticWithThisChained\Bar)', Bar::$propStaticStatic); // should be StaticWithThisChained\Bar (non-static)
100+
101+
assertType('$this(StaticWithThisChained\Bar)', $this->propThis->propThis);
102+
assertType('static(StaticWithThisChained\Bar)', $this->propStatic->propThis);
103+
assertType('static(StaticWithThisChained\Bar)', static::$propStaticStatic->propThis);
104+
assertType('static(StaticWithThisChained\Bar)', self::$propStaticStatic->propThis);
105+
assertType('static(StaticWithThisChained\Bar)', Foo::$propStaticStatic->propThis); // should be StaticWithThisChained\Foo (non-static and Foo, not Bar)
106+
assertType('static(StaticWithThisChained\Bar)', Bar::$propStaticStatic->propThis); // should be StaticWithThisChained\Bar (non-static)
107+
}
108+
}

0 commit comments

Comments
 (0)