linkage 0.0.1 → 0.0.2

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,456 @@
1
+ require 'helper'
2
+
3
+ class UnitTests::TestData < Test::Unit::TestCase
4
+ class DataSubclass < Linkage::Data
5
+ attr_reader :ruby_type, :dataset
6
+ def initialize(name, ruby_type, dataset = nil)
7
+ super(name)
8
+ @ruby_type = ruby_type
9
+ @dataset = dataset
10
+ end
11
+ end
12
+
13
+ def new_data(name, ruby_type, dataset = nil, klass = DataSubclass)
14
+ klass.new(name, ruby_type, dataset)
15
+ end
16
+
17
+ test "ruby_type raises NotImplementedError" do
18
+ d = Linkage::Data.new(:foo)
19
+ assert_raises(NotImplementedError) { d.ruby_type }
20
+ end
21
+
22
+ test "dataset raises NotImplementedError" do
23
+ d = Linkage::Data.new(:foo)
24
+ assert_raises(NotImplementedError) { d.dataset }
25
+ end
26
+
27
+ test "to_expr raises NotImplementedError" do
28
+ d = Linkage::Data.new(:foo)
29
+ assert_raises(NotImplementedError) { d.to_expr }
30
+ end
31
+
32
+ test "merge two identical fields" do
33
+ data_1 = new_data(:id, {:type =>Integer})
34
+ data_2 = new_data(:id, {:type =>Integer})
35
+ expected_type = {:type => Integer}
36
+
37
+ result_data = data_1.merge(data_2)
38
+ assert_equal(:id, result_data.name)
39
+ assert_equal(expected_type, result_data.ruby_type)
40
+
41
+ result_data = data_2.merge(data_1)
42
+ assert_equal(:id, result_data.name)
43
+ assert_equal(expected_type, result_data.ruby_type)
44
+ end
45
+
46
+ test "merge fields with different names" do
47
+ data_1 = new_data(:foo, {:type => Integer})
48
+ data_2 = new_data(:bar, {:type => Integer})
49
+
50
+ result_data = data_1.merge(data_2)
51
+ assert_equal(:foo_bar, result_data.name)
52
+ result_data = data_2.merge(data_1)
53
+ assert_equal(:bar_foo, result_data.name)
54
+ end
55
+
56
+ test "merge two boolean fields" do
57
+ data_1 = new_data(:foo, {:type => TrueClass})
58
+ data_2 = new_data(:foo, {:type => TrueClass})
59
+ expected_type = {:type => TrueClass}
60
+
61
+ result_data = data_1.merge(data_2)
62
+ assert_equal(:foo, result_data.name)
63
+ assert_equal(expected_type, result_data.ruby_type)
64
+
65
+ result_data = data_2.merge(data_1)
66
+ assert_equal(:foo, result_data.name)
67
+ assert_equal(expected_type, result_data.ruby_type)
68
+ end
69
+
70
+ test "merge a boolean field and an integer field" do
71
+ data_1 = new_data(:foo, {:type => Integer})
72
+ data_2 = new_data(:foo, {:type => TrueClass})
73
+ expected_type = {:type => Integer}
74
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
75
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
76
+ end
77
+
78
+ test "merge a boolean field and a bignum field" do
79
+ data_1 = new_data(:foo, {:type => Bignum})
80
+ data_2 = new_data(:foo, {:type => TrueClass})
81
+ expected_type = {:type => Bignum}
82
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
83
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
84
+ end
85
+
86
+ test "merge a boolean field and a float field" do
87
+ data_1 = new_data(:foo, {:type => Float})
88
+ data_2 = new_data(:foo, {:type => TrueClass})
89
+ expected_type = {:type => Float}
90
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
91
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
92
+ end
93
+
94
+ test "merge a boolean field and a decimal field" do
95
+ data_1 = new_data(:foo, {:type => BigDecimal})
96
+ data_2 = new_data(:foo, {:type => TrueClass})
97
+ expected_type = {:type => BigDecimal}
98
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
99
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
100
+ end
101
+
102
+ test "merge a boolean field and a decimal field with size" do
103
+ data_1 = new_data(:foo, {:type => BigDecimal, :opts => {:size => [10, 2]}})
104
+ data_2 = new_data(:foo, {:type => TrueClass})
105
+ expected_type = {:type => BigDecimal, :opts => {:size => [10, 2]}}
106
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
107
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
108
+ end
109
+
110
+ test "merge a boolean field and a string field" do
111
+ data_1 = new_data(:foo, {:type => String, :opts => {:size => 10}})
112
+ data_2 = new_data(:foo, {:type => TrueClass})
113
+ expected_type = {:type => String, :opts => {:size => 10}}
114
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
115
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
116
+ end
117
+
118
+ test "merge a boolean field and a text field" do
119
+ data_1 = new_data(:foo, {:type => String, :opts => {:text => true}})
120
+ data_2 = new_data(:foo, {:type => TrueClass})
121
+ expected_type = {:type => String, :opts => {:text => true}}
122
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
123
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
124
+ end
125
+
126
+ test "merge a boolean field and a fixed string field" do
127
+ data_1 = new_data(:foo, {:type => String, :opts => {:size => 10, :fixed => true}})
128
+ data_2 = new_data(:foo, {:type => TrueClass})
129
+ expected_type = {:type => String, :opts => {:size => 10, :fixed => true}}
130
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
131
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
132
+ end
133
+
134
+ test "merge two integer fields" do
135
+ data_1 = new_data(:foo, {:type => Integer})
136
+ data_2 = new_data(:foo, {:type => Integer})
137
+ expected_type = {:type => Integer}
138
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
139
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
140
+ end
141
+
142
+ test "merge an integer field and a bignum field" do
143
+ data_1 = new_data(:foo, {:type => Bignum})
144
+ data_2 = new_data(:foo, {:type => Integer})
145
+ expected_type = {:type => Bignum}
146
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
147
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
148
+ end
149
+
150
+ test "merge an integer field and a float field" do
151
+ data_1 = new_data(:foo, {:type => Float})
152
+ data_2 = new_data(:foo, {:type => Integer})
153
+ expected_type = {:type => Float}
154
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
155
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
156
+ end
157
+
158
+ test "merge an integer field and a decimal field" do
159
+ data_1 = new_data(:foo, {:type => BigDecimal})
160
+ data_2 = new_data(:foo, {:type => Integer})
161
+ expected_type = {:type => BigDecimal}
162
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
163
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
164
+ end
165
+
166
+ test "merge an integer field and a decimal field with size" do
167
+ data_1 = new_data(:foo, {:type => BigDecimal, :opts => {:size => [10, 2]}})
168
+ data_2 = new_data(:foo, {:type => Integer})
169
+ expected_type = {:type => BigDecimal, :opts => {:size => [10, 2]}}
170
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
171
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
172
+ end
173
+
174
+ test "merge an integer field and a string field" do
175
+ data_1 = new_data(:foo, {:type => String, :opts => {:size => 10}})
176
+ data_2 = new_data(:foo, {:type => Integer})
177
+ expected_type = {:type => String, :opts => {:size => 10}}
178
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
179
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
180
+ end
181
+
182
+ test "merge an integer field and a text field" do
183
+ data_1 = new_data(:foo, {:type => String, :opts => {:text => true}})
184
+ data_2 = new_data(:foo, {:type => Integer})
185
+ expected_type = {:type => String, :opts => {:text => true}}
186
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
187
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
188
+ end
189
+
190
+ test "merge an integer field and a fixed string field" do
191
+ data_1 = new_data(:foo, {:type => String, :opts => {:size => 10, :fixed => true}})
192
+ data_2 = new_data(:foo, {:type => Integer})
193
+ expected_type = {:type => String, :opts => {:size => 10, :fixed => true}}
194
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
195
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
196
+ end
197
+
198
+ test "merge two bignum fields" do
199
+ data_1 = new_data(:foo, {:type => Bignum})
200
+ data_2 = new_data(:foo, {:type => Bignum})
201
+ expected_type = {:type => Bignum}
202
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
203
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
204
+ end
205
+
206
+ test "merge an bignum field and a decimal field" do
207
+ data_1 = new_data(:foo, {:type => BigDecimal})
208
+ data_2 = new_data(:foo, {:type => Bignum})
209
+ expected_type = {:type => BigDecimal}
210
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
211
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
212
+ end
213
+
214
+ test "merge an bignum field and a decimal field with size" do
215
+ data_1 = new_data(:foo, {:type => BigDecimal, :opts => {:size => [10, 2]}})
216
+ data_2 = new_data(:foo, {:type => Bignum})
217
+ expected_type = {:type => BigDecimal, :opts => {:size => [10, 2]}}
218
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
219
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
220
+ end
221
+
222
+ test "merge an bignum field and a string field" do
223
+ data_1 = new_data(:foo, {:type => String, :opts => {:size => 10}})
224
+ data_2 = new_data(:foo, {:type => Bignum})
225
+ expected_type = {:type => String, :opts => {:size => 10}}
226
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
227
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
228
+ end
229
+
230
+ test "merge an bignum field and a text field" do
231
+ data_1 = new_data(:foo, {:type => String, :opts => {:text => true}})
232
+ data_2 = new_data(:foo, {:type => Bignum})
233
+ expected_type = {:type => String, :opts => {:text => true}}
234
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
235
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
236
+ end
237
+
238
+ test "merge an bignum field and a fixed string field" do
239
+ data_1 = new_data(:foo, {:type => String, :opts => {:size => 10, :fixed => true}})
240
+ data_2 = new_data(:foo, {:type => Bignum})
241
+ expected_type = {:type => String, :opts => {:size => 10, :fixed => true}}
242
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
243
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
244
+ end
245
+
246
+ test "merge two float fields" do
247
+ data_1 = new_data(:foo, {:type => Float})
248
+ data_2 = new_data(:foo, {:type => Float})
249
+ expected_type = {:type => Float}
250
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
251
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
252
+ end
253
+
254
+ test "merge a float field and a bignum field" do
255
+ data_1 = new_data(:foo, {:type => Bignum})
256
+ data_2 = new_data(:foo, {:type => Float})
257
+ expected_type = {:type => BigDecimal}
258
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
259
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
260
+ end
261
+
262
+ test "merge a float field and a decimal field" do
263
+ data_1 = new_data(:foo, {:type => BigDecimal})
264
+ data_2 = new_data(:foo, {:type => Float})
265
+ expected_type = {:type => BigDecimal}
266
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
267
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
268
+ end
269
+
270
+ test "merge a float field and a decimal field with size" do
271
+ data_1 = new_data(:foo, {:type => BigDecimal, :opts => {:size => [10, 2]}})
272
+ data_2 = new_data(:foo, {:type => Float})
273
+ expected_type = {:type => BigDecimal, :opts => {:size => [10, 2]}}
274
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
275
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
276
+ end
277
+
278
+ test "merge a float field and a string field" do
279
+ data_1 = new_data(:foo, {:type => String, :opts => {:size => 10}})
280
+ data_2 = new_data(:foo, {:type => Float})
281
+ expected_type = {:type => String, :opts => {:size => 10}}
282
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
283
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
284
+ end
285
+
286
+ test "merge a float field and a text field" do
287
+ data_1 = new_data(:foo, {:type => String, :opts => {:text => true}})
288
+ data_2 = new_data(:foo, {:type => Float})
289
+ expected_type = {:type => String, :opts => {:text => true}}
290
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
291
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
292
+ end
293
+
294
+ test "merge a float field and a fixed string field" do
295
+ data_1 = new_data(:foo, {:type => String, :opts => {:size => 10, :fixed => true}})
296
+ data_2 = new_data(:foo, {:type => Float})
297
+ expected_type = {:type => String, :opts => {:size => 10, :fixed => true}}
298
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
299
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
300
+ end
301
+
302
+ test "merge two decimal fields" do
303
+ data_1 = new_data(:foo, {:type => BigDecimal})
304
+ data_2 = new_data(:foo, {:type => BigDecimal})
305
+ expected_type = {:type => BigDecimal}
306
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
307
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
308
+ end
309
+
310
+ test "merge two decimal fields, one with size" do
311
+ data_1 = new_data(:foo, {:type => BigDecimal, :opts => {:size => [10, 2]}})
312
+ data_2 = new_data(:foo, {:type => BigDecimal})
313
+ expected_type = {:type => BigDecimal, :opts => {:size => [10, 2]}}
314
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
315
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
316
+ end
317
+
318
+ test "merge two decimal fields, both with size" do
319
+ data_1 = new_data(:foo, {:type => BigDecimal, :opts => {:size => [10, 2]}})
320
+ data_2 = new_data(:foo, {:type => BigDecimal, :opts => {:size => [12, 1]}})
321
+ expected_type = {:type => BigDecimal, :opts => {:size => [12, 2]}}
322
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
323
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
324
+ end
325
+
326
+ test "merge two decimal fields, both with size, one without scale" do
327
+ data_1 = new_data(:foo, {:type => BigDecimal, :opts => {:size => [10]}})
328
+ data_2 = new_data(:foo, {:type => BigDecimal, :opts => {:size => [12, 1]}})
329
+ expected_type = {:type => BigDecimal, :opts => {:size => [12, 1]}}
330
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
331
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
332
+ end
333
+
334
+ test "merge a decimal field and a string field" do
335
+ data_1 = new_data(:foo, {:type => String, :opts => {:size => 10}})
336
+ data_2 = new_data(:foo, {:type => BigDecimal})
337
+ expected_type = {:type => String, :opts => {:size => 10}}
338
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
339
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
340
+ end
341
+
342
+ test "merge a decimal field with size and a string field" do
343
+ data_1 = new_data(:foo, {:type => String, :opts => {:size => 10}})
344
+ data_2 = new_data(:foo, {:type => BigDecimal, :opts => {:size => [12, 2]}})
345
+ expected_type = {:type => String, :opts => {:size => 13}}
346
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
347
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
348
+ end
349
+
350
+ test "merge a decimal field and a text field" do
351
+ data_1 = new_data(:foo, {:type => String, :opts => {:text => true}})
352
+ data_2 = new_data(:foo, {:type => BigDecimal})
353
+ expected_type = {:type => String, :opts => {:text => true}}
354
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
355
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
356
+ end
357
+
358
+ test "merge a decimal field with size and a text field" do
359
+ data_1 = new_data(:foo, {:type => String, :opts => {:text => true}})
360
+ data_2 = new_data(:foo, {:type => BigDecimal, :opts => {:size => [12, 2]}})
361
+ expected_type = {:type => String, :opts => {:text => true}}
362
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
363
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
364
+ end
365
+
366
+ test "merge a decimal field and a fixed string field" do
367
+ data_1 = new_data(:foo, {:type => String, :opts => {:size => 10, :fixed => true}})
368
+ data_2 = new_data(:foo, {:type => BigDecimal})
369
+ expected_type = {:type => String, :opts => {:size => 10, :fixed => true}}
370
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
371
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
372
+ end
373
+
374
+ test "merge two string fields" do
375
+ data_1 = new_data(:foo, {:type => String, :opts => {:size => 20}})
376
+ data_2 = new_data(:foo, {:type => String, :opts => {:size => 20}})
377
+ expected_type = {:type => String, :opts => {:size => 20}}
378
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
379
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
380
+ end
381
+
382
+ test "merge two string fields with different sizes" do
383
+ data_1 = new_data(:foo, {:type => String, :opts => {:size => 15}})
384
+ data_2 = new_data(:foo, {:type => String, :opts => {:size => 20}})
385
+ expected_type = {:type => String, :opts => {:size => 20}}
386
+ assert_equal(expected_type, data_1.merge(data_2).ruby_type)
387
+ assert_equal(expected_type, data_2.merge(data_1).ruby_type)
388
+ end
389
+
390
+ test "merge two fields and specify name" do
391
+ data_1 = new_data(:id, {:type => Integer})
392
+ data_2 = new_data(:id, {:type => Integer})
393
+
394
+ result_data = data_1.merge(data_2, 'foo')
395
+ assert_equal :foo, result_data.name
396
+
397
+ result_data = data_2.merge(data_1, 'foo')
398
+ assert_equal :foo, result_data.name
399
+ end
400
+
401
+ test "== returns true when data have the same name and are from the same dataset" do
402
+ dataset_1 = stub('dataset')
403
+ data_1 = new_data(:foo, {:type => Integer}, dataset_1)
404
+ dataset_2 = stub('dataset clone')
405
+ data_2 = new_data(:foo, {:type => Integer}, dataset_2)
406
+
407
+ dataset_1.expects(:==).with(dataset_2).returns(true)
408
+ assert_equal data_1, data_2
409
+ end
410
+
411
+ test "== returns false when data have different classes" do
412
+ dataset_1 = stub('dataset')
413
+ data_1 = new_data(:foo, {:type => Integer}, dataset_1, DataSubclass)
414
+ dataset_2 = stub('dataset clone')
415
+ data_2 = new_data(:foo, {:type => Integer}, dataset_2, DataSubclass.clone)
416
+ assert_not_equal data_1, data_2
417
+ end
418
+
419
+ test "== returns false when data have the same name but are from different datasets" do
420
+ dataset_1 = stub('dataset')
421
+ data_1 = new_data(:foo, {:type => Integer}, dataset_1)
422
+ dataset_2 = stub('dataset clone')
423
+ data_2 = new_data(:foo, {:type => Integer}, dataset_2)
424
+
425
+ dataset_1.expects(:==).with(dataset_2).returns(false)
426
+ assert_not_equal data_1, data_2
427
+ end
428
+
429
+ test "== returns true for identical static functions" do
430
+ klass = new_function('foo', {:type => String})
431
+ func_1 = klass.new(123)
432
+ func_2 = klass.new(123)
433
+
434
+ assert_equal func_1, func_2
435
+ end
436
+
437
+ test "belongs_to? dataset" do
438
+ dataset = stub('dataset 1', :id => 1)
439
+ data = new_data(:foo, {:type => Integer}, dataset)
440
+ assert data.belongs_to?(dataset)
441
+ end
442
+
443
+ test "belongs_to? dataset with same id" do
444
+ dataset_1 = stub('dataset 1', :id => 1)
445
+ dataset_2 = stub('dataset 2', :id => 1)
446
+ data = new_data(:foo, {:type => Integer}, dataset_1)
447
+ assert data.belongs_to?(dataset_2)
448
+ end
449
+
450
+ test "belongs_to? dataset with different id" do
451
+ dataset_1 = stub('dataset 1', :id => 1)
452
+ dataset_2 = stub('dataset 2', :id => 2)
453
+ data = new_data(:foo, {:type => Integer}, dataset_1)
454
+ assert !data.belongs_to?(dataset_2)
455
+ end
456
+ end
@@ -15,9 +15,9 @@ class UnitTests::TestDataset < Test::Unit::TestCase
15
15
 
