loa

Virtual machine for the Logic of Assumptions
git clone git://juanmeleiro.mat.br/loa
Log | Files | Refs

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 }