Give a bit better error messages in tests

This commit is contained in:
Sobuno
2025-01-02 22:40:50 +01:00
parent ebd30f4861
commit 2ae3929dd6
2 changed files with 42 additions and 40 deletions

View File

@@ -33,6 +33,6 @@ class Subquery extends Node
public function __toString(): string public function __toString(): string
{ {
return ($this->prohibited ? '-' : '') . '(' . implode(' ', array_map(fn($node) => (string)$node, $this->nodes)) . ')'; return ($this->prohibited ? '-' : '') . '[' . implode(' ', array_map(fn($node) => (string)$node, $this->nodes)) . ']';
} }
} }

View File

@@ -23,7 +23,7 @@ abstract class AbstractQueryParserInterfaceParseQueryTest extends TestCase
'expected' => [] 'expected' => []
], ],
'simple word' => [ 'simple word' => [
'query' => 'grocaeries', 'query' => 'groceries',
'expected' => [new Word('groceries')] 'expected' => [new Word('groceries')]
], ],
'prohibited word' => [ 'prohibited word' => [
@@ -196,7 +196,13 @@ abstract class AbstractQueryParserInterfaceParseQueryTest extends TestCase
private function assertNodesMatch(array $expected, array $actual): void private function assertNodesMatch(array $expected, array $actual): void
{ {
$this->assertCount(count($expected), $actual); $message = sprintf(
"Expected: %s\nActual: %s",
$this->formatNodes($expected),
$this->formatNodes($actual)
);
$this->assertCount(count($expected), $actual, $message);
foreach ($expected as $index => $expectedNode) { foreach ($expected as $index => $expectedNode) {
$actualNode = $actual[$index]; $actualNode = $actual[$index];
@@ -206,8 +212,10 @@ abstract class AbstractQueryParserInterfaceParseQueryTest extends TestCase
private function assertNodeMatches(Node $expected, Node $actual): void private function assertNodeMatches(Node $expected, Node $actual): void
{ {
$this->assertInstanceOf(get_class($expected), $actual); $message = $this->formatAssertMessage($expected, $actual);
$this->assertEquals($expected->isProhibited(), $actual->isProhibited());
$this->assertInstanceOf(get_class($expected), $actual, $message);
$this->assertEquals($expected->isProhibited(), $actual->isProhibited(), $message);
match (get_class($expected)) { match (get_class($expected)) {
Word::class => $this->assertWordMatches($expected, $actual), Word::class => $this->assertWordMatches($expected, $actual),
@@ -220,15 +228,22 @@ abstract class AbstractQueryParserInterfaceParseQueryTest extends TestCase
}; };
} }
private function assertWordMatches(Word $expected, Word $actual): void private function assertWordMatches(Word $expected, Word $actual): void
{ {
$this->assertEquals($expected->getValue(), $actual->getValue()); $message = $this->formatAssertMessage($expected, $actual); // Using your implementation
$this->assertEquals($expected->getValue(), $actual->getValue(), $message);
} }
private function assertFieldMatches(Field $expected, Field $actual): void private function assertFieldMatches(Field $expected, Field $actual): void
{ {
$this->assertEquals($expected->getOperator(), $actual->getOperator()); $message = sprintf(
$this->assertEquals($expected->getValue(), $actual->getValue()); "\nExpected field: %s\nActual field: %s",
$this->formatNode($expected),
$this->formatNode($actual)
);
$this->assertEquals($expected->getOperator(), $actual->getOperator(), $message);
$this->assertEquals($expected->getValue(), $actual->getValue(), $message);
} }
private function assertSubqueryMatches(Subquery $expected, Subquery $actual): void private function assertSubqueryMatches(Subquery $expected, Subquery $actual): void
@@ -236,43 +251,30 @@ abstract class AbstractQueryParserInterfaceParseQueryTest extends TestCase
$this->assertNodesMatch($expected->getNodes(), $actual->getNodes()); $this->assertNodesMatch($expected->getNodes(), $actual->getNodes());
} }
private function assertIsWord(Node $node, string $expectedValue, bool $prohibited = false): void private function formatAssertMessage(Node $expected, Node $actual): string
{ {
$this->assertInstanceOf(Word::class, $node); return sprintf(
/** @var Word $node */ "\nExpected: %s\nActual: %s",
$this->assertEquals($expectedValue, $node->getValue()); $this->formatNode($expected),
$this->assertEquals($prohibited, $node->isProhibited()); $this->formatNode($actual)
);
} }
private function assertIsField( private function formatNode(Node $node): string
Node $node,
string $expectedOperator,
string $expectedValue,
bool $prohibited = false
): void {
$this->assertInstanceOf(Field::class, $node);
/** @var Field $node */
$this->assertEquals($expectedOperator, $node->getOperator());
$this->assertEquals($expectedValue, $node->getValue());
$this->assertEquals($prohibited, $node->isProhibited());
}
private function assertIsSubquery(Node $node, array $expectedNodes, bool $prohibited = false): void
{ {
$this->assertInstanceOf(Subquery::class, $node); return sprintf(
/** @var Subquery $node */ '%s(%s)',
$this->assertCount(count($expectedNodes), $node->getNodes()); basename(str_replace('\\', '/', get_class($node))),
$this->assertEquals($prohibited, $node->isProhibited()); $node->__toString()
);
}
foreach ($expectedNodes as $index => $expected) {
$actual = $node->getNodes()[$index]; private function formatNodes(array $nodes): string
if ($expected instanceof Word) { {
$this->assertIsWord($actual, $expected->getValue(), $expected->isProhibited()); return '[' . implode(', ', array_map(
} elseif ($expected instanceof Field) { fn(Node $node) => $this->formatNode($node),
$this->assertIsField($actual, $expected->getOperator(), $expected->getValue(), $expected->isProhibited()); $nodes
} elseif ($expected instanceof Subquery) { )) . ']';
$this->assertIsSubquery($actual, $expected->getNodes(), $expected->isProhibited());
}
}
} }
} }