16
16
  @id_field = stub("id field", :dataset= => nil, :name => :id)
17
17
  Linkage::Field.stubs(:new).with(:id, kind_of(Hash)).returns(@id_field)
18
- @first_name_field = stub("first_name field", :dataset= => nil, :name => :first_name)
18
+ @first_name_field = stub("first_name field", :dataset= => nil, :name => :first_name, :to_expr => :first_name)
19
19
  Linkage::Field.stubs(:new).with(:first_name, kind_of(Hash)).returns(@first_name_field)
20
- @last_name_field = stub("last_name field", :dataset= => nil, :name => :last_name)
20
+ @last_name_field = stub("last_name field", :dataset= => nil, :name => :last_name, :to_expr => :last_name)
21
21
  Linkage::Field.stubs(:new).with(:last_name, kind_of(Hash)).returns(@last_name_field)
22
22
  end
23
23
 
@@ -107,8 +107,8 @@ class UnitTests::TestDataset < Test::Unit::TestCase
107
107
  assert_empty dataset_2.instance_variable_get(:@filter)
108
108
  end
109
109
 
110
- test "add_order, then each" do
111
- field = stub('field', :name => :last_name)
110
+ test "add_order with field, then each" do
111
+ field = stub_field('field', :name => :last_name, :to_expr => :last_name)
112
112
  ds = Linkage::Dataset.new("foo:/bar", "baz")
