diff options
| Commit | 90d86e8072e7246374076961a26cfd1024ac67f7 (patch) | |
|---|---|---|
| Author | 2023-02-08 11:47:28 +0200 | |
| Committer | 2023-02-08 11:47:28 +0200 | |
| Files | 719516c34cede6fcf9580fce31da43a74122700c | |
| uni-projects-90d86e8072e7246374076961a26cfd1024ac67f7.tar uni-projects-90d86e8072e7246374076961a26cfd1024ac67f7.tar.gz uni-projects-90d86e8072e7246374076961a26cfd1024ac67f7.zip | ||
| Parent | 90bf4e3fd851087a3cfc68dbfa1e8ae5c38d0456 (diff) | |
[IPL/T] Added more LLVMVisitor tests, added LLVMVisitorReturn and Register tests
4 files changed, 190 insertions, 0 deletions
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(); |
