summaryrefslogtreecommitdiffstats
path: root/ml/dlib/dlib/test/compress_stream.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ml/dlib/dlib/test/compress_stream.cpp')
-rw-r--r--ml/dlib/dlib/test/compress_stream.cpp306
1 files changed, 306 insertions, 0 deletions
diff --git a/ml/dlib/dlib/test/compress_stream.cpp b/ml/dlib/dlib/test/compress_stream.cpp
new file mode 100644
index 000000000..fbc57dd4c
--- /dev/null
+++ b/ml/dlib/dlib/test/compress_stream.cpp
@@ -0,0 +1,306 @@
+// 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 <ctime>
+#include <cstdlib>
+
+#include <dlib/compress_stream.h>
+
+#include "tester.h"
+
+namespace
+{
+
+ using namespace test;
+ using namespace std;
+ using namespace dlib;
+
+ logger dlog("test.compress_stream");
+
+ template <
+ typename cs
+ >
+ void compress_stream_kernel_test (
+ unsigned long seed
+ )
+ /*!
+ requires
+ - cs is an implementation of compress_stream/compress_stream_kernel_abstract.h
+ the alphabet_size for cc is 256
+ ensures
+ - runs tests on cs for compliance with the specs
+ !*/
+ {
+
+
+ srand(seed);
+
+ cs test;
+
+
+ dlog << LTRACE << 1;
+
+ int count = 0;
+ while (count < 2)
+ {
+ print_spinner();
+ istringstream sin;
+ ostringstream sout;
+ string buffer;
+ buffer.reserve(10000);
+ // fill sin with a bunch of random data in the range 0 to 63
+ for (int i = 0; i < 10000; ++i)
+ {
+ char temp = static_cast<char>(::rand()&0x3f);
+ buffer.push_back(temp);
+ }
+
+ print_spinner();
+ sin.str(buffer);
+ string old_buffer = buffer;
+
+ test.compress(sin,sout);
+ buffer = sout.str();
+
+ print_spinner();
+ // corrput the data in buffer
+ buffer[buffer.size()/2]++;
+
+ sin.str(buffer);
+ sout.str("");
+
+ bool detected_error = false;
+ try {
+ test.decompress(sin,sout);
+ } catch ( typename cs::decompression_error e )
+ {
+ detected_error = true;
+ ++count;
+ }
+
+
+ DLIB_TEST_MSG(detected_error || sout.str() == old_buffer,(unsigned int)sout.str().size());
+
+
+
+ } /**/
+
+
+ dlog << LTRACE << 2;
+
+ for (int j = 0; j < 2; ++j)
+ {
+
+ print_spinner();
+ istringstream sin;
+ ostringstream sout;
+
+ string buffer;
+
+ buffer.reserve(10);
+
+ // make sure a single char can be compressed and decompressed
+ for (int i = 0; i < 256; ++i)
+ {
+ sin.str("");
+ sout.str("");
+ char ch = static_cast<char>(i);
+ buffer = ch;
+ sin.str(buffer);
+
+ test.compress(sin,sout);
+
+ sin.str(sout.str());
+ sout.str("");
+ test.decompress(sin,sout);
+ DLIB_TEST(sout.str() == buffer);
+ }
+
+ print_spinner();
+
+ // make sure you can compress a single char, then append a new
+ // compressed single char. and make sure you can decode the
+ // two streams. Just to make sure the decoder doesn't leave
+ // extra bytes behind or eat more than it should.
+ for (int i = 0; i < 500; ++i)
+ {
+ sin.str("");
+ sin.clear();
+ sout.str("");
+ sout.clear();
+ char ch = static_cast<char>(::rand()%256);
+ char ch2 = static_cast<char>(::rand()%256);
+
+ buffer = ch;
+ sin.str(buffer);
+
+
+
+ test.compress(sin,sout);
+
+
+
+
+ buffer = ch2;
+ sin.str(buffer);
+ test.compress(sin,sout);
+
+ sin.str(sout.str());
+
+ sout.str("");
+ test.decompress(sin,sout);
+ buffer = ch;
+ DLIB_TEST(sout.str() == buffer);
+
+
+
+
+ sout.str("");
+ test.decompress(sin,sout);
+ buffer = ch2;
+ DLIB_TEST(sout.str() == buffer);
+
+
+ }
+ print_spinner();
+
+
+ // make sure you can compress and decompress the empty string
+ sout.str("");
+ sin.str("");
+ test.compress(sin,sout);
+ sin.str(sout.str());
+ sout.str("");
+ test.decompress(sin,sout);
+ DLIB_TEST_MSG(sout.str() == "",sout.str());
+
+
+
+
+
+ print_spinner();
+
+ sin.str("");
+ sout.str("");
+ buffer = "";
+
+ buffer.reserve(20000);
+ // fill buffer with a bunch of random data in the range 0 to 63
+ for (int i = 0; i < 20000; ++i)
+ {
+ char temp = static_cast<char>(::rand()&0x3f);
+ buffer.push_back(temp);
+ }
+
+ sin.str(buffer);
+
+ print_spinner();
+ test.compress(sin,sout);
+
+ sin.str(sout.str());
+ sout.str("");
+
+ print_spinner();
+ test.decompress(sin,sout);
+
+ DLIB_TEST(sout.str() == buffer);
+
+ print_spinner();
+ }
+
+ dlog << LTRACE << 3;
+
+ // this block will try to compress a bunch of 'a' chars
+ {
+
+ istringstream sin;
+ ostringstream sout;
+
+ string buffer;
+
+
+ print_spinner();
+
+ sin.str("");
+ sout.str("");
+ buffer = "";
+
+ buffer.reserve(50000);
+ // fill buffer with a bunch of 'a' chars
+ for (int i = 0; i < 50000; ++i)
+ {
+ char temp = 'a';
+ buffer.push_back(temp);
+ }
+
+ sin.str(buffer);
+
+ print_spinner();
+ test.compress(sin,sout);
+
+ sin.str(sout.str());
+ sout.str("");
+
+ print_spinner();
+ test.decompress(sin,sout);
+
+ DLIB_TEST(sout.str() == buffer);
+
+ print_spinner();
+
+ }
+
+ dlog << LTRACE << 4;
+
+ }
+
+
+
+
+
+
+ class compress_stream_tester : public tester
+ {
+ public:
+ compress_stream_tester (
+ ) :
+ tester ("test_compress_stream",
+ "Runs tests on the compress_stream component.")
+ {}
+
+ void perform_test (
+ )
+ {
+ const unsigned int seed = static_cast<unsigned int>(time(0));
+ dlog << LINFO << "using seed: " << seed;
+
+ dlog << LINFO << "testing kernel_1a";
+ compress_stream_kernel_test<compress_stream::kernel_1a>(seed);
+ dlog << LINFO << "testing kernel_1b";
+ compress_stream_kernel_test<compress_stream::kernel_1b>(seed);
+ dlog << LINFO << "testing kernel_1c";
+ compress_stream_kernel_test<compress_stream::kernel_1c>(seed);
+ dlog << LINFO << "testing kernel_1da";
+ compress_stream_kernel_test<compress_stream::kernel_1da>(seed);
+ dlog << LINFO << "testing kernel_1db";
+ compress_stream_kernel_test<compress_stream::kernel_1db>(seed);
+ dlog << LINFO << "testing kernel_1ea";
+ compress_stream_kernel_test<compress_stream::kernel_1ea>(seed);
+ dlog << LINFO << "testing kernel_1eb";
+ compress_stream_kernel_test<compress_stream::kernel_1eb>(seed);
+ dlog << LINFO << "testing kernel_1ec";
+ compress_stream_kernel_test<compress_stream::kernel_1ec>(seed);
+ dlog << LINFO << "testing kernel_2a";
+ compress_stream_kernel_test<compress_stream::kernel_2a>(seed);
+ dlog << LINFO << "testing kernel_3a";
+ compress_stream_kernel_test<compress_stream::kernel_3a>(seed);
+ dlog << LINFO << "testing kernel_3b";
+ compress_stream_kernel_test<compress_stream::kernel_3b>(seed);
+ }
+ } a;
+
+}
+