| | #include "../../unity/unity.h" |
| | #include <stdlib.h> |
| | #include <string.h> |
| | #include <stdio.h> |
| | #include <stdint.h> |
| |
|
| | |
| | void setUp(void) { |
| | |
| | } |
| | void tearDown(void) { |
| | |
| | } |
| |
|
| | |
| | static void build_expected_hex(const unsigned char *in, size_t inlen, char *out) |
| | { |
| | static const char hex[16] = "0123456789ABCDEF"; |
| | for (size_t i = 0; i < inlen; i++) { |
| | unsigned char c = in[i]; |
| | out[2*i] = hex[(c >> 4) & 0x0F]; |
| | out[2*i + 1] = hex[c & 0x0F]; |
| | } |
| | } |
| |
|
| | |
| |
|
| | void test_base16_encode_empty_input(void) |
| | { |
| | char out[4]; |
| | memset(out, 'X', sizeof out); |
| | |
| | base16_encode("", 0, out, 4); |
| | |
| | TEST_ASSERT_EQUAL_UINT8('X', (unsigned char)out[0]); |
| | TEST_ASSERT_EQUAL_UINT8('X', (unsigned char)out[1]); |
| | TEST_ASSERT_EQUAL_UINT8('X', (unsigned char)out[2]); |
| | TEST_ASSERT_EQUAL_UINT8('X', (unsigned char)out[3]); |
| | } |
| |
|
| | void test_base16_encode_single_zero(void) |
| | { |
| | unsigned char inb[1] = { 0x00 }; |
| | char out[2]; |
| | base16_encode((const char*)inb, 1, out, 2); |
| | TEST_ASSERT_EQUAL_MEMORY("00", out, 2); |
| | } |
| |
|
| | void test_base16_encode_single_ff(void) |
| | { |
| | unsigned char inb[1] = { 0xFF }; |
| | char out[2]; |
| | base16_encode((const char*)inb, 1, out, 2); |
| | TEST_ASSERT_EQUAL_MEMORY("FF", out, 2); |
| | } |
| |
|
| | void test_base16_encode_mixed_bytes(void) |
| | { |
| | unsigned char inb[] = { 0x12, 0xAB, 0xCD, 0xEF, 0x00, 0x90 }; |
| | char out[12]; |
| | char expected[12]; |
| | build_expected_hex(inb, sizeof inb, expected); |
| | base16_encode((const char*)inb, (idx_t)(sizeof inb), out, (idx_t)sizeof out); |
| | TEST_ASSERT_EQUAL_MEMORY(expected, out, sizeof out); |
| | |
| | TEST_ASSERT_EQUAL_MEMORY("12ABCDEF0090", out, 12); |
| | } |
| |
|
| | void test_base16_encode_partial_output_even(void) |
| | { |
| | unsigned char inb[] = { 0x01, 0x02, 0x03, 0x04 }; |
| | char out[10]; |
| | memset(out, '?', sizeof out); |
| |
|
| | |
| | base16_encode((const char*)inb, 4, out, 4); |
| |
|
| | |
| | TEST_ASSERT_EQUAL_MEMORY("0102", out, 4); |
| | |
| | for (size_t i = 4; i < sizeof out; i++) { |
| | TEST_ASSERT_EQUAL_UINT8('?', (unsigned char)out[i]); |
| | } |
| | } |
| |
|
| | void test_base16_encode_full_range_0_to_255(void) |
| | { |
| | unsigned char inb[256]; |
| | for (size_t i = 0; i < 256; i++) inb[i] = (unsigned char)i; |
| |
|
| | char out[512]; |
| | char expected[512]; |
| | build_expected_hex(inb, 256, expected); |
| |
|
| | base16_encode((const char*)inb, (idx_t)256, out, (idx_t)512); |
| | TEST_ASSERT_EQUAL_MEMORY(expected, out, 512); |
| | } |
| |
|
| | void test_base16_encode_large_deterministic_pattern(void) |
| | { |
| | enum { N = 1024 }; |
| | unsigned char *inb = (unsigned char*)malloc(N); |
| | TEST_ASSERT_NOT_NULL(inb); |
| | for (size_t i = 0; i < N; i++) inb[i] = (unsigned char)((i * 37u + 11u) & 0xFFu); |
| |
|
| | char *out = (char*)malloc(2 * N); |
| | char *expected = (char*)malloc(2 * N); |
| | TEST_ASSERT_NOT_NULL(out); |
| | TEST_ASSERT_NOT_NULL(expected); |
| |
|
| | build_expected_hex(inb, N, expected); |
| | base16_encode((const char*)inb, (idx_t)N, out, (idx_t)(2 * N)); |
| | TEST_ASSERT_EQUAL_MEMORY(expected, out, 2 * N); |
| |
|
| | free(expected); |
| | free(out); |
| | free(inb); |
| | } |
| |
|
| | void test_base16_encode_no_trailing_nul_added(void) |
| | { |
| | unsigned char inb[] = { 0xDE, 0xAD, 0xBE, 0xEF }; |
| | size_t outbytes = sizeof(inb) * 2; |
| | char *out = (char*)malloc(outbytes + 1); |
| | TEST_ASSERT_NOT_NULL(out); |
| | out[outbytes] = '#'; |
| |
|
| | base16_encode((const char*)inb, (idx_t)sizeof inb, out, (idx_t)outbytes); |
| |
|
| | |
| | TEST_ASSERT_EQUAL_MEMORY("DEADBEEF", out, outbytes); |
| | TEST_ASSERT_EQUAL_UINT8('#', (unsigned char)out[outbytes]); |
| |
|
| | free(out); |
| | } |
| |
|
| | int main(void) |
| | { |
| | UNITY_BEGIN(); |
| | RUN_TEST(test_base16_encode_empty_input); |
| | RUN_TEST(test_base16_encode_single_zero); |
| | RUN_TEST(test_base16_encode_single_ff); |
| | RUN_TEST(test_base16_encode_mixed_bytes); |
| | RUN_TEST(test_base16_encode_partial_output_even); |
| | RUN_TEST(test_base16_encode_full_range_0_to_255); |
| | RUN_TEST(test_base16_encode_large_deterministic_pattern); |
| | RUN_TEST(test_base16_encode_no_trailing_nul_added); |
| | return UNITY_END(); |
| | } |