Skip to content

Commit

Permalink
* Added testing with errors
Browse files Browse the repository at this point in the history
* Added bat.sgml, testing lots of attribute stuff
  • Loading branch information
Jan Wielemaker committed Mar 1, 2001
1 parent 884e524 commit f8e201a
Show file tree
Hide file tree
Showing 3 changed files with 122 additions and 6 deletions.
68 changes: 68 additions & 0 deletions Test/bat.sgml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
<!DOCTYPE bat [
<!-- The purpose of this is to test bad attribute values -->
<!NOTATION no SYSTEM "http://www.example.com/notations/no.xml">
<!ENTITY en SYSTEM "http://www.example.com/entities/en.not" NDATA no>
<!ELEMENT bat O O (x+)>
<!ELEMENT x - O EMPTY>
<!ATTLIST x
a CDATA #IMPLIED
b ENTITY #IMPLIED
c ENTITIES #IMPLIED
d ID #IMPLIED
e IDREF #IMPLIED
f IDREFS #IMPLIED
g NAME #IMPLIED
h NAMES #IMPLIED
i NMTOKEN #IMPLIED
j NMTOKENS #IMPLIED
k NUMBER #IMPLIED
l NUMBERS #IMPLIED
m NUTOKEN #IMPLIED
n NUTOKENS #IMPLIED
o NOTATION (no) #IMPLIED
>
]>
<x a=foo>
<x a=bar//
<x a=foo&bar>
<x a=file.cgi?y=1>
<x b=en>
<x b=en en>
<x b="en en">
<x c=en>
<x c=en en>
<x c="en en">
<x c=un>
<x c=12>
<x d=an-id>
<x d=an*id>
<x d=*id*>
<x d="an id">
<x e=an-id>
<x e=un-id>
<x f="">
<x f=an-id>
<x f=" an-id an-id ">
<x g=1>
<x g=''>
<x g=a-rather-long-name>
<x g=a%name%with%percents>
<x g=" a name ">
<x g=" a-name ">
<x h="">
<x h=a>
<x h="NAME">
<x h="A NAME">
<x k=1>
<x k=999999999999999999999999999999999999999999999>
<x k=1.2>
<x k="1.2">
<x k="-1.2">
<x n="one two">
<x n="1a 2a">
<x n="1*ft 2*in">
<x o=no>
<x o=un>
<x p=--a-->
<x p=--b-->
<x p=" --a-- ">
2 changes: 2 additions & 0 deletions Test/ok/bat.ok
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[element(bat, [], [element(x, [a=foo], []), element(x, [a=bar], [])]), element(bat, [], [element(x, [a='foo&bar'], []), element(x, [a='file.cgi?y=1'], []), element(x, [b=en], []), element(x, [b=en], []), element(x, [b='en en'], []), element(x, [c=[en]], []), element(x, [c=[en]], []), element(x, [c=[en, en]], []), element(x, [c=[un]], []), element(x, [c=['12']], []), element(x, [d='an-id'], []), element(x, [d='an*id'], []), element(x, [d='*id*'], []), element(x, [d='an id'], []), element(x, [e='an-id'], []), element(x, [e='un-id'], []), element(x, [f=['']], []), element(x, [f=['an-id']], []), element(x, [f=['an-id', 'an-id']], []), element(x, [g='1'], []), element(x, [g=''], []), element(x, [g='a-rather-long-name'], []), element(x, [g='a%name%with%percents'], []), element(x, [g='a name'], []), element(x, [g='a-name'], []), element(x, [h=['']], []), element(x, [h=[a]], []), element(x, [h=[name]], []), element(x, [h=[a, name]], []), element(x, [k='1'], []), element(x, [k='999999999999999999999999999999999999999999999'], []), element(x, [k=0], []), element(x, [k=0], []), element(x, [k=0], []), element(x, [n=[one, two]], []), element(x, [n=['1a', '2a']], []), element(x, [n=['1*ft', '2*in']], []), element(x, [o=no], []), element(x, [o=un], []), element(x, [p=''], []), element(x, [p=''], []), element(x, [p=' --a-- '], [])])].
[sgml(sgml_parser(344214), 'bat.sgml', 27, 'Syntax error: Attribute value requires quotes, found "foo&bar"'), sgml(sgml_parser(344214), 'bat.sgml', 28, 'Syntax error: Attribute value requires quotes, found "file.cgi?y=1"'), sgml(sgml_parser(344214), 'bat.sgml', 30, 'Element "x" has no attribute with value "en"'), sgml(sgml_parser(344214), 'bat.sgml', 30, 'Syntax error: Bad attribute list, found "b=en en"'), sgml(sgml_parser(344214), 'bat.sgml', 33, 'Element "x" has no attribute with value "en"'), sgml(sgml_parser(344214), 'bat.sgml', 33, 'Syntax error: Bad attribute list, found "c=en en"'), sgml(sgml_parser(344214), 'bat.sgml', 36, 'Syntax error: entity NAMES expected, found "12"'), sgml(sgml_parser(344214), 'bat.sgml', 38, 'Syntax error: Attribute value requires quotes, found "an*id"'), sgml(sgml_parser(344214), 'bat.sgml', 38, 'Syntax error: NAME expected, found "an*id"'), sgml(sgml_parser(344214), 'bat.sgml', 39, 'Syntax error: Attribute value requires quotes, found "*id*"'), sgml(sgml_parser(344214), 'bat.sgml', 39, 'Syntax error: NAME expected, found "*id*"'), sgml(sgml_parser(344214), 'bat.sgml', 43, 'Syntax error: NAMES expected, found """"'), sgml(sgml_parser(344214), 'bat.sgml', 46, 'Syntax error: NAME expected, found "1"'), sgml(sgml_parser(344214), 'bat.sgml', 47, 'Syntax error: NAME expected, found "\'\'"'), sgml(sgml_parser(344214), 'bat.sgml', 49, 'Syntax error: Attribute value requires quotes, found "a%name%with%percents"'), sgml(sgml_parser(344214), 'bat.sgml', 49, 'Syntax error: NAME expected, found "a%name%with%percents"'), sgml(sgml_parser(344214), 'bat.sgml', 52, 'Syntax error: NAMES expected, found """"'), sgml(sgml_parser(344214), 'bat.sgml', 58, 'Syntax error: NUMBER expected, found "1.2"'), sgml(sgml_parser(344214), 'bat.sgml', 59, 'Syntax error: NUMBER expected, found ""1.2""'), sgml(sgml_parser(344214), 'bat.sgml', 60, 'Syntax error: NUMBER expected, found ""-1.2""'), sgml(sgml_parser(344214), 'bat.sgml', 61, 'Syntax error: NUTOKENS expected, found ""one two""'), sgml(sgml_parser(344214), 'bat.sgml', 63, 'Syntax error: NUTOKENS expected, found ""1*ft 2*in""'), sgml(sgml_parser(344214), 'bat.sgml', 66, 'Element "x" has no attribute "p"'), sgml(sgml_parser(344214), 'bat.sgml', 66, 'Syntax error: Attribute value requires quotes'), sgml(sgml_parser(344214), 'bat.sgml', 67, 'Syntax error: Attribute value requires quotes')].
58 changes: 52 additions & 6 deletions Test/test.pl
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,22 @@
ground(Term), % make sure
okfile(File, OkFile),
( exists_file(OkFile)
-> load_prolog_file(OkFile, TermOk),
-> load_prolog_file(OkFile, TermOk, ErrorsOk),
( compare_dom(Term, TermOk)
-> format('ok~n')
; format('WRONG~n')
)
; format('Loaded, no validating data~n'),
-> format('ok')
; format('WRONG')
),
error_terms(Errors),
( compare_errors(Errors, ErrorsOk)
-> true
; format(' [Different errors]')
% pp(ErrorsOk),
% format('**************~n'),
% pp(Errors)
),
nl
; show_errors,
format('Loaded, no validating data~n'),
pp(Term)
).

