livetext 0.9.11 → 0.9.13

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 (167) hide show
  1. checksums.yaml +4 -4
  2. data/lib/errors.rb +13 -0
  3. data/lib/formatline.rb +3 -5
  4. data/lib/functions.rb +6 -2
  5. data/lib/helpers.rb +21 -0
  6. data/lib/html.rb +32 -0
  7. data/lib/livetext/importable.rb +2 -0
  8. data/lib/livetext.rb +44 -42
  9. data/lib/parser/general.rb +38 -0
  10. data/lib/parser/import.rb +17 -0
  11. data/lib/parser/mixin.rb +46 -0
  12. data/lib/parser/set.rb +136 -0
  13. data/lib/parser/string.rb +55 -0
  14. data/lib/parser.rb +5 -0
  15. data/lib/processor.rb +22 -16
  16. data/lib/standard.rb +144 -292
  17. data/lib/userapi.rb +2 -1
  18. data/livetext.gemspec +1 -2
  19. data/test/all.rb +3 -0
  20. data/test/formatting.rb +2 -9
  21. data/test/{data → snapshots}/basic_formatting/expected-error.txt +0 -0
  22. data/test/{data → snapshots}/basic_formatting/expected-output.txt +0 -0
  23. data/test/{data → snapshots}/basic_formatting/source.lt3 +0 -0
  24. data/test/{data → snapshots}/block_comment/expected-error.txt +0 -0
  25. data/test/{data → snapshots}/block_comment/expected-output.txt +0 -0
  26. data/test/{data → snapshots}/block_comment/source.lt3 +0 -0
  27. data/test/{data → snapshots}/comments_ignored_1/expected-error.txt +0 -0
  28. data/test/{data → snapshots}/comments_ignored_1/expected-output.txt +0 -0
  29. data/test/{data → snapshots}/comments_ignored_1/source.lt3 +0 -0
  30. data/test/{data → snapshots}/copy_is_raw/expected-error.txt +0 -0
  31. data/test/{data → snapshots}/copy_is_raw/expected-output.txt +0 -0
  32. data/test/{data → snapshots}/copy_is_raw/rawtext.inc +0 -0
  33. data/test/{data → snapshots}/copy_is_raw/source.lt3 +0 -0
  34. data/test/{data → snapshots}/crap +0 -0
  35. data/test/{data → snapshots}/def_method/expected-error.txt +0 -0
  36. data/test/{data → snapshots}/def_method/expected-output.txt +0 -0
  37. data/test/{data → snapshots}/def_method/source.lt3 +0 -0
  38. data/test/{data/error_inc_line_num/expected-err-line1match.txt → snapshots/error_inc_line_num/actual-error.txt} +0 -0
  39. data/test/{data/error_inc_line_num/expected-output.txt → snapshots/error_inc_line_num/actual-output.txt} +0 -0
  40. data/test/{data/error_line_num → snapshots/error_inc_line_num}/expected-err-line1match.txt +0 -0
  41. data/test/snapshots/error_inc_line_num/expected-output.txt +13 -0
  42. data/test/{data → snapshots}/error_inc_line_num/file2.lt3 +0 -0
  43. data/test/snapshots/error_inc_line_num/out-sdiff.txt +14 -0
  44. data/test/{data → snapshots}/error_inc_line_num/source.lt3 +0 -0
  45. data/test/snapshots/error_invalid_name/actual-error.txt +10 -0
  46. data/test/{data/error_no_such_mixin/expected-output.txt → snapshots/error_invalid_name/actual-output.txt} +0 -0
  47. data/test/{data → snapshots}/error_invalid_name/expected-err-line1match.txt +0 -0
  48. data/test/{data → snapshots}/error_invalid_name/expected-output.txt +0 -0
  49. data/test/snapshots/error_invalid_name/out-sdiff.txt +6 -0
  50. data/test/{data → snapshots}/error_invalid_name/source.lt3 +0 -0
  51. data/test/snapshots/error_line_num/actual-error.txt +1 -0
  52. data/test/snapshots/error_line_num/actual-output.txt +5 -0
  53. data/test/snapshots/error_line_num/expected-err-line1match.txt +1 -0
  54. data/test/{data → snapshots}/error_line_num/expected-output.txt +0 -0
  55. data/test/snapshots/error_line_num/out-sdiff.txt +6 -0
  56. data/test/{data → snapshots}/error_line_num/source.lt3 +0 -0
  57. data/test/snapshots/error_mismatched_end/actual-error.txt +1 -0
  58. data/test/{data/error_mismatched_end/expected-output.txt → snapshots/error_mismatched_end/actual-output.txt} +0 -0
  59. data/test/{data → snapshots}/error_mismatched_end/expected-err-line1match.txt +0 -0
  60. data/test/snapshots/error_mismatched_end/expected-output.txt +8 -0
  61. data/test/snapshots/error_mismatched_end/out-sdiff.txt +9 -0
  62. data/test/{data → snapshots}/error_mismatched_end/source.lt3 +0 -0
  63. data/test/{data/error_missing_end/expected-err-line1match.txt → snapshots/error_missing_end/actual-error.txt} +0 -0
  64. data/test/{data/error_missing_end/expected-output.txt → snapshots/error_missing_end/actual-output.txt} +0 -0
  65. data/test/snapshots/error_missing_end/expected-err-line1match.txt +1 -0
  66. data/test/snapshots/error_missing_end/expected-output.txt +5 -0
  67. data/test/snapshots/error_missing_end/out-sdiff.txt +6 -0
  68. data/test/{data → snapshots}/error_missing_end/source.lt3 +0 -0
  69. data/test/{data/error_name_not_permitted/expected-output.txt → snapshots/error_name_not_permitted/OLD-exp-out} +0 -0
  70. data/test/{data/example_alpha/expected-error.txt → snapshots/error_name_not_permitted/expected-output.txt} +0 -0
  71. data/test/snapshots/error_name_not_permitted/match-error.txt +1 -0
  72. data/test/{data → snapshots}/error_name_not_permitted/source.lt3 +0 -0
  73. data/test/snapshots/error_no_such_copy/actual-error.txt +10 -0
  74. data/test/{data/example_alpha2/expected-error.txt → snapshots/error_no_such_copy/actual-output.txt} +0 -0
  75. data/test/snapshots/error_no_such_copy/expected-err-line1match.txt +1 -0
  76. data/test/{data → snapshots}/error_no_such_copy/expected-output.txt +0 -5
  77. data/test/snapshots/error_no_such_copy/out-sdiff.txt +5 -0
  78. data/test/{data → snapshots}/error_no_such_copy/source.lt3 +0 -0
  79. data/test/snapshots/error_no_such_inc/actual-error.txt +10 -0
  80. data/test/{data/functions/expected-error.txt → snapshots/error_no_such_inc/actual-output.txt} +0 -0
  81. data/test/snapshots/error_no_such_inc/expected-err-line1match.txt +1 -0
  82. data/test/{data → snapshots}/error_no_such_inc/expected-output.txt +0 -4
  83. data/test/snapshots/error_no_such_inc/out-sdiff.txt +6 -0
  84. data/test/{data → snapshots}/error_no_such_inc/source.lt3 +0 -0
  85. data/test/snapshots/error_no_such_mixin/actual-error.txt +1 -0
  86. data/test/snapshots/error_no_such_mixin/actual-output.txt +11 -0
  87. data/test/{data → snapshots}/error_no_such_mixin/expected-err-line1match.txt +0 -0
  88. data/test/snapshots/error_no_such_mixin/expected-output.txt +5 -0
  89. data/test/snapshots/error_no_such_mixin/out-sdiff.txt +12 -0
  90. data/test/{data → snapshots}/error_no_such_mixin/source.lt3 +0 -0
  91. data/test/{data/hello_world → snapshots/example_alpha}/expected-error.txt +0 -0
  92. data/test/{data → snapshots}/example_alpha/expected-output.txt +0 -0
  93. data/test/{data → snapshots}/example_alpha/source.lt3 +0 -0
  94. data/test/{data/more_complex_vars → snapshots/example_alpha2}/expected-error.txt +0 -0
  95. data/test/{data → snapshots}/example_alpha2/expected-output.txt +0 -0
  96. data/test/{data → snapshots}/example_alpha2/source.lt3 +0 -0
  97. data/test/{data → snapshots}/fixit +0 -0
  98. data/test/{data/predef_vars → snapshots/functions}/expected-error.txt +0 -0
  99. data/test/{data → snapshots}/functions/expected-output.txt +0 -0
  100. data/test/{data → snapshots}/functions/source.lt3 +0 -0
  101. data/test/{data/raw_lines → snapshots/hello_world}/expected-error.txt +0 -0
  102. data/test/{data → snapshots}/hello_world/expected-output.txt +0 -0
  103. data/test/{data → snapshots}/hello_world/source.lt3 +0 -0
  104. data/test/{data → snapshots}/lines.txt +0 -0
  105. data/test/{data/raw_text_block → snapshots/more_complex_vars}/expected-error.txt +0 -0
  106. data/test/{data → snapshots}/more_complex_vars/expected-output.txt +0 -0
  107. data/test/{data → snapshots}/more_complex_vars/source.lt3 +0 -0
  108. data/test/{data/simple_copy/expected-error.txt → snapshots/predef_vars/actual-error.txt} +0 -0
  109. data/test/snapshots/predef_vars/actual-output.txt +6 -0
  110. data/test/{data/simple_include → snapshots/predef_vars}/expected-error.txt +0 -0
  111. data/test/{data → snapshots}/predef_vars/expected-output.txt +1 -1
  112. data/test/snapshots/predef_vars/out-sdiff.txt +7 -0
  113. data/test/{data → snapshots}/predef_vars/source.lt3 +0 -0
  114. data/test/{data/simple_mixin → snapshots/raw_lines}/expected-error.txt +0 -0
  115. data/test/{data → snapshots}/raw_lines/expected-output.txt +0 -0
  116. data/test/{data → snapshots}/raw_lines/source.lt3 +0 -0
  117. data/test/{data/simple_vars → snapshots/raw_text_block}/expected-error.txt +0 -0
  118. data/test/{data → snapshots}/raw_text_block/expected-output.txt +0 -0
  119. data/test/{data → snapshots}/raw_text_block/rawtext.inc +0 -0
  120. data/test/{data → snapshots}/raw_text_block/source.lt3 +0 -0
  121. data/test/{data/single_raw_line → snapshots/simple_copy}/expected-error.txt +0 -0
  122. data/test/{data → snapshots}/simple_copy/expected-output.txt +0 -0
  123. data/test/{data → snapshots}/simple_copy/simplefile.inc +0 -0
  124. data/test/{data → snapshots}/simple_copy/source.lt3 +0 -0
  125. data/test/{data/table_with_heredocs → snapshots/simple_include}/expected-error.txt +0 -0
  126. data/test/{data → snapshots}/simple_include/expected-output.txt +0 -0
  127. data/test/{data → snapshots}/simple_include/simplefile.inc +0 -0
  128. data/test/{data → snapshots}/simple_include/source.lt3 +0 -0
  129. data/test/snapshots/simple_mixin/actual-error.txt +2 -0
  130. data/test/snapshots/simple_mixin/actual-output.txt +4 -0
  131. data/test/{data/subset.txt → snapshots/simple_mixin/expected-error.txt} +0 -0
  132. data/test/{data → snapshots}/simple_mixin/expected-output.txt +0 -0
  133. data/test/snapshots/simple_mixin/out-sdiff.txt +6 -0
  134. data/test/{data → snapshots}/simple_mixin/simple_mixin.rb +0 -0
  135. data/test/{data → snapshots}/simple_mixin/source.lt3 +0 -0
  136. data/test/snapshots/simple_vars/expected-error.txt +0 -0
  137. data/test/{data → snapshots}/simple_vars/expected-output.txt +0 -0
  138. data/test/{data → snapshots}/simple_vars/source.lt3 +0 -0
  139. data/test/snapshots/single_raw_line/expected-error.txt +0 -0
  140. data/test/{data → snapshots}/single_raw_line/expected-output.txt +0 -0
  141. data/test/{data → snapshots}/single_raw_line/source.lt3 +0 -0
  142. data/test/snapshots/subset.txt +0 -0
  143. data/test/snapshots/table_with_heredocs/expected-error.txt +0 -0
  144. data/test/{data → snapshots}/table_with_heredocs/expected-output.txt +0 -0
  145. data/test/{data → snapshots}/table_with_heredocs/source.lt3 +0 -0
  146. data/test/snapshots.rb +219 -0
  147. data/test/testlines.rb +2 -2
  148. data/test/unit/all.rb +3 -0
  149. data/test/unit/html.rb +38 -0
  150. data/test/unit/parse_misc.rb +60 -0
  151. data/test/unit/parse_set.rb +157 -0
  152. data/test/unit/parser/all.rb +3 -0
  153. data/test/unit/parser/general.rb +59 -0
  154. data/test/unit/parser/importable.rb +19 -0
  155. data/test/unit/parser/mixin.rb +19 -0
  156. data/test/unit/parser/set.rb +157 -0
  157. data/test/unit/parser/string.rb +130 -0
  158. data/test/unit/parser.rb +4 -0
  159. data/test/unit/standard.rb +23 -0
  160. data/test/unit/stringparser.rb +140 -0
  161. metadata +152 -99
  162. data/test/data/error_inc_line_num/FOO +0 -21
  163. data/test/data/error_missing_end/ERR +0 -32
  164. data/test/data/error_name_not_permitted/expected-error.txt +0 -1
  165. data/test/data/error_no_such_copy/expected-err-line1match.txt +0 -1
  166. data/test/data/error_no_such_inc/expected-err-line1match.txt +0 -1
  167. data/test/test.rb +0 -140
