diff --git a/tests/edge_union_cases.cpp b/tests/edge_union_cases.cpp
index 35dbc4bcc6d6bae2b49126e4c8bb70cf6e6ec1b6..6efaa5fcac08686d3cd36eaac8ef6ec564d7c3d8 100644
--- a/tests/edge_union_cases.cpp
+++ b/tests/edge_union_cases.cpp
@@ -2,38 +2,11 @@
 #include <union.h>
 #include <triangle.h>
 #include <orientation.h>
+#include "union_tests.h"
 
-struct UnionParams
-{
-	Triangle t1;
-	Triangle t2;
-	std::vector<Triangle> expected;
-};
-
-std::ostream &operator<<(std::ostream &os, const UnionParams &u) {
-	os << u.t1 << "|" << u.t2;
-	return os;
-}
-
-class InstantiateUnionEdgeTests : public testing::TestWithParam<UnionParams>
-{
-};
-
-TEST_P(InstantiateUnionEdgeTests, UnionTest)
-{
-	const Triangle &t1 = GetParam().t1;
-	const Triangle &t2 = GetParam().t2;
-	auto expected = GetParam().expected;
-
-	ASSERT_NE(orientation(t1), Clockwise);
-	ASSERT_NE(orientation(t2), Clockwise);
-
-	auto result = unionize(t1, t2);
 
-	EXPECT_EQ(result, expected);
-}
 