Expand All @@ -62,16 +72,47 @@
okfile(File, OkFile),
open(OkFile, write, Fd),
format(Fd, '~q.~n', [Term]),
( error_terms(Errors)
-> format(Fd, '~q.~n', [Errors])
; true
),
close(Fd).

:- dynamic
error/3.
:- multifile
user:message_hook/3.

user:message_hook(Term, Kind, Lines) :-
Term = sgml(_,_,_,_),
assert(error(Term, Kind, Lines)).

show_errors :-
( error(_Term, Kind, Lines),
atom_concat(Kind, ': ', Prefix),
print_message_lines(user_error, Prefix, Lines),
fail
; true
).

error_terms(Errors) :-
findall(Term, error(Term, _, _), Errors).

compare_errors([], []).
compare_errors([sgml(_Parser1, _File1, Line, Msg)|T0],
[sgml(_Parser2, _File2, Line, Msg)|T]) :-
compare_errors(T0, T).

load_file(File, Term) :-
load_pred(Ext, Pred),
file_name_extension(_, Ext, File), !,
retractall(error(_,_,_)),
call(Pred, File, Term).
load_file(Base, Term) :-
load_pred(Ext, Pred),
file_name_extension(Base, Ext, File),
exists_file(File), !,
retractall(error(_,_,_)),
call(Pred, File, Term).


Expand All @@ -84,9 +125,14 @@
file_directory_name(Base, Dir),
concat_atom([Dir, '/ok/', Base, '.ok'], OkFile).

load_prolog_file(File, Term) :-
load_prolog_file(File, Term, Errors) :-
open(File, read, Fd),
read(Fd, Term),
( read(Fd, Errors),
Errors \== end_of_file
-> true
; Errors = []
),
close(Fd).

compare_dom([], []) :- !.
Expand Down

0 comments on commit f8e201a

Please sign in to comment.