aboutsummaryrefslogtreecommitdiffstats
path: root/src/test/java/com/jogamp/gluegen/jcpp/LexerSourceTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/com/jogamp/gluegen/jcpp/LexerSourceTest.java')
-rw-r--r--src/test/java/com/jogamp/gluegen/jcpp/LexerSourceTest.java143
1 files changed, 143 insertions, 0 deletions
diff --git a/src/test/java/com/jogamp/gluegen/jcpp/LexerSourceTest.java b/src/test/java/com/jogamp/gluegen/jcpp/LexerSourceTest.java
new file mode 100644
index 0000000..43ccbe6
--- /dev/null
+++ b/src/test/java/com/jogamp/gluegen/jcpp/LexerSourceTest.java
@@ -0,0 +1,143 @@
+package com.jogamp.gluegen.jcpp;
+
+import java.util.Arrays;
+
+import org.junit.Test;
+
+import com.jogamp.gluegen.Logging;
+import com.jogamp.gluegen.Logging.LoggerIf;
+
+import static com.jogamp.gluegen.jcpp.PreprocessorTest.assertType;
+import static com.jogamp.gluegen.jcpp.Token.*;
+import static org.junit.Assert.*;
+
+public class LexerSourceTest {
+
+ private static final LoggerIf LOG = Logging.getLogger(LexerSourceTest.class);
+
+ public static void testLexerSource(final String in, final boolean textmatch, final int... out)
+ throws Exception {
+ LOG.info("Testing '" + in + "' => "
+ + Arrays.toString(out));
+ final StringLexerSource s = new StringLexerSource(in);
+
+ final StringBuilder buf = new StringBuilder();
+ for (int i = 0; i < out.length; i++) {
+ final Token tok = s.token();
+ LOG.info("Token is " + tok);
+ assertType(out[i], tok);
+ // assertEquals(col, tok.getColumn());
+ buf.append(tok.getText());
+ }
+
+ final Token tok = s.token();
+ LOG.info("Token is " + tok);
+ assertType(EOF, tok);
+
+ if (textmatch)
+ assertEquals(in, buf.toString());
+ }
+
+ @Test
+ public void testLexerSource()
+ throws Exception {
+
+ testLexerSource("int a = 5;", true,
+ IDENTIFIER, WHITESPACE, IDENTIFIER, WHITESPACE,
+ '=', WHITESPACE, NUMBER, ';'
+ );
+
+ // \n is WHITESPACE because ppvalid = false
+ testLexerSource("# # \r\n\n\r \rfoo", true,
+ HASH, WHITESPACE, '#', WHITESPACE, IDENTIFIER
+ );
+
+ // No match - trigraphs
+ testLexerSource("%:%:", false, PASTE);
+ testLexerSource("%:?", false, '#', '?');
+ testLexerSource("%:%=", false, '#', MOD_EQ);
+
+ testLexerSource("0x1234ffdUL 0765I", true,
+ NUMBER, WHITESPACE, NUMBER);
+
+ testLexerSource("+= -= *= /= %= <= >= >>= <<= &= |= ^= x", true,
+ PLUS_EQ, WHITESPACE,
+ SUB_EQ, WHITESPACE,
+ MULT_EQ, WHITESPACE,
+ DIV_EQ, WHITESPACE,
+ MOD_EQ, WHITESPACE,
+ LE, WHITESPACE,
+ GE, WHITESPACE,
+ RSH_EQ, WHITESPACE,
+ LSH_EQ, WHITESPACE,
+ AND_EQ, WHITESPACE,
+ OR_EQ, WHITESPACE,
+ XOR_EQ, WHITESPACE,
+ IDENTIFIER);
+
+ testLexerSource("/**/", true, CCOMMENT);
+ testLexerSource("/* /**/ */", true, CCOMMENT, WHITESPACE, '*', '/');
+ testLexerSource("/** ** **/", true, CCOMMENT);
+ testLexerSource("//* ** **/", true, CPPCOMMENT);
+ testLexerSource("'\\r' '\\xf' '\\xff' 'x' 'aa' ''", true,
+ CHARACTER, WHITESPACE,
+ CHARACTER, WHITESPACE,
+ CHARACTER, WHITESPACE,
+ CHARACTER, WHITESPACE,
+ SQSTRING, WHITESPACE,
+ SQSTRING);
+
+ if (false) // Actually, I think this is illegal.
+ testLexerSource("1i1I1l1L1ui1ul", true,
+ NUMBER, NUMBER,
+ NUMBER, NUMBER,
+ NUMBER, NUMBER);
+
+ testLexerSource("'' 'x' 'xx'", true,
+ SQSTRING, WHITESPACE, CHARACTER, WHITESPACE, SQSTRING);
+ }
+
+ @Test
+ public void testNumbers() throws Exception {
+ testLexerSource("0", true, NUMBER);
+ testLexerSource("045", true, NUMBER);
+ testLexerSource("45", true, NUMBER);
+ testLexerSource("0.45", true, NUMBER);
+ testLexerSource("1.45", true, NUMBER);
+ testLexerSource("1e6", true, NUMBER);
+ testLexerSource("1.45e6", true, NUMBER);
+ testLexerSource(".45e6", true, NUMBER);
+ testLexerSource("-6", true, '-', NUMBER);
+ }
+
+ @Test
+ public void testNumbersSuffix() throws Exception {
+ testLexerSource("6f", true, NUMBER);
+ testLexerSource("6d", true, NUMBER);
+ testLexerSource("6l", true, NUMBER);
+ testLexerSource("6ll", true, NUMBER);
+ testLexerSource("6ul", true, NUMBER);
+ testLexerSource("6ull", true, NUMBER);
+ testLexerSource("6e3f", true, NUMBER);
+ testLexerSource("6e3d", true, NUMBER);
+ testLexerSource("6e3l", true, NUMBER);
+ testLexerSource("6e3ll", true, NUMBER);
+ testLexerSource("6e3ul", true, NUMBER);
+ testLexerSource("6e3ull", true, NUMBER);
+ }
+
+ @Test
+ public void testNumbersInvalid() throws Exception {
+ // testLexerSource("0x foo", true, INVALID, WHITESPACE, IDENTIFIER); // FAIL
+ testLexerSource("6x foo", true, INVALID, WHITESPACE, IDENTIFIER);
+ testLexerSource("6g foo", true, INVALID, WHITESPACE, IDENTIFIER);
+ testLexerSource("6xsd foo", true, INVALID, WHITESPACE, IDENTIFIER);
+ testLexerSource("6gsd foo", true, INVALID, WHITESPACE, IDENTIFIER);
+ }
+
+ @Test
+ public void testUnterminatedComment() throws Exception {
+ testLexerSource("5 /*", false, NUMBER, WHITESPACE, INVALID); // Bug #15
+ testLexerSource("5 //", false, NUMBER, WHITESPACE, CPPCOMMENT);
+ }
+}