diff --git a/src/helper_files/helper_tests.pl b/src/helper_files/helper_tests.pl
index 476d26b34e9fbadae91853b2f20ca2083c0c0e05..a870e5d9997a9570a920e9087f73a4142cb599dd 100644
--- a/src/helper_files/helper_tests.pl
+++ b/src/helper_files/helper_tests.pl
@@ -10,7 +10,7 @@
 
 :- begin_tests(b).
 
-test(matrix, fail) :-
+test(matrix) :-
         open('/home/afkjakhes/eclipse-workspace/prolog-mlpack-libary/src/data_csv/iris2.csv', read, File),
         take_csv_row(File, skipFirstRow, 2, Records),
         print(Records),
diff --git a/src/methods/dbscan/dbscan.cpp b/src/methods/dbscan/dbscan.cpp
index 54a8f4609054fbdc5c0796044b535034f24b1ba6..b9edf104886d72a76bc593e6719e91512ff39379 100644
--- a/src/methods/dbscan/dbscan.cpp
+++ b/src/methods/dbscan/dbscan.cpp
@@ -20,35 +20,32 @@ using namespace mlpack::metric;
 
 
 template<typename RangeSearchType = range::RangeSearch<>, typename PointSelectionPolicy = OrderedPointSelection>
-void initAndCluster(double epsilon, SP_integer minPoints, SP_integer batchMode, float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum,
-				float **assignmentsArr, SP_integer *assignmentsArrSize, float **centroidsMatArr, SP_integer *centroidsMatColNum, SP_integer *centroidsMatRowNum)
+void initAndCluster(double epsilon, SP_integer minPoints, 
+					SP_integer batchMode, 
+					float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum,
+					float **assignmentsArr, SP_integer *assignmentsArrSize, 
+					float **centroidsMatArr, SP_integer *centroidsMatColNum, SP_integer *centroidsMatRowNum)
 {
 	// convert the Prolog arrays to arma::mat
 	mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum);
+	
+	// create the ReturnVector
+	Row< size_t > assignmentsReturnVector;
+	// create the ReturnMat
+	mat centroidsReturnMat;
+	
 
-	// get the ReturnVector
-	arma::Row<size_t> toReturnVector;
-
-	// get the ReturnMat
-	mat toReturnMat;
-
-	DBSCAN<RangeSearchType, PointSelectionPolicy>(epsilon, minPoints, (batchMode == 1)).Cluster(data, toReturnVector, toReturnMat);
-
-	// return the Vector lenght
-	*assignmentsArrSize = toReturnVector.n_elem;
+	DBSCAN<RangeSearchType, PointSelectionPolicy>(epsilon, minPoints, (batchMode == 1)).Cluster(data, assignmentsReturnVector, centroidsReturnMat);
 
-	// return the Vector as Array
-	*assignmentsArr = convertToArray(toReturnVector);
 
-	// return the Matrix dimensions
-	*centroidsMatColNum = toReturnMat.n_cols;
-	*centroidsMatRowNum = toReturnMat.n_rows;
+	// return the Vector
+	returnVectorInformation(assignmentsReturnVector, assignmentsArr, assignmentsArrSize);
 
-	// return the Matrix as one long Array
-	*centroidsMatArr = convertToArray(toReturnMat);
+	// return the Matrix
+	returnMatrixInformation(centroidsReturnMat, centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
 }
 
-// TODO: 
+
 // input: 	const double 			epsilon,
 //			const size_t 			minPoints,
 //			const bool 				batchMode = true,
