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.
- data/gemspec +21 -0
- data/lib/extcsv.rb +733 -0
- data/lib/lsmodel.rb +289 -0
- data/rakefile +134 -0
- data/test/data/file00.txt +116 -0
- data/test/data/file01.txt +121 -0
- data/test/data/file02.txt +90 -0
- data/test/data/file03.txt +90 -0
- data/test/data/file04.csv +31 -0
- data/test/test_extcsv.rb +491 -0
- data/test/test_lsmodel.rb +150 -0
- metadata +62 -0
data/test/test_extcsv.rb
ADDED
@@ -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
|