1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    2% Tests for predicates which create and decompose terms
    3
    4%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    5
    6
    7%
    8% List of test suites
    9%
   10
   11test_suites([test_functor, test_arg, test_univ]).
   12
   13
   14%
   15% functor/3 test
   16% - ISO -
   17%
   18
   19test_functor_1 :- functor(foo(a, b, c), foo, 3).
   20test_functor_2(X, Y) :- functor(foo(a, b, c), X, Y).
   21test_functor_3(X) :- functor(X, foo, 3).
   22test_functor_4(X) :- functor(X, foo, 0).
   23test_functor_5 :- functor(foo(a), foo, 2).
   24test_functor_6 :- functor(foo(a), fo, 1).
   25test_functor_7(X, Y) :- functor(1, X, Y).
   26test_functor_8(X) :- functor(X, 1.1, 0).
   27test_functor_9(F) :- functor(F, foo(a), 1).
   28test_functor_10 :- functor([_|_], '.', 2).
   29test_functor_11 :- functor([], [], 0).
   30test_functor_12(X, Y) :- functor(X, Y, 3).
   31test_functor_13(X, N) :- functor(X, foo, N).
   32test_functor_14(X) :- functor(X, foo, a).
   33test_functor_15(A, T, X) :- current_prolog_flag(max_arity, A), X is A + 1,
   34                            functor(T, foo, X).
   35test_functor_16(Minus_1, F) :- Minus_1 is 0 - 1, functor(F, foo, Minus_1).
   36
   37throws_exception(test_functor_9). % Shouldn't throw an exception according
   38                                  % to 2nd draft of ISO Prolog Standard
   39throws_exception(test_functor_12).
   40throws_exception(test_functor_13).
   41throws_exception(test_functor_14).
   42throws_exception(test_functor_15).
   43throws_exception(test_functor_16).
   44
   45
   46%
   47% arg/3 test
   48% - ISO -
   49%
   50
   51test_arg_1 :- arg(1, foo(a, b), a).
   52test_arg_2(X) :- arg(1, foo(a, b), X).
   53test_arg_3(X) :- arg(1, foo(X, b), a).
   54test_arg_4(X, Y) :- arg(1, foo(X, b), Y).
   55test_arg_5 :- arg(1, foo(a, b), b).
   56test_arg_6 :- arg(0, foo(a, b), foo).
   57test_arg_7(N) :- arg(3, foo(3, 4), N).
   58test_arg_8(X) :- arg(X, foo(a, b), a).
   59test_arg_9(X) :- arg(1, X, a).
   60test_arg_10(A) :- arg(0, atom, A).
   61test_arg_11(A) :- arg(0, 3, A).
   62test_arg_12(X) :- arg(1, foo(X), u(X)). % Undefined behavior
   63
   64%throws_exception(test_arg_8). % Should throw an exception according
   65                               % to 2nd draft of ISO Prolog Standard
   66throws_exception(test_arg_9).
   67throws_exception(test_arg_10). 
   68throws_exception(test_arg_11).
   69
   70%
   71% =../2 test
   72% - ISO -
   73%
   74
   75test_univ_1 :- '=..'(foo(a, b), [foo, a, b]).
   76test_univ_2(X) :- '=..'(X, [foo, a, b]).
   77test_univ_3(L) :- '=..'(foo(a, b), L).
   78test_univ_4(X, Y) :- '=..'(foo(X, b), [foo, a, Y]).
   79test_univ_5 :- '=..'(1, [1]).
   80test_univ_6 :- '=..'(foo(a, b), [foo, b, a]).
   81test_univ_7(X, Y) :- '=..'(X, Y).
   82test_univ_8(X, Y) :- '=..'(X, [foo, a|Y]).
   83test_univ_9(X) :- '=..'(X, [foo|bar]).
   84test_univ_10(X, Foo) :- '=..'(X, [Foo, bar]).
   85test_univ_11(X) :- '=..'(X, [3, 1]).
   86test_univ_12(X) :- '=..'(X, [1.1, foo]).
   87test_univ_13(X) :- '=..'(X, [a(b), 1]).
   88test_univ_14(X) :- '=..'(X, 4).
   89test_univ_15(X) :- '=..'(f(X), [f, u(X)]). % Undefined behavior
   90
   91throws_exception(test_univ_7).
   92throws_exception(test_univ_8).
   93throws_exception(test_univ_9).
   94throws_exception(test_univ_10).
   95throws_exception(test_univ_11).
   96throws_exception(test_univ_12).
   97throws_exception(test_univ_13).
   98throws_exception(test_univ_14).
   99
  100test_univ_1b :- foo(a, b) =.. [foo, a, b].
  101test_univ_2b(X) :- X =.. [foo, a, b].
  102test_univ_3b(L) :- foo(a, b) =.. L.
  103test_univ_4b(X, Y) :- foo(X, b) =.. [foo, a, Y].
  104test_univ_5b :- 1 =.. [1].
  105test_univ_6b :- foo(a, b) =.. [foo, b, a].
  106test_univ_7b(X, Y) :- X =.. Y.
  107test_univ_8b(X, Y) :- X =.. [foo, a|Y].
  108test_univ_9b(X) :- X =.. [foo|bar].
  109test_univ_10b(X, Foo) :- X =.. [Foo, bar].
  110test_univ_11b(X) :- X =.. [3, 1].
  111test_univ_12b(X) :- X =.. [1.1, foo].
  112test_univ_13b(X) :- X =.. [a(b), 1].
  113test_univ_14b(X) :- X =.. 4.
  114test_univ_15b(X) :- f(X) =.. [f, u(X)]. % Undefined behavior
  115
  116throws_exception(test_univ_7b).
  117throws_exception(test_univ_8b).
  118throws_exception(test_univ_9b).
  119throws_exception(test_univ_10b).
  120throws_exception(test_univ_11b).
  121throws_exception(test_univ_12b).
  122throws_exception(test_univ_13b).
  123throws_exception(test_univ_14b)