113
113
  ds.add_order(field)
114
114
  @dataset.expects(:order).with(:last_name).returns(@dataset)
@@ -123,8 +123,25 @@ class UnitTests::TestDataset < Test::Unit::TestCase
123
123
  assert ran
124
124
  end
125
125
 
126
+ test "add_order with function, then each" do
127
+ expr = stub('expression')
128
+ func = stub_function('func', :name => :trim_stuff, :to_expr => expr)
129
+ ds = Linkage::Dataset.new("foo:/bar", "baz")
130
+ ds.add_order(func)
131
+ @dataset.expects(:order).with(expr).returns(@dataset)
132
+ row = {:id => 123, :trim_stuff => 'foo'}
133
+ @dataset.expects(:each).yields(row)
134
+
135
+ ran = false
136
+ ds.each do |yielded_row|
137
+ ran = true
138
+ assert_equal({:pk => 123, :values => {:trim_stuff => 'foo'}}, yielded_row)
139
+ end
140
+ assert ran
141
+ end
142
+
126
143
  test "add_order descending, then each" do
127
- field = stub('field', :name => :last_name)
144
+ field = stub_field('field', :name => :last_name, :to_expr => :last_name)
128
145
  ds = Linkage::Dataset.new("foo:/bar", "baz")
129
146
  ds.add_order(field, :desc)
