Skip to content

Commit

Permalink
@ F detect when dynamic test fails to pass in the options
Browse files Browse the repository at this point in the history
  • Loading branch information
JayBazuzi committed Mar 10, 2025
1 parent db3dd86 commit e336b62
Show file tree
Hide file tree
Showing 10 changed files with 57 additions and 6 deletions.
15 changes: 15 additions & 0 deletions approvaltests/src/main/java/org/approvaltests/Approvals.java
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,21 @@ public static void verify(ApprovalWriter writer, ApprovalNamer namer)
}
public static void verify(ApprovalWriter writer, ApprovalNamer namer, Options options)
{
// if the namer is saw a dynamic attribute, check if the options has the additional information
if (namer instanceof StackTraceNamer)
{
StackTraceNamer stackTraceNamer = (StackTraceNamer) namer;
if (stackTraceNamer.isDynamic())
{
if (!options.hasAdditionalDynamicNamingInformation())
{
throw new FormattedException(
"The Namer %s is dynamic, but no additional information was provided in the options",
stackTraceNamer.getClass().getName());
}
}
}

verify(new FileApprover(writer, namer, options.getComparator()), options);
}
public static void verify(ApprovalWriter writer)
Expand Down
10 changes: 10 additions & 0 deletions approvaltests/src/main/java/org/approvaltests/core/Options.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,16 @@

public class Options
{
private boolean hasAdditionalDynamicNamingInformation = false;

public boolean hasAdditionalDynamicNamingInformation() {
return hasAdditionalDynamicNamingInformation;
}

public void setHasAdditionalDynamicNamingInformation(boolean hasAdditionalDynamicNamingInformation) {
this.hasAdditionalDynamicNamingInformation = hasAdditionalDynamicNamingInformation;
}

private enum Fields {
SCRUBBER, REPORTER, FILE_OPTIONS_FILE_EXTENSION, FILE_OPTIONS_NAMER, WRITER, COMPARATOR;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,12 @@ public ApprovalNamer addAdditionalInformation(String info)
{
return this;
}

@Override
public boolean isDynamic() {
return false;
}

@Override
public String getApprovalName()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,7 @@ public class JupiterApprovals
public static DynamicTest dynamicTest(String displayName, Action1<Options> action1)
{
Options options = Approvals.NAMES.withParameters(convertToLegalFileName(displayName));
return DynamicTest.dynamicTest(displayName, () -> {
action1.call(options);
});
return DynamicTest.dynamicTest(displayName, () -> action1.call(options));
}
public static String convertToLegalFileName(String uri)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,6 @@ public interface ApprovalNamer extends GetApprovalName, GetSourceFilePath
public File getApprovedFile(String extensionWithDot);
public File getReceivedFile(String extensionWithDot);
public ApprovalNamer addAdditionalInformation(String info);

public boolean isDynamic();
}
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ private static void checkConditionsForAttribute(Class<? extends Annotation> attr
}
}
}
private static boolean isDynamicWrapperPresent()
public static boolean isDynamicWrapperPresent()
{
StackTraceElement[] stackTrace = ThreadUtils.getStackTrace();
return Queryable.as(stackTrace)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,9 @@ public ApprovalNamer addAdditionalInformation(String info)
{
return new MasterDirectoryNamer(this.approvedFile, this.namer.addAdditionalInformation(info));
}

@Override
public boolean isDynamic() {
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -73,4 +73,9 @@ public ApprovalNamer addAdditionalInformation(String info)
return new NamerWrapper(((ApprovalNamer) approvalBaseName).addAdditionalInformation(info),
((ApprovalNamer) sourceFilePath).addAdditionalInformation(info));
}

@Override
public boolean isDynamic() {
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,12 @@ public class StackTraceNamer implements ApprovalNamer
{
private StackTraceReflectionResult info;
private String additionalInformation;
public boolean isDynamicWrapperPresent;
public StackTraceNamer()
{
info = TestUtils.getCurrentFileForMethod(new AttributeStackSelector());
AttributeStackSelector stackElementSelector = new AttributeStackSelector();
isDynamicWrapperPresent = stackElementSelector.isDynamicWrapperPresent();
info = TestUtils.getCurrentFileForMethod(stackElementSelector);
additionalInformation = NamerFactory.getAndClearAdditionalInformation();
}
public StackTraceNamer(StackTraceReflectionResult info, String additionalInformation)
Expand Down Expand Up @@ -62,6 +65,13 @@ public ApprovalNamer addAdditionalInformation(String additionalInformation)
{
return new StackTraceNamer(this.info, this.additionalInformation + "." + additionalInformation);
}

@Override
public boolean isDynamic() {
return isDynamicWrapperPresent;

}

public StackTraceReflectionResult getInfo()
{
return info;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ Collection<DynamicTest> testFactory2()
Collection<DynamicTest> testFactory3()
{
return Stream.of(1, 2).map(number -> JupiterApprovals.dynamicTest("test " + number,
o -> Approvals.verify("content for " + number, o))).collect(Collectors.toList());
o -> Approvals.verify("content for " + number))).collect(Collectors.toList());

Check failure on line 134 in approvaltests/src/test/java/org/approvaltests/namer/JUnit5StackTraceNamerTest.java

View workflow job for this annotation

GitHub Actions / JUnit Test Report

JUnit5StackTraceNamerTest.testFactory3()[2]

The Namer org.approvaltests.namer.StackTraceNamer is dynamic, but no additional information was provided in the options
Raw output
com.spun.util.FormattedException: The Namer org.approvaltests.namer.StackTraceNamer is dynamic, but no additional information was provided in the options
	at org.approvaltests.Approvals.verify(Approvals.java:198)
	at org.approvaltests.Approvals.verify(Approvals.java:211)
	at org.approvaltests.Approvals.verify(Approvals.java:55)
	at org.approvaltests.Approvals.verify(Approvals.java:51)
	at org.approvaltests.namer.JUnit5StackTraceNamerTest.lambda$testFactory3$8(JUnit5StackTraceNamerTest.java:134)
	at org.approvaltests.integrations.junit5.JupiterApprovals.lambda$dynamicTest$0(JupiterApprovals.java:15)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.tryRemoveAndExec(ForkJoinPool.java:1351)
	at java.base/java.util.concurrent.ForkJoinTask.awaitDone(ForkJoinTask.java:422)
	at java.base/java.util.concurrent.ForkJoinTask.get(ForkJoinTask.java:991)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.tryRemoveAndExec(ForkJoinPool.java:1351)
	at java.base/java.util.concurrent.ForkJoinTask.awaitDone(ForkJoinTask.java:422)
	at java.base/java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:651)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1312)
	at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1843)
	at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1808)
	at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:188)