data/test/snapshots.rb ADDED
@@ -0,0 +1,219 @@
1
+ require 'minitest/autorun'
2
+
3
+ require_relative '../lib/livetext'
4
+
5
+ =begin
6
+ Snapshots...
7
+
8
+ NOTE that the external_files method has been replaced by the Snapshot class.
9
+
10
+ You can add any ordinary test method above. But so far, most of these tests simply
11
+ call external_files.
12
+
13
+ The external_files method works this way:
14
+ - If the test (caller) method is test_my_silly_feature, then we will
15
+ look for a directory called snapshots/my_silly_feature
16
+ - In here, there must be a source.lt3, expected-output.txt, and expected-error.txt
17
+ - Technically, any of these can be empty
18
+ - We run livetext on the source and compare actual vs expected (stdout, stderr)
19
+ - The "real" output gets checked first
20
+ - Of course, both must compare correctly for the test to pass
21
+ - See also: match*
22
+ =end
23
+
24
+
25
+ # Just a testing class. Chill.
26
+
27
+ class TestingLivetext < MiniTest::Test
28
+
29
+ class Snapshot
30
+ SOURCE = "source.lt3"
31
+ # Will now keep "actual" output in same dir?
32
+ ACTUAL_OUT, ACTUAL_ERR = "actual-output.txt", "actual-error.txt"
33
+ EXP_OUT, EXP_ERR = "expected-output.txt", "expected-error.txt"
34
+ MATCH_OUT, MATCH_ERR = "match-output.txt", "match-error.txt"
35
+
36
+ def initialize(base, assertion = nil)
37
+ @assertion = assertion
38
+ @base = base
39
+ @errors = false
40
+ Dir.chdir(base) do
41
+ @literal_out = File.exist?(EXP_OUT)
42
+ @literal_err = File.exist?(EXP_ERR)
43
+ @match_out = File.exist?(MATCH_OUT)
44
+ @match_err = File.exist?(MATCH_ERR)
45
+ end
46
+ bad_files = (@literal_out && @match_out) || (@literal_err && @match_err)
47
+ raise "Inconsistent structure for #@base" if bad_files
48
+ end
49
+
50
+ def check_matches(actual, control)
51
+ controls = File.readlines(control).map(&:chomp)
52
+ lines = File.readlines(actual).map(&:chomp)
53
+ lines.unshift("DUMMY LINE") # 1-based index! (for when I'm editing)
54
+ controls.each do |line|
55
+ line_num, item = line.split(" ", 2)
56
+ item = Regexp.new(item[1..-2]) if item[0] == "/" # Hmm, string can't start with /...
57
+ line_num = line_num.to_i
58
+ info = "Expected line #{line_num} of #{actual.inspect} to match #{item.inspect} (was: #{lines[line_num].inspect})"
59
+ good = item === lines[line_num]
60
+ @errors = true unless good
61
+ # assert item === lines[line_num], info # string or regex
62
+ @assertion.call item === lines[line_num], info # string or regex
63
+ end
64
+ end
65
+
66
+ def sdiff(f1, f2, out)
67
+ File.open(out, "w") {|file| file.puts "#{'%-60s'% 'EXPECTED'}| #{'%-60s'% 'ACTUAL'}" }
68
+ system("/usr/bin/sdiff -t -w 121 #{f1} #{f2} >>#{out}")
69
+ end
70
+
71
+ def check_stdout
72
+ if @literal_out
73
+ actual, expected = File.read(ACTUAL_OUT), File.read(EXP_OUT)
74
+ same = actual == expected
75
+ @errors = true if not same
76
+ file = "out-sdiff.txt"
77
+ sdiff(ACTUAL_OUT, EXP_OUT, file)
78
+ # assert same, "Discrepancy in STDOUT - see #@base/#{file}"
79
+ @assertion.call same, "Discrepancy in STDOUT - see #@base/#{file}"
80
+ else
81
+ check_matches(ACTUAL_OUT, MATCH_OUT)
82
+ end
83
+ end
84
+
85
+ def check_stderr
86
+ if @literal_err
87
+ actual, expected = File.read(ACTUAL_ERR), File.read(EXP_ERR)
88
+ same = actual == expected
89
+ @errors = true if not same
90
+ file = "err-sdiff.txt"
91
+ sdiff(ACTUAL_ERR, EXP_ERR, file)
92
+ # assert same, "Discrepancy in STDERR - see #@base/#{file}"
93
+ @assertion.call same, "Discrepancy in STDERR - see #@base/#{file}"
94
+ else
95
+ check_matches(ACTUAL_ERR, MATCH_ERR)
96
+ end
97
+ end
98
+
99
+ def cleanup
100
+ return if @errors
101
+ system("rm -f #{ACTUAL_OUT} #{ACTUAL_ERR} *sdiff.txt")
102
+ end
103
+
104
+ def run
105
+ @errors = false # oops, need to reset
106
+ Dir.chdir(@base) do
107
+ cmd = "../../../bin/livetext #{SOURCE} >#{ACTUAL_OUT} 2>#{ACTUAL_ERR}"
108
+ system(cmd)
109
+ check_stdout
110
+ check_stderr
111
+ cleanup
112
+ end
113
+ end
114
+ end
115
+
116
+ TTY = File.open("/dev/tty","w")
117
+
118
+ cmdline = ARGV.first == "cmdline"
119
+ if cmdline
120
+ dir = "../"
121
+ Dir.chdir `livetext --path`.chomp.chomp
122
+ else
123
+ dir = ""
124
+ end
125
+
126
+ Data = "#{dir}test/snapshots"
127
+ TestLines = []
128
+ Dir.chdir(Data)
129
+
130
+ items = []
131
+ short_tests = File.open("lines.txt")
132
+ loop do
133
+ 4.times { items << short_tests.gets.chomp }
134
+ # Blank line terminates each "stanza"
135
+ raise "Oops? #{items.inspect}" unless items.last.empty?
136
+ TestLines << items
137
+ break if short_tests.eof?
138
+ end
139
+
140
+ if File.size("subset.txt") == 0
141
+ puts "Defining via TestLines"
142
+ TestLines.each.with_index do |item, num|
143
+ msg, src, exp, blank = *item
144
+ define_method("test_formatting_#{num}") do
145
+ actual = FormatLine.parse!(src)
146
+ if exp[0] == "/" # regex!
147
+ exp = Regexp.compile(exp[1..-2]) # skip slashes
148
+ assert_match(exp, actual, msg)
149
+ else
150
+ assert_equal(exp, actual, msg)
151
+ end
152
+ end
153
+ end
154
+ end
155
+
156
+ TestDirs = Dir.entries(".").reject {|fname| ! File.directory?(fname) } - %w[. ..]
157
+ selected = File.readlines("subset.txt").map(&:chomp)
158
+ Subset = selected.empty? ? TestDirs : selected
159
+
160
+ Subset.each do |tdir|
161
+ define_method("test_#{tdir}") do
162
+ myproc = Proc.new {|bool, info| assert bool, info }
163
+ this = Snapshot.new(tdir, myproc)
164
+ this.run
165
+ end
166
+ end
167
+
168
+ def green(str)
169
+ "" + str.to_s + ""
170
+ end
171
+
172
+ def red(str)
173
+ "" + str.to_s + ""
174
+ end
175
+
176
+ def sdiff(which, f1, f2, out, rx)
177
+ return "\n >>> No match for std#{which}!" if rx
178
+ File.open(out, "w") {|file| file.puts "#{'%-60s'% 'EXPECTED'}| #{'%-60s'% 'ACTUAL'}" }
179
+ system("/usr/bin/sdiff -t -w 121 #{f1} #{f2} >>#{out}")
180
+ return "\n >>> Unexpected std#{which}! See #{out}"
181
+ end
182
+
183
+ def external_files(base)
184
+ Dir.chdir(base) do
185
+ src, out, exp = "source.lt3", "/tmp/#{base}--actual-output.txt", "expected-output.txt"
186
+ err, erx = "/tmp/#{base}--actual-error.txt", "expected-error.txt"
187
+
188
+ # New features - match out/err by regex
189
+ expout_regex = "expected-out-line1match.txt"
190
+ experr_regex = "expected-err-line1match.txt"
191
+
192
+ cmd = "livetext #{src} >#{out} 2>#{err}"
193
+ system(cmd)
194
+
195
+ output = File.read(out)
196
+ errors = File.read(err)
197
+ rx_out = rx_err = nil
198
+
199
+ expected = File.exist?(expout_regex) ? rx_out = /#{Regexp.escape(File.read(expout_regex).chomp)}/ : File.read(exp)
200
+ errexp = File.exist?(experr_regex) ? rx_err = /#{Regexp.escape(File.read(experr_regex).chomp)}/ : File.read(erx)
201
+
202
+ out_ok = rx_out ? output =~ rx_out : output == expected
203
+ err_ok = rx_err ? errors =~ rx_err : errors == errexp
204
+
205
+ system("mkdir -p /tmp/#{base}")
206
+ bad_out = bad_err = nil
207
+ bad_out = sdiff("out", exp, out, "/tmp/#{base}/exp.out.sdiff", rx_out) unless out_ok
208
+ bad_err = sdiff("err", erx, err, "/tmp/#{base}/exp.err.sdiff", rx_err) unless err_ok
209
+
210
+ assert(err_ok, bad_err)
211
+ assert(out_ok, bad_out)
212
+ # only on success
213
+ system("rm -rf #{out} #{err} /tmp/#{base}") if out_ok && err_ok
214
+ end
215
+ end
216
+
217
+ end
218
+
219
+
data/test/testlines.rb CHANGED
@@ -1,5 +1,5 @@
1
- require 'livetext'
2
- require 'formatline'
1
+ require '../lib/livetext'
2
+ require '../lib/formatline'
3
3
 
