ruport 0.11.0 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,17 +2,18 @@ require "test/unit"
2
2
  require "ruport"
3
3
  class TestSqlSplit < Test::Unit::TestCase
4
4
  include Ruport
5
+
6
+ def test_sql_split_trivial
7
+ sql = "SELECT * FROM ruport_test"
8
+ split = Query::SqlSplit.new sql
9
+ assert_equal( 1, split.size )
10
+ assert_equal( sql, split.first )
11
+ end
5
12
 
6
- def test_sql_split1
13
+ def test_sql_split_complex
7
14
  sql = File.read 'test/samples/ruport_test.sql'
8
15
  split = Query::SqlSplit.new sql
9
16
  assert_equal( 'SELECT * FROM ruport_test', split.last )
10
17
  end
11
18
 
12
- def test_sql_split2
13
- sql = "SELECT * FROM ruport_test"
14
- split = Query::SqlSplit.new sql
15
- assert_equal( 1, split.size )
16
- assert_equal( sql, split.first )
17
- end
18
19
  end
data/test/table_test.rb CHANGED
@@ -9,7 +9,10 @@ class Person < Ruport::Data::Record
9
9
  first_name + " " + last_name
10
10
  end
11
11
 
12
- end
12
+ end
13
+
14
+
15
+ class DuckRecord < Ruport::Data::Record; end
13
16
 
14
17
  class TestTable < Test::Unit::TestCase
15
18
  def test_constructors
@@ -31,22 +34,10 @@ class TestTable < Test::Unit::TestCase
31
34
 
32
35
  a = Ruport::Data::Record.new [1,2,3]
33
36
  b = Ruport::Data::Record.new [1,2,3], :attributes => %w[col1 col2 col3]
34
- tables.zip([[],[],[a],[b]]).each { |t,n|
35
- assert_equal n, t.data }
37
+ tables.zip([[],[],[a],[b]]).each do |t,n|
38
+ assert_equal n, t.data
39
+ end
36
40
  end
37
-
38
- def test_column
39
- a = [[1,2,3],[4,5,6]].to_table(%w[a b c])
40
- assert_equal [3,6], a.column(2)
41
- assert_equal [2,5], a.column("b")
42
-
43
- assert_raise(ArgumentError) { a.column("d") }
44
- assert_raise(ArgumentError) { a.column(42) }
45
-
46
- a = [[1],[2],[3],[4]].to_table
47
- assert_equal [1,2,3,4], a.column(0)
48
-
49
- end
50
41
 
51
42
  def test_to_group
52
43
  a =[[1,2,3],[4,5,6]].to_table(%w[a b c]).to_group("Packrats")
@@ -55,24 +46,7 @@ class TestTable < Test::Unit::TestCase
55
46
  :name => "Packrats" )
56
47
  assert_equal a,b
57
48
  end
58
-
59
- def test_set_column_names
60
- a = [[1,2,3],[4,5,6]].to_table
61
-
62
- assert_equal([],a.column_names)
63
- assert_equal([[1,2,3],[4,5,6]],a.map { |r| r.to_a } )
64
-
65
- a.column_names = %w[a b c]
66
- assert_equal(%w[a b c],a.column_names)
67
- a.each { |r| assert_equal(%w[a b c], r.attributes) }
68
- assert_equal([[1,2,3],[4,5,6]],a.map { |r| r.to_a })
69
-
70
- a.column_names = %w[d e f]
71
- assert_equal(%w[d e f],a.column_names)
72
- a.each { |r| assert_equal(%w[d e f], r.attributes) }
73
- assert_equal([[1,2,3],[4,5,6]],a.map { |r| r.to_a })
74
- end
75
-
49
+
76
50
  def test_rows_with
77
51
  table = [[1,2,3],[1,3,4],[7,8,9]].to_table(%w[a b c])
78
52
 
@@ -82,24 +56,7 @@ class TestTable < Test::Unit::TestCase
82
56
  assert_equal([table[2]], table.rows_with_b(8))
83
57
  assert_equal [table[1]], table.rows_with(%w[a b]) { |a,b| [a,b] == [1,3] }
84
58
  end
85
-
86
- def test_append_record
87
- table = Ruport::Data::Table.new :column_names => %w[a b c]
88
- table << Ruport::Data::Record.new([1,2,3], :attributes => %w[a b c])
89
- assert_equal([1,2,3],table[0].to_a)
90
- assert_equal(%w[a b c],table[0].attributes)
91
- rec = table[0].dup
92
- rec.attributes = %w[a b c d]
93
- assert_raise(NoMethodError) { table << Object.new }
94
- end
95
59
 
96
- def test_append_hash
97
- table = [[1,2,3],[4,5,6]].to_table(%w[a b c])
98
- table << { "a" => 7, "c" => 9, "b" => 8 }
99
-
100
- assert_equal [[1,2,3],[4,5,6],[7,8,9]].to_table(%w[a b c]), table
101
- end
102
-
103
60
  def test_sigma
104
61
  table = [[1,2],[3,4],[5,6]].to_table(%w[col1 col2])
105
62
  assert table.respond_to?(:sigma)
@@ -108,19 +65,6 @@ class TestTable < Test::Unit::TestCase
108
65
  assert_equal(9,table.sigma("col1"))
109
66
  assert_equal(21,table.sigma { |r| r.col1 + r.col2 })
110
67
  end
111
-
112
- def test_append_table
113
- first = Ruport::Data::Table.new :column_names => %w[a b c],
114
- :data => [[1,2,3],[4,5,6]]
115
-
116
- second = Ruport::Data::Table.new :column_names => %w[a b c],
117
- :data => [[7,8,9],[10,11,12]]
118
-
119
- combo = first + second
120
-
121
- assert_equal Ruport::Data::Table.new(:column_names => %w[a b c],
122
- :data => [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]), combo
123
- end
124
68
 
