Skip to content

Commit f1af32f

Browse files
committed
added source line to the assertion failure for better navigation
1 parent b8316b8 commit f1af32f

22 files changed

Lines changed: 323 additions & 20 deletions

docs/guide/src/docs/asciidoc/index.adoc

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,27 @@ include::{root-dir}/libs/expectations/src/test/java/builders/dsl/expectations/Ex
8686
<1> Annotate method with `@Test`
8787
<2> Use `evaluate()` method to execute all the assertions
8888

89+
== Source Location Tracking
90+
91+
When your tests fail, Expectations DSL Builder automatically includes source location information in the error messages to help you quickly identify where the failing test data was defined in your code.
92+
93+
[TIP]
94+
====
95+
**Enhanced Error Messages**: When a test fails, the error message will show:
96+
97+
* The template name and values that failed
98+
* The exact source location `(FileName.java:lineNumber)` where the failing data row was created using `is()`, `are()`, or `and()` methods
99+
100+
This makes debugging much easier, especially when you have many data rows or complex test setups.
101+
102+
Example error message:
103+
```
104+
Verification failed for 2 + 3 = 5 with values a=2, b=3, c=6 (ExpectationsTest.java:194)
105+
```
106+
107+
The `(ExpectationsTest.java:194)` part shows exactly which line in your test file created the failing data row.
108+
====
109+
89110
== Using More Dynamic Parameters
90111

91112
You can also define the parameter values using `Stream` or `Iterable` objects. In that case the given method will alter header and `Stream` or `Iterable` to define the data rows.

