1 /*
2 * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 import jdk.incubator.code.extern.impl.Scanner;
25 import jdk.incubator.code.extern.impl.Tokens;
26 import org.junit.jupiter.api.Assertions;
27 import org.junit.jupiter.params.ParameterizedTest;
28 import org.junit.jupiter.params.provider.MethodSource;
29
30 import java.util.ArrayList;
31 import java.util.List;
32
33 import static jdk.incubator.code.extern.impl.Tokens.TokenKind.*;
34
35 /*
36 * @test
37 * @modules jdk.incubator.code/jdk.incubator.code.extern.impl
38 * @run junit TestScanner
39 */
40
41 public class TestScanner {
42
43 static Object[][] data() {
44 return new Object[][] {
45 {"java.lang.Integer", List.of(IDENTIFIER, DOT, IDENTIFIER, DOT, IDENTIFIER)},
46 {"java.lang.Integer", List.of("java", DOT, "lang", DOT, "Integer")},
47 {"a<a<a, a>,a<a, a>>", List.of("a", LT,
48 "a", LT, "a", COMMA, "a", GT,
49 COMMA,
50 "a", LT, "a", COMMA, "a", GT,
51 GT)},
52 {"_->(){}[],.=><?:;+-&^@", List.of(
53 UNDERSCORE,
54 ARROW,
55 LPAREN,
56 RPAREN,
57 LBRACE,
58 RBRACE,
59 LBRACKET,
60 RBRACKET,
61 COMMA,
62 DOT,
63 EQ,
64 GT,
65 LT,
66 QUES,
67 COLON,
68 SEMI,
69 PLUS,
70 SUB,
71 AMP,
72 CARET,
73 MONKEYS_AT
74 )},
75 {"%1 %a %_1", List.of(VALUE_IDENTIFIER, VALUE_IDENTIFIER, VALUE_IDENTIFIER)},
76 {"%1 %a %_1", List.of("%1", "%a", "%_1")},
77 {"\"abc\\n\"", List.of(STRINGLITERAL)},
78 {"\"abc \\b \\f \\n \\r \\t \\' \\\" \\\\\"", List.of("abc \b \f \n \r \t \' \" \\")},
79 };
80 }
81
82 @ParameterizedTest
83 @MethodSource("data")
84 public void test(String content, List<Object> expectedTokens) {
85 Scanner.Factory factory = Scanner.factory();
86
87 Scanner s = factory.newScanner(content);
88 s.nextToken();
89 List<Tokens.Token> actualTokens = new ArrayList<>();
90 while (s.token().kind != EOF) {
91 actualTokens.add(s.token());
92 s.nextToken();
93 }
94
95 Assertions.assertEquals(expectedTokens.size(), actualTokens.size());
96 for (int i = 0; i < expectedTokens.size(); i++) {
97 Object e = expectedTokens.get(i);
98 Tokens.Token a = actualTokens.get(i);
99 if (e instanceof Tokens.TokenKind t) {
100 Assertions.assertEquals(t, a.kind);
101 } else if (e instanceof String v) {
102 String as = switch (a.kind.tag) {
103 case NAMED -> a.name();
104 case STRING, NUMERIC -> a.stringVal();
105 case DEFAULT -> a.kind.name;
106 };
107 Assertions.assertEquals(v, as);
108 } else {
109 assert false;
110 }
111 }
112 }
113 }