125
69
  def test_sub_table
126
70
  table = [ [1,2,3,4],[5,6,7,9],
@@ -144,7 +88,6 @@ class TestTable < Test::Unit::TestCase
144
88
  end
145
89
 
146
90
  def test_reduce
147
-
148
91
  table = [ [1,2,3,4],[5,6,7,9],
149
92
  [10,11,12,13],[14,15,16,17] ].to_table(%w[a b c d])
150
93
 
@@ -155,80 +98,7 @@ class TestTable < Test::Unit::TestCase
155
98
  [10,11,12,13],[14,15,16,17] ].to_table(%w[a b c d])
156
99
  table.reduce(%w[c d a]) { |r| r.a < 10 }
157
100
 
158
- assert_equal [[3,4,1],[7,9,5]].to_table(%w[c d a]),
159
- table
160
-
161
- end
162
-
163
- def test_csv_load
164
- table = Ruport::Data::Table.load("test/samples/data.csv")
165
- assert_equal %w[col1 col2 col3], table.column_names
166
- rows = [%w[a b c],["d",nil,"e"]]
167
- table.each { |r| assert_equal rows.shift, r.to_a
168
- assert_equal %w[col1 col2 col3], r.attributes }
169
- expected = [%w[1 2 3],%w[4 5 6]].to_table(%w[a b c])
170
-
171
- # ticket:94
172
- table = Ruport::Data::Table.load( "test/samples/data.tsv",
173
- :csv_options => { :col_sep => "\t" } )
174
- assert_equal expected, table
175
-
176
-
177
- expected = ['c','e']
178
-
179
- table = Ruport::Data::Table.load( "test/samples/data.csv", :csv_options =>
180
- { :headers => true, :header_converters => :symbol } ) do |s,r|
181
- assert_equal expected.shift, r[:col3]
182
- end
183
-
184
- assert_equal [:col1,:col2,:col3], table.column_names
185
-
186
-
187
- expected = ['c','e']
188
-
189
- Ruport::Data::Table.load( "test/samples/data.csv",
190
- :records => true ) do |s,r|
191
- assert_equal expected.shift, r.col3
192
- assert_kind_of Ruport::Data::Record, r
193
- end
194
-
195
- table = Ruport::Data::Table.load("test/samples/data.csv", :has_names => false)
196
- assert_equal([],table.column_names)
197
- assert_equal([%w[col1 col2 col3],%w[a b c],["d",nil,"e"]].to_table, table)
198
-
199
- end
200
-
201
- # ticket:76
202
- def test_parse
203
-
204
- assert_nothing_raised {
205
- Ruport::Data::Table.parse("a,b,c\n1,2,3\n")
206
- }
207
-
208
- table = Ruport::Data::Table.parse("a,b,c\n1,2,3\n4,5,6\n")
209
- expected = [%w[1 2 3],%w[4 5 6]].to_table(%w[a b c])
210
-
211
- table = Ruport::Data::Table.parse( "a\tb\tc\n1\t2\t3\n4\t5\t6\n",
212
- :csv_options => { :col_sep => "\t" } )
213
- assert_equal expected, table
214
-
215
- table = Ruport::Data::Table.parse( "a,b,c\n1,2,3\n4,5,6\n",
216
- :has_names => false)
217
- assert_equal([],table.column_names)
218
- assert_equal([%w[a b c],%w[1 2 3], %w[4 5 6]].to_table, table)
219
-
220
-
221
- end
222
-
223
- def test_csv_block_form
224
- expected = [%w[a b],%w[1 2],%w[3 4]]
225
- t = Ruport::Data::Table.send(:get_table_from_csv,
226
- :parse, "a,b\n1,2\n3,4",
227
- :has_names => false) do |s,r|
228
- assert_equal expected.shift, r
229
- s << r
230
- end
231
- assert_equal [%w[a b],%w[1 2],%w[3 4]].to_table, t
101
+ assert_equal [[3,4,1],[7,9,5]].to_table(%w[c d a]), table
232
102
  end
233
103
 
234
104
  def test_reorder
@@ -253,222 +123,57 @@ class TestTable < Test::Unit::TestCase
253
123
  r.instance_eval{@attributes}.object_id
254
124
  }
255
125
  end
256
-
257
- def test_add_column
258
-
259
- a = [[1,2],[3,4],[5,6]].to_table(%w[a b])
260
- a.add_column("c")
261
- assert_equal [[1,2,nil],[3,4,nil],[5,6,nil]].to_table(%w[a b c]), a
262
-
263
- a = [[1,2],[3,4],[5,6]].to_table(%w[a b])
264
- a.add_column("c",:default => "x")
265
- assert_equal [[1,2,'x'],[3,4,'x'],[5,6,'x']].to_table(%w[a b c]), a
266
-
267
- b = a.dup
268
- b.add_column("x",:before => "b")
269
- assert_equal [[1,nil,2,'x'],
270
- [3,nil,4,'x'],
271
- [5,nil,6,'x']].to_table(%w[a x b c]), b
272
-
273
- b = a.dup
274
- b.add_column("x",:after => "b")
275
- assert_equal [[1,2,nil,'x'],
276
- [3,4,nil,'x'],
277
- [5,6,nil,'x']].to_table(%w[a b x c]), b
278
-
279
-
280
- a.add_column("d") { |r| r[0]+r[1] }
281
- assert_equal(
282
- [ [1,2,'x',3],
283
- [3,4,'x',7],
284
- [5,6,'x',11] ].to_table(%w[a b c d]), a)
285
-
286
- a.add_column("x",:position => 1)
287
- assert_equal(
288
- [ [1,nil,2,'x',3],
289
- [3,nil,4,'x',7],
290
- [5,nil,6,'x',11] ].to_table(%w[a x b c d]), a)
291
-
292
- end
293
126
 