Check failure on line 134 in approvaltests/src/test/java/org/approvaltests/namer/JUnit5StackTraceNamerTest.java

View workflow job for this annotation

GitHub Actions / JUnit Test Report

JUnit5StackTraceNamerTest.testFactory3()[1]

The Namer org.approvaltests.namer.StackTraceNamer is dynamic, but no additional information was provided in the options
Raw output
com.spun.util.FormattedException: The Namer org.approvaltests.namer.StackTraceNamer is dynamic, but no additional information was provided in the options
	at org.approvaltests.Approvals.verify(Approvals.java:198)
	at org.approvaltests.Approvals.verify(Approvals.java:211)
	at org.approvaltests.Approvals.verify(Approvals.java:55)
	at org.approvaltests.Approvals.verify(Approvals.java:51)
	at org.approvaltests.namer.JUnit5StackTraceNamerTest.lambda$testFactory3$8(JUnit5StackTraceNamerTest.java:134)
	at org.approvaltests.integrations.junit5.JupiterApprovals.lambda$dynamicTest$0(JupiterApprovals.java:15)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.tryRemoveAndExec(ForkJoinPool.java:1351)
	at java.base/java.util.concurrent.ForkJoinTask.awaitDone(ForkJoinTask.java:422)
	at java.base/java.util.concurrent.ForkJoinTask.get(ForkJoinTask.java:991)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.tryRemoveAndExec(ForkJoinPool.java:1351)
	at java.base/java.util.concurrent.ForkJoinTask.awaitDone(ForkJoinTask.java:422)
	at java.base/java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:651)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1312)
	at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1843)
	at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1808)
	at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:188)
}
// end-snippet
}

0 comments on commit e336b62

Please sign in to comment.