4
4
  def red(str)
5
5
  "" + str + ""
data/test/unit/all.rb ADDED
@@ -0,0 +1,3 @@
1
+
2
+ require_relative 'standard'
3
+ require_relative 'parser' # nested
data/test/unit/html.rb ADDED
@@ -0,0 +1,38 @@
1
+ require 'minitest/autorun'
2
+
3
+ require '../../lib/livetext'
4
+
5
+ class TestingLivetext < MiniTest::Test
6
+ include Livetext::Standard
7
+ include Livetext::UserAPI
8
+
9
+ # Some of these methods being tested "really" belong elsewhere?
10
+ # Same is probably true of the methods that are testing them.
11
+
12
+ def test_wrapped
13
+ cdata = "nothing much"
14
+ assert_equal wrapped(cdata, :b), "<b>#{cdata}</b>"
15
+ assert_equal wrapped(cdata, :b, :i), "<b><i>#{cdata}</i></b>"
16
+
17
+ assert_equal wrapped(cdata, :table, :tr, :td),
18
+ "<table><tr><td>#{cdata}</td></tr></table>"
19
+ end
20
+
21
+ def test_wrapped_bang
22
+ cdata = "nothing much"
23
+ assert_equal wrapped!(cdata, :td, valign: :top),
24
+ "<td valign='top'>#{cdata}</td>"
25
+ assert_equal wrapped!(cdata, :img, src: "foo.jpg"),
26
+ "<img src='foo.jpg'>#{cdata}</img>"
27
+ assert_equal wrapped!(cdata, :a, style: 'text-decoration: none',
28
+ href: 'foo.com'),
29
+ "<a style='text-decoration: none' href='foo.com'>#{cdata}</a>"
30
+ end
31
+
32
+ def xtest_wrap
33
+ # bogus!
34
+ wrap(:ul) { 2.times {|i| _out i } }
35
+ puts @body
36
+ end
37
+
38
+ end
@@ -0,0 +1,60 @@
1
+ require 'minitest/autorun'
2
+
3
+ # FIXME delete??
4
+
5
+ require 'parse_misc'
6
+
7
+ ParseMisc = ::Livetext::ParseMisc
8
+
9
+ class TestParseMisc < MiniTest::Test
10
+
11
+ def setup
12
+ end
13
+
14
+ def teardown
15
+ end
16
+
17
+ def test_strip_quotes
18
+ assert_raises(NilValue) { ParseMisc.new(nil).strip_quotes }
19
+ assert_raises(NullString) { ParseMisc.new("").strip_quotes }
20
+ assert_raises(MismatchedQuotes) { ParseMisc.new(%['test]).strip_quotes }
21
+ # assert_raises(MismatchedQuotes) { ParseMisc.new(%[test']).strip_quotes }
22
+ assert_raises(MismatchedQuotes) { ParseMisc.new(%["test]).strip_quotes }
23
+ # assert_raises(MismatchedQuotes) { ParseMisc.new(%[test"]).strip_quotes }
24
+ assert_raises(MismatchedQuotes) { ParseMisc.new(%["test']).strip_quotes }
25
+ assert_raises(MismatchedQuotes) { ParseMisc.new(%['test"]).strip_quotes }
26
+
27
+ assert ParseMisc.new(%[24601]).strip_quotes == "24601", "Failure 1"
28
+ assert ParseMisc.new(%[3.14]).strip_quotes == "3.14", "Failure 2"
29
+ assert ParseMisc.new(%[test]).strip_quotes == "test", "Failure 3"
30
+ assert ParseMisc.new(%['test']).strip_quotes == "test", "Failure 4"
31
+ assert ParseMisc.new(%["test"]).strip_quotes == "test", "Failure 5"
32
+ end
33
+
34
+ def test_variables
35
+ vars = ["foo 234\n", "bar 456\n"]
36
+ expect = [%w[foo 234], %w[bar 456]]
37
+ assert_equal ParseMisc.parse_vars(vars), expect
38
+
39
+ vars = ["foo2 234", "bar2 456"] # newline irrelevant
40
+ expect = [%w[foo2 234], %w[bar2 456]]
41
+ assert_equal ParseMisc.parse_vars(vars), expect
42
+
43
+ # quotes are not stripped... hmm
44
+ vars = ["alpha 'simple string'", 'beta "another string"']
45
+ expect = [["alpha", "'simple string'"], ["beta", '"another string"']]
46
+ assert_equal ParseMisc.parse_vars(vars), expect
47
+
48
+ # prefix (namespacing)
49
+ vars = ["alpha 'simple string'", 'beta "another string"']
50
+ expect = [["this.alpha", "'simple string'"], ["this.beta", '"another string"']]
51
+ assert_equal ParseMisc.parse_vars(vars, prefix: "this"), expect
52
+
53
+ # prefix (namespacing)
54
+ vars = ["alpha 'simple string'", 'beta "another string"']
55
+ expect = [["this.that.alpha", "'simple string'"], ["this.that.beta", '"another string"']]
56
+ assert_equal ParseMisc.parse_vars(vars, prefix: "this.that"), expect
57
+
58
+ end
59
+
60
+ end
@@ -0,0 +1,157 @@
1
+
2
+ require 'minitest/autorun'
3
+
4
+ require_relative '../../lib/parse/set'
5
+
6
+ ParseSet = Livetext::ParseSet
7
+
8
+ class TestParseSet < MiniTest::Test
9
+
10
+ def setup
11
+ end
12
+
13
+ def teardown
14
+ end
15
+
16
+ def test_one_unquoted
17
+ set = ParseSet.new('my_var_123 = 789').parse
18
+ pair = set.first
19
+ assert_equal pair, %w[my_var_123 789]
20
+
21
+ set = ParseSet.new('var_234 = naked_string').parse
22
+ pair = set.first
23
+ assert_equal pair, %w[var_234 naked_string]
24
+ end
25
+
26
+ def test_one_single_quoted
27
+ set = ParseSet.new("fancy.var.name = 'simple string'").parse
28
+ pair = set.first
29
+ assert_equal pair, ["fancy.var.name", "simple string"]
30
+ end
31
+
32
+ def test_one_double_quoted
33
+ set = ParseSet.new('fancy.var2 = "another string"').parse
34
+ pair = set.first
35
+ assert_equal pair, ["fancy.var2", "another string"]
36
+ end
37
+
38
+ def test_multiple_unquoted
39
+ pair1, pair2 = ParseSet.new("this=345, that=678").parse
40
+ assert_equal pair1, %w[this 345]
41
+ assert_equal pair2, %w[that 678]
42
+ end
43
+
44
+ def test_multiple_unquoted_quoted
45
+ pair1, pair2 = ParseSet.new('alpha = 567, beta = "oh well"').parse
46
+ assert_equal pair1, %w[alpha 567]
47
+ assert_equal pair2, ["beta", "oh well"]
48
+ end
49
+
50
+ def test_quote_embedded_comma
51
+ set = ParseSet.new('gamma = "oh, well"').parse
52
+ pair = set.first
53
+ assert_equal pair, ["gamma", "oh, well"]
54
+ end
55
+
56
+ def test_get_var
57
+ @parse = ParseSet.new("foo=345")
58
+ assert_equal @parse.get_var, "foo"
59
+ @parse = ParseSet.new("foo = 345")
60
+ assert_equal @parse.get_var, "foo"
61
+ @parse = ParseSet.new("foo123 = 345")
62
+ assert_equal @parse.get_var, "foo123"
63
+ @parse = ParseSet.new("foo_bar = 345")
64
+ assert_equal @parse.get_var, "foo_bar"
65
+ @parse = ParseSet.new("Foobar = 345")
66
+ assert_equal @parse.get_var, "Foobar"
67
+ @parse = ParseSet.new("_foobar = 345")
68
+ assert_equal @parse.get_var, "_foobar"
69
+
70
+ # will not notice missing equal sign till later parsing
71
+ @parse = ParseSet.new("foo bar")
72
+ assert_equal @parse.get_var, "foo"
73
+
74
+ # can detect missing equal sign if iteration ends
75
+ @parse = ParseSet.new("foo")
76
+ assert_raises(NoEqualSign) { @parse.get_var }
77
+ @parse = ParseSet.new("foo-bar = 345")
78
+ assert_raises(BadVariableName) { @parse.get_var }
79
+ end
80
+
81
+ def test_skip_equal
82
+ @parse = ParseSet.new("=")
83
+ assert_nil @parse.skip_equal
84
+ @parse = ParseSet.new(" = ")
85
+ assert_nil @parse.skip_equal
86
+ @parse = ParseSet.new(" =")
87
+ assert_nil @parse.skip_equal
88
+ @parse = ParseSet.new(" = 345")
89
+ assert_equal @parse.skip_equal, "3"
90
+ @parse = ParseSet.new(" = 'meh'")
91
+ assert_equal @parse.skip_equal, "'"
92
+
93
+ @parse = ParseSet.new("no equal here")
94
+ assert_raises(NoEqualSign) { @parse.skip_equal }
95
+ @parse = ParseSet.new("")
96
+ assert_raises(NoEqualSign) { @parse.skip_equal }
97
+ end
98
+
99
+ def test_quoted_value
100
+ @parse = ParseSet.new(%['this'])
101
+ assert_equal @parse.quoted_value, "this"
102
+ @parse = ParseSet.new(%["that"])
103
+ assert_equal @parse.quoted_value, "that"
104
+ @parse = ParseSet.new(%[""])
105
+ assert_equal @parse.quoted_value, ""
106
+ @parse = ParseSet.new(%[''])
107
+ assert_equal @parse.quoted_value, ""
108
+
109
+ @parse = ParseSet.new(%['foo"])
110
+ assert_raises(BadQuotedString) { @parse.quoted_value }
111
+ @parse = ParseSet.new(%["bar'])
112
+ assert_raises(BadQuotedString) { @parse.quoted_value }
113
+ @parse = ParseSet.new(%['baz])
114
+ assert_raises(BadQuotedString) { @parse.quoted_value }
115
+ @parse = ParseSet.new(%["bam])
116
+ assert_raises(BadQuotedString) { @parse.quoted_value }
117
+ # LATER:
118
+ # - allow (escaped?) comma in quoted string
119
+ end
120
+
121
+ def test_unquoted_value
122
+ # Note: an unquoted value is still a string!
123
+ @parse = ParseSet.new(%[342 ])
124
+ assert_equal @parse.unquoted_value, "342"
125
+ @parse = ParseSet.new(%[343,])
126
+ assert_equal @parse.unquoted_value, "343"
127
+ @parse = ParseSet.new(%[344,678])
128
+ assert_equal @parse.unquoted_value, "344"
129
+ @parse = ParseSet.new(%[345.123])
130
+ assert_equal @parse.unquoted_value, "345.123"
131
+ @parse = ParseSet.new(%[whatever])
132
+ assert_equal @parse.unquoted_value, "whatever"
133
+
134
+ # LATER:
135
+ # - disallow comma in unquoted string
136
+ # - disallow quote trailing unquoted string
137
+ # - allow/disallow escaping??
138
+ end
139
+
140
+ # BUG: FormatLine doesn't know variables in this context!
141
+
142
+ def xtest_4
143
+ set = ParseSet.new("file = $File").parse
144
+ assert_equal set.first, "file"
145
+ assert set.last !~ /undefined/
146
+ end
147
+
148
+ # BUG: ...or functions.
149
+ # (Additional bug: Failing silently seems wrong.)
150
+
151
+ def xtest_5
152
+ set = ParseSet.new("date = $$date").parse
153
+ assert_equal set.first, "date"
154
+ assert set.last =~ /^\d\d.\d\d.\d\d/
155
+ end
156
+
157
+ end
@@ -0,0 +1,3 @@
1
+
2
+ require_relative '../standard'
3
+ require_relative '../parser' # nested
@@ -0,0 +1,59 @@
1
+
2
+ require 'minitest/autorun'
3
+
4
+ require_relative '../../../lib/parser/general'
5
+
6
+ ParseMisc = ::Livetext::ParseMisc
7
+
8
+ class TestParseMisc < MiniTest::Test
9
+
10
+ def setup
11
+ end
12
+
13
+ def teardown
14
+ end
15
+
16
+ def test_strip_quotes
17
+ assert_raises(NilValue) { ParseMisc.new(nil).strip_quotes }
18
+ assert_raises(NullString) { ParseMisc.new("").strip_quotes }
19
+ assert_raises(MismatchedQuotes) { ParseMisc.new(%['test]).strip_quotes }
20
+ # assert_raises(MismatchedQuotes) { ParseMisc.new(%[test']).strip_quotes }
21
+ assert_raises(MismatchedQuotes) { ParseMisc.new(%["test]).strip_quotes }
22
+ # assert_raises(MismatchedQuotes) { ParseMisc.new(%[test"]).strip_quotes }
23
+ assert_raises(MismatchedQuotes) { ParseMisc.new(%["test']).strip_quotes }
24
+ assert_raises(MismatchedQuotes) { ParseMisc.new(%['test"]).strip_quotes }
25
+
26
+ assert ParseMisc.new(%[24601]).strip_quotes == "24601", "Failure 1"
27
+ assert ParseMisc.new(%[3.14]).strip_quotes == "3.14", "Failure 2"
28
+ assert ParseMisc.new(%[test]).strip_quotes == "test", "Failure 3"
29
+ assert ParseMisc.new(%['test']).strip_quotes == "test", "Failure 4"
30
+ assert ParseMisc.new(%["test"]).strip_quotes == "test", "Failure 5"
31
+ end
32
+
33
+ def test_variables
34
+ vars = ["foo 234\n", "bar 456\n"]
35
+ expect = [%w[foo 234], %w[bar 456]]
36
+ assert_equal ParseMisc.parse_vars(vars), expect
37
+
38
+ vars = ["foo2 234", "bar2 456"] # newline irrelevant
39
+ expect = [%w[foo2 234], %w[bar2 456]]
40
+ assert_equal ParseMisc.parse_vars(vars), expect
41
+
42
+ # quotes are not stripped... hmm
43
+ vars = ["alpha 'simple string'", 'beta "another string"']
44
+ expect = [["alpha", "'simple string'"], ["beta", '"another string"']]
45
+ assert_equal ParseMisc.parse_vars(vars), expect
46
+
47
+ # prefix (namespacing)
48
+ vars = ["alpha 'simple string'", 'beta "another string"']
49
+ expect = [["this.alpha", "'simple string'"], ["this.beta", '"another string"']]
50
+ assert_equal ParseMisc.parse_vars(vars, prefix: "this"), expect
51
+
52
+ # prefix (namespacing)
53
+ vars = ["alpha 'simple string'", 'beta "another string"']
54
+ expect = [["this.that.alpha", "'simple string'"], ["this.that.beta", '"another string"']]
55
+ assert_equal ParseMisc.parse_vars(vars, prefix: "this.that"), expect
56
+
57
+ end
58
+
59
+ end
@@ -0,0 +1,19 @@
1
+
2
+ require 'minitest/autorun'
3
+
4
+ require_relative '../../../lib/parser/set'
5
+
6
+ ParseSet = Livetext::ParseSet
7
+
8
+ class TestParseSet < MiniTest::Test
9
+
10
+ def setup
11
+ end
12
+
13
+ def teardown
14
+ end
15
+
16
+ # FIXME no tests yet
17
+ # Bad syntax? File not found? not found searching upward?
18
+
19
+ end
@@ -0,0 +1,19 @@
1
+
2
+ require 'minitest/autorun'
3
+
4
+ require_relative 'set'
5
+
6
+ ParseSet = Livetext::ParseSet
7
+
8
+ class TestParseSet < MiniTest::Test
9
+
10
+ def setup
11
+ end
12
+
13
+ def teardown
14
+ end
15
+
16
+ # FIXME no tests yet
17
+ # Bad syntax? File not found? not found searching upward?
18
+
19
+ end