Skip to content

[TASK] Add unit tests for RuleSet::setRules #1276

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 13, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
160 changes: 153 additions & 7 deletions tests/Unit/RuleSet/RuleSetTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public function implementsRuleContainer(): void
/**
* @return array<string, array{0: list<non-empty-string>}>
*/
public static function providePropertyNamesToBeSetInitially(): array
public static function providePropertyNames(): array
{
return [
'no properties' => [[]],
Expand All @@ -81,7 +81,7 @@ public static function provideAnotherPropertyName(): array
*/
public static function provideInitialPropertyNamesAndAnotherPropertyName(): DataProvider
{
return DataProvider::cross(self::providePropertyNamesToBeSetInitially(), self::provideAnotherPropertyName());
return DataProvider::cross(self::providePropertyNames(), self::provideAnotherPropertyName());
}

/**
Expand Down Expand Up @@ -313,7 +313,7 @@ public function addRuleWithCompletePositionWithoutSiblingPreservesPosition(
*/
public static function provideInitialPropertyNamesAndIndexOfOne(): array
{
$initialPropertyNamesSets = self::providePropertyNamesToBeSetInitially();
$initialPropertyNamesSets = self::providePropertyNames();

// Provide sets with each possible index for the initially set `Rule`s.
$initialPropertyNamesAndIndexSets = [];
Expand Down Expand Up @@ -719,7 +719,7 @@ public function removeMatchingRulesWithPropertyNamePrefixKeepsOtherRules(
*
* @param list<string> $propertyNamesToRemove
*
* @dataProvider providePropertyNamesToBeSetInitially
* @dataProvider providePropertyNames
*/
public function removeAllRulesRemovesAllRules(array $propertyNamesToRemove): void
{
Expand All @@ -730,16 +730,162 @@ public function removeAllRulesRemovesAllRules(array $propertyNamesToRemove): voi
self::assertSame([], $this->subject->getRules());
}

/**
* @test
*
* @param list<string> $propertyNamesToSet
*
* @dataProvider providePropertyNames
*/
public function setRulesOnVirginSetsRulesWithoutPositionInOrder(array $propertyNamesToSet): void
{
$rulesToSet = self::createRulesFromPropertyNames($propertyNamesToSet);

$this->subject->setRules($rulesToSet);

self::assertSame($rulesToSet, $this->subject->getRules());
}

/**
* @return DataProvider<string, array{0: list<string>, 1: list<string>}>
*/
public static function provideInitialPropertyNamesAndPropertyNamesToSet(): DataProvider
{
return DataProvider::cross(self::providePropertyNames(), self::providePropertyNames());
}

/**
* @test
*
* @param list<string> $initialPropertyNames
* @param list<string> $propertyNamesToSet
*
* @dataProvider provideInitialPropertyNamesAndPropertyNamesToSet
*/
public function setRulesReplacesRules(array $initialPropertyNames, array $propertyNamesToSet): void
{
$rulesToSet = self::createRulesFromPropertyNames($propertyNamesToSet);
$this->setRulesFromPropertyNames($initialPropertyNames);

$this->subject->setRules($rulesToSet);

self::assertSame($rulesToSet, $this->subject->getRules());
}

/**
* @test
*/
public function setRulesWithRuleWithoutPositionSetsValidLineNumber(): void
{
$ruleToSet = new Rule('color');

$this->subject->setRules([$ruleToSet]);

self::assertIsInt($ruleToSet->getLineNumber(), 'line number not set');
self::assertGreaterThanOrEqual(1, $ruleToSet->getLineNumber(), 'line number not valid');
}

/**
* @test
*/
public function setRulesWithRuleWithoutPositionSetsValidColumnNumber(): void
{
$ruleToSet = new Rule('color');

$this->subject->setRules([$ruleToSet]);

self::assertIsInt($ruleToSet->getColumnNumber(), 'column number not set');
self::assertGreaterThanOrEqual(0, $ruleToSet->getColumnNumber(), 'column number not valid');
}

/**
* @test
*/
public function setRulesWithRuleWithOnlyLineNumberSetsColumnNumber(): void
{
$ruleToSet = new Rule('color');
$ruleToSet->setPosition(42);

$this->subject->setRules([$ruleToSet]);

self::assertIsInt($ruleToSet->getColumnNumber(), 'column number not set');
self::assertGreaterThanOrEqual(0, $ruleToSet->getColumnNumber(), 'column number not valid');
}

/**
* @test
*/
public function setRulesWithRuleWithOnlyLineNumberPreservesLineNumber(): void
{
$ruleToSet = new Rule('color');
$ruleToSet->setPosition(42);

$this->subject->setRules([$ruleToSet]);

self::assertSame(42, $ruleToSet->getLineNumber(), 'line number not preserved');
}

/**
* @test
*/
public function setRulesWithRuleWithOnlyColumnNumberSetsLineNumber(): void
{
$ruleToSet = new Rule('color');
$ruleToSet->setPosition(null, 42);

$this->subject->setRules([$ruleToSet]);

self::assertIsInt($ruleToSet->getLineNumber(), 'line number not set');
self::assertGreaterThanOrEqual(1, $ruleToSet->getLineNumber(), 'line number not valid');
}

/**
* @test
*/
public function setRulesWithRuleWithOnlyColumnNumberPreservesColumnNumber(): void
{
$ruleToSet = new Rule('color');
$ruleToSet->setPosition(null, 42);

$this->subject->setRules([$ruleToSet]);

self::assertSame(42, $ruleToSet->getColumnNumber(), 'column number not preserved');
}

/**
* @test
*/
public function setRulesWithRuleWithCompletePositionPreservesPosition(): void
{
$ruleToSet = new Rule('color');
$ruleToSet->setPosition(42, 64);

$this->subject->setRules([$ruleToSet]);

self::assertSame(42, $ruleToSet->getLineNumber(), 'line number not preserved');
self::assertSame(64, $ruleToSet->getColumnNumber(), 'column number not preserved');
}

/**
* @param list<string> $propertyNames
*/
private function setRulesFromPropertyNames(array $propertyNames): void
{
$this->subject->setRules(\array_map(
static function (string $propertyName): Rule {
$this->subject->setRules(self::createRulesFromPropertyNames($propertyNames));
}

/**
* @param list<string> $propertyNames
*
* @return list<Rule>
*/
private static function createRulesFromPropertyNames(array $propertyNames): array
{
return \array_map(
function (string $propertyName): Rule {
return new Rule($propertyName);
},
$propertyNames
));
);
}
}