#include "etl/manchester.h" #include "unit_test_framework.h" #include #include #include #include SUITE(test_manchester) { TEST(encode_uint8_t) { CHECK_EQUAL(0xAAAA, (etl::manchester::encode(0x00U))); CHECK_EQUAL(0x5555, (etl::manchester::encode(0xFFU))); CHECK_EQUAL(0xAAA9, (etl::manchester::encode(0x01U))); CHECK_EQUAL(0x6AAA, (etl::manchester::encode(0x80U))); #if ETL_USING_CPP14 static_assert(0xAAAA == etl::manchester::encode(0x00U), "Compile time manchester encoding failed"); #endif } TEST(encode_uint8_t_inverted) { CHECK_EQUAL(0x5555, (etl::manchester_inverted::encode(0x00U))); CHECK_EQUAL(0xAAAA, (etl::manchester_inverted::encode(0xFFU))); CHECK_EQUAL(0x5556, (etl::manchester_inverted::encode(0x01U))); CHECK_EQUAL(0x9555, (etl::manchester_inverted::encode(0x80U))); #if ETL_USING_CPP14 static_assert(0x5555 == etl::manchester_inverted::encode(0x00U), "Compile time manchester encoding failed"); #endif } TEST(encode_uint16_t) { CHECK_EQUAL(0x5555AAAA, (etl::manchester::encode(0xFF00UL))); CHECK_EQUAL(0x6AAAAAA9, (etl::manchester::encode(0x8001UL))); #if ETL_USING_CPP14 static_assert(0x5555AAAA == etl::manchester::encode(0xFF00UL), "Compile time manchester encoding failed"); #endif } TEST(encode_uint16_t_inverted) { CHECK_EQUAL(0xAAAA5555, (etl::manchester_inverted::encode(0xFF00UL))); CHECK_EQUAL(0x95555556, (etl::manchester_inverted::encode(0x8001UL))); #if ETL_USING_CPP14 static_assert(0xAAAA5555 == etl::manchester_inverted::encode(0xFF00UL), "Compile time manchester encoding failed"); #endif } TEST(encode_uint32_t) { CHECK_EQUAL(0x6AAAAAA95555AAAA, (etl::manchester::encode(0x8001FF00ULL))); #if ETL_USING_CPP14 static_assert(0x6AAAAAA95555AAAA == etl::manchester::encode(0x8001FF00ULL), "Compile time manchester encoding failed"); #endif } TEST(encode_uint32_t_inverted) { CHECK_EQUAL(0x95555556AAAA5555, (etl::manchester_inverted::encode(0x8001FF00ULL))); #if ETL_USING_CPP14 static_assert(0x95555556AAAA5555 == etl::manchester_inverted::encode(0x8001FF00ULL), "Compile time manchester encoding failed"); #endif } #if ETL_USING_CPP14 constexpr etl::array manchester_encoded_uint8(etl::span decoded) { etl::array encoded{0, 0, 0, 0, 0, 0, 0, 0}; etl::manchester::encode(decoded, encoded); return encoded; } constexpr etl::array manchester_encoded_uint16(etl::span decoded) { etl::array encoded{0, 0, 0, 0, 0, 0, 0, 0}; etl::manchester::encode(decoded, encoded); return encoded; } constexpr etl::array manchester_encoded_uint32(etl::span decoded) { etl::array encoded{0, 0, 0, 0, 0, 0, 0, 0}; etl::manchester::encode(decoded, encoded); return encoded; } #endif TEST(encode_span) { constexpr etl::array decoded{0x00, 0xFF, 0x01, 0x80}; etl::array encoded0; etl::array encoded1; etl::array encoded2; etl::array encoded3; etl::manchester::encode(decoded, encoded0); etl::manchester::encode(decoded, encoded1); etl::manchester::encode(decoded, encoded2); etl::manchester::encode(decoded, encoded3); CHECK_EQUAL(0xAA, encoded0[0]); CHECK_EQUAL(0xAA, encoded0[1]); CHECK_EQUAL(0x55, encoded0[2]); CHECK_EQUAL(0x55, encoded0[3]); CHECK_EQUAL(0xA9, encoded0[4]); CHECK_EQUAL(0xAA, encoded0[5]); CHECK_EQUAL(0xAA, encoded0[6]); CHECK_EQUAL(0x6A, encoded0[7]); CHECK_TRUE(encoded0 == encoded1); CHECK_TRUE(encoded0 == encoded2); CHECK_TRUE(encoded0 == encoded3); } #if ETL_USING_CPP14 TEST(encode_span_constexpr) { constexpr etl::array decoded{0x00, 0xFF, 0x01, 0x80}; static_assert(manchester_encoded_uint8(decoded)[0] == 0xAA, "Compile time encoding with uint8_t failed"); static_assert(manchester_encoded_uint8(decoded)[1] == 0xAA, "Compile time encoding with uint8_t failed"); static_assert(manchester_encoded_uint8(decoded)[2] == 0x55, "Compile time encoding with uint8_t failed"); static_assert(manchester_encoded_uint8(decoded)[3] == 0x55, "Compile time encoding with uint8_t failed"); static_assert(manchester_encoded_uint8(decoded)[4] == 0xA9, "Compile time encoding with uint8_t failed"); static_assert(manchester_encoded_uint8(decoded)[5] == 0xAA, "Compile time encoding with uint8_t failed"); static_assert(manchester_encoded_uint8(decoded)[6] == 0xAA, "Compile time encoding with uint8_t failed"); static_assert(manchester_encoded_uint8(decoded)[7] == 0x6A, "Compile time encoding with uint8_t failed"); static_assert(manchester_encoded_uint16(decoded)[0] == 0xAA, "Compile time encoding with uint16_t failed"); static_assert(manchester_encoded_uint16(decoded)[1] == 0xAA, "Compile time encoding with uint16_t failed"); static_assert(manchester_encoded_uint16(decoded)[2] == 0x55, "Compile time encoding with uint16_t failed"); static_assert(manchester_encoded_uint16(decoded)[3] == 0x55, "Compile time encoding with uint16_t failed"); static_assert(manchester_encoded_uint16(decoded)[4] == 0xA9, "Compile time encoding with uint16_t failed"); static_assert(manchester_encoded_uint16(decoded)[5] == 0xAA, "Compile time encoding with uint16_t failed"); static_assert(manchester_encoded_uint16(decoded)[6] == 0xAA, "Compile time encoding with uint16_t failed"); static_assert(manchester_encoded_uint16(decoded)[7] == 0x6A, "Compile time encoding with uint16_t failed"); static_assert(manchester_encoded_uint32(decoded)[0] == 0xAA, "Compile time encoding with uint32_t failed"); static_assert(manchester_encoded_uint32(decoded)[1] == 0xAA, "Compile time encoding with uint32_t failed"); static_assert(manchester_encoded_uint32(decoded)[2] == 0x55, "Compile time encoding with uint32_t failed"); static_assert(manchester_encoded_uint32(decoded)[3] == 0x55, "Compile time encoding with uint32_t failed"); static_assert(manchester_encoded_uint32(decoded)[4] == 0xA9, "Compile time encoding with uint32_t failed"); static_assert(manchester_encoded_uint32(decoded)[5] == 0xAA, "Compile time encoding with uint32_t failed"); static_assert(manchester_encoded_uint32(decoded)[6] == 0xAA, "Compile time encoding with uint32_t failed"); static_assert(manchester_encoded_uint32(decoded)[7] == 0x6A, "Compile time encoding with uint32_t failed"); } #endif TEST(encode_span_inverted) { etl::array decoded{0x00, 0xFF, 0x01, 0x80}; etl::array encoded0; etl::array encoded1; etl::array encoded2; etl::array encoded3; etl::manchester_inverted::encode(decoded, encoded0); etl::manchester_inverted::encode(decoded, encoded1); etl::manchester_inverted::encode(decoded, encoded2); etl::manchester_inverted::encode(decoded, encoded3); CHECK_EQUAL(0x55, encoded0[0]); CHECK_EQUAL(0x55, encoded0[1]); CHECK_EQUAL(0xAA, encoded0[2]); CHECK_EQUAL(0xAA, encoded0[3]); CHECK_EQUAL(0x56, encoded0[4]); CHECK_EQUAL(0x55, encoded0[5]); CHECK_EQUAL(0x55, encoded0[6]); CHECK_EQUAL(0x95, encoded0[7]); CHECK_TRUE(encoded0 == encoded1); CHECK_TRUE(encoded0 == encoded2); CHECK_TRUE(encoded0 == encoded3); } TEST(encode_span_invalid_source) { etl::array invalid_source{0x00, 0xFF, 0x01}; etl::array valid_destination; CHECK_THROW({ etl::manchester::encode(invalid_source, valid_destination); }, etl::manchester_invalid_size); CHECK_THROW({ etl::manchester::encode(invalid_source, valid_destination); }, etl::manchester_invalid_size); CHECK_THROW({ etl::manchester_inverted::encode(invalid_source, valid_destination); }, etl::manchester_invalid_size); CHECK_THROW({ etl::manchester_inverted::encode(invalid_source, valid_destination); }, etl::manchester_invalid_size); } TEST(encode_span_invalid_destination) { etl::array valid_source{0x00, 0xFF, 0x01, 0x80}; etl::array invalid_destination; CHECK_THROW({ etl::manchester::encode(valid_source, invalid_destination); }, etl::manchester_invalid_size); CHECK_THROW({ etl::manchester::encode(valid_source, invalid_destination); }, etl::manchester_invalid_size); CHECK_THROW({ etl::manchester::encode(valid_source, invalid_destination); }, etl::manchester_invalid_size); CHECK_THROW({ etl::manchester_inverted::encode(valid_source, invalid_destination); }, etl::manchester_invalid_size); CHECK_THROW({ etl::manchester_inverted::encode(valid_source, invalid_destination); }, etl::manchester_invalid_size); CHECK_THROW({ etl::manchester_inverted::encode(valid_source, invalid_destination); }, etl::manchester_invalid_size); } TEST(decode_uint16_t) { CHECK_EQUAL(0x00, (etl::manchester::decode(0xAAAAUL))); CHECK_EQUAL(0xFF, (etl::manchester::decode(0x5555UL))); CHECK_EQUAL(0x01, (etl::manchester::decode(0xAAA9UL))); CHECK_EQUAL(0x80, (etl::manchester::decode(0x6AAAUL))); #if ETL_USING_CPP14 static_assert(0x00 == etl::manchester::decode(0xAAAAUL), "Compile time manchester decoding failed"); #endif } TEST(decode_uint16_t_inverted) { CHECK_EQUAL(0x00, (etl::manchester_inverted::decode(0x5555UL))); CHECK_EQUAL(0xFF, (etl::manchester_inverted::decode(0xAAAAUL))); CHECK_EQUAL(0x01, (etl::manchester_inverted::decode(0x5556UL))); CHECK_EQUAL(0x80, (etl::manchester_inverted::decode(0x9555UL))); #if ETL_USING_CPP14 static_assert(0x00 == etl::manchester_inverted::decode(0x5555UL), "Compile time manchester decoding failed"); #endif } TEST(decode_uint32_t) { CHECK_EQUAL(0xFF00UL, (etl::manchester::decode(0x5555AAAAUL))); CHECK_EQUAL(0x8001UL, (etl::manchester::decode(0x6AAAAAA9UL))); #if ETL_USING_CPP14 static_assert(0xFF00UL == etl::manchester::decode(0x5555AAAAUL), "Compile time manchester decoding failed"); #endif } TEST(decode_uint32_t_inverted) { CHECK_EQUAL(0xFF00UL, (etl::manchester_inverted::decode(0xAAAA5555UL))); CHECK_EQUAL(0x8001UL, (etl::manchester_inverted::decode(0x95555556UL))); #if ETL_USING_CPP14 static_assert(0xFF00UL == etl::manchester_inverted::decode(0xAAAA5555UL), "Compile time manchester decoding failed"); #endif } TEST(decode_uint64_t) { CHECK_EQUAL(0x8001FF00ULL, (etl::manchester::decode(0x6AAAAAA95555AAAAULL))); #if ETL_USING_CPP14 static_assert(0x8001FF00ULL == etl::manchester::decode(0x6AAAAAA95555AAAAULL), "Compile time manchester decoding failed"); #endif } TEST(decode_uint64_t_inverted) { CHECK_EQUAL(0x8001FF00ULL, (etl::manchester_inverted::decode(0x95555556AAAA5555ULL))); #if ETL_USING_CPP14 static_assert(0x8001FF00ULL == etl::manchester_inverted::decode(0x95555556AAAA5555ULL), "Compile time manchester decoding failed"); #endif } #if ETL_USING_CPP14 constexpr etl::array manchester_decoded_uint16(etl::span encoded) { etl::array decoded{0, 0, 0, 0}; etl::manchester::decode(encoded, decoded); return decoded; } constexpr etl::array manchester_decoded_uint32(etl::span encoded) { etl::array decoded{0, 0, 0, 0}; etl::manchester::decode(encoded, decoded); return decoded; } constexpr etl::array manchester_decoded_uint64(etl::span encoded) { etl::array decoded{0, 0, 0, 0}; etl::manchester::decode(encoded, decoded); return decoded; } #endif TEST(decode_span) { constexpr etl::array encoded{0xAA, 0xAA, 0x55, 0x55, 0xA9, 0xAA, 0xAA, 0x6A}; etl::array decoded0; etl::array decoded1; etl::array decoded2; etl::array decoded3; etl::manchester::decode(encoded, decoded0); etl::manchester::decode(encoded, decoded1); etl::manchester::decode(encoded, decoded2); etl::manchester::decode(encoded, decoded3); CHECK_EQUAL(0x00, decoded0[0]); CHECK_EQUAL(0xFF, decoded0[1]); CHECK_EQUAL(0x01, decoded0[2]); CHECK_EQUAL(0x80, decoded0[3]); CHECK_TRUE(decoded0 == decoded1); CHECK_TRUE(decoded0 == decoded2); CHECK_TRUE(decoded0 == decoded3); } #if ETL_USING_CPP14 TEST(decode_span_constexpr) { constexpr etl::array encoded{0xAA, 0xAA, 0x55, 0x55, 0xA9, 0xAA, 0xAA, 0x6A}; static_assert(manchester_decoded_uint16(encoded)[0] == 0x00, "Compile time decoding with uint16_t failed"); static_assert(manchester_decoded_uint16(encoded)[1] == 0xFF, "Compile time decoding with uint16_t failed"); static_assert(manchester_decoded_uint16(encoded)[2] == 0x01, "Compile time decoding with uint16_t failed"); static_assert(manchester_decoded_uint16(encoded)[3] == 0x80, "Compile time decoding with uint16_t failed"); static_assert(manchester_decoded_uint32(encoded)[0] == 0x00, "Compile time decoding with uint32_t failed"); static_assert(manchester_decoded_uint32(encoded)[1] == 0xFF, "Compile time decoding with uint32_t failed"); static_assert(manchester_decoded_uint32(encoded)[2] == 0x01, "Compile time decoding with uint32_t failed"); static_assert(manchester_decoded_uint32(encoded)[3] == 0x80, "Compile time decoding with uint32_t failed"); static_assert(manchester_decoded_uint64(encoded)[0] == 0x00, "Compile time decoding with uint64_t failed"); static_assert(manchester_decoded_uint64(encoded)[1] == 0xFF, "Compile time decoding with uint64_t failed"); static_assert(manchester_decoded_uint64(encoded)[2] == 0x01, "Compile time decoding with uint64_t failed"); static_assert(manchester_decoded_uint64(encoded)[3] == 0x80, "Compile time decoding with uint64_t failed"); } #endif TEST(decode_span_inverted) { etl::array encoded{0x55, 0x55, 0xAA, 0xAA, 0x56, 0x55, 0x55, 0x95}; etl::array decoded0; etl::array decoded1; etl::array decoded2; etl::array decoded3; etl::manchester_inverted::decode(encoded, decoded0); etl::manchester_inverted::decode(encoded, decoded1); etl::manchester_inverted::decode(encoded, decoded2); etl::manchester_inverted::decode(encoded, decoded3); CHECK_EQUAL(0x00, decoded0[0]); CHECK_EQUAL(0xFF, decoded0[1]); CHECK_EQUAL(0x01, decoded0[2]); CHECK_EQUAL(0x80, decoded0[3]); CHECK_TRUE(decoded0 == decoded1); CHECK_TRUE(decoded0 == decoded2); CHECK_TRUE(decoded0 == decoded3); } TEST(decode_span_invalid_source) { etl::array invalid_source{0x55, 0x55, 0xAA, 0xAA, 0x56, 0x55, 0x55}; etl::array valid_destination; CHECK_THROW({ etl::manchester::decode(invalid_source, valid_destination); }, etl::manchester_invalid_size); CHECK_THROW({ etl::manchester::decode(invalid_source, valid_destination); }, etl::manchester_invalid_size); CHECK_THROW({ etl::manchester::decode(invalid_source, valid_destination); }, etl::manchester_invalid_size); CHECK_THROW({ etl::manchester_inverted::decode(invalid_source, valid_destination); }, etl::manchester_invalid_size); CHECK_THROW({ etl::manchester_inverted::decode(invalid_source, valid_destination); }, etl::manchester_invalid_size); CHECK_THROW({ etl::manchester_inverted::decode(invalid_source, valid_destination); }, etl::manchester_invalid_size); } TEST(decode_span_invalid_destination) { etl::array valid_source{0x55, 0x55, 0xAA, 0xAA, 0x56, 0x55, 0x55, 0x95}; etl::array invalid_destination; CHECK_THROW({ etl::manchester::decode(valid_source, invalid_destination); }, etl::manchester_invalid_size); CHECK_THROW({ etl::manchester::decode(valid_source, invalid_destination); }, etl::manchester_invalid_size); CHECK_THROW({ etl::manchester::decode(valid_source, invalid_destination); }, etl::manchester_invalid_size); CHECK_THROW({ etl::manchester_inverted::decode(valid_source, invalid_destination); }, etl::manchester_invalid_size); CHECK_THROW({ etl::manchester_inverted::decode(valid_source, invalid_destination); }, etl::manchester_invalid_size); CHECK_THROW({ etl::manchester_inverted::decode(valid_source, invalid_destination); }, etl::manchester_invalid_size); } TEST(valid16) { CHECK_TRUE(etl::manchester::is_valid(0xAAAAUL)); CHECK_TRUE(etl::manchester_inverted::is_valid(0xAAAAUL)); CHECK_FALSE(etl::manchester::is_valid(0xAAA8UL)); CHECK_FALSE(etl::manchester_inverted::is_valid(0xAAA8UL)); #if ETL_USING_CPP14 static_assert(etl::manchester::is_valid(0xAAAAUL), "Compile time manchester validity check failed"); static_assert(etl::manchester_inverted::is_valid(0xAAAAUL), "Compile time manchester validity check failed"); #endif } TEST(valid32) { CHECK_TRUE(etl::manchester::is_valid(0xAAAAAAAAUL)); CHECK_TRUE(etl::manchester_inverted::is_valid(0xAAAAAAAAUL)); CHECK_FALSE(etl::manchester::is_valid(0xAAAAAAA8UL)); CHECK_FALSE(etl::manchester_inverted::is_valid(0xAAAAAAA8UL)); #if ETL_USING_CPP14 static_assert(etl::manchester::is_valid(0xAAAAAAAAUL), "Compile time manchester validity check failed"); static_assert(etl::manchester_inverted::is_valid(0xAAAAAAAAUL), "Compile time manchester validity check failed"); #endif } TEST(valid64) { CHECK_TRUE(etl::manchester::is_valid(0xAAAAAAAAAAAAAAAAULL)); CHECK_TRUE(etl::manchester_inverted::is_valid(0xAAAAAAAAAAAAAAAAULL)); CHECK_FALSE(etl::manchester::is_valid(0xAAAAAAAAAAAAAAA8ULL)); CHECK_FALSE(etl::manchester_inverted::is_valid(0xAAAAAAAAAAAAAAA8ULL)); #if ETL_USING_CPP14 static_assert(etl::manchester::is_valid(0xAAAAAAAAAAAAAAAAULL), "Compile time manchester validity check failed"); static_assert(etl::manchester_inverted::is_valid(0xAAAAAAAAAAAAAAAAULL), "Compile time manchester validity check failed"); #endif } TEST(valid_span) { constexpr etl::array encoded1{0xAA, 0xAA, 0x55, 0x55, 0xA9, 0xAA, 0xAA, 0x6A}; constexpr etl::array encoded2{0xAA, 0xAA, 0x55, 0x55, 0xA9, 0xAA, 0xAB, 0x6A}; CHECK_TRUE(etl::manchester::is_valid(encoded1)); CHECK_FALSE(etl::manchester::is_valid(encoded2)); #if ETL_USING_CPP14 static_assert(etl::manchester::is_valid(encoded1), "Compile time manchester validity check failed"); static_assert(!etl::manchester::is_valid(encoded2), "Compile time manchester validity check failed"); #endif } TEST(valid_span_on_invalid_source) { constexpr etl::array invalid_source{0xAA, 0xAA, 0x55, 0x55, 0xA9, 0xAA, 0xAA}; CHECK_THROW({ std::ignore = etl::manchester::is_valid(invalid_source); }, etl::manchester_invalid_size); } }