dlib C++ Library - sequence.cpp

// Copyright (C) 2004 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/sequence.h>
#include "tester.h"
namespace 
{
 using namespace test;
 using namespace std;
 using namespace dlib;
 logger dlog("test.sequence");
 template <
 typename seq
 >
 void sequence_sort_test (
 )
 /*!
 requires
 - seq is an implementation of sequence/sequence_sort_aseqract.h is instantiated 
 with int
 ensures
 - runs tests on seq for compliance with the specs 
 !*/
 { 
 srand(static_cast<unsigned int>(time(0)));
 print_spinner();
 {
 // this test is to make sure that jumping around via
 // operator[] doesn't corrupt the object
 seq a;
 for (int i = 0; i < 100; ++i)
 {
 int x = i;
 a.add(a.size(),x);
 }
 int x = 0;
 for (int i = 0; i < (int)a.size(); ++i)
 {
 DLIB_TEST_MSG(a[i] >= i,"1");
 // cout << a[i] << endl;
 }
 for (unsigned long i = 0; i < a.size(); ++i)
 {
 for (unsigned long j = i+1; j < a.size(); ++j)
 {
 if ((a[j]+a[i])%3 ==0)
 { 
 a.remove(j,x);
 --j;
 }
 }
 }
 //cout << endl;
 for (int i = 0; i < (int)a.size(); ++i)
 {
 // cout << a[i] << endl;
 DLIB_TEST_MSG(a[i] >= i,"2"); 
 }
 }
 seq test, test2;
 DLIB_TEST(test.size() == 0);
 DLIB_TEST(test.at_start() == true);
 DLIB_TEST(test.current_element_valid() == false);
 enumerable<int>& e = test;
 DLIB_TEST(e.at_start() == true);
 DLIB_TEST(e.current_element_valid() == false);
 for (int g = 0; g < 5; ++g)
 {
 test.clear();
 test2.clear();
 DLIB_TEST(test.size() == 0);
 DLIB_TEST(test.at_start() == true);
 DLIB_TEST(test.current_element_valid() == false);
 DLIB_TEST(e.at_start() == true);
 DLIB_TEST(e.current_element_valid() == false);
 DLIB_TEST(e.move_next() == false);
 DLIB_TEST(e.current_element_valid() == false);
 DLIB_TEST(e.at_start() == false);
 DLIB_TEST(test.at_start() == false);
 swap(test,test2);
 DLIB_TEST(test.at_start() == true);
 test.clear();
 test2.clear();
 int a;
 for (int i = 0; i < 100; ++i)
 {
 a = i;
 test.add(i,a);
 }
 DLIB_TEST(test.size() == 100);
 for (int i = 0; i < static_cast<int>(test.size()); ++i)
 { 
 DLIB_TEST(test[i] == i);
 } 
 swap(test,test2);
 a = 0;
 DLIB_TEST(test2.at_start() == true);
 while(test2.move_next())
 {
 DLIB_TEST(test2.at_start() == false);
 DLIB_TEST(test2.current_element_valid() == true);
 DLIB_TEST(test2.element() == a);
 ++a;
 }
 DLIB_TEST(test2.at_start() == false);
 DLIB_TEST(test2.current_element_valid() == false);
 test2.reset();
 DLIB_TEST(test2.at_start() == true);
 DLIB_TEST(test2.current_element_valid() == false);
 a = 0;
 while(test2.move_next())
 {
 DLIB_TEST(test2.at_start() == false);
 DLIB_TEST(test2.current_element_valid() == true);
 DLIB_TEST(test2.element() == a);
 ++a;
 }
 for (int i = 0; i < 1000; ++i)
 {
 a = ::rand();
 test.add(0,a);
 }
 DLIB_TEST(test.size() == 1000);
 test.sort();
 for (unsigned long i = 0; i < test.size()-1; ++i)
 {
 DLIB_TEST(test[i] <= test[i+1]); 
 }
 a = 0;
 while(test.move_next())
 {
 DLIB_TEST(a <= test.element());
 a = test.element();
 }
 test.clear();
 test2.clear();
 DLIB_TEST(test.size() == 0);
 DLIB_TEST(test2.size() == 0);
 for (int i = 0; i < 100; ++i)
 {
 a = i;
 test.add(i,a);
 }
 for (int i = 100; i < 200; ++i)
 {
 a = i;
 test.add(i,a);
 }
 test.cat(test2);
 DLIB_TEST(test.size() == 200);
 DLIB_TEST(test2.size() == 0);
 // serialize the state of test, then clear test, then
 // load the state back into test.
 ostringstream sout;
 serialize(test,sout);
 DLIB_TEST(test.at_start() == true);
 istringstream sin(sout.str());
 test.clear();
 deserialize(test,sin);
 for (int i = 0; i < 200; ++i)
 {
 DLIB_TEST(test[i] == i);
 }
 a = 0;
 while (test.move_next())
 {
 DLIB_TEST(test.element() == a);
 DLIB_TEST(test[0]==0);
 ++a;
 }
 DLIB_TEST(a == 200);
 DLIB_TEST(test[9] == 9);
 test.remove(9,a);
 DLIB_TEST(a == 9);
 DLIB_TEST(test[9] == 10);
 DLIB_TEST(test.size() == 199);
 test.remove(0,a);
 DLIB_TEST(test[0] == 1);
 DLIB_TEST(test.size() == 198);
 DLIB_TEST(a == 0);
 DLIB_TEST(test[9] == 11);
 DLIB_TEST(test[20] == 22);
 }
 {
 test.clear();
 for (int i = 0; i < 100; ++i)
 {
 int a = 3;
 test.add(0,a);
 }
 DLIB_TEST(test.size() == 100);
 remover<int>& go = test;
 for (int i = 0; i < 100; ++i)
 {
 int a = 9;
 go.remove_any(a);
 DLIB_TEST(a == 3);
 }
 DLIB_TEST(go.size() == 0);
 }
 }
 class sequence_tester : public tester
 {
 public:
 sequence_tester (
 ) :
 tester ("test_sequence",
 "Runs tests on the sequence component.")
 {}
 void perform_test (
 )
 {
 dlog << LINFO << "testing sort_1a";
 sequence_sort_test<sequence<int>::sort_1a> ();
 dlog << LINFO << "testing sort_1a_c";
 sequence_sort_test<sequence<int>::sort_1a_c>();
 dlog << LINFO << "testing sort_2a";
 sequence_sort_test<sequence<int>::sort_2a> ();
 dlog << LINFO << "testing sort_2a_c";
 sequence_sort_test<sequence<int>::sort_2a_c>();
 }
 } a;
}

AltStyle によって変換されたページ (->オリジナル) /