livetext 0.9.27 → 0.9.30

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/README.lt3 +3 -2
  3. data/lib/livetext/expansion.rb +106 -0
  4. data/lib/livetext/formatter.rb +104 -0
  5. data/lib/livetext/functions.rb +9 -0
  6. data/lib/livetext/helpers.rb +23 -18
  7. data/lib/livetext/html.rb +73 -0
  8. data/lib/livetext/more.rb +24 -4
  9. data/lib/livetext/parser/general.rb +1 -1
  10. data/lib/livetext/parser/set.rb +10 -3
  11. data/lib/livetext/processor.rb +5 -0
  12. data/lib/livetext/standard.rb +16 -6
  13. data/lib/livetext/userapi.rb +39 -16
  14. data/lib/livetext/version.rb +1 -1
  15. data/lib/livetext.rb +1 -1
  16. data/plugin/bootstrap_menu.rb +140 -0
  17. data/plugin/misc/navbar.rb +162 -0
  18. data/test/snapshots/basic_formatting/expected-output.txt +1 -2
  19. data/test/snapshots/{basic_formatting/actual-error.txt → bootstrap_menu/expected-error.txt} +0 -0
  20. data/test/snapshots/bootstrap_menu/expected-output.txt +4 -0
  21. data/test/snapshots/bootstrap_menu/source.lt3 +17 -0
  22. data/test/snapshots/subset.txt +50 -48
  23. data/test/unit/all.rb +2 -2
  24. data/test/unit/lineparser.rb +1 -1
  25. data/test/unit/parser/general.rb +2 -2
  26. data/test/unit/parser/set.rb +0 -9
  27. metadata +9 -32
  28. data/lib/livetext/funcall.rb +0 -87
  29. data/lib/livetext/lineparser.rb +0 -575
  30. data/test/snapshots/basic_formatting/actual-output.txt +0 -13
  31. data/test/snapshots/basic_formatting/err-sdiff.txt +0 -1
  32. data/test/snapshots/basic_formatting/out-sdiff.txt +0 -14
  33. data/test/snapshots/functions/actual-error.txt +0 -19
  34. data/test/snapshots/functions/actual-output.txt +0 -0
  35. data/test/snapshots/functions/err-sdiff.txt +0 -20
  36. data/test/snapshots/import_bookish/toc.tmp +0 -0
  37. data/test/snapshots/mixin_bookish/toc.tmp +0 -0
  38. data/test/snapshots/more_complex_vars/actual-error.txt +0 -0
  39. data/test/snapshots/more_complex_vars/actual-output.txt +0 -4
  40. data/test/snapshots/more_complex_vars/err-sdiff.txt +0 -1
  41. data/test/snapshots/more_complex_vars/out-sdiff.txt +0 -5
  42. data/test/snapshots/more_functions/actual-error.txt +0 -19
  43. data/test/snapshots/more_functions/actual-output.txt +0 -0
  44. data/test/snapshots/more_functions/err-sdiff.txt +0 -20
  45. data/test/snapshots/raw_lines/actual-error.txt +0 -22
  46. data/test/snapshots/raw_lines/actual-output.txt +0 -0
  47. data/test/snapshots/raw_lines/err-sdiff.txt +0 -23
  48. data/test/snapshots/simple_vars/actual-error.txt +0 -0
  49. data/test/snapshots/simple_vars/actual-output.txt +0 -6
  50. data/test/snapshots/simple_vars/err-sdiff.txt +0 -1
  51. data/test/snapshots/simple_vars/out-sdiff.txt +0 -7
  52. data/test/snapshots/var_into_func/actual-error.txt +0 -19
  53. data/test/snapshots/var_into_func/actual-output.txt +0 -0
  54. data/test/snapshots/var_into_func/err-sdiff.txt +0 -20
  55. data/test/snapshots/var_into_func/out-sdiff.txt +0 -17
  56. data/test/unit/tokenizer.rb +0 -535