294
- def test_add_columns
295
- a = [[1,2],[3,4],[5,6]].to_table(%w[a b])
296
- a.add_columns(%w[c d])
297
- expected = [ [1,2,nil,nil],
298
- [3,4,nil,nil],
299
- [5,6,nil,nil] ].to_table(%w[a b c d])
300
-
301
- assert_equal expected, a
127
+ def test_sort_rows_by
128
+ table = Ruport::Data::Table.new :column_names => %w[a b c]
129
+ table << [1,2,3] << [6,1,8] << [9,1,4]
302
130
 
303
- a = [[1,2],[3,4],[5,6]].to_table(%w[a b])
131
+ table2 = Ruport::Data::Table.new :column_names => [:a, :b, :c]
132
+ table2 << [1,2,3] << [6,1,8] << [9,1,4]
133
+
134
+ sorted_table_a = Ruport::Data::Table.new :column_names => %w[a b c]
135
+ sorted_table_a << [1,2,3] << [6,1,8] << [9,1,4]
136
+
137
+ sorted_table_b = Ruport::Data::Table.new :column_names => %w[a b c]
138
+ sorted_table_b << [6,1,8] << [9,1,4] << [1,2,3]
304
139
 
305
- a.add_columns(%w[c d],:after => "a")
140
+ sorted_table_bc = Ruport::Data::Table.new :column_names => %w[a b c]
141
+ sorted_table_bc << [9,1,4] << [6,1,8] << [1,2,3]
306
142
 
307
- expected = [ [1,nil,nil,2],
308
- [3,nil,nil,4],
309
- [5,nil,nil,6], ].to_table(%w[a c d b])
143
+ sorted_table_bs = Ruport::Data::Table.new :column_names => [:a, :b, :c]
144
+ sorted_table_bs << [6,1,8] << [9,1,4] << [1,2,3]
310
145
 
311
- assert_equal expected, a
312
-
313
- a.add_columns(%w[x f],:before => "a")
314
-
315
- expected = [ [nil,nil,1,nil,nil,2],
316
- [nil,nil,3,nil,nil,4],
317
- [nil,nil,5,nil,nil,6] ].to_table(%w[x f a c d b])
318
-
319
- assert_equal expected, a
320
-
321
- a = [[1,2,0],[3,4,0],[5,6,0]].to_table(%w[a b c])
322
-
323
- a.add_columns(%w[x y],:default => 9, :position => 1)
324
-
325
- expected = [[1,9,9,2,0],[3,9,9,4,0],[5,9,9,6,0]].to_table(%w[a x y b c])
326
-
327
- assert_equal expected, a
328
-
329
- a = [[1,2],[3,4],[5,6]].to_table(%w[a b])
330
- a.add_columns(%w[f x],:default => 0)
146
+ assert_equal sorted_table_a, table.sort_rows_by {|r| r['a']}
147
+ assert_equal sorted_table_b, table.sort_rows_by(['b'])
148
+ assert_equal sorted_table_bc, table.sort_rows_by(['b', 'c'])
149
+ assert_equal sorted_table_bs, table2.sort_rows_by(:b)
150
+ end
151
+
152
+ def test_sort_rows_by!
153
+ table = Ruport::Data::Table.new :column_names => %w[a b c]
154
+ table << [1,2,3] << [6,1,8] << [9,1,4]
155
+
156
+ sorted_table_a = Ruport::Data::Table.new :column_names => %w[a b c]
157
+ sorted_table_a << [1,2,3] << [6,1,8] << [9,1,4]
158
+
159
+ sorted_table_b = Ruport::Data::Table.new :column_names => %w[a b c]
160
+ sorted_table_b << [6,1,8] << [9,1,4] << [1,2,3]
331
161
 
332
- expected = [[1,2,0,0],[3,4,0,0],[5,6,0,0]].to_table(%w[a b f x])
333
- assert_equal expected, a
162
+ sorted_table_bc = Ruport::Data::Table.new :column_names => %w[a b c]
163
+ sorted_table_bc << [9,1,4] << [6,1,8] << [1,2,3]
334
164
 
335
- assert_raises(RuntimeError) do
336
- a.add_columns(%w[a b]) { }
337
- end
165
+ table_a = table.dup
166
+ table_a.sort_rows_by! { |r| r['a'] }
338
167
 
339
-
168
+ table_b = table.dup
169
+ table_b.sort_rows_by!("b")
340
170
 
341
- end
171
+ table_bc = table.dup
172
+ table_bc.sort_rows_by!(['b', 'c'])
342
173
 
