166 lines
5.4 KiB
C++
166 lines
5.4 KiB
C++
#include <gtest/gtest.h>
|
|
#include <yycc.hpp>
|
|
#include <yycc/carton/lexer61.hpp>
|
|
|
|
#define LEXER61 ::yycc::carton::lexer61
|
|
|
|
namespace yycctest::carton::lexer61 {
|
|
|
|
TEST(CartonLexer61, EmptyCommand) {
|
|
LEXER61::Lexer61 lexer;
|
|
auto result = lexer.lex(u8"");
|
|
ASSERT_TRUE(result.has_value());
|
|
|
|
auto value = std::move(result.value());
|
|
EXPECT_TRUE(value.empty());
|
|
}
|
|
|
|
TEST(CartonLexer61, SingleArgument) {
|
|
LEXER61::Lexer61 lexer;
|
|
auto result = lexer.lex(u8"program");
|
|
ASSERT_TRUE(result.has_value());
|
|
|
|
auto value = std::move(result.value());
|
|
ASSERT_EQ(value.size(), 1);
|
|
EXPECT_EQ(value[0], u8"program");
|
|
}
|
|
|
|
TEST(CartonLexer61, MultipleArguments) {
|
|
LEXER61::Lexer61 lexer;
|
|
auto result = lexer.lex(u8"program arg1 arg2 arg3");
|
|
ASSERT_TRUE(result.has_value());
|
|
|
|
auto value = std::move(result.value());
|
|
ASSERT_EQ(value.size(), 4);
|
|
EXPECT_EQ(value[0], u8"program");
|
|
EXPECT_EQ(value[1], u8"arg1");
|
|
EXPECT_EQ(value[2], u8"arg2");
|
|
EXPECT_EQ(value[3], u8"arg3");
|
|
}
|
|
|
|
TEST(CartonLexer61, LeadingSpaces) {
|
|
LEXER61::Lexer61 lexer;
|
|
auto result = lexer.lex(u8" program arg");
|
|
ASSERT_TRUE(result.has_value());
|
|
|
|
auto value = std::move(result.value());
|
|
ASSERT_EQ(value.size(), 2);
|
|
EXPECT_EQ(value[0], u8"program");
|
|
EXPECT_EQ(value[1], u8"arg");
|
|
}
|
|
|
|
TEST(CartonLexer61, TrailingSpaces) {
|
|
LEXER61::Lexer61 lexer;
|
|
auto result = lexer.lex(u8"program arg ");
|
|
ASSERT_TRUE(result.has_value());
|
|
|
|
auto value = std::move(result.value());
|
|
ASSERT_EQ(value.size(), 2);
|
|
EXPECT_EQ(value[0], u8"program");
|
|
EXPECT_EQ(value[1], u8"arg");
|
|
}
|
|
|
|
TEST(CartonLexer61, EmbeddedSpaces) {
|
|
LEXER61::Lexer61 lexer;
|
|
auto result = lexer.lex(u8"program arg1 arg2");
|
|
ASSERT_TRUE(result.has_value());
|
|
|
|
auto value = std::move(result.value());
|
|
ASSERT_EQ(value.size(), 3);
|
|
EXPECT_EQ(value[0], u8"program");
|
|
EXPECT_EQ(value[1], u8"arg1");
|
|
EXPECT_EQ(value[2], u8"arg2");
|
|
}
|
|
|
|
TEST(CartonLexer61, SingleQuotedArgs) {
|
|
LEXER61::Lexer61 lexer;
|
|
auto result = lexer.lex(u8"program 'arg with spaces' arg2");
|
|
ASSERT_TRUE(result.has_value());
|
|
|
|
auto value = std::move(result.value());
|
|
ASSERT_EQ(value.size(), 3);
|
|
EXPECT_EQ(value[0], u8"program");
|
|
EXPECT_EQ(value[1], u8"arg with spaces");
|
|
EXPECT_EQ(value[2], u8"arg2");
|
|
}
|
|
|
|
TEST(CartonLexer61, DoubleQuotedArgs) {
|
|
LEXER61::Lexer61 lexer;
|
|
auto result = lexer.lex(u8R"(program "arg with spaces" arg2)");
|
|
ASSERT_TRUE(result.has_value());
|
|
|
|
auto value = std::move(result.value());
|
|
ASSERT_EQ(value.size(), 3);
|
|
EXPECT_EQ(value[0], u8"program");
|
|
EXPECT_EQ(value[1], u8"arg with spaces");
|
|
EXPECT_EQ(value[2], u8"arg2");
|
|
}
|
|
|
|
TEST(CartonLexer61, MixedQuotes) {
|
|
LEXER61::Lexer61 lexer;
|
|
auto result = lexer.lex(u8R"(program "double quoted 'single inside'" 'single quoted "double inside"')");
|
|
ASSERT_TRUE(result.has_value());
|
|
|
|
auto value = std::move(result.value());
|
|
ASSERT_EQ(value.size(), 3);
|
|
EXPECT_EQ(value[0], u8"program");
|
|
EXPECT_EQ(value[1], u8"double quoted 'single inside'");
|
|
EXPECT_EQ(value[2], u8"single quoted \"double inside\"");
|
|
}
|
|
|
|
TEST(CartonLexer61, EscapedCharacters) {
|
|
LEXER61::Lexer61 lexer;
|
|
auto result = lexer.lex(u8R"(program escaped\ space "quoted with \" quote" 'single with \' quote')");
|
|
ASSERT_TRUE(result.has_value());
|
|
|
|
auto value = std::move(result.value());
|
|
ASSERT_EQ(value.size(), 4);
|
|
EXPECT_EQ(value[0], u8"program");
|
|
EXPECT_EQ(value[1], u8"escaped space");
|
|
EXPECT_EQ(value[2], u8"quoted with \" quote");
|
|
EXPECT_EQ(value[3], u8"single with \' quote");
|
|
}
|
|
|
|
TEST(CartonLexer61, ChineseCharacters) {
|
|
LEXER61::Lexer61 lexer;
|
|
auto result = lexer.lex(u8"程序 中文 参数");
|
|
ASSERT_TRUE(result.has_value());
|
|
|
|
auto value = std::move(result.value());
|
|
ASSERT_EQ(value.size(), 3);
|
|
EXPECT_EQ(value[0], u8"程序");
|
|
EXPECT_EQ(value[1], u8"中文");
|
|
EXPECT_EQ(value[2], u8"参数");
|
|
}
|
|
|
|
TEST(CartonLexer61, ChineseWithQuotes) {
|
|
LEXER61::Lexer61 lexer;
|
|
auto result = lexer.lex(u8R"(程序 "中文 参数" '另一个"引号"参数')");
|
|
ASSERT_TRUE(result.has_value());
|
|
|
|
auto value = std::move(result.value());
|
|
ASSERT_EQ(value.size(), 3);
|
|
EXPECT_EQ(value[0], u8"程序");
|
|
EXPECT_EQ(value[1], u8"中文 参数");
|
|
EXPECT_EQ(value[2], u8"另一个\"引号\"参数");
|
|
}
|
|
|
|
TEST(CartonLexer61, UnclosedQuoteError) {
|
|
LEXER61::Lexer61 lexer;
|
|
auto result = lexer.lex(u8R"(program "unclosed quote)");
|
|
ASSERT_FALSE(result.has_value());
|
|
}
|
|
|
|
TEST(CartonLexer61, EmptyArgumentInQuotes) {
|
|
LEXER61::Lexer61 lexer;
|
|
auto result = lexer.lex(u8R"(program "" '')");
|
|
ASSERT_TRUE(result.has_value());
|
|
|
|
auto value = std::move(result.value());
|
|
ASSERT_EQ(value.size(), 3);
|
|
EXPECT_EQ(value[0], u8"program");
|
|
EXPECT_EQ(value[1], u8"");
|
|
EXPECT_EQ(value[2], u8"");
|
|
}
|
|
|
|
} // namespace yycctest::carton::lexer61
|