r - format_print_test.go
1 package r
2
3 import (
4 "fmt"
5 "strings"
6 "testing"
7
8 "vimagination.zapto.org/parser"
9 )
10
11 func TestPrintSource(t *testing.T) {
12 for n, test := range [...][3]string{
13 { // 1
14 "a+b",
15 "a+b\n",
16 "a + b\n",
17 },
18 { // 2
19 "a-b",
20 "a-b\n",
21 "a - b\n",
22 },
23 { // 3
24 "a + b-c",
25 "a+b-c\n",
26 "a + b - c\n",
27 },
28 { // 4
29 "a&b",
30 "a&b\n",
31 "a & b\n",
32 },
33 { // 5
34 "a&&b",
35 "a&&b\n",
36 "a && b\n",
37 },
38 { // 6
39 "a & b&&c",
40 "a&b&&c\n",
41 "a & b && c\n",
42 },
43 { // 7
44 "a(b)",
45 "a(b)\n",
46 "a(b)\n",
47 },
48 { // 8
49 "a ( ... )",
50 "a(...)\n",
51 "a(...)\n",
52 },
53 { // 9
54 "a(..1)",
55 "a(..1)\n",
56 "a(..1)\n",
57 },
58 { // 10
59 "a(,b)",
60 "a(,b)\n",
61 "a(, b)\n",
62 },
63 { // 11
64 "a()",
65 "a()\n",
66 "a()\n",
67 },
68 { // 12
69 "a(b,c)",
70 "a(b,c)\n",
71 "a(b, c)\n",
72 },
73 { // 13
74 "function(a) b",
75 "function(a)b\n",
76 "function(a) b\n",
77 },
78 { // 14
79 "function(a,b) b",
80 "function(a,b)b\n",
81 "function(a, b) b\n",
82 },
83 { // 15
84 "function(a = b) c",
85 "function(a=b)c\n",
86 "function(a = b) c\n",
87 },
88 { // 16
89 "a=b",
90 "a=b\n",
91 "a = b\n",
92 },
93 { // 17
94 "a<-b",
95 "a<-b\n",
96 "a <- b\n",
97 },
98 { // 18
99 "a<<-b",
100 "a<<-b\n",
101 "a <<- b\n",
102 },
103 { // 19
104 "a->b",
105 "a->b\n",
106 "a -> b\n",
107 },
108 { // 20
109 "a->>b",
110 "a->>b\n",
111 "a ->> b\n",
112 },
113 { // 21
114 "{}",
115 "{}\n",
116 "{}\n",
117 },
118 { // 22
119 "{a}",
120 "{\n\ta\n}\n",
121 "{\n\ta\n}\n",
122 },
123 { // 23
124 "{a;b}",
125 "{\n\ta\n\tb\n}\n",
126 "{\n\ta\n\tb\n}\n",
127 },
128 { // 24
129 "a^b",
130 "a^b\n",
131 "a^b\n",
132 },
133 { // 25
134 "a;b",
135 "a\nb\n",
136 "a\nb\n",
137 },
138 { // 26
139 "a\nb",
140 "a\nb\n",
141 "a\nb\n",
142 },
143 { // 27
144 "for(a in b) c",
145 "for(a in b)c\n",
146 "for (a in b) c\n",
147 },
148 { // 28
149 "~a",
150 "~a\n",
151 "~ a\n",
152 },
153 { // 29
154 "a~b",
155 "a~b\n",
156 "a ~ b\n",
157 },
158 { // 30
159 "if(a)b",
160 "if(a)b\n",
161 "if (a) b\n",
162 },
163 { // 31
164 "if(a)b else c",
165 "if(a)b else c\n",
166 "if (a) b else c\n",
167 },
168 { // 32
169 "a[0]",
170 "a[0]\n",
171 "a[0]\n",
172 },
173 { // 33
174 "a[b,c]",
175 "a[b,c]\n",
176 "a[b, c]\n",
177 },
178 { // 34
179 "a[[0]]",
180 "a[[0]]\n",
181 "a[[0]]\n",
182 },
183 { // 35
184 "a*b",
185 "a*b\n",
186 "a * b\n",
187 },
188 { // 36
189 "a/b",
190 "a/b\n",
191 "a / b\n",
192 },
193 { // 37
194 "a * b/c",
195 "a*b/c\n",
196 "a * b / c\n",
197 },
198 { // 38
199 "!a",
200 "!a\n",
201 "!a\n",
202 },
203 { // 39
204 "!!!!a",
205 "!!!!a\n",
206 "!!!!a\n",
207 },
208 { // 40
209 "a|b",
210 "a|b\n",
211 "a | b\n",
212 },
213 { // 41
214 "a||b",
215 "a||b\n",
216 "a || b\n",
217 },
218 { // 42
219 "a | b||c",
220 "a|b||c\n",
221 "a | b || c\n",
222 },
223 { // 43
224 "a|>b",
225 "a|>b\n",
226 "a |> b\n",
227 },
228 { // 44
229 "a%%b",
230 "a%%b\n",
231 "a %% b\n",
232 },
233 { // 45
234 "a%b%c",
235 "a%b%c\n",
236 "a %b% c\n",
237 },
238 { // 46
239 "a?b",
240 "a?b\n",
241 "a ? b\n",
242 },
243 { // 47
244 "a??b",
245 "a??b\n",
246 "a ?? b\n",
247 },
248 { // 48
249 "?a",
250 "?a\n",
251 "? a\n",
252 },
253 { // 49
254 "??a",
255 "??a\n",
256 "?? a\n",
257 },
258 { // 50
259 "???a",
260 "???a\n",
261 "??? a\n",
262 },
263 { // 51
264 "a>b",
265 "a>b\n",
266 "a > b\n",
267 },
268 { // 52
269 "a>=b",
270 "a>=b\n",
271 "a >= b\n",
272 },
273 { // 53
274 "a<b",
275 "a<b\n",
276 "a < b\n",
277 },
278 { // 54
279 "a<=b",
280 "a<=b\n",
281 "a <= b\n",
282 },
283 { // 55
284 "a==b",
285 "a==b\n",
286 "a == b\n",
287 },
288 { // 56
289 "a!=b",
290 "a!=b\n",
291 "a != b\n",
292 },
293 { // 57
294 "repeat a",
295 "repeat a\n",
296 "repeat a\n",
297 },
298 { // 58
299 "a::b",
300 "a::b\n",
301 "a::b\n",
302 },
303 { // 59
304 "a:b",
305 "a:b\n",
306 "a:b\n",
307 },
308 { // 60
309 "...",
310 "...\n",
311 "...\n",
312 },
313 { // 61
314 "..1",
315 "..1\n",
316 "..1\n",
317 },
318 { // 62
319 "(a)",
320 "(a)\n",
321 "(a)\n",
322 },
323 { // 63
324 "(a + b) * c",
325 "(a+b)*c\n",
326 "(a + b) * c\n",
327 },
328 { // 64
329 "a$b",
330 "a$b\n",
331 "a$b\n",
332 },
333 { // 65
334 "a@b",
335 "a@b\n",
336 "a@b\n",
337 },
338 { // 66
339 "+a",
340 "+a\n",
341 "+a\n",
342 },
343 { // 67
344 "-a",
345 "-a\n",
346 "-a\n",
347 },
348 { // 68
349 "while(a)b",
350 "while(a)b\n",
351 "while (a) b\n",
352 },
353 { // 69
354 "# abc\na",
355 "a\n",
356 "# abc\na\n",
357 },
358 { // 70
359 "# abc\n# def\na",
360 "a\n",
361 "# abc\n# def\na\n",
362 },
363 { // 71
364 "# abc\n# def\na\n#ghi\nb",
365 "a\nb\n",
366 "# abc\n# def\na\n#ghi\nb\n",
367 },
368 { // 72
369 "# abc\na #ghi",
370 "a\n",
371 "# abc\na #ghi\n",
372 },
373 { // 73
374 "# abc\n\n\n# def\na #ghi",
375 "a\n",
376 "# abc\n\n# def\na #ghi\n",
377 },
378 { // 74
379 "# abc\n\n\n# def\na #ghi\n\n#123",
380 "a\n",
381 "# abc\n\n# def\na #ghi\n\n#123\n",
382 },
383 { // 75
384 "{\n# abc\n\t# def\na #ghi\n\n#123\n}",
385 "{\n\ta\n}\n",
386 "{\n\t# abc\n\t# def\n\ta #ghi\n\n\t#123\n}\n",
387 },
388 { // 76
389 "(a\n#abc\n)",
390 "(a)\n",
391 "(a #abc\n)\n",
392 },
393 { // 77
394 "(a #abc\n#def\n\n#ghi\n)",
395 "(a)\n",
396 "(a #abc\n#def\n\n#ghi\n)\n",
397 },
398 { // 78
399 "a(b#a comment\n)",
400 "a(b)\n",
401 "a(b #a comment\n)\n",
402 },
403 { // 79
404 "a(#abc\nb#def\n#ghi\n\n#jkl\n)",
405 "a(b)\n",
406 "a(#abc\nb #def\n#ghi\n\n#jkl\n)\n",
407 },
408 { // 80
409 "a(#abc\nb#def\n,#ghi\nc\n#jkl\n)",
410 "a(b,c)\n",
411 "a(#abc\nb #def\n, #ghi\nc #jkl\n)\n",
412 },
413 { // 81
414 "a(#abc\n)",
415 "a()\n",
416 "a(\n\t#abc\n)\n",
417 },
418 { // 82
419 "function (#abc\n)a",
420 "function()a\n",
421 "function(\n\t#abc\n) a\n",
422 },
423 { // 83
424 "function (#abc\na #def\n, #ghi\nb #jkl\n)c",
425 "function(a,b)c\n",
426 "function(#abc\n\ta #def\n\t, #ghi\n\tb #jkl\n) c\n",
427 },
428 { // 84
429 "function (#abc\na#def\n=b)c",
430 "function(a=b)c\n",
431 "function(#abc\n\ta #def\n\t= b) c\n",
432 },
433 { // 85
434 "function #abc\n()a",
435 "function()a\n",
436 "function #abc\n() a\n",
437 },
438 { // 86
439 "if#abc\n(#def\na#ghi\n)#jkl\nb",
440 "if(a)b\n",
441 "if #abc\n(#def\n\ta#ghi\n) #jkl\nb\n",
442 },
443 { // 87
444 "if#abc\n(#def\na#ghi\n)#jkl\nb#mno\n\n#pqr\nelse#stu\nc#vwx",
445 "if(a)b else c\n",
446 "if #abc\n(#def\n\ta#ghi\n) #jkl\nb #mno\n\n#pqr\nelse #stu\nc #vwx\n",
447 },
448 { // 88
449 "while#abc\n(#def\na#ghi\n)#jkl\nb#mno",
450 "while(a)b\n",
451 "while #abc\n(#def\n\ta #ghi\n) #jkl\nb #mno\n",
452 },
453 { // 89
454 "for#abc\n(#def\na#ghi\nin#jkl\nb#mno\n)#pqr\nc#stu",
455 "for(a in b)c\n",
456 "for #abc\n(#def\n\ta #ghi\n\tin #jkl\n\tb #mno\n) #pqr\nc #stu\n",
457 },
458 { // 90
459 "repeat#abc\na#def",
460 "repeat a\n",
461 "repeat #abc\na #def\n",
462 },
463 { // 91
464 "?#abc\na",
465 "?a\n",
466 "? #abc\na\n",
467 },
468 { // 92
469 "a?#abc\nb",
470 "a?b\n",
471 "a ? #abc\nb\n",
472 },
473 { // 93
474 "(a#abc\n?#def\nb)",
475 "(a?b)\n",
476 "(a #abc\n? #def\nb)\n",
477 },
478 { // 94
479 "a=#abc\nb",
480 "a=b\n",
481 "a = #abc\nb\n",
482 },
483 { // 95
484 "(a#abc\n=#def\nb)",
485 "(a=b)\n",
486 "(a #abc\n= #def\nb)\n",
487 },
488 { // 96
489 "~#abc\na",
490 "~a\n",
491 "~ #abc\na\n",
492 },
493 { // 97
494 "a|#abc\nb",
495 "a|b\n",
496 "a | #abc\nb\n",
497 },
498 { // 98
499 "(a#abc\n|#def\nb)",
500 "(a|b)\n",
501 "(a #abc\n| #def\nb)\n",
502 },
503 { // 99
504 "a&#abc\nb",
505 "a&b\n",
506 "a & #abc\nb\n",
507 },
508 { // 100
509 "(a#abc\n&#def\nb)",
510 "(a&b)\n",
511 "(a #abc\n& #def\nb)\n",
512 },
513 { // 101
514 "!#abc\na",
515 "!a\n",
516 "! #abc\na\n",
517 },
518 { // 102
519 "!!#abc\na",
520 "!!a\n",
521 "!! #abc\na\n",
522 },
523 { // 103
524 "!#abc\n!a",
525 "!!a\n",
526 "! #abc\n!a\n",
527 },
528 { // 104
529 "!#abc\n!#def\na",
530 "!!a\n",
531 "! #abc\n! #def\na\n",
532 },
533 { // 105
534 "a>#abc\nb",
535 "a>b\n",
536 "a > #abc\nb\n",
537 },
538 { // 106
539 "(a#abc\n>#def\nb)",
540 "(a>b)\n",
541 "(a #abc\n> #def\nb)\n",
542 },
543 { // 107
544 "a+#abc\nb",
545 "a+b\n",
546 "a + #abc\nb\n",
547 },
548 { // 108
549 "(a#abc\n+#def\nb)",
550 "(a+b)\n",
551 "(a #abc\n+ #def\nb)\n",
552 },
553 { // 109
554 "a*#abc\nb",
555 "a*b\n",
556 "a * #abc\nb\n",
557 },
558 { // 110
559 "(a#abc\n*#def\nb)",
560 "(a*b)\n",
561 "(a #abc\n* #def\nb)\n",
562 },
563 { // 111
564 "a|>#abc\nb",
565 "a|>b\n",
566 "a |> #abc\nb\n",
567 },
568 { // 112
569 "(a#abc\n|>#def\nb)",
570 "(a|>b)\n",
571 "(a #abc\n|> #def\nb)\n",
572 },
573 { // 113
574 "a:#abc\nb",
575 "a:b\n",
576 "a: #abc\nb\n",
577 },
578 { // 114
579 "(a#abc\n:#def\nb)",
580 "(a:b)\n",
581 "(a #abc\n: #def\nb)\n",
582 },
583 { // 115
584 "+#abc\na",
585 "+a\n",
586 "+ #abc\na\n",
587 },
588 { // 116
589 "+#abc\n-#def\na",
590 "+-a\n",
591 "+ #abc\n- #def\na\n",
592 },
593 { // 117
594 "a^#abc\nb",
595 "a^b\n",
596 "a^ #abc\nb\n",
597 },
598 { // 118
599 "(a#abc\n^#def\nb)",
600 "(a^b)\n",
601 "(a #abc\n^ #def\nb)\n",
602 },
603 { // 119
604 "a$#abc\nb",
605 "a$b\n",
606 "a$ #abc\nb\n",
607 },
608 { // 120
609 "(a#abc\n$#def\nb)",
610 "(a$b)\n",
611 "(a #abc\n$ #def\nb)\n",
612 },
613 { // 121
614 "a::#abc\nb",
615 "a::b\n",
616 "a:: #abc\nb\n",
617 },
618 { // 122
619 "(a#abc\n::#def\nb)",
620 "(a::b)\n",
621 "(a #abc\n:: #def\nb)\n",
622 },
623 { // 123
624 "(a#abc\n[b])",
625 "(a[b])\n",
626 "(a #abc\n[b])\n",
627 },
628 { // 124
629 "a[ #abc\n#def\nb #ghi\n\n#jkl\n, c #mno\n]",
630 "a[b,c]\n",
631 "a[#abc\n#def\nb #ghi\n\n#jkl\n, c #mno\n]\n",
632 },
633 } {
634 for m, input := range test {
635 tk := parser.NewStringTokeniser(input)
636
637 if f, err := Parse(&tk); err != nil {
638 t.Errorf("test %d.%d: unexpected error: %s", n+1, m+1, err)
639 } else if simple := fmt.Sprintf("%s", f); simple != test[1] {
640 t.Errorf("test %d.%d.1: expecting output %q, got %q", n+1, m+1, test[1], simple)
641 } else if verbose := fmt.Sprintf("%+s", f); verbose != test[2] && (m != 1 || !strings.ContainsRune(test[0], '#')) {
642 t.Errorf("test %d.%d.2: expecting output %q, got %q", n+1, m+1, test[2], verbose)
643 }
644 }
645 }
646 }
647