assertNotContains appears to be messing something up.
Nobody has claimed this yet.
Assessment
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Newbie friendliness
- 35/100
Research direction
Start with the shortened OmegaTag and testBasic examples in the issue, focusing on the interaction between assertNotContains() and the later assertCount() call. Compare the analysis with and without assertNotContains(); done when the collection is no longer inferred as NEVER and the impossibleType warning is resolved.
Written by the indexing model from the issue text.
Description
I've got a weird issue that I can't seem to figure out. I think it is a bug in PHPStan, but I'm not certain.
I appreciate if you can point me in a way on how to debug this or help you figure out what is wrong.
Some context first:
- popped up after upgrading PHPStan yesterday, it was not there before. I update very often, so it was a recent change.
- Happens on both PHP8.4 and PHP8.5alpha
- It involves the PHPUnit method "assetNotContains", so I don't think I can create a playground example.
- I tried creating a small repo with an example, but I can't reproduce the error there. I'm not sure why. I used the same phpstan.neon file (just paths changed) and the contents of the classes appear identical to me (except namespaces).
Given this (a bit shortened) test class:
class OmegaTag
{
/**
* @var Collection<array-key, OmegaProduct>
*/
private Collection $products;
public function __construct()
{
$this->products = new ArrayCollection();
}
/**
* @return Collection<array-key, OmegaProduct>
*/
public function getProducts(): Collection
{
return $this->products;
}
}
This (shortened) test:
public function testBasic(): void
{
$product = new OmegaProduct();
$tag = new OmegaTag();
self::assertNotContains($product, $tag->getProducts());
self::assertCount(0, $tag->getProducts());
}
This gives me this error:
Call to static method PHPUnit\Framework\Assert::assertCount() with 0 and *NEVER* will always evaluate to false.
🪪 staticMethod.impossibleType
I'm not sure how PHPStan got to the type *NEVER*.
Observations:
- When I remove the line with the method
assertNotContains, the error goes away. - When I refactor the 2
$tag->getProducts()calls to a single variable and use that in the test, the error is still there.
It seems that assertNotContains narrows the type to never, while I think it should not do that.
Is there any direction you can point me in to find out what is wrong here?
Or is there any more info I can give if you think this is a bug?
- Dominant language
- PHP
- Stars
- 544
- Forks
- 58
- Avg merge
- 2d 1h
- Merged PRs (30d)
- 5
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from phpstan/phpstan-phpunit
-
Difficulty 3/5 1-2 days Newbie friendliness 68/100
phpstan/phpstan-phpunit#332 ·
-
Difficulty 4/5 3-5 days Newbie friendliness 48/100
phpstan/phpstan-phpunit#321 ·
-
Difficulty 4/5 3-5 days Newbie friendliness 48/100
phpstan/phpstan-phpunit#309 ·
-
Difficulty 3/5 1-2 days Newbie friendliness 45/100
phpstan/phpstan-phpunit#299 · 2 comments ·
-
Difficulty 3/5 1-2 days Newbie friendliness 52/100
phpstan/phpstan-phpunit#292 · 3 comments ·
All issues in phpstan/phpstan-phpunit
Similar issues
-
sync-en
Difficulty 1/5 1-3 hours Newbie friendliness 88/100
-
sync-en
Difficulty 1/5 1-3 hours Newbie friendliness 88/100
-
Перевод устарел
Difficulty 1/5 1-3 hours Newbie friendliness 88/100
-
status/awaiting_triage
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
-
Issue: ready for confirmation Reported on 2.4.x
Difficulty 2/5 1-3 hours Newbie friendliness 88/100