Skip to content

Commit

Permalink
Split method-signature-variance.php test stub into three different te…
Browse files Browse the repository at this point in the history
…st cases
  • Loading branch information
autaut03 committed Jul 11, 2022
1 parent 3d7710a commit 200158e
Show file tree
Hide file tree
Showing 5 changed files with 369 additions and 242 deletions.
197 changes: 125 additions & 72 deletions tests/PHPStan/Rules/Generics/MethodSignatureVarianceRuleTest.php
Expand Up @@ -22,148 +22,201 @@ public function testRule(): void
{
$this->analyse([__DIR__ . '/data/method-signature-variance.php'], [
[
'Template type K is declared as contravariant, but occurs in covariant position in parameter b of method MethodSignatureVariance\B::a().',
94,
'Template type T is declared as covariant, but occurs in contravariant position in parameter a of method MethodSignatureVariance\C::a().',
25,
],
[
'Template type K is declared as contravariant, but occurs in covariant position in parameter d of method MethodSignatureVariance\B::a().',
94,
'Template type T is declared as covariant, but occurs in invariant position in parameter b of method MethodSignatureVariance\C::a().',
25,
],
[
'Template type K is declared as contravariant, but occurs in invariant position in parameter e of method MethodSignatureVariance\B::a().',
94,
'Template type T is declared as covariant, but occurs in contravariant position in parameter c of method MethodSignatureVariance\C::a().',
25,
],
[
'Template type K is declared as contravariant, but occurs in covariant position in parameter h of method MethodSignatureVariance\B::a().',
94,
'Template type W is declared as covariant, but occurs in contravariant position in parameter d of method MethodSignatureVariance\C::a().',
25,
],
[
'Template type K is declared as contravariant, but occurs in invariant position in parameter i of method MethodSignatureVariance\B::a().',
94,
'Variance annotation is only allowed for type parameters of classes and interfaces, but occurs in template type U in in method MethodSignatureVariance\C::b().',
35,
],
]);
}

public function testRuleInvariant(): void
{
$this->analyse([__DIR__ . '/data/method-signature-variance-invariant.php'], []);
}

public function testRuleContravariant(): void
{
$this->analyse([__DIR__ . '/data/method-signature-variance-contravariant.php'], [
[
'Template type K is declared as contravariant, but occurs in covariant position in parameter b of method MethodSignatureVarianceContravariant\A::a().',
38,
],
[
'Template type K is declared as contravariant, but occurs in covariant position in parameter d of method MethodSignatureVarianceContravariant\A::a().',
38,
],
[
'Template type K is declared as contravariant, but occurs in invariant position in parameter e of method MethodSignatureVarianceContravariant\A::a().',
38,
],
[
'Template type K is declared as contravariant, but occurs in invariant position in parameter f of method MethodSignatureVarianceContravariant\A::a().',
38,
],
[
'Template type K is declared as contravariant, but occurs in invariant position in parameter j of method MethodSignatureVariance\B::a().',
94,
'Template type K is declared as contravariant, but occurs in covariant position in parameter i of method MethodSignatureVarianceContravariant\A::a().',
38,
],
[
'Template type K is declared as contravariant, but occurs in invariant position in parameter k of method MethodSignatureVariance\B::a().',
94,
'Template type K is declared as contravariant, but occurs in invariant position in parameter j of method MethodSignatureVarianceContravariant\A::a().',
38,
],
[
'Template type K is declared as contravariant, but occurs in invariant position in parameter l of method MethodSignatureVariance\B::a().',
94,
'Template type K is declared as contravariant, but occurs in invariant position in parameter k of method MethodSignatureVarianceContravariant\A::a().',
38,
],
[
'Template type K is declared as contravariant, but occurs in covariant position in return type of method MethodSignatureVariance\B::a().',
94,
'Template type K is declared as contravariant, but occurs in invariant position in parameter l of method MethodSignatureVarianceContravariant\A::a().',
38,
],
[
'Template type K is declared as contravariant, but occurs in covariant position in return type of method MethodSignatureVariance\B::c().',
100,
'Template type K is declared as contravariant, but occurs in invariant position in parameter m of method MethodSignatureVarianceContravariant\A::a().',
38,
],
[
'Template type K is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVariance\B::e().',
106,
'Template type K is declared as contravariant, but occurs in invariant position in parameter n of method MethodSignatureVarianceContravariant\A::a().',
38,
],
[
'Template type K is declared as contravariant, but occurs in covariant position in return type of method MethodSignatureVariance\B::f().',
109,
'Template type K is declared as contravariant, but occurs in covariant position in return type of method MethodSignatureVarianceContravariant\A::a().',
38,
],
[
'Template type K is declared as contravariant, but occurs in covariant position in return type of method MethodSignatureVariance\B::g().',
112,
'Template type K is declared as contravariant, but occurs in covariant position in return type of method MethodSignatureVarianceContravariant\A::c().',
44,
],
[
'Template type K is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVariance\B::i().',
118,
'Template type K is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVarianceContravariant\A::e().',
50,
],
[
'Template type K is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVariance\B::j().',
121,
'Template type K is declared as contravariant, but occurs in covariant position in return type of method MethodSignatureVarianceContravariant\A::f().',
53,
],
[
'Template type K is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVariance\B::k().',
124,
'Template type K is declared as contravariant, but occurs in covariant position in return type of method MethodSignatureVarianceContravariant\A::g().',
56,
],
[
'Template type K is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVariance\B::l().',
127,
'Template type K is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVarianceContravariant\A::i().',
62,
],
[
'Template type K is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVarianceContravariant\A::j().',
65,
],
[
'Template type K is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVarianceContravariant\A::k().',
68,
],
[
'Template type K is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVarianceContravariant\A::l().',
71,
],
[
'Template type K is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVarianceContravariant\A::m().',
74,
],
]);
}

