diff options
Diffstat (limited to 'genqrcode/tests/test_bitstream.c')
| -rw-r--r-- | genqrcode/tests/test_bitstream.c | 257 |
1 files changed, 257 insertions, 0 deletions
diff --git a/genqrcode/tests/test_bitstream.c b/genqrcode/tests/test_bitstream.c new file mode 100644 index 0000000000..64b1e86d92 --- /dev/null +++ b/genqrcode/tests/test_bitstream.c @@ -0,0 +1,257 @@ +#include <stdio.h> +#include <string.h> +#include "common.h" +#include "../bitstream.h" + +static void test_null(void) +{ + BitStream *bstream; + + testStart("Empty stream"); + bstream = BitStream_new(); + assert_zero(BitStream_size(bstream), "Size of empty BitStream is not 0.\n"); + assert_null(BitStream_toByte(bstream), "BitStream_toByte returned non-NULL.\n"); + assert_nothing(BitStream_free(NULL), "Checking BitStream_free(NULL).\n"); + testFinish(); + + BitStream_free(bstream); +} + +static void test_num(void) +{ + BitStream *bstream; + unsigned int data = 0x13579bdf; + char correct[] = "0010011010101111001101111011111"; + + testStart("New from num"); + bstream = BitStream_new(); + BitStream_appendNum(bstream, 31, data); + testEnd(cmpBin(correct, bstream)); + + BitStream_free(bstream); +} + +static void test_bytes(void) +{ + BitStream *bstream; + unsigned char data[1] = {0x3a}; + char correct[] = "00111010"; + + testStart("New from bytes"); + bstream = BitStream_new(); + BitStream_appendBytes(bstream, 1, data); + testEnd(cmpBin(correct, bstream)); + BitStream_free(bstream); +} + +static void test_appendNum(void) +{ + BitStream *bstream; + char correct[] = "10001010 11111111 11111111 00010010001101000101011001111000"; + + testStart("Append Num"); + bstream = BitStream_new(); + + BitStream_appendNum(bstream, 8, 0x0000008a); + assert_zero(ncmpBin(correct, bstream, 8), "Internal data is incorrect.\n"); + + BitStream_appendNum(bstream, 16, 0x0000ffff); + assert_zero(ncmpBin(correct, bstream, 24), "Internal data is incorrect.\n"); + + BitStream_appendNum(bstream, 32, 0x12345678); + + assert_zero(cmpBin(correct, bstream), "Internal data is incorrect.\n"); + testFinish(); + + BitStream_free(bstream); +} + +static void test_appendBytes(void) +{ + BitStream *bstream; + unsigned char data[8]; + char correct[] = "10001010111111111111111100010010001101000101011001111000"; + + testStart("Append Bytes"); + bstream = BitStream_new(); + + data[0] = 0x8a; + BitStream_appendBytes(bstream, 1, data); + assert_zero(ncmpBin(correct, bstream, 8), "Internal data is incorrect."); + + data[0] = 0xff; + data[1] = 0xff; + BitStream_appendBytes(bstream, 2, data); + assert_zero(ncmpBin(correct, bstream, 24), "Internal data is incorrect.\n"); + + data[0] = 0x12; + data[1] = 0x34; + data[2] = 0x56; + data[3] = 0x78; + BitStream_appendBytes(bstream, 4, data); + + assert_zero(cmpBin(correct, bstream), "Internal data is incorrect.\n"); + testFinish(); + + BitStream_free(bstream); +} + +static void test_toByte(void) +{ + BitStream *bstream; + unsigned char correct[] = { + 0x8a, 0xff, 0xff, 0x12, 0x34, 0x56, 0x78 + }; + unsigned char *result; + + testStart("Convert to a byte array"); + bstream = BitStream_new(); + + BitStream_appendBytes(bstream, 1, &correct[0]); + BitStream_appendBytes(bstream, 2, &correct[1]); + BitStream_appendBytes(bstream, 4, &correct[3]); + + result = BitStream_toByte(bstream); + testEnd(memcmp(correct, result, 7)); + + BitStream_free(bstream); + free(result); +} + +static void test_toByte_4bitpadding(void) +{ + BitStream *bstream; + unsigned char *result; + + testStart("Convert to a byte array"); + + bstream = BitStream_new(); + BitStream_appendNum(bstream, 4, 0xb); + result = BitStream_toByte(bstream); + assert_equal(result[0], 0xb0, "incorrect paddings\n"); + BitStream_free(bstream); + free(result); + + bstream = BitStream_new(); + BitStream_appendNum(bstream, 12, 0x335); + result = BitStream_toByte(bstream); + assert_equal(result[0], 0x33, "incorrect paddings\n"); + assert_equal(result[1], 0x50, "incorrect paddings\n"); + BitStream_free(bstream); + free(result); + + testFinish(); + +} + +static void test_size(void) +{ + BitStream *bstream; + + testStart("size check"); + bstream = BitStream_new(); + assert_equal(BitStream_size(bstream), 0, "Initialized BitStream is not 0 length"); + BitStream_appendNum(bstream, 1, 0); + assert_equal(BitStream_size(bstream), 1, "Size incorrect. (first append)"); + BitStream_appendNum(bstream, 2, 0); + assert_equal(BitStream_size(bstream), 3, "Size incorrect. (second append)"); + testFinish(); + + BitStream_free(bstream); +} + +static void test_append(void) +{ + BitStream *bs1, *bs2; + char c1[] = "00"; + char c2[] = "0011"; + char c3[] = "01111111111111111"; + char c4[] = "001101111111111111111"; + char c5[] = "0011011111111111111111111111111111"; + int ret; + + testStart("Append two BitStreams"); + + bs1 = BitStream_new(); + bs2 = BitStream_new(); + ret = BitStream_appendNum(bs1, 1, 0); + ret = BitStream_appendNum(bs2, 1, 0); + + ret = BitStream_append(bs1, bs2); + assert_zero(ret, "Failed to append."); + assert_zero(cmpBin(c1, bs1), "Internal data is incorrect."); + + ret = BitStream_appendNum(bs1, 2, 3); + assert_zero(ret, "Failed to append."); + assert_zero(cmpBin(c2, bs1), "Internal data is incorrect."); + + ret = BitStream_appendNum(bs2, 16, 65535); + assert_zero(ret, "Failed to append."); + assert_zero(cmpBin(c3, bs2), "Internal data is incorrect."); + + ret = BitStream_append(bs1, bs2); + assert_zero(ret, "Failed to append."); + assert_zero(cmpBin(c4, bs1), "Internal data is incorrect."); + + ret = BitStream_appendNum(bs1, 13, 16383); + assert_zero(ret, "Failed to append."); + assert_zero(cmpBin(c5, bs1), "Internal data is incorrect."); + + testFinish(); + + BitStream_free(bs1); + BitStream_free(bs2); +} + +static void test_newWithBits(void) +{ + BitStream *bstream; + unsigned char data[4] = {0, 1, 0, 1}; + + testStart("New with bits"); + + bstream = BitStream_newWithBits(4, data); + assert_equal(bstream->length, 4, "Internal bit length is incorrect.\n"); + assert_equal(bstream->datasize, 4, "Internal buffer size is incorrect.\n"); + assert_zero(cmpBin("0101", bstream), "Internal data is incorrect.\n"); + + testFinish(); + + BitStream_free(bstream); +} + +static void test_newWithBits_size0(void) +{ + BitStream *bstream; + + testStart("New with bits (size = 0)"); + + bstream = BitStream_newWithBits(0, NULL); + assert_equal(bstream->length, 0, "Internal bit length is incorrect.\n"); + assert_nonzero(bstream->datasize, "Internal buffer size is incorrect.\n"); + assert_nonnull(bstream->data, "Internal buffer not allocated.\n"); + + testFinish(); + + BitStream_free(bstream); +} + +int main() +{ + int tests = 11; + testInit(tests); + test_null(); + test_num(); + test_bytes(); + test_appendNum(); + test_appendBytes(); + test_toByte(); + test_toByte_4bitpadding(); + test_size(); + test_append(); + test_newWithBits(); + test_newWithBits_size0(); + testReport(tests); + + return 0; +} |
