gardener.test.c (3842B)
1 #include <stdio.h> 2 #include <stdbool.h> 3 #include <assert.h> 4 5 #include "symbol.h" 6 #include "schema.h" 7 #include "gardener.h" 8 9 void 10 test_new_gardener(void) 11 { 12 schema *s = new_schema(intern("test")); 13 gardener *g = new_gardener(s); 14 15 assert(get_error(g) == OK); 16 assert(result(g) == NULL); 17 } 18 19 void 20 test_non_start_at_start(void) 21 { 22 schema *s = new_schema(intern("test")); 23 gardener *g = new_gardener(s); 24 fill(g, intern("c"), intern("v")); 25 assert(get_error(g) == NON_START_OP_ON_EMPTY_STACK); 26 sub(g, intern("c"), intern("v")); 27 assert(get_error(g) == NON_START_OP_ON_EMPTY_STACK); 28 } 29 30 void 31 test_start_after_result_fail(void) 32 { 33 schema *s = new_schema(intern("test")); 34 add_constructor(s, intern("nil")); 35 gardener *g = new_gardener(s); 36 37 start(g, intern("nil")); 38 done(g); 39 assert(get_error(g) == OK); 40 start(g, intern("nil")); 41 assert(get_error(g) == OP_AFTER_RESULT); 42 } 43 44 bool 45 test_empty_constructor_success(void) 46 { 47 symbol c = intern("c"); 48 schema *s = new_schema(intern("test")); 49 add_constructor(s, c); 50 51 gardener *g = new_gardener(s); 52 start(g, c); 53 54 done(g); 55 return get_error(g) == OK; 56 } 57 58 bool 59 test_empty_constructor_empty_tree_fail(void) 60 { 61 symbol c = intern("c"); 62 schema *s = new_schema(intern("test")); 63 add_constructor(s, c); 64 gardener *g = new_gardener(s); 65 66 done(g); 67 return get_error(g) == NON_START_OP_ON_EMPTY_STACK; 68 } 69 70 bool 71 test_double_deep_schema_fail(void) 72 { 73 schema *s = new_schema(intern("test0")); 74 symbol c = intern("c"); 75 add_constructor(s, c); 76 77 schema *t = new_schema(intern("test1")); 78 symbol d = intern("d"); 79 add_constructor(t, d); 80 81 symbol k = intern("k"); 82 assign_subschema(s, c, k, t); 83 84 gardener *g = new_gardener(s); 85 start(g, c); 86 87 done(g); 88 89 return get_error(g) == DONE_ON_INVALID_TREE; 90 } 91 92 bool 93 test_double_deep_schema_success(void) 94 { 95 symbol c = intern("c"); 96 symbol d = intern("d"); 97 symbol k = intern("k"); 98 99 schema *s = new_schema(intern("test0")); 100 add_constructor(s, c); 101 102 schema *t = new_schema(intern("test1")); 103 add_constructor(t, d); 104 105 assign_subschema(s, c, k, t); 106 107 gardener *g = new_gardener(s); 108 start(g, c); 109 sub(g, k, d); 110 111 done(g); 112 113 return get_error(g) == OK; 114 } 115 116 bool 117 test_triple_deep_schema_fail(void) 118 { 119 symbol c = intern("c"); 120 symbol d = intern("d"); 121 symbol k = intern("k"); 122 123 schema *s = new_schema(intern("test0")); 124 add_constructor(s, c); 125 126 schema *t = new_schema(intern("test1")); 127 add_constructor(t, d); 128 129 assign_subschema(s, c, k, t); 130 assign_subschema(t, d, k, LEAF); 131 132 gardener *g = new_gardener(s); 133 start(g, c); 134 sub(g, k, d); 135 136 done(g); 137 138 return get_error(g) == DONE_ON_INVALID_TREE; 139 } 140 141 bool 142 test_triple_deep_schema_success(void) 143 { 144 schema *s = new_schema(intern("test0")); 145 symbol c = intern("c"); 146 add_constructor(s, c); 147 148 schema *t = new_schema(intern("test1")); 149 symbol d = intern("d"); 150 add_constructor(t, d); 151 152 symbol k = intern("k"); 153 assign_subschema(s, c, k, t); 154 assign_subschema(t, d, k, LEAF); 155 156 gardener *g = new_gardener(s); 157 start(g, c); 158 sub(g, k, d); 159 fill(g, k, k); 160 done(g); 161 162 return get_error(g) == OK; 163 } 164 165 bool 166 test_sup_invalid_constructor(void) 167 { 168 return false; 169 } 170 171 bool 172 test_sup_invalid_key(void) 173 { 174 return false; 175 } 176 177 bool 178 test_sup(void) 179 { 180 schema *s = new_schema(intern("test")); 181 add_constructor(s, intern("continue")); 182 add_constructor(s, intern("end")); 183 assign_subschema(s, intern("continue"), intern("next"), s); 184 gardener *g = new_gardener(s); 185 start(g, intern("end")); 186 sup(g, intern("continue"), intern("next")); 187 done(g); 188 189 return get_error(g) == OK && result(g) && get_head(result(g)) == intern("continue"); 190 } 191 192 int 193 main() 194 { 195 test_new_gardener(); 196 assert(test_empty_constructor_success()); 197 assert(test_empty_constructor_empty_tree_fail()); 198 assert(test_double_deep_schema_fail()); 199 assert(test_double_deep_schema_success()); 200 assert(test_triple_deep_schema_fail()); 201 assert(test_triple_deep_schema_success()); 202 assert(test_sup()); 203 return 0; 204 }