Skip to content

Commit 817c6bf

Browse files
committed
Fix appliesTo() logic for trait rules - traits can use traits
Following the pattern from PR #561, fix the appliesTo() logic: - Traits CAN use other traits in PHP - Only interfaces cannot use traits - Both HaveTrait and NotHaveTrait now apply to traits (consistent logic) Changes: - Update appliesTo() to only exclude interfaces - Update evaluate() to only skip interfaces - Update tests to verify traits are properly evaluated - Add tests for traits using/not using other traits This ensures the rules work correctly for all PHP class types.
1 parent 416fd45 commit 817c6bf

File tree

4 files changed

+46
-10
lines changed

4 files changed

+46
-10
lines changed

src/Expression/ForClasses/HaveTrait.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@ public function describe(ClassDescription $theClass, string $because): Descripti
2727

2828
public function appliesTo(ClassDescription $theClass): bool
2929
{
30-
return !($theClass->isInterface() || $theClass->isTrait());
30+
return !$theClass->isInterface();
3131
}
3232

3333
public function evaluate(ClassDescription $theClass, Violations $violations, string $because): void
3434
{
35-
if ($theClass->isInterface() || $theClass->isTrait()) {
35+
if ($theClass->isInterface()) {
3636
return;
3737
}
3838

src/Expression/ForClasses/NotHaveTrait.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ public function describe(ClassDescription $theClass, string $because): Descripti
2929

3030
public function appliesTo(ClassDescription $theClass): bool
3131
{
32-
return !($theClass->isInterface() || $theClass->isTrait());
32+
return !$theClass->isInterface();
3333
}
3434

3535
public function evaluate(ClassDescription $theClass, Violations $violations, string $because): void
3636
{
37-
if ($theClass->isInterface() || $theClass->isTrait()) {
37+
if ($theClass->isInterface()) {
3838
return;
3939
}
4040

tests/Unit/Expressions/ForClasses/HaveTraitTest.php

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public function test_it_should_return_no_violation_if_is_an_interface(): void
8686
self::assertEquals(0, $violations->count());
8787
}
8888

89-
public function test_it_should_return_no_violation_if_is_a_trait(): void
89+
public function test_it_should_return_violation_if_trait_does_not_use_required_trait(): void
9090
{
9191
$expression = new HaveTrait('MyTrait');
9292

@@ -100,6 +100,24 @@ public function test_it_should_return_no_violation_if_is_a_trait(): void
100100
$violations = new Violations();
101101
$expression->evaluate($classDescription, $violations, $because);
102102

103+
self::assertEquals(1, $violations->count());
104+
}
105+
106+
public function test_it_should_return_no_violation_if_trait_uses_required_trait(): void
107+
{
108+
$expression = new HaveTrait('MyTrait');
109+
110+
$classDescription = (new ClassDescriptionBuilder())
111+
->setFilePath('src/Foo.php')
112+
->setClassName('HappyIsland')
113+
->setTrait(true)
114+
->addTrait('MyTrait', 1)
115+
->build();
116+
117+
$because = 'we want to add this rule for our software';
118+
$violations = new Violations();
119+
$expression->evaluate($classDescription, $violations, $because);
120+
103121
self::assertEquals(0, $violations->count());
104122
}
105123

@@ -128,7 +146,7 @@ public function test_applies_to_should_return_false_for_interfaces(): void
128146
self::assertFalse($expression->appliesTo($classDescription));
129147
}
130148

131-
public function test_applies_to_should_return_false_for_traits(): void
149+
public function test_applies_to_should_return_true_for_traits(): void
132150
{
133151
$expression = new HaveTrait('MyTrait');
134152

@@ -138,6 +156,6 @@ public function test_applies_to_should_return_false_for_traits(): void
138156
->setTrait(true)
139157
->build();
140158

141-
self::assertFalse($expression->appliesTo($classDescription));
159+
self::assertTrue($expression->appliesTo($classDescription));
142160
}
143161
}

tests/Unit/Expressions/ForClasses/NotHaveTraitTest.php

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public function test_it_should_return_no_violation_if_is_an_interface(): void
8484
self::assertEquals(0, $violations->count());
8585
}
8686

87-
public function test_it_should_return_no_violation_if_is_a_trait(): void
87+
public function test_it_should_return_no_violation_if_trait_does_not_use_prohibited_trait(): void
8888
{
8989
$traitConstraint = new NotHaveTrait('MyTrait');
9090

@@ -101,6 +101,24 @@ public function test_it_should_return_no_violation_if_is_a_trait(): void
101101
self::assertEquals(0, $violations->count());
102102
}
103103

104+
public function test_it_should_return_violation_if_trait_uses_prohibited_trait(): void
105+
{
106+
$traitConstraint = new NotHaveTrait('MyTrait');
107+
108+
$classDescription = (new ClassDescriptionBuilder())
109+
->setFilePath('src/Foo.php')
110+
->setClassName('HappyIsland')
111+
->setTrait(true)
112+
->addTrait('MyTrait', 1)
113+
->build();
114+
115+
$because = 'we want to add this rule for our software';
116+
$violations = new Violations();
117+
$traitConstraint->evaluate($classDescription, $violations, $because);
118+
119+
self::assertEquals(1, $violations->count());
120+
}
121+
104122
public function test_applies_to_should_return_true_for_regular_classes(): void
105123
{
106124
$traitConstraint = new NotHaveTrait('MyTrait');
@@ -126,7 +144,7 @@ public function test_applies_to_should_return_false_for_interfaces(): void
126144
self::assertFalse($traitConstraint->appliesTo($classDescription));
127145
}
128146

129-
public function test_applies_to_should_return_false_for_traits(): void
147+
public function test_applies_to_should_return_true_for_traits(): void
130148
{
131149
$traitConstraint = new NotHaveTrait('MyTrait');
132150

@@ -136,6 +154,6 @@ public function test_applies_to_should_return_false_for_traits(): void
136154
->setTrait(true)
137155
->build();
138156

139-
self::assertFalse($traitConstraint->appliesTo($classDescription));
157+
self::assertTrue($traitConstraint->appliesTo($classDescription));
140158
}
141159
}

0 commit comments

Comments
 (0)