/* 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 #include #include #include #include #include "generator.h" #include "sys_stdlib.h" #include "test_util.h" class fake_stdlib : public stdlib_ifc { private: std::vector samples_; mutable std::vector::iterator current_; public: fake_stdlib ( const std::initializer_list &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 samples { 1 }; auto test_stdlib = std::make_shared (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 samples { 1, 2, 3 }; auto test_stdlib = std::make_shared (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 samples { INT_MAX }; auto test_stdlib = std::make_shared (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 samples { INT_MIN }; auto test_stdlib = std::make_shared (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(); }