summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/gtest/CMakeLists.txt2
-rw-r--r--test/gtest/wat-parser.cpp348
2 files changed, 350 insertions, 0 deletions
diff --git a/test/gtest/CMakeLists.txt b/test/gtest/CMakeLists.txt
index c58827a21..6a58debbf 100644
--- a/test/gtest/CMakeLists.txt
+++ b/test/gtest/CMakeLists.txt
@@ -1,7 +1,9 @@
include_directories(../../third_party/googletest/googletest/include)
+include_directories(../../src/wasm)
set(unittest_SOURCES
type-builder.cpp
+ wat-parser.cpp
)
binaryen_add_executable(binaryen-unittests "${unittest_SOURCES}")
diff --git a/test/gtest/wat-parser.cpp b/test/gtest/wat-parser.cpp
new file mode 100644
index 000000000..1eba25869
--- /dev/null
+++ b/test/gtest/wat-parser.cpp
@@ -0,0 +1,348 @@
+#include "gtest/gtest.h"
+
+#include "wat-parser-internal.h"
+
+using namespace wasm::WATParser;
+
+TEST(ParserTest, LexWhitespace) {
+ Token one{"1"sv, IntTok{1, Unsigned}};
+ Token two{"2"sv, IntTok{2, Unsigned}};
+ Token three{"3"sv, IntTok{3, Unsigned}};
+ Token four{"4"sv, IntTok{4, Unsigned}};
+ Token five{"5"sv, IntTok{5, Unsigned}};
+
+ Lexer lexer(" 1\t2\n3\r4 \n\n\t 5 "sv);
+
+ auto it = lexer.begin();
+ ASSERT_NE(it, lexer.end());
+ Token t1 = *it++;
+ ASSERT_NE(it, lexer.end());
+ Token t2 = *it++;
+ ASSERT_NE(it, lexer.end());
+ Token t3 = *it++;
+ ASSERT_NE(it, lexer.end());
+ Token t4 = *it++;
+ ASSERT_NE(it, lexer.end());
+ Token t5 = *it++;
+ EXPECT_EQ(it, lexer.end());
+
+ EXPECT_EQ(t1, one);
+ EXPECT_EQ(t2, two);
+ EXPECT_EQ(t3, three);
+ EXPECT_EQ(t4, four);
+ EXPECT_EQ(t5, five);
+
+ EXPECT_EQ(lexer.position(t1), (TextPos{1, 1}));
+ EXPECT_EQ(lexer.position(t2), (TextPos{1, 3}));
+ EXPECT_EQ(lexer.position(t3), (TextPos{2, 0}));
+ EXPECT_EQ(lexer.position(t4), (TextPos{2, 2}));
+ EXPECT_EQ(lexer.position(t5), (TextPos{4, 2}));
+}
+
+TEST(ParserTest, LexLineComment) {
+ Token one{"1"sv, IntTok{1, Unsigned}};
+ Token six{"6"sv, IntTok{6, Unsigned}};
+
+ Lexer lexer("1;; whee! 2 3\t4\r5\n6"sv);
+
+ auto it = lexer.begin();
+ Token t1 = *it++;
+ ASSERT_NE(it, lexer.end());
+ Token t2 = *it++;
+ EXPECT_EQ(it, lexer.end());
+
+ EXPECT_EQ(t1, one);
+ EXPECT_EQ(t2, six);
+
+ EXPECT_EQ(lexer.position(t1), (TextPos{1, 0}));
+ EXPECT_EQ(lexer.position(t2), (TextPos{2, 0}));
+}
+
+TEST(ParserTest, LexBlockComment) {
+ Token one{"1"sv, IntTok{1, Unsigned}};
+ Token six{"6"sv, IntTok{6, Unsigned}};
+
+ Lexer lexer("1(; whoo! 2\n (; \n3\n ;) 4 (;) 5 ;) \n;)6"sv);
+
+ auto it = lexer.begin();
+ Token t1 = *it++;
+ ASSERT_NE(it, lexer.end());
+ Token t2 = *it++;
+ EXPECT_EQ(it, lexer.end());
+
+ EXPECT_EQ(t1, one);
+ EXPECT_EQ(t2, six);
+
+ EXPECT_EQ(lexer.position(t1), (TextPos{1, 0}));
+ EXPECT_EQ(lexer.position(t2), (TextPos{5, 2}));
+}
+
+TEST(ParserTest, LexParens) {
+ Token left{"("sv, LParenTok{}};
+ Token right{")"sv, RParenTok{}};
+
+ Lexer lexer("(())"sv);
+
+ auto it = lexer.begin();
+ ASSERT_NE(it, lexer.end());
+ Token t1 = *it++;
+ ASSERT_NE(it, lexer.end());
+ Token t2 = *it++;
+ ASSERT_NE(it, lexer.end());
+ Token t3 = *it++;
+ ASSERT_NE(it, lexer.end());
+ Token t4 = *it++;
+ EXPECT_EQ(it, lexer.end());
+
+ EXPECT_EQ(t1, left);
+ EXPECT_EQ(t2, left);
+ EXPECT_EQ(t3, right);
+ EXPECT_EQ(t4, right);
+}
+
+TEST(ParserTest, LexInt) {
+ {
+ Lexer lexer("0"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"0"sv, IntTok{0, Unsigned}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("+0"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"+0"sv, IntTok{0, Signed}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("-0"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"-0"sv, IntTok{0, Signed}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("1"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"1"sv, IntTok{1, Unsigned}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("+1"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"+1"sv, IntTok{1, Signed}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("-1"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"-1"sv, IntTok{-1ull, Signed}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("0010"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"0010"sv, IntTok{10, Unsigned}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("+0010"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"+0010"sv, IntTok{10, Signed}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("-0010"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"-0010"sv, IntTok{-10ull, Signed}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("9999"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"9999"sv, IntTok{9999, Unsigned}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("+9999"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"+9999"sv, IntTok{9999, Signed}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("-9999"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"-9999"sv, IntTok{-9999ull, Signed}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("12_34"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"12_34"sv, IntTok{1234, Unsigned}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("1_2_3_4"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"1_2_3_4"sv, IntTok{1234, Unsigned}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("_1234"sv);
+ EXPECT_EQ(lexer, lexer.end());
+ }
+ {
+ Lexer lexer("1234_"sv);
+ EXPECT_EQ(lexer, lexer.end());
+ }
+ {
+ Lexer lexer("12__34"sv);
+ EXPECT_EQ(lexer, lexer.end());
+ }
+ {
+ Lexer lexer("12cd56"sv);
+ EXPECT_EQ(lexer, lexer.end());
+ }
+ {
+ Lexer lexer("18446744073709551615"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"18446744073709551615"sv, IntTok{-1ull, Unsigned}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ // 64-bit unsigned overflow!
+ Lexer lexer("18446744073709551616");
+ EXPECT_EQ(lexer, lexer.end());
+ }
+ {
+ Lexer lexer("+9223372036854775807"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"+9223372036854775807"sv, IntTok{~(1ull << 63), Signed}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ // 64-bit signed overflow!
+ Lexer lexer("+9223372036854775808"sv);
+ EXPECT_EQ(lexer, lexer.end());
+ }
+ {
+ Lexer lexer("-9223372036854775808"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"-9223372036854775808"sv, IntTok{1ull << 63, Signed}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ // 64-bit signed underflow!
+ Lexer lexer("-9223372036854775809"sv);
+ EXPECT_EQ(lexer, lexer.end());
+ }
+}
+
+TEST(ParserTest, LexHexInt) {
+ {
+ Lexer lexer("0x0"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"0x0"sv, IntTok{0, Unsigned}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("+0x0"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"+0x0"sv, IntTok{0, Signed}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("-0x0"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"-0x0"sv, IntTok{0, Signed}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("0x1"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"0x1"sv, IntTok{1, Unsigned}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("+0x1"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"+0x1"sv, IntTok{1, Signed}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("-0x1"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"-0x1"sv, IntTok{-1ull, Signed}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("0x0010"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"0x0010"sv, IntTok{16, Unsigned}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("+0x0010"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"+0x0010"sv, IntTok{16, Signed}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("-0x0010"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"-0x0010"sv, IntTok{-16ull, Signed}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("0xabcdef"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"0xabcdef"sv, IntTok{0xabcdef, Unsigned}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("+0xABCDEF"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"+0xABCDEF"sv, IntTok{0xabcdef, Signed}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("-0xAbCdEf"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"-0xAbCdEf"sv, IntTok{-0xabcdefull, Signed}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("0x12_34"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"0x12_34"sv, IntTok{0x1234, Unsigned}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("0x1_2_3_4"sv);
+ ASSERT_NE(lexer, lexer.end());
+ Token expected{"0x1_2_3_4"sv, IntTok{0x1234, Unsigned}};
+ EXPECT_EQ(*lexer, expected);
+ }
+ {
+ Lexer lexer("_0x1234"sv);
+ EXPECT_EQ(lexer, lexer.end());
+ }
+ {
+ Lexer lexer("0x_1234"sv);
+ EXPECT_EQ(lexer, lexer.end());
+ }
+ {
+ Lexer lexer("0x1234_"sv);
+ EXPECT_EQ(lexer, lexer.end());
+ }
+ {
+ Lexer lexer("0x12__34"sv);
+ EXPECT_EQ(lexer, lexer.end());
+ }
+ {
+ Lexer lexer("0xg"sv);
+ EXPECT_EQ(lexer, lexer.end());
+ }
+ {
+ Lexer lexer("0x120x34"sv);
+ EXPECT_EQ(lexer, lexer.end());
+ }
+}