130
147
  @dataset.expects(:order).with(:last_name.desc).returns(@dataset)
@@ -139,8 +156,8 @@ class UnitTests::TestDataset < Test::Unit::TestCase
139
156
  assert ran
140
157
  end
141
158
 
142
- test "add_order weeds out duplicates" do
143
- field = stub('field', :name => :last_name)
159
+ test "add_order weeds out field duplicates" do
160
+ field = stub_field('field', :name => :last_name, :to_expr => :last_name)
144
161
  ds = Linkage::Dataset.new("foo:/bar", "baz")
145
162
  ds.add_order(field)
146
163
  ds.add_order(field)
@@ -149,8 +166,19 @@ class UnitTests::TestDataset < Test::Unit::TestCase
149
166
  ds.each { }
150
167
  end
151
168
 
152
- test "add_select, then each" do
153
- field = stub('field', :name => :last_name)
169
+ test "add_order weeds out function duplicates" do
170
+ expr = stub('expression')
171
+ func = stub_function('func', :name => :trim_stuff, :to_expr => expr)
172
+ ds = Linkage::Dataset.new("foo:/bar", "baz")
173
+ ds.add_order(func)
174
+ ds.add_order(func)
175
+ @dataset.expects(:order).with(expr).returns(@dataset)
176
+ @dataset.expects(:each)
177
+ ds.each { }
178
+ end
179
+
180
+ test "add_select with field, then each" do
181
+ field = stub_field('field', :name => :last_name, :to_expr => :last_name)
154
182
  ds = Linkage::Dataset.new("foo:/bar", "baz")
