:- use_module(library(semweb/rdf11)).
:- use_module(library(sparqlprog/emulate_builtins)).

:- rdf_register_prefix(foaf,'http://xmlns.com/foaf/0.1/').
:- rdf_register_prefix('','http://example.org/').

:- begin_tests(bultins_test).



% string test functions should accept as input: str, atom, lang-literal, str-literal
test(str_starts1) :- assertion(str_starts("abc","ab")).
test(str_starts2) :- assertion(str_starts("abc"@en,"ab")).
test(str_starts3) :- assertion(str_starts("abc"^^xsd:string,"ab")).
test(str_starts4) :- assertion(str_starts(abc,"ab")).
test(str_starts5) :- assertion(str_starts(abc,ab)).
test(str_starts6) :- assertion(str_starts("abc",ab)).

test(str_ends) :- assertion(str_ends("abc","bc")).

test(str_replace) :- assertion(str_replace("abc","ab","x","xc")).
test(str_replace_eval) :-
        seval(str_replace("ABC DEF GHI"," ","X"),S),
        assertion(S == "ABCXDEFXGHI").

test(reflexive) :- bind("x",X),
        assertion( X=="x").
xxtest(nested) :-
        bind(lcase("X"), X),
        assertion( X=="x").
test(nested) :- bind(lcase(ucase(lcase("X"))), X),
        assertion( X=="x").

test(lcase1) :- assertion(lcase("ABC","abc")).
test(lcase2) :-
        assertion(lcase("ABC",X)),
        assertion(X="abc").
test(lcase_eval) :-
        seval(lcase("AbC"),S),
        assertion(S == "abc").

test(seval1) :-
        assertion( seval(append([a,b],[c,d]),[a,b,c,d]) ).
test(seval_nested) :-
        seval(lcase(str_replace("ABC DEF GHI"," ","X")),S),
        assertion(S == "abcxdefxghi").

test(arith1) :-
        assertion( seval(1+2,3) ).
test(arith_nested) :-
        assertion( seval(1+(2*3),7) ).

test(arith_types) :-
        One="1"^^xsd:integer,
        Two="2",
        assertion( seval(One+Two,3) ).

test(agg) :-
        assertion( seval(count(append([a,b],[c])), 3) ).
test(max) :-
        assertion( seval(agg_max(append([1,2],[3,5])), 5) ).

test(agg_group) :-
        forall(aggregate_group(max(D),[C],entity_value(C,D),R),
               format('Max for ~w is ~w~n',[C,R])),
        findall(C-R,
                aggregate_group(max(D),[C],entity_value(C,D),R),
                L),
        true,
        assertion(L=[_,_,_]),
        assertion(member(a-3,L)),
        assertion(member(b-2,L)),
        assertion(member(c-4,L)).
/*
test(agg_group2) :-
        findall(sum(P,R),
                aggregate_group(sum(Sal),[P],sal(P,J,Sal),R),
                L),
        maplist(writeln,L),
        assertion(L=[_,_,_]).
*/

test(intersects) :-
        X=[a,b,c,d],
        Y=[c,d,e,f],
        assertion( seval(intersection(X,Y), [c,d]) ).
test(n_intersects) :-
        X=[a,b,c,d],
        Y=[c,d,e,f],
        assertion( seval(count(intersection(X,Y)) / 2, 1) ).

test(jac) :-
        X=[a,b,c,d],
        Y=[c,d,e,f,g,h],
        assertion( (seval(count(intersection(X,Y)) / count(union(X,Y)), N),
                    N=0.25)
                   ).

entity_value(a,1).
entity_value(a,2).
entity_value(a,3).
entity_value(b,1).
entity_value(b,2).
entity_value(c,4).

sal(p1,j1,100).
sal(p1,j2,200).

sal(p2,j1,200).
sal(p2,j2,400).

sal(p3,j3,800).





        

    
:- end_tests(bultins_test).