extcsv 0.10.0

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.
@@ -0,0 +1,491 @@
1
+ $:.unshift File.join(File.dirname(__FILE__),"..","lib")
2
+ require 'test/unit'
3
+ require 'extcsv'
4
+ require 'fileutils'
5
+ require 'pp'
6
+ include FileUtils::Verbose
7
+
8
+ ################################################################################
9
+ # Author:: Ralf M�ller
10
+ ################################################################################
11
+ class ExtCsv
12
+ def setmode(mode)
13
+ @mode = mode
14
+ end
15
+ # public :deep_split
16
+ end
17
+
18
+ class TestExtCsv < Test::Unit::TestCase
19
+ TEST_DIR = "test/"
20
+ TEST_DATA_DIR = TEST_DIR + "data/"
21
+ TEST_DATA = TEST_DIR + "data/file00.txt"
22
+ TEST_DATA_NEW = TEST_DIR + "data/file01.txt"
23
+ TEST_FD_DATA = TEST_DATA_NEW
24
+ ERG_CSV_DATA = TEST_DIR + "data/file04.csv"
25
+ ERG_CSV_DATA.freeze
26
+ TEST_OUTOUT_DIR = TEST_DIR + "output"
27
+ IMPORT_TYPE = "file"
28
+ def test_create
29
+ test_simple = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA)
30
+ assert_equal("txt",test_simple.datatype)
31
+ end
32
+ def test_create_csv
33
+ test_simple = ExtCsv.new(IMPORT_TYPE,"csv",ERG_CSV_DATA)
34
+ end
35
+ def test_create_by_hash
36
+ simple = ExtCsv.new("hash","txt",{:col1 => ["80.0"],:col2 => ["625.0"]})
37
+ assert_equal(["80.0"],simple.col1)
38
+ assert_equal(["625.0"],simple.col2)
39
+ end
40
+ def test_create_by_string
41
+ str = File.open(TEST_DATA).read
42
+ td_by_str = ExtCsv.new("string","txt",str)
43
+ org = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA)
44
+ assert_equal(org.size,td_by_str.size)
45
+ assert_equal(org.x2,td_by_str.x2)
46
+ end
47
+ def test_datasets
48
+ test_simple = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA)
49
+ assert_equal(["100.0", "950.0"], test_simple.datasets("col1","col2")[29])
50
+ end
51
+ def test_csv
52
+ test_simple = ExtCsv.new(IMPORT_TYPE,"csv",ERG_CSV_DATA)
53
+ end
54
+ def test_selectBy_index
55
+ test_simple = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA)
56
+ indexes = (0..4).to_a + (10..12).to_a + [15]
57
+ simple_new = test_simple.selectBy_index(indexes)
58
+ assert(!simple_new.col4.empty?)
59
+ assert_equal(test_simple.col4.values_at(*indexes), simple_new.col4)
60
+ end
61
+ def test_selectBy
62
+ simple = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA)
63
+ assert_equal(ExtCsv, simple.selectBy(:col4 => "5").class)
64
+ simple_col1 = simple.selectBy(:col1 => "120.0")
65
+ assert_equal(["120.0"],simple_col1.col1.sort.uniq)
66
+ simple_col1_num = simple.selectBy(:col1 => 120.0)
67
+ assert_equal(["120.0"],simple_col1_num.col1.sort.uniq)
68
+ assert(!simple_col1.col1.empty?)
69
+ assert(!simple.col1.empty?)
70
+ assert_not_equal(simple, simple_col1)
71
+
72
+ # test datacolumns
73
+ assert_equal([],simple.datacolumns - simple.selectBy(:col4 => "5",:col1 => "80.0",:col2 => "500.0").datacolumns)
74
+
75
+ # numeric selection via string, numeric or regexp
76
+ testobj = {}
77
+ fd = ExtCsv.new(IMPORT_TYPE, "txt", TEST_FD_DATA )
78
+ col2 = 50
79
+ testobj[col2] = fd.selectBy(:col2 => col2).col2
80
+ col2 = 50.0
81
+ testobj[col2] = fd.selectBy(:col2 => col2).col2
82
+ col2 = /50/
83
+ testobj[col2] = fd.selectBy(:col2 => col2).col2
84
+ col2="50"
85
+ testobj[col2] = fd.selectBy(:col2 => col2).col2
86
+ testobj.each {|col2,col2s|
87
+ if col2 == /50/
88
+ assert(col2s.sort.uniq.size > 1)
89
+ else
90
+ assert(col2s.sort.uniq.size == 1)
91
+ assert(col2s.sort.uniq.include?("50.0"))
92
+ end
93
+ }
94
+
95
+ # numeric comparison via numeric or string
96
+ testobj = []
97
+ col2 = '<= 500.0'
98
+ size = 80
99
+ testobj << [col2, fd.selectBy(:col2 => col2).col2, size]
100
+ col2 = '<= "500.0"'
101
+ size = 82
102
+ testobj << [col2, fd.selectBy(:col2 => col2).col2, size]
103
+ col2 = '> 500.0'
104
+ size = 40
105
+ testobj << [col2, fd.selectBy(:col2 => col2).col2, size]
106
+ col2 = "> '500.0'"
107
+ size = 38
108
+ testobj << [col2, fd.selectBy(:col2 => col2).col2, size]
109
+ col2 = '> "500.0"'
110
+ size = 38
111
+ col2 = "<= '500.0'"
112
+ size = 82
113
+ testobj << [col2, fd.selectBy(:col2 => col2).col2, size]
114
+ testobj.each {|col2,col2s, s|
115
+ #test $stdout << col2.inspect << "\t" << col2s.size.to_s << ":\t\t" + col2s.sort.uniq.join("\t") << "\n"
116
+ assert_equal(s, col2s.size)
117
+ }
118
+
119
+ # String search
120
+ testobj = {}
121
+ size = fd.size
122
+ string = 'machine1'
123
+ testobj[string] = fd.selectBy(:string => string).string
124
+ string = /machine/
125
+ testobj[string] = fd.selectBy(:string => string).string
126
+ string = '> machine'
127
+ testobj[string] = fd.selectBy(:string => string).string
128
+ testobj.each {|an, ans|
129
+ assert_equal(ans.size, size)
130
+ }
131
+
132
+ # time selection
133
+ testobj = []
134
+ time = '2007-01-19 14:14:19'
135
+ size = 1
136
+ testobj << [time, fd.selectBy(:zeit => time).zeit, size]
137
+ time = /14:14/
138
+ size = 1
139
+ testobj << [time, fd.selectBy(:zeit => time).zeit, size]
140
+ time = "> '2007-01-19 14:14'"
141
+ size = 16
142
+ testobj << [time, fd.selectBy(:zeit => time).zeit, size]
143
+ time = "<= '2007-01-19 14:14'"
144
+ size = fd.size - size
145
+ testobj << [time, fd.selectBy(:zeit => time).zeit, size]
146
+ testobj.each {|t, times, s|
147
+ #test $stdout << t.inspect << "\t" << times.size.to_s << ":\t\t" + times.sort.uniq.join("\t") << "\n"
148
+ assert_equal(s, times.size)
149
+ }
150
+
151
+ # > operation
152
+ simple_large_col1 = simple.selectBy(:col1 => "> 120.0")
153
+ assert_equal(["140.0"],simple_large_col1.col1.uniq)
154
+ # < operation
155
+ simple_scol2ll_col1 = simple.selectBy(:col1 => "< 120.0")
156
+ assert_equal(["80.0","100.0"],simple_scol2ll_col1.col1.sort.uniq.reverse)
157
+ assert(!simple_large_col1.col1.empty?)
158
+ assert(!simple_scol2ll_col1.col1.empty?)
159
+ # >= operation
160
+ s = simple.selectBy(:col1 => ">= 120.0")
161
+ assert_equal(["120.0","140.0"],s.col1.sort.uniq)
162
+ # <= operation
163
+ s = simple.selectBy(:col1 => "<= 120.0")
164
+ assert_equal(["80.0","120.0","100.0"],s.col1.uniq.sort.reverse)
165
+ # == operation
166
+ s = simple.selectBy(:col1 => "== 120.0")
167
+ assert_equal(["120.0"],s.col1.sort.uniq)
168
+ # != operation
169
+ s = simple.selectBy(:col1 => "!= 120.0")
170
+ assert_equal(false, s.col1.collect {|v| v.to_f}.include?("120.0"))
171
+ end
172
+ def test_multiple_select
173
+ simple = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA)
174
+ s_col1 = simple.selectBy(:col1 => "120")
175
+ s_col2 = simple.selectBy(:col2 => "600")
176
+ s_col1col2 = simple.selectBy(:col1 => "120",:col2 => "600")
177
+ s_col1_col2 = simple.selectBy(:col1 => "120").selectBy(:col2 => "600")
178
+ assert(!s_col1col2.empty?)
179
+ assert(!s_col1_col2.empty?)
180
+ assert_equal(s_col1col2.size, s_col1_col2.size)
181
+ assert_equal(s_col1col2, s_col1_col2)
182
+ assert_equal(s_col1col2.x2, s_col1_col2.x2)
183
+ end
184
+ def test_improved_selection
185
+ simple = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA_NEW)
186
+ s_zeit = simple.selectBy(:zeit => "< '2007-01-17 15:34:33'")
187
+ assert_equal("2007-01-17 15:34:21",s_zeit.zeit.max)
188
+ assert_equal(2,s_zeit.size)
189
+ s_col1_col2_foc = simple.selectBy(:col1 => "120",:col2 => "600",:col4 => "5")
190
+ assert_equal(1,s_col1_col2_foc.size)
191
+ # test regexp
192
+ s_foc_regexp = simple.selectBy(:col4 => "(4|5)")
193
+ end
194
+ def _test_method_response
195
+ simple = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA_NEW)
196
+ simple.respond_to?(:selectBy)
197
+ end
198
+
199
+ def test_split
200
+ test = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA)
201
+ col4 = test.col4.dup
202
+ test_col4 = []
203
+ assert_equal(test.split(:col1,:col4).size, test.split(:col4,:col1).size)
204
+ test.split(:col1, :col2,:col4) {|qp| test_col4 << qp.col4.first}
205
+ assert_equal(114,test_col4.size)
206
+ assert_equal([], test_col4 - col4)
207
+ test_c= []
208
+ test.split(:col4) {|qp| test_c << qp.col4[0]}
209
+ assert_equal(["4","5"], test_c.uniq.sort)
210
+ assert_equal([test],test.split())
211
+ end
212
+ def test_deep_split
213
+ retval = []
214
+ test = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA)
215
+ test.deep_split([:col1],retval)
216
+ assert_equal(4,retval.size)
217
+ retval = []
218
+ test.deep_split([:col1,:col4],retval)
219
+ assert_equal(8,retval.size)
220
+ retval = []
221
+ test.deep_split([:col1,:col4,:col2],retval)
222
+ assert_equal(114,retval.size)
223
+ end
224
+ def test_clear
225
+ simple = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA)
226
+ assert_equal(false, simple.col1.empty?)
227
+ simple.clear
228
+ assert(simple.col1.empty?)
229
+ assert(simple.empty?)
230
+ end
231
+ def test_each_by
232
+ simple = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA)
233
+ testary = []
234
+ simple.each_by(:col1) do |k| testary << k; end
235
+ assert_equal(["100.0","120.0","140.0","80.0"],testary)
236
+ end
237
+ def test_each_obj
238
+ simple = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA)
239
+ testary = []
240
+ simple.each_obj(:col1) do |obj| testary << obj.col1[0]; end
241
+ assert_equal(["100.0","120.0","140.0","80.0"],testary)
242
+ testary = []
243
+ simple.each_obj(:col4) do |obj| testary << obj.col4[0]; end
244
+ assert_equal(["4","5"],testary)
245
+ end
246
+ def test_operate
247
+ simple = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA)
248
+ simple_operated = simple.operate_on(:col1,"* 10")
249
+ assert_not_equal(simple.col1, simple_operated)
250
+ thiscol1 = 80.0
251
+ col1s = simple.col1.dup
252
+ simple_op_with_ifclause = simple.operate_on(:col1, '* 10 if self.col1[i].to_f == ' + thiscol1.to_s)
253
+ assert_equal(col1s, simple.col1)
254
+ assert_equal([100,120,140,800],simple_op_with_ifclause.col1.uniq.collect {|k| k.to_i}.sort)
255
+ simple.operate_on!(:col1, '* 10 if self.col1[i].to_f == ' + thiscol1.to_s)
256
+ assert_equal([100,120,140,800],simple.col1.uniq.collect {|k| k.to_i}.sort)
257
+ end
258
+ def test_operate_percol2nent
259
+ simple = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA)
260
+ end
261
+ def test_operateANDselect
262
+ simple = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA)
263
+ simple_foc = simple.selectBy(:col4 => "5")
264
+ simple_foc_changed = simple.selectBy(:col4 => "5").operate_on(:col1,"* 10")
265
+ assert_equal(ExtCsv, simple_foc_changed.class)
266
+ simple_changed = simple.operate_on(:col1,"* 10")
267
+ assert_equal(ExtCsv, simple_changed.class)
268
+ end
269
+ def test_set
270
+ simple = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA).selectBy(:col4 => 5)
271
+ col1_changed = simple.set_column(:col1,"10")
272
+ assert_not_equal(simple.col1, col1_changed.col1)
273
+ assert_equal(["10"], col1_changed.col1.uniq)
274
+ simple.set_column!(:col1,"10")
275
+ assert_equal(["10"], simple.col1.uniq)
276
+ simple.operate_on!(:col1, "* #{Math::PI}")
277
+ assert_equal(["31.4159265358979"],simple.col1.uniq)
278
+ end
279
+ def test_emptyness
280
+ simple = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA)
281
+ assert_equal(false,simple.empty?)
282
+ empty = ExtCsv.new("hash","txt",{})
283
+ assert_equal(true,empty.empty?)
284
+ empty = ExtCsv.new("hash","txt",{:col1 => []})
285
+ assert_equal(true,empty.empty?)
286
+ end
287
+ def test_size
288
+ obj = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA)
289
+ assert_equal(114,obj.size)
290
+ assert_equal(obj.size, obj.col1.size)
291
+ obj = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA_NEW)
292
+ assert_equal(120,obj.size)
293
+ assert_equal(obj.size, obj.col1.size)
294
+ end
295
+ def test_ClassMethod_concat
296
+ obj0 = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA)
297
+ obj1 = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA)
298
+ obj2 = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA_NEW)
299
+ assert(!obj2.empty?)
300
+ assert_equal(ExtCsv.concat(obj0, obj1),ExtCsv.concat(*[obj0, obj1]))
301
+ newobj01 = ExtCsv.concat(obj0, obj1)
302
+ assert_equal(228,newobj01.size)
303
+ obj0.delete_field(:step)
304
+ obj2.delete_field(:step)
305
+ #pp obj0.rsize
306
+ #pp obj2.rsize
307
+ newobj02 = ExtCsv.concat(obj0, obj2)
308
+ #puts
309
+ #pp newobj02.rsize
310
+ #pp newobj02.csize
311
+ #pp newobj02.size
312
+ #newobj02.datacolumns.each {|c| p c + " " + newobj02.send(c).size.to_s}
313
+ assert_equal(120,newobj02.size)
314
+ assert_equal(120,newobj02.rsize)
315
+ end
316
+ def test_splitting_with_strings
317
+ qp = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA)
318
+ assert_equal(qp.each_obj(:col1), qp.each_obj("col1"))
319
+ assert_equal(4,qp.each_obj("col1").size)
320
+ assert_equal(qp.split(:col1,:col4),qp.split("col1","col4"))
321
+ end
322
+ def test_deep_equality
323
+ f1 = 'file02.txt'
324
+ f2 = 'file03.txt'
325
+ t1 = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA_DIR+f1)
326
+ t1_ = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA_DIR+f1)
327
+ t2 = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA_DIR+ f2)
328
+ qp = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA)
329
+ assert_equal(false, t1 == t2)
330
+ assert_equal(true, t1.eql?(t2))
331
+ t2.col1.collect! {|v| v.to_f + 2.0}
332
+ assert_equal(false, t1==t2)
333
+ assert_equal(false, t1.eql?(t2))
334
+ t2.col1.collect! {|v| v.to_f - 2.0}
335
+ assert_equal(false, t1 == t2)
336
+ assert_equal(true, t1.eql?(t2))
337
+ ###########################
338
+ assert_equal(false, t1==qp)
339
+ assert_equal(false, t1.eql?(qp))
340
+ assert_equal(qp.eql?(t1), t1.eql?(qp))
341
+ ###########################
342
+ assert_equal(true, t1 == t1_)
343
+ assert_equal(true, t1.eql?(t1_))
344
+ assert_equal(false, t1.equal?(t1_))
345
+ t1_.filename = ""
346
+ assert_equal(false, t1 == t1_)
347
+ assert_equal(true, t1.eql?(t1_))
348
+ end
349
+ def test_compare
350
+ # f1 was written by excel => file contains timestamps without seconds. i.e.
351
+ # is scol2ller than f2
352
+ f1 = 'file02.txt'
353
+ f2 = 'file03.txt'
354
+ t1 = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA_DIR+f1)
355
+ t1_ = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA_DIR+f1)
356
+ t2 = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA_DIR+f2)
357
+ qp = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA)
358
+ #########################
359
+ assert_equal(f2,File.basename([t2,t1].max.filename))
360
+ #########################
361
+ assert_respond_to(t1,"<")
362
+ assert_respond_to(t1,"<=")
363
+ assert_respond_to(t1,">")
364
+ assert_respond_to(t1,">=")
365
+ assert_respond_to(t1,"==")
366
+ assert_respond_to(t1,"between?")
367
+ assert_equal(true,t1 <= qp)
368
+ assert_equal(true,t1 < qp)
369
+ assert_equal(true,t1 < t2)
370
+ assert_equal(t2.size <=> qp.size,t2 <=> qp)
371
+ ##########################
372
+ assert_equal(true,t1 <= t1)
373
+ assert_equal(true,t1 >= t1)
374
+ assert_equal(true,t1 == t1)
375
+ assert_equal(true,t1 == t1_)
376
+ assert_equal(true,t1.eql?(t1_))
377
+ t1_.filename=''
378
+ t1_.zeit[0]='' if t1_.respond_to?(:zeit)
379
+ assert_equal(false,t1 == t1_)
380
+ assert_equal(true,t1.eql?(t1_))
381
+ t1_.col1[0]=''
382
+ assert_equal(false,t1 == t1_)
383
+ assert_equal(false,t1.eql?(t1_))
384
+ ##########################
385
+ assert_equal(true,t1 <= t2)
386
+ assert_equal(t1 <= t2, t1.to_s <= t2.to_s)
387
+ t1.zeit.each_index {|i| t1.zeit[i] = t1.col1.to_s} if t1_.respond_to?(:zeit)
388
+ assert_equal(true,t1 > t2) if t1_.respond_to?(:zeit)
389
+ end
390
+ def test_uniq
391
+ f1 = 'file02.txt'
392
+ f2 = 'file03.txt'
393
+ t1 = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA_DIR+f1)
394
+ t1_ = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA_DIR+f1)
395
+ t2 = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA_DIR+f2)
396
+ qp = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA)
397
+ tds = [t1,t2,qp,t1_,t2]
398
+ # tds = [t1,t1_,t1__,t1___]
399
+ # tds.each {|td| puts [td.filename,td.hash].join("\t")}
400
+ # tds.each {|td| puts [td.filename,td.object_id].join("\t"); puts tds.collect {|x| "#{x.object_id.to_s}: #{td.eql?(x).to_s}"}.join("\t")}
401
+ # puts '################################################################################'
402
+ # tds.each {|td| puts [td.filename,td.object_id].join("\t"); puts tds.collect {|x| "#{x.object_id.to_s}: #{(td==(x)).to_s}"}.join("\t")}
403
+ # puts '################################################################################'
404
+ # tds.reverse.uniq.each {|td|
405
+ # puts [td.filename,td.object_id].join("\t")
406
+ # }
407
+ assert_equal(2,tds.uniq.size)
408
+ assert_equal([t1,qp],tds.uniq)
409
+ assert_equal([t2,qp],tds.reverse.uniq)
410
+ end
411
+ def test_combine
412
+ f1 = 'file02.txt'
413
+ f2 = 'file03.txt'
414
+ csv = ExtCsv.new(IMPORT_TYPE,"csv",ERG_CSV_DATA)
415
+ t2 = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA_DIR+f2)
416
+ t1 = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA_DIR+f1)
417
+
418
+ minsize = [csv.rsize,t1.rsize].min - 1
419
+ csv = ExtCsv.new(IMPORT_TYPE,"csv",ERG_CSV_DATA)[0..minsize]
420
+ t2 = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA_DIR+f2)[0..minsize]
421
+ t1 = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA_DIR+f1)[0..minsize]
422
+ t1csv = t1 & csv
423
+ csvt1 = csv & t1
424
+ td = ExtCsv.combine(t1,t2)
425
+ td_ = ExtCsv.combine(*[t1,t2])
426
+ td12 = t1.combine(t2)
427
+ td21 = t2.combine(t1)
428
+ td21_ = t2 & t1
429
+ #test [t1,t2,td12,td21,csv,t1csv,csvt1].each {|tt| puts tt.rsize}
430
+ assert_equal(td,td_)
431
+ assert_equal(td,ExtCsv.combine(*[td]))
432
+ assert(td == td12)
433
+ assert(td21_.eql?(td12),"combination by instance method('&')")
434
+ assert(td21.eql?(td12),"combination by instance method('combine')")
435
+ assert(t1, t1.combine(t1))
436
+ assert(csv, csv.combine(csv))
437
+ assert_equal(t1.combine(t2), t1 & t2)
438
+ assert_not_equal(t2 & t1, t1 & t2)
439
+ assert(csv & t1, t1 & csv)
440
+ assert_equal(t1.rsize,td.rsize)
441
+ assert_equal(t1.rsize,td12.rsize)
442
+ assert_equal(t1.rsize,td21.rsize)
443
+ assert_equal(t1csv, csvt1)
444
+ assert(t1csv == csvt1)
445
+ assert(t1csv.eql?(csvt1))
446
+ cols = [:filename, :filemtime]
447
+ #[t1,t2,td12,td21].each {|t| cols.each {|col| puts [col, t.send(col).to_s].join("\t")}; puts '#####################'}
448
+ end
449
+ def test_range
450
+ simple = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA)
451
+ range = (0...12)
452
+ index = -5
453
+ start ,length = 0,12
454
+ assert_equal( simple.col4[range], simple[range].col4)
455
+ assert_equal( simple.col4[start,length], simple[start,length].col4)
456
+ assert_equal( [simple.col4[index]], simple[index].col4)
457
+ assert_equal( simple.col4[range], simple[start,length].col4)
458
+ assert_equal(1,simple[0].rsize)
459
+ end
460
+ def test_concat
461
+ simple0 = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA)
462
+ simple1 = ExtCsv.new(IMPORT_TYPE,"txt",TEST_DATA)
463
+ csv = ExtCsv.new(IMPORT_TYPE,"csv",ERG_CSV_DATA)
464
+ simpleconcat = ExtCsv.concat(simple0,simple1)
465
+ assert_equal(simple0.concat(simple1),ExtCsv.concat(simple0,simple1))
466
+ assert_equal(simple0.rsize + simple1.rsize, (simple0 + simple1).rsize)
467
+ assert_equal(csv.rsize + csv.rsize, ExtCsv.concat(csv,csv).rsize)
468
+ assert_equal(simple0.rsize*2, simple0.concat(simple1).rsize)
469
+ assert_equal(simple0 << simple1, simpleconcat)
470
+ assert_equal(["2009-03-21 23:53:24"]*2,(simple0 << simple1).filemtime)
471
+ assert_equal(simple0 + simple1, simpleconcat)
472
+ # concatenation of different datatypes is not permitted
473
+ assert_nil(simple0 + csv)
474
+ assert_nil(csv + simple0)
475
+ end
476
+ def test_version
477
+ assert_equal('0.10.0',ExtCsv::VERSION)
478
+ end
479
+
480
+ def test_add
481
+ simple = ExtCsv.new(IMPORT_TYPE, "txt", TEST_FD_DATA )
482
+ simple.add("test",[nil]*4)
483
+ assert_equal([nil]*4,simple.test)
484
+ end
485
+
486
+ def test_closest_to
487
+ simple = ExtCsv.new(IMPORT_TYPE, "txt", TEST_FD_DATA )
488
+ assert_equal(600,simple.closest_to(:col2 ,601).col2[0].to_i)
489
+ end
490
+
491
+ end
@@ -0,0 +1,150 @@
1
+ $:.unshift File.join(File.dirname(__FILE__),"..","lib")
2
+ require 'test/unit'
3
+ require 'pp'
4
+ require 'lsmodel'
5
+ require 'matrix'
6
+ ################################################################################
7
+ # Author:: Ralf M�ller
8
+ ################################################################################
9
+ class TestLSModel < Test::Unit::TestCase
10
+ def test_lin_reg_linear_model
11
+ x_test = [0,1,2,3,4,5,6,7,8,9]
12
+ y_test = [0,3,5,8,11,14,18,22,10,30]
13
+
14
+ s, r = LSModel.linear_model(x_test,y_test)
15
+
16
+ assert_equal(0.762416979330656.to_s, r.to_s)
17
+ assert_equal(2.67719298245614.to_s, s.to_s)
18
+ s_, r_ = LSModel.abstract_model([x_test],y_test,"[ins[0][i]]")
19
+ assert_equal(s,s_[0])
20
+ assert_equal(r,r_)
21
+ end
22
+ def test_lin_reg_compl
23
+ kvs = [80, 80, 100,100, 120,120,140, 140]
24
+ mas = [100,500,100,750,100,750,100,750]
25
+ as = [ -22.30214352, -26.9980317 , -22.30263873, -25.50091186, -22.30313394, -24.00379202, -22.30362915, -22.50667218]
26
+
27
+ s_,r_ = LSModel.abstract_model([kvs,mas],
28
+ as,
29
+ "[1.0,ins[0][i],ins[1][i],ins[0][i]*ins[1][i]]")
30
+ assert_equal(s_.to_s, "Vector[-20.8775033148882, -0.00979702707072114, -0.020868420605459, 0.000150158141662538]")
31
+ assert_equal(r_.to_s,0.929264062407313.to_s)
32
+ end
33
+
34
+ def test_affine_model
35
+ x = [80,100,120]
36
+ y = [0.5267,0.7326,0.6606]
37
+ a , b, = LSModel.affine_model(x,y)
38
+ assert_equal((a*60.0+b).to_s,0.506066666666667.to_s)
39
+
40
+ x = [0,1,2]
41
+ y = x.clone
42
+ a , b, = LSModel.affine_model(x,y)
43
+ s, = LSModel.linear_model(x,y)
44
+ assert_equal(1.0,a)
45
+ assert_equal(s,a)
46
+
47
+ y.each_index {|i| y[i] = y[i]*5.5}
48
+ a , b, = LSModel.affine_model(x,y)
49
+ s, = LSModel.linear_model(x,y)
50
+ assert_equal(5.5,a)
51
+ assert_equal(s,a)
52
+
53
+ y.each_index {|i| y[i] = y[i] + 3.3}
54
+ a , b, r = LSModel.affine_model(x,y)
55
+ assert_equal(1.0,r)
56
+ s,r = LSModel.linear_model(x,y)
57
+ assert_equal(0.784,r)
58
+ assert_not_equal(a,s)
59
+ assert_equal(5.5.to_s,a.to_s)
60
+ assert_equal(3.3.to_s,b.to_s)
61
+ end
62
+
63
+ def test_modelHasConst
64
+ model = LSModel.convertModelInputString("input[1],input[0]*input[0]")
65
+ assert_equal(false, LSModel.modelHasConstant?(model))
66
+ model = LSModel.convertModelInputString("1.0,input[0],input[1],input[0]*input[1]")
67
+ assert_equal(true, LSModel.modelHasConstant?(model))
68
+ model = LSModel.convertModelInputString("input[0],input[1],input[0]*input[1],1.0")
69
+ assert_equal(true, LSModel.modelHasConstant?(model))
70
+ model = LSModel.convertModelInputString("input[0],input[1],1.0,input[0]*input[1]")
71
+ assert_equal(true, LSModel.modelHasConstant?(model))
72
+ end
73
+ def test_modelDim
74
+ model = LSModel.convertModelInputString("input[1],input[0]*input[0]")
75
+ assert_equal(2, LSModel.modelDim(model))
76
+ model = LSModel.convertModelInputString("1.0,input[0],input[1],input[0]*input[1]")
77
+ assert_equal(4, LSModel.modelDim(model))
78
+ assert_equal(3, LSModel.modelDim(model,true))
79
+ model = LSModel.convertModelInputString("input[1],1.0,input[0]*input[1]")
80
+ assert_equal(3, LSModel.modelDim(model))
81
+ assert_equal(2, LSModel.modelDim(model,true))
82
+ model = LSModel.convertModelInputString("input[1],input[0]*input[1],Math.sqrt(input[3])")
83
+ assert_equal(3, LSModel.modelDim(model))
84
+ assert_equal(3, LSModel.modelDim(model,true))
85
+ end
86
+
87
+ def test_abstract_modelD
88
+ kvs = [80, 80, 100,100, 120,120,140, 140]
89
+ mas = [100,500,100,750,100,750,100,750]
90
+ outs = []
91
+ (0..7).each {|i| outs << [kvs[i]*mas[i]*Math.sqrt(kvs[i]*mas[i]), kvs[i]+mas[i]]}
92
+ input = Matrix.columns([kvs,mas])
93
+ output = Matrix.columns(outs.transpose)
94
+ # pp input.column_vectors
95
+ model = "input[1],input[0]*input[0]"
96
+ # model_ = "[" + model.gsub(/\[(\d+)\]/,"\[i,\\1\]") + "]"
97
+ # pp outs.transpose
98
+ LSModel.abstract_modelD([kvs,mas], outs.transpose, model)
99
+ end
100
+ def test_modelOutput
101
+ #TODO: unterschiede zum alten modell immernoch vorhanden!!! weiss nicht, warum
102
+ kvs = ["80", 80, 100,100, 120,120,140, "140"]
103
+ mas = [100,"500",100,750,100,750,100,750]
104
+ as = [ -22.30214352, -26.9980317 , -22.30263873, -25.50091186, -22.30313394, -24.00379202, -22.30362915, -22.50667218]
105
+ model = "1.0,input[0],input[1],input[0]*input[1]"
106
+ s_, r_ = LSModel.abstract_modelD([kvs,mas],
107
+ [as],
108
+ model)
109
+ modelOutput = LSModel.modelOutput(model, s_, [[80,100],[80,500],[100,"100"]])
110
+ #pp as
111
+ #puts '##############################'
112
+ #pp modelOutput
113
+ #puts '##############################'
114
+ s, r = LSModel.abstract_model([kvs,mas],
115
+ as,
116
+ "[1.0,ins[0][i],ins[1][i],ins[0][i]*ins[1][i]]")
117
+ assert_equal(s.inspect,s_.column(0).inspect)
118
+ test = LSModel.test_model([[80,80,100],[100,500,100]],
119
+ as[0,3],
120
+ "[1.0,ins[0][i],ins[1][i],ins[0][i]*ins[1][i]]",
121
+ s)
122
+ #pp test
123
+ #puts '##############################'
124
+ assert_equal(modelOutput.column(0).to_a, test[:model])
125
+ end
126
+ def test_abstract_model
127
+ kvs = ["80", 80, 100,100, 120,120,140, "140"]
128
+ mas = [100,"500",100,750,100,750,100,750]
129
+ as = [ -22.30214352, "-26.9980317" , -22.30263873, -25.50091186, -22.30313394, -24.00379202, -22.30362915, -22.50667218]
130
+
131
+ s, r = LSModel.abstract_model([kvs,mas],
132
+ as,
133
+ "[1.0,ins[0][i],ins[1][i],ins[0][i]*ins[1][i]]")
134
+ s_, r_ = LSModel.abstract_modelD([kvs,mas],
135
+ [as],
136
+ "1.0,input[0],input[1],input[0]*input[1]")
137
+ #pp s
138
+ #pp r
139
+ #pp s_.column_vectors
140
+ #pp r_
141
+ assert_equal(Matrix[[0.0],[0.0],[0.0],[0.0]],s-s_)
142
+ assert_equal(Vector[-20.8775033148882, -0.00979702707072114, -0.020868420605459, 0.000150158141662538].to_a.flatten.to_s,s.to_a.flatten.to_s)
143
+ assert_equal(0.929264.to_s, r.to_s[0,8])
144
+ test = LSModel.test_model([kvs,mas],
145
+ as,
146
+ "[1.0,ins[0][i],ins[1][i],ins[0][i]*ins[1][i]]",
147
+ s)
148
+ assert_equal(0.929264.to_s,test[:r].to_s[0,8])
149
+ end
150
+ end