added tests for ast
This commit is contained in:
parent
86c74f66c2
commit
f32a16ea8e
|
@ -8,3 +8,4 @@ set(CTEST_BINARY_DIRECTORY ${PROJECT_BINARY_DIR}/tests)
|
|||
|
||||
add_subdirectory(logging)
|
||||
add_subdirectory(input_file)
|
||||
add_subdirectory(ast)
|
|
@ -0,0 +1,35 @@
|
|||
include(CTest)
|
||||
|
||||
include_directories(${PROJECT_SOURCE_DIR}/src)
|
||||
|
||||
# ------------------------------------------------------- #
|
||||
# CTEST 1
|
||||
# test building the syntax tree
|
||||
|
||||
add_executable(ast_build_tree
|
||||
${PROJECT_SOURCE_DIR}/src/ast/ast.c
|
||||
${PROJECT_SOURCE_DIR}/src/sys/log.c
|
||||
build_tree.c)
|
||||
set_target_properties(ast_build_tree
|
||||
PROPERTIES
|
||||
OUTPUT_NAME "build_tree"
|
||||
RUNTIME_OUTPUT_DIRECTORY ${GEMSTONE_BINARY_DIR}/tests/ast)
|
||||
add_test(NAME ast_build_tree
|
||||
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
||||
COMMAND python ${GEMSTONE_TEST_DIR}/ast/test_ast.py check_build_tree)
|
||||
|
||||
# ------------------------------------------------------- #
|
||||
# CTEST 2
|
||||
# test node to string output
|
||||
|
||||
add_executable(ast_print_node
|
||||
${PROJECT_SOURCE_DIR}/src/ast/ast.c
|
||||
print_node.c)
|
||||
set_target_properties(ast_build_tree
|
||||
PROPERTIES
|
||||
OUTPUT_NAME "build_tree"
|
||||
RUNTIME_OUTPUT_DIRECTORY ${GEMSTONE_BINARY_DIR}/tests/ast)
|
||||
add_test(NAME ast_print_node
|
||||
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
||||
COMMAND python ${GEMSTONE_TEST_DIR}/ast/test_ast.py check_print_node)
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
//
|
||||
// Created by servostar on 5/7/24.
|
||||
//
|
||||
|
||||
#include <ast/ast.h>
|
||||
#include <sys/log.h>
|
||||
|
||||
void generate_statement(const AST_NODE_PTR stmt) {
|
||||
const AST_NODE_PTR add = AST_new_node(AST_Add, NULL);
|
||||
|
||||
AST_push_node(add, AST_new_node(AST_Int, "3"));
|
||||
AST_push_node(add, AST_new_node(AST_Int, "6"));
|
||||
|
||||
AST_push_node(stmt, add);
|
||||
}
|
||||
|
||||
void generate_branch(const AST_NODE_PTR stmt) {
|
||||
const AST_NODE_PTR branch = AST_new_node(AST_If, NULL);
|
||||
const AST_NODE_PTR gt = AST_new_node(AST_Greater, NULL);
|
||||
|
||||
AST_push_node(branch, gt);
|
||||
|
||||
AST_push_node(gt, AST_new_node(AST_Float, "2.3"));
|
||||
AST_push_node(gt, AST_new_node(AST_Float, "0.79"));
|
||||
|
||||
AST_push_node(stmt, branch);
|
||||
|
||||
generate_statement(branch);
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
|
||||
const AST_NODE_PTR root = AST_new_node(AST_Stmt, NULL);
|
||||
|
||||
generate_branch(root);
|
||||
|
||||
AST_delete_node(root);
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
//
|
||||
// Created by servostar on 5/7/24.
|
||||
//
|
||||
|
||||
#include <ast/ast.h>
|
||||
#include <sys/log.h>
|
||||
|
||||
int main(void) {
|
||||
|
||||
struct AST_Node_t* node = AST_new_node(AST_If, NULL);
|
||||
|
||||
struct AST_Node_t* child = AST_new_node(AST_Add, NULL);
|
||||
AST_push_node(child, AST_new_node(AST_Int, "43"));
|
||||
AST_push_node(child, AST_new_node(AST_Int, "9"));
|
||||
|
||||
AST_push_node(node, child);
|
||||
AST_push_node(node, AST_new_node(AST_Expr, NULL));
|
||||
AST_push_node(node, AST_new_node(AST_Expr, NULL));
|
||||
|
||||
FILE* out = fopen("ast.gv", "w+");
|
||||
// convert this file ^^^^^^
|
||||
// to an svg with: `dot -Tsvg ast.gv > graph.svg`
|
||||
|
||||
AST_fprint_graphviz(out, node);
|
||||
|
||||
AST_delete_node(node);
|
||||
|
||||
fflush(out);
|
||||
fclose(out);
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
//
|
||||
// Created by servostar on 5/7/24.
|
||||
//
|
||||
|
||||
#include <ast/ast.h>
|
||||
|
||||
int main(void) {
|
||||
|
||||
const AST_NODE_PTR node = AST_new_node(0, "value");
|
||||
|
||||
for (size_t i = 0; i < AST_ELEMENT_COUNT; i++) {
|
||||
// set kind
|
||||
node->kind = i;
|
||||
// print symbol
|
||||
printf("%ld %s\n", i, AST_node_to_string(node));
|
||||
}
|
||||
|
||||
AST_delete_node(node);
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
import subprocess
|
||||
import sys
|
||||
import logging
|
||||
from logging import info, error
|
||||
import os
|
||||
|
||||
BIN_DIR = "bin/tests/ast/"
|
||||
|
||||
|
||||
def run_check_build_tree():
|
||||
info("started check tree build...")
|
||||
|
||||
p = subprocess.run(BIN_DIR + "build_tree", capture_output=True, text=True)
|
||||
|
||||
info("checking exit code...")
|
||||
|
||||
# check exit code
|
||||
assert p.returncode == 0
|
||||
|
||||
|
||||
def run_check_print_node():
|
||||
info("started check node print...")
|
||||
|
||||
p = subprocess.run(BIN_DIR + "print_node", capture_output=True, text=True)
|
||||
|
||||
info("checking exit code...")
|
||||
|
||||
# check exit code
|
||||
assert p.returncode == 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
|
||||
target = sys.argv[1]
|
||||
|
||||
info(f"starting ast test suite with target: {target}")
|
||||
|
||||
match target:
|
||||
case "check_build_tree":
|
||||
run_check_build_tree()
|
||||
case "check_print_node":
|
||||
run_check_print_node()
|
||||
case _:
|
||||
error(f"unknown target: {target}")
|
||||
exit(1)
|
Loading…
Reference in New Issue