1use warnings;
2use strict;
3
4use Test::More tests => 2*10;
5
6BEGIN { $^H |= 0x20000; }
7
8my @t;
9
10sub mymap(&@) { my $sub = shift; return map { $sub->($_) } @_; }
11sub myneg(@) { return map { -$_ } @_; }
12package AA { sub listmeth { shift; return map { -$_ } @_; } }
13
14@t = ();
15eval q{
16	use XS::APItest qw(arrayfullexpr);
17	no warnings "void";
18	push @t, arrayfullexpr 1+2;
19	push @t, arrayfullexpr 0 || 2;
20	push @t, arrayfullexpr 1 || 2;
21	push @t, arrayfullexpr 0 || 2, 3;
22	push @t, arrayfullexpr 1 || 2, 3;
23	push @t, arrayfullexpr 1, 2;
24	push @t, arrayfullexpr 0 or 2;
25	push @t, arrayfullexpr 1 or 2;
26	push @t, arrayfullexpr 0 or 2, 3;
27	push @t, arrayfullexpr 1 or 2, 3;
28	{ push @t, arrayfullexpr 1, 2 }
29	push @t, (arrayfullexpr 1, 2), 3;
30	push @t, arrayfullexpr do { 1; 1 }, 2;
31	push @t, arrayfullexpr 3, 4 if 1;
32	push @t, arrayfullexpr 5, 6 if 0;
33	push @t, arrayfullexpr (7, 8), 9;
34	push @t, arrayfullexpr a => "b";
35	push @t, arrayfullexpr 1 ? reverse 2, 3 : 4, 5;
36	push @t, arrayfullexpr 0 ? reverse 2, 3 : 4, 5;
37	push @t, 1 ? reverse arrayfullexpr 2, 3 : 4, 5;
38	push @t, 0 ? reverse arrayfullexpr 2, 3 : 4, 5;
39	push @t, arrayfullexpr reverse 1, 2, 3;
40	push @t, sub { arrayfullexpr return 1, 2, 3 }->();
41	push @t, arrayfullexpr myneg 1, 2, 3;
42	push @t, arrayfullexpr map { -$_ } 1, 2, 3;
43	push @t, arrayfullexpr mymap { -$_[0] } 1, 2, 3;
44	push @t, arrayfullexpr AA->listmeth(1, 2), 3;
45	push @t, arrayfullexpr listmeth AA (1, 2), 3;
46	push @t, arrayfullexpr listmeth AA 1, 2, 3;
47	push @t, arrayfullexpr not 1, 2;
48	push @t, arrayfullexpr reverse 6, 7, 8 or 9;
49	push @t, arrayfullexpr reverse 6, 7, 8 and 9;
50	push @t, arrayfullexpr 1 << 2;
51	push @t, arrayfullexpr 7 < 8;
52};
53is $@, "";
54is_deeply \@t, [
55	[3],
56	[2],
57	[1],
58	[2,3],
59	[1,3],
60	[1,2],
61	[2],
62	[1],
63	[2,3],
64	[1],
65	[1,2],
66	[1,2], 3,
67	[1,2],
68	[3,4],
69	[7,8,9],
70	["a","b"],
71	[3,2,5],
72	[4,5],
73	[2,3], 5,
74	4, 5,
75	[3,2,1],
76	1, 2, 3,
77	[-1,-2,-3],
78	[-1,-2,-3],
79	[-1,-2,-3],
80	[-1,-2,3],
81	[-1,-2,3],
82	[-1,-2,-3],
83	[!1],
84	[876],
85	[9],
86	[4],
87	[!!1],
88];
89
90@t = ();
91eval q{
92	use XS::APItest qw(arraylistexpr);
93	no warnings "void";
94	push @t, arraylistexpr 1+2;
95	push @t, arraylistexpr 0 || 2;
96	push @t, arraylistexpr 1 || 2;
97	push @t, arraylistexpr 0 || 2, 3;
98	push @t, arraylistexpr 1 || 2, 3;
99	push @t, arraylistexpr 1, 2;
100	push @t, arraylistexpr 0 or 2;
101	push @t, arraylistexpr 1 or 2;
102	push @t, arraylistexpr 0 or 2, 3;
103	push @t, arraylistexpr 1 or 2, 3;
104	{ push @t, arraylistexpr 1, 2 }
105	push @t, (arraylistexpr 1, 2), 3;
106	push @t, arraylistexpr do { 1; 1 }, 2;
107	push @t, arraylistexpr 3, 4 if 1;
108	push @t, arraylistexpr 5, 6 if 0;
109	push @t, arraylistexpr (7, 8), 9;
110	push @t, arraylistexpr a => "b";
111	push @t, arraylistexpr 1 ? reverse 2, 3 : 4, 5;
112	push @t, arraylistexpr 0 ? reverse 2, 3 : 4, 5;
113	push @t, 1 ? reverse arraylistexpr 2, 3 : 4, 5;
114	push @t, 0 ? reverse arraylistexpr 2, 3 : 4, 5;
115	push @t, arraylistexpr reverse 1, 2, 3;
116	push @t, sub { arraylistexpr return 1, 2, 3 }->();
117	push @t, arraylistexpr myneg 1, 2, 3;
118	push @t, arraylistexpr map { -$_ } 1, 2, 3;
119	push @t, arraylistexpr mymap { -$_[0] } 1, 2, 3;
120	push @t, arraylistexpr AA->listmeth(1, 2), 3;
121	push @t, arraylistexpr listmeth AA (1, 2), 3;
122	push @t, arraylistexpr listmeth AA 1, 2, 3;
123	push @t, arraylistexpr not 1, 2;
124	push @t, arraylistexpr reverse 6, 7, 8 or 9;
125	push @t, arraylistexpr reverse 6, 7, 8 and 9;
126	push @t, arraylistexpr 1 << 2;
127	push @t, arraylistexpr 7 < 8;
128};
129is $@, "";
130is_deeply \@t, [
131	[3],
132	[2],
133	[1],
134	[2,3],
135	[1,3],
136	[1,2],
137	[0],
138	[1],
139	[0],
140	[1],
141	[1,2],
142	[1,2], 3,
143	[1,2],
144	[3,4],
145	[7,8,9],
146	["a","b"],
147	[3,2,5],
148	[4,5],
149	[2,3], 5,
150	4, 5,
151	[3,2,1],
152	1, 2, 3,
153	[-1,-2,-3],
154	[-1,-2,-3],
155	[-1,-2,-3],
156	[-1,-2,3],
157	[-1,-2,3],
158	[-1,-2,-3],
159	[!1],
160	[8,7,6],
161	[8,7,6],
162	[4],
163	[!!1],
164];
165
166@t = ();
167eval q{
168	use XS::APItest qw(arraytermexpr);
169	no warnings "void";
170	push @t, arraytermexpr 1+2;
171	push @t, arraytermexpr 0 || 2;
172	push @t, arraytermexpr 1 || 2;
173	push @t, arraytermexpr 0 || 2, 3;
174	push @t, arraytermexpr 1 || 2, 3;
175	push @t, arraytermexpr 1, 2;
176	push @t, arraytermexpr 0 or 2;
177	push @t, arraytermexpr 1 or 2;
178	push @t, arraytermexpr 0 or 2, 3;
179	push @t, arraytermexpr 1 or 2, 3;
180	{ push @t, arraytermexpr 1 }
181	push @t, (arraytermexpr 1, 2), 3;
182	push @t, arraytermexpr do { 1; 1 }, 2;
183	push @t, arraytermexpr 3, 4 if 1;
184	push @t, arraytermexpr 5, 6 if 0;
185	push @t, arraytermexpr (7, 8), 9;
186	push @t, arraytermexpr a => "b";
187	push @t, arraytermexpr 1 ? reverse 2, 3 : 4, 5;
188	push @t, arraytermexpr 0 ? reverse 2, 3 : 4, 5;
189	push @t, 1 ? reverse arraytermexpr 2, 3 : 4, 5;
190	push @t, 0 ? reverse arraytermexpr 2, 3 : 4, 5;
191	push @t, arraytermexpr reverse 1, 2, 3;
192	push @t, sub { arraytermexpr return 1, 2, 3 }->();
193	push @t, arraytermexpr myneg 1, 2, 3;
194	push @t, arraytermexpr map { -$_ } 1, 2, 3;
195	push @t, arraytermexpr mymap { -$_[0] } 1, 2, 3;
196	push @t, arraytermexpr AA->listmeth(1, 2), 3;
197	push @t, arraytermexpr listmeth AA (1, 2), 3;
198	push @t, arraytermexpr listmeth AA 1, 2, 3;
199	push @t, arraytermexpr not 1, 2;
200	push @t, arraytermexpr reverse 6, 7, 8 or 9;
201	push @t, arraytermexpr reverse 6, 7, 8 and 9;
202	push @t, arraytermexpr 1 << 2;
203	push @t, arraytermexpr 7 < 8;
204};
205is $@, "";
206is_deeply \@t, [
207	[3],
208	[2],
209	[1],
210	[2], 3,
211	[1], 3,
212	[1], 2,
213	[0],
214	[1],
215	[0],
216	[1],
217	[1],
218	[1], 2, 3,
219	[1], 2,
220	[3], 4,
221	[7,8], 9,
222	["a"], "b",
223	[3,2], 5,
224	[4], 5,
225	3, [2], 5,
226	4, 5,
227	[3,2,1],
228	1, 2, 3,
229	[-1,-2,-3],
230	[-1,-2,-3],
231	[-1,-2,-3],
232	[-1,-2], 3,
233	[-1,-2], 3,
234	[-1,-2,-3],
235	[!1],
236	[8,7,6],
237	[8,7,6],
238	[4],
239	[!!1],
240];
241
242@t = ();
243eval q{
244	use XS::APItest qw(arrayarithexpr);
245	no warnings "void";
246	push @t, arrayarithexpr 1+2;
247	push @t, arrayarithexpr 0 || 2;
248	push @t, arrayarithexpr 1 || 2;
249	push @t, arrayarithexpr 0 || 2, 3;
250	push @t, arrayarithexpr 1 || 2, 3;
251	push @t, arrayarithexpr 1, 2;
252	push @t, arrayarithexpr 0 or 2;
253	push @t, arrayarithexpr 1 or 2;
254	push @t, arrayarithexpr 0 or 2, 3;
255	push @t, arrayarithexpr 1 or 2, 3;
256	{ push @t, arrayarithexpr 1 }
257	push @t, (arrayarithexpr 1, 2), 3;
258	push @t, arrayarithexpr do { 1; 1 }, 2;
259	push @t, arrayarithexpr 3, 4 if 1;
260	push @t, arrayarithexpr 5, 6 if 0;
261	push @t, arrayarithexpr (7, 8), 9;
262	push @t, arrayarithexpr a => "b";
263	push @t, arrayarithexpr 1 ? reverse 2, 3 : 4, 5;
264	push @t, arrayarithexpr 0 ? reverse 2, 3 : 4, 5;
265	push @t, 1 ? reverse arrayarithexpr 2, 3 : 4, 5;
266	push @t, 0 ? reverse arrayarithexpr 2, 3 : 4, 5;
267	push @t, arrayarithexpr reverse 1, 2, 3;
268	push @t, sub { arrayarithexpr return 1, 2, 3 }->();
269	push @t, arrayarithexpr myneg 1, 2, 3;
270	push @t, arrayarithexpr map { -$_ } 1, 2, 3;
271	push @t, arrayarithexpr mymap { -$_[0] } 1, 2, 3;
272	push @t, arrayarithexpr AA->listmeth(1, 2), 3;
273	push @t, arrayarithexpr listmeth AA (1, 2), 3;
274	push @t, arrayarithexpr listmeth AA 1, 2, 3;
275	push @t, arrayarithexpr not 1, 2;
276	push @t, arrayarithexpr reverse 6, 7, 8 or 9;
277	push @t, arrayarithexpr reverse 6, 7, 8 and 9;
278	push @t, arrayarithexpr 1 << 2;
279	push @t, arrayarithexpr 7 < 8;
280};
281is $@, "";
282is_deeply \@t, [
283	[3],
284	[0],
285	[1],
286	[0], 3,
287	[1], 3,
288	[1], 2,
289	[0],
290	[1],
291	[0],
292	[1],
293	[1],
294	[1], 2, 3,
295	[1], 2,
296	[3], 4,
297	[7,8], 9,
298	["a"], "b",
299	3, 2, 5,
300	3, 2, 5,
301	3, [2], 5,
302	4, 5,
303	[3,2,1],
304	1, 2, 3,
305	[-1,-2,-3],
306	[-1,-2,-3],
307	[-1,-2,-3],
308	[-1,-2], 3,
309	[-1,-2], 3,
310	[-1,-2,-3],
311	[!1],
312	[8,7,6],
313	[8,7,6],
314	[4],
315	!!0,
316];
317
318@t = ();
319eval q{
320	use XS::APItest qw(arrayexprflags);
321	push @t, arrayexprflags! 1, 2;
322};
323is $@, "";
324is_deeply \@t, [ [1,2] ];
325
326@t = ();
327eval q{
328	use XS::APItest qw(arrayexprflags);
329	push @t, arrayexprflags? 1, 2;
330};
331is $@, "";
332is_deeply \@t, [ [1,2] ];
333
334@t = ();
335eval q{
336	use XS::APItest qw(arrayexprflags);
337	push @t, arrayexprflags! [);
338};
339like $@, qr/\A(?:Parse|syntax) error/;
340is_deeply \@t, [];
341
342@t = ();
343eval q{
344	use XS::APItest qw(arrayexprflags);
345	push @t, arrayexprflags? [);
346};
347like $@, qr/\A(?:Parse|syntax) error/;
348is_deeply \@t, [];
349
350@t = ();
351eval q{
352	use XS::APItest qw(arrayexprflags);
353	push @t, arrayexprflags! ;
354};
355like $@, qr/\A(?:Parse|syntax) error/;
356is_deeply \@t, [];
357
358@t = ();
359eval q{
360	use XS::APItest qw(arrayexprflags);
361	push @t, arrayexprflags? ;
362};
363is $@, "";
364is_deeply \@t, [ {} ];
365
3661;
367