155
183
  ds.add_select(field)
156
184
  @dataset.expects(:select).with(:id, :last_name).returns(@dataset)
@@ -166,7 +194,7 @@ class UnitTests::TestDataset < Test::Unit::TestCase
166
194
  end
167
195
 
168
196
  test "add_select with an alias, then each" do
169
- field = stub('field', :name => :last_name)
197
+ field = stub_field('field', :name => :last_name, :to_expr => :last_name)
170
198
  ds = Linkage::Dataset.new("foo:/bar", "baz")
171
199
  ds.add_select(field, :junk)
172
200
  @dataset.expects(:select).with(:id, :last_name.as(:junk)).returns(@dataset)
@@ -181,8 +209,25 @@ class UnitTests::TestDataset < Test::Unit::TestCase
181
209
  assert ran
182
210
  end
183
211
 
212
+ test "add_select with function, then each" do
213
+ expr = stub('expression')
214
+ func = stub_function('func', :name => :trim_stuff, :to_expr => expr)
215
+ ds = Linkage::Dataset.new("foo:/bar", "baz")
216
+ ds.add_select(func)
217
+ @dataset.expects(:select).with(:id, expr).returns(@dataset)
218
+ row = {:id => 123, :trim_stuff => 'foo'}
219
+ @dataset.expects(:each).yields(row)
220
+
221
+ ran = false
222
+ ds.each do |yielded_row|
223
+ ran = true
224
+ assert_equal({:pk => 123, :values => {:trim_stuff => 'foo'}}, yielded_row)
225
+ end
226
+ assert ran
227
+ end
228
+
184
229
  test "add_select weeds out duplicates" do