343
- def test_remove_column
344
- a = Table(%w[a b c]) { |t| t << [1,2,3] << [4,5,6] }
345
- b = a.dup
346
-
347
- a.remove_column("b")
348
- assert_equal Table(%w[a c]) { |t| t << [1,3] << [4,6] }, a
349
-
350
- b.remove_column(2)
351
- assert_equal Table(%w[a b]) { |t| t << [1,2] << [4,5] }, b
352
- end
353
-
354
- def test_remove_columns
355
- a = Table(%w[a b c d]) { |t| t << [1,2,3,4] << [5,6,7,8] }
356
- b = a.dup
357
- a.remove_columns("b","d")
358
- assert_equal Table(%w[a c]) { |t| t << [1,3] << [5,7] }, a
359
- b.remove_columns(%w[a c])
360
- assert_equal Table(%w[b d]) { |t| t << [2,4] << [6,8] }, b
361
- end
362
-
363
- def test_rename_column
364
- a = Table(%w[a b]) { |t| t << [1,2] << [3,4] }
365
- a.rename_column("b","x")
366
- assert_equal Table(%w[a x]) { |t| t << [1,2] << [3,4] }, a
367
- end
368
-
369
-
370
- def test_rename_columns
371
- a = Table(%w[a b]) { |t| t << [1,2] << [3,4] }
372
- a.rename_columns(%w[a b], %w[x y])
373
- assert_equal Table(%w[x y]) { |t| t << [1,2] << [3,4] }, a
374
-
375
- a = Table(%w[a b]) { |t| t << [1,2] << [3,4] }
376
- a.rename_columns("a"=>"x","b"=>"y")
377
- assert_equal Table(%w[x y]) { |t| t << [1,2] << [3,4] }, a
378
-
379
- a = Table(%w[a b]) { |t| t << [1,2] << [3,4] }
380
- assert_raise(ArgumentError) { a.rename_columns(%w[a b], %w[x]) }
381
-
382
- a = Table(%w[a b c]) { |t| t << [1,2,3] << [4,5,6] }
383
- a.rename_columns { |r| r.to_sym }
384
- assert_equal(a, Table(:a,:b,:c) { |t| t << [1,2,3] << [4,5,6] })
385
-
386
- a = Table(%w[a b c]) { |t| t << [1,2,3] << [4,5,6] }
387
- a.rename_columns(%w[a c]) { |r| r.to_sym }
388
- assert_equal(a, Table(:a,"b",:c) { |t| t << [1,2,3] << [4,5,6] })
389
- end
390
-
391
- def test_swap_column
392
- a = Table(%w[a b]) { |t| t << [1,2] << [3,4] }
393
- a.swap_column("a","b")
394
- assert_equal Table(%w[b a]) { |t| t << [2,1] << [4,3] }, a
395
- a.swap_column(1,0)
396
- assert_equal Table(%w[a b]) { |t| t << [1,2] << [3,4] }, a
397
- end
398
-
399
- def test_replace_column
400
- a = Table(%w[a b c]) { |t| t << [1,2,3] << [4,5,6] }
401
- a.replace_column("b","d") { |r| r.b.to_s }
402
- assert_equal Table(%w[a d c]) { |t| t << [1,"2",3] << [4,"5",6] }, a
403
- a.replace_column("d") { |r| r.d.to_i }
404
- assert_equal Table(%w[a d c]) { |t| t << [1,2,3] << [4,5,6] }, a
405
- end
406
-
407
- def test_append_chain
408
- table = Ruport::Data::Table.new :column_names => %w[a b c]
409
- table << [1,2,3] << [4,5,6] << [7,8,9]
410
- assert_equal 3, table.length
411
- assert_equal 5, table[1].b
412
- end
413
-
414
- def test_to_hack
415
- table = Ruport::Data::Table.new :column_names => %w[a b],
416
- :data => [[1,2],[3,4],[5,6]]
417
- assert_equal("a,b\n1,2\n3,4\n5,6\n",table.to_csv)
418
- assert_raises(Ruport::Renderer::UnknownFormatError) { table.to_nothing }
419
- end
420
-
421
-
422
- def test_sort_rows_by
423
- table = Ruport::Data::Table.new :column_names => %w[a b c]
424
- table << [1,2,3] << [6,1,8] << [9,1,4]
425
-
426
- table2 = Ruport::Data::Table.new :column_names => [:a, :b, :c]
427
- table2 << [1,2,3] << [6,1,8] << [9,1,4]
428
-
429
- sorted_table_a = Ruport::Data::Table.new :column_names => %w[a b c]
430
- sorted_table_a << [1,2,3] << [6,1,8] << [9,1,4]
431
-
432
- sorted_table_b = Ruport::Data::Table.new :column_names => %w[a b c]
433
- sorted_table_b << [6,1,8] << [9,1,4] << [1,2,3]
434
-
435
- sorted_table_bc = Ruport::Data::Table.new :column_names => %w[a b c]
436
- sorted_table_bc << [9,1,4] << [6,1,8] << [1,2,3]
437
-
438
- sorted_table_bs = Ruport::Data::Table.new :column_names => [:a, :b, :c]
439
- sorted_table_bs << [6,1,8] << [9,1,4] << [1,2,3]
440
-
441
- assert_equal sorted_table_a, table.sort_rows_by {|r| r['a']}
442
- assert_equal sorted_table_b, table.sort_rows_by(['b'])
443
- assert_equal sorted_table_bc, table.sort_rows_by(['b', 'c'])
444
- assert_equal sorted_table_bs, table2.sort_rows_by(:b)
445
- end
446
-
447
- def test_sort_rows_by!
448
- table = Ruport::Data::Table.new :column_names => %w[a b c]
449
- table << [1,2,3] << [6,1,8] << [9,1,4]
450
-
451
- sorted_table_a = Ruport::Data::Table.new :column_names => %w[a b c]
452
- sorted_table_a << [1,2,3] << [6,1,8] << [9,1,4]
453
-
454
- sorted_table_b = Ruport::Data::Table.new :column_names => %w[a b c]
455
- sorted_table_b << [6,1,8] << [9,1,4] << [1,2,3]
456
-
457
- sorted_table_bc = Ruport::Data::Table.new :column_names => %w[a b c]
458
- sorted_table_bc << [9,1,4] << [6,1,8] << [1,2,3]
459
-
460
- table_a = table.dup
461
- table_a.sort_rows_by! { |r| r['a'] }
462
-
463
- table_b = table.dup
464
- table_b.sort_rows_by!("b")
465
-
466
- table_bc = table.dup
467
- table_bc.sort_rows_by!(['b', 'c'])
468
-
469
- assert_equal sorted_table_a, table_a
470
- assert_equal sorted_table_b, table_b
471
- assert_equal sorted_table_bc, table_bc
174
+ assert_equal sorted_table_a, table_a
175
+ assert_equal sorted_table_b, table_b
176
+ assert_equal sorted_table_bc, table_bc
472
177
  end
473
178
 
474
179
  def test_array_hack
@@ -506,49 +211,9 @@ class TestTable < Test::Unit::TestCase
506
211
  b.map { |r| r.name }
507
212
 
508
213
  end
