1414import org .antlr .v4 .runtime .Lexer ;
1515import org .antlr .v4 .runtime .Token ;
1616import org .junit .jupiter .api .Test ;
17+ import org .junit .jupiter .params .ParameterizedTest ;
18+ import org .junit .jupiter .params .provider .ValueSource ;
1719import org .opensearch .dataprepper .expression .antlr .DataPrepperExpressionLexer ;
1820
1921import java .util .List ;
2022
2123import static org .hamcrest .CoreMatchers .is ;
24+ import static org .hamcrest .CoreMatchers .not ;
2225import static org .hamcrest .MatcherAssert .assertThat ;
26+ import static org .hamcrest .Matchers .greaterThanOrEqualTo ;
2327import static org .junit .jupiter .api .Assertions .assertAll ;
24- import static org .junit .jupiter .api .Assertions .assertFalse ;
2528
2629class GrammarLexerTest {
2730
@@ -32,10 +35,11 @@ private List<? extends Token> getTokens(final String statement) {
3235 return tokenStream .getTokens ();
3336 }
3437
35- private void assertTokenFalse (final String statement , final int type ) {
38+ private void assertIsNotToken (final String statement , final int type ) {
3639 final List <? extends Token > tokens = getTokens (statement );
3740
38- assertFalse (tokens .size () == 2 && tokens .get (0 ).getText () == statement );
41+ assertThat (tokens .size (), is (greaterThanOrEqualTo (2 )));
42+ assertThat (tokens .get (0 ).getType (), is (not (type )));
3943 }
4044
4145 private void assertToken (final String statement , final int type ) {
@@ -73,27 +77,31 @@ void testTokenFloat() {
7377 assertToken ("12345678.0002e6" , DataPrepperExpressionLexer .Float );
7478 assertToken ("12345678.000252E16" , DataPrepperExpressionLexer .Float );
7579 // only one zero before the decimal point
76- assertTokenFalse ("0000.678e12" , DataPrepperExpressionLexer .Float );
80+ assertIsNotToken ("0000.678e12" , DataPrepperExpressionLexer .Float );
7781 // Must have one digit before the decimal point
78- assertTokenFalse (".678e12" , DataPrepperExpressionLexer .Float );
79- assertTokenFalse (".678e-12" , DataPrepperExpressionLexer .Float );
80- assertTokenFalse (".6782" , DataPrepperExpressionLexer .Float );
82+ assertIsNotToken (".678e12" , DataPrepperExpressionLexer .Float );
83+ assertIsNotToken (".678e-12" , DataPrepperExpressionLexer .Float );
84+ assertIsNotToken (".6782" , DataPrepperExpressionLexer .Float );
8185 // Can't end with decimal point
82- assertTokenFalse ("6782." , DataPrepperExpressionLexer .Float );
83- // only one zero after decimal point
84- assertTokenFalse ("12345678.00" , DataPrepperExpressionLexer .Float );
86+ assertIsNotToken ("6782." , DataPrepperExpressionLexer .Float );
8587 }
8688
87- @ Test
88- void testTokenBoolean () {
89- assertToken ("true" , DataPrepperExpressionLexer .Boolean );
89+ @ ParameterizedTest
90+ @ ValueSource (strings = {"true" , "false" })
91+ void testTokenBoolean (final String booleanStatement ) {
92+ assertToken (booleanStatement , DataPrepperExpressionLexer .Boolean );
9093 }
9194
9295 @ Test
9396 void testTokenJsonPointer () {
9497 assertToken ("/status_code" , DataPrepperExpressionLexer .JsonPointer );
9598 }
9699
100+ @ Test
101+ void testTokenEscapedJsonPointer () {
102+ assertToken ("\" /status_code\" " , DataPrepperExpressionLexer .EscapedJsonPointer );
103+ }
104+
97105 @ Test
98106 void testTokenString () {
99107 assertToken ("\" Hello World\" " , DataPrepperExpressionLexer .String );
@@ -204,6 +212,126 @@ void testTokenSUBTRACT() {
204212 assertToken ("-" , DataPrepperExpressionLexer .SUBTRACT );
205213 }
206214
215+ @ ParameterizedTest
216+ @ ValueSource (strings = {"integer" , "boolean" , "big_decimal" , "long" , "double" , "string" , "map" , "array" })
217+ void testTokenDataTypes (final String dataType ) {
218+ assertToken (dataType , DataPrepperExpressionLexer .DataTypes );
219+ }
220+
221+ @ ParameterizedTest
222+ @ ValueSource (strings = {"length" , "contains" , "cidrContains" , "hasTags" , "getMetadata" , "getEventType" })
223+ void testTokenIdentifier (final String functionName ) {
224+ assertToken (functionName , DataPrepperExpressionLexer .Identifier );
225+ }
226+
227+ @ ParameterizedTest
228+ @ ValueSource (strings = {"length" , "contains" , "cidrContains" , "hasTags" , "getMetadata" , "getEventType" })
229+ void testTokenFunction (final String functionName ) {
230+ final String statement = functionName + "()" ;
231+ final List <? extends Token > tokens = getTokens (statement );
232+
233+ assertThat (tokens .size (), is (4 ));
234+ assertAll (
235+ () -> assertThat (tokens .get (0 ).getType (), is (DataPrepperExpressionLexer .Identifier )),
236+ () -> assertThat (tokens .get (0 ).getText (), is (functionName )),
237+ () -> assertThat (tokens .get (1 ).getType (), is (DataPrepperExpressionLexer .LPAREN )),
238+ () -> assertThat (tokens .get (2 ).getType (), is (DataPrepperExpressionLexer .RPAREN )),
239+ () -> assertThat (tokens .get (3 ).getType (), is (DataPrepperExpressionLexer .EOF ))
240+ );
241+ assertToken (functionName , DataPrepperExpressionLexer .Identifier );
242+ }
243+
244+ @ ParameterizedTest
245+ @ ValueSource (strings = {"length" , "contains" , "cidrContains" , "hasTags" , "getMetadata" , "getEventType" })
246+ void testTokenFunctionWithSpace (final String functionName ) {
247+ final String statement = functionName + " ()" ;
248+ final List <? extends Token > tokens = getTokens (statement );
249+
250+ assertThat (tokens .size (), is (4 ));
251+ assertAll (
252+ () -> assertThat (tokens .get (0 ).getType (), is (DataPrepperExpressionLexer .Identifier )),
253+ () -> assertThat (tokens .get (0 ).getText (), is (functionName )),
254+ () -> assertThat (tokens .get (1 ).getType (), is (DataPrepperExpressionLexer .LPAREN )),
255+ () -> assertThat (tokens .get (2 ).getType (), is (DataPrepperExpressionLexer .RPAREN )),
256+ () -> assertThat (tokens .get (3 ).getType (), is (DataPrepperExpressionLexer .EOF ))
257+ );
258+ assertToken (functionName , DataPrepperExpressionLexer .Identifier );
259+ }
260+
261+ @ ParameterizedTest
262+ @ ValueSource (strings = {"integer" , "boolean" , "big_decimal" , "long" , "double" , "string" , "map" , "array" })
263+ void testTypeOfExpressionTokenization (final String dataType ) {
264+ final String statement = "/status typeof " + dataType ;
265+ final List <? extends Token > tokens = getTokens (statement );
266+
267+ assertThat (tokens .size (), is (4 ));
268+ assertAll (
269+ () -> assertThat (tokens .get (0 ).getType (), is (DataPrepperExpressionLexer .JsonPointer )),
270+ () -> assertThat (tokens .get (1 ).getType (), is (DataPrepperExpressionLexer .TYPEOF )),
271+ () -> assertThat (tokens .get (2 ).getType (), is (DataPrepperExpressionLexer .DataTypes )),
272+ () -> assertThat (tokens .get (2 ).getText (), is (dataType )),
273+ () -> assertThat (tokens .get (3 ).getType (), is (DataPrepperExpressionLexer .EOF ))
274+ );
275+ }
276+
277+ @ Test
278+ void testFunctionWithNoArgsTokenization () {
279+ final List <? extends Token > tokens = getTokens ("functionWithoutArguments()" );
280+
281+ assertThat (tokens .size (), is (4 ));
282+ assertAll (
283+ () -> assertThat (tokens .get (0 ).getType (), is (DataPrepperExpressionLexer .Identifier )),
284+ () -> assertThat (tokens .get (0 ).getText (), is ("functionWithoutArguments" )),
285+ () -> assertThat (tokens .get (1 ).getType (), is (DataPrepperExpressionLexer .LPAREN )),
286+ () -> assertThat (tokens .get (2 ).getType (), is (DataPrepperExpressionLexer .RPAREN )),
287+ () -> assertThat (tokens .get (3 ).getType (), is (DataPrepperExpressionLexer .EOF ))
288+ );
289+ }
290+
291+ @ Test
292+ void testFunctionWithArgsTokenization () {
293+ final List <? extends Token > tokens = getTokens ("functionWithTwoArguments(/sourceIp,\" 192.0.2.0/24\" )" );
294+
295+ assertThat (tokens .size (), is (7 ));
296+ assertAll (
297+ () -> assertThat (tokens .get (0 ).getType (), is (DataPrepperExpressionLexer .Identifier )),
298+ () -> assertThat (tokens .get (0 ).getText (), is ("functionWithTwoArguments" )),
299+ () -> assertThat (tokens .get (1 ).getType (), is (DataPrepperExpressionLexer .LPAREN )),
300+ () -> assertThat (tokens .get (2 ).getType (), is (DataPrepperExpressionLexer .JsonPointer )),
301+ () -> assertThat (tokens .get (2 ).getText (), is ("/sourceIp" )),
302+ () -> assertThat (tokens .get (3 ).getType (), is (DataPrepperExpressionLexer .COMMA )),
303+ () -> assertThat (tokens .get (4 ).getType (), is (DataPrepperExpressionLexer .String )),
304+ () -> assertThat (tokens .get (4 ).getText (), is ("\" 192.0.2.0/24\" " )),
305+ () -> assertThat (tokens .get (5 ).getType (), is (DataPrepperExpressionLexer .RPAREN )),
306+ () -> assertThat (tokens .get (6 ).getType (), is (DataPrepperExpressionLexer .EOF ))
307+ );
308+ }
309+
310+ @ Test
311+ void testTokenNull () {
312+ assertToken ("null" , DataPrepperExpressionLexer .Null );
313+ }
314+
315+ @ Test
316+ void testTokenCOMMA () {
317+ assertToken ("," , DataPrepperExpressionLexer .COMMA );
318+ }
319+
320+ @ Test
321+ void testTokenPLUS () {
322+ assertToken ("+" , DataPrepperExpressionLexer .PLUS );
323+ }
324+
325+ @ Test
326+ void testTokenMULTIPLY () {
327+ assertToken ("*" , DataPrepperExpressionLexer .MULTIPLY );
328+ }
329+
330+ @ Test
331+ void testTokenMOD () {
332+ assertToken ("%" , DataPrepperExpressionLexer .MOD );
333+ }
334+
207335 @ Test
208336 void testSpaceInsignificant () {
209337 final String statement = " " ;
0 commit comments