11package io .cucumber .cucumberexpressions ;
22
3+ import org .assertj .core .api .AbstractObjectAssert ;
4+ import org .assertj .core .api .InstanceOfAssertFactories ;
5+ import org .jspecify .annotations .Nullable ;
36import org .junit .jupiter .api .Test ;
47import org .junit .jupiter .api .function .Executable ;
5- import org .junit .jupiter .params .shadow .de .siegmar .fastcsv .util .Nullable ;
68
79import java .math .BigDecimal ;
10+ import java .util .List ;
811import java .util .Locale ;
12+ import java .util .Optional ;
913import java .util .regex .Pattern ;
1014
1115import static org .assertj .core .api .Assertions .assertThat ;
@@ -89,7 +93,7 @@ public void throws_ambiguous_exception_on_lookup_when_no_parameter_types_are_pre
8993
9094 @ Test
9195 public void does_not_allow_anonymous_parameter_type_to_be_registered () {
92- Executable testMethod = () -> registry .defineParameterType (new ParameterType <>("" , ".*" , Object .class , (Transformer < Object >) arg -> arg ));
96+ Executable testMethod = () -> registry .defineParameterType (new ParameterType <>("" , ".*" , Object .class , (@ Nullable String arg ) -> arg ));
9397
9498 var exception = assertThrows (DuplicateTypeNameException .class , testMethod );
9599 assertThat (exception ).hasMessage ("The anonymous parameter type has already been defined" );
@@ -100,72 +104,81 @@ public void parse_decimal_numbers_in_english() {
100104 ExpressionFactory factory = new ExpressionFactory (new ParameterTypeRegistry (Locale .ENGLISH ));
101105 Expression expression = factory .createExpression ("{bigdecimal}" );
102106
103- assertThat (expression .match ("" )).isNull ();
104- assertThat (expression .match ("." )).isNull ();
105- assertThat (expression .match ("," )).isNull ();
106- assertThat (expression .match ("-" )).isNull ();
107- assertThat (expression .match ("E" )).isNull ();
108- assertThat (expression .match ("1," )).isNull ();
109- assertThat (expression .match (",1" )).isNull ();
110- assertThat (expression .match ("1." )).isNull ();
111-
112- assertThat (expression .match ("1" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (BigDecimal .ONE );
113- assertThat (expression .match ("-1" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("-1" ));
114- assertThat (expression .match ("1.1" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("1.1" ));
115- assertThat (expression .match ("1,000" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("1000" ));
116- assertThat (expression .match ("1,000,0" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("10000" ));
117- assertThat (expression .match ("1,000.1" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("1000.1" ));
118- assertThat (expression .match ("1,000,10" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("100010" ));
119- assertThat (expression .match ("1,0.1" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("10.1" ));
120- assertThat (expression .match ("1,000,000.1" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("1000000.1" ));
121- assertThat (expression .match ("-1.1" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("-1.1" ));
122-
123- assertThat (expression .match (".1" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("0.1" ));
124- assertThat (expression .match ("-.1" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("-0.1" ));
125- assertThat (expression .match ("-.10000001" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("-0.10000001" ));
107+ assertThat (expression .match ("" )).isEmpty ();
108+ assertThat (expression .match ("." )).isEmpty ();
109+ assertThat (expression .match ("," )).isEmpty ();
110+ assertThat (expression .match ("-" )).isEmpty ();
111+ assertThat (expression .match ("E" )).isEmpty ();
112+ assertThat (expression .match ("1," )).isEmpty ();
113+ assertThat (expression .match (",1" )).isEmpty ();
114+ assertThat (expression .match ("1." )).isEmpty ();
115+
116+ asserThatSingleArgumentValue (expression .match ("1" )).isEqualTo (BigDecimal .ONE );
117+ asserThatSingleArgumentValue (expression .match ("-1" )).isEqualTo (new BigDecimal ("-1" ));
118+ asserThatSingleArgumentValue (expression .match ("1.1" )).isEqualTo (new BigDecimal ("1.1" ));
119+ asserThatSingleArgumentValue (expression .match ("1,000" )).isEqualTo (new BigDecimal ("1000" ));
120+ asserThatSingleArgumentValue (expression .match ("1,000,0" )).isEqualTo (new BigDecimal ("10000" ));
121+ asserThatSingleArgumentValue (expression .match ("1,000.1" )).isEqualTo (new BigDecimal ("1000.1" ));
122+ asserThatSingleArgumentValue (expression .match ("1,000,10" )).isEqualTo (new BigDecimal ("100010" ));
123+ asserThatSingleArgumentValue (expression .match ("1,0.1" )).isEqualTo (new BigDecimal ("10.1" ));
124+ asserThatSingleArgumentValue (expression .match ("1,000,000.1" )).isEqualTo (new BigDecimal ("1000000.1" ));
125+ asserThatSingleArgumentValue (expression .match ("-1.1" )).isEqualTo (new BigDecimal ("-1.1" ));
126+
127+ asserThatSingleArgumentValue (expression .match (".1" )).isEqualTo (new BigDecimal ("0.1" ));
128+ asserThatSingleArgumentValue (expression .match ("-.1" )).isEqualTo (new BigDecimal ("-0.1" ));
129+ asserThatSingleArgumentValue (expression .match ("-.10000001" )).isEqualTo (new BigDecimal ("-0.10000001" ));
126130 // precision 1 with scale -1, can not be expressed as a decimal
127- assertThat (expression .match ("1E1" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("1E1" ));
128- assertThat (expression .match (".1E1" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("1" ));
129- assertThat (expression .match ("E1" )).isNull ();
130- assertThat (expression .match ("-.1E-1" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("-0.01" ));
131- assertThat (expression .match ("-.1E-2" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("-0.001" ));
132- assertThat (expression .match ("-.1E+1" )).isNull ();
133- assertThat (expression .match ("-.1E+2" )).isNull ();
134- assertThat (expression .match ("-.1E1" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("-1" ));
135- assertThat (expression .match ("-.10E2" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("-10" ));
131+ asserThatSingleArgumentValue (expression .match ("1E1" )).isEqualTo (new BigDecimal ("1E1" ));
132+ asserThatSingleArgumentValue (expression .match (".1E1" )).isEqualTo (new BigDecimal ("1" ));
133+ assertThat (expression .match ("E1" )).isEmpty ();
134+ asserThatSingleArgumentValue (expression .match ("-.1E-1" )).isEqualTo (new BigDecimal ("-0.01" ));
135+ asserThatSingleArgumentValue (expression .match ("-.1E-2" )).isEqualTo (new BigDecimal ("-0.001" ));
136+ assertThat (expression .match ("-.1E+1" )).isEmpty ();
137+ assertThat (expression .match ("-.1E+2" )).isEmpty ();
138+ asserThatSingleArgumentValue (expression .match ("-.1E1" )).isEqualTo (new BigDecimal ("-1" ));
139+ asserThatSingleArgumentValue (expression .match ("-.10E2" )).isEqualTo (new BigDecimal ("-10" ));
136140 }
137141
138142 @ Test
139143 public void parse_decimal_numbers_in_german () {
140144 ExpressionFactory factory = new ExpressionFactory (new ParameterTypeRegistry (Locale .GERMAN ));
141145 Expression expression = factory .createExpression ("{bigdecimal}" );
142146
143- assertThat (expression .match ("1.000,1" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("1000.1" ));
144- assertThat (expression .match ("1.000.000,1" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("1000000.1" ));
145- assertThat (expression .match ("-1,1" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("-1.1" ));
146- assertThat (expression .match ("-,1E1" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("-1" ));
147+ asserThatSingleArgumentValue (expression .match ("1.000,1" )).isEqualTo (new BigDecimal ("1000.1" ));
148+ asserThatSingleArgumentValue (expression .match ("1.000.000,1" )).isEqualTo (new BigDecimal ("1000000.1" ));
149+ asserThatSingleArgumentValue (expression .match ("-1,1" )).isEqualTo (new BigDecimal ("-1.1" ));
150+ asserThatSingleArgumentValue (expression .match ("-,1E1" )).isEqualTo (new BigDecimal ("-1" ));
147151 }
148152
149153 @ Test
150154 public void parse_decimal_numbers_in_canadian_french () {
151155 ExpressionFactory factory = new ExpressionFactory (new ParameterTypeRegistry (Locale .CANADA_FRENCH ));
152156 Expression expression = factory .createExpression ("{bigdecimal}" );
153157
154- assertThat (expression .match ("1.000,1" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("1000.1" ));
155- assertThat (expression .match ("1.000.000,1" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("1000000.1" ));
156- assertThat (expression .match ("-1,1" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("-1.1" ));
157- assertThat (expression .match ("-,1E1" )). singleElement (). extracting ( Argument :: getValue ).isEqualTo (new BigDecimal ("-1" ));
158+ asserThatSingleArgumentValue (expression .match ("1.000,1" )).isEqualTo (new BigDecimal ("1000.1" ));
159+ asserThatSingleArgumentValue (expression .match ("1.000.000,1" )).isEqualTo (new BigDecimal ("1000000.1" ));
160+ asserThatSingleArgumentValue (expression .match ("-1,1" )).isEqualTo (new BigDecimal ("-1.1" ));
161+ asserThatSingleArgumentValue (expression .match ("-,1E1" )).isEqualTo (new BigDecimal ("-1" ));
158162 }
159163
160164 @ Test
161165 public void parse_decimal_numbers_in_norwegian () {
162166 ExpressionFactory factory = new ExpressionFactory (new ParameterTypeRegistry (Locale .forLanguageTag ("no" )));
163167 Expression expression = factory .createExpression ("{bigdecimal}" );
164168
165- assertThat (expression .match ("1.000,1" )).singleElement ().extracting (Argument ::getValue ).isEqualTo (new BigDecimal ("1000.1" ));
166- assertThat (expression .match ("1.000.000,1" )).singleElement ().extracting (Argument ::getValue ).isEqualTo (new BigDecimal ("1000000.1" ));
167- assertThat (expression .match ("-1,1" )).singleElement ().extracting (Argument ::getValue ).isEqualTo (new BigDecimal ("-1.1" ));
168- assertThat (expression .match ("-,1E1" )).singleElement ().extracting (Argument ::getValue ).isEqualTo (new BigDecimal ("-1" ));
169+ asserThatSingleArgumentValue (expression .match ("1.000,1" )).isEqualTo (new BigDecimal ("1000.1" ));
170+ asserThatSingleArgumentValue (expression .match ("1.000.000,1" )).isEqualTo (new BigDecimal ("1000000.1" ));
171+ asserThatSingleArgumentValue (expression .match ("-1,1" )).isEqualTo (new BigDecimal ("-1.1" ));
172+ asserThatSingleArgumentValue (expression .match ("-,1E1" )).isEqualTo (new BigDecimal ("-1" ));
173+ }
174+
175+ @ SuppressWarnings ("OptionalUsedAsFieldOrParameterType" )
176+ private static AbstractObjectAssert <?, Object > asserThatSingleArgumentValue (Optional <List <Argument <?>>> match ) {
177+ return assertThat (match ).get ()
178+ .asInstanceOf (InstanceOfAssertFactories .LIST )
179+ .map (Argument .class ::cast )
180+ .singleElement ()
181+ .extracting (Argument ::getValue );
169182 }
170183
171184 public static class Name {
0 commit comments