%
% These test cases are based on Paulo Moura's 2010 reference implementation
% This file may be compiled or read as data.

% 
% 12.3 Grammar-rule translator tests
% Know any hard to translate grammar rules?  Contribute them!  When
% checking compliance of a particular grammar rule translator, results
% of the tests in this section must be compliant with the logical
% expansion of grammar rules, as specified in section 10.
% 

% terminal tests with list notation:
gr_tr_test(101, (p --> []), success).
gr_tr_test(102, (p --> [b]), success).
gr_tr_test(103, (p --> [abc, xyz]), success).
gr_tr_test(104, (p --> [abc | xyz]), error).
gr_tr_test(105, (p --> [[], {}, 3, 3.2, a(b)]), success).
gr_tr_test(106, (p --> [_]), success).
gr_tr_test(107, (p --> [a,b,c], [q]), success).
gr_tr_test(108, (p --> [a,b,c] ; [q]), success).
gr_tr_test(109, (p --> q(T), [a,b|T]), error).
gr_tr_test(110, (p --> [a,b|T], q(T)), error).

% terminal tests with string notation:
%gr_tr_test(151, (p --> "b"), success).
%gr_tr_test(152, (p --> "abc", "q"), success).
%gr_tr_test(153, (p --> "abc" ; "q"), success).

% simple non-terminal tests:
gr_tr_test(201, (p --> b), success).
gr_tr_test(202, (p --> 3), error).
gr_tr_test(203, (p(X) --> b(X)), success).

% conjunction tests:
gr_tr_test(301, (p --> b, c), success).
gr_tr_test(311, (p --> true, c), success).
gr_tr_test(312, (p --> fail, c), success).
gr_tr_test(313, (p(X) --> call(X), c), success).

% disjunction tests:
gr_tr_test(351, (p --> b ; c), success).
gr_tr_test(352, (p --> q ; []), success).
gr_tr_test(353, (p --> [a] ; [b]), success).
gr_tr_test(354, (p --> [a] ; [b],! ; c ; d,{e} ; []), success).

% alternative tests:
% (infix | and '|' are tested separately to
% account for systems where a|b is read as a;b)
gr_tr_test(361, (p --> b | c), success).
gr_tr_test(362, (p --> q | []), success).
gr_tr_test(363, (p --> [a] | [b]), success).
gr_tr_test(364, (p --> [a] | [b],! | c | d,{e} | []), success).

gr_tr_test(371, (p --> '|'(b,c)), success).
gr_tr_test(372, (p --> '|'(q,[])), success).
gr_tr_test(373, (p --> '|'([a],[b])), success).
gr_tr_test(374, (p --> '|'([a],'|'(([b],!),'|'(c,'|'((d,{e}),[]))))), success).

% if-then-else tests:
gr_tr_test(401, (p --> b -> c), success).

gr_tr_test(411, (p --> b -> c; d), success).
gr_tr_test(421, (p --> b -> c1, c2 ; d), success).
gr_tr_test(422, (p --> b -> c ; d1, d2), success).
gr_tr_test(423, (p --> b1, b2 -> c ; d), success).
gr_tr_test(424, (p --> [x] -> [] ; q), success).

gr_tr_test(430, (p --> b -> c | d), success).
gr_tr_test(431, (p --> b -> c1, c2 | d), success).
gr_tr_test(432, (p --> b -> c | d1, d2), success).
gr_tr_test(433, (p --> b1, b2 -> c | d), success).
gr_tr_test(434, (p --> [x] -> [] | q), success).

gr_tr_test(440, (p --> '|'((b -> c) , d)), success).
gr_tr_test(441, (p --> '|'((b -> c1, c2) , d)), success).
gr_tr_test(442, (p --> '|'((b -> c) , (d1, d2))), success).
gr_tr_test(443, (p --> '|'((b1, b2 -> c) , d)), success).
gr_tr_test(444, (p --> '|'(([x] -> []) , q)), success).

% negation tests:
gr_tr_test(451, (p --> \+ b, c), success).
gr_tr_test(452, (p --> b, \+ c, d), success).
gr_tr_test(453, (p(A) --> b, \+ A, d), success).

% cut tests:
gr_tr_test(501, (p --> !, [a]), success).
gr_tr_test(502, (p --> b, !, c, d), success).
gr_tr_test(503, (p --> b, !, c ; d), success).
gr_tr_test(504, (p --> [a], !, {fail}), success).
gr_tr_test(505, (p(a), [X] --> !, [X, a], q), success).
gr_tr_test(506, (p --> a, ! ; b), success).
gr_tr_test(507, (p --> a, !), success).
gr_tr_test(508, (p --> _, !), success).