509
-
510
- def test_to_hack_takes_args
511
- a = Table(%w[hello mr crowley]) << %w[would you like] << %w[one red cat]
512
-
513
- assert_equal "would,you,like\none,red,cat\n",
514
- a.to_csv(:show_table_headers => false)
515
-
516
- assert_equal "would,you,like\none,red,cat\n",
517
- a.to_csv { |r| r.show_table_headers = false }
518
-
519
- assert_equal "would\tyou\tlike\none\tred\tcat\n",
520
- a.to_csv(:show_table_headers => false) { |r|
521
- r.format_options = { :col_sep => "\t" }
522
- }
523
-
524
- end
525
-
526
- def test_as_throws_proper_errors
527
- a = [[1,2,3],[4,5,6]].to_table(%w[a b c])
528
- assert_nothing_raised { a.as(:csv) }
529
- assert_nothing_raised { a.to_csv }
530
- assert_raises(Ruport::Renderer::UnknownFormatError) { a.as(:nothing) }
531
- assert_raises(Ruport::Renderer::UnknownFormatError) { a.to_nothing }
532
- end
533
-
534
214
 
535
215
  ## BUG Traps -------------------------------------------------
536
216
 
537
- def test_ensure_setting_column_names_changes_record_attributes
538
- table = Ruport::Data::Table.new :column_names => %w[a b c],
539
- :data => [[1,2,3],[4,5,6]]
540
-
541
- assert_equal %w[a b c], table.column_names
542
- assert_equal %w[a b c], table.data[0].attributes
543
- assert_equal %w[a b c], table.data[1].attributes
544
-
545
- table.column_names = %w[d e f]
546
-
547
- assert_equal %w[d e f], table.column_names
548
- assert_equal %w[d e f], table.data[0].attributes
549
- assert_equal %w[d e f], table.data[1].attributes
550
- end
551
-
552
217
  def test_ensure_table_creation_allows_record_coercion
553
218
  table = [[1,2,3],[4,5,6],[7,8,9]].to_table
554
219
  table_with_names = [[1,2,3],[4,5,6],[7,8,9]].to_table(%w[a b c])
@@ -577,24 +242,6 @@ class TestTable < Test::Unit::TestCase
577
242
  }
578
243
  end
579
244
 
580
- def test_ensure_using_csv_block_mode_works
581
- expected = [%w[a b],%w[1 2],%w[3 4]]
582
- t = Ruport::Data::Table.parse("a,b\n1,2\n3,4",:has_names => false) { |s,r|
583
- assert_equal expected.shift, r
584
- s << r
585
- s << r
586
- }
587
- assert_equal [%w[a b],%w[a b],%w[1 2], %w[1 2],
588
- %w[3 4],%w[3 4]].to_table, t
589
- x = Ruport::Data::Table.load("test/samples/data.csv") { |s,r|
590
- assert_kind_of Ruport::Data::Table, s
591
- assert_kind_of Array, r
592
- s << r
593
- s << r
594
- }
595
- assert_equal 4, x.length
596
- end
597
-
598
245
  def test_ensure_coerce_sum
599
246
  s = [["1"],["3"],["5"] ].to_table
600
247
  t = [["1.23"],["1.5"]].to_table
@@ -625,6 +272,300 @@ class TestTable < Test::Unit::TestCase
625
272
  assert_equal [[1,2,3],[4,5,6],[7,8,9]].to_table,a
626
273
  end
627
274
 
