diff --git a/src/Expectations/OppositeExpectation.php b/src/Expectations/OppositeExpectation.php index 22162b5a..4f99c89f 100644 --- a/src/Expectations/OppositeExpectation.php +++ b/src/Expectations/OppositeExpectation.php @@ -798,13 +798,11 @@ final readonly class OppositeExpectation $exporter = Exporter::default(); - $toString = fn (mixed $argument): string => $exporter->shortenedExport($argument); - throw new ExpectationFailedException(sprintf( 'Expecting %s not %s %s.', - $toString($this->original->value), + $exporter->shortenedExport($this->original->value), strtolower((string) preg_replace('/(? $toString($argument), $arguments)), + implode(' ', array_map(fn (mixed $argument): string => $exporter->export($argument), $arguments)), )); } diff --git a/src/Support/Exporter.php b/src/Support/Exporter.php index 44367c08..6fd89c53 100644 --- a/src/Support/Exporter.php +++ b/src/Support/Exporter.php @@ -86,4 +86,17 @@ final readonly class Exporter return (string) preg_replace(array_keys($map), array_values($map), $this->exporter->shortenedExport($value)); } + + /** + * Exports a value into a full single-line string without truncation. + */ + public function export(mixed $value): string + { + $map = [ + '#\\\n\s*#' => '', + '# Object \(\.{3}\)#' => '', + ]; + + return (string) preg_replace(array_keys($map), array_values($map), $this->exporter->export($value)); + } } diff --git a/tests/Unit/Expectations/OppositeExpectation.php b/tests/Unit/Expectations/OppositeExpectation.php index 448ebf6d..856a38e6 100644 --- a/tests/Unit/Expectations/OppositeExpectation.php +++ b/tests/Unit/Expectations/OppositeExpectation.php @@ -14,3 +14,17 @@ it('throw expectation failed exception with array argument', function (): void { $expectation->throwExpectationFailedException('toBe', ['bar']); })->throws(ExpectationFailedException::class, "Expecting 'foo' not to be 'bar'."); + +it('does not truncate long string arguments in error message', function (): void { + $expectation = new OppositeExpectation(expect('foo')); + + $longMessage = 'Very long error message. Very long error message. Very long error message.'; + + $expectation->throwExpectationFailedException('toBe', [$longMessage]); +})->throws(ExpectationFailedException::class, 'Very long error message. Very long error message. Very long error message.'); + +it('does not truncate custom error message when using not()', function (): void { + $longMessage = 'This is a very detailed custom error message that should not be truncated in the output.'; + + expect(true)->not()->toBeTrue($longMessage); +})->throws(ExpectationFailedException::class, 'This is a very detailed custom error message that should not be truncated in the output.');