1 #include <catch2/catch.hpp>
2 #include <rapidcheck/catch.h>
3 
4 #include "detail/Base64.h"
5 #include "detail/ParseException.h"
6 
7 using namespace rc;
8 using namespace rc::detail;
9 
10 TEST_CASE("base64") {
11   prop("base64Decode(base64Encode(data)) == data",
__anonca08fc040102(const std::vector<std::uint8_t> &data) 12        [](const std::vector<std::uint8_t> &data) {
13          RC_ASSERT(base64Decode(base64Encode(data)) == data);
14        });
15 
16   prop("throws error on decode with invalid length",
__anonca08fc040202null17        [] {
18          const auto n = *gen::inRange<std::size_t>(0, 20);
19          const auto size = (n * 4) + 1;
20          const auto data =
21              *gen::container<std::string>(size, gen::arbitrary<char>());
22 
23          RC_ASSERT_THROWS_AS(base64Decode(data), ParseException);
24        });
25 
26   prop("throws error on decode with invalid characters",
__anonca08fc040302null27        [] {
28          const auto alphabet = std::string(kBase64Alphabet);
29          // TODO gen::string with allowed chars for teh speed
30          auto data = *gen::container<std::string>(gen::elementOf(alphabet));
31          const auto invalid = *gen::suchThat<char>([=](char c) {
32            return alphabet.find(c) == std::string::npos;
33          });
34          const auto pos = *gen::inRange<std::size_t>(0, data.size() + 1);
35          data.insert(begin(data) + pos, invalid);
36 
37          RC_ASSERT_THROWS_AS(base64Decode(data), ParseException);
38        });
39 }
40