1 | #include "_gen/frontend/arg_types.h"
|
2 | #include "_gen/core/value.asdl.h"
|
3 | #include "vendor/greatest.h"
|
4 |
|
5 | using value_asdl::value;
|
6 |
|
7 | TEST opaque_test() {
|
8 | // struct for command -v is HeapTag::Opaque
|
9 |
|
10 | auto attrs = Alloc<Dict<BigStr*, value_asdl::value_t*>>();
|
11 | StackRoots _r({&attrs});
|
12 |
|
13 | auto t = Alloc<value::Bool>(true);
|
14 | auto f = Alloc<value::Bool>(false);
|
15 | attrs->set(StrFromC("v"), t);
|
16 | attrs->set(StrFromC("V"), f);
|
17 | attrs->set(StrFromC("p"), f);
|
18 |
|
19 | for (int i = 0; i < 10; ++i) {
|
20 | auto m = Alloc<arg_types::command>(attrs);
|
21 | StackRoots _r2({&m});
|
22 |
|
23 | mylib::MaybeCollect();
|
24 |
|
25 | ASSERT_EQ(true, m->v);
|
26 | ASSERT_EQ(false, m->V);
|
27 | ASSERT_EQ(false, m->p);
|
28 | }
|
29 |
|
30 | PASS();
|
31 | }
|
32 |
|
33 | TEST pointer_test() {
|
34 | // struct for printf -v is has BigStr*
|
35 |
|
36 | auto attrs = Alloc<Dict<BigStr*, value_asdl::value_t*>>();
|
37 | StackRoots _r({&attrs});
|
38 |
|
39 | auto s = Alloc<value::Str>(StrFromC("hi %s"));
|
40 | attrs->set(StrFromC("v"), s);
|
41 |
|
42 | for (int i = 0; i < 10; ++i) {
|
43 | auto m = Alloc<arg_types::printf>(attrs);
|
44 | StackRoots _r2({&m});
|
45 |
|
46 | mylib::MaybeCollect();
|
47 |
|
48 | ASSERT(str_equals(StrFromC("hi %s"), m->v));
|
49 | }
|
50 |
|
51 | PASS();
|
52 | }
|
53 |
|
54 | GREATEST_MAIN_DEFS();
|
55 |
|
56 | int main(int argc, char** argv) {
|
57 | gHeap.Init();
|
58 |
|
59 | GREATEST_MAIN_BEGIN();
|
60 |
|
61 | RUN_TEST(opaque_test);
|
62 | RUN_TEST(pointer_test);
|
63 |
|
64 | gHeap.CleanProcessExit();
|
65 |
|
66 | GREATEST_MAIN_END();
|
67 | return 0;
|
68 | }
|