| #include "../../unity/unity.h" |
| #include <string.h> |
| #include <stdlib.h> |
| #include <stdio.h> |
| #include <stdint.h> |
|
|
| |
|
|
| void setUp(void) { |
| |
| } |
|
|
| void tearDown(void) { |
| |
| } |
|
|
| |
| static void byte_to_bits_msb(unsigned char c, char out[9]) { |
| for (int i = 0; i < 8; i++) { |
| out[i] = (c & 0x80) ? '1' : '0'; |
| c <<= 1; |
| } |
| out[8] = '\0'; |
| } |
|
|
| |
| static char *bytes_to_bits_msb(const unsigned char *in, size_t inlen) { |
| size_t outlen = inlen * 8; |
| char *res = (char *)malloc(outlen + 1); |
| TEST_ASSERT_NOT_NULL(res); |
| char *p = res; |
| for (size_t i = 0; i < inlen; i++) { |
| char tmp[9]; |
| byte_to_bits_msb(in[i], tmp); |
| memcpy(p, tmp, 8); |
| p += 8; |
| } |
| res[outlen] = '\0'; |
| return res; |
| } |
|
|
| void test_base2msbf_encode_empty_input_no_output(void) { |
| char outbuf[16]; |
| |
| for (size_t i = 0; i < sizeof(outbuf); i++) outbuf[i] = 'X'; |
|
|
| const char inbuf[] = ""; |
| base2msbf_encode(inbuf, (idx_t)0, outbuf, (idx_t)8); |
|
|
| |
| for (size_t i = 0; i < sizeof(outbuf); i++) { |
| TEST_ASSERT_EQUAL_CHAR('X', outbuf[i]); |
| } |
| } |
|
|
| void test_base2msbf_encode_single_byte_zero(void) { |
| unsigned char inbuf[1] = {0x00}; |
| char outbuf[8 + 1]; |
| memset(outbuf, 0, sizeof(outbuf)); |
|
|
| base2msbf_encode((const char *)inbuf, (idx_t)1, outbuf, (idx_t)8); |
| outbuf[8] = '\0'; |
|
|
| TEST_ASSERT_EQUAL_STRING("00000000", outbuf); |
| } |
|
|
| void test_base2msbf_encode_single_byte_ff(void) { |
| unsigned char inbuf[1] = {0xFF}; |
| char outbuf[8 + 1]; |
| memset(outbuf, 0, sizeof(outbuf)); |
|
|
| base2msbf_encode((const char *)inbuf, (idx_t)1, outbuf, (idx_t)8); |
| outbuf[8] = '\0'; |
|
|
| TEST_ASSERT_EQUAL_STRING("11111111", outbuf); |
| } |
|
|
| void test_base2msbf_encode_single_byte_a5(void) { |
| unsigned char inbuf[1] = {0xA5}; |
| char outbuf[8 + 1]; |
| memset(outbuf, 0, sizeof(outbuf)); |
|
|
| base2msbf_encode((const char *)inbuf, (idx_t)1, outbuf, (idx_t)8); |
| outbuf[8] = '\0'; |
|
|
| TEST_ASSERT_EQUAL_STRING("10100101", outbuf); |
| } |
|
|
| void test_base2msbf_encode_single_byte_80(void) { |
| unsigned char inbuf[1] = {0x80}; |
| char outbuf[8 + 1]; |
| memset(outbuf, 0, sizeof(outbuf)); |
|
|
| base2msbf_encode((const char *)inbuf, (idx_t)1, outbuf, (idx_t)8); |
| outbuf[8] = '\0'; |
|
|
| TEST_ASSERT_EQUAL_STRING("10000000", outbuf); |
| } |
|
|
| void test_base2msbf_encode_two_bytes_Hi(void) { |
| const unsigned char inbuf[2] = {'H', 'i'}; |
| |
| const char *expected = "0100100001101001"; |
|
|
| char outbuf[16 + 1]; |
| memset(outbuf, 0, sizeof(outbuf)); |
| base2msbf_encode((const char *)inbuf, (idx_t)2, outbuf, (idx_t)16); |
| outbuf[16] = '\0'; |
|
|
| TEST_ASSERT_EQUAL_STRING(expected, outbuf); |
| } |
|
|
| void test_base2msbf_encode_truncate_outlen_multiple_of_8(void) { |
| const unsigned char inbuf[3] = {'A', 'B', 'C'}; |
| |
| const char *expected_first2 = "0100000101000010"; |
|
|
| char outbuf[16 + 2]; |
| memset(outbuf, 0, sizeof(outbuf)); |
| outbuf[16] = 'Z'; |
| outbuf[17] = '\0'; |
|
|
| base2msbf_encode((const char *)inbuf, (idx_t)3, outbuf, (idx_t)16); |
|
|
| outbuf[16] = '\0'; |
| TEST_ASSERT_EQUAL_STRING(expected_first2, outbuf); |
| |
| TEST_ASSERT_EQUAL_CHAR('Z', outbuf[16]); |
| } |
|
|
| void test_base2msbf_encode_outlen_zero_no_write(void) { |
| const unsigned char inbuf[2] = {0x01, 0xFF}; |
| char outbuf[4]; |
| for (size_t i = 0; i < sizeof(outbuf); i++) outbuf[i] = 'Q'; |
|
|
| base2msbf_encode((const char *)inbuf, (idx_t)2, outbuf, (idx_t)0); |
|
|
| for (size_t i = 0; i < sizeof(outbuf); i++) { |
| TEST_ASSERT_EQUAL_CHAR('Q', outbuf[i]); |
| } |
| } |
|
|
| void test_base2msbf_encode_reference_compare_randomish_pattern(void) { |
| const unsigned char inbuf[] = {0x00, 0xFF, 0x12, 0xAB, 0x7E, 0x80, 0x01, 0xC3}; |
| size_t inlen = sizeof(inbuf); |
| size_t outlen = inlen * 8; |
|
|
| char *expected = bytes_to_bits_msb(inbuf, inlen); |
| char *outbuf = (char *)malloc(outlen + 1); |
| TEST_ASSERT_NOT_NULL(outbuf); |
| memset(outbuf, 0, outlen + 1); |
|
|
| base2msbf_encode((const char *)inbuf, (idx_t)inlen, outbuf, (idx_t)outlen); |
| outbuf[outlen] = '\0'; |
|
|
| TEST_ASSERT_EQUAL_STRING(expected, outbuf); |
|
|
| free(expected); |
| free(outbuf); |
| } |
|
|
| int main(void) { |
| UNITY_BEGIN(); |
| RUN_TEST(test_base2msbf_encode_empty_input_no_output); |
| RUN_TEST(test_base2msbf_encode_single_byte_zero); |
| RUN_TEST(test_base2msbf_encode_single_byte_ff); |
| RUN_TEST(test_base2msbf_encode_single_byte_a5); |
| RUN_TEST(test_base2msbf_encode_single_byte_80); |
| RUN_TEST(test_base2msbf_encode_two_bytes_Hi); |
| RUN_TEST(test_base2msbf_encode_truncate_outlen_multiple_of_8); |
| RUN_TEST(test_base2msbf_encode_outlen_zero_no_write); |
| RUN_TEST(test_base2msbf_encode_reference_compare_randomish_pattern); |
| return UNITY_END(); |
| } |