@@ -60,136 +57,179 @@ void initAndCluster(double epsilon, SP_integer minPoints, SP_integer batchMode,
 //			arma::mat & 			centroids
 // output: 
 // description: 
-void dbscan(double epsilon, SP_integer minPoints, SP_integer batchMode, char const *selectionType, char const *treeType, float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum,
-				float **assignmentsArr, SP_integer *assignmentsArrSize, float **centroidsMatArr, SP_integer *centroidsMatColNum, SP_integer *centroidsMatRowNum)
+//			This is a one predicate model where you configure the model with the input parameters and get returned the results in the same predicate.
+//
+void dbscan(double epsilon, SP_integer minPoints, 
+				SP_integer batchMode, 
+				char const *selectionType, char const *treeType, 
+				float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum,
+				float **assignmentsArr, SP_integer *assignmentsArrSize, 
+				float **centroidsMatArr, SP_integer *centroidsMatColNum, SP_integer *centroidsMatRowNum)
 {
 	if(strcmp(selectionType, "ordered") == 0) 
 	{
-		cout << "ordered" << endl;
 		if (strcmp(treeType, "kd") == 0)
 		{
-			cout << "kd" << endl;
-			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::KDTree>, OrderedPointSelection>(epsilon, minPoints, batchMode, dataMatArr, dataMatSize, dataMatRowNum, assignmentsArr, assignmentsArrSize, 
-																				centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
+			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::KDTree>, OrderedPointSelection>(epsilon, minPoints, 
+																											batchMode, 
+																											dataMatArr, dataMatSize, dataMatRowNum, 
+																											assignmentsArr, assignmentsArrSize, 
+																											centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
 		}
 		else if (strcmp(treeType, "r") == 0)
 		{
-			cout << "r" << endl;
-			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::RTree>, OrderedPointSelection>(epsilon, minPoints, batchMode, dataMatArr, dataMatSize, dataMatRowNum, assignmentsArr, assignmentsArrSize, 
-																				centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
+			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::RTree>, OrderedPointSelection>(epsilon, minPoints, 
+																											batchMode, 
+																											dataMatArr, dataMatSize, dataMatRowNum, 
+																											assignmentsArr, assignmentsArrSize, 
+																											centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
 		}
 		else if (strcmp(treeType, "r_star") == 0)
 		{
-			cout << "r_star" << endl;
-			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::RStarTree>, OrderedPointSelection>(epsilon, minPoints, batchMode, dataMatArr, dataMatSize, dataMatRowNum, assignmentsArr, assignmentsArrSize, 
-																				centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
+			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::RStarTree>, OrderedPointSelection>(epsilon, minPoints, 
+																											batchMode, 
+																											dataMatArr, dataMatSize, dataMatRowNum, 
+																											assignmentsArr, assignmentsArrSize, 
+																											centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
 		}
 		else if (strcmp(treeType, "x") == 0)
 		{
-			cout << "x" << endl;
-			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::XTree>, OrderedPointSelection>(epsilon, minPoints, batchMode, dataMatArr, dataMatSize, dataMatRowNum, assignmentsArr, assignmentsArrSize, 
-																				centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
+			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::XTree>, OrderedPointSelection>(epsilon, minPoints, 
+																											batchMode, 
+																											dataMatArr, dataMatSize, dataMatRowNum, 
+																											assignmentsArr, assignmentsArrSize, 
+																											centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
 		}
 		else if (strcmp(treeType, "hilbert_r") == 0)
 		{
-			cout << "hilbert_r" << endl;
-			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::HilbertRTree>, OrderedPointSelection>(epsilon, minPoints, batchMode, dataMatArr, dataMatSize, dataMatRowNum, assignmentsArr, assignmentsArrSize, 
-																				centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
+			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::HilbertRTree>, OrderedPointSelection>(epsilon, minPoints, 
+																											batchMode, 
+																											dataMatArr, dataMatSize, dataMatRowNum, 
+																											assignmentsArr, assignmentsArrSize, 
+																											centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
 		}
 		else if (strcmp(treeType, "r_plus") == 0)
 		{
-			cout << "r_plus" << endl;
-			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::RPlusTree>, OrderedPointSelection>(epsilon, minPoints, batchMode, dataMatArr, dataMatSize, dataMatRowNum, assignmentsArr, assignmentsArrSize, 
-																				centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
+			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::RPlusTree>, OrderedPointSelection>(epsilon, minPoints, 
+																											batchMode, 
+																											dataMatArr, dataMatSize, dataMatRowNum, 
+																											assignmentsArr, assignmentsArrSize, 
+																											centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
 		}
 		else if (strcmp(treeType, "r_plus_plus") == 0)
 		{
-			cout << "r_plus_plus" << endl;
-			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::RPlusPlusTree>, OrderedPointSelection>(epsilon, minPoints, batchMode, dataMatArr, dataMatSize, dataMatRowNum, assignmentsArr, assignmentsArrSize, 
-																				centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
+			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::RPlusPlusTree>, OrderedPointSelection>(epsilon, minPoints, 
+																											batchMode, 
+																											dataMatArr, dataMatSize, dataMatRowNum, 
+																											assignmentsArr, assignmentsArrSize, 
+																											centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
 		}
 		else if (strcmp(treeType, "cover") == 0)
 		{
-			cout << "cover" << endl;
-			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::CoverTree>, OrderedPointSelection>(epsilon, minPoints, batchMode, dataMatArr, dataMatSize, dataMatRowNum, assignmentsArr, assignmentsArrSize, 
-																				centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
+			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::CoverTree>, OrderedPointSelection>(epsilon, minPoints, 
+																											batchMode, 
+																											dataMatArr, dataMatSize, dataMatRowNum, 
+																											assignmentsArr, assignmentsArrSize, 
+																											centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
 		}
 		else if (strcmp(treeType, "ball") == 0)
 		{
-			cout << "ball" << endl;
-			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::BallTree>, OrderedPointSelection>(epsilon, minPoints, batchMode, dataMatArr, dataMatSize, dataMatRowNum, assignmentsArr, assignmentsArrSize, 
-																				centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
+			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::BallTree>, OrderedPointSelection>(epsilon, minPoints, 
+																											batchMode, 
+																											dataMatArr, dataMatSize, dataMatRowNum, 
+																											assignmentsArr, assignmentsArrSize, 
+																											centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
 		}
 		else
 		{
-			cout << "wrong treeType input" << endl;
+			raisePrologDomainExeption(treeType, 5, "The given TreeType is unkown!", "dbscan");
+			return;
 		}
 	}
 	else if (strcmp(selectionType, "random") == 0)
 	{
-		cout << "random" << endl;
 		if (strcmp(treeType, "kd") == 0)
 		{
-			cout << "kd" << endl;
-			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::KDTree>, RandomPointSelection>(epsilon, minPoints, batchMode, dataMatArr, dataMatSize, dataMatRowNum, assignmentsArr, assignmentsArrSize, 
-																				centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
+			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::KDTree>, RandomPointSelection>(epsilon, minPoints, 
+																											batchMode, 
+																											dataMatArr, dataMatSize, dataMatRowNum, 
+																											assignmentsArr, assignmentsArrSize, 
+																											centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
 		}
 		else if (strcmp(treeType, "r") == 0)
 		{
-			cout << "r" << endl;
-			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::RTree>, RandomPointSelection>(epsilon, minPoints, batchMode, dataMatArr, dataMatSize, dataMatRowNum, assignmentsArr, assignmentsArrSize, 
-																				centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
+			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::RTree>, RandomPointSelection>(epsilon, minPoints, 
+																											batchMode, 
+																											dataMatArr, dataMatSize, dataMatRowNum, 
+																											assignmentsArr, assignmentsArrSize, 
+																											centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
 		}
 		else if (strcmp(treeType, "r_star") == 0)
 		{
-			cout << "r_star" << endl;
-			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::RStarTree>, RandomPointSelection>(epsilon, minPoints, batchMode, dataMatArr, dataMatSize, dataMatRowNum, assignmentsArr, assignmentsArrSize, 
-																				centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
+			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::RStarTree>, RandomPointSelection>(epsilon, minPoints, 
+																											batchMode, 
+																											dataMatArr, dataMatSize, dataMatRowNum, 
+																											assignmentsArr, assignmentsArrSize, 
+																											centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
 		}
 		else if (strcmp(treeType, "x") == 0)
 		{
-			cout << "x" << endl;
-			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::XTree>, RandomPointSelection>(epsilon, minPoints, batchMode, dataMatArr, dataMatSize, dataMatRowNum, assignmentsArr, assignmentsArrSize, 
-																				centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
+			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::XTree>, RandomPointSelection>(epsilon, minPoints, 
+																											batchMode, 
+																											dataMatArr, dataMatSize, dataMatRowNum, 
+																											assignmentsArr, assignmentsArrSize, 
+																											centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
 		}
 		else if (strcmp(treeType, "hilbert_r") == 0)
 		{
-			cout << "hilbert_r" << endl;
-			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::HilbertRTree>, RandomPointSelection>(epsilon, minPoints, batchMode, dataMatArr, dataMatSize, dataMatRowNum, assignmentsArr, assignmentsArrSize, 
-																				centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
+			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::HilbertRTree>, RandomPointSelection>(epsilon, minPoints, 
+																											batchMode, 
+																											dataMatArr, dataMatSize, dataMatRowNum, 
+																											assignmentsArr, assignmentsArrSize, 
+																											centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
 		}
 		else if (strcmp(treeType, "r_plus") == 0)
 		{
-			cout << "r_plus" << endl;
-			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::RPlusTree>, RandomPointSelection>(epsilon, minPoints, batchMode, dataMatArr, dataMatSize, dataMatRowNum, assignmentsArr, assignmentsArrSize, 
-																				centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
+			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::RPlusTree>, RandomPointSelection>(epsilon, minPoints, 
+																											batchMode, 
+																											dataMatArr, dataMatSize, dataMatRowNum, 
+																											assignmentsArr, assignmentsArrSize, 
+																											centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
 		}
 		else if (strcmp(treeType, "r_plus_plus") == 0)
 		{
-			cout << "r_plus_plus" << endl;
-			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::RPlusPlusTree>, RandomPointSelection>(epsilon, minPoints, batchMode, dataMatArr, dataMatSize, dataMatRowNum, assignmentsArr, assignmentsArrSize, 
-																				centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
+			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::RPlusPlusTree>, RandomPointSelection>(epsilon, minPoints, 
+																											batchMode, 
+																											dataMatArr, dataMatSize, dataMatRowNum, 
+																											assignmentsArr, assignmentsArrSize, 
+																											centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
 		}
 		else if (strcmp(treeType, "cover") == 0)
 		{
-			cout << "cover" << endl;
-			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::CoverTree>, RandomPointSelection>(epsilon, minPoints, batchMode, dataMatArr, dataMatSize, dataMatRowNum, assignmentsArr, assignmentsArrSize, 
-																				centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
+			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::CoverTree>, RandomPointSelection>(epsilon, minPoints, 
+																											batchMode, 
+																											dataMatArr, dataMatSize, dataMatRowNum, 
+																											assignmentsArr, assignmentsArrSize, 
+																											centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
 		}
 		else if (strcmp(treeType, "ball") == 0)
 		{
-			cout << "ball" << endl;
-			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::BallTree>, RandomPointSelection>(epsilon, minPoints, batchMode, dataMatArr, dataMatSize, dataMatRowNum, assignmentsArr, assignmentsArrSize, 
-																				centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
+			initAndCluster<RangeSearch<EuclideanDistance, mat, tree::BallTree>, RandomPointSelection>(epsilon, minPoints, 
+																											batchMode, 
+																											dataMatArr, dataMatSize, dataMatRowNum, 
+																											assignmentsArr, assignmentsArrSize, 
+																											centroidsMatArr, centroidsMatColNum, centroidsMatRowNum);
 		}
 		else
 		{
-			cout << "wrong treeType input" << endl;
+			raisePrologDomainExeption(treeType, 5, "The given TreeType is unkown!", "dbscan");
+			return;
 		}
 	}
 	else
 	{
-		cout << "wrong selectionType input" << endl;
+		raisePrologDomainExeption(selectionType, 4, "The given SelectionType is unkown!", "dbscan");
+		return;
 	}
 	
-}
\ No newline at end of file
+}
diff --git a/src/methods/dbscan/dbscan.pl b/src/methods/dbscan/dbscan.pl
index 271dff8c9aa8d1bd3a871df682c75f6ff2c65841..3fc5743cc6dff107291ba17c57d6d7d0b6c75d2a 100644
--- a/src/methods/dbscan/dbscan.pl
+++ b/src/methods/dbscan/dbscan.pl
@@ -1,4 +1,4 @@
-:- module(dbscan, [dbscan/13]).
+:- module(dbscan, [dbscan/10]).
 
 %% requirements of library(struct)
 :- load_files(library(str_decl),
@@ -20,7 +20,7 @@
 %%              double  epsilon
 %%              int     minPoints
 %%              bool    batchMode       => (1)true / (0)false
-%%              str     selectionType   => "orderd", "random"
+%%              str     selectionType   => "ordered", "random"
 %%              str     treeType        => "kd", "r", "r_star", "x", "hilbert_r", "r_plus", "r_plus_plus", "cover", "ball"
 %%              mat     data            => data(float_array), dataSize, dataRowNum
 %%
@@ -31,11 +31,18 @@
 %% --Description--
 %%            This is a one predicate model where you configure the model with the input parameters and get returned the results in the same predicate.
 %%
-foreign(dbscan, c, dbscan(  +float32, +integer, +integer, 
+foreign(dbscan, c, dbscanI(  +float32, +integer, +integer, 
                             +string, +string, 
                             +pointer(float_array), +integer, +integer,
                             -pointer(float_array), -integer, 
                             -pointer(float_array), -integer, -integer)).
+dbscan(Epsilon, MinPoints, BatchMode, SelectionType, TreeType, DataList, DataRows, AssignList, CentroidsList, ZCols) :-
+        Epsilon > 0,
+        MinPoints > 0,
+        convert_list_to_float_array(DataList, DataRows, array(Xsize, Xrownum, X)),
+        dbscanI(Epsilon, MinPoints, BatchMode, SelectionType, TreeType, X, Xsize, Xrownum, Y, Ysize, Z, ZCols, ZRows),
+        convert_float_array_to_list(Y, Ysize, AssignList),
+        convert_float_array_to_2d_list(Z, ZCols, ZRows, CentroidsList).
 
 
 %% Defines the functions that get connected from main.cpp
diff --git a/src/methods/dbscan/dbscan_test.pl b/src/methods/dbscan/dbscan_test.pl
index 965aaf969540fa27a7d58258eba2e84f363c7f35..112d030011396c38970006f2f7d8c98873521ad9 100644
--- a/src/methods/dbscan/dbscan_test.pl
+++ b/src/methods/dbscan/dbscan_test.pl
@@ -1,48 +1,197 @@
+
+:- module(dbscan_tests, [run_dbscan_tests/0]).
+
 :- use_module(library(plunit)).
 
 :- use_module(dbscan).
 :- use_module('../../helper_files/helper.pl').
 
 
-:- begin_tests(lists).
-
-test(dbscanKDTree) :-
-        convert_list_to_float_array([5.1,3.5,1.4,4.9,3.0,1.4,4.7,3.2,1.3,4.6,3.1,1.5, 1.4, 3.0, 2.1, 0.1],4, array(Xsize, Xrownum, X)),
-        dbscan(0.7, 1, 1, ordered, kd, X, Xsize, Xrownum, Assign, Assignsize, Centroids, Centroidscolnum, Centroidsrownum),
-        print(Assignsize),
-        convert_float_array_to_list(Assign, Assignsize, ResultsAssign),
-        print(ResultsAssign),
-        print(Centroidscolnum),
-        convert_float_array_to_2d_list(Centroids, Centroidscolnum, Centroidsrownum, Results),
-        print(Results).
-test(dbscanRTree) :-
-        convert_list_to_float_array([5.1,3.5,1.4,4.9,3.0,1.4,4.7,3.2,1.3,4.6,3.1,1.5, 1.4, 3.0, 2.1, 0.1],4, array(Xsize, Xrownum, X)),
-        dbscan(0.7, 1, 1, ordered, r, X, Xsize, Xrownum, Assign, Assignsize, Centroids, Centroidscolnum, Centroidsrownum),
-        print(Assignsize),
-        convert_float_array_to_list(Assign, Assignsize, ResultsAssign),
-        print(ResultsAssign),
-        print(Centroidscolnum),
-        convert_float_array_to_2d_list(Centroids, Centroidscolnum, Centroidsrownum, Results),
-        print(Results).
-test(dbscanRStarTree) :-
-        convert_list_to_float_array([5.1,3.5,1.4,4.9,3.0,1.4,4.7,3.2,1.3,4.6,3.1,1.5, 1.4, 3.0, 2.1, 0.1],4, array(Xsize, Xrownum, X)),
-        dbscan(0.7, 1, 1, ordered, r_star, X, Xsize, Xrownum, Assign, Assignsize, Centroids, Centroidscolnum, Centroidsrownum),
-        print(Assignsize),
-        convert_float_array_to_list(Assign, Assignsize, ResultsAssign),
-        print(ResultsAssign),
-        print(Centroidscolnum),
-        convert_float_array_to_2d_list(Centroids, Centroidscolnum, Centroidsrownum, Results),
-        print(Results).
-
-test(dbscanrandomKDTree) :-
-        convert_list_to_float_array([5.1,3.5,1.4,4.9,3.0,1.4,4.7,3.2,1.3,4.6,3.1,1.5, 1.4, 3.0, 2.1, 0.1],4, array(Xsize, Xrownum, X)),
-        dbscan(0.7, 1, 1, random, kd, X, Xsize, Xrownum, Assign, Assignsize, Centroids, Centroidscolnum, Centroidsrownum),
-        print(Assignsize),
-        convert_float_array_to_list(Assign, Assignsize, ResultsAssign),
-        print(ResultsAssign),
-        print(Centroidscolnum),
-        convert_float_array_to_2d_list(Centroids, Centroidscolnum, Centroidsrownum, Results),
-        print(Results).
-
-
-:- end_tests(lists).
\ No newline at end of file
+%%
+%% TESTING predicate dbscan/10
+%%
+:- begin_tests(dbscan).     
+
+%% Failure Tests
+                                            
+test(dbscan_Negative_Epsilon, fail) :-
+        dbscan(-1, 1, 0, ordered, kd, [5.1,3.5,1.4,4.9,3.0,1.4,4.7,3.2,1.3,4.6,3.1,1.5], 3, _, _, _).
+        
+test(dbscan_Negative_MinPoints, fail) :-
+        dbscan(1, -1, 0, ordered, kd, [5.1,3.5,1.4,4.9,3.0,1.4,4.7,3.2,1.3,4.6,3.1,1.5], 3, _, _, _).
+
+test(dbscan_wrong_Selection_Input, [error(domain_error('The given SelectionType is unkown!', wrongSelection), _)]) :-
+        dbscan(1.0, 1, 0, wrongSelection, kd, [5.1,3.5,1.4,4.9,3.0,1.4,4.7,3.2,1.3,4.6,3.1,1.5], 3, _, _, _).
+
+test(dbscan_wrong_TreeType_Input_With_Orderd_Selection, [error(domain_error('The given TreeType is unkown!', wrongTree), _)]) :-
+        dbscan(1.0, 1, 0, ordered, wrongTree, [5.1,3.5,1.4,4.9,3.0,1.4,4.7,3.2,1.3,4.6,3.1,1.5], 3, _, _, _).
+
+test(dbscan_wrong_TreeType_Input_With_Random_Selection, [error(domain_error('The given TreeType is unkown!', wrongTree), _)]) :-
+        dbscan(1.0, 1, 0, random, wrongTree, [5.1,3.5,1.4,4.9,3.0,1.4,4.7,3.2,1.3,4.6,3.1,1.5], 3, _, _, _).
+        
+
+%% Successful Tests
+
+test(dbscan_KD_CSV) :-
+        open('/home/afkjakhes/eclipse-workspace/prolog-mlpack-libary/src/data_csv/iris2.csv', read, File),
+        take_csv_row(File, skipFirstRow,30, Data),
+        dbscan(1.0, 1, 0, ordered, kd, Data, 4, AssignList, CentroidsList, _),
+        dbscan(1.0, 1, 0, random, kd, Data, 4, AssignListRand, CentroidsListRand, _),
+        print('\nOrdered'),
+        print(AssignList),
+        print('\nOrdered'),
+        print(CentroidsList),
+        print('\nRandom'),
+        print(AssignListRand),
+        print('\nRandom'),
+        print(CentroidsListRand).
+
+test(dbscan_R_CSV) :-
+        open('/home/afkjakhes/eclipse-workspace/prolog-mlpack-libary/src/data_csv/iris2.csv', read, File),
+        take_csv_row(File, skipFirstRow,30, Data),
+        dbscan(1.0, 1, 0, ordered, r, Data, 4, AssignList, CentroidsList, _),
+        dbscan(1.0, 1, 0, random, r, Data, 4, AssignListRand, CentroidsListRand, _),
+        print('\nOrdered'),
+        print(AssignList),
+        print('\nOrdered'),
+        print(CentroidsList),
+        print('\nRandom'),
+        print(AssignListRand),
+        print('\nRandom'),
+        print(CentroidsListRand).
+
+test(dbscan_RSTAR_CSV) :-
+        open('/home/afkjakhes/eclipse-workspace/prolog-mlpack-libary/src/data_csv/iris2.csv', read, File),
+        take_csv_row(File, skipFirstRow,30, Data),
+        dbscan(1.0, 1, 0, ordered, r_star, Data, 4, AssignList, CentroidsList, _),
+        dbscan(1.0, 1, 0, random, r_star, Data, 4, AssignListRand, CentroidsListRand, _),
+        print('\nOrdered'),
+        print(AssignList),
+        print('\nOrdered'),
+        print(CentroidsList),
+        print('\nRandom'),
+        print(AssignListRand),
+        print('\nRandom'),
+        print(CentroidsListRand).
+
+test(dbscan_X_CSV) :-
+        open('/home/afkjakhes/eclipse-workspace/prolog-mlpack-libary/src/data_csv/iris2.csv', read, File),
+        take_csv_row(File, skipFirstRow,30, Data),
+        dbscan(1.0, 1, 0, ordered, x, Data, 4, AssignList, CentroidsList, _),
+        dbscan(1.0, 1, 0, random, x, Data, 4, AssignListRand, CentroidsListRand, _),
+        print('\nOrdered'),
+        print(AssignList),
+        print('\nOrdered'),
+        print(CentroidsList),
+        print('\nRandom'),
+        print(AssignListRand),
+        print('\nRandom'),
+        print(CentroidsListRand).
+
+test(dbscan_Hilbert_R_CSV) :-
+        open('/home/afkjakhes/eclipse-workspace/prolog-mlpack-libary/src/data_csv/iris2.csv', read, File),
+        take_csv_row(File, skipFirstRow,30, Data),
+        dbscan(1.0, 1, 0, ordered, hilbert_r, Data, 4, AssignList, CentroidsList, _),
+        dbscan(1.0, 1, 0, random, hilbert_r, Data, 4, AssignListRand, CentroidsListRand, _),
+        print('\nOrdered'),
+        print(AssignList),
+        print('\nOrdered'),
+        print(CentroidsList),
+        print('\nRandom'),
+        print(AssignListRand),
+        print('\nRandom'),
+        print(CentroidsListRand).
+
+test(dbscan_RPlus_CSV) :-
+        open('/home/afkjakhes/eclipse-workspace/prolog-mlpack-libary/src/data_csv/iris2.csv', read, File),
+        take_csv_row(File, skipFirstRow,30, Data),
+        dbscan(1.0, 1, 0, ordered, r_plus, Data, 4, AssignList, CentroidsList, _),
+        dbscan(1.0, 1, 0, random, r_plus, Data, 4, AssignListRand, CentroidsListRand, _),
+        print('\nOrdered'),
+        print(AssignList),
+        print('\nOrdered'),
+        print(CentroidsList),
+        print('\nRandom'),
+        print(AssignListRand),
+        print('\nRandom'),
+        print(CentroidsListRand).
+
+test(dbscan_RPlusPlus_CSV) :-
+        open('/home/afkjakhes/eclipse-workspace/prolog-mlpack-libary/src/data_csv/iris2.csv', read, File),
+        take_csv_row(File, skipFirstRow,30, Data),
+        dbscan(1.0, 1, 0, ordered, r_plus_plus, Data, 4, AssignList, CentroidsList, _),
+        dbscan(1.0, 1, 0, random, r_plus_plus, Data, 4, AssignListRand, CentroidsListRand, _),
+        print('\nOrdered'),
+        print(AssignList),
+        print('\nOrdered'),
+        print(CentroidsList),
+        print('\nRandom'),
+        print(AssignListRand),
+        print('\nRandom'),
+        print(CentroidsListRand).
+
+test(dbscan_Cover_CSV) :-
+        open('/home/afkjakhes/eclipse-workspace/prolog-mlpack-libary/src/data_csv/iris2.csv', read, File),
+        take_csv_row(File, skipFirstRow,30, Data),
+        dbscan(1.0, 1, 0, ordered, cover, Data, 4, AssignList, CentroidsList, _),
+        dbscan(1.0, 1, 0, random, cover, Data, 4, AssignListRand, CentroidsListRand, _),
+        print('\nOrdered'),
+        print(AssignList),
+        print('\nOrdered'),
+        print(CentroidsList),
+        print('\nRandom'),
+        print(AssignListRand),
+        print('\nRandom'),
+        print(CentroidsListRand).
+
+
+test(dbscan_Ball_CSV) :-
+        open('/home/afkjakhes/eclipse-workspace/prolog-mlpack-libary/src/data_csv/iris2.csv', read, File),
+        take_csv_row(File, skipFirstRow,30, Data),
+        dbscan(1.0, 1, 0, ordered, ball, Data, 4, AssignList, CentroidsList, _),
+        dbscan(1.0, 1, 0, random, ball, Data, 4, AssignListRand, CentroidsListRand, _),
+        print('\nOrdered'),
+        print(AssignList),
+        print('\nOrdered'),
+        print(CentroidsList),
+        print('\nRandom'),
+        print(AssignListRand),
+        print('\nRandom'),
+        print(CentroidsListRand).
+
+
+%% Some use cases
+test(dbscan_Orderd_KD) :-
+        dbscan(1.0, 1, 0, ordered, kd, [5.1,3.5,1.4,4.9,3.0,1.4,4.7,3.2,1.3,4.6,3.1,1.5], 3, AssignList, CentroidsList, _),
+        print(AssignList),
+        print('\n'),
+        print(CentroidsList).
+
+test(dbscan_Orderd_KD_CSV) :-
+        open('/home/afkjakhes/eclipse-workspace/prolog-mlpack-libary/src/data_csv/iris2.csv', read, File),
+        take_csv_row(File, skipFirstRow,10, Data),
+        dbscan(1.0, 1, 0, ordered, kd, Data, 4, AssignList, CentroidsList, _),
+        print(AssignList),
+        print('\n'),
+        print(CentroidsList).
+
+test(dbscan_Random_KD) :-
+        dbscan(3.2, 4, 1, random, kd, [5.1,3.5,1.4,4.9,3.0,1.4,4.7,3.2,1.3,4.6,3.1,1.5], 3, [0.0,0.0,0.0,0.0], [[4.824999809265137,3.200000047683716,1.399999976158142]], _).
+
+test(dbscan_Random_KD_CSV) :-
+        open('/home/afkjakhes/eclipse-workspace/prolog-mlpack-libary/src/data_csv/iris2.csv', read, File),
+        take_csv_row(File, skipFirstRow,10, Data),
+        dbscan(3.2, 4, 1, random, kd, Data, 4, [0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0], [[4.860000133514404,3.309999942779541,1.4500000476837158,0.2199999988079071]], _).
+
+test(dbscan_Random_RSTAR_CSV) :-
+        open('/home/afkjakhes/eclipse-workspace/prolog-mlpack-libary/src/data_csv/iris2.csv', read, File),
+        take_csv_row(File, skipFirstRow,100, Data),
+        dbscan(1.0, 10, 1, random, r_star, Data, 4, AssignList, CentroidsList, _),
+        print(AssignList),
+        print('\n'),
+        print(CentroidsList).
+
+:- end_tests(dbscan).
+
+run_dbscan_tests :-
+        run_tests.
diff --git a/test_all.pl b/test_all.pl
index 1ac5d5be8eaff93af999e1d35c6e2a69c73bee93..7b5dc51e503bdc3dbdd21445811efc902defc895 100644
--- a/test_all.pl
+++ b/test_all.pl
@@ -2,11 +2,14 @@
 
 :- use_module('src/methods/adaboost/adaboost_test.pl').
 
+:- use_module('src/methods/dbscan/dbscan_test.pl').
+
 :- use_module('src/methods/sparse_coding/sparse_coding_test.pl').
 
 :- use_module('src/helper_files/helper_tests.pl').
 
 run :-
         run_adaboost_tests,
+        run_dbscan_tests,
         run_sparse_coding_tests,
         run_helper_tests.
\ No newline at end of file