|
|
@ -48,7 +48,8 @@ void init_node_freelist(GUI_Node *nodes, int node_count) |
|
|
|
RDIC_Context context = {0};\ |
|
|
|
GUI_Node freelist_nodes[FREELIST_LENGTH] = {0};\ |
|
|
|
init_node_freelist(freelist_nodes, ARRAYLENGTH(freelist_nodes));\ |
|
|
|
context.node_freelist = &freelist_nodes[0].rn;\ |
|
|
|
RDIC_Freelist freelist = {&freelist_nodes[0].rn};\ |
|
|
|
context.freelist = &freelist;\ |
|
|
|
RDIC_Node_Reference root = {0}; |
|
|
|
|
|
|
|
|
|
|
@ -74,7 +75,7 @@ RDIC_Node_Reference test_get_node( |
|
|
|
// NOTE(Zelaven): Helpers can be buggy too and could in principle have tests.
|
|
|
|
int freelist_contains(RDIC_Context *context, RDIC_Node *node) |
|
|
|
{ |
|
|
|
RDIC_Node *current = context->node_freelist; |
|
|
|
RDIC_Node *current = context->freelist->head; |
|
|
|
int result = 0; |
|
|
|
while(!result && current != NULL) |
|
|
|
{ |
|
|
@ -211,7 +212,8 @@ void test__start_frame__succeed(void) |
|
|
|
RDIC_Context context = {0}; |
|
|
|
GUI_Node freelist_nodes[1] = {0}; |
|
|
|
init_node_freelist(freelist_nodes, ARRAYLENGTH(freelist_nodes)); |
|
|
|
context.node_freelist = &freelist_nodes[0].rn; |
|
|
|
RDIC_Freelist freelist = {&freelist_nodes[0].rn}; |
|
|
|
context.freelist = &freelist; |
|
|
|
RDIC_Node_Reference root = {0}; |
|
|
|
|
|
|
|
// Act.
|
|
|
@ -229,7 +231,8 @@ void test__finish_frame__succeed(void) |
|
|
|
RDIC_Context context = {0}; |
|
|
|
GUI_Node freelist_nodes[1] = {0}; |
|
|
|
init_node_freelist(freelist_nodes, ARRAYLENGTH(freelist_nodes)); |
|
|
|
context.node_freelist = &freelist_nodes[0].rn; |
|
|
|
RDIC_Freelist freelist = {&freelist_nodes[0].rn}; |
|
|
|
context.freelist = &freelist; |
|
|
|
RDIC_Node_Reference root = {0}; |
|
|
|
root = rdic_context_start_frame( |
|
|
|
&context, |
|
|
@ -253,20 +256,21 @@ void test__get_node_with_empty_freelist__return_null_reference(void) |
|
|
|
RDIC_Context context = {0}; |
|
|
|
GUI_Node freelist_nodes[1] = {0}; |
|
|
|
init_node_freelist(freelist_nodes, ARRAYLENGTH(freelist_nodes)); |
|
|
|
context.node_freelist = &freelist_nodes[0].rn; |
|
|
|
RDIC_Freelist freelist = {&freelist_nodes[0].rn}; |
|
|
|
context.freelist = &freelist; |
|
|
|
RDIC_Node_Reference root = {0}; |
|
|
|
root = rdic_context_start_frame( |
|
|
|
&context, |
|
|
|
root); |
|
|
|
|
|
|
|
assert(context.node_freelist == NULL); |
|
|
|
|
|
|
|
// Act.
|
|
|
|
RDIC_Node_Reference node = {0}; // Invalid reference -> new node.
|
|
|
|
node = GET_NODE(&context, node); |
|
|
|
|
|
|
|
// Assert.
|
|
|
|
// NOTE(Zelaven): We specifically assert that the reference is all 0.
|
|
|
|
if(context.freelist->head != NULL) |
|
|
|
{TEST_ERROR("Freelist not empty.");} |
|
|
|
if(node.node != NULL) |
|
|
|
{TEST_ERROR("Non-NULL node despite empty freelist.");} |
|
|
|
if(node.generation != 0) |
|
|
@ -279,7 +283,8 @@ void test__get_node_with_empty_freelist_with_nonzero_generation__return_null_ref |
|
|
|
RDIC_Context context = {0}; |
|
|
|
GUI_Node freelist_nodes[1] = {0}; |
|
|
|
init_node_freelist(freelist_nodes, ARRAYLENGTH(freelist_nodes)); |
|
|
|
context.node_freelist = &freelist_nodes[0].rn; |
|
|
|
RDIC_Freelist freelist = {&freelist_nodes[0].rn}; |
|
|
|
context.freelist = &freelist; |
|
|
|
RDIC_Node_Reference root = {0}; |
|
|
|
root = rdic_context_start_frame( |
|
|
|
&context, |
|
|
@ -304,7 +309,8 @@ void test__get_node__succeed(void) |
|
|
|
RDIC_Context context = {0}; |
|
|
|
GUI_Node freelist_nodes[2] = {0}; |
|
|
|
init_node_freelist(freelist_nodes, ARRAYLENGTH(freelist_nodes)); |
|
|
|
context.node_freelist = &freelist_nodes[0].rn; |
|
|
|
RDIC_Freelist freelist = {&freelist_nodes[0].rn}; |
|
|
|
context.freelist = &freelist; |
|
|
|
RDIC_Node_Reference root = {0}; |
|
|
|
root = rdic_context_start_frame( |
|
|
|
&context, |
|
|
@ -329,7 +335,8 @@ void test__get_node_finish_frame__succeed(void) |
|
|
|
RDIC_Context context = {0}; |
|
|
|
GUI_Node freelist_nodes[2] = {0}; |
|
|
|
init_node_freelist(freelist_nodes, ARRAYLENGTH(freelist_nodes)); |
|
|
|
context.node_freelist = &freelist_nodes[0].rn; |
|
|
|
RDIC_Freelist freelist = {&freelist_nodes[0].rn}; |
|
|
|
context.freelist = &freelist; |
|
|
|
RDIC_Node_Reference root = {0}; |
|
|
|
root = rdic_context_start_frame( |
|
|
|
&context, |
|
|
@ -381,7 +388,7 @@ void test__single_node__returned_to_freelist(void) |
|
|
|
if(node.node->generation != 1) |
|
|
|
{TEST_ERROR("Node submitted to freelist increased generation more than once?");} |
|
|
|
ASSERT_REFERENCE_INVALID(node, "(Skipped in second frame)"); |
|
|
|
if(context.node_freelist != node.node) |
|
|
|
if(context.freelist->head != node.node) |
|
|
|
{TEST_ERROR("Node not prepended to freelist.");} |
|
|
|
|
|
|
|
|
|
|
@ -398,7 +405,8 @@ void test__single_node__nodes_are_stable(void) |
|
|
|
RDIC_Context context = {0}; |
|
|
|
GUI_Node freelist_nodes[2] = {0}; |
|
|
|
init_node_freelist(freelist_nodes, ARRAYLENGTH(freelist_nodes)); |
|
|
|
context.node_freelist = &freelist_nodes[0].rn; |
|
|
|
RDIC_Freelist freelist = {&freelist_nodes[0].rn}; |
|
|
|
context.freelist = &freelist; |
|
|
|
RDIC_Node_Reference root = {0}; |
|
|
|
RDIC_Node_Reference node = {0}; |
|
|
|
|
|
|
@ -456,7 +464,7 @@ void test__single_node_freelist_reuse__succeed(void) |
|
|
|
if(node.generation != 1) |
|
|
|
{TEST_ERROR("`node` generation is not 1.");} |
|
|
|
ASSERT_REFERENCE_VALID(node); |
|
|
|
if(context.node_freelist != NULL) |
|
|
|
if(context.freelist->head != NULL) |
|
|
|
{TEST_ERROR("Freelist should be empty.");} |
|
|
|
} |
|
|
|
|
|
|
@ -470,7 +478,8 @@ void test__parent_child_frame__succeed(void) |
|
|
|
RDIC_Context context = {0}; |
|
|
|
GUI_Node freelist_nodes[3] = {0}; |
|
|
|
init_node_freelist(freelist_nodes, ARRAYLENGTH(freelist_nodes)); |
|
|
|
context.node_freelist = &freelist_nodes[0].rn; |
|
|
|
RDIC_Freelist freelist = {&freelist_nodes[0].rn}; |
|
|
|
context.freelist = &freelist; |
|
|
|
RDIC_Node_Reference root = {0}; |
|
|
|
RDIC_Node_Reference parent_node = {0}; |
|
|
|
RDIC_Node_Reference child_node = {0}; |
|
|
@ -499,7 +508,8 @@ void test__parent_child_free_child__child_to_freelist(void) |
|
|
|
RDIC_Context context = {0}; |
|
|
|
GUI_Node freelist_nodes[3] = {0}; |
|
|
|
init_node_freelist(freelist_nodes, ARRAYLENGTH(freelist_nodes)); |
|
|
|
context.node_freelist = &freelist_nodes[0].rn; |
|
|
|
RDIC_Freelist freelist = {&freelist_nodes[0].rn}; |
|
|
|
context.freelist = &freelist; |
|
|
|
RDIC_Node_Reference root = {0}; |
|
|
|
RDIC_Node_Reference parent_node = {0}; |
|
|
|
RDIC_Node_Reference child_node = {0}; |
|
|
@ -530,7 +540,7 @@ void test__parent_child_free_child__child_to_freelist(void) |
|
|
|
if(child_node.node->generation != 1) |
|
|
|
{TEST_ERROR("Node submitted to freelist retained same generation?");} |
|
|
|
ASSERT_REFERENCE_INVALID(child_node, "(Skipped in second frame)"); |
|
|
|
if(context.node_freelist != child_node.node) |
|
|
|
if(context.freelist->head != child_node.node) |
|
|
|
{TEST_ERROR("Node not prepended to freelist.");} |
|
|
|
} |
|
|
|
|
|
|
@ -540,7 +550,8 @@ void test__parent_child_free_child__parent_to_freelist(void) |
|
|
|
RDIC_Context context = {0}; |
|
|
|
GUI_Node freelist_nodes[3] = {0}; |
|
|
|
init_node_freelist(freelist_nodes, ARRAYLENGTH(freelist_nodes)); |
|
|
|
context.node_freelist = &freelist_nodes[0].rn; |
|
|
|
RDIC_Freelist freelist = {&freelist_nodes[0].rn}; |
|
|
|
context.freelist = &freelist; |
|
|
|
RDIC_Node_Reference root = {0}; |
|
|
|
RDIC_Node_Reference parent = {0}; |
|
|
|
RDIC_Node_Reference child = {0}; |
|
|
@ -642,7 +653,8 @@ void test__parent_child_both_reused__succeed(void) |
|
|
|
RDIC_Context context = {0};\ |
|
|
|
GUI_Node freelist_nodes[5] = {0};\ |
|
|
|
init_node_freelist(freelist_nodes, ARRAYLENGTH(freelist_nodes));\ |
|
|
|
context.node_freelist = &freelist_nodes[0].rn;\ |
|
|
|
RDIC_Freelist freelist = {&freelist_nodes[0].rn};\ |
|
|
|
context.freelist = &freelist;\ |
|
|
|
RDIC_Node_Reference root = {0};\ |
|
|
|
RDIC_Node_Reference parent = {0};\ |
|
|
|
RDIC_Node_Reference child1 = {0};\ |
|
|
@ -816,7 +828,8 @@ void test__exhaust_freelist_larger_tree__no_crash(void) |
|
|
|
RDIC_Context context = {0}; |
|
|
|
GUI_Node freelist_nodes[3] = {0}; |
|
|
|
init_node_freelist(freelist_nodes, ARRAYLENGTH(freelist_nodes)); |
|
|
|
context.node_freelist = &freelist_nodes[0].rn; |
|
|
|
RDIC_Freelist freelist = {&freelist_nodes[0].rn}; |
|
|
|
context.freelist = &freelist; |
|
|
|
RDIC_Node_Reference root = {0}; |
|
|
|
RDIC_Node_Reference n1 = {0}; |
|
|
|
RDIC_Node_Reference n1_1 = {0}; |
|
|
@ -879,7 +892,8 @@ void test__large_tree_constructed__succeed(void) |
|
|
|
RDIC_Context context = {0}; |
|
|
|
GUI_Node freelist_nodes[14] = {0}; |
|
|
|
init_node_freelist(freelist_nodes, ARRAYLENGTH(freelist_nodes)); |
|
|
|
context.node_freelist = &freelist_nodes[0].rn; |
|
|
|
RDIC_Freelist freelist = {&freelist_nodes[0].rn}; |
|
|
|
context.freelist = &freelist; |
|
|
|
RDIC_Node_Reference root = {0}; |
|
|
|
RDIC_Node_Reference n1 = {0}; |
|
|
|
RDIC_Node_Reference n1_1 = {0}; |
|
|
@ -954,7 +968,8 @@ void test__culling_that_needs_to_use_stash__succeed(void) |
|
|
|
RDIC_Context context = {0}; |
|
|
|
GUI_Node freelist_nodes[14] = {0}; |
|
|
|
init_node_freelist(freelist_nodes, ARRAYLENGTH(freelist_nodes)); |
|
|
|
context.node_freelist = &freelist_nodes[0].rn; |
|
|
|
RDIC_Freelist freelist = {&freelist_nodes[0].rn}; |
|
|
|
context.freelist = &freelist; |
|
|
|
RDIC_Node_Reference root = {0}; |
|
|
|
RDIC_Node_Reference n1 = {0}; |
|
|
|
RDIC_Node_Reference n1_1 = {0}; |
|
|
|