livetext 0.9.25 → 0.9.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/imports/bookish.rb +1 -2
  3. data/lib/livetext/errors.rb +3 -0
  4. data/lib/livetext/formatline.rb +102 -15
  5. data/lib/livetext/funcall.rb +86 -2
  6. data/lib/livetext/global_helpers.rb +5 -0
  7. data/lib/livetext/handler/import.rb +2 -6
  8. data/lib/livetext/handler/mixin.rb +2 -6
  9. data/lib/livetext/helpers.rb +9 -11
  10. data/lib/livetext/lineparser.rb +441 -0
  11. data/lib/livetext/more.rb +158 -0
  12. data/lib/livetext/processor.rb +3 -1
  13. data/lib/livetext/skeleton.rb +5 -0
  14. data/lib/livetext/standard.rb +12 -8
  15. data/lib/livetext/userapi.rb +27 -10
  16. data/lib/livetext/version.rb +1 -1
  17. data/lib/livetext.rb +3 -152
  18. data/test/snapshots/basic_formatting/actual-error.txt +0 -0
  19. data/test/snapshots/basic_formatting/actual-output.txt +13 -0
  20. data/test/snapshots/basic_formatting/err-sdiff.txt +1 -0
  21. data/test/snapshots/basic_formatting/out-sdiff.txt +14 -0
  22. data/test/snapshots/error_invalid_name/foo +5 -0
  23. data/test/snapshots/import_bookish/expected-output.txt +4 -4
  24. data/test/snapshots/more_functions/actual-error.txt +0 -0
  25. data/test/snapshots/more_functions/actual-output.txt +37 -0
  26. data/test/snapshots/more_functions/err-sdiff.txt +1 -0
  27. data/test/snapshots/more_functions/expected-output.txt +1 -1
  28. data/test/snapshots/more_functions/out-sdiff.txt +38 -0
  29. data/test/snapshots/more_functions/source.lt3 +1 -1
  30. data/test/snapshots/simple_vars/actual-error.txt +0 -0
  31. data/test/snapshots/simple_vars/actual-output.txt +6 -0
  32. data/test/snapshots/simple_vars/err-sdiff.txt +1 -0
  33. data/test/snapshots/simple_vars/out-sdiff.txt +7 -0
  34. data/test/snapshots/subset.txt +2 -0
  35. data/test/snapshots/var_into_func/actual-error.txt +0 -0
  36. data/test/snapshots/var_into_func/actual-output.txt +16 -0
  37. data/test/snapshots/var_into_func/err-sdiff.txt +1 -0
  38. data/test/snapshots/var_into_func/expected-error.txt +0 -0
  39. data/test/snapshots/var_into_func/expected-output.txt +16 -0
  40. data/test/snapshots/var_into_func/out-sdiff.txt +17 -0
  41. data/test/snapshots/var_into_func/source.lt3 +16 -0
  42. data/test/unit/all.rb +3 -1
  43. data/test/unit/formatline.rb +143 -274
  44. data/test/unit/lineparser.rb +650 -0
  45. data/test/unit/parser/set.rb +13 -12
  46. data/test/unit/tokenizer.rb +534 -0
  47. metadata +26 -5
  48. data/test/snapshots/error_inc_line_num/OUT +0 -17
  49. data/test/snapshots/error_no_such_copy/duh +0 -26
  50. data/test/snapshots/error_no_such_copy/mystery.txt +0 -36
