1515 */
1616package com .diffplug .spotless .generic ;
1717
18+ import java .io .File ;
19+ import java .io .Serializable ;
1820import java .util .Arrays ;
19- import java .util .Locale ;
21+ import java .util .Objects ;
22+
23+ import javax .annotation .Nullable ;
2024
2125import org .junit .jupiter .api .Test ;
2226
2327import com .diffplug .common .base .StringPrinter ;
28+ import com .diffplug .spotless .FormatterFunc ;
2429import com .diffplug .spotless .FormatterStep ;
2530import com .diffplug .spotless .ResourceHarness ;
2631import com .diffplug .spotless .StepHarness ;
2934class FenceStepTest extends ResourceHarness {
3035 @ Test
3136 void single () {
32- FormatterStep fence = FenceStep .named ("underTest " ).openClose ("spotless:off" , "spotless:on" )
33- .preserveWithin (Arrays .asList (FormatterStep . createNeverUpToDate ("lowercase" , str -> str . toLowerCase ( Locale . ROOT ) )));
37+ FormatterStep fence = FenceStep .named ("fence " ).openClose ("spotless:off" , "spotless:on" )
38+ .preserveWithin (Arrays .asList (createNeverUpToDateSerializable ("lowercase" , String :: toLowerCase )));
3439 StepHarness harness = StepHarness .forSteps (fence );
3540 harness .test (
3641 StringPrinter .buildStringFromLines (
@@ -49,8 +54,8 @@ void single() {
4954
5055 @ Test
5156 void multiple () {
52- FormatterStep fence = FenceStep .named ("underTest " ).openClose ("spotless:off" , "spotless:on" )
53- .preserveWithin (Arrays .asList (FormatterStep . createNeverUpToDate ("lowercase" , str -> str . toLowerCase ( Locale . ROOT ) )));
57+ FormatterStep fence = FenceStep .named ("fence " ).openClose ("spotless:off" , "spotless:on" )
58+ .preserveWithin (Arrays .asList (createNeverUpToDateSerializable ("lowercase" , String :: toLowerCase )));
5459 StepHarness harness = StepHarness .forSteps (fence );
5560 harness .test (
5661 StringPrinter .buildStringFromLines (
@@ -83,8 +88,8 @@ void multiple() {
8388
8489 @ Test
8590 void broken () {
86- FormatterStep fence = FenceStep .named ("underTest " ).openClose ("spotless:off" , "spotless:on" )
87- .preserveWithin (Arrays .asList (FormatterStep . createNeverUpToDate ("uppercase" , str -> str . toUpperCase ( Locale . ROOT ) )));
91+ FormatterStep fence = FenceStep .named ("fence " ).openClose ("spotless:off" , "spotless:on" )
92+ .preserveWithin (Arrays .asList (createNeverUpToDateSerializable ("uppercase" , String :: toUpperCase )));
8893 StepHarnessWithFile harness = StepHarnessWithFile .forStep (this , fence );
8994 // this fails because uppercase turns spotless:off into SPOTLESS:OFF, etc
9095 harness .testExceptionMsg (newFile ("test" ), StringPrinter .buildStringFromLines ("A B C" ,
@@ -96,9 +101,8 @@ void broken() {
96101
97102 @ Test
98103 void andApply () {
99- FormatterStep fence = FenceStep .named ("lowercaseSometimes" ).openClose ("<lower>" , "</lower>" )
100- .applyWithin (Arrays .asList (
101- FormatterStep .createNeverUpToDate ("lowercase" , str -> str .toLowerCase (Locale .ROOT ))));
104+ FormatterStep fence = FenceStep .named ("fence" ).openClose ("<lower>" , "</lower>" )
105+ .applyWithin (Arrays .asList (createNeverUpToDateSerializable ("lowercase" , String ::toLowerCase )));
102106 StepHarness .forSteps (fence ).test (
103107 StringPrinter .buildStringFromLines (
104108 "A B C" ,
@@ -113,4 +117,40 @@ void andApply() {
113117 "</lower>" ,
114118 "G H I" ));
115119 }
120+
121+ /**
122+ * @param name
123+ * The name of the formatter step
124+ * @param function
125+ * The function used by the formatter step
126+ * @return A FormatterStep which will never report that it is up-to-date, because
127+ * it is not equal to the serialized representation of itself.
128+ */
129+ static <T extends FormatterFunc & Serializable > FormatterStep createNeverUpToDateSerializable (
130+ String name ,
131+ T function ) {
132+ Objects .requireNonNull (function , "function" );
133+ return new NeverUpToDateSerializable (name , function );
134+ }
135+
136+ static class NeverUpToDateSerializable <T extends FormatterFunc & Serializable > implements FormatterStep , Serializable {
137+ private final String name ;
138+ private final T formatterFunc ;
139+
140+ private NeverUpToDateSerializable (String name , T formatterFunc ) {
141+ this .name = name ;
142+ this .formatterFunc = formatterFunc ;
143+ }
144+
145+ @ Override
146+ public String getName () {
147+ return name ;
148+ }
149+
150+ @ Nullable
151+ @ Override
152+ public String format (String rawUnix , File file ) throws Exception {
153+ return formatterFunc .apply (rawUnix , file );
154+ }
155+ }
116156}
0 commit comments