#include
#include "html_parser_assert.h"
#include "html_parser_mem.h"
#include "html_parser_atom.h"
#include "html_parser_fmt.h"
#include "html_parser_document_node.h"
#include "html_parser_document_stack.h"
#include "html_parser_tag_lookup.h"
#include "html_parser_tester.h"
#define T Test_T
#define NODE_SIZE 4
/* test data */
Lookup_T tbl;
/* static function prototypes */
static Node_T *init_nodes(void);
/* test functions */
static int Test_stack_stack(T t, void *, const void *);
static int Test_stack_empty(T t, void *, const void *);
static int Test_stack_push(T t, void *, const void *);
static int Test_stack_peek(T t, void *, const void *);
// static int Test_stack_find(T t, void *, const void *);
static int Test_stack_pop(T t, void *, const void *);
static int Test_stack_free(T t, void *, const void *);
int main(int argc, const char *argv[])
{
T suite;
Stack_T s;
Node_T *nodes;
const char *st = Atom_str("p");
Fmt_fprint(stderr, "==> Starting %s <==\n", __FILE__);
tbl = Tag_lookup_init();
nodes = init_nodes();
suite = Test_init();
Test_add(suite, Test_stack_stack, (void *) &s, NULL);
Test_add(suite, Test_stack_empty, PREV_INPUT(suite), NULL);
Test_add(suite, Test_stack_push, PREV_INPUT(suite),
(const void *) nodes);
Test_add(suite, Test_stack_peek, PREV_INPUT(suite),
(const void *) nodes);
// Test_add(suite, Test_stack_find, PREV_INPUT(suite),
// (const void *) st);
Test_add(suite, Test_stack_pop, PREV_INPUT(suite),
(const void *) nodes);
Test_add(suite, Test_stack_free, PREV_INPUT(suite), NULL);
Test_all_run(suite);
Test_print_results(suite);
Test_free(&suite);
Tag_lookup_free(&tbl);
return 0;
}
static int Test_stack_stack(T t, void *s, const void *chk)
{
Stack_T *stk = (Stack_T *) s;
*stk = Stack_stack();
assert(*stk);
TEST_FUNC_NAME(t);
return TEST_SUCCESS;
}
static int Test_stack_empty(T t, void *s, const void *chk)
{
Stack_T *stk = (Stack_T *) s;
assert(*stk);
assert(Stack_empty(*stk) == 1);
TEST_FUNC_NAME(t);
return TEST_SUCCESS;
}
static int Test_stack_push(T t, void *s, const void *chk)
{
Stack_T *stk = (Stack_T *) s;
Node_T *n = (Node_T *) chk;
assert(*stk);
assert(n && *n);
for (int i = 0; i < NODE_SIZE; i++) {
Stack_push(*stk, &n[i]);
assert(Stack_empty(*stk) == 0);
}
TEST_FUNC_NAME(t);
return TEST_SUCCESS;
}
static int Test_stack_peek(T t, void *s, const void *chk)
{
Stack_T *stk = (Stack_T *) s;
Node_T *n = (Node_T *) chk;
assert(*stk);
assert(n && *n);
assert(&n[NODE_SIZE -1] == Stack_peek(*stk));
TEST_FUNC_NAME(t);
return TEST_SUCCESS;
}
static int Test_stack_find(T t, void *s, const void *chk)
{
Stack_T *stk = (Stack_T *) s;
const char *st = (const char *) chk, *bt = Atom_str("bogie");
assert(2 == Stack_find(*stk, st));
assert(0 == Stack_find(*stk, bt));
TEST_FUNC_NAME(t);
return TEST_SUCCESS;
}
static int Test_stack_pop(T t, void *s, const void *chk)
{
Stack_T *stk = (Stack_T *) s;
Node_T *tmp, *n = (Node_T *) chk;
assert(*stk);
assert(n && *n);
tmp = Stack_pop(*stk);
assert(tmp == &n[NODE_SIZE -1]);
Node_free(tmp);
tmp = Stack_pop(*stk);
assert(tmp == &n[NODE_SIZE -2]);
Node_free(tmp);
TEST_FUNC_NAME(t);
return TEST_SUCCESS;
}
static int Test_stack_free(T t, void *s, const void *chk)
{
Stack_T *stk = (Stack_T *) s;
assert(*stk);
Stack_free(stk);
assert(*stk == NULL);
TEST_FUNC_NAME(t);
return TEST_SUCCESS;
}
static Node_T *init_nodes(void)
{
Node_T *n = ALLOC(NODE_SIZE * sizeof(*n));
n[0] = Node_new_tag(Tag_lookup_tag(&tbl, "html"), Atom_str("html"), NULL);
n[1] = Node_new_tag(Tag_lookup_tag(&tbl, "body"), Atom_str("body"), NULL);
n[2] = Node_new_tag(Tag_lookup_tag(&tbl, "p"), Atom_str("p"), NULL);
n[3] = Node_new_tag(Tag_lookup_tag(&tbl, "em"), Atom_str("em"), NULL);
return n;
}