-INSTANTIATE_TEST_SUITE_P(EdgeUnionTests, InstantiateUnionEdgeTests, testing::Values(
+INSTANTIATE_TEST_SUITE_P(EdgeUnionTests, InstantiateUnionTests, testing::Values(
 																		// Point on top of triangle
 																		UnionParams{Triangle({0, 0, 4}, {5, 0, 4}, {2, 3, 4}, 1), Triangle({1, 1, 0}, {1, 1, 0}, {1, 1, 0}, 2), {Triangle({0, 0, 4}, {5, 0, 4}, {2, 3, 4}, 1), Triangle({1, 1, 0}, {1, 1, 0}, {1, 1, 0}, 2)}},
 																		// Point on edge of triangle
@@ -82,3 +55,4 @@ TEST(UnionEdgeTests, TriangleOnSide)
 
 	EXPECT_EQ(results, expected);
 }
+
diff --git a/tests/union_tests.cpp b/tests/union_tests.cpp
index a18373ee03eac8c73a2f26ab97ebec895a188684..26f957b44bd02408f4d3f3e2c3d94a5332d38dae 100644
--- a/tests/union_tests.cpp
+++ b/tests/union_tests.cpp
@@ -3,6 +3,12 @@
 #include <triangle.h>
 #include <orientation.h>
 #include <shift_triangle.h>
+#include "union_tests.h"
+
+std::ostream &operator<<(std::ostream &os, const UnionParams &u) {
+	os << u.t1 << "|" << u.t2;
+	return os;
+}
 
 TEST(UnionTrivialTests, NotTouching)
 {
@@ -53,7 +59,7 @@ TEST(UnionTests, SharesPointTest)
     results = unionize(bottom, top);
 
     std::vector<Triangle> expected_results_2 {
-	Triangle({0, 5}, {3, 2}, {5, 3}, 1),
+	Triangle({0, 5, 10}, {3, 2, 10}, {5, 3, 10}, 1),
 	Triangle({0.1, 7, 5}, {5, 3,5}, {3.2, 9,5}, 2)
     };
 
@@ -90,60 +96,59 @@ TEST(UnionTests, FoldTriangleTest)
 
     EXPECT_EQ(results, expected_results_2);
 }
-/*
-TEST(UnionTests, IceCreamTest)
-{
-    Triangle bottom = Triangle({0, 5}, {3, 2}, {5, 3}, 2, 1);
-    Triangle top = Triangle({-1, 5}, {2, 4}, {5, 7}, 1, 2);
-
-    auto results = unionize(bottom, top);
-
-    std::vector<Triangle> expected_results_1;
-
-    EXPECT_EQ(results, expected_results_1);
-
-    top.depth = 3;
-
-    results = unionize(bottom, top);
 
-    std::vector<Triangle> expected_results_2;
-
-    EXPECT_EQ(results, expected_results_2);
-}*/
 
 TEST(UnionTests, StarTest)
 {
-    Triangle bottom = Triangle({0, 3}, {5, 3}, {2.5, 6}, 1);
-    Triangle top = Triangle({0, 5, 1}, {2, 0, 1}, {5, 5, 1}, 2);
+    Triangle top = Triangle({0, 3,0}, {5, 3,0}, {2.5, 6,0}, 1);
+    Triangle bot = Triangle({0, 5, 1}, {2, 0, 1}, {5, 5, 1}, 2);
 
-    ASSERT_EQ(orientation(bottom.points[0], bottom.points[1], bottom.points[2]), Counterclockwise);
     ASSERT_EQ(orientation(top.points[0], top.points[1], top.points[2]), Counterclockwise);
+    ASSERT_EQ(orientation(bot.points[0], bot.points[1], bot.points[2]), Counterclockwise);
 
-    auto results = unionize(bottom, top);
+    auto results = unionize(top, bot);
 
     std::vector<Triangle> expected_results_1 = {
-        Triangle({2,0}, {3.8, 3}, {0.8, 3}, 2),
-        Triangle({5,5}, {3.33333, 5}, {4.30233, 3.83721}, 2),
-        Triangle({0,5}, {0.540541, 3.64865}, {1.66667, 5}, 2),
+        Triangle({2,0,1}, {3.8, 3,1}, {0.8, 3, 1}, 2),
+        Triangle({5,5,1}, {3.33333, 5, 1}, {4.30233, 3.83721, 1}, 2),
+        Triangle({0,5,1}, {0.540541, 3.64865, 1}, {1.66667, 5, 1}, 2),
         Triangle({0, 3}, {5, 3}, {2.5, 6}, 1)
     };
 
     EXPECT_EQ(results, expected_results_1);
 
-    shiftZ(bottom, 3);
+    shiftZ(top, 3);
 
-    results = unionize(bottom, top);
+    results = unionize(top, bot);
 
     std::vector<Triangle> expected_results_2 = {
-        Triangle({0,3}, {0.8,3}, {0.540541,3.64865}, 1),
-        Triangle({5,3}, {4.30233,3.83721}, {3.8,3}, 1),
-        Triangle({2.5,6}, {1.66667,5}, {3.33333,5}, 1),
-        Triangle({0,5}, {2,0}, {5,5}, 2)
+        Triangle({0,3,3}, {0.8,3,3}, {0.540541,3.64865,3}, 1),
+        Triangle({5,3,3}, {4.30233,3.83721,3}, {3.8,3,3}, 1),
+        Triangle({2.5,6,3}, {1.66667,5,3}, {3.33333,5,3}, 1),
+        Triangle({0,5, 1}, {2,0,1}, {5,5,1}, 2)
     };
 
     EXPECT_EQ(results, expected_results_2);
 }
 
-TEST (UnionTests, DepthTest) {
 
+TEST_P(InstantiateUnionTests, UnionTest)
+{
+	const Triangle &t1 = GetParam().t1;
+	const Triangle &t2 = GetParam().t2;
+	auto expected = GetParam().expected;
+
+	ASSERT_NE(orientation(t1), Clockwise);
+	ASSERT_NE(orientation(t2), Clockwise);
+
+	auto result = unionize(t1, t2);
+
+	EXPECT_EQ(result, expected);
 }
+
+INSTANTIATE_TEST_SUITE_P(ParameterizedUnionTests, InstantiateUnionTests, testing::Values(
+    UnionParams{Triangle({0, 0, 0}, {5, 0, 0}, {2, 3, 0}, 1), Triangle(Point{3, 1, 10}, Point{6, 1, 2}, Point{4, 3, 1}, 2), 
+    {Triangle({6,1,2}, {4,3,1}, {3.333333,1.66666,7.23542}, 2),
+     Triangle({6,1,2}, {3.33333,1.66667,7.23542}, {4,1,7.3680},2),
+      Triangle({0,0}, {5,0}, {2,3}, 1)}}
+));
\ No newline at end of file
diff --git a/tests/union_tests.h b/tests/union_tests.h
new file mode 100644
index 0000000000000000000000000000000000000000..1b6908ce34ea304ed0787daaf2b3097a0a35ff20
--- /dev/null
+++ b/tests/union_tests.h
@@ -0,0 +1,15 @@
+#pragma once
+#include <triangle.h>
+
+struct UnionParams
+{
+	Triangle t1;
+	Triangle t2;
+	std::vector<Triangle> expected;
+};
+
+class InstantiateUnionTests : public testing::TestWithParam<UnionParams>{};
+
+
+std::ostream &operator<<(std::ostream &os, const UnionParams &u);
+