diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1ace6aab70b38909185da8d3115f3d80f10de61e..1ea507921a4155151d0b757eaddd975562368767 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -21,7 +21,7 @@ if (NOT CMAKE_BUILD_TYPE)
     set (CMAKE_BUILD_TYPE RELEASE CACHE STRING
          "Choose the type of build, options are: None Debug Release."
          FORCE)
-elseif("CMAKE_BUILD_TYPE" STREQUAL "Debug")
+elseif(CMAKE_BUILD_TYPE STREQUAL "Debug")
     #TODO rewrite to use add_compile_definitions
 endif (NOT CMAKE_BUILD_TYPE)
 
@@ -84,11 +84,12 @@ message("Boost_INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}")
 message("Boost_LIBRARY_DIRS: ${Boost_LIBRARY_DIRS}")
 message("Boost_LIBRARIES: ${Boost_LIBRARIES}")
 
-message("lib4neuro LIB DIR: ${LIB4NEURO_DIR}")
-
 find_package(exprtk)
+message("EXPRTK_INCLUDE_DIRS: ${EXPRTK_INCLUDE_DIRS}")
 
 find_package(Turtle)
+message("TURTLE_INCLUDE_DIR: ${TURTLE_INCLUDE_DIR}")
+
 
 #------------------------------------------#
 # Detect maximum available number of cores #
diff --git a/external_dependencies/boost b/external_dependencies/boost
index 0792dde1c543aba10d66d634f923e6993f9699d3..35e0ef020057dce87e4ed65d3f34d28e12a0d411 160000
--- a/external_dependencies/boost
+++ b/external_dependencies/boost
@@ -1 +1 @@
-Subproject commit 0792dde1c543aba10d66d634f923e6993f9699d3
+Subproject commit 35e0ef020057dce87e4ed65d3f34d28e12a0d411
diff --git a/src/CSVReader/CSVReader.cpp b/src/CSVReader/CSVReader.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..512ae5fb04fd6865ea97f65471e10b55a3ec2aa4
--- /dev/null
+++ b/src/CSVReader/CSVReader.cpp
@@ -0,0 +1,5 @@
+//
+// Created by martin on 14.11.18.
+//
+
+#include "CSVReader.h"
diff --git a/src/CSVReader/CSVReader.h b/src/CSVReader/CSVReader.h
new file mode 100644
index 0000000000000000000000000000000000000000..f2b8be5ad9984ce2d60e9bd4237f7e771aa83bb6
--- /dev/null
+++ b/src/CSVReader/CSVReader.h
@@ -0,0 +1,8 @@
+//
+// Created by martin on 14.11.18.
+//
+
+#ifndef LIB4NEURO_CSVREADER_H
+#define LIB4NEURO_CSVREADER_H
+
+#endif //LIB4NEURO_CSVREADER_H
diff --git a/src/tests/DESolver_test.cpp b/src/tests/DESolver_test.cpp
index 4f391d9e519a956a009f9b1de427cd7b42661cf9..de20352fd55f06b3b91621a4e55dcd45f8269967 100644
--- a/src/tests/DESolver_test.cpp
+++ b/src/tests/DESolver_test.cpp
@@ -97,13 +97,14 @@ BOOST_AUTO_TEST_SUITE(DESolver_test)
         BOOST_CHECK_THROW(DESolver(1, 1, 0), std::invalid_argument);
         BOOST_CHECK_NO_THROW(DESolver deSolver(1, 1, 1));
 
-        /*boost::test_tools::output_test_stream output;
-        {
-            cout_redirect guard(output.rdbuf());
-            DESolver deSolver(1,1,1,1);
-        }
-        BOOST_CHECK(output.is_equal("Differential Equation Solver with 1 equations\n--------------------------------------------------------------------------\nConstructing NN structure representing the solution [1 input neurons][1 inner neurons][1 output neurons]...\n  adding a connection between input neuron  0 and inner neuron  0, weight index 0\n  adding a connection between inner neuron  0 and output neuron  0, weight index 1\ndone\n\n"));
-        */
+		//TODO fix it
+		//std::stringstream buffer1;
+		//std::streambuf * old1 = std::cout.rdbuf(buffer1.rdbuf());
+		//DESolver deSolver(1, 1, 1);
+		//std::string text = buffer1.str();
+  //      
+  //     // BOOST_CHECK(text._Equal("Differential Equation Solver with 1 equations\n--------------------------------------------------------------------------\nConstructing NN structure representing the solution [1 input neurons][1 inner neurons][1 output neurons]...\n  adding a connection between input neuron  0 and inner neuron  0, weight index 0\n  adding a connection between inner neuron  0 and output neuron  0, weight index 1\ndone\n\n"));
+		//std::cout.rdbuf(old1);
     }
 
     /**
@@ -112,31 +113,30 @@ BOOST_AUTO_TEST_SUITE(DESolver_test)
     BOOST_AUTO_TEST_CASE(DESolver_get_solution_test) {
         DESolver deSolver(1, 1, 1);
         MultiIndex *alpha = new MultiIndex(1);
-        NeuralNetwork *network = deSolver.get_solution(*alpha);
-        BOOST_CHECK_EQUAL(1, network->get_n_inputs());
-        BOOST_CHECK_EQUAL(1, network->get_n_outputs());
+        BOOST_CHECK_EQUAL(1, deSolver.get_solution(*alpha)->get_n_inputs());
+        BOOST_CHECK_EQUAL(1, deSolver.get_solution(*alpha)->get_n_outputs());
     }
 
     BOOST_AUTO_TEST_CASE(DESolver_add_eq_test){
-        DESolver *deSolver = new DESolver(1,1,1);
-        MultiIndex *multiIndex = new MultiIndex(2);
-        multiIndex->set_partial_derivative(0,1);
-        multiIndex->set_partial_derivative(1,0.5);
-
-        deSolver->add_to_differential_equation(0, *multiIndex, "0.5" );
-
-        std::vector<double> inp, out;
-        std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec_dy;
-        inp = {0.0};
-        out = {8.0};
-        data_vec_dy.emplace_back(std::make_pair(inp, out));
-        DataSet ds_02(&data_vec_dy);
-
-        deSolver->set_error_function( 0, ErrorFunctionType::ErrorFuncMSE, &ds_02 );
-
-        std::vector<double> weights;
-        weights.push_back(1.0);
-        BOOST_CHECK_EQUAL(64,deSolver->eval_total_error(weights));
+  //      DESolver *deSolver = new DESolver(1,1,1);
+  //      MultiIndex *multiIndex = new MultiIndex(2);
+  //      multiIndex->set_partial_derivative(0,1);
+  //      multiIndex->set_partial_derivative(1,0.5);
+
+		//deSolver->add_to_differential_equation(0, *multiIndex, "0.5" );
+		//
+  //      std::vector<double> inp, out;
+  //      std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec_dy;
+  //      inp = {0.0};
+  //      out = {8.0};
+  //      data_vec_dy.emplace_back(std::make_pair(inp, out));
+  //      DataSet ds_02(&data_vec_dy);
+
+  //      deSolver->set_error_function( 0, ErrorFunctionType::ErrorFuncMSE, &ds_02 );
+
+  //      std::vector<double> weights;
+  //      weights.push_back(1.0);
+  //      BOOST_CHECK_EQUAL(64,deSolver->eval_total_error(weights));
     }
-
+	
 BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/tests/DataSet_test.cpp b/src/tests/DataSet_test.cpp
index f9d6746537f43f84b45cf2ca6e73781c4e630edb..ae6679caa26eabb090640ee11b42048970dde054 100644
--- a/src/tests/DataSet_test.cpp
+++ b/src/tests/DataSet_test.cpp
@@ -6,33 +6,34 @@
  */
 
 #define BOOST_TEST_MODULE DataSet_test
