Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commit90d86e8072e7246374076961a26cfd1024ac67f7 (patch)
Author
 Syndamia <kamen@syndamia.com>
2023-02-08 11:47:28 +0200
Committer
 Syndamia <kamen@syndamia.com>
2023-02-08 11:47:28 +0200
Files719516c34cede6fcf9580fce31da43a74122700c
uni-projects-90d86e8072e7246374076961a26cfd1024ac67f7.tar
uni-projects-90d86e8072e7246374076961a26cfd1024ac67f7.tar.gz
uni-projects-90d86e8072e7246374076961a26cfd1024ac67f7.zip
Parent90bf4e3fd851087a3cfc68dbfa1e8ae5c38d0456 (diff)
[IPL/T] Added more LLVMVisitor tests, added LLVMVisitorReturn and Register tests
diff --git a/Year 2/Implementation of Programming Languages/Transpiler/tests/Tests_ALL.cpp b/Year 2/Implementation of Programming Languages/Transpiler/tests/Tests_ALL.cpp
index 912917c..f1c0c0f 100644
--- a/Year 2/Implementation of Programming Languages/Transpiler/tests/Tests_ALL.cpp
+++ b/Year 2/Implementation of Programming Languages/Transpiler/tests/Tests_ALL.cpp
@@ -2,3 +2,5 @@
#include "doctest/doctest/doctest.h"
#include "Tests_LLVMVisitor.h"
+#include "Tests_Register.h"
+#include "Tests_LLVMVisitorReturn.h"
diff --git a/Year 2/Implementation of Programming Languages/Transpiler/tests/Tests_LLVMVisitor.h b/Year 2/Implementation of Programming Languages/Transpiler/tests/Tests_LLVMVisitor.h
index a9502a7..2210b9c 100644
--- a/Year 2/Implementation of Programming Languages/Transpiler/tests/Tests_LLVMVisitor.h
+++ b/Year 2/Implementation of Programming Languages/Transpiler/tests/Tests_LLVMVisitor.h
@@ -327,6 +327,85 @@ TEST_SUITE("Others") {
CHECK_EQ(fileStr("temp.ll"), "define double @tef() {\n %v0 = add i32 1, 1\n ret double 4.000000\n}\n\n");
}
+ TEST_CASE("defvar_CreatesGlobalVariable_WhenGivenInteger") {
+ {
+ LLVMVisitor visitor("temp.ll");
+ Value* defun = new Funcall("defvar", { new Name("myvar"), new Integer(5) });
+ defun->Visit(visitor);
+ freeNodes(defun);
+ }
+
+ CHECK_EQ(fileStr("temp.ll"), "@myvar = global i32 5\n");
+ }
+
+ TEST_CASE("defvar_CreatesGlobalVariable_WhenGivenFloat") {
+ {
+ LLVMVisitor visitor("temp.ll");
+ Value* defun = new Funcall("defvar", { new Name("myvar"), new Float(4.956) });
+ defun->Visit(visitor);
+ freeNodes(defun);
+ }
+
+ CHECK_EQ(fileStr("temp.ll"), "@myvar = global double 4.956000\n");
+ }
+
+ TEST_CASE("if_CreatesProperConstruction_InsidedefunWhenNoElse") {
+ {
+ LLVMVisitor visitor("temp.ll");
+ Value* defun = new Funcall("defun", { new Name("tef"), new List({}), new Funcall("if", { new Funcall("=", { new Integer(0), new Integer(1) }), new Integer(3) }) });
+ defun->Visit(visitor);
+ freeNodes(defun);
+ }
+
+ CHECK_EQ(fileStr("temp.ll"), "define i32 @tef() {\n %v0 = icmp eq i32 0, 1\n %v1 = alloca i32\n br i1 %v0, label %v2, label %v3\n\n v2:\n store i32 3, ptr %v1\n br label %v3\n\n v3:\n %v4 = load i32, ptr %v1\n ret i32 %v4\n}\n\n");
+ }
+
+ TEST_CASE("if_CreatesProperConstruction_InsidedefunWhenWithElse") {
+ {
+ LLVMVisitor visitor("temp.ll");
+ Value* defun = new Funcall("defun", { new Name("tef"), new List({}), new Funcall("if", { new Funcall("=", { new Integer(0), new Integer(1) }), new Integer(3), new Integer(5) }) });
+ defun->Visit(visitor);
+ freeNodes(defun);
+ }
+
+ CHECK_EQ(fileStr("temp.ll"), "define i32 @tef() {\n %v0 = icmp eq i32 0, 1\n %v1 = alloca i32\n br i1 %v0, label %v2, label %v3\n\n v2:\n store i32 3, ptr %v1\n br label %v4\n\n v3:\n store i32 5, ptr %v1\n br label %v4\n\n v4:\n %v5 = load i32, ptr %v1\n ret i32 %v5\n}\n\n");
+ }
+
+ TEST_CASE("if_CreatesProperConstruction_InsidemainWhenNoElse") {
+ {
+ LLVMVisitor visitor("temp.ll");
+ Value* defun = new Funcall("if", { new Funcall("=", { new Integer(0), new Integer(1) }), new Integer(3) });
+ defun->Visit(visitor);
+ visitor.insertMain();
+ freeNodes(defun);
+ }
+
+ CHECK_EQ(fileStr("temp.ll"), "define i32 @main() {\n %v1 = icmp eq i32 0, 1\n %v2 = alloca i32\n br i1 %v1, label %v3, label %v4\n\n v3:\n store i32 3, ptr %v2\n br label %v4\n\n v4:\n %v5 = load i32, ptr %v2\n ret i32 0\n}\n");
+ }
+
+ TEST_CASE("if_CreatesProperConstruction_InsidemainWhenWithElse") {
+ {
+ LLVMVisitor visitor("temp.ll");
+ Value* defun = new Funcall("if", { new Funcall("=", { new Integer(0), new Integer(1) }), new Integer(3), new Integer(5) });
+ defun->Visit(visitor);
+ visitor.insertMain();
+ freeNodes(defun);
+ }
+
+ CHECK_EQ(fileStr("temp.ll"), "define i32 @main() {\n %v1 = icmp eq i32 0, 1\n %v2 = alloca i32\n br i1 %v1, label %v3, label %v4\n\n v3:\n store i32 3, ptr %v2\n br label %v5\n\n v4:\n store i32 5, ptr %v2\n br label %v5\n\n v5:\n %v6 = load i32, ptr %v2\n ret i32 0\n}\n");
+ }
+
+ TEST_CASE("if_CreatesProperConstruction_InsidemainWhenIfElseHasIfElseInIf") {
+ {
+ LLVMVisitor visitor("temp.ll");
+ Value* defun = new Funcall("if", { new Funcall("=", { new Integer(0), new Integer(0) }), new Funcall("if", { new Funcall(">", { new Integer(5), new Integer(4) }), new Integer(7), new Integer(9) }), new Integer(5) });
+ defun->Visit(visitor);
+ visitor.insertMain();
+ freeNodes(defun);
+ }
+
+ CHECK_EQ(fileStr("temp.ll"), "define i32 @main() {\n %v1 = icmp eq i32 0, 0\n %v2 = alloca i32\n br i1 %v1, label %v3, label %v4\n\n v3:\n %v6 = icmp sgt i32 5, 4\n %v7 = alloca i32\n br i1 %v6, label %v8, label %v9\n\n v8:\n store i32 7, ptr %v7\n br label %v10\n\n v9:\n store i32 9, ptr %v7\n br label %v10\n\n v10:\n %v11 = load i32, ptr %v7\n store i32 %v11, ptr %v2\n br label %v5\n\n v4:\n store i32 5, ptr %v2\n br label %v5\n\n v5:\n %v12 = load i32, ptr %v2\n ret i32 0\n}\n");
+ }
}
TEST_SUITE_END();
diff --git a/Year 2/Implementation of Programming Languages/Transpiler/tests/Tests_LLVMVisitorReturn.h b/Year 2/Implementation of Programming Languages/Transpiler/tests/Tests_LLVMVisitorReturn.h
new file mode 100644
index 0000000..9c81af5
--- /dev/null
+++ b/Year 2/Implementation of Programming Languages/Transpiler/tests/Tests_LLVMVisitorReturn.h
@@ -0,0 +1,59 @@
+#include <sstream>
+#include "doctest/doctest/doctest.h"
+#include "../src/LLVMVisitor/LLVMVisitorReturn.h"
+
+TEST_SUITE_BEGIN("LLVMVisitorReturn");
+
+TEST_SUITE("Operators") {
+ TEST_CASE("<<_ConcatsTypeAndAddrWithSpaceInBetween_WhenBothAreGiven") {
+ LLVMRet ret = { "a", "b" };
+ std::stringstream s;
+ s << ret;
+ CHECK_EQ(s.str(), "a b");
+ }
+
+ TEST_CASE("<<_ReturnsOnlyType_WhenOnlyTypeIsGiven") {
+ LLVMRet ret = { "a", "" };
+ std::stringstream s;
+ s << ret;
+ CHECK_EQ(s.str(), "a");
+ }
+
+ TEST_CASE("<<_ReturnsOnlyAddr_WhenOnlyAddrIsGiven") {
+ LLVMRet ret = { "", "b" };
+ std::stringstream s;
+ s << ret;
+ CHECK_EQ(s.str(), "b");
+ }
+
+ TEST_CASE("<<_ReturnsEmptyStrig_WhenBothAreEmpty") {
+ LLVMRet ret = { "", "" };
+ std::stringstream s;
+ s << ret;
+ CHECK_EQ(s.str(), "");
+ }
+}
+
+TEST_SUITE("Functions") {
+ TEST_CASE("toStr_ConcatsTypeAndAddrWithSpaceInBetween_WhenBothAreGiven") {
+ LLVMRet ret = { "a", "b" };
+ CHECK_EQ(ret.toStr(), "a b");
+ }
+
+ TEST_CASE("toStr_ReturnsOnlyType_WhenOnlyTypeIsGiven") {
+ LLVMRet ret = { "a", "" };
+ CHECK_EQ(ret.toStr(), "a");
+ }
+
+ TEST_CASE("toStr_ReturnsOnlyAddr_WhenOnlyAddrIsGiven") {
+ LLVMRet ret = { "", "b" };
+ CHECK_EQ(ret.toStr(), "b");
+ }
+
+ TEST_CASE("toStr_ReturnsEmptyStrig_WhenBothAreEmpty") {
+ LLVMRet ret = { "", "" };
+ CHECK_EQ(ret.toStr(), "");
+ }
+}
+
+TEST_SUITE_END();
diff --git a/Year 2/Implementation of Programming Languages/Transpiler/tests/Tests_Register.h b/Year 2/Implementation of Programming Languages/Transpiler/tests/Tests_Register.h
new file mode 100644
index 0000000..72877c1
--- /dev/null
+++ b/Year 2/Implementation of Programming Languages/Transpiler/tests/Tests_Register.h
@@ -0,0 +1,50 @@
+#include "doctest/doctest/doctest.h"
+#include "../src/LLVMVisitor/Register.h"
+
+TEST_SUITE_BEGIN("Register");
+
+TEST_SUITE("Operators") {
+ TEST_CASE("++prefix_IncrementsCounter_WhenGivenNewRegister") {
+ Register r("");
+ ++r;
+ CHECK_EQ(*r, "2");
+ }
+
+ TEST_CASE("postfix++_IncrementsCounter_WhenGivenNewRegister") {
+ Register r("");
+ r++;
+ CHECK_EQ(*r, "2");
+ }
+
+ TEST_CASE("*_ReturnsStringRepresentationOfNumber_WhenNoPrefixIsGiven") {
+ Register r("");
+ CHECK_EQ(*r, "1");
+ }
+
+ TEST_CASE("*_ReturnsStringRepresentationOfNumberAfterPrefix_WhenPrefixIsGiven") {
+ Register r("abcd");
+ CHECK_EQ(*r, "abcd1");
+ }
+}
+
+TEST_SUITE("Functions") {
+ TEST_CASE("reset_PutsCounterTo0_WhenGivenNewRegister") {
+ Register r("");
+ r.reset();
+ CHECK_EQ(*r, "0");
+ }
+
+ TEST_CASE("reset_PutsCounterTo0_WhenGivenPrefixIncrementedRegister") {
+ Register r("");
+ ++r;
+ r.reset();
+ CHECK_EQ(*r, "0");
+ }
+
+ TEST_CASE("headless_ReturnsOnlyNumber_WhenGivenRegisterWithPrefix") {
+ Register r("abcd");
+ CHECK_EQ(r.headless(), "1");
+ }
+}
+
+TEST_SUITE_END();