|
@@ -0,0 +1,143 @@
|
|
|
+#include "Token.h"
|
|
|
+
|
|
|
+#include <gtest/gtest.h>
|
|
|
+
|
|
|
+#include <sstream>
|
|
|
+#include <string>
|
|
|
+using namespace std::literals::string_literals;
|
|
|
+
|
|
|
+namespace forth {
|
|
|
+
|
|
|
+TEST(TokenTests, NumberToken)
|
|
|
+{
|
|
|
+ auto const testValue = 42;
|
|
|
+
|
|
|
+ Token const tok{token::Number{testValue}};
|
|
|
+ EXPECT_TRUE(tok.IsNumber());
|
|
|
+ EXPECT_FALSE(tok.IsKeyword());
|
|
|
+ EXPECT_FALSE(tok.IsWord());
|
|
|
+
|
|
|
+ EXPECT_EQ(tok.GetNumber().value, testValue);
|
|
|
+ EXPECT_THROW(tok.GetKeyword(), WrongTokenException);
|
|
|
+ EXPECT_THROW(tok.GetWord(), WrongTokenException);
|
|
|
+
|
|
|
+ Token const tok2{tok};
|
|
|
+ EXPECT_EQ(tok, tok2);
|
|
|
+
|
|
|
+ std::ostringstream strm;
|
|
|
+ strm << tok;
|
|
|
+ EXPECT_EQ(strm.str(), "Number[42]"s);
|
|
|
+}
|
|
|
+
|
|
|
+TEST(TokenTests, KeywordToken)
|
|
|
+{
|
|
|
+ auto const testValue = ":"s;
|
|
|
+
|
|
|
+ Token const tok{token::Keyword{testValue}};
|
|
|
+ EXPECT_FALSE(tok.IsNumber());
|
|
|
+ EXPECT_TRUE(tok.IsKeyword());
|
|
|
+ EXPECT_FALSE(tok.IsWord());
|
|
|
+
|
|
|
+ EXPECT_THROW(tok.GetNumber(), WrongTokenException);
|
|
|
+ EXPECT_EQ(tok.GetKeyword().value, testValue);
|
|
|
+ EXPECT_THROW(tok.GetWord(), WrongTokenException);
|
|
|
+
|
|
|
+ Token const tok2{tok};
|
|
|
+ EXPECT_EQ(tok, tok2);
|
|
|
+
|
|
|
+ std::ostringstream strm;
|
|
|
+ strm << tok;
|
|
|
+ EXPECT_EQ(strm.str(), "Keyword[\":\"]"s);
|
|
|
+}
|
|
|
+
|
|
|
+TEST(TokenTests, WordToken)
|
|
|
+{
|
|
|
+ auto const testValue = "DUP"s;
|
|
|
+
|
|
|
+ Token const tok{token::Word{testValue}};
|
|
|
+ EXPECT_FALSE(tok.IsNumber());
|
|
|
+ EXPECT_FALSE(tok.IsKeyword());
|
|
|
+ EXPECT_TRUE(tok.IsWord());
|
|
|
+
|
|
|
+ EXPECT_THROW(tok.GetNumber(), WrongTokenException);
|
|
|
+ EXPECT_THROW(tok.GetKeyword(), WrongTokenException);
|
|
|
+ EXPECT_EQ(tok.GetWord().value, testValue);
|
|
|
+
|
|
|
+ Token const tok2{tok};
|
|
|
+ EXPECT_EQ(tok, tok2);
|
|
|
+
|
|
|
+ std::ostringstream strm;
|
|
|
+ strm << tok;
|
|
|
+ EXPECT_EQ(strm.str(), "Word[\"DUP\"]"s);
|
|
|
+}
|
|
|
+
|
|
|
+TEST(TokenTests, SelfAssignments)
|
|
|
+{
|
|
|
+ auto const testValue = 42;
|
|
|
+
|
|
|
+ Token tok{token::Number{testValue}};
|
|
|
+ tok = tok;
|
|
|
+ EXPECT_EQ(tok.GetNumber().value, testValue);
|
|
|
+ tok = std::move(tok);
|
|
|
+ EXPECT_EQ(tok.GetNumber().value, testValue);
|
|
|
+}
|
|
|
+
|
|
|
+TEST(TokenTests, MoveConstructions)
|
|
|
+{
|
|
|
+ auto const numVal = 42;
|
|
|
+ Token numTok{token::Number{numVal}};
|
|
|
+ Token const numTok2{std::move(numTok)};
|
|
|
+ EXPECT_EQ(numTok, numTok2);
|
|
|
+
|
|
|
+ auto const keywordVal = ":"s;
|
|
|
+ Token keywordTok{token::Keyword{keywordVal}};
|
|
|
+ Token const keywordTok2{std::move(keywordTok)};
|
|
|
+ EXPECT_EQ(keywordTok.GetKeyword().value, ""s);
|
|
|
+ EXPECT_EQ(keywordTok2.GetKeyword().value, keywordVal);
|
|
|
+
|
|
|
+ auto const wordVal = "DUP"s;
|
|
|
+ Token wordTok{token::Word{wordVal}};
|
|
|
+ Token const wordTok2{std::move(wordTok)};
|
|
|
+ EXPECT_EQ(wordTok.GetWord().value, ""s);
|
|
|
+ EXPECT_EQ(wordTok2.GetWord().value, wordVal);
|
|
|
+}
|
|
|
+
|
|
|
+TEST(TokenTests, Assignments)
|
|
|
+{
|
|
|
+ Token target{token::Number{0}};
|
|
|
+
|
|
|
+ auto const numVal = 42;
|
|
|
+ Token numTok{token::Number{numVal}};
|
|
|
+ target = numTok;
|
|
|
+ EXPECT_EQ(target, numTok);
|
|
|
+ target = std::move(numTok);
|
|
|
+ EXPECT_EQ(target, numTok);
|
|
|
+
|
|
|
+ auto const keywordVal = ":"s;
|
|
|
+ Token keywordTok{token::Keyword{keywordVal}};
|
|
|
+ target = keywordTok;
|
|
|
+ EXPECT_EQ(target, keywordTok);
|
|
|
+ target = std::move(keywordTok);
|
|
|
+ EXPECT_EQ(keywordTok.GetKeyword().value, ""s);
|
|
|
+ EXPECT_EQ(target.GetKeyword().value, keywordVal);
|
|
|
+
|
|
|
+ auto const wordVal = "DUP"s;
|
|
|
+ Token wordTok{token::Word{wordVal}};
|
|
|
+ target = wordTok;
|
|
|
+ EXPECT_EQ(target, wordTok);
|
|
|
+ target = std::move(wordTok);
|
|
|
+ EXPECT_EQ(wordTok.GetWord().value, ""s);
|
|
|
+ EXPECT_EQ(target.GetWord().value, wordVal);
|
|
|
+}
|
|
|
+
|
|
|
+TEST(TokenTests, DifferentTypeComparison)
|
|
|
+{
|
|
|
+ Token const numTok{token::Number{42}};
|
|
|
+ Token const keywordTok{token::Keyword{":"s}};
|
|
|
+ Token const wordTok{token::Word{"DUP"s}};
|
|
|
+ EXPECT_NE(numTok, keywordTok);
|
|
|
+ EXPECT_NE(keywordTok, wordTok);
|
|
|
+ EXPECT_NE(wordTok, numTok);
|
|
|
+}
|
|
|
+
|
|
|
+} // namespace forth
|