275
+ def test_ensure_propagate_record_class
276
+ a = Table(:record_class => DuckRecord)
277
+ assert_equal DuckRecord, a.record_class
278
+
279
+ b = a.dup
280
+ assert_equal DuckRecord, b.record_class
281
+ end
282
+
283
+ def test_ensure_reorder_raises_on_bad_reorder_use
284
+ a = Table() << [1,2,3] << [4,5,6]
285
+ assert_raise(ArgumentError) { a.reorder("a","b","c") }
286
+ assert_raise(ArgumentError) { a.reorder(%w[a b c]) }
287
+ assert_raise(ArgumentError) { a.reorder(2,1,0) }
288
+ end
289
+
290
+ class MySubClass < Ruport::Data::Table; end
291
+
292
+ def test_ensure_table_subclasses_render_properly
293
+ a = MySubClass.new
294
+ a << [1,2,3] << [4,5,6]
295
+ assert_equal("1,2,3\n4,5,6\n",a.as(:csv))
296
+ end
297
+
298
+ end
299
+
300
+ class TestTableAppendOperations < Test::Unit::TestCase
301
+ def test_append_record
302
+ table = Ruport::Data::Table.new :column_names => %w[a b c]
303
+ table << Ruport::Data::Record.new([1,2,3], :attributes => %w[a b c])
304
+ assert_equal([1,2,3],table[0].to_a)
305
+ assert_equal(%w[a b c],table[0].attributes)
306
+ rec = table[0].dup
307
+ rec.attributes = %w[a b c d]
308
+ assert_raise(NoMethodError) { table << Object.new }
309
+ end
310
+
311
+ def test_append_hash
312
+ table = [[1,2,3],[4,5,6]].to_table(%w[a b c])
313
+ table << { "a" => 7, "c" => 9, "b" => 8 }
314
+
315
+ assert_equal [[1,2,3],[4,5,6],[7,8,9]].to_table(%w[a b c]), table
316
+ end
317
+
318
+ def test_append_table
319
+ first = Ruport::Data::Table.new :column_names => %w[a b c],
320
+ :data => [[1,2,3],[4,5,6]]
321
+
322
+ second = Ruport::Data::Table.new :column_names => %w[a b c],
323
+ :data => [[7,8,9],[10,11,12]]
324
+
325
+ combo = first + second
326
+
327
+ assert_equal Ruport::Data::Table.new(:column_names => %w[a b c],
328
+ :data => [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]), combo
329
+ end
330
+
331
+ def test_append_chain
332
+ table = Ruport::Data::Table.new :column_names => %w[a b c]
333
+ table << [1,2,3] << [4,5,6] << [7,8,9]
334
+ assert_equal 3, table.length
335
+ assert_equal 5, table[1].b
336
+ end
337
+ end
338
+
339
+ class TestTableFormattingHooks < Test::Unit::TestCase
340
+
341
+ def test_to_hack_takes_args
342
+ a = Table(%w[hello mr crowley]) << %w[would you like] << %w[one red cat]
343
+
344
+ assert_equal "would,you,like\none,red,cat\n",
345
+ a.to_csv(:show_table_headers => false)
346
+
347
+ assert_equal "would,you,like\none,red,cat\n",
348
+ a.to_csv { |r| r.show_table_headers = false }
349
+
350
+ assert_equal "would\tyou\tlike\none\tred\tcat\n",
351
+ a.to_csv(:show_table_headers => false) { |r|
352
+ r.format_options = { :col_sep => "\t" }
353
+ }
354
+
355
+ end
356
+
357
+ def test_to_hack
358
+ table = Ruport::Data::Table.new :column_names => %w[a b],
359
+ :data => [[1,2],[3,4],[5,6]]
360
+ assert_equal("a,b\n1,2\n3,4\n5,6\n",table.to_csv)
361
+ assert_raises(Ruport::Renderer::UnknownFormatError) { table.to_nothing }
362
+ end
363
+
364
+ def test_as_throws_proper_errors
365
+ a = [[1,2,3],[4,5,6]].to_table(%w[a b c])
366
+ assert_nothing_raised { a.as(:csv) }
367
+ assert_nothing_raised { a.to_csv }
368
+ assert_raises(Ruport::Renderer::UnknownFormatError) { a.as(:nothing) }
369
+ assert_raises(Ruport::Renderer::UnknownFormatError) { a.to_nothing }
370
+ end
371
+
372
+ end
373
+
374
+ class TestTableColumnOperations < Test::Unit::TestCase
375
+
376
+ def test_column
377
+ a = [[1,2,3],[4,5,6]].to_table(%w[a b c])
378
+ assert_equal [3,6], a.column(2)
379
+ assert_equal [2,5], a.column("b")
380
+
381
+ assert_raise(ArgumentError) { a.column("d") }
382
+ assert_raise(ArgumentError) { a.column(42) }
383
+
384
+ a = [[1],[2],[3],[4]].to_table
385
+ assert_equal [1,2,3,4], a.column(0)
386
+ end
387
+
388
+ def test_set_column_names
389
+ a = [[1,2,3],[4,5,6]].to_table
390
+
391
+ assert_equal([],a.column_names)
392
+ assert_equal([[1,2,3],[4,5,6]],a.map { |r| r.to_a } )
393
+
394
+ a.column_names = %w[a b c]
395
+ assert_equal(%w[a b c],a.column_names)
396
+ a.each { |r| assert_equal(%w[a b c], r.attributes) }
397
+ assert_equal([[1,2,3],[4,5,6]],a.map { |r| r.to_a })
398
+
399
+ a.column_names = %w[d e f]
400
+ assert_equal(%w[d e f],a.column_names)
401
+ a.each { |r| assert_equal(%w[d e f], r.attributes) }
402
+ assert_equal([[1,2,3],[4,5,6]],a.map { |r| r.to_a })
403
+ end
404
+
405
+ def test_add_column
406
+
407
+ a = [[1,2],[3,4],[5,6]].to_table(%w[a b])
408
+ a.add_column("c")
409
+ assert_equal [[1,2,nil],[3,4,nil],[5,6,nil]].to_table(%w[a b c]), a
410
+
411
+ a = [[1,2],[3,4],[5,6]].to_table(%w[a b])
412
+ a.add_column("c",:default => "x")
413
+ assert_equal [[1,2,'x'],[3,4,'x'],[5,6,'x']].to_table(%w[a b c]), a
414
+
415
+ b = a.dup
416
+ b.add_column("x",:before => "b")
417
+ assert_equal [[1,nil,2,'x'],
418
+ [3,nil,4,'x'],
419
+ [5,nil,6,'x']].to_table(%w[a x b c]), b
420
+
421
+ b = a.dup
422
+ b.add_column("x",:after => "b")
423
+ assert_equal [[1,2,nil,'x'],
424
+ [3,4,nil,'x'],
425
+ [5,6,nil,'x']].to_table(%w[a b x c]), b
426
+
427
+
428
+ a.add_column("d") { |r| r[0]+r[1] }
429
+ assert_equal(
430
+ [ [1,2,'x',3],
431
+ [3,4,'x',7],
432
+ [5,6,'x',11] ].to_table(%w[a b c d]), a)
433
+
434
+ a.add_column("x",:position => 1)
435
+ assert_equal(
436
+ [ [1,nil,2,'x',3],
437
+ [3,nil,4,'x',7],
438
+ [5,nil,6,'x',11] ].to_table(%w[a x b c d]), a)
439
+
440
+ end
441
+
442
+ def test_add_columns
443
+ a = [[1,2],[3,4],[5,6]].to_table(%w[a b])
444
+ a.add_columns(%w[c d])
445
+ expected = [ [1,2,nil,nil],
446
+ [3,4,nil,nil],
447
+ [5,6,nil,nil] ].to_table(%w[a b c d])
448
+
449
+ assert_equal expected, a
450
+
451
+ a = [[1,2],[3,4],[5,6]].to_table(%w[a b])
452
+
453
+ a.add_columns(%w[c d],:after => "a")
454
+
455
+ expected = [ [1,nil,nil,2],
456
+ [3,nil,nil,4],
457
+ [5,nil,nil,6], ].to_table(%w[a c d b])
458
+
459
+ assert_equal expected, a
460
+
461
+ a.add_columns(%w[x f],:before => "a")
462
+
463
+ expected = [ [nil,nil,1,nil,nil,2],
464
+ [nil,nil,3,nil,nil,4],
465
+ [nil,nil,5,nil,nil,6] ].to_table(%w[x f a c d b])
466
+
467
+ assert_equal expected, a
468
+
469
+ a = [[1,2,0],[3,4,0],[5,6,0]].to_table(%w[a b c])
470
+
471
+ a.add_columns(%w[x y],:default => 9, :position => 1)
472
+
473
+ expected = [[1,9,9,2,0],[3,9,9,4,0],[5,9,9,6,0]].to_table(%w[a x y b c])
474
+
475
+ assert_equal expected, a
476
+
477
+ a = [[1,2],[3,4],[5,6]].to_table(%w[a b])
478
+ a.add_columns(%w[f x],:default => 0)
479
+
480
+ expected = [[1,2,0,0],[3,4,0,0],[5,6,0,0]].to_table(%w[a b f x])
481
+ assert_equal expected, a
482
+
483
+ assert_raises(RuntimeError) do
484
+ a.add_columns(%w[a b]) { }
485
+ end
486
+
487
+ end
488
+
489
+ def test_remove_column
490
+ a = Table(%w[a b c]) { |t| t << [1,2,3] << [4,5,6] }
491
+ b = a.dup
492
+
493
+ a.remove_column("b")
494
+ assert_equal Table(%w[a c]) { |t| t << [1,3] << [4,6] }, a
495
+
496
+ b.remove_column(2)
497
+ assert_equal Table(%w[a b]) { |t| t << [1,2] << [4,5] }, b
498
+ end
499
+
500
+ def test_remove_columns
501
+ a = Table(%w[a b c d]) { |t| t << [1,2,3,4] << [5,6,7,8] }
502
+ b = a.dup
503
+ a.remove_columns("b","d")
504
+ assert_equal Table(%w[a c]) { |t| t << [1,3] << [5,7] }, a
505
+ b.remove_columns(%w[a c])
506
+ assert_equal Table(%w[b d]) { |t| t << [2,4] << [6,8] }, b
507
+ end
508
+
509
+ def test_rename_column
510
+ a = Table(%w[a b]) { |t| t << [1,2] << [3,4] }
511
+ a.rename_column("b","x")
512
+ assert_equal Table(%w[a x]) { |t| t << [1,2] << [3,4] }, a
513
+ end
514
+
515
+ def test_rename_columns
516
+ a = Table(%w[a b]) { |t| t << [1,2] << [3,4] }
517
+ a.rename_columns(%w[a b], %w[x y])
518
+ assert_equal Table(%w[x y]) { |t| t << [1,2] << [3,4] }, a
519
+
520
+ a = Table(%w[a b]) { |t| t << [1,2] << [3,4] }
521
+ a.rename_columns("a"=>"x","b"=>"y")
522
+ assert_equal Table(%w[x y]) { |t| t << [1,2] << [3,4] }, a
523
+
524
+ a = Table(%w[a b]) { |t| t << [1,2] << [3,4] }
525
+ assert_raise(ArgumentError) { a.rename_columns(%w[a b], %w[x]) }
526
+
527
+ a = Table(%w[a b c]) { |t| t << [1,2,3] << [4,5,6] }
528
+ a.rename_columns { |r| r.to_sym }
529
+ assert_equal(a, Table(:a,:b,:c) { |t| t << [1,2,3] << [4,5,6] })
530
+
531
+ a = Table(%w[a b c]) { |t| t << [1,2,3] << [4,5,6] }
532
+ a.rename_columns(%w[a c]) { |r| r.to_sym }
533
+ assert_equal(a, Table(:a,"b",:c) { |t| t << [1,2,3] << [4,5,6] })
534
+ end
535
+
536
+ def test_swap_column
537
+ a = Table(%w[a b]) { |t| t << [1,2] << [3,4] }
538
+ a.swap_column("a","b")
539
+ assert_equal Table(%w[b a]) { |t| t << [2,1] << [4,3] }, a
540
+ a.swap_column(1,0)
541
+ assert_equal Table(%w[a b]) { |t| t << [1,2] << [3,4] }, a
542
+ end
543
+
544
+ def test_replace_column
545
+ a = Table(%w[a b c]) { |t| t << [1,2,3] << [4,5,6] }
546
+ a.replace_column("b","d") { |r| r.b.to_s }
547
+ assert_equal Table(%w[a d c]) { |t| t << [1,"2",3] << [4,"5",6] }, a
548
+ a.replace_column("d") { |r| r.d.to_i }
549
+ assert_equal Table(%w[a d c]) { |t| t << [1,2,3] << [4,5,6] }, a
550
+ end
551
+
552
+ # --- BUG TRAPS ------------------------------------
553
+
554
+ def test_ensure_setting_column_names_changes_record_attributes
555
+ table = Ruport::Data::Table.new :column_names => %w[a b c],
556
+ :data => [[1,2,3],[4,5,6]]
557
+
558
+ assert_equal %w[a b c], table.column_names
559
+ assert_equal %w[a b c], table.data[0].attributes
560
+ assert_equal %w[a b c], table.data[1].attributes
561
+
562
+ table.column_names = %w[d e f]
563
+
564
+ assert_equal %w[d e f], table.column_names
565
+ assert_equal %w[d e f], table.data[0].attributes
566
+ assert_equal %w[d e f], table.data[1].attributes
567
+ end
568
+
628
569
  def test_ensure_setting_column_names_later_does_not_break_replace_column