185
- field = stub('field', :name => :last_name)
230
+ field = stub_field('field', :name => :last_name, :to_expr => :last_name)
186
231
  ds = Linkage::Dataset.new("foo:/bar", "baz")
187
232
  ds.add_select(field)
188
233
  ds.add_select(field)
@@ -191,8 +236,8 @@ class UnitTests::TestDataset < Test::Unit::TestCase
191
236
  ds.each { }
192
237
  end
193
238
 
194
- test "add_filter with :==, then each" do
195
- field = stub('field', :name => :age)
239
+ test "add_filter with :== between field and static value, then each" do
240
+ field = stub('field', :name => :age, :to_expr => :age)
196
241
  ds = Linkage::Dataset.new("foo:/bar", "baz")
197
242
  ds.add_filter(field, :==, 30)
198
243
  @dataset.expects(:filter).with(:age => 30).returns(@dataset)
@@ -207,9 +252,27 @@ class UnitTests::TestDataset < Test::Unit::TestCase
207
252
  assert ran
208
253
  end
209
254
 
255
+ test "add_filter with :== between field and static function, then each" do
256
+ field = stub_field('field', :name => :age, :to_expr => :age)
257
+ expr = stub('expression')
258
+ func = stub_function('func', :name => :func, :to_expr => expr)
259
+ ds = Linkage::Dataset.new("foo:/bar", "baz")
260
+ ds.add_filter(field, :==, func)
261
+ @dataset.expects(:filter).with(:age => expr).returns(@dataset)
262
+ row = {:id => 123, :junk => 'foo'}
263
+ @dataset.expects(:each).yields(row)
264
+
265
+ ran = false
266
+ ds.each do |yielded_row|
267
+ ran = true
268
+ assert_equal({:pk => 123, :values => {:junk => 'foo'}}, yielded_row)
269
+ end
270
+ assert ran
271
+ end
272
+
210
273
  test "add_filter with :== between two fields, then each" do
