def test_library_usage(): tempdir = "__tempdir__" mod = "m" mod2 = "m2" create_dir(tempdir) create_file(tempdir + "/" + mod, """ :- module(m, [f/1]). f(a). g. """) create_file(tempdir + "/" + (mod2 + ".pl"), """ :- module(m2, [f/1]). f(a). g. """) try: e = get_engine(":- add_library_dir('%s')." % tempdir) assert len(e.modulewrapper.libs) == 1 assert_true("use_module(library('%s'))." % mod, e) assert_true("f(a).", e) prolog_raises("existence_error(X, Y)", "g", e) e = get_engine(":- add_library_dir('%s')." % tempdir) assert len(e.modulewrapper.libs) == 1 assert_true("use_module(library('%s'))." % mod2, e) assert_true("f(a).", e) prolog_raises("existence_error(X, Y)", "g", e) finally: delete_dir(tempdir)
def test_importlist_intersection(): e = get_engine(""" :- use_module(m, []). """, m=""" :- module(m, [f/1]). f(a). g(a). """) prolog_raises("existence_error(procedure, '/'('f', 1))", "f(a)", e) prolog_raises("existence_error(procedure, '/'('g', 1))", "g(a)", e) e = get_engine(""" :- use_module(m, [g/1]). """, m=""" :- module(m, [f/1]). f(a). g(a). """) prolog_raises("existence_error(procedure, '/'('f', 1))", "f(a)", e) prolog_raises("existence_error(procedure, '/'('g', 1))", "g(a)", e) e = get_engine(""" :- use_module(m, [f/1, g/1]). """, m=""" :- module(m, [f/1]). f(a). g(a). """) assert_true("f(a).", e) prolog_raises("existence_error(procedure, '/'('g', 1))", "g(a)", e)
def test_importlist_intersection(): e = get_engine(""" :- use_module(m, []). """, m = """ :- module(m, [f/1]). f(a). g(a). """) prolog_raises("existence_error(procedure, '/'('f', 1))", "f(a)", e) prolog_raises("existence_error(procedure, '/'('g', 1))", "g(a)", e) e = get_engine(""" :- use_module(m, [g/1]). """, m = """ :- module(m, [f/1]). f(a). g(a). """) prolog_raises("existence_error(procedure, '/'('f', 1))", "f(a)", e) prolog_raises("existence_error(procedure, '/'('g', 1))", "g(a)", e) e = get_engine(""" :- use_module(m, [f/1, g/1]). """, m = """ :- module(m, [f/1]). f(a). g(a). """) assert_true("f(a).", e) prolog_raises("existence_error(procedure, '/'('g', 1))", "g(a)", e)
def test_once_other_module(): e = get_engine("", m=""" :- module(m, []). f(a). """) assert_true("once(m:f(X)), X = a.", e) prolog_raises("existence_error(_, _)", "f(X)", e)
def test_module_exports(): e = get_engine(""" :- module(m, [g/2]). g(a, b). f(c, d, e). """) exports = e.modulewrapper.modules["m"].exports assert len(exports) == 1 and exports[0].eq(Signature("g", 2))
def test_once_other_module(): e = get_engine("", m = """ :- module(m, []). f(a). """) assert_true("once(m:f(X)), X = a.", e) prolog_raises("existence_error(_, _)", "f(X)", e)
def test_term_variables_huge_list(): py.test.skip("") e = get_engine(""" make_triple_list(0, _, []). make_triple_list(X, Y, [Y, Y, Y | T]) :- X > 0, X1 is X - 1, make_triple_list(X1, Y, T). """) assert_true("make_triple_list(4000, a, L), term_variables(L, L1), L1 == [].", e)
def test_term_expand_fail(): # Since self-defined term_expand fails # the system term_expand should be called. e = get_engine(""" term_expand(A, A) :- fail. a --> [b]. """, load_system=True) assert_true("a([b], []).", e)
def test_switch_to_nonexistent_module(): e = get_engine(""" :- module(m). """) prolog_raises("existence_error(X, Y)", "x", e) assert_true("assert(x).", e) assert_true("x.", e) assert_true("module(user).", e) prolog_raises("existence_error(X, Y)", "x", e)
def test_term_variables_huge_list(): py.test.skip("") e = get_engine(""" make_triple_list(0, _, []). make_triple_list(X, Y, [Y, Y, Y | T]) :- X > 0, X1 is X - 1, make_triple_list(X1, Y, T). """) assert_true( "make_triple_list(4000, a, L), term_variables(L, L1), L1 == [].", e)
def test_abolish_from_other_module(): e = get_engine(""" :- use_module(m). """, m = """ :- module(m, []). a. """) assert_true("m:abolish(a/0).", e) prolog_raises("existence_error(_, _)", "m:a", e)
def test_use_module_with_file(): e = get_engine(""" :- use_module(m). """, True, m = """ :- module(m, [f/0]). f. """) assert len(e.modulewrapper.modules) == 2 assert_true("f.", e)
def test_abolish_from_other_module(): e = get_engine(""" :- use_module(m). """, m=""" :- module(m, []). a. """) assert_true("m:abolish(a/0).", e) prolog_raises("existence_error(_, _)", "m:a", e)
def test_overwrite_term_expand(): e = get_engine(""" term_expand(A, A). a --> [b]. """, load_system=True) assert_true("(X --> Y), X == a, Y == [b].", e) assert_true("system:term_expand((a --> [b]), R), assert(R).", e) assert_true("a([b], []).", e) assert_true("term_expand((a --> b), R), assert(R).", e) assert_true("(A --> b), A == a.", e)
def test_catch_error(): e = get_engine(""" :- use_module(m). h :- catch(f, X, g). g. """, m=""" :- module(m, [f/0]). f :- throw(foo). """) assert_true("h.", e)
def test_file_parsing(): e = get_engine(""" :- use_module(m). :- use_module(m). """, create_files=True, m = """ :- module(m, []). :- assert(user:f(a)). """) assert_true("findall(X, f(X), [a]).", e)
def test_use_module_with_file(): e = get_engine(""" :- use_module(m). """, True, m=""" :- module(m, [f/0]). f. """) assert len(e.modulewrapper.modules) == 2 assert_true("f.", e)
def test_retract_rule_from_other_module(): e = get_engine(""" :- use_module(m). """, m=""" :- module(m, []). a. """) assert_false("retract(a).", e) assert_true("m:retract(a).", e) assert_false("m:retract(a).", e)
def test_catch_error(): e = get_engine(""" :- use_module(m). h :- catch(f, X, g). g. """, m = """ :- module(m, [f/0]). f :- throw(foo). """) assert_true("h.", e)
def test_retract_rule_from_other_module(): e = get_engine(""" :- use_module(m). """, m = """ :- module(m, []). a. """) assert_false("retract(a).", e) assert_true("m:retract(a).", e) assert_false("m:retract(a).", e)
def test_file_parsing(): e = get_engine(""" :- use_module(m). :- use_module(m). """, create_files=True, m=""" :- module(m, []). :- assert(user:f(a)). """) assert_true("findall(X, f(X), [a]).", e)
def test_nonexisting_predicates_in_import_list(): e = get_engine(""" :- use_module(m, [z/0, g/1]). """, m=""" :- module(m, [f/1, g/0]). f(a). g. q. """) prolog_raises("existence_error(X, Y)", "z", e) prolog_raises("existence_error(X, Y)", "g(A)", e)
def test_once(): e = get_engine(""" :- use_module(m). x :- f, h. h. """, m = """ :- module(m, [f/0]). f :- once(g). g. """) assert_true("x.", e)
def test_nonexisting_predicates_in_import_list(): e = get_engine(""" :- use_module(m, [z/0, g/1]). """, m = """ :- module(m, [f/1, g/0]). f(a). g. q. """) prolog_raises("existence_error(X, Y)", "z", e) prolog_raises("existence_error(X, Y)", "g(A)", e)
def test_discard_useless_env_suffix(): e = get_engine(""" f(h(A), A, B, C) :- g(B), h(D), h1(D), h(E). """) # classes of variables: # just in head: A (needs index at the end of env) # both: B (needs index at the beginning of env) # singletons head: C (-1) # singletons body: E (-1, XXX currently not optimized) # just in body: D (needs index at end of env, appended after matching head) func = e.modulewrapper.current_module.lookup(Signature.getsignature( "f", 4))
def test_once(): e = get_engine(""" :- use_module(m). x :- f, h. h. """, m=""" :- module(m, [f/0]). f :- once(g). g. """) assert_true("x.", e)
def test_import_list_simple(): e = get_engine(""" :- use_module(m, [f/1, g/0]). h(X) :- f(X), g. """, m = """ :- module(m, [f/1, g/0]). f(a). g. q. """) assert_true("h(a).", e) prolog_raises("existence_error(X, Y)", "q", e)
def test_module_switch_1(): e = get_engine(""" :- use_module(m). :- module(m). """, m=""" :- module(m, [g/0]). g. f. """) assert e.modulewrapper.current_module.name == "m" assert_true("g.", e) assert_true("f.", e)
def test_assert_rule_into_other_module_2(): e = get_engine(""" :- use_module(m). """, m = """ :- module(m, [f/1]). f(Rule) :- assert(Rule). """) assert_true("f(g(a)).", e) prolog_raises("existence_error(_, _)", "g(a)", e) assert_true("m:g(a).", e)
def test_module_switch_1(): e = get_engine(""" :- use_module(m). :- module(m). """, m = """ :- module(m, [g/0]). g. f. """) assert e.modulewrapper.current_module.name == "m" assert_true("g.", e) assert_true("f.", e)
def test_append_nondeterministic(): e = get_engine(""" make_list(A, B) :- make_list(A, [], B). make_list(X, In, Out) :- X > 0, X0 is X - 1, make_list(X0, [X|In], Out). make_list(0, In, In). """, load_system=True) assert_true( "Len = 400, Len0 is Len - 5, make_list(Len, L), append(L1, _, L), length(L1, Len0).", e)
def test_assert_rule_into_other_module_2(): e = get_engine(""" :- use_module(m). """, m=""" :- module(m, [f/1]). f(Rule) :- assert(Rule). """) assert_true("f(g(a)).", e) prolog_raises("existence_error(_, _)", "g(a)", e) assert_true("m:g(a).", e)
def test_retract_other_module(): e = get_engine("", m=""" :- module(m, []). f(a). f(b). """) assert_true("m:f(a), m:f(b).", e) assert_true("retract(m:f(a)).", e) assert_false("retract(m:f(a)).", e) assert_false("m:f(a).", e) assert_true("m:f(b).", e) assert_true("retract(m:f(b)).", e) prolog_raises("existence_error(_, _)", "f(b)", e)
def test_import_list_simple(): e = get_engine(""" :- use_module(m, [f/1, g/0]). h(X) :- f(X), g. """, m=""" :- module(m, [f/1, g/0]). f(a). g. q. """) assert_true("h(a).", e) prolog_raises("existence_error(X, Y)", "q", e)
def test_empty_import_list(): e = get_engine(""" :- use_module(m, []). """, m = """ :- module(m, [f/1, g/0]). f(a). g. q. """) assert len(e.modulewrapper.modules["user"].functions) == 0 prolog_raises("existence_error(X, Y)", "f(a)", e) prolog_raises("existence_error(X, Y)", "g", e) prolog_raises("existence_error(X, Y)", "q", e)
def test_assert_rule_into_other_module(): e = get_engine(""" :- use_module(m). """, m=""" :- module(m, []). """) assert_true("m:assert(a).", e) assert_true("m:a.", e) prolog_raises("existence_error(_, _)", "a", e) assert_true("m:assert(user:b).", e) assert_true("b.", e) prolog_raises("existence_error(_, _)", "m:b", e)
def test_fail_and_retry_in_different_modules(): e = get_engine(""" :- use_module(m1). :- use_module(m2). """, m1=""" :- module(m1, [f/1]). f(a). """, m2=""" :- module(m2, [g/1]). g(a). """) assert_true(";((f(a), fail), g(a)).", e)
def test_set_currently_parsed_module(): e = get_engine(""" f(a). """) m = e.modulewrapper assert m.current_module == m.user_module m.add_module("m1", []) assert "m1" in m.modules mod1 = m.modules["m1"] assert mod1.exports == [] assert mod1.functions == {} atom = term.Callable.build("f") e.add_rule(atom) assert atom.signature() in mod1.functions
def test_empty_import_list(): e = get_engine(""" :- use_module(m, []). """, m=""" :- module(m, [f/1, g/0]). f(a). g. q. """) assert len(e.modulewrapper.modules["user"].functions) == 0 prolog_raises("existence_error(X, Y)", "f(a)", e) prolog_raises("existence_error(X, Y)", "g", e) prolog_raises("existence_error(X, Y)", "q", e)
def test_fail_and_retry_in_different_modules(): e = get_engine(""" :- use_module(m1). :- use_module(m2). """, m1 = """ :- module(m1, [f/1]). f(a). """, m2 = """ :- module(m2, [g/1]). g(a). """) assert_true(";((f(a), fail), g(a)).", e)
def test_assert_rule_into_other_module(): e = get_engine(""" :- use_module(m). """, m = """ :- module(m, []). """) assert_true("m:assert(a).", e) assert_true("m:a.", e) prolog_raises("existence_error(_, _)", "a", e) assert_true("m:assert(user:b).", e) assert_true("b.", e) prolog_raises("existence_error(_, _)", "m:b", e)
def test_source_range(): e = get_engine(""" f(a) :- a. f(b) :- b. a. b. """) func = e.modulewrapper.current_module.lookup(Signature.getsignature("f", 1)) assert func.rulechain.line_range == [1, 2] assert func.rulechain.next.line_range == [2, 4] assert func.rulechain.file_name == "<unknown>" assert func.rulechain.source == "f(a) :- a." assert func.rulechain.next.source == "f(b) :-\n b."
def test_retract_other_module(): e = get_engine("", m = """ :- module(m, []). f(a). f(b). """) assert_true("m:f(a), m:f(b).", e) assert_true("retract(m:f(a)).", e) assert_false("retract(m:f(a)).", e) assert_false("m:f(a).", e) assert_true("m:f(b).", e) assert_true("retract(m:f(b)).", e) prolog_raises("existence_error(_, _)", "f(b)", e)
def test_source_range(): e = get_engine(""" f(a) :- a. f(b) :- b. a. b. """) func = e.modulewrapper.current_module.lookup(Signature.getsignature( "f", 1)) assert func.rulechain.line_range == [1, 2] assert func.rulechain.next.line_range == [2, 4] assert func.rulechain.file_name == "<unknown>" assert func.rulechain.source == "f(a) :- a." assert func.rulechain.next.source == "f(b) :-\n b."
def test_module_prefixing(): e = get_engine(""" a. """, m=""" :- module(m, []). f(a). f(b). """) assert_true("m:f(a), m:f(b).", e) assert_true("m:f(a), a.", e) prolog_raises("existence_error(X, Y)", "m:a", e) assert_true("module(m).", e) prolog_raises("existence_error(X, Y)", "a", e) assert_true("user:a.", e)
def test_recursive_use_module(): # if this test fails, one will recognize it by # waiting very long ... mod = "m" create_file(mod, """ :- module(m, []). :- use_module(m). """) try: e = get_engine(""" :- use_module(m). """) finally: delete_file(mod)
def test_module_uses(): e = get_engine(""" :- use_module(b). """, a=""" :- module(a, [h/1]). h(z). """, b=""" :- module(b, [f/1]). :- use_module(a). f(X) :- h(X). g(a). """) assert len(e.modulewrapper.modules) == 3
def test_abolish_other_module(): e = get_engine("", m=""" :- module(m, []). f(a). f(b). g(c). """) assert_true("m:f(a), m:f(b), m:g(c).", e) assert_true("abolish(m:f/1).", e) prolog_raises("existence_error(_, _)", "m:f(X)", e) assert_true("m:g(c).", e) assert_true("abolish(m:g/1).", e) prolog_raises("existence_error(_, _)", "m:g(c)", e) assert_true("abolish(m:g/1).", e)
def test_modules_integration(): e = get_engine(""" :- use_module(m). f(X) :- g(X). h(b). both(X, Y) :- f(X), h(Y). """, m = """ :- module(m, [g/1]). g(X) :- h(X). h(a). """) assert_true("findall(X, h(X), L), L = [b].", e) assert_true("both(X, Y), X == a, Y == b.", e)
def test_if(): e = get_engine(""" :- use_module(m). f(X) :- (X = b -> g(X) ; h(X)). g(c). """, m = """ :- module(m, [h/1]). h(a). """) assert_true("f(a).", e) assert_false("f(b).", e)
def test_module_prefixing(): e = get_engine(""" a. """, m = """ :- module(m, []). f(a). f(b). """) assert_true("m:f(a), m:f(b).", e) assert_true("m:f(a), a.", e) prolog_raises("existence_error(X, Y)", "m:a", e) assert_true("module(m).", e) prolog_raises("existence_error(X, Y)", "a", e) assert_true("user:a.", e)
def test_abolish_other_module(): e = get_engine("", m = """ :- module(m, []). f(a). f(b). g(c). """) assert_true("m:f(a), m:f(b), m:g(c).", e) assert_true("abolish(m:f/1).", e) prolog_raises("existence_error(_, _)", "m:f(X)", e) assert_true("m:g(c).", e) assert_true("abolish(m:g/1).", e) prolog_raises("existence_error(_, _)", "m:g(c)", e) assert_true("abolish(m:g/1).", e)
def test_module_uses(): e = get_engine(""" :- use_module(b). """, a = """ :- module(a, [h/1]). h(z). """, b = """ :- module(b, [f/1]). :- use_module(a). f(X) :- h(X). g(a). """) assert len(e.modulewrapper.modules) == 3