    // Copyright (C) 2010  Davis E. King (davis@dlib.net)
    // License: Boost Software License   See LICENSE.txt for the full license.

    #include <dlib/any.h>
    #include <sstream>
    #include <string>
    #include <cstdlib>
    #include <ctime>
    #include <vector>
    #include "../rand.h"

    #include "tester.h"

    namespace
    {

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

        logger dlog("test.any");

    // ----------------------------------------------------------------------------------------

        void test_contains_4(
            const any a
        )
        {
            DLIB_TEST(a.is_empty() == false);
            DLIB_TEST(a.contains<int>() == true);
            DLIB_TEST(a.contains<double>() == false);
            DLIB_TEST(any_cast<int>(a) == 4);
        }

    // ----------------------------------------------------------------------------------------

        void run_test()
        {
            any a, b, c;

            DLIB_TEST(a.is_empty());
            DLIB_TEST(a.contains<int>() == false);
            DLIB_TEST(a.contains<string>() == false);
            DLIB_TEST(a.is_empty());

            a = b;

            swap(a,b);
            a.swap(b);

            a = 4;
            DLIB_TEST(a.is_empty() == false);
            DLIB_TEST(a.contains<int>() == true);
            DLIB_TEST(a.contains<double>() == false);
            DLIB_TEST(any_cast<int>(a) == 4);

            test_contains_4(a);

            DLIB_TEST(a.is_empty() == false);
            DLIB_TEST(a.contains<int>() == true);
            DLIB_TEST(a.contains<double>() == false);
            DLIB_TEST(any_cast<int>(a) == 4);

            bool error = false;
            try
            {
                any_cast<double>(a);
            }
            catch (bad_any_cast&)
            {
                error = true;
            }
            DLIB_TEST(error);

            swap(a,b);

            test_contains_4(b);

            DLIB_TEST(a.is_empty());

            a = b;

            test_contains_4(a);

            c.get<string>() = "test string";
            DLIB_TEST(c.get<string>() == "test string");

            a = c;
            DLIB_TEST(a.cast_to<string>() == "test string");

            a.clear();
            DLIB_TEST(a.is_empty());
            error = false;
            try
            {
                any_cast<string>(a);
            }
            catch (bad_any_cast&)
            {
                error = true;
            }
            DLIB_TEST(error);

            a = 1;
            b = 2;

            int* a_ptr = &a.get<int>();
            int* b_ptr = &b.get<int>();

            swap(a,b);
            DLIB_TEST(a_ptr == &b.get<int>());
            DLIB_TEST(b_ptr == &a.get<int>());
        }

    // ----------------------------------------------------------------------------------------

        class any_tester : public tester
        {
        public:
            any_tester (
            ) :
                tester ("test_any",
                        "Runs tests on the any component.")
            {}

            void perform_test (
            )
            {
                run_test();
            }
        } a;

    }