// Copyright (C) 2006 Davis E. King (davis@dlib.net) // License: Boost Software License See LICENSE.txt for the full license. #include <sstream> #include <string> #include <cstdlib> #include <ctime> #include <dlib/interfaces/enumerable.h> #include <dlib/array2d.h> #include "tester.h" namespace { using namespace test; using namespace dlib; using namespace std; logger dlog("test.array2d"); template < typename array2d > void array2d_kernel_test ( ) /*! requires - array2d is an implementation of array2d/array2d_kernel_abstract.h is instantiated with unsigned long ensures - runs tests on array2d for compliance with the specs !*/ { srand(static_cast<unsigned int>(time(0))); array2d test,test2; long nc, nr; DLIB_TEST(get_rect(test).is_empty()); enumerable<unsigned long>& e = test; DLIB_TEST(e.at_start() == true); DLIB_TEST(e.size() == 0); DLIB_TEST(e.at_start() == true); DLIB_TEST(e.current_element_valid() == false); DLIB_TEST (e.move_next() == false); DLIB_TEST (e.move_next() == false); DLIB_TEST (e.move_next() == false); DLIB_TEST (e.move_next() == false); DLIB_TEST (e.move_next() == false); DLIB_TEST (e.move_next() == false); DLIB_TEST(e.size() == 0); DLIB_TEST(e.at_start() == false); DLIB_TEST(e.current_element_valid() == false); e.reset(); DLIB_TEST(e.size() == 0); DLIB_TEST(e.at_start() == true); DLIB_TEST(e.current_element_valid() == false); DLIB_TEST(get_rect(test).is_empty()); DLIB_TEST(test.at_start() == true); DLIB_TEST(test.size() == 0); DLIB_TEST(test.at_start() == true); DLIB_TEST(test.current_element_valid() == false); DLIB_TEST (test.move_next() == false); DLIB_TEST (test.move_next() == false); DLIB_TEST (test.move_next() == false); DLIB_TEST (test.move_next() == false); DLIB_TEST (test.move_next() == false); DLIB_TEST (test.move_next() == false); DLIB_TEST(test.size() == 0); DLIB_TEST(test.at_start() == false); DLIB_TEST(test.current_element_valid() == false); test.reset(); DLIB_TEST(test.size() == 0); DLIB_TEST(test.at_start() == true); DLIB_TEST(test.current_element_valid() == false); test.clear(); DLIB_TEST(test.at_start() == true); DLIB_TEST(test.size() == 0); DLIB_TEST(test.at_start() == true); DLIB_TEST(test.current_element_valid() == false); DLIB_TEST (test.move_next() == false); DLIB_TEST (test.move_next() == false); DLIB_TEST (test.move_next() == false); DLIB_TEST (test.move_next() == false); DLIB_TEST (test.move_next() == false); DLIB_TEST (test.move_next() == false); test.set_size(0,0); DLIB_TEST(get_rect(test).is_empty()); DLIB_TEST(test.at_start() == true); DLIB_TEST(test.size() == 0); DLIB_TEST(test.at_start() == true); DLIB_TEST(test.current_element_valid() == false); DLIB_TEST (test.move_next() == false); DLIB_TEST (test.move_next() == false); DLIB_TEST (test.move_next() == false); DLIB_TEST (test.move_next() == false); DLIB_TEST (test.move_next() == false); DLIB_TEST (test.move_next() == false); swap(test,test2); DLIB_TEST (test2.at_start() == false); DLIB_TEST (test2.current_element_valid() == false); DLIB_TEST(test.at_start() == true); DLIB_TEST(test.current_element_valid() == false); swap(test,test2); DLIB_TEST(test2.at_start() == true); DLIB_TEST(test2.current_element_valid() == false); DLIB_TEST(test.size() == 0); DLIB_TEST(test.at_start() == false); DLIB_TEST(test.current_element_valid() == false); test.reset(); DLIB_TEST(test.size() == 0); DLIB_TEST(test.at_start() == true); DLIB_TEST(test.current_element_valid() == false); for (int j = 0; j < 30; ++j) { test2.clear(); switch (j) { case 0: nc = 10; nr = 11; break; case 1: nc = 1; nr = 1; break; case 2: nc = 100; nr = 1; break; case 3: nc = 1; nr = 100; break; default: nc = ::rand()%100 + 1; nr = ::rand()%100 + 1; break; } test.set_size(nr,nc); DLIB_TEST(get_rect(test).left() == 0); DLIB_TEST(get_rect(test).top() == 0); DLIB_TEST(get_rect(test).right() == nc-1); DLIB_TEST(get_rect(test).bottom() == nr-1); DLIB_TEST(test.size() == static_cast<unsigned long>(nc*nr)); DLIB_TEST(test.nr() == nr); DLIB_TEST(test.nc() == nc); DLIB_TEST(test.at_start() == true); DLIB_TEST(test.current_element_valid() == false); unsigned long i = 0; while (test.move_next()) { DLIB_TEST(test.current_element_valid() == true); DLIB_TEST(test.at_start() == false); test.element() = i; DLIB_TEST(const_cast<const array2d&>(test).element() == i); ++i; } DLIB_TEST(i == test.size()); DLIB_TEST(test.current_element_valid() == false); DLIB_TEST(test.nr() == nr); DLIB_TEST(test.nc() == nc); DLIB_TEST(test.at_start() == false); DLIB_TEST(test.size() == static_cast<unsigned long>(nc*nr)); i = 0; for (long row = 0; row < test.nr(); ++row) { for (long col = 0; col < test.nc(); ++col) { DLIB_TEST_MSG(test[row][col] == i, "\n\trow: " << row << "\n\tcol: " << col << "\n\ti: " << i << "\n\ttest[row][col]: " << test[row][col]); DLIB_TEST(test[row].nc() == test.nc()); DLIB_TEST(test.current_element_valid() == false); DLIB_TEST(test.nr() == nr); DLIB_TEST(test.nc() == nc); DLIB_TEST(test.at_start() == false); DLIB_TEST(test.size() == static_cast<unsigned long>(nc*nr)); ++i; } } test.reset(); i = 0; while (test.move_next()) { DLIB_TEST(test.element() == i); ++i; DLIB_TEST(test.current_element_valid() == true); DLIB_TEST(test.at_start() == false); } DLIB_TEST(i == test.size()); test.reset(); swap(test,test2); DLIB_TEST(test2.size() == static_cast<unsigned long>(nc*nr)); DLIB_TEST(test2.nr() == nr); DLIB_TEST(test2.nc() == nc); DLIB_TEST(test2.at_start() == true); DLIB_TEST(test2.current_element_valid() == false); i = 0; while (test2.move_next()) { DLIB_TEST(test2.current_element_valid() == true); DLIB_TEST(test2.at_start() == false); test2.element() = i; ++i; } DLIB_TEST(i == test2.size()); DLIB_TEST(test2.current_element_valid() == false); DLIB_TEST(test2.nr() == nr); DLIB_TEST(test2.nr() == test2.nr()); DLIB_TEST(test2.nc() == nc); DLIB_TEST(test2.nc() == test2.nc()); DLIB_TEST(test2.at_start() == false); DLIB_TEST(test2.size() == static_cast<unsigned long>(nc*nr)); i = 0; for (long row = 0; row < test2.nr(); ++row) { for (long col = 0; col < test2.nc(); ++col) { DLIB_TEST(test2[row][col] == i); DLIB_TEST(const_cast<const array2d&>(test2)[row][col] == i); DLIB_TEST(test2[row].nc() == test2.nc()); DLIB_TEST(test2.current_element_valid() == false); DLIB_TEST(test2.nr() == nr); DLIB_TEST(test2.nr() == test2.nr()); DLIB_TEST(test2.nc() == nc); DLIB_TEST(test2.nc() == test2.nc()); DLIB_TEST(test2.at_start() == false); DLIB_TEST(test2.size() == static_cast<unsigned long>(nc*nr)); ++i; } } test2.reset(); i = 0; while (test2.move_next()) { DLIB_TEST(test2.element() == i); DLIB_TEST(const_cast<const array2d&>(test2).element() == i); ++i; DLIB_TEST(test2.current_element_valid() == true); DLIB_TEST(test2.at_start() == false); } DLIB_TEST(i == test2.size()); test2.clear(); DLIB_TEST(test2.size() == 0); DLIB_TEST(test2.nr() == 0); DLIB_TEST(test2.nc() == 0); DLIB_TEST(test2.current_element_valid() == false); DLIB_TEST(test2.at_start() == true); DLIB_TEST(test.size() == 0); DLIB_TEST(test.nc() == 0); DLIB_TEST(test.nr() == 0); test.set_size(nr,nc); DLIB_TEST(test.size() == static_cast<unsigned long>(nc*nr)); DLIB_TEST(test.nc() == nc); DLIB_TEST(test.nr() == nr); } // test the serialization istringstream sin; ostringstream sout; test.clear(); test2.clear(); DLIB_TEST(test.size() == 0); DLIB_TEST(test.nc() == 0); DLIB_TEST(test.nr() == 0); DLIB_TEST(test2.size() == 0); DLIB_TEST(test2.nc() == 0); DLIB_TEST(test2.nr() == 0); test.set_size(10,10); for (long row = 0; row < test.nr(); ++row) { for (long col = 0; col < test.nc(); ++col) { test[row][col] = row*col; } } serialize(test,sout); sin.str(sout.str()); deserialize(test2,sin); DLIB_TEST(test2.size() == test.size()); DLIB_TEST(test2.nc() == test.nc()); DLIB_TEST(test2.nr() == test.nr()); DLIB_TEST(test2.size() == 100); DLIB_TEST(test2.nc() == 10); DLIB_TEST(test2.nr() == 10); for (long row = 0; row < test.nr(); ++row) { for (long col = 0; col < test.nc(); ++col) { DLIB_TEST(test[row][col] == static_cast<unsigned long>(row*col)); DLIB_TEST(test2[row][col] == static_cast<unsigned long>(row*col)); } } test.set_size(10,11); DLIB_TEST(test.nr() == 10); DLIB_TEST(test.nc() == 11); test.set_size(0,0); DLIB_TEST(test.nr() == 0); DLIB_TEST(test.nc() == 0); } class array2d_tester : public tester { public: array2d_tester ( ) : tester ("test_array2d", "Runs tests on the array2d component.") {} void perform_test ( ) { dlog << LINFO << "testing kernel_1a"; array2d_kernel_test<array2d<unsigned long>::kernel_1a> (); print_spinner(); dlog << LINFO << "testing kernel_1a_c"; array2d_kernel_test<array2d<unsigned long>::kernel_1a_c> (); print_spinner(); } } a; }