- 
-#include "boost_unit_tests_preamble.h"
 
-#include "../DataSet/DataSet.h"
-//#include <cstdio>
-//#include <iostream>
+#ifdef _WINDOWS
+	#include <boost/test/included/unit_test.hpp>
+#else
 
-//#include <boost/filesystem.hpp>
+	#ifndef BOOST_TEST_DYN_LINK
+	#define BOOST_TEST_DYN_LINK
+	#endif
+
+	#ifndef BOOST_TEST_NO_MAIN
+	#define BOOST_TEST_NO_MAIN
+	#endif
+
+	#include <boost/test/unit_test.hpp>
+	#include <boost/test/output_test_stream.hpp>
+#endif
+
+#include "../DataSet/DataSet.h"
+#include "stdio.h"
+#include <iostream>
 
-using namespace lib4neuro;
 
 /**
  * Boost testing suite for testing DataSet.h
  */
 BOOST_AUTO_TEST_SUITE(DataSet_test)
 
-    struct cout_redirect {
-        cout_redirect(std::streambuf *new_buffer)
-                : old(std::cout.rdbuf(new_buffer)) {}
-
-        ~cout_redirect() {
-            std::cout.rdbuf(old);
-        }
-
-    private:
-        std::streambuf *old;
-    };
+ 
 
 /**
  * Test of DataSet constructor with filepath parameter
@@ -40,8 +41,9 @@ BOOST_AUTO_TEST_SUITE(DataSet_test)
     BOOST_AUTO_TEST_CASE(DataSet_construction_from_file_test) {
         //test of exception with non-existing file path
         //TODO resolve exception throw
-      //  DataSet dataSet("file/unknown");
-        //BOOST_CHECK_THROW(DataSet dataSet("file unknown"), boost::archive::archive_exception::input_stream_error);
+        //DataSet dataSet("file/unknown");
+		
+		//BOOST_CHECK_THROW(DataSet dataSet("file unknown"), std::out_of_range);// boost::archive::archive_exception::input_stream_error);
     }
 
 /**
@@ -80,7 +82,6 @@ BOOST_AUTO_TEST_SUITE(DataSet_test)
         DataSet dataSet(&data_vec);
 
         //test of equal data
-        //TODO out of range, ==
        BOOST_CHECK_EQUAL(0, dataSet.get_data()->at(0).first.at(0));
        BOOST_CHECK_EQUAL(4, dataSet.get_data()->at(0).second.at(0));
 
@@ -170,8 +171,6 @@ BOOST_AUTO_TEST_SUITE(DataSet_test)
  * Test of print_data method
  */
     BOOST_AUTO_TEST_CASE(DataSet_print_data_test) {
-		//TODO this test causes problems on windows machines
-		/*
         std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec;
         std::vector<double> inp, out;
 
@@ -181,18 +180,17 @@ BOOST_AUTO_TEST_SUITE(DataSet_test)
         }
 
         data_vec.emplace_back(std::make_pair(inp, out));
-
         DataSet dataSet(&data_vec);
-
-        boost::test_tools::output_test_stream output;
-        {
-            cout_redirect guard(output.rdbuf());
-            dataSet.print_data();
-        }
+		std::stringstream buffer;
+		std::streambuf * old = std::cout.rdbuf(buffer.rdbuf());
+		dataSet.print_data();
+   
 
         //Test of correct print of DataSet
-        BOOST_CHECK(output.is_equal("0 -> 4 \n"));
-		*/
+		std::string text = buffer.str();
+        BOOST_CHECK(text._Equal("0 -> 4 \n"));
+		std::cout.rdbuf(old);
+
     }
 
 /**
@@ -215,7 +213,6 @@ BOOST_AUTO_TEST_SUITE(DataSet_test)
         dataSet.store_text(filename);
 
         //Test of correct file creations
-        //BOOST_CHECK(boost::filesystem::exists( "testDataSet" ));
 
         DataSet newDataSet("testDataSet");
 
@@ -226,4 +223,4 @@ BOOST_AUTO_TEST_SUITE(DataSet_test)
         remove("testDataSet");
     }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/tests/ErrorFunctions_test.cpp b/src/tests/ErrorFunctions_test.cpp
index d05b98d8e45f2b95c7d3e2cea647aaf33a6e194c..74502682d750b53c4a34648ed8d57cb2033c17d2 100644
--- a/src/tests/ErrorFunctions_test.cpp
+++ b/src/tests/ErrorFunctions_test.cpp
@@ -9,9 +9,61 @@
 #include "boost_unit_tests_preamble.h"
 
 #include "../ErrorFunction/ErrorFunctions.h"
+#include <turtle/mock.hpp>
 
 using namespace lib4neuro;
 
+MOCK_BASE_CLASS(mock_network, lib4neuro::NeuralNetwork)
+{
+	MOCK_METHOD(get_subnet, 2)
+	MOCK_METHOD(add_neuron, 3)
+	MOCK_METHOD(add_connection_simple, 4)
+	MOCK_METHOD(add_existing_connection, 4)
+	MOCK_METHOD(copy_parameter_space, 1)
+	MOCK_METHOD(set_parameter_space_pointers, 1)
+	MOCK_METHOD(eval_single, 3)
+	MOCK_METHOD(add_to_gradient_single, 4)
+	MOCK_METHOD(randomize_weights, 0)
+	MOCK_METHOD(randomize_biases, 0)
+	MOCK_METHOD(randomize_parameters, 0)
+	MOCK_METHOD(get_n_inputs, 0)
+	MOCK_METHOD(get_n_outputs, 0)
+	MOCK_METHOD(get_n_weights, 0)
+	MOCK_METHOD(get_n_biases, 0)
+	MOCK_METHOD(get_neuron_bias_index, 1)
+	MOCK_METHOD(get_n_neurons, 0)
+	MOCK_METHOD(specify_input_neurons, 1)
+	MOCK_METHOD(specify_output_neurons, 1)
+	MOCK_METHOD(get_parameter_ptr_biases, 0)
+	MOCK_METHOD(get_parameter_ptr_weights, 0)
+	MOCK_METHOD(save_text, 1)
+	MOCK_METHOD(print_stats, 0)
+	MOCK_METHOD(print_weights, 0)
+};
+
+MOCK_BASE_CLASS(mock_error_fun, lib4neuro::ErrorFunction) {
+	MOCK_METHOD(eval, 1)
+	MOCK_METHOD(calculate_error_gradient, 3)
+	MOCK_METHOD(get_parameters, 0)
+	MOCK_METHOD(get_dataset, 0)
+	MOCK_METHOD(get_dimension,0)
+};
+
+MOCK_BASE_CLASS(mock_dataSet, lib4neuro::DataSet)
+{
+   // MOCK_CONSTRUCTOR( mock_dataSet, 4, (int, int, int, int), inde)
+	MOCK_CONSTRUCTOR_TPL( mock_dataSet, 1, (std::vector<std::pair<std::vector<double>, std::vector<double>>>), identifier2)
+	MOCK_METHOD(add_data_pair, 2)
+	MOCK_METHOD(get_n_elements, 0)
+	MOCK_METHOD(get_input_dim, 0)
+	MOCK_METHOD(get_output_dim, 0)
+	MOCK_METHOD(print_data, 0)
+	MOCK_METHOD(store_text, 1)
+		
+};
+
+
+
 /**
  * Boost testing suite for testing ErrorFunction.h
  * doesn't test inherited methods
@@ -19,22 +71,26 @@ using namespace lib4neuro;
 BOOST_AUTO_TEST_SUITE(ErrorFunctions_test);
 
     BOOST_AUTO_TEST_CASE(ErrorFunction_MSE_Construction_Test) {
-        NeuralNetwork network;
-        std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec;
-        std::vector<double> inp, out;
-        for (int i = 0; i < 3; i++) {
-            inp.push_back(i);
-            out.push_back(i + 4);
-        }
-        data_vec.emplace_back(std::make_pair(inp, out));
-        DataSet dataSet(&data_vec);
-        BOOST_CHECK_NO_THROW(MSE mse(&network, &dataSet));
+        mock_network network;
+		MOCK_EXPECT(network.get_n_biases).returns(1);
+		MOCK_EXPECT(network.get_n_weights).returns(1);
+		std::vector<double> inp, out;
+		std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec_dy;
+		inp = { 0.0 };
+		out = { 8.0 };
+		data_vec_dy.emplace_back(std::make_pair(inp, out));
+		DataSet ds_02(&data_vec_dy);
+		
+		//mock_dataSet dataSet(data_vec_dy);
+		//MOCK_EXPECT(dataSet.identifier2);
+		BOOST_CHECK_NO_THROW(MSE mse(&network, &ds_02));
     }
 
     BOOST_AUTO_TEST_CASE(ErrorFunction_MSE_Eval_Test) {
-        Neuron *n1 = new NeuronLinear();
-        Neuron *n2 = new NeuronLinear();
-        NeuralNetwork network;
+        mock_network network;
+		MOCK_EXPECT(network.get_n_biases).returns(1);
+		MOCK_EXPECT(network.get_n_weights).returns(1);
+		MOCK_EXPECT(network.eval_single);
         std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec;
         std::vector<double> inp, out;
         for (int i = 0; i < 1; i++) {
@@ -42,16 +98,6 @@ BOOST_AUTO_TEST_SUITE(ErrorFunctions_test);
             out.push_back(i + 4);
         }
         data_vec.emplace_back(std::make_pair(inp, out));
-        network.add_neuron(n1);
-        network.add_neuron(n2);
-        network.add_connection_simple(0, 1, SIMPLE_CONNECTION_TYPE::UNITARY_WEIGHT, 2.5);
-        network.randomize_weights();
-        std::vector<size_t> net_input_neurons_indices(1);
-        std::vector<size_t> net_output_neurons_indices(1);
-        net_input_neurons_indices[0] = 0;
-        net_output_neurons_indices[0] = 1;
-        network.specify_input_neurons(net_input_neurons_indices);
-        network.specify_output_neurons(net_output_neurons_indices);
 
         DataSet dataSet(&data_vec);
 
@@ -60,13 +106,13 @@ BOOST_AUTO_TEST_SUITE(ErrorFunctions_test);
 
         MSE mse(&network, &dataSet);
 
-        BOOST_CHECK_EQUAL(9, mse.eval(&weights));
+        BOOST_CHECK_EQUAL(16, mse.eval(&weights));
     }
-
+	
     BOOST_AUTO_TEST_CASE(ErrorFunction_MSE_Get_dimension_test) {
-        Neuron *n1 = new NeuronLinear();
-        Neuron *n2 = new NeuronLinear();
-        NeuralNetwork network;
+		mock_network network;
+		MOCK_EXPECT(network.get_n_biases).returns(1);
+		MOCK_EXPECT(network.get_n_weights).returns(1);
         std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec;
         std::vector<double> inp, out;
         for (int i = 0; i < 1; i++) {
@@ -74,17 +120,7 @@ BOOST_AUTO_TEST_SUITE(ErrorFunctions_test);
             out.push_back(i + 4);
         }
         data_vec.emplace_back(std::make_pair(inp, out));
-        network.add_neuron(n1);
-        network.add_neuron(n2);
-        network.add_connection_simple(0, 1, SIMPLE_CONNECTION_TYPE::UNITARY_WEIGHT, 2.5);
-        network.randomize_weights();
-        std::vector<size_t> net_input_neurons_indices(1);
-        std::vector<size_t> net_output_neurons_indices(1);
-        net_input_neurons_indices[0] = 0;
-        net_output_neurons_indices[0] = 1;
-        network.specify_input_neurons(net_input_neurons_indices);
-        network.specify_output_neurons(net_output_neurons_indices);
-
+       
         DataSet dataSet(&data_vec);
 
         MSE mse(&network, &dataSet);
@@ -95,94 +131,44 @@ BOOST_AUTO_TEST_SUITE(ErrorFunctions_test);
     BOOST_AUTO_TEST_CASE(ErrorFunction_MSE_SUM_Construction_Test) {
         BOOST_CHECK_NO_THROW(ErrorSum mse_sum);
     }
-
+	
     BOOST_AUTO_TEST_CASE(ErrorFunction_MSE_SUM_Add_Error_Function_Test) {
-        NeuralNetwork network;
-        std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec;
-        std::vector<double> inp, out;
-        for (int i = 0; i < 3; i++) {
-            inp.push_back(i);
-            out.push_back(i + 4);
-        }
-        data_vec.emplace_back(std::make_pair(inp, out));
-        DataSet dataSet(&data_vec);
-
-        ErrorFunction *f = new MSE(&network, &dataSet);
-
+        
+		mock_error_fun f;
+		MOCK_EXPECT(f.get_dimension).returns(1);
         ErrorSum mse_sum;
-        BOOST_CHECK_NO_THROW(mse_sum.add_error_function(f));
+		BOOST_CHECK_NO_THROW(mse_sum.add_error_function(&f, 1));
     }
-
+	
     BOOST_AUTO_TEST_CASE(ErrorFunction_MSE_SUM_Eval_Test) {
-        ErrorSum mse_sum;
-
-        Neuron *n1 = new NeuronLinear();
-        Neuron *n2 = new NeuronLinear();
-        NeuralNetwork network;
-        std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec;
-        std::vector<double> inp, out;
-        for (int i = 0; i < 1; i++) {
-            inp.push_back(i);
-            out.push_back(i + 4);
-        }
-        data_vec.emplace_back(std::make_pair(inp, out));
-        network.add_neuron(n1);
-        network.add_neuron(n2);
-        network.add_connection_simple(0, 1, SIMPLE_CONNECTION_TYPE::UNITARY_WEIGHT, 2.5);
-        network.randomize_weights();
-        std::vector<size_t> net_input_neurons_indices(1);
-        std::vector<size_t> net_output_neurons_indices(1);
-        net_input_neurons_indices[0] = 0;
-        net_output_neurons_indices[0] = 1;
-        network.specify_input_neurons(net_input_neurons_indices);
-        network.specify_output_neurons(net_output_neurons_indices);
-
-        DataSet dataSet(&data_vec);
-
-        ErrorFunction *f = new MSE(&network, &dataSet);
-
-        mse_sum.add_error_function(f);
+		mock_error_fun f;
+		MOCK_EXPECT(f.get_dimension).returns(1);
+		MOCK_EXPECT(f.eval).returns(1.75);
+		ErrorSum mse_sum;
 
         std::vector<double> weights;
         weights.push_back(1);
 
-        BOOST_CHECK_EQUAL(9, mse_sum.eval(&weights));
+		mse_sum.add_error_function(&f);
+        BOOST_CHECK_EQUAL(1.75, mse_sum.eval(&weights));
     }
-
+	
     BOOST_AUTO_TEST_CASE(ErrorFunction_MSE_SUM_Get_Dimension_test) {
         ErrorSum mse_sum;
         BOOST_CHECK_EQUAL(0, mse_sum.get_dimension());
+		mock_error_fun f;
+		MOCK_EXPECT(f.get_dimension).returns(2);
+		MOCK_EXPECT(f.eval).returns(1.75);
+		
 
-        Neuron *n1 = new NeuronLinear();
-        Neuron *n2 = new NeuronLinear();
-        NeuralNetwork network;
-        std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec;
-        std::vector<double> inp, out;
-        for (int i = 0; i < 1; i++) {
-            inp.push_back(i);
-            out.push_back(i + 4);
-        }
-        data_vec.emplace_back(std::make_pair(inp, out));
-        network.add_neuron(n1);
-        network.add_neuron(n2);
-        network.add_connection_simple(0, 1, SIMPLE_CONNECTION_TYPE::UNITARY_WEIGHT, 2.5);
-        network.randomize_weights();
-        std::vector<size_t> net_input_neurons_indices(1);
-        std::vector<size_t> net_output_neurons_indices(1);
-        net_input_neurons_indices[0] = 0;
-        net_output_neurons_indices[0] = 1;
-        network.specify_input_neurons(net_input_neurons_indices);
-        network.specify_output_neurons(net_output_neurons_indices);
-
-        DataSet dataSet(&data_vec);
-
-        ErrorFunction *f = new MSE(&network, &dataSet);
+		std::vector<double> weights;
+		weights.push_back(1);
 
-        mse_sum.add_error_function(f);
+		mse_sum.add_error_function(&f);
 
         BOOST_CHECK_EQUAL(2, mse_sum.get_dimension());
 
     }
 
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/tests/NeuralNetworkSum_test.cpp b/src/tests/NeuralNetworkSum_test.cpp
index ce538b830299406a7352d0ea48b8afd2d5c44898..d757730a469cc2d9d7456d96577b668d1fe5f73b 100644
--- a/src/tests/NeuralNetworkSum_test.cpp
+++ b/src/tests/NeuralNetworkSum_test.cpp
@@ -7,17 +7,45 @@
 
 #define BOOST_TEST_MODULE NeuralNetworkSum_test
 
+
 #include "boost_unit_tests_preamble.h"
 
 #include "../Network/NeuralNetworkSum.h"
-
+#include <turtle/mock.hpp>
 using namespace lib4neuro;
 
+MOCK_BASE_CLASS(mock_network, lib4neuro::NeuralNetwork)
+{
+	MOCK_METHOD(get_subnet, 2)
+		MOCK_METHOD(add_neuron, 3)
+		MOCK_METHOD(add_connection_simple, 4)
+		MOCK_METHOD(add_existing_connection, 4)
+		MOCK_METHOD(copy_parameter_space, 1)
+		MOCK_METHOD(set_parameter_space_pointers, 1)
+		MOCK_METHOD(eval_single, 3)
+		MOCK_METHOD(add_to_gradient_single, 4)
+		MOCK_METHOD(randomize_weights, 0)
+		MOCK_METHOD(randomize_biases, 0)
+		MOCK_METHOD(randomize_parameters, 0)
+		MOCK_METHOD(get_n_inputs, 0)
+		MOCK_METHOD(get_n_outputs, 0)
+		MOCK_METHOD(get_n_weights, 0)
+		MOCK_METHOD(get_n_biases, 0)
+		MOCK_METHOD(get_neuron_bias_index, 1)
+		MOCK_METHOD(get_n_neurons, 0)
+		MOCK_METHOD(specify_input_neurons, 1)
+		MOCK_METHOD(specify_output_neurons, 1)
+		MOCK_METHOD(get_parameter_ptr_biases, 0)
+		MOCK_METHOD(get_parameter_ptr_weights, 0)
+		MOCK_METHOD(save_text, 1)
+		MOCK_METHOD(print_stats, 0)
+		MOCK_METHOD(print_weights, 0)
+};
+
 /**
  * Boost testing suite for testing NeuralNetworkSum.h
  */
 BOOST_AUTO_TEST_SUITE(NeuralNetworkSum_test)
