latex-tools 0.1
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.
- data/LICENSE +165 -0
- data/README +14 -0
- data/Rakefile +89 -0
- data/examples/table/example1.rb +7 -0
- data/examples/table/example1.rb.out +9 -0
- data/lib/latex_table.rb +572 -0
- data/test/examples_test.rb +40 -0
- data/test/latex_table_test.rb +399 -0
- data/test/lib/custom_assertions.rb +24 -0
- metadata +75 -0
@@ -0,0 +1,40 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift(File.join(File.dirname(File.dirname(File.expand_path(__FILE__))), "lib"))
|
4
|
+
$LOAD_PATH.unshift(File.join(File.dirname(File.expand_path(__FILE__)),"lib"))
|
5
|
+
|
6
|
+
require "test/unit"
|
7
|
+
require 'latex_table'
|
8
|
+
require 'custom_assertions'
|
9
|
+
include LatexTools
|
10
|
+
|
11
|
+
|
12
|
+
class LatexTableTest < Test::Unit::TestCase
|
13
|
+
|
14
|
+
# Called before every test method runs. Can be used
|
15
|
+
# to set up fixture information.
|
16
|
+
def setup
|
17
|
+
# Do nothing
|
18
|
+
end
|
19
|
+
|
20
|
+
# Called after every test method runs. Can be used to tear
|
21
|
+
# down fixture information.
|
22
|
+
def teardown
|
23
|
+
# Do nothing
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_table_example1
|
27
|
+
|
28
|
+
assert_example_works("table/example1.rb")
|
29
|
+
end
|
30
|
+
|
31
|
+
def assert_example_works(example_file)
|
32
|
+
example_dir = File.join(File.dirname(File.dirname(File.expand_path(__FILE__))), "examples")
|
33
|
+
result = eval(IO.read("#{example_dir}/#{example_file}"))
|
34
|
+
assert_equal_ignore_spaces(
|
35
|
+
IO.read("#{example_dir}/#{example_file}.out"),
|
36
|
+
result
|
37
|
+
)
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,399 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift(File.join(File.dirname(File.dirname(File.expand_path(__FILE__))), "lib"))
|
4
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__),"lib"))
|
5
|
+
|
6
|
+
require "test/unit"
|
7
|
+
require 'latex_table'
|
8
|
+
require 'custom_assertions'
|
9
|
+
include LatexTools
|
10
|
+
|
11
|
+
class LatexTableTest < Test::Unit::TestCase
|
12
|
+
|
13
|
+
# Called before every test method runs. Can be used
|
14
|
+
# to set up fixture information.
|
15
|
+
def setup
|
16
|
+
# Do nothing
|
17
|
+
end
|
18
|
+
|
19
|
+
# Called after every test method runs. Can be used to tear
|
20
|
+
# down fixture information.
|
21
|
+
|
22
|
+
def teardown
|
23
|
+
# Do nothing
|
24
|
+
end
|
25
|
+
|
26
|
+
# Build a simple set of tables for testing
|
27
|
+
def make_table(name)
|
28
|
+
case(name)
|
29
|
+
when "empty"
|
30
|
+
@table = LatexTable.new
|
31
|
+
when "simple 3x3"
|
32
|
+
@table = LatexTable.new
|
33
|
+
@table.add_column
|
34
|
+
@table.add_column
|
35
|
+
@table.add_column
|
36
|
+
@table.add_row
|
37
|
+
@table.add_element("1")
|
38
|
+
@table.add_element("2")
|
39
|
+
@table.add_element("3")
|
40
|
+
@table.add_row
|
41
|
+
@table.add_element("4")
|
42
|
+
@table.add_element("5")
|
43
|
+
@table.add_element("6")
|
44
|
+
@table.add_row
|
45
|
+
@table.add_element("7")
|
46
|
+
@table.add_element("8")
|
47
|
+
@table.add_element("9")
|
48
|
+
when "hlines"
|
49
|
+
@table = LatexTable.new(5)
|
50
|
+
@table << :hline
|
51
|
+
@table << :hline
|
52
|
+
@table << 1 << 2 << 3 << 4 << 5 << :endl
|
53
|
+
@table << :hline
|
54
|
+
@table << 1 << 2 << 3 << 4 << 5 << :endl
|
55
|
+
@table << :hline
|
56
|
+
@table << :hline
|
57
|
+
when "autoadd"
|
58
|
+
@table = LatexTable.new
|
59
|
+
@table.auto_add_columns = true
|
60
|
+
@table << 1 << 2 << 3 << :endl
|
61
|
+
@table << hline
|
62
|
+
@table << 1 << 2 << 3 << 4 << :endl
|
63
|
+
@table << :hline
|
64
|
+
@table << 1 << 2 << 3 << 4 << 5 << :endl
|
65
|
+
when "multicol"
|
66
|
+
@table = LatexTable.new(4)
|
67
|
+
@table << 1 << 2 << 3 << 4 << :endl
|
68
|
+
@table << :hline
|
69
|
+
@table << multicol(3, "hello") << 4 << :endl
|
70
|
+
@table << :hline
|
71
|
+
@table << 1 << fill_to_end(:r, "world") << :endl
|
72
|
+
@table << 1 << fill_to_end("world") << :endl
|
73
|
+
@table << 1 << multicol(2, :l, 3.14) << 4 << :endl
|
74
|
+
@table << :hline
|
75
|
+
@table << :hline
|
76
|
+
@table.add_element_spanning(3, "hello")
|
77
|
+
@table.add_element(4)
|
78
|
+
@table.add_spanning_row("full row")
|
79
|
+
@table << :hline
|
80
|
+
@table.add_spanning_row("full row")
|
81
|
+
@table.add_element(1)
|
82
|
+
@table.add_element_spanning_to_end("world", :r)
|
83
|
+
@table.add_row
|
84
|
+
@table << 1
|
85
|
+
@table.add_element_spanning(2, 3.14, :l)
|
86
|
+
@table.add_element(4)
|
87
|
+
when "cline"
|
88
|
+
@table = LatexTable.new(4)
|
89
|
+
@table << 1 << 2 << 3 << 4 << :endl
|
90
|
+
@table << cline(1,3) << :endl
|
91
|
+
@table << 1 << 2 << 3 << 4 << :endl
|
92
|
+
@table << cline(1,2) << cline(3,4) << :endl
|
93
|
+
@table << 1 << 2 << 3 << 4 << :endl
|
94
|
+
@table << :hline
|
95
|
+
else
|
96
|
+
raise "Unknown table requested for testing in LatexTableTest#make_table"
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_stupidity
|
102
|
+
# Misalign stuff...
|
103
|
+
assert_raise RuntimeError do
|
104
|
+
t = LatexTable.new(3)
|
105
|
+
t << 1 << 2 << :endl
|
106
|
+
end
|
107
|
+
assert_raise IndexError do
|
108
|
+
t = LatexTable.new(3)
|
109
|
+
t << 1 << 2 << 3 << 4 << :endl
|
110
|
+
end
|
111
|
+
assert_raise IndexError do
|
112
|
+
t = LatexTable.new(3)
|
113
|
+
t.add_element_spanning(4, "text")
|
114
|
+
end
|
115
|
+
|
116
|
+
# Invalid argument counts and types
|
117
|
+
assert_raise(ArgumentError) { LatexTable.new(1,2,3) }
|
118
|
+
assert_raise(TypeError) { LatexTable.new("hello") }
|
119
|
+
|
120
|
+
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_not_implemented
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_to_str_etc
|
128
|
+
make_table("simple 3x3")
|
129
|
+
assert_equal(@table.to_str, @table.to_s)
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_divider_raises
|
133
|
+
make_table("empty")
|
134
|
+
assert_raise(ArgumentError) { @table.col_divider = "|||" }
|
135
|
+
make_table("empty")
|
136
|
+
assert_raise(ArgumentError) { @table.col_divider = "something_weird" }
|
137
|
+
make_table("simple 3x3")
|
138
|
+
assert_raise(ArgumentError) { @table.col_dividers = ["|","something_weird"] }
|
139
|
+
make_table("simple 3x3")
|
140
|
+
assert_raise(ArgumentError) { @table.col_dividers = ["|","|","|","|","|"] }
|
141
|
+
make_table("simple 3x3")
|
142
|
+
assert_raise(ArgumentError) { @table.col_dividers = ["|","|","|"] }
|
143
|
+
end
|
144
|
+
|
145
|
+
def test_simple_3x3_num_rows
|
146
|
+
make_table("simple 3x3")
|
147
|
+
assert_equal(3, @table.rows)
|
148
|
+
end
|
149
|
+
|
150
|
+
def test_hlines_num_rows
|
151
|
+
make_table("hlines")
|
152
|
+
assert_equal(7, @table.rows)
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_simple_3x3_tabular_string
|
156
|
+
make_table("simple 3x3")
|
157
|
+
assert_equal("ccc", @table.tabular_string)
|
158
|
+
@table.col_divider = "|"
|
159
|
+
assert_equal("c|c|c", @table.tabular_string)
|
160
|
+
@table.col_divider = "||"
|
161
|
+
assert_equal("c||c||c", @table.tabular_string)
|
162
|
+
@table.col_dividers = ["||","|"]
|
163
|
+
assert_equal("c||c|c", @table.tabular_string)
|
164
|
+
@table.col_dividers = ["|","||","|","||"]
|
165
|
+
assert_equal("|c||c|c||", @table.tabular_string)
|
166
|
+
@table.col_dividers = ["||","","","||"]
|
167
|
+
assert_equal("||ccc||", @table.tabular_string)
|
168
|
+
@table.col_dividers = ["",""]
|
169
|
+
assert_equal("||ccc||", @table.tabular_string)
|
170
|
+
@table.col_dividers = ["","","",""]
|
171
|
+
assert_equal("ccc", @table.tabular_string)
|
172
|
+
@table.add_v_border
|
173
|
+
assert_equal("|ccc|", @table.tabular_string)
|
174
|
+
@table.col_dividers = ["|","|"]
|
175
|
+
assert_equal("|c|c|c|", @table.tabular_string)
|
176
|
+
@table.add_v_double_border
|
177
|
+
assert_equal("||c|c|c||", @table.tabular_string)
|
178
|
+
@table.col_dividers = ["","","",""]
|
179
|
+
assert_equal("ccc", @table.tabular_string)
|
180
|
+
@table.add_v_border
|
181
|
+
@table.add_v_border
|
182
|
+
assert_equal("||ccc||", @table.tabular_string)
|
183
|
+
@table.col_dividers = ["|","","","|"]
|
184
|
+
assert_equal("|ccc|", @table.tabular_string)
|
185
|
+
end
|
186
|
+
|
187
|
+
def test_simple_3x3_fragment
|
188
|
+
make_table("simple 3x3")
|
189
|
+
assert_equal_ignore_spaces(
|
190
|
+
'\begin{table}
|
191
|
+
\begin{tabular}{ccc}
|
192
|
+
1 & 2 & 3 \\\\
|
193
|
+
4 & 5 & 6 \\\\
|
194
|
+
7 & 8 & 9
|
195
|
+
\end{tabular}
|
196
|
+
\end{table}',
|
197
|
+
@table.to_latex
|
198
|
+
)
|
199
|
+
@table.add_v_double_border
|
200
|
+
assert_equal_ignore_spaces(
|
201
|
+
'\begin{table}
|
202
|
+
\begin{tabular}{||ccc||}
|
203
|
+
1 & 2 & 3 \\\\
|
204
|
+
4 & 5 & 6 \\\\
|
205
|
+
7 & 8 & 9
|
206
|
+
\end{tabular}
|
207
|
+
\end{table}',
|
208
|
+
@table.to_latex
|
209
|
+
)
|
210
|
+
@table.float_number_format = "%.2f"
|
211
|
+
assert_equal_ignore_spaces(
|
212
|
+
'\begin{table}
|
213
|
+
\begin{tabular}{||ccc||}
|
214
|
+
1.00 & 2.00 & 3.00 \\\\
|
215
|
+
4.00 & 5.00 & 6.00 \\\\
|
216
|
+
7.00 & 8.00 & 9.00
|
217
|
+
\end{tabular}
|
218
|
+
\end{table}',
|
219
|
+
@table.to_latex
|
220
|
+
)
|
221
|
+
end
|
222
|
+
|
223
|
+
def test_borders
|
224
|
+
make_table("simple 3x3")
|
225
|
+
@table.add_v_border
|
226
|
+
assert_equal_ignore_spaces(
|
227
|
+
'\begin{table}
|
228
|
+
\begin{tabular}{|ccc|}
|
229
|
+
1 & 2 & 3 \\\\
|
230
|
+
4 & 5 & 6 \\\\
|
231
|
+
7 & 8 & 9
|
232
|
+
\end{tabular}
|
233
|
+
\end{table}',
|
234
|
+
@table.to_latex
|
235
|
+
)
|
236
|
+
@table.add_h_border
|
237
|
+
assert_equal_ignore_spaces(
|
238
|
+
'\begin{table}
|
239
|
+
\begin{tabular}{|ccc|}
|
240
|
+
\hline
|
241
|
+
1 & 2 & 3 \\\\
|
242
|
+
4 & 5 & 6 \\\\
|
243
|
+
7 & 8 & 9 \\\\
|
244
|
+
\hline
|
245
|
+
\end{tabular}
|
246
|
+
\end{table}',
|
247
|
+
@table.to_latex
|
248
|
+
)
|
249
|
+
@table.add_border
|
250
|
+
assert_equal_ignore_spaces(
|
251
|
+
'\begin{table}
|
252
|
+
\begin{tabular}{||ccc||}
|
253
|
+
\hline
|
254
|
+
\hline
|
255
|
+
1 & 2 & 3 \\\\
|
256
|
+
4 & 5 & 6 \\\\
|
257
|
+
7 & 8 & 9 \\\\
|
258
|
+
\hline
|
259
|
+
\hline
|
260
|
+
\end{tabular}
|
261
|
+
\end{table}',
|
262
|
+
@table.to_latex
|
263
|
+
)
|
264
|
+
|
265
|
+
end
|
266
|
+
|
267
|
+
def test_quick_add
|
268
|
+
tmp = LatexTable.new(3)
|
269
|
+
tmp << 1 << 2 << 3 << :endl
|
270
|
+
tmp << 4 << 5 << 6 << :endl
|
271
|
+
tmp << 7 << 8 << 9 << :endl
|
272
|
+
make_table("simple 3x3")
|
273
|
+
assert_equal(@table.to_s, tmp.to_s)
|
274
|
+
end
|
275
|
+
|
276
|
+
def test_hlines
|
277
|
+
make_table("hlines")
|
278
|
+
assert_equal_ignore_spaces(
|
279
|
+
'\hline
|
280
|
+
\hline
|
281
|
+
1 & 2 & 3 & 4 & 5 \\\\
|
282
|
+
\hline
|
283
|
+
1 & 2 & 3 & 4 & 5 \\\\
|
284
|
+
\hline
|
285
|
+
\hline
|
286
|
+
',
|
287
|
+
@table.to_latex_fragment
|
288
|
+
)
|
289
|
+
end
|
290
|
+
|
291
|
+
def test_auto_add
|
292
|
+
make_table("autoadd")
|
293
|
+
assert_equal_ignore_spaces(
|
294
|
+
'1 & 2 & 3 & & \\\\
|
295
|
+
\hline
|
296
|
+
1 & 2 & 3 & 4 & \\\\
|
297
|
+
\hline
|
298
|
+
1 & 2 & 3 & 4 & 5
|
299
|
+
',
|
300
|
+
@table.to_latex_fragment
|
301
|
+
)
|
302
|
+
@table.add_v_border
|
303
|
+
@table.col_divider = "||"
|
304
|
+
@table << 1 << 2 << 3 << 4 << 5 << 6 << :endl
|
305
|
+
assert_equal("|c||c||c||c||c||c|", @table.tabular_string)
|
306
|
+
@table.add_element_spanning(7, "test", :l)
|
307
|
+
assert_equal("|c||c||c||c||c||c||c|", @table.tabular_string)
|
308
|
+
|
309
|
+
end
|
310
|
+
|
311
|
+
def test_multicol
|
312
|
+
make_table("multicol")
|
313
|
+
assert_equal_ignore_spaces(
|
314
|
+
'1 & 2 & 3 & 4 \\\\
|
315
|
+
\hline
|
316
|
+
\multicolumn{3}{c}{hello} & 4 \\\\
|
317
|
+
\hline
|
318
|
+
1 & \multicolumn{3}{r}{world} \\\\
|
319
|
+
1 & \multicolumn{3}{c}{world} \\\\
|
320
|
+
1 & \multicolumn{2}{l}{3.14} & 4 \\\\
|
321
|
+
\hline
|
322
|
+
\hline
|
323
|
+
\multicolumn{3}{c}{hello} & 4 \\\\
|
324
|
+
\multicolumn{4}{c}{full row} \\\\
|
325
|
+
\hline
|
326
|
+
\multicolumn{4}{c}{full row} \\\\
|
327
|
+
1 & \multicolumn{3}{r}{world} \\\\
|
328
|
+
1 & \multicolumn{2}{l}{3.14} & 4
|
329
|
+
', @table.to_latex_fragment
|
330
|
+
)
|
331
|
+
end
|
332
|
+
|
333
|
+
def test_row_num_columns
|
334
|
+
r = LatexTable::Row.new
|
335
|
+
r << 1 << 2 << 3
|
336
|
+
assert_equal(3, r.num_columns)
|
337
|
+
|
338
|
+
r = LatexTable::Row.new
|
339
|
+
r << multicol(3, "hello")
|
340
|
+
r << 1
|
341
|
+
assert_equal(4, r.num_columns)
|
342
|
+
|
343
|
+
r << multicol(:fill, "test")
|
344
|
+
assert_equal(-1, r.num_columns)
|
345
|
+
end
|
346
|
+
|
347
|
+
def test_cline
|
348
|
+
make_table("cline")
|
349
|
+
assert_equal_ignore_spaces(
|
350
|
+
'1 & 2 & 3 & 4 \\\\
|
351
|
+
\cline{1-3}
|
352
|
+
1 & 2 & 3 & 4 \\\\
|
353
|
+
\cline{1-2} \cline{3-4}
|
354
|
+
1 & 2 & 3 & 4 \\\\
|
355
|
+
\hline
|
356
|
+
', @table.to_latex_fragment
|
357
|
+
)
|
358
|
+
@table.auto_add_columns = true
|
359
|
+
@table << 1 << 3 << 5 << 6 << endl
|
360
|
+
@table << cline(1,6)
|
361
|
+
@table << 1 << 3 << 5 << 6 << 8 << 9 << endl
|
362
|
+
assert_equal_ignore_spaces(
|
363
|
+
'1 & 2 & 3 & 4 & & \\\\
|
364
|
+
\cline{1-3}
|
365
|
+
1 & 2 & 3 & 4 & & \\\\
|
366
|
+
\cline{1-2} \cline{3-4}
|
367
|
+
1 & 2 & 3 & 4 & & \\\\
|
368
|
+
\hline
|
369
|
+
1 & 3 & 5 & 6 & & \\\\
|
370
|
+
\cline{1-6}
|
371
|
+
1 & 3 & 5 & 6 & 8 & 9
|
372
|
+
', @table.to_latex_fragment
|
373
|
+
)
|
374
|
+
|
375
|
+
end
|
376
|
+
|
377
|
+
def test_cline_fail
|
378
|
+
@table = LatexTable.new(3)
|
379
|
+
assert_raise ArgumentError do
|
380
|
+
@table << cline(1,2) << cline(2,3)
|
381
|
+
end
|
382
|
+
|
383
|
+
@table = LatexTable.new(3)
|
384
|
+
assert_raise RuntimeError do
|
385
|
+
@table << 1 << cline(2,3) << endl
|
386
|
+
end
|
387
|
+
|
388
|
+
@table = LatexTable.new(3)
|
389
|
+
assert_raise RuntimeError do
|
390
|
+
@table << 1 << cline(2,4) << endl
|
391
|
+
end
|
392
|
+
|
393
|
+
@table = LatexTable.new(3)
|
394
|
+
assert_raise RuntimeError do
|
395
|
+
@table << cline(0,1)
|
396
|
+
end
|
397
|
+
end
|
398
|
+
|
399
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
module Test::Unit::Assertions
|
5
|
+
|
6
|
+
def assert_equal_ignore_spaces(expected, actual, message = nil)
|
7
|
+
# Also ignore trailing newlines
|
8
|
+
full_message = build_message(message, "<?> expected (ignoring spaces), but was actually <?>. With whitespace removed:\n expected: <?>\n actual: <?>", expected, actual, expected.gsub(" ", '').chomp, actual.gsub(" ", '').chomp)
|
9
|
+
assert_block(full_message) do
|
10
|
+
expected.gsub(" ", '').chomp == actual.gsub(" ", '').chomp
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
def assert_equal_ignore_whitespace(expected, actual, message = nil)
|
16
|
+
full_message = build_message(message, "<?> expected (ignoring whitespace), but was actually <?>", expected, actual)
|
17
|
+
assert_block(full_message) do
|
18
|
+
expected.gsub(/\s+/, '') == actual.gsub(/\s+/, '')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
|