summaryrefslogtreecommitdiffstats
path: root/ml/dlib/dlib/test/hash_map.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ml/dlib/dlib/test/hash_map.cpp')
-rw-r--r--ml/dlib/dlib/test/hash_map.cpp450
1 files changed, 450 insertions, 0 deletions
diff --git a/ml/dlib/dlib/test/hash_map.cpp b/ml/dlib/dlib/test/hash_map.cpp
new file mode 100644
index 000000000..09af09936
--- /dev/null
+++ b/ml/dlib/dlib/test/hash_map.cpp
@@ -0,0 +1,450 @@
+// Copyright (C) 2003 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/hash_map.h>
+#include "tester.h"
+
+namespace
+{
+
+ using namespace test;
+ using namespace std;
+ using namespace dlib;
+
+ logger dlog("test.hash_map");
+
+ template <
+ typename hash_map
+ >
+ void hash_map_kernel_test (
+ )
+ /*!
+ requires
+ - hash_map is an implementation of hash_map/hash_map_kernel_abstract.h and
+ is instantiated to map int to int
+ ensures
+ - runs tests on hash_map for compliance with the specs
+ !*/
+ {
+
+ srand(static_cast<unsigned int>(time(0)));
+
+ print_spinner();
+
+
+ hash_map test, test2;
+
+ enumerable<map_pair<int,int> >& e = test;
+ DLIB_TEST(e.at_start() == true);
+
+ for (int j = 0; j < 4; ++j)
+ {
+ print_spinner();
+
+ 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.move_next() == false);
+ DLIB_TEST(test.at_start() == false);
+ DLIB_TEST(test.current_element_valid() == false);
+
+
+ DLIB_TEST(test.size() == 0);
+ DLIB_TEST(test.is_in_domain(5) == false);
+ DLIB_TEST(test.is_in_domain(0) == false);
+ DLIB_TEST(test.is_in_domain(-999) == false);
+ DLIB_TEST(test.is_in_domain(4999) == false);
+
+
+ int a,b;
+ a = 8;
+ b = 94;
+ test.add(a,b);
+ DLIB_TEST(test.size() == 1);
+ DLIB_TEST(test.is_in_domain(8) == true);
+ DLIB_TEST(test.is_in_domain(5) == false);
+ DLIB_TEST(test.is_in_domain(0) == false);
+ DLIB_TEST(test.is_in_domain(-999) == false);
+ DLIB_TEST(test.is_in_domain(4999) == false);
+ DLIB_TEST(test[8] == 94);
+ a = 53;
+ b = 4;
+ test.add(a,b);
+ DLIB_TEST(test.size() == 2);
+ DLIB_TEST(test.is_in_domain(53) == true);
+ DLIB_TEST(test.is_in_domain(5) == false);
+ DLIB_TEST(test.is_in_domain(0) == false);
+ DLIB_TEST(test.is_in_domain(-999) == false);
+ DLIB_TEST(test.is_in_domain(4999) == false);
+ DLIB_TEST(test[53] == 4);
+
+
+ swap(test,test2);
+
+
+ DLIB_TEST_MSG(test2.size() == 2,test2.size());
+ DLIB_TEST(test2.is_in_domain(8) == true);
+ DLIB_TEST(test2.is_in_domain(5) == false);
+ DLIB_TEST(test2.is_in_domain(0) == false);
+ DLIB_TEST(test2.is_in_domain(-999) == false);
+ DLIB_TEST(test2.is_in_domain(4999) == false);
+ DLIB_TEST(test2[8] == 94);
+ DLIB_TEST(test2.size() == 2);
+ DLIB_TEST(test2.is_in_domain(53) == true);
+ DLIB_TEST(test2.is_in_domain(5) == false);
+ DLIB_TEST(test2.is_in_domain(0) == false);
+ DLIB_TEST(test2.is_in_domain(-999) == false);
+ DLIB_TEST(test2.is_in_domain(4999) == false);
+ DLIB_TEST(test2[53] == 4);
+
+
+ DLIB_TEST(test.size() == 0);
+ DLIB_TEST(test.is_in_domain(8) == false);
+ DLIB_TEST(test.is_in_domain(5) == false);
+ DLIB_TEST(test.is_in_domain(0) == false);
+ DLIB_TEST(test.is_in_domain(-999) == false);
+ DLIB_TEST(test.is_in_domain(4999) == false);
+ DLIB_TEST(test.size() == 0);
+ DLIB_TEST(test.is_in_domain(53) == false);
+ DLIB_TEST(test.is_in_domain(5) == false);
+ DLIB_TEST(test.is_in_domain(0) == false);
+ DLIB_TEST(test.is_in_domain(-999) == false);
+ DLIB_TEST(test.is_in_domain(4999) == false);
+
+
+ test.clear();
+ DLIB_TEST(test.at_start() == true);
+ 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.at_start() == false);
+
+
+ DLIB_TEST(test.size() == 0);
+
+ while (test.size() < 10000)
+ {
+ a = ::rand();
+ b = ::rand();
+ if (!test.is_in_domain(a))
+ test.add(a,b);
+ }
+
+ DLIB_TEST(test.size() == 10000);
+ test.clear();
+ DLIB_TEST(test.size() == 0);
+
+ while (test.size() < 10000)
+ {
+ a = ::rand();
+ b = ::rand();
+ if (!test.is_in_domain(a))
+ test.add(a,b);
+ }
+
+ DLIB_TEST(test.size() == 10000);
+
+ int count = 0;
+ while (test.move_next())
+ {
+ DLIB_TEST(test.element().key() == test.element().key());
+ DLIB_TEST(test.element().value() == test.element().value());
+ DLIB_TEST(test.element().key() == test.element().key());
+ DLIB_TEST(test.element().value() == test.element().value());
+
+
+
+ ++count;
+ }
+ DLIB_TEST(test.current_element_valid() == false);
+ DLIB_TEST(test.at_start() == false);
+ DLIB_TEST(test.move_next() == false);
+ DLIB_TEST(test.current_element_valid() == false);
+ DLIB_TEST(test.at_start() == false);
+ DLIB_TEST(test.move_next() == false);
+
+ DLIB_TEST(count == 10000);
+
+ test.swap(test2);
+
+ DLIB_TEST(test.size() == 2);
+ DLIB_TEST(test2.size() == 10000);
+ count = 0;
+ test2.reset();
+
+ test2.move_next();
+ test2.element().value() = 99;
+ DLIB_TEST(test2[test2.element().key()] == 99);
+ DLIB_TEST(test2.element().value() == 99);
+
+ test2.reset();
+
+ while (test2.move_next())
+ {
+ DLIB_TEST(test2[test2.element().key()] == test2.element().value());
+ DLIB_TEST(test2.element().key() == test2.element().key());
+ DLIB_TEST(test2.element().value() == test2.element().value());
+ DLIB_TEST(test2.element().key() == test2.element().key());
+ DLIB_TEST(test2.element().value() == test2.element().value());
+
+ ++count;
+ }
+ DLIB_TEST(test2.size() == 10000);
+ DLIB_TEST(count == 10000);
+ DLIB_TEST(test2.current_element_valid() == false);
+ DLIB_TEST(test2.at_start() == false);
+ DLIB_TEST(test2.move_next() == false);
+ DLIB_TEST(test2.current_element_valid() == false);
+ DLIB_TEST(test2.at_start() == false);
+ DLIB_TEST(test2.move_next() == false);
+
+
+
+ test2.clear();
+ DLIB_TEST(test2.size() == 0);
+ DLIB_TEST(test2.at_start() == true);
+
+ while (test.size() < 20000)
+ {
+ a = ::rand();
+ b = ::rand();
+ if (!test.is_in_domain(a))
+ test.add(a,b);
+ }
+
+ DLIB_TEST(test.at_start() == true);
+
+ {
+ int* array1 = new int[test.size()];
+ int* array2 = new int[test.size()];
+
+ int* tmp1 = array1;
+ int* tmp2 = array2;
+
+
+
+ // 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);
+ DLIB_TEST(test.at_start() == true);
+
+
+ count = 0;
+ while (test.move_next())
+ {
+ DLIB_TEST(test.element().key() == test.element().key());
+ DLIB_TEST(test.element().value() == test.element().value());
+ DLIB_TEST(test.element().key() == test.element().key());
+ DLIB_TEST(test.current_element_valid() == true);
+ *tmp1 = test.element().key();
+ *tmp2 = test.element().value();
+ ++tmp1;
+ ++tmp2;
+ ++count;
+ }
+ DLIB_TEST(count == 20000);
+
+ tmp1 = array1;
+ tmp2 = array2;
+ for (int i = 0; i < 20000; ++i)
+ {
+ DLIB_TEST(test.is_in_domain(*tmp1) == true);
+ DLIB_TEST(test[*tmp1] == *tmp2);
+ ++tmp1;
+ ++tmp2;
+ }
+
+ DLIB_TEST(test.size() == 20000);
+
+ tmp1 = array1;
+ tmp2 = array2;
+ count = 0;
+ while (test.size() > 10000)
+ {
+ test.remove(*tmp1,a,b);
+ DLIB_TEST(*tmp1 == a);
+ DLIB_TEST(*tmp2 == b);
+ ++tmp1;
+ ++tmp2;
+ ++count;
+ }
+ DLIB_TEST(count == 10000);
+ DLIB_TEST(test.size() == 10000);
+
+ while (test.move_next())
+ {
+ DLIB_TEST(test.element().key() == *tmp1);
+ DLIB_TEST(test.element().key() == *tmp1);
+ DLIB_TEST(test.element().key() == *tmp1);
+ DLIB_TEST(test.element().value() == *tmp2);
+ DLIB_TEST(test.element().value() == *tmp2);
+ DLIB_TEST(test.element().value() == *tmp2);
+ ++tmp1;
+ ++tmp2;
+ ++count;
+ }
+ DLIB_TEST(count == 20000);
+ DLIB_TEST(test.size() == 10000);
+
+ while (test.size() < 20000)
+ {
+ a = ::rand();
+ b = ::rand();
+ if (!test.is_in_domain(a))
+ test.add(a,b);
+ }
+
+ test2.swap(test);
+
+ count = 0;
+ while (test2.move_next())
+ {
+ DLIB_TEST(test2.element().key() == test2.element().key());
+ DLIB_TEST(test2.element().value() == test2.element().value());
+ DLIB_TEST(test2.element().key() == test2.element().key());
+
+ ++count;
+ }
+
+ DLIB_TEST(count == 20000);
+ DLIB_TEST(test2.size() == 20000);
+
+ int c = 0;
+ while (test2.size()>0)
+ {
+ test2.remove_any(b,c);
+
+ }
+
+ DLIB_TEST(test2.size() == 0);
+ delete [] array1;
+ delete [] array2;
+ }
+
+ test.clear();
+ test2.clear();
+ while (test.size() < 10000)
+ {
+ a = ::rand();
+ b = ::rand();
+ if (!test.is_in_domain(a))
+ test.add(a,b);
+ }
+
+ count = 0;
+ while (test.move_next())
+ {
+
+ DLIB_TEST(test[test.element().key()] == test.element().value());
+
+ ++count;
+ if (count == 5000)
+ break;
+ DLIB_TEST(test.current_element_valid() == true);
+ }
+
+ test.reset();
+
+ count = 0;
+
+ while (test.move_next())
+ {
+
+ ++count;
+ DLIB_TEST(test.current_element_valid() == true);
+ }
+
+ DLIB_TEST(count == 10000);
+
+
+ test.clear();
+ test2.clear();
+ }
+
+
+
+
+ {
+ test.clear();
+ DLIB_TEST(test.size() == 0);
+ int a = 5;
+ int b = 6;
+ test.add(a,b);
+ a = 7;
+ b = 8;
+ test.add(a,b);
+ DLIB_TEST(test.size() == 2);
+ DLIB_TEST(test[7] == 8);
+ DLIB_TEST(test[5] == 6);
+ DLIB_TEST(test.is_in_domain(7));
+ DLIB_TEST(test.is_in_domain(5));
+ test.destroy(7);
+ DLIB_TEST(test.size() == 1);
+ DLIB_TEST(!test.is_in_domain(7));
+ DLIB_TEST(test.is_in_domain(5));
+ test.destroy(5);
+ DLIB_TEST(test.size() == 0);
+ DLIB_TEST(!test.is_in_domain(7));
+ DLIB_TEST(!test.is_in_domain(5));
+ }
+
+
+
+ }
+
+
+
+
+
+ class hash_map_tester : public tester
+ {
+ public:
+ hash_map_tester (
+ ) :
+ tester ("test_hash_map",
+ "Runs tests on the hash_map component.")
+ {}
+
+ void perform_test (
+ )
+ {
+ dlog << LINFO << "testing kernel_1a";
+ hash_map_kernel_test<hash_map<int,int,14>::kernel_1a>();
+
+ dlog << LINFO << "testing kernel_1b_c";
+ hash_map_kernel_test<hash_map<int,int,14>::kernel_1a_c>();
+
+ dlog << LINFO << "testing kernel_1b";
+ hash_map_kernel_test<hash_map<int,int,14>::kernel_1b>();
+
+ dlog << LINFO << "testing kernel_1a_c";
+ hash_map_kernel_test<hash_map<int,int,14>::kernel_1b_c>();
+
+ dlog << LINFO << "testing kernel_1c";
+ hash_map_kernel_test<hash_map<int,int,14>::kernel_1c>();
+
+ dlog << LINFO << "testing kernel_1c_c";
+ hash_map_kernel_test<hash_map<int,int,14>::kernel_1c_c>();
+ }
+ } a;
+
+}
+