629
570
  a = [[1,2,3],[4,5,6]].to_table(%w[a b c])
630
571
  a.replace_column("b","q") { |r| r.a + r.c }
@@ -648,22 +589,103 @@ class TestTable < Test::Unit::TestCase
648
589
  a.replace_column("b","foo") { |r| r.b + 1 }
649
590
 
650
591
  assert_equal [[1,6,6],[4,9,9]].to_table(%w[a foo c]), a
651
- end
592
+ end
652
593
 
653
- def test_ensure_propagate_record_class
654
- a = Table(:record_class => DuckRecord)
655
- assert_equal DuckRecord, a.record_class
594
+ end
656
595
 
657
- b = a.dup
658
- assert_equal DuckRecord, b.record_class
596
+ class TestTableFromCSV < Test::Unit::TestCase
597
+
598
+ def test_csv_load
599
+ table = Ruport::Data::Table.load("test/samples/data.csv")
600
+ assert_equal %w[col1 col2 col3], table.column_names
601
+ rows = [%w[a b c],["d",nil,"e"]]
602
+ table.each { |r| assert_equal rows.shift, r.to_a
603
+ assert_equal %w[col1 col2 col3], r.attributes }
604
+ expected = [%w[1 2 3],%w[4 5 6]].to_table(%w[a b c])
605
+
606
+ # ticket:94
607
+ table = Ruport::Data::Table.load( "test/samples/data.tsv",
608
+ :csv_options => { :col_sep => "\t" } )
609
+ assert_equal expected, table
610
+
611
+
612
+ expected = ['c','e']
613
+
614
+ table = Ruport::Data::Table.load( "test/samples/data.csv", :csv_options =>
615
+ { :headers => true, :header_converters => :symbol } ) do |s,r|
616
+ assert_equal expected.shift, r[:col3]
617
+ end
618
+
619
+ assert_equal [:col1,:col2,:col3], table.column_names
620
+
621
+
622
+ expected = ['c','e']
623
+
624
+ Ruport::Data::Table.load( "test/samples/data.csv",
625
+ :records => true ) do |s,r|
626
+ assert_equal expected.shift, r.col3
627
+ assert_kind_of Ruport::Data::Record, r
628
+ end
629
+
630
+ table = Ruport::Data::Table.load( "test/samples/data.csv",
631
+ :has_names => false )
632
+ assert_equal([],table.column_names)
633
+ assert_equal([%w[col1 col2 col3],%w[a b c],["d",nil,"e"]].to_table, table)
634
+
659
635
  end
