1 /*
2 * test_write_api.c
3 * Luabins Lua-less write API tests
4 * See copyright notice in luabins.h
5 */
6
7 /*
8 * WARNING: This suite is format-specific. Change it when format changes.
9 */
10
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <string.h>
14
15 /* Should be included first */
16 #include "lualess.h"
17 #include "write.h"
18
19 #include "test.h"
20 #include "util.h"
21
22 /******************************************************************************/
23
24 /*
25 * Note it is different from test_savebuffer variant.
26 * We're interested in higher level stuff here.
27 */
check_buffer(luabins_SaveBuffer * sb,const char * expected_buf_c,size_t expected_length)28 static void check_buffer(
29 luabins_SaveBuffer * sb,
30 const char * expected_buf_c,
31 size_t expected_length
32 )
33 {
34 const unsigned char * expected_buf = (const unsigned char *)expected_buf_c;
35
36 size_t actual_length = (size_t)-1;
37 const unsigned char * actual_buf = lbsSB_buffer(sb, &actual_length);
38 if (actual_length != expected_length)
39 {
40 fprintf(
41 stderr,
42 "lsbSB_buffer length mismatch: got %lu, expected %lu\n",
43 actual_length, expected_length
44 );
45 fprintf(stderr, "actual:\n");
46 fprintbuf(stderr, actual_buf, actual_length);
47 fprintf(stderr, "expected:\n");
48 fprintbuf(stderr, expected_buf, expected_length);
49 exit(1);
50 }
51
52 if (memcmp(actual_buf, expected_buf, expected_length) != 0)
53 {
54 fprintf(stderr, "lsbSB_buffer buffer mismatch\n");
55 fprintf(stderr, "actual:\n");
56 fprintbuf(stderr, actual_buf, actual_length);
57 fprintf(stderr, "expected:\n");
58 fprintbuf(stderr, expected_buf, expected_length);
59
60 exit(1);
61 }
62 }
63
64 /******************************************************************************/
65
66 #define CAT(a, b) a ## b
67
68 #define TEST_NAME(x) CAT(test_write, x)
69 #define CALL_NAME(x) CAT(lbs_write, x)
70 #define BUFFER_NAME (&sb)
71 #define INIT_BUFFER \
72 luabins_SaveBuffer sb; \
73 lbsSB_init(BUFFER_NAME, lbs_simplealloc, NULL);
74
75 #define DESTROY_BUFFER \
76 lbsSB_destroy(BUFFER_NAME);
77
78 #define CHECK_BUFFER check_buffer
79
80 #include "write_tests.inc"
81
82 /******************************************************************************/
83
84 TEST (test_writeTableHeaderAt,
85 {
86 INIT_BUFFER;
87
88 {
89 unsigned char tuple_size = 0x01;
90 int array_size = 0x00;
91 int hash_size = 0x00;
92 int table_header_pos = 0;
93
94 lbs_writeTupleSize(BUFFER_NAME, tuple_size);
95 table_header_pos = lbsSB_length(BUFFER_NAME);
96 lbs_writeTableHeader(BUFFER_NAME, array_size, hash_size);
97
98 CHECK_BUFFER(
99 &sb,
100 "\x01" "T" "\x00\x00\x00\x00" "\x00\x00\x00\x00",
101 1 + 1 + 4 + 4
102 );
103
104 array_size = 0xAB;
105 hash_size = 0xCD;
106
107 lbs_writeTableHeaderAt(
108 BUFFER_NAME,
109 table_header_pos,
110 array_size,
111 hash_size
112 );
113 CHECK_BUFFER(
114 BUFFER_NAME,
115 "\x01" "T" "\xAB\x00\x00\x00" "\xCD\x00\x00\x00",
116 1 + 1 + 4 + 4
117 );
118 }
119
120 DESTROY_BUFFER;
121 })
122
123 /******************************************************************************/
124
test_write_api()125 void test_write_api()
126 {
127 RUN_GENERATED_TESTS;
128
129 test_writeTableHeaderAt();
130 }
131