Mercurial > public > cpp-enigma
diff enigma/tests/test_plugboard.t.h @ 3:f4e25e6b76c3
Created plugboard class and tests.
author | Brian Neal <bgneal@gmail.com> |
---|---|
date | Sat, 23 Jun 2012 23:28:17 -0500 |
parents | |
children | 7362965f53b1 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/enigma/tests/test_plugboard.t.h Sat Jun 23 23:28:17 2012 -0500 @@ -0,0 +1,141 @@ +// Copyright (C) 2012 by Brian Neal. +// This file is part of Cpp-Enigma, the Enigma Machine simulation. +// Cpp-Enigma is released under the MIT License (see License.txt). +// +// test_plugboard.t.h - Unit tests for the plugboard class. + +#include <cxxtest/TestSuite.h> +#include "plugboard.h" + +using namespace enigma; + + +class plugboard_test_suite : public CxxTest::TestSuite +{ +public: + + void test_bad_settings() + { + // too many + TS_ASSERT_THROWS(plugboard("AB CD EF GH IJ KL MN OP QR ST UV"), plugboard_error); + TS_ASSERT_THROWS(plugboard("18/26 17/4 21/6 3/16 19/14 22/7 8/1 12/25 5/9 10/15 2/20"), + plugboard_error); + + // duplicate + TS_ASSERT_THROWS(plugboard("AB CD EF GH IJ KL MN OF QR ST"), plugboard_error); + TS_ASSERT_THROWS(plugboard("AB CD EF GH IJ KL MN FP QR ST"), plugboard_error); + TS_ASSERT_THROWS(plugboard("18/26 17/4 21/6 3/16 19/14 22/3 8/1 12/25"), plugboard_error); + + // invalid + TS_ASSERT_THROWS(plugboard("A2 CD EF GH IJ KL MN FP QR ST"), plugboard_error); + TS_ASSERT_THROWS(plugboard("AB CD EF *H IJ KL MN FP QR ST"), plugboard_error); + TS_ASSERT_THROWS(plugboard("ABCD EF GH IJKLMN OP"), plugboard_error); + TS_ASSERT_THROWS(plugboard("A-D EF GH OP"), plugboard_error); + TS_ASSERT_THROWS(plugboard("A"), plugboard_error); + TS_ASSERT_THROWS(plugboard("9"), plugboard_error); + TS_ASSERT_THROWS(plugboard("1*/26 17/4 21/6 3/16 19/14 22/3 8/1 12/25"), plugboard_error); + TS_ASSERT_THROWS(plugboard("18/26 17/4 2A/6 3/16 19/14 22/3 8/1 12/25"), plugboard_error); + TS_ASSERT_THROWS(plugboard("100/2"), plugboard_error); + TS_ASSERT_THROWS(plugboard("T/C"), plugboard_error); + } + + void test_valid_settings() + { + TS_ASSERT_THROWS_NOTHING(plugboard{}); + TS_ASSERT_THROWS_NOTHING(plugboard{""}); + TS_ASSERT_THROWS_NOTHING(plugboard(plugboard::pair_vector{})); + TS_ASSERT_THROWS_NOTHING(plugboard{"AB CD EF GH IJ KL MN OP QR ST"}); + TS_ASSERT_THROWS_NOTHING(plugboard{"CD EF GH IJ KL MN OP QR ST"}); + TS_ASSERT_THROWS_NOTHING(plugboard{"EF GH IJ KL MN OP QR ST"}); + TS_ASSERT_THROWS_NOTHING(plugboard{" GH "}); + TS_ASSERT_THROWS_NOTHING(plugboard{"18/26 17/4 21/6 3/16 19/14 22/7 8/1 12/25 5/9 10/15"}); + TS_ASSERT_THROWS_NOTHING(plugboard{"18/26 17/4"}); + TS_ASSERT_THROWS_NOTHING(plugboard{" 18/26 "}); + } + + void test_default_wiring() + { + plugboard p; + for (int i = 0; i < 26; ++i) + { + TS_ASSERT_EQUALS(i, p.signal(i)); + } + } + + void test_wiring() + { + std::vector<std::string> settings{"AB CD EF GH IJ KL MN OP QR ST", + "1/2 3/4 5/6 7/8 9/10 11/12 13/14 15/16 17/18 19/20"}; + + for (const auto& setting : settings) + { + plugboard p{setting}; + for (int n = 0; n < 26; ++n) + { + if (n < 20) + { + if (n % 2 == 0) + { + TS_ASSERT_EQUALS(p.signal(n), n + 1); + } + else + { + TS_ASSERT_EQUALS(p.signal(n), n - 1); + } + } + else + { + TS_ASSERT_EQUALS(p.signal(n), n); + } + } + } + } + + void test_wiring2() + { + std::string stecker{"AV BS CG DL FU HZ IN KM OW RX"}; + plugboard p{stecker}; + plugboard::pair_vector pairs{p.get_pairs()}; + + plugboard::pair_vector expected_pairs{ + {0, 21}, {1, 18}, {2, 6}, {3, 11}, {5, 20}, + {7, 25}, {8, 13}, {10, 12}, {14, 22}, {17, 23} + }; + + TS_ASSERT_EQUALS(expected_pairs, pairs); + + std::map<int, int> wiring; + for (const auto& p : pairs) + { + wiring.insert(p); + wiring.insert(std::make_pair(p.second, p.first)); + } + + for (int n = 0; n < 26; ++n) + { + auto iter = wiring.find(n); + if (iter != wiring.end()) + { + TS_ASSERT_EQUALS(p.signal(n), iter->second); + } + else + { + TS_ASSERT_EQUALS(p.signal(n), n); + } + } + } + + void test_army_str() + { + std::string stecker{"AB CD EF GH IJ KL MN OP QR ST"}; + plugboard p{stecker}; + TS_ASSERT_EQUALS(stecker, p.army_str()); + } + + void test_navy_str() + { + std::string stecker{"1/2 3/4 5/6 7/8 9/10 11/12 13/14 15/16 17/18 19/20"}; + plugboard p{stecker}; + TS_ASSERT_EQUALS(stecker, p.navy_str()); + } +};