// 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 <cmath> #include <dlib/rand.h> #include <dlib/compress_stream.h> #include "tester.h" namespace { using namespace test; using namespace dlib; using namespace std; logger dlog("test.rand"); void check_bpp ( const std::string str ) { istringstream rdata; ostringstream sout; rdata.str(str); double compressed_size; compress_stream::kernel_1a cs1; compress_stream::kernel_2a cs2; compress_stream_kernel_1< entropy_encoder_model_kernel_5<257,entropy_encoder::kernel_1a,4000000,4>, entropy_decoder_model_kernel_5<257,entropy_decoder::kernel_1a,4000000,4>, crc32::kernel_1a > cs3; print_spinner(); rdata.clear(); rdata.seekg(0); sout.clear(); sout.str(""); cs1.compress(rdata,sout); compressed_size = sout.str().size(); compressed_size *= 8; compressed_size /= str.size(); DLIB_TEST_MSG(compressed_size >= 8, "order 0 bps: " << compressed_size); dlog << LINFO << "order 0: " << compressed_size; print_spinner(); rdata.clear(); rdata.seekg(0); sout.clear(); sout.str(""); cs2.compress(rdata,sout); compressed_size = sout.str().size(); compressed_size *= 8; compressed_size /= str.size(); DLIB_TEST_MSG(compressed_size >= 8, "order 1 bps: " << compressed_size); dlog << LINFO << "order 1: " << compressed_size; print_spinner(); rdata.clear(); rdata.seekg(0); sout.clear(); sout.str(""); cs3.compress(rdata,sout); compressed_size = sout.str().size(); compressed_size *= 8; compressed_size /= str.size(); DLIB_TEST_MSG(compressed_size >= 8, "order 4 bps: " << compressed_size); dlog << LINFO << "order 4: " << compressed_size; } template < typename rand > void rand_test ( ) /*! requires - rand is an implementation of rand/rand_kernel_abstract.h is instantiated with int ensures - runs tests on rand for compliance with the specs !*/ { ostringstream seed; seed << (unsigned int)time(0); ostringstream sout; rand r, r2; DLIB_TEST(r.get_seed() == ""); r.set_seed(seed.str()); DLIB_TEST(r.get_seed() == seed.str()); r.clear(); DLIB_TEST(r.get_seed() == ""); swap(r,r2); DLIB_TEST(r.get_seed() == ""); r.set_seed(seed.str()); DLIB_TEST(r.get_seed() == seed.str()); swap(r,r2); DLIB_TEST(r2.get_seed() == seed.str()); DLIB_TEST(r.get_seed() == ""); swap(r,r2); DLIB_TEST(r.get_seed() == seed.str()); DLIB_TEST(r2.get_seed() == ""); print_spinner(); unsigned long size = 100000; for (unsigned long i = 0; i < size; ++i) { uint32 ch = r.get_random_32bit_number(); sout.write((char*)&ch,4); } check_bpp(sout.str()); sout.clear(); sout.str(""); print_spinner(); for (unsigned long i = 0; i < size; ++i) { uint16 ch = r.get_random_16bit_number(); sout.write((char*)&ch,2); } check_bpp(sout.str()); sout.clear(); sout.str(""); print_spinner(); for (unsigned long i = 0; i < size; ++i) { unsigned char ch = r.get_random_8bit_number(); sout.write((char*)&ch,1); } check_bpp(sout.str()); sout.clear(); sout.str(""); // make sure the things can serialize right { r.clear(); r2.clear(); for (int i =0; i < 1000; ++i) r.get_random_32bit_number(); ostringstream sout; serialize(r, sout); istringstream sin(sout.str()); deserialize(r2, sin); for (int i =0; i < 1000; ++i) { DLIB_TEST(r.get_random_32bit_number() == r2.get_random_32bit_number()); } } // make sure calling clear() and set_seed("") do the same thing { r.clear(); r2.set_seed(""); rand r3; DLIB_TEST(r.get_seed() == r2.get_seed()); DLIB_TEST(r.get_seed() == r3.get_seed()); for (int i =0; i < 1000; ++i) { const uint32 num1 = r.get_random_32bit_number(); const uint32 num2 = r2.get_random_32bit_number(); const uint32 num3 = r3.get_random_32bit_number(); DLIB_TEST( num1 == num2); DLIB_TEST( num1 == num3); } } } class rand_tester : public tester { public: rand_tester ( ) : tester ("test_rand", "Runs tests on the rand component.") {} void perform_test ( ) { dlog << LINFO << "testing kernel_1a"; rand_test<dlib::rand::kernel_1a>(); rand_test<dlib::rand::float_1a>(); } } a; }