@@ -0,0 +1,650 @@
1
+ require 'minitest/autorun'
2
+
3
+ require_relative '../../lib/livetext'
4
+
5
+ class TestingLivetext < MiniTest::Test
6
+
7
+ LineParser = Livetext::LineParser
8
+
9
+ def perform_test(recv, sym, msg, src, exp)
10
+ actual = recv.send(sym, src)
11
+ if exp[0] == "/"
12
+ exp = Regexp.compile(exp[1..-2]) # skip slashes
13
+ $testme = false
14
+ assert_match(exp, actual, msg)
15
+ else
16
+ $testme = false
17
+ assert_equal(exp, actual, msg)
18
+ end
19
+ end
20
+
21
+ def invoke_test(msg, src, exp)
22
+ actual = LineParser.parse!(src)
23
+ if exp[0] == "/"
24
+ exp = Regexp.compile(exp[1..-2]) # skip slashes
25
+ $testme = false
26
+ assert_match(exp, actual, msg)
27
+ else
28
+ $testme = false
29
+ assert_equal(exp, actual, msg)
30
+ end
31
+ end
32
+
33
+ # Some (most) methods were generated via the code
34
+ # seen in the comment at the bottom of this file...
35
+
36
+ def test_simple_string
37
+ parse = LineParser.new("only testing")
38
+ tokens = parse.tokenize
39
+ assert_equal tokens, [[:str, "only testing"]], "Tokens were: #{tokens.inspect}"
40
+ expected = "only testing"
41
+ result = parse.evaluate
42
+ assert_equal expected, result
43
+ end
44
+
45
+ def test_variable_interpolation
46
+ $testme = true
47
+ parse = LineParser.new("File is $File and user is $User")
48
+ tokens = parse.tokenize
49
+ expected_tokens = [[:str, "File is "],
50
+ [:var, "File"],
51
+ [:str, " and user is "],
52
+ [:var, "User"]]
53
+ assert_equal expected_tokens, tokens
54
+ result = parse.evaluate
55
+ expected = "File is [File is undefined] and user is Hal" # FIXME
56
+ assert_equal expected, result
57
+ $testme = false
58
+ end
59
+
60
+ def test_func_expansion
61
+ parse = LineParser.new("myfunc() results in $$myfunc apparently.")
62
+ tokens = parse.tokenize
63
+ expected_tokens = [[:str, "myfunc() results in "],
64
+ [:func, "myfunc"],
65
+ [:str, " apparently."]]
66
+ assert_equal expected_tokens, tokens
67
+ result = parse.evaluate
68
+ expected = "myfunc() results in [Error evaluating $$myfunc()] apparently."
69
+ assert_equal expected, result
70
+ end
71
+
72
+ # These tests follow this form:
73
+ #
74
+ # def test_func_SUFFIX
75
+ # str = "WHATEVER"
76
+ # parse = LineParser.new(str)
77
+ # tokens_expected = [[], [], ...]
78
+ # tokens = parse.tokenize
79
+ # assert_equal tokens_expected, tokens
80
+ # result = parse.evaluate
81
+ # regex_expected = /Today is ....-..-../
82
+ # assert_match regex_expected, result, "Found unexpected: #{result.inspect}"
83
+ # end
84
+
85
+ def test_func_2
86
+ str = "Today is $$date"
87
+ parse = LineParser.new(str)
88
+ tokens_expected = [[:str, "Today is "], [:func, "date"]]
89
+ tokens = parse.tokenize
90
+ assert_equal tokens_expected, tokens, "Tokens were: #{tokens.inspect}"
91
+ result = parse.evaluate
92
+ regex_expected = /Today is ....-..-../
93
+ assert_match regex_expected, result, "Found unexpected: #{result.inspect}"
94
+ end
95
+
96
+ def test_var_before_comma
97
+ str = "User name is $User, and all is well"
98
+ parse = LineParser.new(str)
99
+ tokens_expected = [[:str, "User name is "], [:var, "User"], [:str, ", and all is well"]]
100
+ tokens = parse.tokenize
101
+ assert_equal tokens_expected, tokens, "Tokens were: #{tokens.inspect}"
102
+ result = parse.evaluate
103
+ regex_expected = /User name is .*, /
104
+ assert_match regex_expected, result, "Found unexpected: #{result.inspect}"
105
+ end
106
+
107
+ def test_var_at_EOS
108
+ str = "File name is $File"
109
+ parse = LineParser.new(str)
110
+ tokens_expected = [[:str, "File name is "], [:var, "File"]]
111
+ tokens = parse.tokenize
112
+ assert_equal tokens_expected, tokens
113
+ result = parse.evaluate
114
+ string_expected = "File name is [File is undefined]"
115
+ assert_equal string_expected, result, "Found unexpected: #{result.inspect}"
116
+ end
117
+
118
+ def test_var_starts_string
119
+ str = "$File is my file name"
120
+ parse = LineParser.new(str)
121
+ tokens_expected = [[:var, "File"], [:str, " is my file name"]]
122
+ tokens = parse.tokenize
123
+ assert_equal tokens_expected, tokens
124
+ result = parse.evaluate
125
+ string_expected = "[File is undefined] is my file name"
126
+ assert_equal string_expected, result, "Found unexpected: #{result.inspect}"
127
+ end
128
+
129
+ # Next one is/will be a problem...
130
+ # I permit periods *inside* variable names
131
+
132
+ def test_var_before_period
133
+ str = "This is $File\\." # FIXME escaped for now...
134
+ parse = LineParser.new(str)
135
+ tokens_expected = [[:str, "This is "], [:var, "File"], [:str, "."]]
136
+ tokens = parse.tokenize
137
+ assert_equal tokens_expected, tokens
138
+ result = parse.evaluate
139
+ string_expected = "This is [File is undefined]."
140
+ assert_equal string_expected, result, "Found unexpected: #{result.inspect}"
141
+ end
142
+
143
+ def test_func_needing_parameter_colon_eos # colon, param, EOS
144
+ str = "Square root of 225 is $$isqrt:225"
145
+ parse = LineParser.new(str)
146
+ tokens_expected = [[:str, "Square root of 225 is "], [:func, "isqrt"], [:colon, "225"]]
147
+ tokens = parse.tokenize
148
+ assert_equal tokens_expected, tokens
149
+ result = parse.evaluate
150
+ string_expected = "Square root of 225 is 15"
151
+ assert_equal string_expected, result, "Found unexpected: #{result.inspect}"
152
+ end
153
+
154
+ def test_func_needing_parameter_colon # colon, param, more chars
155
+ str = "Answer is $$isqrt:225 today"
156
+ parse = LineParser.new(str)
157
+ tokens_expected = [[:str, "Answer is "],
158
+ [:func, "isqrt"],
159
+ [:colon, "225"],
160
+ [:str, " today"]]
161
+ tokens = parse.tokenize
162
+ assert_equal tokens_expected, tokens
163
+ result = parse.evaluate
164
+ string_expected = "Answer is 15 today"
165
+ assert_equal string_expected, result, "Found unexpected: #{result.inspect}"
166
+ end
167
+
168
+ # isqrt: Not real tests??
169
+
170
+ def test_isqrt_empty_colon_param
171
+ str = "Calculate $$isqrt:"
172
+ parse = LineParser.new(str)
173
+ tokens_expected = [[:str, "Calculate "],
174
+ [:func, "isqrt"] # , [:colon, ""]
175
+ ]
176
+ # If param is null, we don't get [:colon, value]!
177
+ # ^ FIXME function should be more like: [:func, name, param]
178
+ tokens = parse.tokenize
179
+ assert_equal tokens_expected, tokens
180
+ result = parse.evaluate
181
+ string_expected = "Calculate [Error evaluating $$isqrt(NO PARAM)]"
182
+ assert_equal string_expected, result, "Found unexpected: #{result.inspect}"
183
+ end
184
+
185
+ def test_isqrt_empty_bracket_param
186
+ str = "Calculate $$isqrt[]"
187
+ parse = LineParser.new(str)
188
+ tokens_expected = [[:str, "Calculate "],
189
+ [:func, "isqrt"] # , [:colon, ""]
190
+ ]
191
+ # If param is null, we don't get [:colon, value]!
192
+ # ^ FIXME function should be more like: [:func, name, param]
193
+ tokens = parse.tokenize
194
+ assert_equal tokens_expected, tokens
195
+ result = parse.evaluate
196
+ string_expected = "Calculate [Error evaluating $$isqrt(NO PARAM)]"
197
+ assert_equal string_expected, result, "Found unexpected: #{result.inspect}"
198
+ end
199
+
200
+ def test_isqrt_malformed_number
201
+ str = "Calculate $$isqrt[3a5]"
202
+ parse = LineParser.new(str)
203
+ tokens_expected = [[:str, "Calculate "],
204
+ [:func, "isqrt"],
205
+ [:brackets, "3a5"]
206
+ ]
207
+ # ^ FIXME function should be more like: [:func, name, param]
208
+ tokens = parse.tokenize
209
+ assert_equal tokens_expected, tokens
210
+ result = parse.evaluate
211
+ string_expected = "Calculate [Error evaluating $$isqrt(3a5)]"
212
+ assert_equal string_expected, result, "Found unexpected: #{result.inspect}"
213
+ end
214
+
215
+ # ...end of this group
216
+
217
+ def test_func_with_colon
218
+ parse = LineParser.new("Calling $$myfunc:foo here.")
219
+ tokens = parse.tokenize
220
+ assert_equal tokens, [[:str, "Calling "],
221
+ [:func, "myfunc"],
222
+ [:colon, "foo"],
223
+ [:str, " here."]
224
+ ]
225
+ result = parse.evaluate
226
+ expected = "Calling [Error evaluating $$myfunc(foo)] here."
227
+ assert_equal expected, result
228
+ end
229
+
230
+ def test_func_with_brackets
231
+ parse = LineParser.new("Calling $$myfunc2[foo bar] here.")
232
+ tokens = parse.tokenize
233
+ assert_kind_of Array, tokens
234
+ assert_equal 4, tokens.size
235
+ expected_tokens = [[:str, "Calling "],
236
+ [:func, "myfunc2"],
237
+ [:brackets, "foo bar"],
238
+ [:str, " here."]]
239
+ assert_equal expected_tokens, tokens
240
+ result = parse.evaluate
241
+ expected = "Calling [Error evaluating $$myfunc2(foo bar)] here."
242
+ assert_equal expected, result
243
+ end
244
+
245
+ def test_parse_formatting
246
+ msg, src, exp = <<~STUFF.split("\n")
247
+ Check simple formatting
248
+ This is *bold and _italics ...
249
+ This is <b>bold</b> and <i>italics</i> ...
250
+ STUFF
251
+ invoke_test(msg, src, exp)
252
+ end
253
+
254
+ def test_formatting_01 # Check output of $$date
255
+ msg, src, exp = <<~STUFF.split("\n")
256
+ Check output of $$date
257
+ Today is $$date, I guess
258
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
259
+ STUFF
260
+ invoke_test(msg, src, exp)
261
+ end
262
+
263
+ def test_formatting_02 # Check output of $$date
264
+ msg, src, exp = <<~STUFF.split("\n")
265
+ Check output of $$date
266
+ Today is $$date, I guess
267
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
268
+ STUFF
269
+ invoke_test(msg, src, exp)
270
+ end
271
+
272
+ def test_formatting_03 # Check output of $$date
273
+ msg, src, exp = <<~STUFF.split("\n")
274
+ Check output of $$date
275
+ Today is $$date, I guess
276
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
277
+ STUFF
278
+ invoke_test(msg, src, exp)
279
+ end
280
+
281
+ def test_formatting_04 # Check output of $$date
282
+ msg, src, exp = <<~STUFF.split("\n")
283
+ Check output of $$date
284
+ Today is $$date, I guess
285
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
286
+ STUFF
287
+ invoke_test(msg, src, exp)
288
+ end
289
+
290
+ def test_formatting_05 # Check output of $$date
291
+ msg, src, exp = <<~STUFF.split("\n")
292
+ Check output of $$date
293
+ Today is $$date, I guess
294
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
295
+ STUFF
296
+ invoke_test(msg, src, exp)
297
+ end
298
+
299
+ def test_formatting_06 # Check output of $$date
300
+ msg, src, exp = <<~STUFF.split("\n")
301
+ Check output of $$date
302
+ Today is $$date, I guess
303
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
304
+ STUFF
305
+ invoke_test(msg, src, exp)
306
+
307
+ actual = LineParser.parse!(src)
308
+ if exp[0] == "/"
309
+ exp = Regexp.compile(exp[1..-2]) # skip slashes
310
+ assert_match(exp, actual, msg)
311
+ else
312
+ assert_equal(exp, actual, msg)
313
+ end
314
+ end
315
+
316
+ def test_formatting_07 # Check output of $$date
317
+ msg, src, exp = <<~STUFF.split("\n")
318
+ Check output of $$date
319
+ Today is $$date, I guess
320
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
321
+ STUFF
322
+ invoke_test(msg, src, exp)
323
+
324
+ actual = LineParser.parse!(src)
325
+ if exp[0] == "/"
326
+ exp = Regexp.compile(exp[1..-2]) # skip slashes
327
+ assert_match(exp, actual, msg)
328
+ else
329
+ assert_equal(exp, actual, msg)
330
+ end
331
+ end
332
+
333
+ def test_formatting_08 # Check output of $$date
334
+ msg, src, exp = <<~STUFF.split("\n")
335
+ Check output of $$date
336
+ Today is $$date, I guess
337
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
338
+ STUFF
339
+ invoke_test(msg, src, exp)
340
+ end
341
+
342
+ def test_formatting_09 # Check output of $$date
343
+ msg, src, exp = <<~STUFF.split("\n")
344
+ Check output of $$date
345
+ Today is $$date, I guess
346
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
347
+ STUFF
348
+ invoke_test(msg, src, exp)
349
+ end
350
+
351
+ def test_formatting_10 # Check output of $$date
352
+ msg, src, exp = <<~STUFF.split("\n")
353
+ Check output of $$date
354
+ Today is $$date, I guess
355
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
356
+ STUFF
357
+ invoke_test(msg, src, exp)
358
+ end
359
+
360
+ def test_formatting_11 # Check output of $$date
361
+ msg, src, exp = <<~STUFF.split("\n")
362
+ Check output of $$date
363
+ Today is $$date, I guess
364
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
365
+ STUFF
366
+ invoke_test(msg, src, exp)
367
+ end
368
+
369
+ def test_formatting_12 # Check output of $$date
370
+ msg, src, exp = <<~STUFF.split("\n")
371
+ Check output of $$date
372
+ Today is $$date, I guess
373
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
374
+ STUFF
375
+ invoke_test(msg, src, exp)
376
+ end
377
+
378
+ def test_formatting_13 # Check output of $$date
379
+ msg, src, exp = <<~STUFF.split("\n")
380
+ Check output of $$date
381
+ Today is $$date, I guess
382
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
383
+ STUFF
384
+ invoke_test(msg, src, exp)
385
+ end
386
+
387
+ def test_formatting_14 # Check output of $$date
388
+ msg, src, exp = <<~STUFF.split("\n")
389
+ Check output of $$date
390
+ Today is $$date, I guess
391
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
392
+ STUFF
393
+ invoke_test(msg, src, exp)
394
+ end
395
+
396
+ def test_formatting_15 # Check output of $$date
397
+ msg, src, exp = <<~STUFF.split("\n")
398
+ Check output of $$date
399
+ Today is $$date, I guess
400
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
401
+ STUFF
402
+ invoke_test(msg, src, exp)
403
+ end
404
+
405
+ def test_formatting_16 # Check output of $$date
406
+ msg, src, exp = <<~STUFF.split("\n")
407
+ Check output of $$date
408
+ Today is $$date, I guess
409
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
410
+ STUFF
411
+ invoke_test(msg, src, exp)
412
+ end
413
+
414
+ def test_formatting_17 # Check output of $$date
415
+ msg, src, exp = <<~STUFF.split("\n")
416
+ Check output of $$date
417
+ Today is $$date, I guess
418
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
419
+ STUFF
420
+ invoke_test(msg, src, exp)
421
+ end
422
+
423
+ def test_formatting_18 # Check output of $$date
424
+ msg, src, exp = <<~STUFF.split("\n")
425
+ Check output of $$date
426
+ Today is $$date, I guess
427
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
428
+ STUFF
429
+ invoke_test(msg, src, exp)
430
+ end
431
+
432
+ def test_formatting_19 # Check output of $$date
433
+ msg, src, exp = <<~STUFF.split("\n")
434
+ Check output of $$date
435
+ Today is $$date, I guess
436
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
437
+ STUFF
438
+ invoke_test(msg, src, exp)
439
+ end
440
+
441
+ def test_formatting_20 # Check output of $$date
442
+ $testme = true
443
+ msg, src, exp = <<~STUFF.split("\n")
444
+ Check output of $$date
445
+ Today is $$date, I guess
446
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
447
+ STUFF
448
+ invoke_test(msg, src, exp)
449
+ $testme = false
450
+ end
451
+
452
+ def test_formatting_21 # Check output of $$date
453
+ msg, src, exp = <<~STUFF.split("\n")
454
+ Check output of $$date
455
+ Today is $$date, I guess
456
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
457
+ STUFF
458
+ invoke_test(msg, src, exp)
459
+ end
460
+
461
+ def test_formatting_22 # Check output of $$date
462
+ msg, src, exp = <<~STUFF.split("\n")
463
+ Check output of $$date
464
+ Today is $$date, I guess
465
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
466
+ STUFF
467
+ invoke_test(msg, src, exp)
468
+ end
469
+
470
+ def test_formatting_23 # Check output of $$date
471
+ msg, src, exp = <<~STUFF.split("\n")
472
+ Check output of $$date
473
+ Today is $$date, I guess
474
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
475
+ STUFF
476
+ invoke_test(msg, src, exp)
477
+ end
478
+
479
+ def test_formatting_24 # Check output of $$date
480
+ msg, src, exp = <<~STUFF.split("\n")
481
+ Check output of $$date
482
+ Today is $$date, I guess
483
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
484
+ STUFF
485
+ invoke_test(msg, src, exp)
486
+ end
487
+
488
+ def test_formatting_25 # Check output of $$date
489
+ msg, src, exp = <<~STUFF.split("\n")
490
+ Check output of $$date
491
+ Today is $$date, I guess
492
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
493
+ STUFF
494
+ invoke_test(msg, src, exp)
495
+ end
496
+
497
+ def test_formatting_26 # Check output of $$date
498
+ msg, src, exp = <<~STUFF.split("\n")
499
+ Check output of $$date
500
+ Today is $$date, I guess
501
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
502
+ STUFF
503
+ invoke_test(msg, src, exp)
504
+ end
505
+
506
+ def test_formatting_27 # Check output of $$date
507
+ msg, src, exp = <<~STUFF.split("\n")
508
+ Check output of $$date
509
+ Today is $$date, I guess
510
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
511
+ STUFF
512
+ invoke_test(msg, src, exp)
513
+ end
514
+
515
+ def test_formatting_28 # Check output of $$date
516
+ msg, src, exp = <<~STUFF.split("\n")
517
+ Check output of $$date
518
+ Today is $$date, I guess
519
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
520
+ STUFF
521
+ invoke_test(msg, src, exp)
522
+ end
523
+
524
+ def test_formatting_29 # Check output of $$date
525
+ msg, src, exp = <<~STUFF.split("\n")
526
+ Check output of $$date
527
+ Today is $$date, I guess
528
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
529
+ STUFF
530
+ invoke_test(msg, src, exp)
531
+ end
532
+
533
+ def test_formatting_30 # Check output of $$date
534
+ msg, src, exp = <<~STUFF.split("\n")
535
+ Check output of $$date
536
+ Today is $$date, I guess
537
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
538
+ STUFF
539
+ invoke_test(msg, src, exp)
540
+ end
541
+
542
+ def test_formatting_31 # Check output of $$date
543
+ msg, src, exp = <<~STUFF.split("\n")
544
+ Check output of $$date
545
+ Today is $$date, I guess
546
+ /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
547
+ STUFF
548
+ invoke_test(msg, src, exp)
549
+ end
550
+
551
+ def test_formatting_32 # Check "real" dollar signs
552
+ msg, src, exp = <<~STUFF.split("\n")
553
+ Check "real" dollar signs
554
+ You paid $75 for that item.
555
+ You paid $75 for that item.
556
+ STUFF
557
+ invoke_test(msg, src, exp)
558
+ end
559
+
560
+ def test_formatting_33 # Check dollar-space
561
+ msg, src, exp = <<~STUFF.split("\n")
562
+ Check dollar-space
563
+ He paid $ 76 for it...
564
+ He paid $ 76 for it...
565
+ STUFF
566
+ invoke_test(msg, src, exp)
567
+ end
568
+
569
+ def test_formatting_34 # Check escaped dollar signs
570
+ msg, src, exp = <<~STUFF.split("\n")
571
+ Check escaped dollar signs
572
+ Paid \\$78 yo
573
+ Paid $78 yo
574
+ STUFF
575
+ invoke_test(msg, src, exp)
576
+ end
577
+
578
+ def test_formatting_35 # Check ignored function param (bug or feature?)
579
+ msg, src, exp = <<~STUFF.split("\n")
580
+ Check ignored function param (bug or feature?)
581
+ Today is $$date:foobar, apparently.
582
+ /Today is \\d\\d\\d\\d.\\d\\d.\\d\\d apparently./
583
+ STUFF
584
+ invoke_test(msg, src, exp)
585
+ end
586
+
587
+ def test_formatting_36 # Check ignored function bracket param (bug or feature?)
588
+ msg, src, exp = <<~STUFF.split("\n")
589
+ Check ignored function bracket param (bug or feature?)
590
+ Today is $$date[a useless parameter], apparently.
591
+ /Today is \\d\\\d\\d\\d.\\d\\d.\\d\\d, apparently./
592
+ STUFF
593
+ invoke_test(msg, src, exp)
594
+ end
595
+
596
+ end
597
+
598
+ # Test generation logic:
599
+
600
+ =begin
601
+ TestLines = []
602
+
603
+ items = []
604
+ formatting_tests = File.open("test/snapshots/formatting-tests.txt")
605
+ loop do
606
+ 4.times { items << formatting_tests.gets.chomp }
607
+ # Blank line terminates each "stanza"
608
+ raise "Oops? #{items.inspect}" unless items.last.empty?
609
+ TestLines << items
610
+ break if formatting_tests.eof?
611
+ end
612
+
613
+ STDERR.puts <<~RUBY
614
+ require 'minitest/autorun'
615
+
616
+ require_relative '../lib/livetext'
617
+
618
+ # Just another testing class. Chill.
619
+
620
+ class TestingLivetext < MiniTest::Test
621
+ RUBY
622
+
623
+ TestLines.each.with_index do |item, num|
624
+ msg, src, exp, blank = *item
625
+ # generate tests...
626
+ name = "test_formatting_#{'%02d' % (num + 1)}"
627
+ method_source = <<~RUBY
628
+ def #{name} # #{msg}
629
+ msg, src, exp = <<~STUFF.split("\\n")
630
+ #{msg}
631
+ #{src}
632
+ #{exp}
633
+ STUFF
634
+
635
+ actual = LineParser.parse!(src)
636
+ # FIXME could simplify assert logic?
637
+ if exp[0] == "/"
638
+ exp = Regexp.compile(exp[1..-2]) # skip slashes
639
+ assert_match(exp, actual, msg)
640
+ else
641
+ assert_equal(exp, actual, msg)
642
+ end
643
+ end
644
+
645
+ RUBY
646
+ STDERR.puts method_source
647
+ end
648
+ STDERR.puts "\nend"
649
+ end
650
+ =end