660
636
 
661
- def test_ensure_reorder_raises_on_bad_reorder_use
662
- a = Table() << [1,2,3] << [4,5,6]
663
- assert_raise(ArgumentError) { a.reorder("a","b","c") }
664
- assert_raise(ArgumentError) { a.reorder(%w[a b c]) }
665
- assert_raise(ArgumentError) { a.reorder(2,1,0) }
666
- end
637
+ # ticket:76
638
+ def test_parse
639
+
640
+ assert_nothing_raised {
641
+ Ruport::Data::Table.parse("a,b,c\n1,2,3\n")
642
+ }
643
+
644
+ table = Ruport::Data::Table.parse("a,b,c\n1,2,3\n4,5,6\n")
645
+ expected = [%w[1 2 3],%w[4 5 6]].to_table(%w[a b c])
646
+
647
+ table = Ruport::Data::Table.parse( "a\tb\tc\n1\t2\t3\n4\t5\t6\n",
648
+ :csv_options => { :col_sep => "\t" } )
649
+ assert_equal expected, table
650
+
651
+ table = Ruport::Data::Table.parse( "a,b,c\n1,2,3\n4,5,6\n",
652
+ :has_names => false)
653
+ assert_equal([],table.column_names)
654
+ assert_equal([%w[a b c],%w[1 2 3], %w[4 5 6]].to_table, table)
655
+
656
+
657
+ end
658
+
659
+ def test_csv_block_form
660
+ expected = [%w[a b],%w[1 2],%w[3 4]]
661
+ t = Ruport::Data::Table.send(:get_table_from_csv,
662
+ :parse, "a,b\n1,2\n3,4",
663
+ :has_names => false) do |s,r|
664
+ assert_equal expected.shift, r
665
+ s << r
666
+ end
667
+ assert_equal [%w[a b],%w[1 2],%w[3 4]].to_table, t
668
+ end
669
+
670
+ # - BUG TRAPS --------------------
671
+
672
+ def test_ensure_using_csv_block_mode_works
673
+ expected = [%w[a b],%w[1 2],%w[3 4]]
674
+ t = Ruport::Data::Table.parse("a,b\n1,2\n3,4",:has_names => false) { |s,r|
675
+ assert_equal expected.shift, r
676
+ s << r
677
+ s << r
678
+ }
679
+ assert_equal [%w[a b],%w[a b],%w[1 2], %w[1 2],
680
+ %w[3 4],%w[3 4]].to_table, t
681
+ x = Ruport::Data::Table.load("test/samples/data.csv") { |s,r|
682
+ assert_kind_of Ruport::Data::Table, s
683
+ assert_kind_of Array, r
684
+ s << r
685
+ s << r
686
+ }
687
+ assert_equal 4, x.length
688
+ end
667
689
 
668
690
  def test_ensure_csv_loading_accepts_table_options
669
691
  a = Table("test/samples/addressbook.csv",:record_class => DuckRecord)
@@ -676,19 +698,9 @@ class TestTable < Test::Unit::TestCase
676
698
  assert_kind_of(DuckRecord,r)
677
699
  end
678
700
  end
679
-
680
- class MySubClass < Ruport::Data::Table; end
681
701
 
682
- def test_ensure_table_subclasses_render_properly
683
- a = MySubClass.new
684
- a << [1,2,3] << [4,5,6]
685
- assert_equal("1,2,3\n4,5,6\n",a.as(:csv))
686
- end
687
-
688
702
  end
689
703
 
690
- class DuckRecord < Ruport::Data::Record; end
691
-
692
704
  class TestTableKernelHack < Test::Unit::TestCase
693
705
 
694
706
  def test_simple