public function testRuleCovariant(): void
{
$this->analyse([__DIR__ . '/data/method-signature-variance-covariant.php'], [
[
'Template type K is declared as covariant, but occurs in contravariant position in parameter a of method MethodSignatureVarianceCovariant\A::a().',
38,
],
[
'Template type K is declared as contravariant, but occurs in invariant position in return type of method MethodSignatureVariance\B::m().',
130,
'Template type K is declared as covariant, but occurs in contravariant position in parameter c of method MethodSignatureVarianceCovariant\A::a().',
38,
],
[
'Template type K is declared as covariant, but occurs in contravariant position in parameter a of method MethodSignatureVariance\C::a().',
152,
'Template type K is declared as covariant, but occurs in invariant position in parameter e of method MethodSignatureVarianceCovariant\A::a().',
38,
],
[
'Template type K is declared as covariant, but occurs in contravariant position in parameter c of method MethodSignatureVariance\C::a().',
152,
'Template type K is declared as covariant, but occurs in invariant position in parameter f of method MethodSignatureVarianceCovariant\A::a().',
38,
],
[
'Template type K is declared as covariant, but occurs in invariant position in parameter e of method MethodSignatureVariance\C::a().',
152,
'Template type K is declared as covariant, but occurs in contravariant position in parameter g of method MethodSignatureVarianceCovariant\A::a().',
38,
],
[
'Template type K is declared as covariant, but occurs in contravariant position in parameter f of method MethodSignatureVariance\C::a().',
152,
'Template type K is declared as covariant, but occurs in contravariant position in parameter h of method MethodSignatureVarianceCovariant\A::a().',
38,
],
[
'Template type K is declared as covariant, but occurs in contravariant position in parameter g of method MethodSignatureVariance\C::a().',
152,
'Template type K is declared as covariant, but occurs in invariant position in parameter j of method MethodSignatureVarianceCovariant\A::a().',
38,
],
[
'Template type K is declared as covariant, but occurs in invariant position in parameter i of method MethodSignatureVariance\C::a().',
152,
'Template type K is declared as covariant, but occurs in invariant position in parameter k of method MethodSignatureVarianceCovariant\A::a().',
38,
],
[
'Template type K is declared as covariant, but occurs in invariant position in parameter j of method MethodSignatureVariance\C::a().',
152,
'Template type K is declared as covariant, but occurs in invariant position in parameter l of method MethodSignatureVarianceCovariant\A::a().',
38,
],
[
'Template type K is declared as covariant, but occurs in invariant position in parameter k of method MethodSignatureVariance\C::a().',
152,
'Template type K is declared as covariant, but occurs in invariant position in parameter m of method MethodSignatureVarianceCovariant\A::a().',
38,
],
[
'Template type K is declared as covariant, but occurs in invariant position in parameter l of method MethodSignatureVariance\C::a().',
152,
'Template type K is declared as covariant, but occurs in invariant position in parameter n of method MethodSignatureVarianceCovariant\A::a().',
38,
],
[
'Template type K is declared as covariant, but occurs in contravariant position in return type of method MethodSignatureVariance\C::b().',
155,
'Template type K is declared as covariant, but occurs in contravariant position in return type of method MethodSignatureVarianceCovariant\A::b().',
41,
],
[
'Template type K is declared as covariant, but occurs in contravariant position in return type of method MethodSignatureVariance\C::d().',
161,
'Template type K is declared as covariant, but occurs in contravariant position in return type of method MethodSignatureVarianceCovariant\A::d().',
47,
],
[
'Template type K is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVariance\C::e().',
164,
'Template type K is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVarianceCovariant\A::e().',
50,
],
[
'Template type K is declared as covariant, but occurs in contravariant position in return type of method MethodSignatureVariance\C::h().',
173,
'Template type K is declared as covariant, but occurs in contravariant position in return type of method MethodSignatureVarianceCovariant\A::h().',
59,
],
[
'Template type K is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVariance\C::i().',
176,
'Template type K is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVarianceCovariant\A::i().',
62,
],
[
'Template type K is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVariance\C::j().',
179,
'Template type K is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVarianceCovariant\A::j().',
65,
],
[
'Template type K is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVariance\C::k().',
182,
'Template type K is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVarianceCovariant\A::k().',
68,
],
[
'Template type K is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVariance\C::l().',
185,
'Template type K is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVarianceCovariant\A::l().',
71,
],
[
'Template type K is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVariance\C::m().',
188,
'Template type K is declared as covariant, but occurs in invariant position in return type of method MethodSignatureVarianceCovariant\A::m().',
74,
],
]);
}
Expand Down
@@ -0,0 +1,75 @@
<?php

