// Copyright (C) 2005 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/queue.h> #include <dlib/static_set.h> #include <dlib/set.h> #include "tester.h" namespace { using namespace test; using namespace std; using namespace dlib; logger dlog("test.static_set"); template < typename set > void static_set_kernel_test ( ) /*! requires - set is an implementation of static_set/static_set_kernel_abstract.h and is instantiated to hold ints ensures - runs tests on set for compliance with the specs !*/ { print_spinner(); srand(static_cast<unsigned int>(time(0))); typedef queue<int>::kernel_2a_c queue_of_int; typedef dlib::set<int>::kernel_1a_c set_of_int; queue_of_int q, qb, qc; set_of_int ds; set S; S.load(ds); for (int k = 1; k < 1000; ++k) { q.clear(); qb.clear(); qc.clear(); unsigned long num = k; for (unsigned long i = 0; i < num; ++i) { int a = ::rand()&0xFF; int b = a; int c = a; q.enqueue(a); qb.enqueue(b); qc.enqueue(c); } set s; DLIB_TEST(s.size() == 0); DLIB_TEST(s.at_start()); DLIB_TEST(s.current_element_valid() == false); DLIB_TEST(s.move_next() == false); DLIB_TEST(s.current_element_valid() == false); DLIB_TEST(s.at_start() == false); s.load(q); DLIB_TEST(s.at_start()); set se; se.load(q); DLIB_TEST(se.size() == 0); DLIB_TEST(se.at_start() == true); DLIB_TEST(se.current_element_valid() == false); DLIB_TEST(se.move_next() == false); DLIB_TEST(se.at_start() == false); DLIB_TEST(se.current_element_valid() == false); DLIB_TEST(s.size() == qb.size()); DLIB_TEST(s.at_start() == true); DLIB_TEST(s.current_element_valid() == false); DLIB_TEST(s.move_next() == true); DLIB_TEST(s.at_start() == false); DLIB_TEST(s.current_element_valid() == true); s.reset(); se.reset(); swap(se,s); DLIB_TEST(s.size() == 0); DLIB_TEST(s.at_start() == true); DLIB_TEST(s.current_element_valid() == false); DLIB_TEST(s.move_next() == false); DLIB_TEST(s.at_start() == false); DLIB_TEST(s.current_element_valid() == false); DLIB_TEST(se.size() == qb.size()); DLIB_TEST(se.at_start() == true); DLIB_TEST(se.current_element_valid() == false); DLIB_TEST(se.move_next() == true); DLIB_TEST(se.at_start() == false); DLIB_TEST(se.current_element_valid() == true); s.reset(); se.reset(); swap(se,s); int last = 0; while (s.move_next()) { DLIB_TEST(last <= s.element()); last = s.element(); } while (qb.move_next()) { int a; qb.dequeue(a); DLIB_TEST(s.is_member(a)); DLIB_TEST(!se.is_member(a)); // make sure is_member() doesn't hang for (int l = 0; l < 100; ++l) { int a = ::rand(); s.is_member(a); } } swap(s,se); // serialize the state of se, then clear se, then // load the state back into se. ostringstream sout; serialize(se,sout); DLIB_TEST(se.at_start() == true); istringstream sin(sout.str()); se.clear(); deserialize(se,sin); DLIB_TEST(se.at_start() == true); last = 0; while (se.move_next()) { DLIB_TEST(last <= se.element()); last = se.element(); } DLIB_TEST(s.size() == 0); DLIB_TEST(se.size() == qc.size()); while (qc.move_next()) { int a; qc.dequeue(a); DLIB_TEST(se.is_member(a)); DLIB_TEST(!s.is_member(a)); } } } class static_set_tester : public tester { public: static_set_tester ( ) : tester ("test_static_set", "Runs tests on the static_set component.") {} void perform_test ( ) { dlog << LINFO << "testing kernel_1a"; static_set_kernel_test<static_set<int>::kernel_1a> (); dlog << LINFO << "testing kernel_1a_c"; static_set_kernel_test<static_set<int>::kernel_1a_c>(); } } a; }