|
@@ -0,0 +1,69 @@
|
|
|
+#include "ForthEvaluator.h"
|
|
|
+
|
|
|
+#include <gtest/gtest.h>
|
|
|
+
|
|
|
+#include <cstdint>
|
|
|
+#include <string>
|
|
|
+#include <vector>
|
|
|
+
|
|
|
+using namespace std::literals::string_literals;
|
|
|
+
|
|
|
+namespace forth {
|
|
|
+
|
|
|
+TEST(ForthEvaluatorTests, SplittingEmptyStringYieldsEmptyVector)
|
|
|
+{
|
|
|
+ std::vector<std::string> const vec = splitAtWhiteSpace(""s);
|
|
|
+ EXPECT_TRUE(vec.empty());
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ForthEvaluatorTests, SplittingStringWithoutWhiteSpacesYieldsVectorWithOneEntry)
|
|
|
+{
|
|
|
+ std::vector<std::string> const vec = splitAtWhiteSpace("test"s);
|
|
|
+ ASSERT_EQ(vec.size(), 1U);
|
|
|
+ EXPECT_EQ(vec[0], "test"s);
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ForthEvaluatorTests, SplittingStringWithWhiteSpacesYieldsVectorWithTwoEntries)
|
|
|
+{
|
|
|
+ std::vector<std::string> const vec = splitAtWhiteSpace("ab cd"s);
|
|
|
+ EXPECT_EQ(vec, (std::vector<std::string>{"ab"s, "cd"s}));
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ForthEvaluatorTests, SplittingStringWithTwoWhiteSpacesYieldsVectorWithThreeEntries)
|
|
|
+{
|
|
|
+ std::vector<std::string> const vec = splitAtWhiteSpace("ab cd ef"s);
|
|
|
+ EXPECT_EQ(vec, (std::vector<std::string>{"ab"s, "cd"s, "ef"s}));
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ForthEvaluatorTests, EvaluatingEmptyStringYieldsEmptyStack)
|
|
|
+{
|
|
|
+ std::vector<std::int16_t> const stack = evaluate(""s);
|
|
|
+ EXPECT_TRUE(stack.empty());
|
|
|
+}
|
|
|
+
|
|
|
+using ForthEvaluatorTests_ParseSingleNumber = testing::TestWithParam<std::int16_t>;
|
|
|
+
|
|
|
+TEST_P(ForthEvaluatorTests_ParseSingleNumber, EvaluatingStringWithNumberYieldsStackWithNumber)
|
|
|
+{
|
|
|
+ auto const value = GetParam();
|
|
|
+ std::vector<std::int16_t> const stack = evaluate(std::to_string(value));
|
|
|
+ ASSERT_EQ(stack.size(), 1U);
|
|
|
+ EXPECT_EQ(stack[0], value);
|
|
|
+}
|
|
|
+
|
|
|
+INSTANTIATE_TEST_SUITE_P(ForthEvaluatorTests_ParseSingleNumber,
|
|
|
+ ForthEvaluatorTests_ParseSingleNumber, testing::Values(23, 42, 1337, 4711));
|
|
|
+
|
|
|
+TEST(ForthEvaluatorTests, EvaluatingStringWithNumbersYieldsStackWithNumbers)
|
|
|
+{
|
|
|
+ std::vector<std::int16_t> const stack = evaluate("23 42 1337"s);
|
|
|
+ EXPECT_EQ(stack, (std::vector<std::int16_t>{23, 42, 1337}));
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ForthEvaluatorTests, EvaluatingStringsWithValidKeyword)
|
|
|
+{
|
|
|
+ std::vector<std::int16_t> const stack = evaluate("23 12 DROP"s);
|
|
|
+ EXPECT_EQ(stack, (std::vector<std::int16_t>{23}));
|
|
|
+}
|
|
|
+
|
|
|
+} // namespace forth
|