#ifndef LIB4NEURO_ERRORFUNCTIONSMOCK_H
#define LIB4NEURO_ERRORFUNCTIONSMOCK_H

#include "../ErrorFunction/ErrorFunctions.h"
#include "../DataSet/DataSet.h"

#include <turtle/mock.hpp>

using namespace lib4neuro;


MOCK_BASE_CLASS(mock_ErrorFunction,
                lib4neuro::ErrorFunction
) {
    MOCK_METHOD(eval,
                3)

    MOCK_METHOD(eval_on_single_input,
                3)

    MOCK_METHOD(get_dimension,
                0)

    MOCK_METHOD(calculate_error_gradient,
                4)

    MOCK_METHOD(analyze_error_gradient,
                4)

    MOCK_METHOD(get_parameters,
                0)

    MOCK_METHOD(get_n_data_set,
                0)

    MOCK_METHOD(get_n_test_data_set,
                0)

    MOCK_METHOD(get_n_outputs,
                0)

    MOCK_METHOD(set_parameters,
                1)

    MOCK_METHOD(divide_data_train_test,
                1)

    MOCK_METHOD(return_full_data_set_for_training,
                0)

    MOCK_METHOD(get_jacobian_and_rhs,
                2)

    MOCK_METHOD(eval_on_test_data,
                2,
                double(std::vector<double>
                    *, bool),
                id1)

    MOCK_METHOD(eval_on_test_data,
                3,
                double(std::string, std::vector<double>
                    *, bool),
                id2)

    MOCK_METHOD(eval_on_test_data,
                3,
                double(std::ofstream
                    *, std::vector<double> *, bool),
                id3)

    MOCK_METHOD(eval_on_data_set,
                3,
                double(DataSet
                    *, std::vector<double> *, bool),
                id4)

    MOCK_METHOD(eval_on_data_set,
                4,
                double(DataSet
                    *, std::string, std::vector<double> *, bool),
                id5)

    MOCK_METHOD(eval_on_data_set,
                4,
                double(DataSet
                    *, std::ofstream *, std::vector<double> *, bool),
                id6)


    MOCK_METHOD(eval_single_item_by_idx,
                3)

    MOCK_METHOD(calculate_error_gradient_single,
                2)

    MOCK_METHOD(calculate_residual_gradient,
                4)

    MOCK_METHOD(calculate_single_residual,
                3)

    MOCK_METHOD(randomize_parameters,
                1)
};

#endif //LIB4NEURO_ERRORFUNCTIONSMOCK_H