libs/expectations/src/main/java/builders/dsl/expectations/dsl/DataTable1.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,17 @@ Stream<DynamicTest> generateTests(String template, Assertion1<A> verification) {
8686
return DynamicTest.dynamicTest(
8787
title,
8888
() -> {
89-
if (!verification.verify(row.getA())) {
90-
throw new AssertionFailedError("Verification failed for " + title + " with values " + headers.getA() + "=" + row.getA());
89+
boolean verified = false;
90+
Throwable throwable = null;
91+
92+
try {
93+
verified = verification.verify(row.getA());
94+
} catch (Throwable e) {
95+
throwable = e;
96+
}
97+
98+
if (!verified) {
99+
throw new AssertionFailedError("Verification failed for " + title + " with values " + headers.getA() + "=" + row.getA() + " " + row.getLocation(), throwable);
91100
}
92101
}
93102
);

libs/expectations/src/main/java/builders/dsl/expectations/dsl/DataTable10.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,17 @@ Stream<DynamicTest> generateTests(String template, Assertion10<A, B, C, D, E, F,
115115
return DynamicTest.dynamicTest(
116116
finalTitle,
117117
() -> {
118-
if (!verification.verify(row.getA(), row.getB(), row.getC(), row.getD(), row.getE(), row.getF(), row.getG(), row.getH(), row.getI(), row.getJ())) {
119-
throw new AssertionFailedError("Verification failed for " + finalTitle + " with values " + headers.getA() + "=" + row.getA() + ", " + headers.getB() + "=" + row.getB() + ", " + headers.getC() + "=" + row.getC() + ", " + headers.getD() + "=" + row.getD() + ", " + headers.getE() + "=" + row.getE() + ", " + headers.getF() + "=" + row.getF() + ", " + headers.getG() + "=" + row.getG() + ", " + headers.getH() + "=" + row.getH() + ", " + headers.getI() + "=" + row.getI() + ", " + headers.getJ() + "=" + row.getJ());
118+
boolean verified = false;
119+
Throwable throwable = null;
120+
121+
try {
122+
verified = verification.verify(row.getA(), row.getB(), row.getC(), row.getD(), row.getE(), row.getF(), row.getG(), row.getH(), row.getI(), row.getJ());
123+
} catch (Throwable e) {
124+
throwable = e;
125+
}
126+
127+
if (!verified) {
128+
throw new AssertionFailedError("Verification failed for " + finalTitle + " with values " + headers.getA() + "=" + row.getA() + ", " + headers.getB() + "=" + row.getB() + ", " + headers.getC() + "=" + row.getC() + ", " + headers.getD() + "=" + row.getD() + ", " + headers.getE() + "=" + row.getE() + ", " + headers.getF() + "=" + row.getF() + ", " + headers.getG() + "=" + row.getG() + ", " + headers.getH() + "=" + row.getH() + ", " + headers.getI() + "=" + row.getI() + ", " + headers.getJ() + "=" + row.getJ() + " " + row.getLocation(), throwable);
120129
}
121130
});
122131
});

libs/expectations/src/main/java/builders/dsl/expectations/dsl/DataTable2.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,17 @@ Stream<DynamicTest> generateTests(String template, Assertion2<A, B> verification
8686
return DynamicTest.dynamicTest(
8787
finalTitle,
8888
() -> {
89-
if (!verification.verify(row.getA(), row.getB())) {
90-
throw new AssertionFailedError("Verification failed for " + finalTitle + " with values " + headers.getA() + "=" + row.getA() + ", " + headers.getB() + "=" + row.getB());
89+
boolean verified = false;
90+
Throwable throwable = null;
91+
92+
try {
93+
verified = verification.verify(row.getA(), row.getB());
94+
} catch (Throwable e) {
95+
throwable = e;
96+
}
97+
98+
if (!verified) {
99+
throw new AssertionFailedError("Verification failed for " + finalTitle + " with values " + headers.getA() + "=" + row.getA() + ", " + headers.getB() + "=" + row.getB() + " " + row.getLocation(), throwable);
91100
}
92101
}
93102
);

libs/expectations/src/main/java/builders/dsl/expectations/dsl/DataTable3.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,17 @@ Stream<DynamicTest> generateTests(String template, Assertion3<A, B, C> verificat
9090
return DynamicTest.dynamicTest(
9191
finalTitle,
9292
() -> {
93-
if (!verification.verify(row.getA(), row.getB(), row.getC())) {
94-
throw new AssertionFailedError("Verification failed for " + finalTitle + " with values " + headers.getA() + "=" + row.getA() + ", " + headers.getB() + "=" + row.getB() + ", " + headers.getC() + "=" + row.getC());
93+
boolean verified = false;
94+
Throwable throwable = null;
95+
96+
try {
97+
verified = verification.verify(row.getA(), row.getB(), row.getC());
98+
} catch (Throwable e) {
99+
throwable = e;
100+
}
101+
102+
if (!verified) {
103+
throw new AssertionFailedError("Verification failed for " + finalTitle + " with values " + headers.getA() + "=" + row.getA() + ", " + headers.getB() + "=" + row.getB() + ", " + headers.getC() + "=" + row.getC() + " " + row.getLocation(), throwable);
95104
}
96105
}
97106
);

libs/expectations/src/main/java/builders/dsl/expectations/dsl/DataTable4.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,17 @@ Stream<DynamicTest> generateTests(String template, Assertion4<A, B, C, D> verifi
9797
return DynamicTest.dynamicTest(
9898
finalTitle,
9999
() -> {
100-
if (!verification.verify(row.getA(), row.getB(), row.getC(), row.getD())) {
101-
throw new AssertionFailedError("Verification failed for " + finalTitle + " with values " + headers.getA() + "=" + row.getA() + ", " + headers.getB() + "=" + row.getB() + ", " + headers.getC() + "=" + row.getC() + ", " + headers.getD() + "=" + row.getD());
100+
boolean verified = false;
101+
Throwable throwable = null;
102+
103+
try {
104+
verified = verification.verify(row.getA(), row.getB(), row.getC(), row.getD());
105+
} catch (Throwable e) {
106+
throwable = e;
107+
}
108+
109+
if (!verified) {
110+
throw new AssertionFailedError("Verification failed for " + finalTitle + " with values " + headers.getA() + "=" + row.getA() + ", " + headers.getB() + "=" + row.getB() + ", " + headers.getC() + "=" + row.getC() + ", " + headers.getD() + "=" + row.getD() + " " + row.getLocation(), throwable);
102111
}
103112
}
104113
);

libs/expectations/src/main/java/builders/dsl/expectations/dsl/DataTable5.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,17 @@ Stream<DynamicTest> generateTests(String template, Assertion5<A, B, C, D, E> ver
100100
return DynamicTest.dynamicTest(
101101
finalTitle,
102102
() -> {
103-
if (!verification.verify(row.getA(), row.getB(), row.getC(), row.getD(), row.getE())) {
104-
throw new AssertionFailedError("Verification failed for " + finalTitle + " with values " + headers.getA() + "=" + row.getA() + ", " + headers.getB() + "=" + row.getB() + ", " + headers.getC() + "=" + row.getC() + ", " + headers.getD() + "=" + row.getD() + ", " + headers.getE() + "=" + row.getE());
103+
boolean verified = false;
104+
Throwable throwable = null;
105105

106+
try {
107+
verified = verification.verify(row.getA(), row.getB(), row.getC(), row.getD(), row.getE());
108+
} catch (Throwable e) {
109+
throwable = e;
110+
}
111+
112+
if (!verified) {
113+
throw new AssertionFailedError("Verification failed for " + finalTitle + " with values " + headers.getA() + "=" + row.getA() + ", " + headers.getB() + "=" + row.getB() + ", " + headers.getC() + "=" + row.getC() + ", " + headers.getD() + "=" + row.getD() + ", " + headers.getE() + "=" + row.getE() + " " + row.getLocation(), throwable);
106114
}
107115
});
108116
});

libs/expectations/src/main/java/builders/dsl/expectations/dsl/DataTable6.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,17 @@ Stream<DynamicTest> generateTests(String template, Assertion6<A, B, C, D, E, F>
103103
return DynamicTest.dynamicTest(
104104
finalTitle,
105105
() -> {
106-
if (!verification.verify(row.getA(), row.getB(), row.getC(), row.getD(), row.getE(), row.getF())) {
107-
throw new AssertionFailedError("Verification failed for " + finalTitle + " with values " + headers.getA() + "=" + row.getA() + ", " + headers.getB() + "=" + row.getB() + ", " + headers.getC() + "=" + row.getC() + ", " + headers.getD() + "=" + row.getD() + ", " + headers.getE() + "=" + row.getE() + ", " + headers.getF() + "=" + row.getF());
106+
boolean verified = false;
107+
Throwable throwable = null;
108+
109+
try {
110+
verified = verification.verify(row.getA(), row.getB(), row.getC(), row.getD(), row.getE(), row.getF());
111+
} catch (Throwable e) {
112+
throwable = e;
113+
}
114+
115+
if (!verified) {
116+
throw new AssertionFailedError("Verification failed for " + finalTitle + " with values " + headers.getA() + "=" + row.getA() + ", " + headers.getB() + "=" + row.getB() + ", " + headers.getC() + "=" + row.getC() + ", " + headers.getD() + "=" + row.getD() + ", " + headers.getE() + "=" + row.getE() + ", " + headers.getF() + "=" + row.getF() + " " + row.getLocation(), throwable);
108117
}
109118
});
110119
});

libs/expectations/src/main/java/builders/dsl/expectations/dsl/DataTable7.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,17 @@ Stream<DynamicTest> generateTests(String template, Assertion7<A, B, C, D, E, F,
101101
return DynamicTest.dynamicTest(
102102
finalTitle,
103103
() -> {
104-
if (!verification.verify(row.getA(), row.getB(), row.getC(), row.getD(), row.getE(), row.getF(), row.getG())) {
105-
throw new AssertionFailedError("Verification failed for " + finalTitle + " with values " + headers.getA() + "=" + row.getA() + ", " + headers.getB() + "=" + row.getB() + ", " + headers.getC() + "=" + row.getC() + ", " + headers.getD() + "=" + row.getD() + ", " + headers.getE() + "=" + row.getE() + ", " + headers.getF() + "=" + row.getF() + ", " + headers.getG() + "=" + row.getG());
104+
boolean verified = false;
105+
Throwable throwable = null;
106+
107+
try {
108+
verified = verification.verify(row.getA(), row.getB(), row.getC(), row.getD(), row.getE(), row.getF(), row.getG());
109+
} catch (Throwable e) {
110+
throwable = e;
111+
}
112+
113+
if (!verified) {
114+
throw new AssertionFailedError("Verification failed for " + finalTitle + " with values " + headers.getA() + "=" + row.getA() + ", " + headers.getB() + "=" + row.getB() + ", " + headers.getC() + "=" + row.getC() + ", " + headers.getD() + "=" + row.getD() + ", " + headers.getE() + "=" + row.getE() + ", " + headers.getF() + "=" + row.getF() + ", " + headers.getG() + "=" + row.getG() + " " + row.getLocation(), throwable);
106115
}
107116
});
108117
});

libs/expectations/src/main/java/builders/dsl/expectations/dsl/DataTable8.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,17 @@ Stream<DynamicTest> generateTests(String template, Assertion8<A, B, C, D, E, F,
104104
return DynamicTest.dynamicTest(
105105
finalTitle,
106106
() -> {
107-
if (!verification.verify(row.getA(), row.getB(), row.getC(), row.getD(), row.getE(), row.getF(), row.getG(), row.getH())) {
108-
throw new AssertionFailedError("Verification failed for " + finalTitle + " with values " + headers.getA() + "=" + row.getA() + ", " + headers.getB() + "=" + row.getB() + ", " + headers.getC() + "=" + row.getC() + ", " + headers.getD() + "=" + row.getD() + ", " + headers.getE() + "=" + row.getE() + ", " + headers.getF() + "=" + row.getF() + ", " + headers.getG() + "=" + row.getG() + ", " + headers.getH() + "=" + row.getH());
107+
boolean verified = false;
108+
Throwable throwable = null;
109+
110+
try {
111+
verified = verification.verify(row.getA(), row.getB(), row.getC(), row.getD(), row.getE(), row.getF(), row.getG(), row.getH());
112+
} catch (Throwable e) {
113+
throwable = e;
114+
}
115+
116+
if (!verified) {
117+
throw new AssertionFailedError("Verification failed for " + finalTitle + " with values " + headers.getA() + "=" + row.getA() + ", " + headers.getB() + "=" + row.getB() + ", " + headers.getC() + "=" + row.getC() + ", " + headers.getD() + "=" + row.getD() + ", " + headers.getE() + "=" + row.getE() + ", " + headers.getF() + "=" + row.getF() + ", " + headers.getG() + "=" + row.getG() + ", " + headers.getH() + "=" + row.getH() + " " + row.getLocation(), throwable);
109118
}
110119
});
111120
});

0 commit comments

Comments
 (0)