From 6017b4133e805253412758327f0b7224e31c1320 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Mon, 29 Jul 2019 12:31:44 +0200
Subject: [PATCH] Add tests for ASTNodeDeclarationCleaner

---
 tests/CMakeLists.txt                     |  1 +
 tests/test_ASTNodeDeclarationCleaner.cpp | 98 ++++++++++++++++++++++++
 2 files changed, 99 insertions(+)
 create mode 100644 tests/test_ASTNodeDeclarationCleaner.cpp

diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 235e13153..c30308bbf 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -10,6 +10,7 @@ add_executable (unit_tests
   test_ASTNodeDataType.cpp
   test_ASTNodeDataTypeBuilder.cpp
   test_ASTNodeDataTypeChecker.cpp
+  test_ASTNodeDeclarationCleaner.cpp
   test_ASTNodeDeclarationToAffectationConverter.cpp
   test_ASTNodeJumpPlacementChecker.cpp
   test_ASTNodeValueBuilder.cpp
diff --git a/tests/test_ASTNodeDeclarationCleaner.cpp b/tests/test_ASTNodeDeclarationCleaner.cpp
new file mode 100644
index 000000000..03c46fff4
--- /dev/null
+++ b/tests/test_ASTNodeDeclarationCleaner.cpp
@@ -0,0 +1,98 @@
+#include <catch2/catch.hpp>
+
+#include <ASTNodeValueBuilder.hpp>
+
+#include <ASTBuilder.hpp>
+#include <ASTNodeDataTypeBuilder.hpp>
+
+#include <ASTNodeDeclarationCleaner.hpp>
+
+#include <ASTSymbolTableBuilder.hpp>
+
+#include <ASTPrinter.hpp>
+
+#define CHECK_AST(data, expected_output)                                                       \
+  {                                                                                            \
+    static_assert(std::is_same_v<std::decay_t<decltype(data)>, std::string_view>);             \
+    static_assert(std::is_same_v<std::decay_t<decltype(expected_output)>, std::string_view>);  \
+                                                                                               \
+    string_input input{data, "test.pgs"};                                                      \
+    auto ast = ASTBuilder::build(input);                                                       \
+                                                                                               \
+    ASTSymbolTableBuilder{*ast};                                                               \
+    ASTNodeDataTypeBuilder{*ast};                                                              \
+    ASTNodeValueBuilder{*ast};                                                                 \
+                                                                                               \
+    ASTNodeDeclarationCleaner{*ast};                                                           \
+                                                                                               \
+    std::stringstream ast_output;                                                              \
+    ast_output << '\n' << ASTPrinter{*ast, ASTPrinter::Format::raw, {ASTPrinter::Info::none}}; \
+                                                                                               \
+    REQUIRE(ast_output.str() == expected_output);                                              \
+  }
+
+TEST_CASE("ASTNodeDeclarationCleaner", "[language]")
+{
+  SECTION("no declaration")
+  {
+    std::string_view data = R"(
+cout << "two=" << 2 << "\n";
+)";
+
+    std::string_view result = R"(
+(root)
+ `-(language::cout_kw)
+     +-(language::literal:"two=")
+     +-(language::integer:2)
+     `-(language::literal:"\n")
+)";
+
+    CHECK_AST(data, result);
+  }
+
+  SECTION("single declaration")
+  {
+    std::string_view data = R"(
+R z;
+z = 1;
+)";
+
+    std::string_view result = R"(
+(root)
+ `-(language::eq_op)
+     +-(language::name:z)
+     `-(language::integer:1)
+)";
+
+    CHECK_AST(data, result);
+  }
+
+  SECTION("multiple declaration")
+  {
+    std::string_view data = R"(
+Z z;
+z = 1;
+if (true) {
+  R x;
+  x = 0.5 *z;
+}
+)";
+
+    std::string_view result = R"(
+(root)
+ +-(language::eq_op)
+ |   +-(language::name:z)
+ |   `-(language::integer:1)
+ `-(language::if_statement)
+     +-(language::true_kw)
+     `-(language::bloc)
+         `-(language::eq_op)
+             +-(language::name:x)
+             `-(language::multiply_op)
+                 +-(language::real:0.5)
+                 `-(language::name:z)
+)";
+
+    CHECK_AST(data, result);
+  }
+}
-- 
GitLab