namespace MethodSignatureVarianceContravariant;

/** @template-contravariant T */
interface In {
}

/** @template-covariant T */
interface Out {
}

/** @template T */
interface Invariant {
}

/**
* @template-contravariant K
*/
class A {
/**
* @param K $a
* @param In<K> $b
* @param In<In<K>> $c
* @param In<Out<K>> $d
* @param In<Out<Invariant<K>>> $e
* @param In<Invariant<In<K>>> $f
* @param Out<K> $g
* @param Out<Out<K>> $h
* @param Out<In<K>> $i
* @param Out<In<Invariant<K>>> $j
* @param Out<Invariant<Out<K>>> $k
* @param Invariant<K> $l
* @param Invariant<Invariant<K>> $m
* @param Invariant<Out<In<K>>> $n
* @return K
*/
function a($a, $b, $c, $d, $e, $f, $g, $h, $i, $j, $k, $l, $m, $n) {}

/** @return In<K> */
function b() {}

/** @return In<In<K>> */
function c() {}

/** @return In<Out<K>> */
function d() {}

/** @return In<Out<Invariant<K>>> */
function e() {}

/** @return Out<K> */
function f() {}

/** @return Out<Out<K>> */
function g() {}

/** @return Out<In<K>> */
function h() {}

/** @return Out<In<Invariant<K>>> */
function i() {}

/** @return Invariant<K> */
function j() {}

/** @return Invariant<Invariant<K>> */
function k() {}

/** @return Invariant<In<Out<K>>> */
function l() {}

/** @return Invariant<Out<In<K>>> */
function m() {}
}

0 comments on commit 200158e

Please sign in to comment.