int main(int argc, char ** argv)
{
	Rand::Randomize();

	size_t total_tests = 0;
	size_t total_good_tests = 0;

	ConsoleParameters params(argc, argv);
	print_debug_info = params.has(" -p | --print ");
	N = params.get(" -c | --count ", 1000);
	std::string mode_s = params.get<std::string>(" -m | --mode ", "min");

	if (mode_s.compare("min") == 0)
	{
		mode = mode_min;
	}
	else if (mode_s.compare("max") == 0)
	{
		mode = mode_max;
	}
	else if (mode_s.compare("sum") == 0)
	{
		mode = mode_sum;
	}
	else if (mode_s.compare("avg") == 0)
	{
		mode = mode_avg;
	}

	if (params.has(" -h | --help | --usage "))
	{
		std::cout << "-p, --print    -- print debug info\n";
		std::cout << "-c, --count    -- count operations in tests\n";
		std::cout << "-m, --mode {sum, max, min - by default, avg}\n";
		return 0;
	}

	Timer timer;
	FR = timer.GetFrequency();

	timer.Start();

	std::cout << "Tests:\n";

	TEST (performance_test_vector_add,                 "performance_test_vector_add")
	TEST (performance_test_vector_big_add,             "performance_test_vector_big_add")
	TEST (performance_test_ray_cross_triangle_ok,      "performance_test_ray_cross_triangle_ok")
	TEST (performance_test_timer,                      "performance_test_timer")

	timer.Stop();

	std::cout.setf( std::ios::right );
	std::cout       << "\n" << std::setfill('0') << std::setw(3) << total_good_tests << " / " << std::setw(3) << total_tests << " passed. "
			<< "       " << std::setw(3) << total_tests - total_good_tests <<  " errors.\n\n";
	std::cout << "Time: " << std::fixed << std::setprecision(8) << timer.GetTotalTimeInSeconds() << " sec. \n\n";

	return 0;
}