1:- module(test,
2	  [ test/0,
3	    test/1,
4	    test/2
5	  ]).
6:- use_module(library(debug)).
7:- use_module(library(debug)).
8:- asserta(user:file_search_path(foreign, '../sgml')).
9:- asserta(user:file_search_path(library, '../sgml')).
10:- asserta(user:file_search_path(foreign, '../clib')).
11:- asserta(user:file_search_path(library, '../clib')).
12:- asserta(user:file_search_path(library, '../RDF')).
13:- asserta(user:file_search_path(foreign, '.')).
14:- use_module(rdf_db).
15
16:- dynamic
17	map/1,				% the literal map
18	map/2,				% Prolog shadow admin
19	in/1,				% Read generated random
20	out/1.				% Write generated random
21
22test :-
23	test(10000),
24	format('~NLiteral map tests passed~n').
25
26test(N, log(File)) :-
27	open(File, write, Out),
28	assert(out(Out)),
29	call_cleanup(test(N),
30		     (	 close(Out),
31			 retractall(out(_)))).
32test(N, from(File)) :-
33	open(File, read, In),
34	assert(in(In)),
35	call_cleanup(test(N),
36		     (	 close(In),
37			 retractall(in(_)))).
38
39test(N) :-
40	mk(N),
41	(   v(continue),
42	    vk(all),
43	    vk(prefix('1')),
44	    vk(ge(500)),
45	    vk(le(500)),
46	    vk(between(100, 500))
47	->  clear
48	).
49
50clear :-
51	(   retract(map(Map))
52	->  rdf_destroy_literal_map(Map)
53	;   true
54	),
55	retractall(map(_,_)).
56
57mk(N) :-
58	clear,
59	rdf_new_literal_map(Map),
60	assert(map(Map)),
61	forall(between(1, N, _), m1(Map)).
62
63m1(Map) :-
64	rnd_value(1000, Key),
65	rnd_value(100, Value),
66	(   random(3, 0)
67	->  (   retract(map(Key, Value))
68	    ->  debug(delete, 'Deleted ~q --> ~q', [Key, Value]),
69		rdf_delete_literal_map(Map, Key, Value)
70	    ;   true
71	    )
72	;   (	map(Key, Value)
73	    ->  true
74	    ;   assert(map(Key, Value))
75	    ),
76	    rdf_insert_literal_map(Map, Key, Value)
77	).
78
79rnd_value(Max, Value) :-
80	random(Max, ValueI),
81	(   random(2, 0)
82	->  atom_number(Value, ValueI)
83	;   Value = ValueI
84	).
85
86v(Stop) :-
87	setof(X, Y^map(X, Y), Xs),
88	forall(member(X, Xs),
89	       v(X, Stop)).
90
91v(Key, Stop) :-
92	map(Map),
93	findall(V, map(Key, V), Vs),
94	sort(Vs, VsS),
95	rdf_find_literal_map(Map, [Key], Vs2),
96	sort(Vs2, Vs2S),
97	(   Vs2S == VsS
98	->  true
99	;   format('~q: ~q (must be ~q)~n', [Key, Vs2S, VsS]),
100	    Stop == continue
101	).
102
103vk(all) :-
104	map(Map),
105	rdf_keys_in_literal_map(Map, all, Keys),
106	setof(X, Y^map(X, Y), Xs),
107	(   Xs == Keys
108	->  true
109	).
110vk(prefix(Prefix)) :-
111	map(Map),
112	rdf_keys_in_literal_map(Map, prefix(Prefix), Keys),
113	prefix_keys(Prefix, KeysOK),
114	(   KeysOK == Keys
115	->  true
116	;   format('prefix(~w): ~p (must be ~p)~n', [Prefix, Keys, KeysOK])
117	).
118vk(ge(Min)) :-
119	map(Map),
120	rdf_keys_in_literal_map(Map, ge(Min), Keys),
121	between_keys(Min, 0x5fffffff, KeysOK),
122	(   KeysOK == Keys
123	->  true
124	;   format('ge(~w): ~p (must be ~p)~n', [Min, Keys, KeysOK])
125	).
126vk(le(Max)) :-
127	map(Map),
128	rdf_keys_in_literal_map(Map, le(Max), Keys),
129	between_keys(-0x60000000, Max, KeysOK),
130	(   KeysOK == Keys
131	->  true
132	;   format('le(~w): ~p (must be ~p)~n', [Max, Keys, KeysOK])
133	).
134vk(between(Min, Max)) :-
135	map(Map),
136	rdf_keys_in_literal_map(Map, between(Min, Max), Keys),
137	between_keys(Min, Max, KeysOK),
138	(   KeysOK == Keys
139	->  true
140	;   format('between(~w, ~w): ~p (must be ~p)~n',
141		   [Min, Max, Keys, KeysOK])
142	).
143
144prefix_keys(Prefix, Keys) :-
145	findall(K, prefix_key(Prefix, K), Keys0),
146	sort(Keys0, Keys).
147
148prefix_key(Prefix, Key) :-
149	map(Key,_),
150	atom(Key),
151	sub_atom(Key, 0, _, _, Prefix).
152
153between_keys(Min, Max, Keys) :-
154	findall(K, between_key(Min, Max, K), Keys0),
155	sort(Keys0, Keys).
156
157between_key(Min, Max, Key) :-
158	map(Key,_),
159	integer(Key),
160	between(Min, Max, Key).
161
162
163random(Max, Value) :-
164	in(Stream), !,
165	read(Stream, Term),
166	assertion(Term \== end_of_file),
167	Term = xx(Max0, Value),
168	assertion(Max == Max0).
169random(Max, Value) :-
170	out(Stream), !,
171	Value0 is random(Max),
172	format(Stream, 'xx(~q, ~q).~n', [Max, Value0]),
173	Value = Value0.
174random(Max, Value) :-
175	Value is random(Max).
176
177