211
- field_1 = stub_field('field 1', :name => :foo)
212
- field_2 = stub_field('field 2', :name => :bar)
274
+ field_1 = stub_field('field 1', :name => :foo, :to_expr => :foo)
275
+ field_2 = stub_field('field 2', :name => :bar, :to_expr => :bar)
213
276
  ds = Linkage::Dataset.new("foo:/bar", "baz")
214
277
  ds.add_filter(field_1, :==, field_2)
215
278
  @dataset.expects(:filter).with(:foo => :bar).returns(@dataset)
@@ -218,7 +281,7 @@ class UnitTests::TestDataset < Test::Unit::TestCase
218
281
  end
219
282
 
220
283
  test "add_filter with :>, then each" do
221
- field = stub('field', :name => :age)
284
+ field = stub('field', :name => :age, :to_expr => :age)
222
285
  ds = Linkage::Dataset.new("foo:/bar", "baz")
223
286
  ds.add_filter(field, :>, 30)
224
287
  @dataset.expects(:filter).with(expr{age > 30}).returns(@dataset)
@@ -227,7 +290,7 @@ class UnitTests::TestDataset < Test::Unit::TestCase
227
290
  end
228
291
 
229
292
  test "add_filter with :<, then each" do
230
- field = stub('field', :name => :age)
293
+ field = stub_field('field', :name => :age, :to_expr => :age)
231
294
  ds = Linkage::Dataset.new("foo:/bar", "baz")
