177 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			177 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| 
								 | 
							
								:- module(test,
							 | 
						||
| 
								 | 
							
									  [ test/0,
							 | 
						||
| 
								 | 
							
									    test/1,
							 | 
						||
| 
								 | 
							
									    test/2
							 | 
						||
| 
								 | 
							
									  ]).
							 | 
						||
| 
								 | 
							
								:- use_module(library(debug)).
							 | 
						||
| 
								 | 
							
								:- use_module(library(debug)).
							 | 
						||
| 
								 | 
							
								:- asserta(user:file_search_path(foreign, '../sgml')).
							 | 
						||
| 
								 | 
							
								:- asserta(user:file_search_path(library, '../sgml')).
							 | 
						||
| 
								 | 
							
								:- asserta(user:file_search_path(foreign, '../clib')).
							 | 
						||
| 
								 | 
							
								:- asserta(user:file_search_path(library, '../clib')).
							 | 
						||
| 
								 | 
							
								:- asserta(user:file_search_path(library, '../RDF')).
							 | 
						||
| 
								 | 
							
								:- asserta(user:file_search_path(foreign, '.')).
							 | 
						||
| 
								 | 
							
								:- use_module(rdf_db).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- dynamic
							 | 
						||
| 
								 | 
							
									map/1,				% the literal map
							 | 
						||
| 
								 | 
							
									map/2,				% Prolog shadow admin
							 | 
						||
| 
								 | 
							
									in/1,				% Read generated random
							 | 
						||
| 
								 | 
							
									out/1.				% Write generated random
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test :-
							 | 
						||
| 
								 | 
							
									test(10000),
							 | 
						||
| 
								 | 
							
									format('~NLiteral map tests passed~n').
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test(N, log(File)) :-
							 | 
						||
| 
								 | 
							
									open(File, write, Out),
							 | 
						||
| 
								 | 
							
									assert(out(Out)),
							 | 
						||
| 
								 | 
							
									call_cleanup(test(N),
							 | 
						||
| 
								 | 
							
										     (	 close(Out),
							 | 
						||
| 
								 | 
							
											 retractall(out(_)))).
							 | 
						||
| 
								 | 
							
								test(N, from(File)) :-
							 | 
						||
| 
								 | 
							
									open(File, read, In),
							 | 
						||
| 
								 | 
							
									assert(in(In)),
							 | 
						||
| 
								 | 
							
									call_cleanup(test(N),
							 | 
						||
| 
								 | 
							
										     (	 close(In),
							 | 
						||
| 
								 | 
							
											 retractall(in(_)))).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test(N) :-
							 | 
						||
| 
								 | 
							
									mk(N),
							 | 
						||
