|
|
#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(); |
|
|
} |