void bug_reproducing_list_after_eval() { // There once was a bug where source repro would fail when using a list // in a vectorized function, but only after that piece of code had been // evaluated. This was because vectorize_vv was calling apply() which // was changing the 'statement' property of its inputs. Branch branch; Term* sum = branch.compile("[1 1] + [1 1]"); Term* in0 = sum->input(0); Term* in1 = sum->input(0); test_equals(get_term_source_text(in0), "[1 1]"); test_equals(get_term_source_text(in1), "[1 1]"); test_equals(get_input_source_text(sum, 0), "[1 1] "); test_equals(get_input_source_text(sum, 1), " [1 1]"); test_equals(get_branch_source_text(&branch), "[1 1] + [1 1]"); evaluate_branch(&branch); test_equals(get_term_source_text(in0), "[1 1]"); test_equals(get_term_source_text(in1), "[1 1]"); test_equals(get_input_source_text(sum, 0), "[1 1] "); test_equals(get_input_source_text(sum, 1), " [1 1]"); test_equals(get_branch_source_text(&branch), "[1 1] + [1 1]"); }
void repro_source_after_rename() { Branch branch; // Simple test Term* a = branch.compile("a = 1"); rename(a, "apple"); test_equals(get_term_source_text(a), "apple = 1"); // Rename a function argument Term* b = branch.compile("b = 5"); Term* add = branch.compile("add( b , 10)"); rename(b, "banana"); test_equals(get_term_source_text(add), "add( banana , 10)"); // Rename a function Term* myfunc = import_function(&branch, NULL, "def myfunc(int)"); Term* myfunc_call = branch.compile("myfunc(555)"); rename(myfunc, "my_renamed_func"); test_equals(get_term_source_text(myfunc_call), "my_renamed_func(555)"); }
void death_reproducing_builtin_functions() { // This once threw an exception get_term_source_text(KERNEL->get("assert")); for (int i=0; i < KERNEL->length(); i++) if (is_function(KERNEL->get(i))) get_term_source_text(KERNEL->get(i)); }
void Term__to_source_string(caStack* stack) { Term* t = as_term_ref(circa_input(stack, 0)); if (t == NULL) return circa_output_error(stack, "NULL reference"); set_string(circa_output(stack, 0), get_term_source_text(t)); }
void test_block_as_assertions_list(Block* block, std::string const& contextStr) { if (has_static_errors(block)) { std::cout << "Static error " << contextStr << ":" << std::endl; print_static_errors_formatted(block, std::cout); declare_current_test_failed(); return; } std::stringstream checkInvariantsOutput; if (!block_check_invariants_print_result(block, checkInvariantsOutput)) { std::cout << "Failed invariant " << contextStr << std::endl; std::cout << checkInvariantsOutput.str() << std::endl; declare_current_test_failed(); return; } Stack context; evaluate_block(&context, block); if (context.errorOccurred) { std::cout << "Runtime error " << contextStr << std::endl; print_error_stack(&context, std::cout); declare_current_test_failed(); return; } int boolean_statements_found = 0; for (int i=0; i < block->length(); i++) { Term* term = block->get(i); if (!is_statement(term)) continue; if (!is_bool(term_value(term))) continue; boolean_statements_found++; if (!as_bool(term_value(term))) { std::cout << "Assertion failed " << contextStr << std::endl; std::cout << "failed: " << get_term_source_text(term) << std::endl; declare_current_test_failed(); return; } } if (boolean_statements_found == 0) { std::cout << "No boolean statements found " << contextStr << std::endl; declare_current_test_failed(); return; } }
void test_assert_function(Term* term, int line, const char* file) { if (term == NULL) { std::cout << "NULL term in " << file << ", line " << line << std::endl; declare_current_test_failed(); return; } if (has_static_error(term)) { std::cout << "Compile error on term " << global_id(term) << std::endl; print_static_error(term, std::cout); std::cout << std::endl; std::cout << "Occurred in " << file << ", line " << line << std::endl; declare_current_test_failed(); } if (is_bool(term_value(term)) && !as_bool(term_value(term))) { std::cout << "Assertion failed: " << get_term_source_text(term) << std::endl; std::cout << "Occurred in " << file << ", line " << line << std::endl; declare_current_test_failed(); } }