go my file uploader
This commit is contained in:
100
tests/phlib-test/t_avltree.c
Normal file
100
tests/phlib-test/t_avltree.c
Normal file
@@ -0,0 +1,100 @@
|
||||
#include "tests.h"
|
||||
|
||||
typedef struct _NODE
|
||||
{
|
||||
PH_AVL_LINKS Links;
|
||||
ULONG Value;
|
||||
} NODE, *PNODE;
|
||||
|
||||
static LONG CompareFunction(
|
||||
_In_ PPH_AVL_LINKS Links1,
|
||||
_In_ PPH_AVL_LINKS Links2
|
||||
)
|
||||
{
|
||||
PNODE node1 = CONTAINING_RECORD(Links1, NODE, Links);
|
||||
PNODE node2 = CONTAINING_RECORD(Links2, NODE, Links);
|
||||
|
||||
return uintcmp(node1->Value, node2->Value);
|
||||
}
|
||||
|
||||
#define BOUND_FUNCTION(DefineName, FunctionName) \
|
||||
static ULONG DefineName( \
|
||||
_In_ PPH_AVL_TREE Tree, \
|
||||
_In_ ULONG Value \
|
||||
) \
|
||||
{ \
|
||||
NODE node; \
|
||||
PPH_AVL_LINKS result; \
|
||||
\
|
||||
node.Value = Value; \
|
||||
result = FunctionName(Tree, &node.Links); \
|
||||
\
|
||||
if (result) \
|
||||
return CONTAINING_RECORD(result, NODE, Links)->Value; \
|
||||
else \
|
||||
return -1; \
|
||||
}
|
||||
|
||||
BOUND_FUNCTION(lbound, PhLowerBoundElementAvlTree);
|
||||
BOUND_FUNCTION(ubound, PhUpperBoundElementAvlTree);
|
||||
BOUND_FUNCTION(ldbound, PhLowerDualBoundElementAvlTree);
|
||||
BOUND_FUNCTION(udbound, PhUpperDualBoundElementAvlTree);
|
||||
|
||||
VOID Test_avltree(
|
||||
VOID
|
||||
)
|
||||
{
|
||||
PH_AVL_TREE tree;
|
||||
NODE nodes[4];
|
||||
|
||||
PhInitializeAvlTree(&tree, CompareFunction);
|
||||
|
||||
nodes[0].Value = 3;
|
||||
PhAddElementAvlTree(&tree, &nodes[0].Links);
|
||||
nodes[1].Value = 1;
|
||||
PhAddElementAvlTree(&tree, &nodes[1].Links);
|
||||
nodes[2].Value = 5;
|
||||
PhAddElementAvlTree(&tree, &nodes[2].Links);
|
||||
nodes[3].Value = 7;
|
||||
PhAddElementAvlTree(&tree, &nodes[3].Links);
|
||||
|
||||
assert(lbound(&tree, 0) == 1);
|
||||
assert(lbound(&tree, 1) == 1);
|
||||
assert(lbound(&tree, 2) == 3);
|
||||
assert(lbound(&tree, 3) == 3);
|
||||
assert(lbound(&tree, 4) == 5);
|
||||
assert(lbound(&tree, 5) == 5);
|
||||
assert(lbound(&tree, 6) == 7);
|
||||
assert(lbound(&tree, 7) == 7);
|
||||
assert(lbound(&tree, 8) == -1);
|
||||
|
||||
assert(ubound(&tree, 0) == 1);
|
||||
assert(ubound(&tree, 1) == 3);
|
||||
assert(ubound(&tree, 2) == 3);
|
||||
assert(ubound(&tree, 3) == 5);
|
||||
assert(ubound(&tree, 4) == 5);
|
||||
assert(ubound(&tree, 5) == 7);
|
||||
assert(ubound(&tree, 6) == 7);
|
||||
assert(ubound(&tree, 7) == -1);
|
||||
assert(ubound(&tree, 8) == -1);
|
||||
|
||||
assert(ldbound(&tree, 0) == -1);
|
||||
assert(ldbound(&tree, 1) == -1);
|
||||
assert(ldbound(&tree, 2) == 1);
|
||||
assert(ldbound(&tree, 3) == 1);
|
||||
assert(ldbound(&tree, 4) == 3);
|
||||
assert(ldbound(&tree, 5) == 3);
|
||||
assert(ldbound(&tree, 6) == 5);
|
||||
assert(ldbound(&tree, 7) == 5);
|
||||
assert(ldbound(&tree, 8) == 7);
|
||||
|
||||
assert(udbound(&tree, 0) == -1);
|
||||
assert(udbound(&tree, 1) == 1);
|
||||
assert(udbound(&tree, 2) == 1);
|
||||
assert(udbound(&tree, 3) == 3);
|
||||
assert(udbound(&tree, 4) == 3);
|
||||
assert(udbound(&tree, 5) == 5);
|
||||
assert(udbound(&tree, 6) == 5);
|
||||
assert(udbound(&tree, 7) == 7);
|
||||
assert(udbound(&tree, 8) == 7);
|
||||
}
|
||||
Reference in New Issue
Block a user