@@ -1,535 +0,0 @@
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
- def test_tokenizer_simple_string
34
- parse = LineParser.new("only testing")
35
- tokens = parse.tokenize
36
- assert_equal tokens, [[:str, "only testing"]], "Tokens were: #{tokens.inspect}"
37
- end
38
-
39
- def test_tokenizer_variable_interpolation
40
- parse = LineParser.new("File is $File and user is $User")
41
- tokens = parse.tokenize
42
- expected_tokens = [[:str, "File is "],
43
- [:var, "File"],
44
- [:str, " and user is "],
45
- [:var, "User"]]
46
- assert_equal expected_tokens, tokens
47
- end
48
-
49
- def test_tokenizer_func_expansion
50
- parse = LineParser.new("myfunc() results in $$myfunc apparently.")
51
- tokens = parse.tokenize
52
- expected_tokens = [[:str, "myfunc() results in "],
53
- [:func, "myfunc"],
54
- [:str, " apparently."]]
55
- assert_equal expected_tokens, tokens
56
- end
57
-
58
- def test_tokenizer_func_2
59
- str = "Today is $$date"
60
- parse = LineParser.new(str)
61
- tokens_expected = [[:str, "Today is "], [:func, "date"]]
62
- tokens = parse.tokenize
63
- assert_equal tokens_expected, tokens, "Tokens were: #{tokens.inspect}"
64
- end
65
-
66
- def test_tokenizer_var_before_comma
67
- str = "User name is $User, and all is well"
68
- parse = LineParser.new(str)
69
- tokens_expected = [[:str, "User name is "], [:var, "User"], [:str, ", and all is well"]]
70
- tokens = parse.tokenize
71
- assert_equal tokens_expected, tokens, "Tokens were: #{tokens.inspect}"
72
- end
73
-
74
- def test_tokenizer_var_at_EOS
75
- str = "File name is $File"
76
- parse = LineParser.new(str)
77
- tokens_expected = [[:str, "File name is "], [:var, "File"]]
78
- tokens = parse.tokenize
79
- assert_equal tokens_expected, tokens
80
- end
81
-
82
- def test_tokenizer_var_starts_string
83
- str = "$File is my file name"
84
- parse = LineParser.new(str)
85
- tokens_expected = [[:var, "File"], [:str, " is my file name"]]
86
- tokens = parse.tokenize
87
- assert_equal tokens_expected, tokens
88
- end
89
-
90
- # Next one is/will be a problem...
91
- # I permit periods *inside* variable names
92
-
93
- def test_tokenizer_var_before_period
94
- skip
95
- str = "This is $File\\." # FIXME escaped for now...
96
- parse = LineParser.new(str)
97
- tokens_expected = [[:str, "This is "], [:var, "File"], [:str, "."]]
98
- tokens = parse.tokenize
99
- assert_equal tokens_expected, tokens
100
- end
101
-
102
- def test_tokenizer_func_needing_parameter_colon_eos # colon, param, EOS
103
- str = "Square root of 225 is $$isqrt:225"
104
- parse = LineParser.new(str)
105
- tokens_expected = [[:str, "Square root of 225 is "], [:func, "isqrt"], [:colon, "225"]]
106
- tokens = parse.tokenize
107
- assert_equal tokens_expected, tokens
108
- end
109
-
110
- def test_tokenizer_func_needing_parameter_colon # colon, param, more chars
111
- str = "Answer is $$isqrt:225 today"
112
- parse = LineParser.new(str)
113
- tokens_expected = [[:str, "Answer is "],
114
- [:func, "isqrt"],
115
- [:colon, "225"],
116
- [:str, " today"]]
117
- tokens = parse.tokenize
118
- assert_equal tokens_expected, tokens
119
- end
120
-
121
- # isqrt: Not real tests??
122
-
123
- def test_tokenizer_isqrt_empty_colon_param
124
- str = "Calculate $$isqrt:"
125
- parse = LineParser.new(str)
126
- tokens_expected = [[:str, "Calculate "],
127
- [:func, "isqrt"] # , [:colon, ""]
128
- ]
129
- # If param is null, we don't get [:colon, value]!
130
- # ^ FIXME function should be more like: [:func, name, param]
131
- tokens = parse.tokenize
132
- assert_equal tokens_expected, tokens
133
- end
134
-
135
- def test_tokenizer_isqrt_empty_bracket_param
136
- str = "Calculate $$isqrt[]"
137
- parse = LineParser.new(str)
138
- tokens_expected = [[:str, "Calculate "],
139
- [:func, "isqrt"] # , [:colon, ""]
140
- ]
141
- # If param is null, we don't get [:colon, value]!
142
- # ^ FIXME function should be more like: [:func, name, param]
143
- tokens = parse.tokenize
144
- assert_equal tokens_expected, tokens
145
- end
146
-
147
- def test_tokenizer_isqrt_malformed_number
148
- str = "Calculate $$isqrt[3a5]"
149
- parse = LineParser.new(str)
150
- tokens_expected = [[:str, "Calculate "],
151
- [:func, "isqrt"],
152
- [:brackets, "3a5"]
153
- ]
154
- # ^ FIXME function should be more like: [:func, name, param]
155
- tokens = parse.tokenize
156
- assert_equal tokens_expected, tokens
157
- end
158
-
159
- # ...end of this group
160
-
161
- def test_tokenizer_func_with_colon
162
- parse = LineParser.new("Calling $$myfunc:foo here.")
163
- tokens = parse.tokenize
164
- assert_equal tokens, [[:str, "Calling "],
165
- [:func, "myfunc"],
166
- [:colon, "foo"],
167
- [:str, " here."]
168
- ]
169
- end
170
-
171
- def test_tokenizer_func_with_brackets
172
- parse = LineParser.new("Calling $$myfunc2[foo bar] here.")
173
- tokens = parse.tokenize
174
- assert_kind_of Array, tokens
175
- assert_equal 4, tokens.size
176
- expected_tokens = [[:str, "Calling "],
177
- [:func, "myfunc2"],
178
- [:brackets, "foo bar"],
179
- [:str, " here."]]
180
- assert_equal expected_tokens, tokens
181
- end
182
-
183
- def test_tokenizer_parse_formatting
184
- msg, src, exp = <<~STUFF.split("\n")
185
- Check simple formatting
186
- This is *bold and _italics ...
187
- This is <b>bold</b> and <i>italics</i> ...
188
- STUFF
189
- invoke_test(msg, src, exp)
190
- end
191
-
192
- def test_tokenizer_formatting_01 # Check output of $$date
193
- msg, src, exp = <<~STUFF.split("\n")
194
- Check output of $$date
195
- Today is $$date, I guess
196
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
197
- STUFF
198
- invoke_test(msg, src, exp)
199
- end
200
-
201
- def test_tokenizer_formatting_02 # Check output of $$date
202
- msg, src, exp = <<~STUFF.split("\n")
203
- Check output of $$date
204
- Today is $$date, I guess
205
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
206
- STUFF
207
- invoke_test(msg, src, exp)
208
- end
209
-
210
- def test_tokenizer_formatting_03 # Check output of $$date
211
- msg, src, exp = <<~STUFF.split("\n")
212
- Check output of $$date
213
- Today is $$date, I guess
214
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
215
- STUFF
216
- invoke_test(msg, src, exp)
217
- end
218
-
219
- def test_tokenizer_formatting_04 # Check output of $$date
220
- msg, src, exp = <<~STUFF.split("\n")
221
- Check output of $$date
222
- Today is $$date, I guess
223
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
224
- STUFF
225
- invoke_test(msg, src, exp)
226
- end
227
-
228
- def test_tokenizer_formatting_05 # Check output of $$date
229
- msg, src, exp = <<~STUFF.split("\n")
230
- Check output of $$date
231
- Today is $$date, I guess
232
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
233
- STUFF
234
- invoke_test(msg, src, exp)
235
- end
236
-
237
- def test_tokenizer_formatting_06 # Check output of $$date
238
- msg, src, exp = <<~STUFF.split("\n")
239
- Check output of $$date
240
- Today is $$date, I guess
241
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
242
- STUFF
243
- invoke_test(msg, src, exp)
244
-
245
- actual = LineParser.parse!(src)
246
- if exp[0] == "/"
247
- exp = Regexp.compile(exp[1..-2]) # skip slashes
248
- assert_match(exp, actual, msg)
249
- else
250
- assert_equal(exp, actual, msg)
251
- end
252
- end
253
-
254
- def test_tokenizer_formatting_07 # 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
-
262
- actual = LineParser.parse!(src)
263
- if exp[0] == "/"
264
- exp = Regexp.compile(exp[1..-2]) # skip slashes
265
- assert_match(exp, actual, msg)
266
- else
267
- assert_equal(exp, actual, msg)
268
- end
269
- end
270
-
271
- def test_tokenizer_formatting_08 # Check output of $$date
272
- msg, src, exp = <<~STUFF.split("\n")
273
- Check output of $$date
274
- Today is $$date, I guess
275
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
276
- STUFF
277
- invoke_test(msg, src, exp)
278
- end
279
-
280
- def test_tokenizer_formatting_09 # Check output of $$date
281
- msg, src, exp = <<~STUFF.split("\n")
282
- Check output of $$date
283
- Today is $$date, I guess
284
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
285
- STUFF
286
- invoke_test(msg, src, exp)
287
- end
288
-
289
- def test_tokenizer_formatting_10 # Check output of $$date
290
- msg, src, exp = <<~STUFF.split("\n")
291
- Check output of $$date
292
- Today is $$date, I guess
293
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
294
- STUFF
295
- invoke_test(msg, src, exp)
296
- end
297
-
298
- def test_tokenizer_formatting_11 # Check output of $$date
299
- msg, src, exp = <<~STUFF.split("\n")
300
- Check output of $$date
301
- Today is $$date, I guess
302
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
303
- STUFF
304
- invoke_test(msg, src, exp)
305
- end
306
-
307
- def test_tokenizer_formatting_12 # Check output of $$date
308
- msg, src, exp = <<~STUFF.split("\n")
309
- Check output of $$date
310
- Today is $$date, I guess
311
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
312
- STUFF
313
- invoke_test(msg, src, exp)
314
- end
315
-
316
- def test_tokenizer_formatting_13 # 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
- end
324
-
325
- def test_tokenizer_formatting_14 # Check output of $$date
326
- msg, src, exp = <<~STUFF.split("\n")
327
- Check output of $$date
328
- Today is $$date, I guess
329
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
330
- STUFF
331
- invoke_test(msg, src, exp)
332
- end
333
-
334
- def test_tokenizer_formatting_15 # Check output of $$date
335
- msg, src, exp = <<~STUFF.split("\n")
336
- Check output of $$date
337
- Today is $$date, I guess
338
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
339
- STUFF
340
- invoke_test(msg, src, exp)
341
- end
342
-
343
- def test_tokenizer_formatting_16 # Check output of $$date
344
- msg, src, exp = <<~STUFF.split("\n")
345
- Check output of $$date
346
- Today is $$date, I guess
347
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
348
- STUFF
349
- invoke_test(msg, src, exp)
350
- end
351
-
352
- def test_tokenizer_formatting_17 # Check output of $$date
353
- msg, src, exp = <<~STUFF.split("\n")
354
- Check output of $$date
355
- Today is $$date, I guess
356
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
357
- STUFF
358
- invoke_test(msg, src, exp)
359
- end
360
-
361
- def test_tokenizer_formatting_18 # Check output of $$date
362
- msg, src, exp = <<~STUFF.split("\n")
363
- Check output of $$date
364
- Today is $$date, I guess
365
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
366
- STUFF
367
- invoke_test(msg, src, exp)
368
- end
369
-
370
- def test_tokenizer_formatting_19 # Check output of $$date
371
- msg, src, exp = <<~STUFF.split("\n")
372
- Check output of $$date
373
- Today is $$date, I guess
374
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
375
- STUFF
376
- invoke_test(msg, src, exp)
377
- end
378
-
379
- def test_tokenizer_formatting_20 # Check output of $$date
380
- $testme = true
381
- msg, src, exp = <<~STUFF.split("\n")
382
- Check output of $$date
383
- Today is $$date, I guess
384
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
385
- STUFF
386
- invoke_test(msg, src, exp)
387
- $testme = false
388
- end
389
-
390
- def test_tokenizer_formatting_21 # Check output of $$date
391
- msg, src, exp = <<~STUFF.split("\n")
392
- Check output of $$date
393
- Today is $$date, I guess
394
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
395
- STUFF
396
- invoke_test(msg, src, exp)
397
- end
398
-
399
- def test_tokenizer_formatting_22 # Check output of $$date
400
- msg, src, exp = <<~STUFF.split("\n")
401
- Check output of $$date
402
- Today is $$date, I guess
403
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
404
- STUFF
405
- invoke_test(msg, src, exp)
406
- end
407
-
408
- def test_tokenizer_formatting_23 # Check output of $$date
409
- msg, src, exp = <<~STUFF.split("\n")
410
- Check output of $$date
411
- Today is $$date, I guess
412
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
413
- STUFF
414
- invoke_test(msg, src, exp)
415
- end
416
-
417
- def test_tokenizer_formatting_24 # Check output of $$date
418
- msg, src, exp = <<~STUFF.split("\n")
419
- Check output of $$date
420
- Today is $$date, I guess
421
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
422
- STUFF
423
- invoke_test(msg, src, exp)
424
- end
425
-
426
- def test_tokenizer_formatting_25 # Check output of $$date
427
- msg, src, exp = <<~STUFF.split("\n")
428
- Check output of $$date
429
- Today is $$date, I guess
430
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
431
- STUFF
432
- invoke_test(msg, src, exp)
433
- end
434
-
435
- def test_tokenizer_formatting_26 # Check output of $$date
436
- msg, src, exp = <<~STUFF.split("\n")
437
- Check output of $$date
438
- Today is $$date, I guess
439
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
440
- STUFF
441
- invoke_test(msg, src, exp)
442
- end
443
-
444
- def test_tokenizer_formatting_27 # Check output of $$date
445
- msg, src, exp = <<~STUFF.split("\n")
446
- Check output of $$date
447
- Today is $$date, I guess
448
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
449
- STUFF
450
- invoke_test(msg, src, exp)
451
- end
452
-
453
- def test_tokenizer_formatting_28 # Check output of $$date
454
- msg, src, exp = <<~STUFF.split("\n")
455
- Check output of $$date
456
- Today is $$date, I guess
457
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
458
- STUFF
459
- invoke_test(msg, src, exp)
460
- end
461
-
462
- def test_tokenizer_formatting_29 # Check output of $$date
463
- msg, src, exp = <<~STUFF.split("\n")
464
- Check output of $$date
465
- Today is $$date, I guess
466
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
467
- STUFF
468
- invoke_test(msg, src, exp)
469
- end
470
-
471
- def test_tokenizer_formatting_30 # Check output of $$date
472
- msg, src, exp = <<~STUFF.split("\n")
473
- Check output of $$date
474
- Today is $$date, I guess
475
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
476
- STUFF
477
- invoke_test(msg, src, exp)
478
- end
479
-
480
- def test_tokenizer_formatting_31 # Check output of $$date
481
- msg, src, exp = <<~STUFF.split("\n")
482
- Check output of $$date
483
- Today is $$date, I guess
484
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
485
- STUFF
486
- invoke_test(msg, src, exp)
487
- end
488
-
489
- def test_tokenizer_formatting_32 # Check "real" dollar signs
490
- msg, src, exp = <<~STUFF.split("\n")
491
- Check "real" dollar signs
492
- You paid $75 for that item.
493
- You paid $75 for that item.
494
- STUFF
495
- invoke_test(msg, src, exp)
496
- end
497
-
498
- def test_tokenizer_formatting_33 # Check dollar-space
499
- msg, src, exp = <<~STUFF.split("\n")
500
- Check dollar-space
501
- He paid $ 76 for it...
502
- He paid $ 76 for it...
503
- STUFF
504
- invoke_test(msg, src, exp)
505
- end
506
-
507
- def xtest_tokenizer_formatting_34 # Check escaped dollar signs
508
- msg, src, exp = <<~STUFF.split("\n")
509
- Check escaped dollar signs
510
- Paid \\$78 yo
511
- Paid $78 yo
512
- STUFF
513
- invoke_test(msg, src, exp)
514
- end
515
-
516
- def test_tokenizer_formatting_35 # Check ignored function param (bug or feature?)
517
- msg, src, exp = <<~STUFF.split("\n")
518
- Check ignored function param (bug or feature?)
519
- Today is $$date:foobar, apparently.
520
- /Today is \\d\\d\\d\\d.\\d\\d.\\d\\d apparently./
521
- STUFF
522
- invoke_test(msg, src, exp)
523
- end
524
-
525
- def test_tokenizer_formatting_36 # Check ignored function bracket param (bug or feature?)
526
- msg, src, exp = <<~STUFF.split("\n")
527
- Check ignored function bracket param (bug or feature?)
528
- Today is $$date[a useless parameter], apparently.
529
- /Today is \\d\\\d\\d\\d.\\d\\d.\\d\\d, apparently./
530
- STUFF
531
- invoke_test(msg, src, exp)
532
- end
533
-
534
- end
535
-