diff --git a/approvaltests/src/main/java/org/approvaltests/Approvals.java b/approvaltests/src/main/java/org/approvaltests/Approvals.java index ec0d105ef..42f9391b2 100644 --- a/approvaltests/src/main/java/org/approvaltests/Approvals.java +++ b/approvaltests/src/main/java/org/approvaltests/Approvals.java @@ -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) diff --git a/approvaltests/src/main/java/org/approvaltests/core/Options.java b/approvaltests/src/main/java/org/approvaltests/core/Options.java index 2792393a9..cd47d9910 100644 --- a/approvaltests/src/main/java/org/approvaltests/core/Options.java +++ b/approvaltests/src/main/java/org/approvaltests/core/Options.java @@ -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; } diff --git a/approvaltests/src/main/java/org/approvaltests/inline/InlineComparator.java b/approvaltests/src/main/java/org/approvaltests/inline/InlineComparator.java index 72507e711..d8b1bbc14 100644 --- a/approvaltests/src/main/java/org/approvaltests/inline/InlineComparator.java +++ b/approvaltests/src/main/java/org/approvaltests/inline/InlineComparator.java @@ -59,6 +59,12 @@ public ApprovalNamer addAdditionalInformation(String info) { return this; } + + @Override + public boolean isDynamic() { + return false; + } + @Override public String getApprovalName() { diff --git a/approvaltests/src/main/java/org/approvaltests/integrations/junit5/JupiterApprovals.java b/approvaltests/src/main/java/org/approvaltests/integrations/junit5/JupiterApprovals.java index 7dbc64e47..ae26de1db 100644 --- a/approvaltests/src/main/java/org/approvaltests/integrations/junit5/JupiterApprovals.java +++ b/approvaltests/src/main/java/org/approvaltests/integrations/junit5/JupiterApprovals.java @@ -12,9 +12,7 @@ public class JupiterApprovals public static DynamicTest dynamicTest(String displayName, Action1 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) { diff --git a/approvaltests/src/main/java/org/approvaltests/namer/ApprovalNamer.java b/approvaltests/src/main/java/org/approvaltests/namer/ApprovalNamer.java index db11cee53..da7591c34 100644 --- a/approvaltests/src/main/java/org/approvaltests/namer/ApprovalNamer.java +++ b/approvaltests/src/main/java/org/approvaltests/namer/ApprovalNamer.java @@ -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(); } diff --git a/approvaltests/src/main/java/org/approvaltests/namer/AttributeStackSelector.java b/approvaltests/src/main/java/org/approvaltests/namer/AttributeStackSelector.java index 03bf11c59..3690fc331 100644 --- a/approvaltests/src/main/java/org/approvaltests/namer/AttributeStackSelector.java +++ b/approvaltests/src/main/java/org/approvaltests/namer/AttributeStackSelector.java @@ -132,7 +132,7 @@ private static void checkConditionsForAttribute(Class attr } } } - private static boolean isDynamicWrapperPresent() + public static boolean isDynamicWrapperPresent() { StackTraceElement[] stackTrace = ThreadUtils.getStackTrace(); return Queryable.as(stackTrace) diff --git a/approvaltests/src/main/java/org/approvaltests/namer/MasterDirectoryNamer.java b/approvaltests/src/main/java/org/approvaltests/namer/MasterDirectoryNamer.java index 355a3530b..ebb87957e 100644 --- a/approvaltests/src/main/java/org/approvaltests/namer/MasterDirectoryNamer.java +++ b/approvaltests/src/main/java/org/approvaltests/namer/MasterDirectoryNamer.java @@ -44,4 +44,9 @@ public ApprovalNamer addAdditionalInformation(String info) { return new MasterDirectoryNamer(this.approvedFile, this.namer.addAdditionalInformation(info)); } + + @Override + public boolean isDynamic() { + return false; + } } diff --git a/approvaltests/src/main/java/org/approvaltests/namer/NamerWrapper.java b/approvaltests/src/main/java/org/approvaltests/namer/NamerWrapper.java index f6ec4e1d5..a2462e7ce 100644 --- a/approvaltests/src/main/java/org/approvaltests/namer/NamerWrapper.java +++ b/approvaltests/src/main/java/org/approvaltests/namer/NamerWrapper.java @@ -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; + } } diff --git a/approvaltests/src/main/java/org/approvaltests/namer/StackTraceNamer.java b/approvaltests/src/main/java/org/approvaltests/namer/StackTraceNamer.java index f061a0032..caac58570 100644 --- a/approvaltests/src/main/java/org/approvaltests/namer/StackTraceNamer.java +++ b/approvaltests/src/main/java/org/approvaltests/namer/StackTraceNamer.java @@ -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) @@ -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; diff --git a/approvaltests/src/test/java/org/approvaltests/namer/JUnit5StackTraceNamerTest.java b/approvaltests/src/test/java/org/approvaltests/namer/JUnit5StackTraceNamerTest.java index bba47c694..86f6a9de8 100644 --- a/approvaltests/src/test/java/org/approvaltests/namer/JUnit5StackTraceNamerTest.java +++ b/approvaltests/src/test/java/org/approvaltests/namer/JUnit5StackTraceNamerTest.java @@ -131,7 +131,7 @@ Collection testFactory2() Collection 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()); } // end-snippet }