git.fiddlerwoaroof.com
Raw Blame History
/* Copyright (C) CJ Affiliate
 *
 * You may use, distribute and modify this code under  the
 * terms of the  GNU General Public License  version 2  or
 * later.
 *
 * You should have received a copy of the license with this
 * file. If not, you will find a copy in the "LICENSE" file
 * at https://github.com/cjdev/dual-control.
 */
#include <memory>
#include <algorithm>
#include <initializer_list>
#include <vector>
#include <climits>

#include "generator.h"
#include "sys_stdlib.h"
#include "test_util.h"

class fake_stdlib : public stdlib_ifc
{

private:
    std::vector<int> samples_;
    mutable std::vector<int>::iterator current_;
public:
    fake_stdlib ( const std::initializer_list<int> &samples)
        : samples_ (samples.begin(), samples.end()),
          current_ (samples_.begin()) {}
    int rand() const override
    {
        if (current_ != samples_.end()) {
            auto rval = *current_;
            current_ += 1;
            return rval;
        }

        return 0;
    }
};

int six_digits()
{
    // given
    std::initializer_list<int> samples { 1 };
    auto test_stdlib = std::make_shared<fake_stdlib> (samples);
    stdlib stdlib (test_stdlib);
    generator generator = make_generator (stdlib);

    // when
    auto actual = generator();

    // then
    check (actual.size() == 6, "size is wrong");
    check (std::all_of (actual.begin(), actual.end(), [] (char c) {
        return c >= '0' && c <= '9';
    }), "not just digits");
    succeed();
}

int modulated_source_modulates_tokens()
{
    // given
    std::initializer_list<int> samples { 1, 2, 3 };
    auto test_stdlib = std::make_shared<fake_stdlib> (samples);
    stdlib stdlib (test_stdlib);
    generator generator = make_generator (stdlib);

    // when
    auto actual1 = generator();
    auto actual2 = generator();

    // then
    check (actual1 != actual2, "samples should be different");
    succeed();
}

int int_max()
{
    // given
    std::initializer_list<int> samples { INT_MAX };
    auto test_stdlib = std::make_shared<fake_stdlib> (samples);
    stdlib stdlib (test_stdlib);
    generator generator = make_generator (stdlib);

    // when
    auto actual = generator();

    // then
    check (actual.size() == 6, "size is wrong");
    check (std::all_of (actual.begin(), actual.end(), [] (char c) {
        return c >= '0' && c <= '9';
    }), "not just digits");
    succeed();
}

int int_min()
{
    // given
    std::initializer_list<int> samples { INT_MIN };
    auto test_stdlib = std::make_shared<fake_stdlib> (samples);
    stdlib stdlib (test_stdlib);
    generator generator = make_generator (stdlib);

    // when
    auto actual = generator();

    // then
    check (actual.size() == 6, "size is wrong");
    check (std::all_of (actual.begin(), actual.end(), [] (char c) {
        return c >= '0' && c <= '9';
    }), "not just digits");
    succeed();
}

int run_tests()
{
    test (six_digits);
    test (modulated_source_modulates_tokens);
    test (int_max);
    test (int_min);
    succeed();
}

int main (int argc, char *argv[])
{
    return !run_tests();
}