1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    2% Tests for predicates which manipulate the clause database
    3
    4%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    5
    6
    7%
    8% List of test suites
    9%
   10
   11test_suites([test_assert, test_retract]).
   12
   13
   14%
   15% assert/1 test (equivalent to assertz/1)
   16% - ISO -
   17%
   18
   19% Note that these tests have additional code in order to keep the
   20% original state of the clause database after executing them
   21
   22:- dynamic db_assert_legs/2.   23
   24db_assert_legs(A, 6) :- db_assert_insect(A).
   25
   26:- dynamic db_assert_insect/1.   27
   28db_assert_insect(ant).
   29db_assert_insect(bee).
   30
   31:- dynamic db_assert_foo/1.   32
   33db_assert_foo(X) :- call(X), call(X).
   34
   35test_assert_1 :- assert(db_assert_legs(spider, 8)), db_assert_legs(spider, 8),
   36                 retract(db_assert_legs(spider, 8)).
   37test_assert_2 :- assert(_).
   38test_assert_3 :- assert(4).
   39
   40throws_exception(test_assert_2).
   41throws_exception(test_assert_3).
   42
   43% The following tests don't work in Bousi-Prolog because assert/1
   44% can't be used to assert new rules into the clause database
   45%
   46%test_assert_X1(B) :- assert((db_assert_legs(B, 2) :- db_assert_bird(B))).
   47%test_assert_X2(X) :- assert((db_assert_foo(X) :- X -> call(X))).
   48%test_assert_X3 :- assert((db_assert_foo :- 4)).
   49%test_assert_X4 :- assert((atom(_) :- true)).
   50%
   51%throws_exception(test_assert_X3).
   52%throws_exception(test_assert_X4).
   53
   54
   55%
   56% retract/1 test
   57% - ISO -
   58%
   59
   60% Note that these tests have additional code in order to keep the
   61% original state of the clause database after executing them
   62
   63:- dynamic db_retract_legs/2.   64
   65db_retract_legs(A, 4) :- db_retract_animal(A).
   66db_retract_legs(octopus, 8).
   67db_retract_legs(A, 6) :- db_retract_insect(A).
   68db_retract_legs(spider, 8).
   69db_retract_legs(B, 2) :- db_retract_bird(B).
   70
   71:- dynamic db_retract_insect/1.   72
   73db_retract_insect(ant).
   74db_retract_insect(bee).
   75
   76:- dynamic db_retract_foo/1.   77
   78db_retract_foo(X) :- call(X), call(X).
   79db_retract_foo(X) :- call(X) -> call(X).
   80
   81test_retract_1 :- retract(db_retract_legs(octopus, 8)),
   82                  not(db_retract_legs(octopus, 8)),
   83                  assert(db_retract_legs(octopus, 8)).
   84test_retract_2 :- retract(db_retract_legs(spider, 6)),
   85                  not(db_retract_legs(spider, 6)),
   86                  assert(db_retract_legs(spider, 6)).
   87test_retract_3 :- subtest_retract_3a ; subtest_retract_3b.
   88subtest_retract_3a :- retract(db_retract_insect(I)), write(I),
   89                      retract(db_retract_insect(bee)), fail.
   90subtest_retract_3b :- assert(db_retract_insect(ant)),
   91                      assert(db_retract_insect(bee)).
   92
   93% The following tests don't work in Bousi-Prolog because retract/1
   94% can't be used to retract rules from the clause database
   95%
   96%test_retract_X1(X, T) :- retract((db_retract_legs(X, 2) :- T)).
   97%test_retract_X2(X, Y) :- retract((db_retract_legs(X, Y) :- Z)).
   98%test_retract_X3(A) :- retract((db_retract_foo(A) :- A, call(A))).
   99%test_retract_X4(A, B) :- retract((db_retract_foo(A) :- A -> B)).
  100%test_retract_X5(X, Y) :- retract((X :- in_eec(Y))).
  101%test_retract_X6(X) :- retract((4 :- X)).
  102%test_retract_X7(X) :- retract((atom(X) :- X == '[]')).
  103%
  104%throws_exception(test_retract_X5).
  105%throws_exception(test_retract_X6).
  106%throws_exception(test_retract_X7).