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