OILS / asdl / gc_test.cc View on Github | oilshell.org

108 lines, 68 significant
1// asdl/gc_test.cc
2
3#include "_gen/asdl/examples/typed_demo.asdl.h"
4#include "_gen/asdl/hnode.asdl.h"
5#include "mycpp/runtime.h"
6#include "prebuilt/asdl/runtime.mycpp.h"
7#include "vendor/greatest.h"
8
9using hnode_asdl::color_e;
10using hnode_asdl::hnode;
11using hnode_asdl::hnode__Array;
12using hnode_asdl::hnode__Leaf;
13using hnode_asdl::hnode__Record;
14using hnode_asdl::hnode_e;
15using hnode_asdl::hnode_t;
16
17using typed_demo_asdl::bool_expr__Binary;
18using typed_demo_asdl::word;
19
20TEST pretty_print_test() {
21 auto w1 = Alloc<word>(StrFromC("left"));
22 auto w2 = Alloc<word>(StrFromC("right"));
23 auto b = Alloc<bool_expr__Binary>(w1, w2);
24
25#if 0
26 log("sizeof b = %d", sizeof b);
27 log("");
28#endif
29
30 // Note: this segfaults with 1000 iterations, because it hit GC.
31 // TODO: GC_ALWAYS and make it pass.
32 for (int i = 0; i < 2; ++i) {
33 hnode_t* t1 = b->PrettyTree();
34 ASSERT_EQ(hnode_e::Record, t1->tag());
35
36 auto f = mylib::Stdout();
37 auto ast_f = Alloc<format::TextOutput>(f);
38 format::PrintTree(t1, ast_f);
39 log("");
40 }
41
42 PASS();
43}
44
45// TODO:
46// - This test is complex and not very good
47// - Maybe unify this with gen_cpp_test.cc
48// - Port build to Ninja
49// - Make it ASAN-clean
50
51TEST hnode_test() {
52 mylib::Writer* f = nullptr;
53 format::TextOutput* ast_f = nullptr;
54 hnode_t* h = nullptr; // base type
55 hnode__Array* array = nullptr; // base type
56 hnode__Record* rec = nullptr;
57 StackRoots _roots({&f, &ast_f, &h, &array, &rec});
58
59 f = mylib::Stdout();
60 ast_f = Alloc<format::TextOutput>(f);
61 array = hnode::Array::CreateNull(true);
62 ASSERT_EQ_FMT(4, gHeap.Collect(), "%d");
63
64 rec = hnode::Record::CreateNull(true);
65 rec->node_type = StrFromC("dummy_node");
66 ASSERT_EQ_FMT(8, gHeap.Collect(), "%d");
67
68 h = rec; // base type
69 array->children->append(h);
70
71 format::PrintTree(h, ast_f);
72 printf("\n");
73 ASSERT_EQ_FMT(9, gHeap.Collect(), "%d");
74
75 h = Alloc<hnode__Leaf>(StrFromC("zz"), color_e::TypeName);
76 array->children->append(h);
77
78 format::PrintTree(h, ast_f);
79 printf("\n");
80 ASSERT_EQ_FMT(11, gHeap.Collect(), "%d");
81
82 h = array;
83 format::PrintTree(h, ast_f);
84 printf("\n");
85 ASSERT_EQ_FMT(11, gHeap.Collect(), "%d");
86
87 PASS();
88}
89
90GREATEST_MAIN_DEFS();
91
92int main(int argc, char** argv) {
93 gHeap.Init();
94
95 GREATEST_MAIN_BEGIN();
96
97 RUN_TEST(hnode_test);
98 // TODO: fix rooting of mylib.Stdout(). Then collect after every test, so
99 // that the number of live objects is accurate.
100 // gHeap.Collect();
101
102 RUN_TEST(pretty_print_test);
103
104 gHeap.CleanProcessExit();
105
106 GREATEST_MAIN_END();
107 return 0;
108}