% {}/1 tests:
gr_tr_test(601, (p --> {b}), success).
gr_tr_test(602, (p --> {3}), error).
gr_tr_test(603, (p --> {c,d}), success).
gr_tr_test(604, (p --> '{}'((c,d))), success).
gr_tr_test(605, (p --> {a}, {b}, {c}), success).
gr_tr_test(606, (p --> {q} -> [a] ; [b]), success).
gr_tr_test(607, (p --> {q} -> [] ; b), success).
gr_tr_test(608, (p --> [foo], {write(x)}, [bar]), success).
gr_tr_test(609, (p --> [foo], {write(hello)},{nl}), success).
gr_tr_test(610, (p --> [foo], {write(hello), nl}), success).
gr_tr_test(620, (p --> {}), success).
gr_tr_test(621, (p --> q, {}, r), success).
gr_tr_test(622, (p --> q, {!}, r), success).
gr_tr_test(623, (p --> q, {}), success).

% "metacall" tests:
gr_tr_test(701, (p(NT) --> NT), success).
gr_tr_test(702, (p --> _), success).
gr_tr_test(703, (p(NT) --> NT, [a]), success).

% non-terminals corresponding to "graphic" characters
% or built-in operators/predicates:
gr_tr_test(801, ('[' --> b, c), success).
gr_tr_test(802, ((=) --> b, c), success).
gr_tr_test(803, ((p,q) --> a), success).
gr_tr_test(804, ((p;q) --> a), success).
gr_tr_test(805, ((p->q) --> a), success).
gr_tr_test(806, ((p|q) --> a), success).
gr_tr_test(807, (\+p --> a), success).
gr_tr_test(808, (! --> a), success).
gr_tr_test(809, ([] --> a), error).
gr_tr_test(810, ([a] --> a), error).
gr_tr_test(811, ({} --> a), error).
gr_tr_test(812, ({a} --> a), error).

% pushback tests:
gr_tr_test(901, (p, [t] --> b, c), success).
gr_tr_test(902, (p, [t] --> b, [t]), success).
gr_tr_test(903, (p, [t] --> b, [s, t]), success).
gr_tr_test(904, (p, [t] --> b, [s], [t]), success).
gr_tr_test(905, (p(X), [X] --> [X]), success).
gr_tr_test(906, (p(X, Y), [X, Y] --> [X, Y]), success).
gr_tr_test(907, (p(a), [X] --> !, [X, a], q), success).
gr_tr_test(908, (p, [a,b] --> [foo], {write(hello), nl}), success).
gr_tr_test(909, (p, [t1], [t2] --> b, c), error).
gr_tr_test(910, (p, b --> b), error).
gr_tr_test(911, ([t], p --> b), error).
gr_tr_test(912, ([t] --> b), error).
gr_tr_test(913, ([t], p --> b), error).
gr_tr_test(914, ([t1], [t2] --> b), error).
gr_tr_test(915, (p, [t|_] --> b), error).
gr_tr_test(916, ([t1], p, [t2] --> b), error).
gr_tr_test(917, (p, X --> b(X)), error).
gr_tr_test(920, (p, 3 --> b), error).
gr_tr_test(921, (p, q --> b), error).
gr_tr_test(922, (p, {true} --> b), error).
gr_tr_test(923, (p, (q;r) --> b), error).
gr_tr_test(924, (p, [] --> b), success).


% Qualification
gr_tr_test(2000, (p(N) --> m:N), success).
gr_tr_test(2001, (p --> m:[]), error).
gr_tr_test(2002, (p --> m:[a]), error).
gr_tr_test(2003, (p --> m:{}), error).
gr_tr_test(2004, (p --> m:{foo}), error).
gr_tr_test(2005, (p --> m:q), success).
gr_tr_test(2006, (p --> m:q(f)), success).
gr_tr_test(2007, (p --> m:(q,r)), success).
gr_tr_test(2008, (p --> m:(q;r)), success).
gr_tr_test(2009, (p --> m:(q->r)), success).
gr_tr_test(2010, (p --> m:(q|r)), success).
gr_tr_test(2011, (p --> m:!), error).
gr_tr_test(2012, (p --> m:{!}), error).

gr_tr_test(2100, (m:p --> q), success).
gr_tr_test(2101, (m:p,[a] --> q), success).
gr_tr_test(2102, (m:[a] --> q), error).
gr_tr_test(2103, (m:(p,[a]) --> q), error).
gr_tr_test(2104, (m:(p;q) --> q), error).