dlib C++ Library - array.cpp

    // Copyright (C) 2005  Davis E. King (davisking@users.sourceforge.net)
    // License: Boost Software License   See LICENSE.txt for the full license.

    #include <sstream>
    #include <string>
    #include <cstdlib>
    #include <ctime>
    #include <dlib/interfaces/enumerable.h>
    #include <dlib/array.h>
    #include <dlib/rand.h>

    #include "tester.h"

    namespace
    {
        using namespace test;
        using namespace dlib;
        using namespace std;

        logger dlog("test.array");

        template <
            typename array
            >
        void array_expand_test (
        )
        /*!
            requires
                - array is an implementation of array/array_sort_abstract.h
                  array is instantiated with unsigned long
            ensures
                - runs tests on array for compliance with the specs
        !*/
        {
            dlib::rand::kernel_1a rnd;

            array a1, a2;

            {
                array a1, a2;

                for (int k = 1; k < 100000; k += 1000)
                {
                    for (int i = 0; i < 10; ++i)
                    {
                        a1.clear();
                        a1.set_max_size(500+k);
                        a1.set_size(500+k);
                        for (unsigned long j = 0; j < a1.size(); ++j)
                        {
                            a1[j] = j;
                            DLIB_CASSERT(a1[j] == j,"");
                        }
                    }
                }
            }

            DLIB_CASSERT(a1.max_size() == 0,"");
            DLIB_CASSERT(a2.max_size() == 0,"");

            DLIB_CASSERT(a1.size() == 0,"");
            DLIB_CASSERT(a1.at_start(),"");
            DLIB_CASSERT(a1.current_element_valid() == false,"");
            DLIB_CASSERT(a1.move_next() == false,"");
            DLIB_CASSERT(a1.size() == 0,"");
            DLIB_CASSERT(a1.current_element_valid() == false,"");
            DLIB_CASSERT(a1.at_start() == false,"");
            DLIB_CASSERT(a1.move_next() == false,"");
            DLIB_CASSERT(a1.current_element_valid() == false,"");
            DLIB_CASSERT(a1.size() == 0,"");
            DLIB_CASSERT(a1.at_start() == false,"");
            DLIB_CASSERT(a1.size() == 0,"");

            swap(a1,a2);
            DLIB_CASSERT(a2.size() == 0,"");
            DLIB_CASSERT(a2.current_element_valid() == false,"");
            DLIB_CASSERT(a2.at_start() == false,"");
            DLIB_CASSERT(a2.move_next() == false,"");
            DLIB_CASSERT(a2.current_element_valid() == false,"");
            DLIB_CASSERT(a2.size() == 0,"");
            DLIB_CASSERT(a2.at_start() == false,"");
            DLIB_CASSERT(a2.size() == 0,"");

            DLIB_CASSERT(a1.size() == 0,"");
            DLIB_CASSERT(a1.at_start(),"");
            DLIB_CASSERT(a1.current_element_valid() == false,"");
            DLIB_CASSERT(a1.move_next() == false,"");
            DLIB_CASSERT(a1.size() == 0,"");
            DLIB_CASSERT(a1.current_element_valid() == false,"");
            DLIB_CASSERT(a1.at_start() == false,"");
            DLIB_CASSERT(a1.move_next() == false,"");
            DLIB_CASSERT(a1.current_element_valid() == false,"");
            DLIB_CASSERT(a1.size() == 0,"");
            DLIB_CASSERT(a1.at_start() == false,"");
            DLIB_CASSERT(a1.size() == 0,"");

            a1.reset();
            a2.reset();

            for (unsigned long k = 0; k < 4; ++k)
            {

                DLIB_CASSERT(a1.size() == 0,"");
                DLIB_CASSERT(a1.at_start(),"");
                DLIB_CASSERT(a1.current_element_valid() == false,"");
                DLIB_CASSERT(a1.move_next() == false,"");
                DLIB_CASSERT(a1.size() == 0,"");
                DLIB_CASSERT(a1.current_element_valid() == false,"");
                DLIB_CASSERT(a1.at_start() == false,"");
                DLIB_CASSERT(a1.move_next() == false,"");
                DLIB_CASSERT(a1.current_element_valid() == false,"");
                DLIB_CASSERT(a1.size() == 0,"");
                DLIB_CASSERT(a1.at_start() == false,"");
                DLIB_CASSERT(a1.size() == 0,"");

                swap(a1,a2);
                DLIB_CASSERT(a2.size() == 0,"");
                DLIB_CASSERT(a2.current_element_valid() == false,"");
                DLIB_CASSERT(a2.at_start() == false,"");
                DLIB_CASSERT(a2.move_next() == false,"");
                DLIB_CASSERT(a2.current_element_valid() == false,"");
                DLIB_CASSERT(a2.size() == 0,"");
                DLIB_CASSERT(a2.at_start() == false,"");
                DLIB_CASSERT(a2.size() == 0,"");

                DLIB_CASSERT(a1.size() == 0,"");
                DLIB_CASSERT(a1.at_start(),"");
                DLIB_CASSERT(a1.current_element_valid() == false,"");
                DLIB_CASSERT(a1.move_next() == false,"");
                DLIB_CASSERT(a1.size() == 0,"");
                DLIB_CASSERT(a1.current_element_valid() == false,"");
                DLIB_CASSERT(a1.at_start() == false,"");
                DLIB_CASSERT(a1.move_next() == false,"");
                DLIB_CASSERT(a1.current_element_valid() == false,"");
                DLIB_CASSERT(a1.size() == 0,"");
                DLIB_CASSERT(a1.at_start() == false,"");
                DLIB_CASSERT(a1.size() == 0,"");

                a1.clear();
                a2.clear();

                DLIB_CASSERT(a1.size() == 0,"");
                DLIB_CASSERT(a1.at_start(),"");
                DLIB_CASSERT(a1.current_element_valid() == false,"");
                DLIB_CASSERT(a1.move_next() == false,"");
                DLIB_CASSERT(a1.size() == 0,"");
                DLIB_CASSERT(a1.current_element_valid() == false,"");
                DLIB_CASSERT(a1.at_start() == false,"");
                DLIB_CASSERT(a1.move_next() == false,"");
                DLIB_CASSERT(a1.current_element_valid() == false,"");
                DLIB_CASSERT(a1.size() == 0,"");
                DLIB_CASSERT(a1.at_start() == false,"");
                DLIB_CASSERT(a1.size() == 0,"");

                swap(a1,a2);
                DLIB_CASSERT(a2.size() == 0,"");
                DLIB_CASSERT(a2.current_element_valid() == false,"");
                DLIB_CASSERT(a2.at_start() == false,"");
                DLIB_CASSERT(a2.move_next() == false,"");
                DLIB_CASSERT(a2.current_element_valid() == false,"");
                DLIB_CASSERT(a2.size() == 0,"");
                DLIB_CASSERT(a2.at_start() == false,"");
                DLIB_CASSERT(a2.size() == 0,"");

                DLIB_CASSERT(a1.size() == 0,"");
                DLIB_CASSERT(a1.at_start(),"");
                DLIB_CASSERT(a1.current_element_valid() == false,"");
                DLIB_CASSERT(a1.move_next() == false,"");
                DLIB_CASSERT(a1.size() == 0,"");
                DLIB_CASSERT(a1.current_element_valid() == false,"");
                DLIB_CASSERT(a1.at_start() == false,"");
                DLIB_CASSERT(a1.move_next() == false,"");
                DLIB_CASSERT(a1.current_element_valid() == false,"");
                DLIB_CASSERT(a1.size() == 0,"");
                DLIB_CASSERT(a1.at_start() == false,"");
                DLIB_CASSERT(a1.size() == 0,"");

                a1.clear();
                a2.clear();

                a1.set_max_size(100000);
                a2.set_max_size(100000);
                a1.set_size(10000);
                DLIB_CASSERT(a1.size() == 10000,"");
                a2.set_size(10000);
                DLIB_CASSERT(a2.size() == 10000,"");
                for (unsigned long i = 0; i < a1.size(); ++i)
                {
                    unsigned long a = static_cast<unsigned long>(rnd.get_random_32bit_number());
                    a1[i] = a;
                    a2[i] = i;
                    DLIB_CASSERT(a1[i] == a,"");
                    DLIB_CASSERT(a2[i] == i,"");
                }

                DLIB_CASSERT(a1.at_start(),"");
                DLIB_CASSERT(a1.current_element_valid() == false,"");
                DLIB_CASSERT(a1.move_next(),"");
                DLIB_CASSERT(a1.current_element_valid(),"");

                DLIB_CASSERT(a1.at_start() == false,"");
                a1.sort();
                DLIB_CASSERT(a1.at_start(),"");
                a2.sort();
                DLIB_CASSERT(a1.size() == 10000,"");
                DLIB_CASSERT(a2.size() == 10000,"");

                for (unsigned long i = 0; i < a1.size(); ++i)
                {
                    if (i+1 < a1.size())
                    {
                        DLIB_CASSERT(a1[i] <= a1[i+1],
                                     "a1[i]: " << a1[i] << "    a1[i+1]: " << a1[i+1]
                                     << "    i: " << i);
                    }
                    DLIB_CASSERT(a2[i] == i,"i: " << i << "   a2[i]: " << a2[i]);
                }

                unsigned long last = 0;
                unsigned long count = 0;
                while (a1.move_next())
                {
                    DLIB_CASSERT(last <= a1.element(),"");
                    last = a1.element();
                    ++count;
                }
                DLIB_CASSERT(count == a1.size(),"");

                last = 0;
                count = 0;
                while (a2.move_next())
                {
                    DLIB_CASSERT(last <= a2.element(),"");
                    last = a2.element();
                    ++count;
                }
                DLIB_CASSERT(count == a2.size(),"");

                a2.set_size(15000);

                for (unsigned long i = 0; i < a1.size(); ++i)
                {
                    if (i+1 < a1.size())
                    {
                        DLIB_CASSERT(a1[i] <= a1[i+1],"");
                    }
                    DLIB_CASSERT(a2[i] == i,"");
                }

                for (unsigned long i = 10000; i < a2.size(); ++i)
                {
                    a2[i] = i;
                    DLIB_CASSERT(a2[i] == i,"");
                }

                for (unsigned long i = 0; i < a2.size(); ++i)
                {
                    DLIB_CASSERT(a2[i] == i,"");
                }

                a2.reset();
                last = 0;
                while (a2.move_next())
                {
                    DLIB_CASSERT(last <= a2.element(),"");
                    last = a2.element();
                }

                a1.reset();
                last = 0;
                while (a1.move_next())
                {
                    DLIB_CASSERT(last <= a1.element(),"");
                    last = a1.element();
                }

                a1.sort();
                last = 0;
                while (a1.move_next())
                {
                    DLIB_CASSERT(last <= a1.element(),"");
                    last = a1.element();
                }

                swap(a2,a1);

                for (unsigned long i = 0; i < 15000; ++i)
                {
                    DLIB_CASSERT(a1[i] == i,"");
                }

                a1.clear();
                DLIB_CASSERT(a1.max_size() == 0,"");

                a1.clear();
                a2.clear();

                DLIB_CASSERT(a1.size() == 0,"");
                DLIB_CASSERT(a2.size() == 0,"");
                a1.set_max_size(100000);
                a2.set_max_size(100000);

                a1.set_size(10000);
                DLIB_CASSERT(a1.size() == 10000,"");
                a2.set_size(10000);
                DLIB_CASSERT(a2.size() == 10000,"");
                for (unsigned long i = 0; i < a1.size(); ++i)
                {
                    unsigned long a = static_cast<unsigned long>(rnd.get_random_32bit_number());
                    a1[i] = a;
                    a2[i] = i;
                    DLIB_CASSERT(a1[i] == a,"");
                    DLIB_CASSERT(a2[i] == i,"");
                }

                DLIB_CASSERT(a1.at_start(),"");
                DLIB_CASSERT(a1.current_element_valid() == false,"");
                DLIB_CASSERT(a1.move_next(),"");
                DLIB_CASSERT(a1.current_element_valid(),"");

                DLIB_CASSERT(a1.at_start() == false,"");
                a1.sort();
                DLIB_CASSERT(a1.at_start(),"");
                a2.sort();
                DLIB_CASSERT(a1.size() == 10000,"");
                DLIB_CASSERT(a2.size() == 10000,"");

                for (unsigned long i = 0; i < a1.size(); ++i)
                {
                    if (i+1 < a1.size())
                    {
                        DLIB_CASSERT(a1[i] <= a1[i+1],"");
                    }
                    DLIB_CASSERT(a2[i] == i,"");
                }

                last = 0;
                while (a1.move_next())
                {
                    DLIB_CASSERT(last <= a1.element(),"");
                    last = a1.element();
                }

                last = 0;
                while (a2.move_next())
                {
                    DLIB_CASSERT(last <= a2.element(),"");
                    last = a2.element();
                }

                a2.set_size(15000);

                for (unsigned long i = 0; i < a1.size(); ++i)
                {
                    if (i+1 < a1.size())
                    {
                        DLIB_CASSERT(a1[i] <= a1[i+1],"");
                    }
                    DLIB_CASSERT(a2[i] == i,"");
                }

                for (unsigned long i = 10000; i < a2.size(); ++i)
                {
                    a2[i] = i;
                    DLIB_CASSERT(a2[i] == i,"");
                }

                for (unsigned long i = 0; i < a2.size(); ++i)
                {
                    DLIB_CASSERT(a2[i] == i,"");
                }

                a2.reset();
                last = 0;
                while (a2.move_next())
                {
                    DLIB_CASSERT(last <= a2.element(),"");
                    last = a2.element();
                }

                a1.reset();
                last = 0;
                while (a1.move_next())
                {
                    DLIB_CASSERT(last <= a1.element(),"");
                    last = a1.element();
                }

                a1.sort();
                last = 0;
                while (a1.move_next())
                {
                    DLIB_CASSERT(last <= a1.element(),"");
                    last = a1.element();
                }

                swap(a2,a1);

                for (unsigned long i = 0; i < 15000; ++i)
                {
                    DLIB_CASSERT(a1[i] == i,"");
                }

                a1.clear();
                DLIB_CASSERT(a1.max_size() == 0,"");

                a2.clear();
                print_spinner();
            }

            a1.set_max_size(2000000);
            DLIB_CASSERT(a1.max_size() == 2000000,"");
            DLIB_CASSERT(a1.size() == 0,"");
            a1.set_size(2000000);
            DLIB_CASSERT(a1.max_size() == 2000000,"");
            DLIB_CASSERT(a1.size() == 2000000,"");

            for (unsigned long i = 0; i < a1.size(); ++i)
            {
                a1[i] = rnd.get_random_32bit_number();
            }

            print_spinner();
            a1.sort();

            print_spinner();
            // serialize the state of a1, then clear a1, then
            // load the state back into a1.
            ostringstream sout;
            serialize(a1,sout);
            DLIB_CASSERT(a1.at_start() == true,"");
            istringstream sin(sout.str());
            a1.clear();
            DLIB_CASSERT(a1.max_size() == 0,"");
            deserialize(a1,sin);

            DLIB_CASSERT(a1.size() == 2000000,"");

            for (unsigned long i = 0; i < a1.size()-1; ++i)
            {
                DLIB_CASSERT(a1[i] <= a1[i+1],"");
            }

            DLIB_CASSERT(a1.max_size() == 2000000,"");
            DLIB_CASSERT(a1.size() == 2000000,"");

            swap(a1,a2);

            print_spinner();

            DLIB_CASSERT(a2.size() == 2000000,"");

            for (unsigned long i = 0; i < a2.size()-1; ++i)
            {
                DLIB_CASSERT(a2[i] <= a2[i+1],"");
            }

            DLIB_CASSERT(a2.max_size() == 2000000,"");
            DLIB_CASSERT(a2.size() == 2000000,"");

            swap(a1,a2);

            a1.clear();
            DLIB_CASSERT(a1.size() == 0,"");
            DLIB_CASSERT(a1.max_size() == 0,"");

            a1.expand(10);
            DLIB_CASSERT(a1.size() == 10,"");
            DLIB_CASSERT(a1.max_size() == 10,"");

            for (unsigned long i = 0; i < a1.size(); ++i)
            {
                a1[i] = i;
            }

            print_spinner();
            a1.expand(100);
            DLIB_CASSERT(a1.size() == 100,"");
            DLIB_CASSERT(a1.max_size() == 100,"");

            for (unsigned long i = 0; i < 10; ++i)
            {
                DLIB_CASSERT(a1[i] == i,"");
            }

            a1.expand(50);
            DLIB_CASSERT(a1.size() == 50,"");
            DLIB_CASSERT(a1.max_size() == 100,"");

            for (unsigned long i = 0; i < 10; ++i)
            {
                DLIB_CASSERT(a1[i] == i,"");
            }

            a1.expand(10);
            DLIB_CASSERT(a1.size() == 10,"");
            DLIB_CASSERT(a1.max_size() == 100,"");

            for (unsigned long i = 0; i < 10; ++i)
            {
                DLIB_CASSERT(a1[i] == i,"");
            }

            a1.expand(20);
            DLIB_CASSERT(a1.size() == 20,"");
            DLIB_CASSERT(a1.max_size() == 100,"");

            for (unsigned long i = 0; i < 10; ++i)
            {
                DLIB_CASSERT(a1[i] == i,"");
            }

            a1.expand(100);
            DLIB_CASSERT(a1.size() == 100,"");
            DLIB_CASSERT(a1.max_size() == 100,"");

            for (unsigned long i = 0; i < 10; ++i)
            {
                DLIB_CASSERT(a1[i] == i,"");
            }

            {
                a1.clear();
                DLIB_CASSERT(a1.size() == 0,"");
                for (unsigned long i = 0; i < 100; ++i)
                {
                    unsigned long a = i;
                    a1.push_back(a);
                    DLIB_CASSERT(a1.size() == i+1,"");
                    DLIB_CASSERT(a1.back() == i,"");
                }
                for (unsigned long i = 0; i < 100; ++i)
                {
                    DLIB_CASSERT(a1[i] == i,"");
                }
                for (unsigned long i = 0; i < 100; ++i)
                {
                    unsigned long a = 0;
                    a1.pop_back(a);
                    DLIB_CASSERT(a == 99-i,"");
                }
            }

            {
                a1.clear();
                DLIB_CASSERT(a1.size() == 0,"");
                for (unsigned long i = 0; i < 100; ++i)
                {
                    unsigned long a = i;
                    a1.push_back(a);
                    DLIB_CASSERT(a1.size() == i+1,"");
                    DLIB_CASSERT(a1.back() == i,"");
                }
                for (unsigned long i = 0; i < 100; ++i)
                {
                    DLIB_CASSERT(a1[i] == i,"");
                }
                for (unsigned long i = 0; i < 100; ++i)
                {
                    a1.pop_back();
                }
                DLIB_CASSERT(a1.size() == 0,"");
            }

        }

        class array_tester : public tester
        {
        public:
            array_tester (
            ) :
                tester ("test_array",
                        "Runs tests on the array component.")
            {}

            void perform_test (
            )
            {
                // test a checking version first for good measure
                dlog << LINFO << "testing expand_1a_c";
                print_spinner();
                array_expand_test<array<unsigned long>::expand_1a_c>();

                dlog << LINFO << "testing expand_1a";
                print_spinner();
                array_expand_test<array<unsigned long>::expand_1a>();

                dlog << LINFO << "testing expand_1b";
                print_spinner();
                array_expand_test<array<unsigned long>::expand_1b>();

                dlog << LINFO << "testing expand_1b_c";
                print_spinner();
                array_expand_test<array<unsigned long>::expand_1b_c>();

                dlog << LINFO << "testing expand_1c";
                print_spinner();
                array_expand_test<array<unsigned long>::expand_1c>();

                dlog << LINFO << "testing expand_1c_c";
                print_spinner();
                array_expand_test<array<unsigned long>::expand_1c_c>();

                dlog << LINFO << "testing expand_1d";
                print_spinner();
                array_expand_test<array<unsigned long>::expand_1d>();

                dlog << LINFO << "testing expand_1d_c";
                print_spinner();
                array_expand_test<array<unsigned long>::expand_1d_c>();

                print_spinner();
            }
        } a;

    }