blob: 1eba25869ccdc8c30de21455695966dcaa60651d [file] [log] [blame]
#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());
}
}