:- use_module('../prolog/accessors').

:- derive_accessors(pred(a,b,c)).
:- derive_accessors('composite name'(a,b,c)).
:- derive_accessors(fact, [a,b,c]).
:- derive_accessors('composite name2', [a,b,c]).

:- begin_tests(derive_accessors_directive).

test(simple_atom) :-
    Pred = pred(a,b,c),
    pred_a(Pred,a),
    pred_b(Pred,b),
    pred_c(Pred,c).

test(composite_atom) :-
    Pred = 'composite name'(a,b,c),
    'composite name_a'(Pred,a),
    'composite name_b'(Pred,b),
    'composite name_c'(Pred,c).

test(monotonicity) :-
    Pred1 = pred(a,b,c),
    Pred2 = 'composite name'(a,b,c),
    pred_a(Pred1,a),
    'composite name_a'(Pred2,a),
    pred_a(Pred1,a).

% test(purity) :- How to test for purity?
%     Pred1 = pred(X,Y,Z),
%     pred_a(Pred,A),
%     pred_a(Pred,B).

:- end_tests(derive_accessors_directive).

:- begin_tests(derive_accessors_directive_pairslist).

test(simple_atom) :-
    FactList = [a-a,b-b,c-c],
    fact_a(FactList,a),
    fact_b(FactList,b),
    fact_c(FactList,c).

test(composite_atom) :-
    CompositeNameList = [a-a,b-b,c-c],
    'composite name2_a'(CompositeNameList,a),
    'composite name2_b'(CompositeNameList,b),
    'composite name2_c'(CompositeNameList,c).

:- end_tests(derive_accessors_directive_pairslist).