| 
								 | 
							
									(   v(continue),
							 | 
						||
| 
								 | 
							
									    vk(all),
							 | 
						||
| 
								 | 
							
									    vk(prefix('1')),
							 | 
						||
| 
								 | 
							
									    vk(ge(500)),
							 | 
						||
| 
								 | 
							
									    vk(le(500)),
							 | 
						||
| 
								 | 
							
									    vk(between(100, 500))
							 | 
						||
| 
								 | 
							
									->  clear
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								clear :-
							 | 
						||
| 
								 | 
							
									(   retract(map(Map))
							 | 
						||
| 
								 | 
							
									->  rdf_destroy_literal_map(Map)
							 | 
						||
| 
								 | 
							
									;   true
							 | 
						||
| 
								 | 
							
									),
							 | 
						||
| 
								 | 
							
									retractall(map(_,_)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								mk(N) :-
							 | 
						||
| 
								 | 
							
									clear,
							 | 
						||
| 
								 | 
							
									rdf_new_literal_map(Map),
							 | 
						||
| 
								 | 
							
									assert(map(Map)),
							 | 
						||
| 
								 | 
							
									forall(between(1, N, _), m1(Map)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								m1(Map) :-
							 | 
						||
| 
								 | 
							
									rnd_value(1000, Key),
							 | 
						||
| 
								 | 
							
									rnd_value(100, Value),
							 | 
						||
| 
								 | 
							
									(   random(3, 0)
							 | 
						||
| 
								 | 
							
									->  (   retract(map(Key, Value))
							 | 
						||
| 
								 | 
							
									    ->  debug(delete, 'Deleted ~q --> ~q', [Key, Value]),
							 | 
						||
| 
								 | 
							
										rdf_delete_literal_map(Map, Key, Value)
							 | 
						||
| 
								 | 
							
									    ;   true
							 | 
						||
| 
								 | 
							
									    )
							 | 
						||
| 
								 | 
							
									;   (	map(Key, Value)
							 | 
						||
| 
								 | 
							
									    ->  true
							 | 
						||
| 
								 | 
							
									    ;   assert(map(Key, Value))
							 | 
						||
| 
								 | 
							
									    ),
							 | 
						||
| 
								 | 
							
									    rdf_insert_literal_map(Map, Key, Value)
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								rnd_value(Max, Value) :-
							 | 
						||
| 
								 | 
							
									random(Max, ValueI),
							 | 
						||
| 
								 | 
							
									(   random(2, 0)
							 | 
						||
| 
								 | 
							
									->  atom_number(Value, ValueI)
							 | 
						||
| 
								 | 
							
									;   Value = ValueI
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								v(Stop) :-
							 | 
						||
| 
								 | 
							
									setof(X, Y^map(X, Y), Xs),
							 | 
						||
| 
								 | 
							
									forall(member(X, Xs),
							 | 
						||
| 
								 | 
							
									       v(X, Stop)).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								v(Key, Stop) :-
							 | 
						||
| 
								 | 
							
									map(Map),
							 | 
						||
| 
								 | 
							
									findall(V, map(Key, V), Vs),
							 | 
						||
| 
								 | 
							
									sort(Vs, VsS),
							 | 
						||
| 
								 | 
							
									rdf_find_literal_map(Map, [Key], Vs2),
							 | 
						||
| 
								 | 
							
									sort(Vs2, Vs2S),
							 | 
						||
| 
								 | 
							
									(   Vs2S == VsS
							 | 
						||
| 
								 | 
							
									->  true
							 | 
						||
| 
								 | 
							
									;   format('~q: ~q (must be ~q)~n', [Key, Vs2S, VsS]),
							 | 
						||
| 
								 | 
							
									    Stop == continue
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								vk(all) :-
							 | 
						||
| 
								 | 
							
									map(Map),
							 | 
						||
| 
								 | 
							
									rdf_keys_in_literal_map(Map, all, Keys),
							 | 
						||
| 
								 | 
							
									setof(X, Y^map(X, Y), Xs),
							 | 
						||
| 
								 | 
							
									(   Xs == Keys
							 | 
						||
| 
								 | 
							
									->  true
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
								vk(prefix(Prefix)) :-
							 | 
						||
| 
								 | 
							
									map(Map),
							 | 
						||
| 
								 | 
							
									rdf_keys_in_literal_map(Map, prefix(Prefix), Keys),
							 | 
						||
| 
								 | 
							
									prefix_keys(Prefix, KeysOK),
							 | 
						||
| 
								 | 
							
									(   KeysOK == Keys
							 | 
						||
| 
								 | 
							
									->  true
							 | 
						||
| 
								 | 
							
									;   format('prefix(~w): ~p (must be ~p)~n', [Prefix, Keys, KeysOK])
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
								vk(ge(Min)) :-
							 | 
						||
| 
								 | 
							
									map(Map),
							 | 
						||
| 
								 | 
							
									rdf_keys_in_literal_map(Map, ge(Min), Keys),
							 | 
						||
| 
								 | 
							
									between_keys(Min, 0x5fffffff, KeysOK),
							 | 
						||
| 
								 | 
							
									(   KeysOK == Keys
							 | 
						||
| 
								 | 
							
									->  true
							 | 
						||
| 
								 | 
							
									;   format('ge(~w): ~p (must be ~p)~n', [Min, Keys, KeysOK])
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
								vk(le(Max)) :-
							 | 
						||
| 
								 | 
							
									map(Map),
							 | 
						||
| 
								 | 
							
									rdf_keys_in_literal_map(Map, le(Max), Keys),
							 | 
						||
| 
								 | 
							
									between_keys(-0x60000000, Max, KeysOK),
							 | 
						||
| 
								 | 
							
									(   KeysOK == Keys
							 | 
						||
| 
								 | 
							
									->  true
							 | 
						||
| 
								 | 
							
									;   format('le(~w): ~p (must be ~p)~n', [Max, Keys, KeysOK])
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
								vk(between(Min, Max)) :-
							 | 
						||
| 
								 | 
							
									map(Map),
							 | 
						||
| 
								 | 
							
									rdf_keys_in_literal_map(Map, between(Min, Max), Keys),
							 | 
						||
| 
								 | 
							
									between_keys(Min, Max, KeysOK),
							 | 
						||
| 
								 | 
							
									(   KeysOK == Keys
							 | 
						||
| 
								 | 
							
									->  true
							 | 
						||
| 
								 | 
							
									;   format('between(~w, ~w): ~p (must be ~p)~n',
							 | 
						||
| 
								 | 
							
										   [Min, Max, Keys, KeysOK])
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								prefix_keys(Prefix, Keys) :-
							 | 
						||
| 
								 | 
							
									findall(K, prefix_key(Prefix, K), Keys0),
							 | 
						||
| 
								 | 
							
									sort(Keys0, Keys).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								prefix_key(Prefix, Key) :-
							 | 
						||
| 
								 | 
							
									map(Key,_),
							 | 
						||
| 
								 | 
							
									atom(Key),
							 | 
						||
| 
								 | 
							
									sub_atom(Key, 0, _, _, Prefix).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								between_keys(Min, Max, Keys) :-
							 | 
						||
| 
								 | 
							
									findall(K, between_key(Min, Max, K), Keys0),
							 | 
						||
| 
								 | 
							
									sort(Keys0, Keys).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								between_key(Min, Max, Key) :-
							 | 
						||
| 
								 | 
							
									map(Key,_),
							 | 
						||
| 
								 | 
							
									integer(Key),
							 | 
						||
| 
								 | 
							
									between(Min, Max, Key).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								random(Max, Value) :-
							 | 
						||
| 
								 | 
							
									in(Stream), !,
							 | 
						||
| 
								 | 
							
									read(Stream, Term),
							 | 
						||
| 
								 | 
							
									assertion(Term \== end_of_file),
							 | 
						||
| 
								 | 
							
									Term = xx(Max0, Value),
							 | 
						||
| 
								 | 
							
									assertion(Max == Max0).
							 | 
						||
| 
								 | 
							
								random(Max, Value) :-
							 | 
						||
| 
								 | 
							
									out(Stream), !,
							 | 
						||
| 
								 | 
							
									Value0 is random(Max),
							 | 
						||
| 
								 | 
							
									format(Stream, 'xx(~q, ~q).~n', [Max, Value0]),
							 | 
						||
| 
								 | 
							
									Value = Value0.
							 | 
						||
| 
								 | 
							
								random(Max, Value) :-
							 | 
						||
| 
								 | 
							
									Value is random(Max).
							 | 
						||
| 
								 | 
							
								
							 |