OILS / cpp / data_lang_test.cc View on Github | oilshell.org

143 lines, 79 significant
1#include "cpp/data_lang.h"
2
3#include "_gen/core/value.asdl.h"
4#include "data_lang/j8_libc.h" // for comparison
5#include "data_lang/j8_test_lib.h"
6#include "vendor/greatest.h"
7
8TEST PartIsUtf8_test() {
9 BigStr* s = StrFromC("hi");
10
11 ASSERT(pyj8::PartIsUtf8(s, 0, 2));
12
13 // empty string is trivially UTF-8
14 ASSERT(pyj8::PartIsUtf8(s, 0, 0));
15
16 BigStr* binary = StrFromC("h\xff");
17 ASSERT(!pyj8::PartIsUtf8(binary, 0, len(binary)));
18
19 // first byte is UTF-8
20 ASSERT(pyj8::PartIsUtf8(binary, 0, 1));
21 // second byte isn't
22 ASSERT(!pyj8::PartIsUtf8(binary, 1, 2));
23
24 PASS();
25}
26
27// TODO: remove duplication
28#define LOSSY_JSON (1 << 3)
29
30TEST WriteString_test() {
31 auto buf = Alloc<mylib::BufWriter>();
32
33 for (int i = 0; J8_TEST_CASES[i]; ++i) {
34 const char* s = J8_TEST_CASES[i];
35 BigStr* s2 = StrFromC(s);
36
37 buf = Alloc<mylib::BufWriter>();
38 pyj8::WriteString(s2, LOSSY_JSON, buf);
39
40 BigStr* result = buf->getvalue();
41 log("result = %s", result->data_);
42
43 buf = Alloc<mylib::BufWriter>();
44 pyj8::WriteString(s2, 0, buf);
45
46 result = buf->getvalue();
47 log("result = %s", result->data_);
48 }
49
50 PASS();
51}
52
53TEST compare_c_test() {
54 // Compare two implementations
55
56 auto buf = Alloc<mylib::BufWriter>();
57
58 for (int i = 0; J8_TEST_CASES[i]; ++i) {
59 const char* s = J8_TEST_CASES[i];
60 int input_len = strlen(s);
61 j8_buf_t in = {(unsigned char*)s, input_len};
62
63 j8_buf_t c_result = {0};
64 J8EncodeString(in, &c_result, 0);
65
66 printf("c_result %s\n", c_result.data);
67 printf("c_result.len %d\n", c_result.len);
68
69 BigStr* s2 = StrFromC(s);
70
71 buf = Alloc<mylib::BufWriter>();
72 pyj8::WriteString(s2, LOSSY_JSON, buf);
73
74 BigStr* cpp_result = buf->getvalue();
75
76 // Equal lengths
77 ASSERT_EQ_FMT(c_result.len, len(cpp_result), "%d");
78 // Equal contents
79 ASSERT(memcmp(c_result.data, cpp_result->data_, c_result.len) == 0);
80
81 free(c_result.data);
82
83 //
84 // Encode again with J8 fallback
85 //
86
87 c_result = {0};
88 J8EncodeString(in, &c_result, 1);
89
90 printf("c_result %s\n", c_result.data);
91 printf("c_result.len %d\n", c_result.len);
92
93 buf = Alloc<mylib::BufWriter>();
94 pyj8::WriteString(s2, 0, buf);
95
96 cpp_result = buf->getvalue();
97
98 // Equal lengths
99 ASSERT_EQ_FMT(c_result.len, len(cpp_result), "%d");
100 // Equal contents
101 ASSERT(memcmp(c_result.data, cpp_result->data_, c_result.len) == 0);
102
103 free(c_result.data);
104
105 printf("\n");
106 }
107
108 PASS();
109}
110
111using value_asdl::value;
112using value_asdl::value_t;
113
114TEST heap_id_test() {
115 value_t* val1 = Alloc<value::Str>(kEmptyString);
116 value_t* val2 = Alloc<value::Str>(kEmptyString);
117
118 int id1 = j8::HeapValueId(val1);
119 int id2 = j8::HeapValueId(val2);
120
121 log("id1 = %d, id2 = %d", id1, id2);
122 ASSERT(id1 != id2);
123
124 PASS();
125}
126
127GREATEST_MAIN_DEFS();
128
129int main(int argc, char** argv) {
130 gHeap.Init();
131
132 GREATEST_MAIN_BEGIN();
133
134 RUN_TEST(PartIsUtf8_test);
135 RUN_TEST(WriteString_test);
136 RUN_TEST(compare_c_test);
137 RUN_TEST(heap_id_test);
138
139 gHeap.CleanProcessExit();
140
141 GREATEST_MAIN_END();
142 return 0;
143}