diff -r ff576305ae6e -r 713ec3da79ec src/server/test/object.c --- a/src/server/test/object.c Wed Nov 16 12:14:45 2022 +0100 +++ b/src/server/test/object.c Sun Nov 20 11:39:46 2022 +0100 @@ -351,6 +351,7 @@ NSAPIExpression *expr = expr_parse_logical_expr(pool, tokens, &pos); UCX_TEST_ASSERT(pos == 9, "wrong token pos"); + UCX_TEST_ASSERT(expr, "expression is null"); UCX_TEST_ASSERT(expr->operator == NSAPI_EXPRESSION_EQ, "root: wrong operator"); UCX_TEST_ASSERT(expr->left, "missing left expression"); UCX_TEST_ASSERT(expr->right, "missing right expression"); @@ -366,3 +367,243 @@ pool_destroy(pool); } + +UCX_TEST(test_expr_parse_expr_func_arg0) { + pool_handle_t *pool = pool_create(); + + CxList *tokens = cxLinkedListCreate(pool_allocator(pool), cx_cmp_ptr, sizeof(cxstring)); + cxstring token = cx_str("test"); + cxListAdd(tokens, &token); + token = cx_str("("); + cxListAdd(tokens, &token); + token = cx_str(")"); + cxListAdd(tokens, &token); + + UCX_TEST_BEGIN; + + size_t pos = 0; + NSAPIExpression *expr = expr_parse_logical_expr(pool, tokens, &pos); + + UCX_TEST_ASSERT(pos == 3, "wrong token pos"); + UCX_TEST_ASSERT(expr, "expression is null"); + UCX_TEST_ASSERT(expr->type == NSAPI_EXPRESSION_IDENTIFIER, "wrong expression type"); + UCX_TEST_ASSERT(expr->operator == NSAPI_EXPRESSION_CALL, "wrong expression operator"); + UCX_TEST_ASSERT(!expr->left, "left is not null"); + UCX_TEST_ASSERT(!expr->right, "right is not null"); + + UCX_TEST_END; + + pool_destroy(pool); +} + + +int test_get_args(NSAPIExpression *arglist, size_t maxArgs, size_t *numArgs, NSAPIExpression *arg) { + if(!arg) { + return 0; + } + if(arg->operator == NSAPI_EXPRESSION_ARG) { + if(arg->left) { + if(test_get_args(arglist, maxArgs, numArgs, arg->left)) { + return 1; + } + } + if(arg->right) { + if(test_get_args(arglist, maxArgs, numArgs, arg->right)) { + return 1; + } + } + } else { + if(*numArgs >= maxArgs) { + return 1; + } + arglist[*numArgs] = *arg; + (*numArgs)++; + } + + return 0; +} + + +UCX_TEST(test_expr_parse_expr_func_arg1) { + pool_handle_t *pool = pool_create(); + + CxList *tokens = cxLinkedListCreate(pool_allocator(pool), cx_cmp_ptr, sizeof(cxstring)); + cxstring token = cx_str("test"); + cxListAdd(tokens, &token); + token = cx_str("("); + cxListAdd(tokens, &token); + token = cx_str("1"); + cxListAdd(tokens, &token); + token = cx_str(")"); + cxListAdd(tokens, &token); + + UCX_TEST_BEGIN; + + size_t pos = 0; + NSAPIExpression *expr = expr_parse_logical_expr(pool, tokens, &pos); + + UCX_TEST_ASSERT(pos == tokens->size, "wrong token pos"); + UCX_TEST_ASSERT(expr, "expression is null"); + UCX_TEST_ASSERT(expr->type == NSAPI_EXPRESSION_IDENTIFIER, "wrong expression type"); + UCX_TEST_ASSERT(expr->operator == NSAPI_EXPRESSION_CALL, "wrong expression operator"); + + size_t numArgs = 0; + NSAPIExpression args[8]; + int err = test_get_args(args, 8, &numArgs, expr->left); + UCX_TEST_ASSERT(err == 0, "too much args"); + UCX_TEST_ASSERT(numArgs == 1, "wrong arg count"); + UCX_TEST_ASSERT(args[0].value.i == 1, "wrong arg value"); + + UCX_TEST_END; + + pool_destroy(pool); +} + +UCX_TEST(test_expr_parse_expr_func_arg3) { + pool_handle_t *pool = pool_create(); + + CxList *tokens = cxLinkedListCreate(pool_allocator(pool), cx_cmp_ptr, sizeof(cxstring)); + cxstring token = cx_str("test"); + cxListAdd(tokens, &token); + token = cx_str("("); + cxListAdd(tokens, &token); + token = cx_str("1"); + cxListAdd(tokens, &token); + token = cx_str(","); + cxListAdd(tokens, &token); + token = cx_str("2"); + cxListAdd(tokens, &token); + token = cx_str(","); + cxListAdd(tokens, &token); + token = cx_str("3"); + cxListAdd(tokens, &token); + token = cx_str(")"); + cxListAdd(tokens, &token); + + UCX_TEST_BEGIN; + + size_t pos = 0; + NSAPIExpression *expr = expr_parse_logical_expr(pool, tokens, &pos); + + UCX_TEST_ASSERT(pos == tokens->size, "wrong token pos"); + UCX_TEST_ASSERT(expr, "expression is null"); + UCX_TEST_ASSERT(expr->type == NSAPI_EXPRESSION_IDENTIFIER, "wrong expression type"); + UCX_TEST_ASSERT(expr->operator == NSAPI_EXPRESSION_CALL, "wrong expression operator"); + + size_t numArgs = 0; + NSAPIExpression args[8]; + int err = test_get_args(args, 8, &numArgs, expr->left); + UCX_TEST_ASSERT(err == 0, "too much args"); + UCX_TEST_ASSERT(numArgs == 3, "wrong arg count"); + UCX_TEST_ASSERT(args[0].value.i == 1, "arg0: wrong value"); + UCX_TEST_ASSERT(args[1].value.i == 2, "arg1: wrong value"); + UCX_TEST_ASSERT(args[2].value.i == 3, "arg2: wrong value"); + + UCX_TEST_END; + + pool_destroy(pool); +} + +UCX_TEST(test_expr_parse_expr_func_expr1) { + pool_handle_t *pool = pool_create(); + + CxList *tokens = cxLinkedListCreate(pool_allocator(pool), cx_cmp_ptr, sizeof(cxstring)); + cxstring token = cx_str("test"); + cxListAdd(tokens, &token); + token = cx_str("("); + cxListAdd(tokens, &token); + token = cx_str("1"); + cxListAdd(tokens, &token); + token = cx_str(","); + cxListAdd(tokens, &token); + token = cx_str("2"); + cxListAdd(tokens, &token); + token = cx_str("+"); + cxListAdd(tokens, &token); + token = cx_str("3"); + cxListAdd(tokens, &token); + token = cx_str(")"); + cxListAdd(tokens, &token); + + UCX_TEST_BEGIN; + + size_t pos = 0; + NSAPIExpression *expr = expr_parse_logical_expr(pool, tokens, &pos); + + UCX_TEST_ASSERT(pos == tokens->size, "wrong token pos"); + UCX_TEST_ASSERT(expr, "expression is null"); + UCX_TEST_ASSERT(expr->type == NSAPI_EXPRESSION_IDENTIFIER, "wrong expression type"); + UCX_TEST_ASSERT(expr->operator == NSAPI_EXPRESSION_CALL, "wrong expression operator"); + + size_t numArgs = 0; + NSAPIExpression args[8]; + int err = test_get_args(args, 8, &numArgs, expr->left); + UCX_TEST_ASSERT(err == 0, "too much args"); + UCX_TEST_ASSERT(numArgs == 2, "wrong arg count"); + UCX_TEST_ASSERT(args[0].value.i == 1, "arg0: wrong value"); + UCX_TEST_ASSERT(args[1].operator == NSAPI_EXPRESSION_ADD, "arg1: wrong operator"); + UCX_TEST_ASSERT(args[1].left && args[1].right, "arg1: missing operator values"); + UCX_TEST_ASSERT(args[1].left->value.i == 2 && args[1].right->value.i == 3, "arg1: wrong operator values"); + + UCX_TEST_END; + + pool_destroy(pool); +} + +UCX_TEST(test_expr_parse_expr_func_expr2) { + pool_handle_t *pool = pool_create(); + + CxList *tokens = cxLinkedListCreate(pool_allocator(pool), cx_cmp_ptr, sizeof(cxstring)); + cxstring token = cx_str("test"); + cxListAdd(tokens, &token); + token = cx_str("("); + cxListAdd(tokens, &token); + token = cx_str("2"); + cxListAdd(tokens, &token); + token = cx_str("+"); + cxListAdd(tokens, &token); + token = cx_str("3"); + cxListAdd(tokens, &token); + token = cx_str(","); + cxListAdd(tokens, &token); + token = cx_str("sub"); + cxListAdd(tokens, &token); + token = cx_str("("); + cxListAdd(tokens, &token); + token = cx_str("4"); + cxListAdd(tokens, &token); + token = cx_str(")"); + cxListAdd(tokens, &token); + token = cx_str(","); + cxListAdd(tokens, &token); + token = cx_str("6"); + cxListAdd(tokens, &token); + token = cx_str(")"); + cxListAdd(tokens, &token); + + UCX_TEST_BEGIN; + + size_t pos = 0; + NSAPIExpression *expr = expr_parse_logical_expr(pool, tokens, &pos); + + UCX_TEST_ASSERT(pos == tokens->size, "wrong token pos"); + UCX_TEST_ASSERT(expr, "expression is null"); + UCX_TEST_ASSERT(expr->type == NSAPI_EXPRESSION_IDENTIFIER, "wrong expression type"); + UCX_TEST_ASSERT(expr->operator == NSAPI_EXPRESSION_CALL, "wrong expression operator"); + + size_t numArgs = 0; + NSAPIExpression args[8]; + int err = test_get_args(args, 8, &numArgs, expr->left); + UCX_TEST_ASSERT(err == 0, "too much args"); + UCX_TEST_ASSERT(numArgs == 3, "wrong arg count"); + UCX_TEST_ASSERT(args[0].operator == NSAPI_EXPRESSION_ADD, "arg0: wrong operator"); + UCX_TEST_ASSERT(args[0].left && args[0].right, "arg0: missing operator values"); + UCX_TEST_ASSERT(args[1].operator == NSAPI_EXPRESSION_CALL, "arg1: wrong operator"); + UCX_TEST_ASSERT(args[1].left, "arg1: missing args"); + UCX_TEST_ASSERT(args[2].type == NSAPI_EXPRESSION_INT, "arg2: wrong type"); + UCX_TEST_ASSERT(args[2].value.i == 6, "arg2: wrong value"); + + UCX_TEST_END; + + pool_destroy(pool); +}