#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()); } }