/* -*- mia-c++  -*-
 *
 * This file is part of MIA - a toolbox for medical image analysis 
 * Copyright (c) Leipzig, Madrid 1999-2017 Gert Wollny
 *
 * MIA is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with MIA; if not, see <http://www.gnu.org/licenses/>.
 *
 */

#include <mia/internal/plugintester.hh>

#include <mia/core/datapool.hh>
#include <mia/3d/transformfactory.hh>
#include <mia/3d/transformio.hh>
#include <mia/3d/filter/transform.hh>

using namespace transform_3dimage_filter; 
using namespace mia; 

struct TransformFixture {

	TransformFixture();
	P3DImage src; 
	C3DBounds size;

	static const float src_image_init[]; 
	static const float test_image_init[]; 

}; 



BOOST_FIXTURE_TEST_CASE( test_3dfilter_transform, TransformFixture )
{
	auto t = BOOST_TEST_create_from_plugin<C3DTransformFilterPluginFactory>("transform:file=transform.@");
	auto transformed = t->filter(src); 

	const C3DFImage& r = dynamic_cast<const C3DFImage&>(*transformed); 
	
	BOOST_REQUIRE(r.get_size() == size); 
	const float *itest = test_image_init; 
	auto ir = r.begin(); 
	for (size_t y = 0; y < size.y; ++y)
		for (size_t x = 0; x < size.x; ++x, ++ir, ++itest)
			BOOST_CHECK_EQUAL(*ir, *itest); 

}

TransformFixture::TransformFixture():
	size(10,9,2)
{
		
	src.reset((new C3DFImage(size, src_image_init))); 
        auto transform_factory = produce_3dtransform_factory("translate:imgkernel=[bspline:d=0]"); 
	auto transform = transform_factory->create(size); 
	auto params = transform->get_parameters(); 
	params[0] =  1; 
	params[1] =  2; 
	params[2] = -1; 
	transform->set_parameters(params); 
	save_transform("transform.@", *transform); 
}
	

const float TransformFixture::src_image_init[10 * 9 * 2] = {
	
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0,10,30,30, 0, 0, 0,
	0, 0, 0, 0,50,50,50, 0, 0, 0,
	0, 0, 0, 0,50,50,50, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};

const float TransformFixture::test_image_init[] = {
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0,10,30,30, 0, 0,
	0, 0, 0, 0, 0,50,50,50, 0, 0,
	0, 0, 0, 0, 0,50,50,50, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0
		
};
