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_or_with_cut(): e = get_engine(""" f(X) :- ((X = 1, !); X = 2), X = 2. g(X) :- ((X = 1, !); X = 2), X = 1. """) assert_false("f(X).", e) assert_true("g(X).", e)
def test_statistics_runtime_since_last_call(): e.clocks.startup() # succesive call return total runtime and time since last call vars1 = assert_true("statistics(runtime, _), statistics(runtime, [A,B]).", e) vars2 = assert_true("statistics(runtime, _), statistics(runtime, [A,B]).", e) assert vars2['A'].num != vars2['B'].num assert vars1['A'].num <= vars2['A'].num
def test_library_load_priority(): tempdir = "__tempdir__" mod = "m" create_dir(tempdir) create_file(tempdir + "/" + mod, """ :- module(m, [f/1]). f(a). g. """) create_file(mod, """ :- module(m, [f/1, g]). f(b). 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) finally: delete_dir(tempdir) delete_file(mod)
def test_cut(): e = get_engine(""" f(0). f(X) :- Y is X - 1, !, f(Y). f(X) :- Y is X - 2, !, f(Y). """) assert_true("f(20).", 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_sub_atom_with_non_var_sub(): assert_true( "sub_atom(abcabc, Before, Length, After, a), Before=3, Length=1, After=2." ) assert_false( "sub_atom(abcabc, Before, Length, After, b), Before==3, Length==1, After==2." )
def test_peek_char(): src = "__src__" empty = "__empty__" create_file(src, "aü¼") create_file(empty, "") try: assert_true(""" open('%s', read, S), peek_char(S, C), C = 'a', peek_char(S, D), D = 'a', get_char(S, _), peek_char(S, E), E = 'ü', peek_char(S, F), F = 'ü', get_char(S, _), peek_char(S, G), G = '¼', get_char(S, _), peek_char(S, Z), Z = end_of_file, close(S). """ % src) assert_true(""" open('%s', read, S), peek_char(S, end_of_file), close(S). """ % empty) finally: delete_file(src) delete_file(empty)
def test_cut(): e = get_engine(""" f(0). f(X) :- Y is X - 1, !, f(Y). f(X) :- Y is X - 2, !, f(Y). """) assert_true("f(20).", e)
def test_retract_logical_update_view(): e = get_engine(""" p :- retract(p :- true), fail. p :- true. """) assert_true("p.", e) assert_false("p.", e)
def test_numbervars_simple(): assert_true("numbervars(X, 0, 1).", e) assert_true("numbervars(f(X,Y), 0, 2).", e) assert_true("numbervars(f(X,X), 0, 1).", e) assert_true("numbervars(a, 0, 0).", e) assert_true("numbervars(0, 0, 0).", e) prolog_raises("type_error(_, _)", "numbervars(_, no_number, _)", e)
def test_library_load_priority(): tempdir = "__tempdir__" mod = "m" create_dir(tempdir) create_file(tempdir + "/" + mod, """ :- module(m, [f/1]). f(a). g. """) create_file(mod, """ :- module(m, [f/1, g]). f(b). 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) finally: delete_dir(tempdir) delete_file(mod)
def test_or_with_cut(): e = get_engine(""" f(X) :- ((X = 1, !); X = 2), X = 2. g(X) :- ((X = 1, !); X = 2), X = 1. """) assert_false("f(X).", e) assert_true("g(X).", e)
def test_or_and_call_with_cut(): e = get_engine(""" f :- (!, fail); true. g :- (call(!), fail); true. """) assert_false("f.", e) assert_true("g.", e)
def test_peek_byte(): src = "__src__" empty = "__empty__" create_file(src, "\x94\xef") create_file(empty, "") try: assert_true(""" open('%s', read, S), peek_byte(S, C), C = 148, peek_byte(S, D), D = 148, get_byte(S, _), peek_byte(S, E), E = 239, peek_byte(S, F), F = 239, get_byte(S, _), peek_byte(S, Z), Z = -1, close(S). """ % src) assert_true(""" open('%s', read, S), peek_byte(S, -1), close(S). """ % empty) finally: delete_file(src) delete_file(empty)
def test_peek_char(): src = "__src__" empty = "__empty__" create_file(src, "aü¼") create_file(empty, "") try: assert_true(""" open('%s', read, S), peek_char(S, C), C = 'a', peek_char(S, D), D = 'a', get_char(S, _), peek_char(S, E), E = 'ü', peek_char(S, F), F = 'ü', get_char(S, _), peek_char(S, G), G = '¼', get_char(S, _), peek_char(S, Z), Z = end_of_file, close(S). """ % src) assert_true(""" open('%s', read, S), peek_char(S, end_of_file), close(S). """ % empty) finally: delete_file(src) delete_file(empty)
def test_unify_explicit_alias(): src = "__src__" create_file(src, "") try: assert_true("open('%s', read, S, [alias(s)]), S = s." % src) finally: delete_file(src)
def test_peek_code(): src = "__src__" empty = "__empty__" create_file(src, "¼") create_file(empty, "") try: assert_true(""" open('%s', read, S), peek_code(S, C), C = 194, peek_code(S, D), D = 194, get_code(S, _), peek_code(S, E), E = 188, get_code(S, _), peek_code(S, F), F = -1, close(S). """ % src) assert_true(""" open('%s', read, S), peek_code(S, -1), close(S). """ % empty) finally: delete_file(src) delete_file(empty)
def test_unify_explicit_alias(): src = "__src__" create_file(src, "") try: assert_true("open('%s', read, S, [alias(s)]), S = s." % src) finally: delete_file(src)
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_retract_logical_update_view(): e = get_engine(""" p :- retract(p :- true), fail. p :- true. """) assert_true("p.", e) assert_false("p.", e)
def test_or_and_call_with_cut(): e = get_engine(""" f :- (!, fail); true. g :- (call(!), fail); true. """) assert_false("f.", e) assert_true("g.", e)
def test_peek_code(): src = "__src__" empty = "__empty__" create_file(src, "¼") create_file(empty, "") try: assert_true(""" open('%s', read, S), peek_code(S, C), C = 194, peek_code(S, D), D = 194, get_code(S, _), peek_code(S, E), E = 188, get_code(S, _), peek_code(S, F), F = -1, close(S). """ % src) assert_true(""" open('%s', read, S), peek_code(S, -1), close(S). """ % empty) finally: delete_file(src) delete_file(empty)
def test_peek_byte(): src = "__src__" empty = "__empty__" create_file(src, "\x94\xef") create_file(empty, "") try: assert_true(""" open('%s', read, S), peek_byte(S, C), C = 148, peek_byte(S, D), D = 148, get_byte(S, _), peek_byte(S, E), E = 239, peek_byte(S, F), F = 239, get_byte(S, _), peek_byte(S, Z), Z = -1, close(S). """ % src) assert_true(""" open('%s', read, S), peek_byte(S, -1), close(S). """ % empty) finally: delete_file(src) delete_file(empty)
def test_integration_1(): assert_true( """ trans((a1 --> [b], [c]), R1), assert(R1), a1([b, c], []). """, e)
def test_cut_with_throw(): e = get_engine(""" raise_if_var(X) :- var(X), !, throw(unbound). raise_if_var(X) :- X = a. c(X, Y) :- catch((raise_if_var(X), Y = b), E, Y = a). """) assert_true("c(_, Y), Y == a.", e)
def test_runstring(): e = get_engine("foo(a, c).") e.runstring(""" :- op(450, xfy, foo). a foo b. b foo X :- a foo X. """) assert_true("foo(a, b).", e)
def test_integration_2(): assert_true(""" trans((a2 --> b2, c2, [d]), R1), trans((b2 --> [b]), R2), trans((c2 --> [c]), R3), assert(R1), assert(R2), assert(R3), a2([b, c, d], []). """, e)
def test_atom_concat(): assert_true("atom_concat(ab, cdef, abcdef).") assert_true("atom_concat(ab, cdef, X), X = abcdef.") assert_true("atom_concat(ab, X, abcdef), X = cdef.") assert_true("atom_concat(X, cdef, abcdef), X = ab.") assert_true("atom_concat(1, Y, '1def'), Y = def.") heaps = collect_all(Engine(), "atom_concat(X, Y, abcd), atom(X), atom(Y).") assert len(heaps) == 5
def test_repeat(): assert_true("repeat, true.") e = Engine() assert_false("repeat, !, fail.") # hard to test repeat differently e = get_engine('f :- repeat, !, fail.') assert_false('f.', e) assert_true('f; true.', e)
def test_statistics_walltime_progresses(): # succesive call return total runtime and time since last call e.clocks.startup() v1 = assert_true("statistics(walltime, _), statistics(walltime, [A,B]).", e) time.sleep(2) v2 = assert_true("statistics(walltime, _), statistics(walltime, [C,D]).", e) assert v1['A'] != v1['B'] assert 1000 <= v2['C'].num - v1['A'].num <= 3000
def test_basic_term_variables(): assert_true("term_variables(X, [X]).") assert_false("term_variables(X, []).") assert_true("term_variables(f(X, Y), [X, Y]).") assert_true("term_variables(a, []).") assert_true("term_variables(123, []).") assert_true("term_variables(f(Z, g(X), Y), [Z, X, Y]).") assert_false("term_variables(a, a).")
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_statistics_walltime_since_last_call(): # succesive call return total runtime and time since last call e.clocks.startup() # first call returns total runtime in both list items vars1 = assert_true("statistics(walltime, _), statistics(walltime, [A,B]).", e) vars2 = assert_true("statistics(walltime, _), statistics(walltime, [A,B]).", e) assert vars2['A'].num != vars2['B'].num assert vars1['A'].num <= vars2['A'].num
def test_basic_term_variables(): assert_true("term_variables(X, [X]).") assert_false("term_variables(X, []).") assert_true("term_variables(f(X, Y), [X, Y]).") assert_true("term_variables(a, []).") assert_true("term_variables(123, []).") assert_true("term_variables(f(Z, g(X), Y), [Z, X, Y]).") assert_false("term_variables(a, a).")
def test_runstring(): e = get_engine("foo(a, c).") e.runstring(""" :- op(450, xfy, foo). a foo b. b foo X :- a foo X. """) assert_true("foo(a, b).", e)
def test_cut_with_throw(): e = get_engine(""" raise_if_var(X) :- var(X), !, throw(unbound). raise_if_var(X) :- X = a. c(X, Y) :- catch((raise_if_var(X), Y = b), E, Y = a). """) assert_true("c(_, Y), Y == a.", e)
def test_repeat(): assert_true("repeat, true.") e = Engine() assert_false("repeat, !, fail.") # hard to test repeat differently e = get_engine('f :- repeat, !, fail.') assert_false('f.', e) assert_true('f; true.', e)
def test_library_dir_single_query(): e = Engine() tempdir = "__temp__" create_dir(tempdir) try: assert_true("add_library_dir('%s')." % tempdir, e) assert_true("library_directory('%s')." % tempdir, e) finally: delete_dir(tempdir)
def test_integration_2(): assert_true( """ trans((a2 --> b2, c2, [d]), R1), trans((b2 --> [b]), R2), trans((c2 --> [c]), R3), assert(R1), assert(R2), assert(R3), a2([b, c, d], []). """, e)
def test_call_cut(): e = get_engine(""" f(X) :- call(X). f(!). """) heaps = collect_all(e, "f(!).") assert len(heaps) == 2 assert_true("call(((X = a; X = b), !, X = b)); X = c.") assert_false("(((X = a; X = b), !, X = b)); X = c.")
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_between(): assert_true("between(12, 15, 12).") assert_true("between(-5, 15, 0).") assert_false("between(12, 15, 6).") assert_false("between(12, 15, 16).") heaps = collect_all(Engine(), "between(1, 4, X).") assert len(heaps) == 4 assert heaps[0]['X'].num == 1 assert heaps[-1]['X'].num == 4
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_library_dir_single_query(): e = Engine() tempdir = "__temp__" create_dir(tempdir) try: assert_true("add_library_dir('%s')." % tempdir, e) assert_true("library_directory('%s')." % tempdir, e) finally: delete_dir(tempdir)
def test_call_cut(): e = get_engine(""" f(X) :- call(X). f(!). """) heaps = collect_all(e, "f(!).") assert len(heaps) == 2 assert_true("call(((X = a; X = b), !, X = b)); X = c.") assert_false("(((X = a; X = b), !, X = b)); X = c.")
def test_between(): assert_true("between(12, 15, 12).") assert_true("between(-5, 15, 0).") assert_false("between(12, 15, 6).") assert_false("between(12, 15, 16).") heaps = collect_all(Engine(), "between(1, 4, X).") assert len(heaps) == 4 assert heaps[0]['X'].num == 1 assert heaps[-1]['X'].num == 4
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_4_queens(): e = get_engine(""" queens(Vars) :- Vars = [_A, _B, _C, _D], safe(Vars), perm([1,2,3,4], Vars). safe([]). safe([H|T]) :- safe(T), attack(H, 1, T). attack(_, _, []). attack(X, N, [H|T]) :- when((nonvar(X), nonvar(H)), (not(X is H + N; X is H - N))), N1 is N + 1, attack(X, N1, T). perm([1,2,3,4], [1,2,3,4]). perm([1,2,3,4], [1,2,4,3]). perm([1,2,3,4], [1,3,2,4]). perm([1,2,3,4], [1,3,4,2]). perm([1,2,3,4], [1,4,2,3]). perm([1,2,3,4], [1,4,3,2]). perm([1,2,3,4], [2,1,3,4]). perm([1,2,3,4], [2,1,4,3]). perm([1,2,3,4], [2,3,1,4]). perm([1,2,3,4], [2,3,4,1]). perm([1,2,3,4], [2,4,1,3]). perm([1,2,3,4], [2,4,2,1]). perm([1,2,3,4], [3,1,2,4]). perm([1,2,3,4], [3,1,4,2]). perm([1,2,3,4], [3,2,1,4]). perm([1,2,3,4], [3,2,4,1]). perm([1,2,3,4], [3,4,1,2]). perm([1,2,3,4], [3,4,2,1]). perm([1,2,3,4], [4,1,3,2]). perm([1,2,3,4], [4,1,2,3]). perm([1,2,3,4], [4,2,1,3]). perm([1,2,3,4], [4,2,3,1]). perm([1,2,3,4], [4,3,1,2]). perm([1,2,3,4], [4,3,2,1]). """, load_system=True) assert_true("queens([2, 4, 1, 3]).", e) assert_true("queens([3, 1, 4, 2]).", e) assert_false("queens([4, 2, 1, 3]).", e) assert_true("queens(X), X == [2, 4, 1, 3].", e) assert_true("queens(X), X == [3, 1, 4, 2].", e) assert_false("queens(X), X == [4, 2, 1, 3].", e) assert_true("findall(X, queens(X), L), L == [[2, 4, 1, 3], [3, 1, 4, 2]].", e)
def test_see_with_file(): src = "__src__" create_file(src, "abc") try: assert_true(""" see('%s'), get_char(a), get_char(b), get_char(c). """ % src) finally: delete_file(src)
def test_atom_concat(): assert_true("atom_concat(ab, cdef, abcdef).") assert_true("atom_concat(ab, cdef, X), X = abcdef.") assert_true("atom_concat(ab, X, abcdef), X = cdef.") assert_true("atom_concat(X, cdef, abcdef), X = ab.") assert_true("atom_concat(1, Y, '1def'), Y = def.") heaps = collect_all( Engine(), "atom_concat(X, Y, abcd), atom(X), atom(Y).") assert len(heaps) == 5
def test_backtrack_to_same_choice_point(): e = get_engine(""" a(a). b(b). start(Z) :- Z = X, f(X, b), X == b, Z == b. f(X, Y) :- a(Y). f(X, Y) :- X = a, a(Y). f(X, Y) :- X = b, b(Y). """) assert_true("start(Z).", 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_see_with_file(): src = "__src__" create_file(src, "abc") try: assert_true(""" see('%s'), get_char(a), get_char(b), get_char(c). """ % src) finally: delete_file(src)
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_asserta_other_module(): e = Engine() assert_true("asserta(m:f(a)).", e) assert len(e.modulewrapper.modules) == 2 assert_true("m:f(a).", e) prolog_raises("existence_error(_, _)", "f(a)", e) assert_true("module(m).", e) assert_true("f(a).", e) assert_true("module(user).", e) prolog_raises("existence_error(_, _)", "f(a)", e)