-
     /**
      * Test of creating new instance of NeuralNetworkSum
      */
@@ -27,28 +55,17 @@ BOOST_AUTO_TEST_SUITE(NeuralNetworkSum_test)
     }
 
     BOOST_AUTO_TEST_CASE(NeuralNetworkSum_add_network_test) {
-        NeuralNetwork network;
+        mock_network network;
+		//NeuralNetwork network;
         NeuralNetworkSum networkSum;
-
-        BOOST_CHECK_NO_THROW(networkSum.add_network(&network, "5"));
+		std::string po = "f(x,y,z,t) =x+y+z+t";
+        BOOST_CHECK_NO_THROW(networkSum.add_network(&network, po));
     }
 
-    BOOST_AUTO_TEST_CASE(NeuralNetworkSum_eval_single_weights_test) {
-        Neuron *n1 = new NeuronLinear();
-        Neuron *n2 = new NeuronLinear();
-        NeuralNetwork network;
-        network.add_neuron(n1);
-        network.add_neuron(n2);
-
-        network.add_connection_simple(0, 1, SIMPLE_CONNECTION_TYPE::UNITARY_WEIGHT, 2.5);
-
-        std::vector<size_t> output_neuron_indices(1);
-        output_neuron_indices[0] = (size_t) 1;
-        network.specify_output_neurons(output_neuron_indices);
-
-        std::vector<size_t> input_neuron_indices(1);
-        input_neuron_indices[0] = (size_t) 0;
-        network.specify_input_neurons(input_neuron_indices);
+   BOOST_AUTO_TEST_CASE(NeuralNetworkSum_eval_single_weights_test) {
+       
+	   mock_network network;
+	   MOCK_EXPECT(network.eval_single);
 
         std::vector<double> input;
         input.push_back(1);
@@ -57,28 +74,22 @@ BOOST_AUTO_TEST_SUITE(NeuralNetworkSum_test)
 
         double weights = 5;
         NeuralNetworkSum networkSum;
-        networkSum.add_network(&network, "2");
+        networkSum.add_network(&network, "f(x) =x");
 
         networkSum.eval_single(input, output);
-        BOOST_CHECK_EQUAL(2, output.at(0));
+        BOOST_CHECK_EQUAL(0, output.at(0));
     }
 
     BOOST_AUTO_TEST_CASE(NeuralNetworkSum_get_weights_test) {
         NeuralNetworkSum networkSum;
         BOOST_CHECK_EQUAL(0, networkSum.get_n_weights());
 
-        Neuron *n1 = new NeuronLinear();
-        Neuron *n2 = new NeuronLinear();
-        NeuralNetwork network;
-        network.add_neuron(n1);
-        network.add_neuron(n2);
-
-        network.add_connection_simple(0, 1, SIMPLE_CONNECTION_TYPE::NEXT_WEIGHT, 2.5);
-
-        networkSum.add_network(&network, "2");
+		mock_network network;
+		MOCK_EXPECT(network.get_n_weights).returns(1);
+        networkSum.add_network(&network, "f(x) =x");
 
         BOOST_CHECK_EQUAL(1, networkSum.get_n_weights());
     }
 
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/tests/NeuralNetwork_test.cpp b/src/tests/NeuralNetwork_test.cpp
index e81fd5ab953f1b9eabc0687f523e0491d2619e8e..7fefcf72394aeed0131bb6400c20ac2b6c5c4a60 100644
--- a/src/tests/NeuralNetwork_test.cpp
+++ b/src/tests/NeuralNetwork_test.cpp
@@ -8,22 +8,18 @@
 #define BOOST_TEST_MODULE NeuralNetwork_test
 
 #include "boost_unit_tests_preamble.h"
-
+#include <turtle/mock.hpp>
 #include "../Network/NeuralNetwork.h"
 
 using namespace lib4neuro;
 
-struct cerr_redirect {
-    cerr_redirect(std::streambuf *new_buffer)
-            : old(std::cerr.rdbuf(new_buffer)
-    ) {}
-
-    ~cerr_redirect() {
-        std::cout.rdbuf(old);
-    }
 
-private:
-    std::streambuf *old;
+MOCK_BASE_CLASS(mock_NeuronLinear, lib4neuro::NeuronLinear)
+{
+	MOCK_METHOD(activate, 2)
+		MOCK_METHOD(activation_function_eval_derivative_bias, 2)
+		MOCK_METHOD(activation_function_eval_derivative, 2)
+		MOCK_METHOD(get_derivative, 0)
 };
 
 /**
@@ -44,9 +40,10 @@ BOOST_AUTO_TEST_SUITE(NeuralNetwork_test)
      * Existing bias out of range cancelation
      */
     BOOST_AUTO_TEST_CASE(NeuralNetwork_add_neuron_test) {
-        Neuron *n1 = new NeuronLinear();
-        Neuron *n2 = new NeuronLinear();
-        Neuron *n3 = new NeuronLinear();
+		mock_NeuronLinear *n1 = new mock_NeuronLinear;
+		mock_NeuronLinear *n2 = new mock_NeuronLinear;
+		mock_NeuronLinear *n3 = new mock_NeuronLinear;
+		mock_NeuronLinear *n4 = new mock_NeuronLinear;
 
         NeuralNetwork network;
 
@@ -61,22 +58,15 @@ BOOST_AUTO_TEST_SUITE(NeuralNetwork_test)
 
         BOOST_CHECK_EQUAL(2, network.get_n_biases());
 
-//////TODO fix dumping stack error
-//        boost::test_tools::output_test_stream output;
-//        {
-//            cerr_redirect guard(output.rdbuf());
-//          network.add_neuron(n3, BIAS_TYPE::EXISTING_BIAS, 3);
-//        }
-//        BOOST_CHECK(output.is_equal("The supplied bias index is too large!\n\n"));
-    }
+  }
 
     /**
      * Test of add_connection_simple method
      */
     BOOST_AUTO_TEST_CASE(NeuralNetwork_add_connection_simple_test) {
-        Neuron *n1 = new NeuronLinear();
-        Neuron *n2 = new NeuronLinear();
-        NeuralNetwork network;
+		mock_NeuronLinear *n1 = new mock_NeuronLinear;
+		mock_NeuronLinear *n2 = new mock_NeuronLinear;
+		NeuralNetwork network;
         network.add_neuron(n1, BIAS_TYPE::NO_BIAS);
         network.add_neuron(n2, BIAS_TYPE::NO_BIAS);
 
@@ -87,13 +77,6 @@ BOOST_AUTO_TEST_SUITE(NeuralNetwork_test)
         BOOST_CHECK_EQUAL(4, network.add_connection_simple(0, 1, SIMPLE_CONNECTION_TYPE::EXISTING_WEIGHT, 1));
 
         BOOST_CHECK_EQUAL(2, network.get_n_weights());
-//TODO fix dumping stack error
-//        boost::test_tools::output_test_stream output;
-//        {
-//            cerr_redirect guard(output.rdbuf());
-//            network.add_connection_simple(0, 1, SIMPLE_CONNECTION_TYPE::EXISTING_WEIGHT,10);
-//        }
-//        BOOST_CHECK(output.is_equal("The supplied connection weight index is too large!\n\n"));
     }
 
     /**
@@ -101,8 +84,10 @@ BOOST_AUTO_TEST_SUITE(NeuralNetwork_test)
      */
     BOOST_AUTO_TEST_CASE(NeuralNetwork_specify_inputs_neurons_test) {
         NeuralNetwork network;
-        Neuron *n1 = new NeuronLinear();
-        network.add_neuron(n1, BIAS_TYPE::NO_BIAS);
+		mock_NeuronLinear po;
+		mock_NeuronLinear *n1 = new mock_NeuronLinear();
+
+		network.add_neuron(n1, BIAS_TYPE::NO_BIAS);
 
         std::vector<size_t> inputs;
         inputs.push_back(0);
@@ -114,8 +99,8 @@ BOOST_AUTO_TEST_SUITE(NeuralNetwork_test)
 
     BOOST_AUTO_TEST_CASE(NeuralNetwork_specify_outputs_neurons_test) {
         NeuralNetwork network;
-        Neuron *n1 = new NeuronLinear();
-        network.add_neuron(n1, BIAS_TYPE::NO_BIAS);
+		mock_NeuronLinear *n1 = new mock_NeuronLinear;
+		network.add_neuron(n1, BIAS_TYPE::NO_BIAS);
 
         std::vector<size_t> outputs;
         outputs.push_back(0);
@@ -126,8 +111,14 @@ BOOST_AUTO_TEST_SUITE(NeuralNetwork_test)
     }
 
     BOOST_AUTO_TEST_CASE(NeuralNetwork_eval_single_test) {
-        Neuron *n1 = new NeuronLinear();
-        Neuron *n2 = new NeuronLinear();
+		mock_NeuronLinear *n1 = new mock_NeuronLinear();
+		mock_NeuronLinear *n2 = new mock_NeuronLinear();
+
+		mock_NeuronLinear n3 = *n1;
+		mock_NeuronLinear n4 = *n2;
+		MOCK_EXPECT(n3.activate).returns(5);
+		MOCK_EXPECT(n4.activate).returns(5);
+
 
         NeuralNetwork network;
         network.add_neuron(n1);
@@ -153,9 +144,10 @@ BOOST_AUTO_TEST_SUITE(NeuralNetwork_test)
     }
 
     BOOST_AUTO_TEST_CASE(NeuralNetwork_randomize_weights_test) {
-        Neuron *n1 = new NeuronLinear();
-        Neuron *n2 = new NeuronLinear();
-        NeuralNetwork network;
+		mock_NeuronLinear *n1 = new mock_NeuronLinear();
+		mock_NeuronLinear *n2 = new mock_NeuronLinear();
+		
+		NeuralNetwork network;
         network.add_neuron(n1, BIAS_TYPE::NO_BIAS);
         network.add_neuron(n2, BIAS_TYPE::NO_BIAS);
 
@@ -174,4 +166,4 @@ BOOST_AUTO_TEST_SUITE(NeuralNetwork_test)
         BOOST_CHECK(sum<0.15 && sum>-0.15);
     }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/tests/ParticleSwarm_test.cpp b/src/tests/ParticleSwarm_test.cpp
index 3d4850b7510d794e7c06e15ca648c2bda6c6b338..8e017c641a656a9bfbf73da6bcc935ca8a5988eb 100644
--- a/src/tests/ParticleSwarm_test.cpp
+++ b/src/tests/ParticleSwarm_test.cpp
@@ -10,7 +10,18 @@
 #include "boost_unit_tests_preamble.h"
 
 #include "../LearningMethods/ParticleSwarm.h"
-
+#include <turtle/mock.hpp>
+
+MOCK_BASE_CLASS(mock_Error, lib4neuro::ErrorFunction)
+{
+	MOCK_METHOD(eval, 1)
+		MOCK_METHOD(calculate_error_gradient, 3)
+		MOCK_METHOD(get_parameters, 0)
+		MOCK_METHOD(get_dataset, 0)
+		MOCK_METHOD(get_dimension, 0)
+		
+
+};
 using namespace lib4neuro;
 
 /**
@@ -28,49 +39,39 @@ BOOST_AUTO_TEST_SUITE(ParticleSwarm_test)
     BOOST_AUTO_TEST_CASE(ParticleSwarm_construction_test){
         std::vector<double> domain_bound;
         domain_bound.push_back(5);
-        NeuralNetwork network;
-//        std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec;
-//        std::vector<double> inp, out;
-//
-//        for (int i = 0; i < 3; i++) {
-//            inp.push_back(i);
-//            out.push_back(i + 4);
-//        }
-//
-//        data_vec.emplace_back(std::make_pair(inp, out));
-//
-//        DataSet dataSet(&data_vec);
-//        ErrorFunction *error = new MSE(&network, &dataSet);
-
+        
         BOOST_CHECK_NO_THROW(ParticleSwarm swarm(&domain_bound, 0, 1, 1, 0.5, 0.05, 0.5, 0, 20));
     }
 
-    BOOST_AUTO_TEST_CASE(ParticleSwarm_optimalize_test){
+    BOOST_AUTO_TEST_CASE(ParticleSwarm_optimalize_and_get_parameters_test){
         std::vector<double> domain_bound;
-        domain_bound.push_back(5);
-        NeuralNetwork network;
-        std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec;
-        std::vector<double> inp, out;
-
-        for (int i = 0; i < 3; i++) {
-            inp.push_back(i);
-            out.push_back(i + 4);
-        }
-
-        data_vec.emplace_back(std::make_pair(inp, out));
-
-        DataSet dataSet(&data_vec);
-        ErrorFunction *error = new MSE(&network, &dataSet);
-
-        ParticleSwarm swarm(&domain_bound, 0, 1, 1, -1,1,1, 0, 20);
-        BOOST_CHECK_THROW(swarm.optimize( *error ), std::invalid_argument) ;
-
-        ParticleSwarm swarm2(&domain_bound, 0, 1, 1, 1,-1,1, 0, 20);
-        BOOST_CHECK_THROW(swarm2.optimize( *error ), std::invalid_argument) ;
-
-        ParticleSwarm swarm3(&domain_bound, 0, 1, 1, 1,1,-1, 0, 20);
-        BOOST_CHECK_THROW(swarm3.optimize( *error ), std::invalid_argument) ;
+        domain_bound.push_back(-5);
+		domain_bound.push_back(5);
+		domain_bound.push_back(-5);
+		domain_bound.push_back(5);
+		domain_bound.push_back(-5);
+		domain_bound.push_back(5);
+		domain_bound.push_back(-5);
+		domain_bound.push_back(5);
+		domain_bound.push_back(-5);
+		domain_bound.push_back(5);
+
+       
+		mock_Error error;
+
+		MOCK_EXPECT(error.get_dimension).returns(5);
+		MOCK_EXPECT(error.eval).returns(0.8);
+
+		ParticleSwarm swarm(&domain_bound, 0, 1, 1, 1, 1, 1, 5, 20);
+				
+		BOOST_CHECK_NO_THROW(swarm.optimize(error));
+		
+	
+
+		for (int i = 0; i < swarm.get_parameters()->size(); i++) {
+			BOOST_CHECK_NO_THROW(swarm.get_parameters()->at(i));
+		}
 
     }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/tests/Particle_test.cpp b/src/tests/Particle_test.cpp
index 4fe8c88225b7d530481a116f47564d667441acb0..dd963141278f4794f27c944a5346501b24c52d14 100644
--- a/src/tests/Particle_test.cpp
+++ b/src/tests/Particle_test.cpp
@@ -7,165 +7,72 @@
 
 #define BOOST_TEST_MODULE Particle_test
 
-#include "boost_unit_tests_preamble.h"
+#ifdef _WINDOWS
+#include <boost/test/included/unit_test.hpp>
+#include <turtle/mock.hpp>
+#else
+
+#ifndef BOOST_TEST_DYN_LINK
+#define BOOST_TEST_DYN_LINK
+#endif
+
+#ifndef BOOST_TEST_NO_MAIN
+#define BOOST_TEST_NO_MAIN
+#endif
+#include <turtle/mock.hpp>
+#include <boost/test/unit_test.hpp>
+#include <boost/test/output_test_stream.hpp>
+
+#endif
 
 #include "../LearningMethods/ParticleSwarm.h"
 
-using namespace lib4neuro;
+MOCK_BASE_CLASS(mock_Error, lib4neuro::ErrorFunction)
+{
+	MOCK_METHOD(eval, 1)
+		MOCK_METHOD(calculate_error_gradient, 3)
+		MOCK_METHOD(get_parameters, 0)
+		MOCK_METHOD(get_dataset, 0)
+		MOCK_METHOD(get_dimension, 0)
+};
 
 /**
  * Boost testing suite for testing ParticleSwarm.h
  * TODO
  */
- BOOST_AUTO_TEST_SUITE(Particle_test)
-
-    BOOST_AUTO_TEST_CASE(Particle_construction_test) {
-        std::vector<double> domain_bound = {1, 2, 3, 4, 5};
-        Neuron *n1 = new NeuronLinear();
-        Neuron *n2 = new NeuronLinear();
-        NeuralNetwork network;
-        std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec;
-        std::vector<double> inp, out;
-
-        for (int i = 0; i < 1; i++) {
-            inp.push_back(i);
-            out.push_back(i + 4);
-        }
-
-        data_vec.emplace_back(std::make_pair(inp, out));
-        network.add_neuron(n1);
-        network.add_neuron(n2);
-        network.add_connection_simple(0, 1, SIMPLE_CONNECTION_TYPE::UNITARY_WEIGHT, 2.5);
-        network.randomize_weights();
-
-        std::vector<size_t> net_input_neurons_indices(1);
-        std::vector<size_t> net_output_neurons_indices(1);
-        net_input_neurons_indices[0] = 0;
-
-        net_output_neurons_indices[0] = 1;
-
-        network.specify_input_neurons(net_input_neurons_indices);
-        network.specify_output_neurons(net_output_neurons_indices);
-
-        DataSet dataSet(&data_vec);
-        ErrorFunction *error = new MSE(&network, &dataSet);
-        Particle particle(error, &domain_bound);
-        BOOST_CHECK_NO_THROW(Particle particle(error, &domain_bound));
-        //  particle.get_coordinate();
-    }
-
-    BOOST_AUTO_TEST_CASE(Particle_get_coordinate_test) {
-         std::vector<double> domain_bound = {1, 2, 3, 4, 5};
-        Neuron *n1 = new NeuronLinear();
-        Neuron *n2 = new NeuronLinear();
-        NeuralNetwork network;
-        std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec;
-        std::vector<double> inp, out;
-
-        for (int i = 0; i < 1; i++) {
-            inp.push_back(i);
-            out.push_back(i + 4);
-        }
-
-        data_vec.emplace_back(std::make_pair(inp, out));
-        network.add_neuron(n1);
-        network.add_neuron(n2);
-        network.add_connection_simple(0, 1, SIMPLE_CONNECTION_TYPE::UNITARY_WEIGHT, 2.5);
-        network.randomize_weights();
-
-        std::vector<size_t> net_input_neurons_indices(1);
-        std::vector<size_t> net_output_neurons_indices(1);
-        net_input_neurons_indices[0] = 0;
-
-        net_output_neurons_indices[0] = 1;
-
-        network.specify_input_neurons(net_input_neurons_indices);
-        network.specify_output_neurons(net_output_neurons_indices);
-
-        DataSet dataSet(&data_vec);
-        ErrorFunction *error = new MSE(&network, &dataSet);
-        Particle particle1( error, &domain_bound );
-        Particle particle2( error, &domain_bound );
-
-        BOOST_CHECK(*particle1.get_coordinate() != *particle2.get_coordinate());
-    }
-
-    //Random
-    //TODO
-     /*
-     BOOST_AUTO_TEST_CASE(particle_change_coordiante_test) {
-         double domain_bound[5] = {1,2,3,4,5};
-         Neuron *n1 = new NeuronLinear(1, 1);
-         Neuron *n2 = new NeuronLinear(2, 2);
-         NeuralNetwork network;
-         std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec;
-         std::vector<double> inp, out;
-
-         for (int i = 0; i < 1; i++) {
-             inp.push_back(i);
-             out.push_back(i + 4);
-         }
-
-         data_vec.emplace_back(std::make_pair(inp, out));
-         network.add_neuron(n1);
-         network.add_neuron(n2);
-         network.add_connection_simple(0, 1, 0, 2.5);
-         network.randomize_weights();
-
-         std::vector<size_t> net_input_neurons_indices(1);
-         std::vector<size_t> net_output_neurons_indices(1);
-         net_input_neurons_indices[0] = 0;
-
-         net_output_neurons_indices[0] = 1;
-
-         network.specify_input_neurons(net_input_neurons_indices);
-         network.specify_output_neurons(net_output_neurons_indices);
-
-
-
-         DataSet dataSet(&data_vec);
-         ErrorFunction *error = new MSE(&network, &dataSet);
-         Particle particle(error, &domain_bound[0]);
-         particle.change_coordinate(1.0, 2.0, 2.0, &domain_bound[1], 1);
-
-
-         BOOST_CHECK_EQUAL(1.32664, *particle.get_coordinate());
-     }
-
-     BOOST_AUTO_TEST_CASE(particle_optimal_value_test){
-         double domain_bound[5] = {1,2,3,4,5};
-         Neuron *n1 = new NeuronLinear(1, 1);
-         Neuron *n2 = new NeuronLinear(2, 2);
-         NeuralNetwork network;
-         std::vector<std::pair<std::vector<double>, std::vector<double>>> data_vec;
-         std::vector<double> inp, out;
-
-         for (int i = 0; i < 1; i++) {
-             inp.push_back(i);
-             out.push_back(i + 4);
-         }
-
-         data_vec.emplace_back(std::make_pair(inp, out));
-         network.add_neuron(n1);
-         network.add_neuron(n2);
-         network.add_connection_simple(0, 1, 0, 2.5);
-         network.randomize_weights();
-
-         std::vector<size_t> net_input_neurons_indices(1);
-         std::vector<size_t> net_output_neurons_indices(1);
-         net_input_neurons_indices[0] = 0;
-
-         net_output_neurons_indices[0] = 1;
-
-         network.specify_input_neurons(net_input_neurons_indices);
-         network.specify_output_neurons(net_output_neurons_indices);
+BOOST_AUTO_TEST_SUITE(Particle_test)
+
+BOOST_AUTO_TEST_CASE(Particle_construction_test) {
+	std::vector<double> domain_bound{ 1, 2, 3, 4, 5 };
+	mock_Error error;
+	MOCK_EXPECT(error.get_dimension).once().returns(5);
+	MOCK_EXPECT(error.eval).once().returns(0.8);
+	BOOST_CHECK_NO_THROW(Particle(&error, &domain_bound));
+}
+
+BOOST_AUTO_TEST_CASE(Particle_get_coordinate_test) {
+	std::vector<double> domain_bound{ 1, 2, 3, 4, 5 };
+	mock_Error error;
+
+	MOCK_EXPECT(error.get_dimension).returns(5);
+	MOCK_EXPECT(error.eval).returns(0.8);
+
+	Particle particle1(&error, &domain_bound);
+	Particle particle2(&error, &domain_bound);
+
+	BOOST_CHECK(*particle1.get_coordinate() != *particle2.get_coordinate());
+}
+BOOST_AUTO_TEST_CASE(Particle_get_optimal_value_test) {
+	std::vector<double> domain_bound{ 1, 2, 3, 4, 5 };
+	mock_Error error;
+
+	MOCK_EXPECT(error.get_dimension).returns(5);
+	MOCK_EXPECT(error.eval).returns(0.8);
+	
 
-         DataSet dataSet(&data_vec);
-         ErrorFunction *error = new MSE(&network, &dataSet);
-         Particle particle(error, &domain_bound[0]);
-         BOOST_CHECK_CLOSE(1.789708839, particle.get_optimal_value(), 0.00001 );
-     }
-     */
+	Particle particle1(&error, &domain_bound);
+	BOOST_CHECK_EQUAL(0.8, particle1.get_optimal_value());
+}
 
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()