232
295
  ds.add_filter(field, :<, 30)
233
296
  @dataset.expects(:filter).with(expr{age < 30}).returns(@dataset)
@@ -236,7 +299,7 @@ class UnitTests::TestDataset < Test::Unit::TestCase
236
299
  end
237
300
 
238
301
  test "add_filter with :>=, then each" do
239
- field = stub('field', :name => :age)
302
+ field = stub_field('field', :name => :age, :to_expr => :age)
240
303
  ds = Linkage::Dataset.new("foo:/bar", "baz")
241
304
  ds.add_filter(field, :>=, 30)
242
305
  @dataset.expects(:filter).with(expr{age >= 30}).returns(@dataset)
@@ -245,7 +308,7 @@ class UnitTests::TestDataset < Test::Unit::TestCase
245
308
  end
246
309
 
247
310
  test "add_filter with :<=, then each" do
248
- field = stub('field', :name => :age)
311
+ field = stub('field', :name => :age, :to_expr => :age)
249
312
  ds = Linkage::Dataset.new("foo:/bar", "baz")
250
313
  ds.add_filter(field, :<=, 30)
251
314
  @dataset.expects(:filter).with(expr{age <= 30}).returns(@dataset)
@@ -254,7 +317,7 @@ class UnitTests::TestDataset < Test::Unit::TestCase
254
317
  end
255
318
 
256
319
  test "add_filter with :!=, then each" do
257
- field = stub('field', :name => :age)
320
+ field = stub_field('field', :name => :age, :to_expr => :age)
258
321
  ds = Linkage::Dataset.new("foo:/bar", "baz")
259
322
  ds.add_filter(field, :'!=', 30)
260
323
  @dataset.expects(:filter).with(~{:age => 30}).returns(@dataset)
@@ -263,8 +326,8 @@ class UnitTests::TestDataset < Test::Unit::TestCase
263
326
  end
264
327
 
265
328
  test "add_filter with :> field, then each" do
266
- field_1 = stub_field('field 1', :name => :age)
267
- field_2 = stub_field('field 2', :name => :age_2)
329
+ field_1 = stub_field('field 1', :name => :age, :to_expr => :age)
330
+ field_2 = stub_field('field 2', :name => :age_2, :to_expr => :age_2)
268
331
  ds = Linkage::Dataset.new("foo:/bar", "baz")
269
332
  ds.add_filter(field_1, :>, field_2)
270
333
  @dataset.expects(:filter).with(expr{age > age_2}).returns(@dataset)