#include #include #include #include #include #include namespace xrpl { struct SeqProxy_test : public beast::unit_test::Suite { // Exercise value(), isSeq(), and isTicket(). static constexpr bool expectValues(SeqProxy seqProx, std::uint32_t value, SeqProxy::Type type) { bool const expectSeq{type == SeqProxy::Type::Seq}; return (seqProx.value() == value) && (seqProx.isSeq() == expectSeq) && (seqProx.isTicket() == !expectSeq); } // Exercise all SeqProxy comparison operators expecting lhs < rhs. static constexpr bool expectLt(SeqProxy lhs, SeqProxy rhs) { return (lhs < rhs) && (lhs <= rhs) && (!(lhs == rhs)) && (lhs != rhs) && (!(lhs >= rhs)) && (!(lhs > rhs)); } // Exercise all SeqProxy comparison operators expecting lhs == rhs. static constexpr bool expectEq(SeqProxy lhs, SeqProxy rhs) { return (!(lhs < rhs)) && (lhs <= rhs) && (lhs == rhs) && (!(lhs != rhs)) && (lhs >= rhs) && (!(lhs > rhs)); } // Exercise all SeqProxy comparison operators expecting lhs > rhs. static constexpr bool expectGt(SeqProxy lhs, SeqProxy rhs) { return (!(lhs < rhs)) && (!(lhs <= rhs)) && (!(lhs == rhs)) && (lhs != rhs) && (lhs >= rhs) && (lhs > rhs); } // Verify streaming. static bool streamTest(SeqProxy seqProx) { std::string const type{seqProx.isSeq() ? "sequence" : "ticket"}; std::string const value{std::to_string(seqProx.value())}; std::stringstream ss; ss << seqProx; std::string str{ss.str()}; return str.starts_with(type) && str[type.size()] == ' ' && str.find(value) == (type.size() + 1); } void run() override { // While SeqProxy supports values of zero, they are not // expected in the wild. Nevertheless they are tested here. // But so are values of 1, which are expected to occur in the wild. static constexpr std::uint32_t kUintMax{std::numeric_limits::max()}; static constexpr SeqProxy::Type kSeq{SeqProxy::Type::Seq}; static constexpr SeqProxy::Type kTicket{SeqProxy::Type::Ticket}; static constexpr SeqProxy kSeqZero{kSeq, 0}; static constexpr SeqProxy kSeqSmall{kSeq, 1}; static constexpr SeqProxy kSeqMiD0{kSeq, 2}; static constexpr SeqProxy kSeqMiD1{kSeqMiD0}; static constexpr SeqProxy kSeqBig{kSeq, kUintMax}; static constexpr SeqProxy kTicZero{kTicket, 0}; static constexpr SeqProxy kTicSmall{kTicket, 1}; static constexpr SeqProxy kTicMid0{kTicket, 2}; static constexpr SeqProxy kTicMid1{kTicMid0}; static constexpr SeqProxy kTicBig{kTicket, kUintMax}; // Verify operation of value(), isSeq() and isTicket(). static_assert(expectValues(kSeqZero, 0, kSeq), ""); static_assert(expectValues(kSeqSmall, 1, kSeq), ""); static_assert(expectValues(kSeqMiD0, 2, kSeq), ""); static_assert(expectValues(kSeqMiD1, 2, kSeq), ""); static_assert(expectValues(kSeqBig, kUintMax, kSeq), ""); static_assert(expectValues(kTicZero, 0, kTicket), ""); static_assert(expectValues(kTicSmall, 1, kTicket), ""); static_assert(expectValues(kTicMid0, 2, kTicket), ""); static_assert(expectValues(kTicMid1, 2, kTicket), ""); static_assert(expectValues(kTicBig, kUintMax, kTicket), ""); // Verify expected behavior of comparison operators. static_assert(expectEq(kSeqZero, kSeqZero), ""); static_assert(expectLt(kSeqZero, kSeqSmall), ""); static_assert(expectLt(kSeqZero, kSeqMiD0), ""); static_assert(expectLt(kSeqZero, kSeqMiD1), ""); static_assert(expectLt(kSeqZero, kSeqBig), ""); static_assert(expectLt(kSeqZero, kTicZero), ""); static_assert(expectLt(kSeqZero, kTicSmall), ""); static_assert(expectLt(kSeqZero, kTicMid0), ""); static_assert(expectLt(kSeqZero, kTicMid1), ""); static_assert(expectLt(kSeqZero, kTicBig), ""); static_assert(expectGt(kSeqSmall, kSeqZero), ""); static_assert(expectEq(kSeqSmall, kSeqSmall), ""); static_assert(expectLt(kSeqSmall, kSeqMiD0), ""); static_assert(expectLt(kSeqSmall, kSeqMiD1), ""); static_assert(expectLt(kSeqSmall, kSeqBig), ""); static_assert(expectLt(kSeqSmall, kTicZero), ""); static_assert(expectLt(kSeqSmall, kTicSmall), ""); static_assert(expectLt(kSeqSmall, kTicMid0), ""); static_assert(expectLt(kSeqSmall, kTicMid1), ""); static_assert(expectLt(kSeqSmall, kTicBig), ""); static_assert(expectGt(kSeqMiD0, kSeqZero), ""); static_assert(expectGt(kSeqMiD0, kSeqSmall), ""); static_assert(expectEq(kSeqMiD0, kSeqMiD0), ""); static_assert(expectEq(kSeqMiD0, kSeqMiD1), ""); static_assert(expectLt(kSeqMiD0, kSeqBig), ""); static_assert(expectLt(kSeqMiD0, kTicZero), ""); static_assert(expectLt(kSeqMiD0, kTicSmall), ""); static_assert(expectLt(kSeqMiD0, kTicMid0), ""); static_assert(expectLt(kSeqMiD0, kTicMid1), ""); static_assert(expectLt(kSeqMiD0, kTicBig), ""); static_assert(expectGt(kSeqMiD1, kSeqZero), ""); static_assert(expectGt(kSeqMiD1, kSeqSmall), ""); static_assert(expectEq(kSeqMiD1, kSeqMiD0), ""); static_assert(expectEq(kSeqMiD1, kSeqMiD1), ""); static_assert(expectLt(kSeqMiD1, kSeqBig), ""); static_assert(expectLt(kSeqMiD1, kTicZero), ""); static_assert(expectLt(kSeqMiD1, kTicSmall), ""); static_assert(expectLt(kSeqMiD1, kTicMid0), ""); static_assert(expectLt(kSeqMiD1, kTicMid1), ""); static_assert(expectLt(kSeqMiD1, kTicBig), ""); static_assert(expectGt(kSeqBig, kSeqZero), ""); static_assert(expectGt(kSeqBig, kSeqSmall), ""); static_assert(expectGt(kSeqBig, kSeqMiD0), ""); static_assert(expectGt(kSeqBig, kSeqMiD1), ""); static_assert(expectEq(kSeqBig, kSeqBig), ""); static_assert(expectLt(kSeqBig, kTicZero), ""); static_assert(expectLt(kSeqBig, kTicSmall), ""); static_assert(expectLt(kSeqBig, kTicMid0), ""); static_assert(expectLt(kSeqBig, kTicMid1), ""); static_assert(expectLt(kSeqBig, kTicBig), ""); static_assert(expectGt(kTicZero, kSeqZero), ""); static_assert(expectGt(kTicZero, kSeqSmall), ""); static_assert(expectGt(kTicZero, kSeqMiD0), ""); static_assert(expectGt(kTicZero, kSeqMiD1), ""); static_assert(expectGt(kTicZero, kSeqBig), ""); static_assert(expectEq(kTicZero, kTicZero), ""); static_assert(expectLt(kTicZero, kTicSmall), ""); static_assert(expectLt(kTicZero, kTicMid0), ""); static_assert(expectLt(kTicZero, kTicMid1), ""); static_assert(expectLt(kTicZero, kTicBig), ""); static_assert(expectGt(kTicSmall, kSeqZero), ""); static_assert(expectGt(kTicSmall, kSeqSmall), ""); static_assert(expectGt(kTicSmall, kSeqMiD0), ""); static_assert(expectGt(kTicSmall, kSeqMiD1), ""); static_assert(expectGt(kTicSmall, kSeqBig), ""); static_assert(expectGt(kTicSmall, kTicZero), ""); static_assert(expectEq(kTicSmall, kTicSmall), ""); static_assert(expectLt(kTicSmall, kTicMid0), ""); static_assert(expectLt(kTicSmall, kTicMid1), ""); static_assert(expectLt(kTicSmall, kTicBig), ""); static_assert(expectGt(kTicMid0, kSeqZero), ""); static_assert(expectGt(kTicMid0, kSeqSmall), ""); static_assert(expectGt(kTicMid0, kSeqMiD0), ""); static_assert(expectGt(kTicMid0, kSeqMiD1), ""); static_assert(expectGt(kTicMid0, kSeqBig), ""); static_assert(expectGt(kTicMid0, kTicZero), ""); static_assert(expectGt(kTicMid0, kTicSmall), ""); static_assert(expectEq(kTicMid0, kTicMid0), ""); static_assert(expectEq(kTicMid0, kTicMid1), ""); static_assert(expectLt(kTicMid0, kTicBig), ""); static_assert(expectGt(kTicMid1, kSeqZero), ""); static_assert(expectGt(kTicMid1, kSeqSmall), ""); static_assert(expectGt(kTicMid1, kSeqMiD0), ""); static_assert(expectGt(kTicMid1, kSeqMiD1), ""); static_assert(expectGt(kTicMid1, kSeqBig), ""); static_assert(expectGt(kTicMid1, kTicZero), ""); static_assert(expectGt(kTicMid1, kTicSmall), ""); static_assert(expectEq(kTicMid1, kTicMid0), ""); static_assert(expectEq(kTicMid1, kTicMid1), ""); static_assert(expectLt(kTicMid1, kTicBig), ""); static_assert(expectGt(kTicBig, kSeqZero), ""); static_assert(expectGt(kTicBig, kSeqSmall), ""); static_assert(expectGt(kTicBig, kSeqMiD0), ""); static_assert(expectGt(kTicBig, kSeqMiD1), ""); static_assert(expectGt(kTicBig, kSeqBig), ""); static_assert(expectGt(kTicBig, kTicZero), ""); static_assert(expectGt(kTicBig, kTicSmall), ""); static_assert(expectGt(kTicBig, kTicMid0), ""); static_assert(expectGt(kTicBig, kTicMid1), ""); static_assert(expectEq(kTicBig, kTicBig), ""); // Verify streaming. BEAST_EXPECT(streamTest(kSeqZero)); BEAST_EXPECT(streamTest(kSeqSmall)); BEAST_EXPECT(streamTest(kSeqMiD0)); BEAST_EXPECT(streamTest(kSeqMiD1)); BEAST_EXPECT(streamTest(kSeqBig)); BEAST_EXPECT(streamTest(kTicZero)); BEAST_EXPECT(streamTest(kTicSmall)); BEAST_EXPECT(streamTest(kTicMid0)); BEAST_EXPECT(streamTest(kTicMid1)); BEAST_EXPECT(streamTest(kTicBig)); } }; BEAST_DEFINE_TESTSUITE(SeqProxy, protocol, xrpl); } // namespace xrpl