cascading.jruby 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
data/tasks/ant.rake CHANGED
@@ -1,14 +1,18 @@
1
1
  namespace :ant do
2
+ desc 'Retrieves Cascading and Hadoop jars and sets environment variables to point to them'
3
+ task :retrieve do
4
+ raise 'Ant retrieve failed' unless system('ant retrieve')
5
+ ENV['CASCADING_HOME'] = 'build/lib'
6
+ ENV['HADOOP_HOME'] = 'build/lib'
7
+ end
8
+
2
9
  desc 'Builds Java source for inclusion in gem'
3
10
  task :build do
4
- stdout = `ant build`
5
- raise "Ant build failed: #{stdout}" unless $? == 0
6
- puts stdout
11
+ raise 'Ant build failed' unless system('ant build')
7
12
  end
8
13
 
9
14
  desc 'Cleans Java build files'
10
15
  task :clean do
11
- stdout = `ant clean`
12
- puts stdout
16
+ system('ant clean')
13
17
  end
14
18
  end
data/tasks/samples.rake CHANGED
@@ -7,6 +7,12 @@ namespace :samples do
7
7
  raise "#{sample} sample app failed" unless success
8
8
  end
9
9
  end
10
+
11
+ desc 'Remove sample outputs and build artifacts (also cleans specs)'
12
+ task :clean do
13
+ `rm -rf output`
14
+ `rm -rf build`
15
+ end
10
16
  end
11
17
 
12
18
  desc 'Alias to samples:run'
data/tasks/test.rake CHANGED
@@ -33,7 +33,7 @@ namespace :test do
33
33
  end # namespace :test
34
34
 
35
35
  desc 'Alias to test:run'
36
- task :test => 'test:run'
36
+ task :test => ['ant:retrieve', 'test:run']
37
37
 
38
38
  task :clobber => 'test:clobber_rcov' if HAVE_RCOV
39
39
 
@@ -0,0 +1,55 @@
1
+ require 'cascading'
2
+
3
+ module MockAssemblies
4
+ def mock_assembly(&block)
5
+ assembly = nil
6
+ flow 'test' do
7
+ source 'test', tap('test/data/data1.txt')
8
+ assembly = assembly 'test', &block
9
+ sink 'test', tap('output/test_mock_assembly')
10
+ end
11
+ assembly
12
+ end
13
+
14
+ def mock_branched_assembly(&block)
15
+ assembly = nil
16
+ flow 'mock_branched_assembly' do
17
+ source 'data1', tap('test/data/data1.txt')
18
+
19
+ assembly 'data1' do
20
+ branch 'test1' do
21
+ pass
22
+ end
23
+ branch 'test2' do
24
+ pass
25
+ end
26
+ end
27
+
28
+ assembly = assembly 'test', &block
29
+
30
+ sink 'test', tap('output/test_mock_branched_assembly')
31
+ end
32
+ assembly
33
+ end
34
+
35
+ def mock_two_input_assembly(&block)
36
+ assembly = nil
37
+ flow 'mock_two_input_assembly' do
38
+ source 'test1', tap('test/data/data1.txt')
39
+ source 'test2', tap('test/data/data2.txt')
40
+
41
+ assembly 'test1' do
42
+ split 'line', :pattern => /[.,]*\s+/, :into => ['name', 'score1', 'score2', 'id'], :output => ['name', 'score1', 'score2', 'id']
43
+ end
44
+
45
+ assembly 'test2' do
46
+ split 'line', :pattern => /[.,]*\s+/, :into => ['name', 'id', 'town'], :output => ['name', 'id', 'town']
47
+ end
48
+
49
+ assembly = assembly 'test', &block
50
+
51
+ sink 'test', tap('output/test_mock_two_input_assembly')
52
+ end
53
+ assembly
54
+ end
55
+ end
@@ -0,0 +1,443 @@
1
+ require 'test/unit'
2
+ require 'cascading'
3
+ require 'cascading/sub_assembly'
4
+
5
+ require 'test/mock_assemblies'
6
+
7
+ class TC_Aggregations < Test::Unit::TestCase
8
+ include MockAssemblies
9
+
10
+ # first chosen because it does not have a corresponding AggregateBy
11
+ def test_create_group_by
12
+ group = nil
13
+ assembly = mock_assembly do
14
+ group = group_by 'line' do
15
+ first 'offset'
16
+ end
17
+ end
18
+
19
+ assert_equal Java::CascadingPipe::GroupBy, group.class
20
+ assert_equal Java::CascadingPipe::Every, assembly.tail_pipe.class
21
+ assert assembly.tail_pipe.aggregator?
22
+ assert_equal Java::CascadingOperationAggregator::First, assembly.tail_pipe.aggregator.class
23
+
24
+ grouping_fields = group.key_selectors['test']
25
+ assert_equal ['line'], grouping_fields.to_a
26
+
27
+ assert_equal ['line', 'offset'], assembly.scope.values_fields.to_a
28
+ assert_equal ['line', 'offset'], assembly.scope.grouping_fields.to_a
29
+
30
+ assembly = mock_assembly do
31
+ group = group_by 'offset' do
32
+ first 'line'
33
+ end
34
+ end
35
+
36
+ assert_equal Java::CascadingPipe::GroupBy, group.class
37
+ assert_equal Java::CascadingPipe::Every, assembly.tail_pipe.class
38
+ assert assembly.tail_pipe.aggregator?
39
+ assert_equal Java::CascadingOperationAggregator::First, assembly.tail_pipe.aggregator.class
40
+
41
+ grouping_fields = group.key_selectors['test']
42
+ assert_equal ['offset'], grouping_fields.to_a
43
+
44
+ assert_equal ['offset', 'line'], assembly.scope.values_fields.to_a
45
+ assert_equal ['offset', 'line'], assembly.scope.grouping_fields.to_a
46
+ end
47
+
48
+ def test_create_group_by_aggregate_by
49
+ group = nil
50
+ assembly = mock_assembly do
51
+ group = group_by 'line' do
52
+ count
53
+ end
54
+ end
55
+
56
+ # GroupBy replaced by SubAssembly, the tail of which is a Sum, not a Count
57
+ assert_equal SubAssembly, group.class
58
+ assert_equal Java::CascadingPipe::Every, assembly.tail_pipe.class
59
+ assert assembly.tail_pipe.aggregator?
60
+ assert_equal Java::CascadingOperationAggregator::Sum, assembly.tail_pipe.aggregator.class
61
+
62
+ assert_equal ['line', 'count'], assembly.scope.values_fields.to_a
63
+ assert_equal ['line', 'count'], assembly.scope.grouping_fields.to_a
64
+
65
+ assembly = mock_assembly do
66
+ group = group_by 'offset' do
67
+ count
68
+ end
69
+ end
70
+
71
+ # GroupBy replaced by SubAssembly, the tail of which is a Sum, not a Count
72
+ assert_equal SubAssembly, group.class
73
+ assert_equal Java::CascadingPipe::Every, assembly.tail_pipe.class
74
+ assert assembly.tail_pipe.aggregator?
75
+ assert_equal Java::CascadingOperationAggregator::Sum, assembly.tail_pipe.aggregator.class
76
+
77
+ assert_equal ['offset', 'count'], assembly.scope.values_fields.to_a
78
+ assert_equal ['offset', 'count'], assembly.scope.grouping_fields.to_a
79
+ end
80
+
81
+ # min chosen because it does not have a corresponding AggregateBy
82
+ def test_create_group_by_many_fields
83
+ group = nil
84
+ assembly = mock_assembly do
85
+ group = group_by 'offset', 'line' do
86
+ min 'offset' => 'min_offset'
87
+ end
88
+ end
89
+
90
+ assert_equal Java::CascadingPipe::GroupBy, group.class
91
+ assert_equal Java::CascadingPipe::Every, assembly.tail_pipe.class
92
+ assert assembly.tail_pipe.aggregator?
93
+ assert_equal Java::CascadingOperationAggregator::Min, assembly.tail_pipe.aggregator.class
94
+
95
+ grouping_fields = group.key_selectors['test']
96
+ assert_equal ['offset', 'line'], grouping_fields.to_a
97
+
98
+ assert_equal ['offset', 'line', 'min_offset'], assembly.scope.values_fields.to_a
99
+ assert_equal ['offset', 'line', 'min_offset'], assembly.scope.grouping_fields.to_a
100
+ end
101
+
102
+ def test_create_group_by_aggregate_by_many_fields
103
+ group = nil
104
+ assembly = mock_assembly do
105
+ group = group_by 'offset', 'line' do
106
+ average 'offset' => 'avg_offset'
107
+ end
108
+ end
109
+
110
+ # GroupBy replaced by SubAssembly, the tail of which is an AverageFinal, not an Average
111
+ assert_equal SubAssembly, group.class
112
+ assert_equal Java::CascadingPipe::Every, assembly.tail_pipe.class
113
+ assert assembly.tail_pipe.aggregator?
114
+ assert_equal Java::CascadingPipeAssembly::AverageBy::AverageFinal, assembly.tail_pipe.aggregator.class
115
+
116
+ assert_equal ['offset', 'line', 'avg_offset'], assembly.scope.values_fields.to_a
117
+ assert_equal ['offset', 'line', 'avg_offset'], assembly.scope.grouping_fields.to_a
118
+ end
119
+
120
+ def test_create_group_by_with_sort
121
+ group = nil
122
+ assembly = mock_assembly do
123
+ group = group_by 'offset', 'line', :sort_by => 'line' do
124
+ count
125
+ end
126
+ end
127
+
128
+ # :sort_by invalidates AggregateBy optimization
129
+ assert_equal Java::CascadingPipe::GroupBy, group.class
130
+ assert_equal Java::CascadingPipe::Every, assembly.tail_pipe.class
131
+ assert assembly.tail_pipe.aggregator?
132
+ assert_equal Java::CascadingOperationAggregator::Count, assembly.tail_pipe.aggregator.class
133
+
134
+ assert group.is_sorted
135
+ assert !group.is_sort_reversed
136
+
137
+ grouping_fields = group.key_selectors['test']
138
+ sorting_fields = group.sorting_selectors['test']
139
+ assert_equal ['offset', 'line'], grouping_fields.to_a
140
+ assert_equal ['line'], sorting_fields.to_a
141
+
142
+ assert_equal ['offset', 'line', 'count'], assembly.scope.values_fields.to_a
143
+ assert_equal ['offset', 'line', 'count'], assembly.scope.grouping_fields.to_a
144
+ end
145
+
146
+ def test_create_group_by_with_sort_reverse
147
+ group = nil
148
+ assembly = mock_assembly do
149
+ group = group_by 'offset', 'line', :sort_by => 'line', :reverse => true do
150
+ count
151
+ end
152
+ end
153
+
154
+ # :sort_by invalidates AggregateBy optimization
155
+ assert_equal Java::CascadingPipe::GroupBy, group.class
156
+ assert_equal Java::CascadingPipe::Every, assembly.tail_pipe.class
157
+ assert assembly.tail_pipe.aggregator?
158
+ assert_equal Java::CascadingOperationAggregator::Count, assembly.tail_pipe.aggregator.class
159
+
160
+ assert group.is_sorted
161
+ assert group.is_sort_reversed
162
+
163
+ grouping_fields = group.key_selectors['test']
164
+ sorting_fields = group.sorting_selectors['test']
165
+ assert_equal ['offset', 'line'], grouping_fields.to_a
166
+ assert_equal ['line'], sorting_fields.to_a
167
+
168
+ assert_equal ['offset', 'line', 'count'], assembly.scope.values_fields.to_a
169
+ assert_equal ['offset', 'line', 'count'], assembly.scope.grouping_fields.to_a
170
+ end
171
+
172
+ def test_create_group_by_reverse
173
+ group = nil
174
+ assembly = mock_assembly do
175
+ group = group_by 'offset', 'line', :reverse => true do
176
+ count
177
+ end
178
+ end
179
+
180
+ # :reverse invalidates AggregateBy optimization
181
+ assert_equal Java::CascadingPipe::GroupBy, group.class
182
+ assert_equal Java::CascadingPipe::Every, assembly.tail_pipe.class
183
+ assert assembly.tail_pipe.aggregator?
184
+ assert_equal Java::CascadingOperationAggregator::Count, assembly.tail_pipe.aggregator.class
185
+
186
+ assert !group.is_sorted
187
+ assert group.is_sort_reversed
188
+
189
+ grouping_fields = group.key_selectors['test']
190
+ sorting_fields = group.sorting_selectors['test']
191
+ assert_equal ['offset', 'line'], grouping_fields.to_a
192
+ assert_nil sorting_fields
193
+
194
+ assert_equal ['offset', 'line', 'count'], assembly.scope.values_fields.to_a
195
+ assert_equal ['offset', 'line', 'count'], assembly.scope.grouping_fields.to_a
196
+ end
197
+
198
+ # first chosen because it does not have a corresponding AggregateBy
199
+ def test_create_union
200
+ group = nil
201
+ assembly = mock_branched_assembly do
202
+ group = union 'test1', 'test2', :on => 'line' do
203
+ first 'offset'
204
+ end
205
+ end
206
+
207
+ assert_equal Java::CascadingPipe::GroupBy, group.class
208
+ assert_equal Java::CascadingPipe::Every, assembly.tail_pipe.class
209
+ assert assembly.tail_pipe.aggregator?
210
+ assert_equal Java::CascadingOperationAggregator::First, assembly.tail_pipe.aggregator.class
211
+
212
+ left_grouping_fields = group.key_selectors['test1']
213
+ assert_equal ['line'], left_grouping_fields.to_a
214
+
215
+ right_grouping_fields = group.key_selectors['test2']
216
+ assert_equal ['line'], right_grouping_fields.to_a
217
+
218
+ assert_equal ['line', 'offset'], assembly.scope.values_fields.to_a
219
+ assert_equal ['line', 'offset'], assembly.scope.grouping_fields.to_a
220
+
221
+ assembly = mock_branched_assembly do
222
+ group = union 'test1', 'test2', :on => 'offset' do
223
+ first 'line'
224
+ end
225
+ end
226
+
227
+ assert_equal Java::CascadingPipe::GroupBy, group.class
228
+ assert_equal Java::CascadingPipe::Every, assembly.tail_pipe.class
229
+ assert assembly.tail_pipe.aggregator?
230
+ assert_equal Java::CascadingOperationAggregator::First, assembly.tail_pipe.aggregator.class
231
+
232
+ left_grouping_fields = group.key_selectors['test1']
233
+ assert_equal ['offset'], left_grouping_fields.to_a
234
+ right_grouping_fields = group.key_selectors['test2']
235
+ assert_equal ['offset'], right_grouping_fields.to_a
236
+
237
+ assert_equal ['offset', 'line'], assembly.scope.values_fields.to_a
238
+ assert_equal ['offset', 'line'], assembly.scope.grouping_fields.to_a
239
+
240
+ assembly = mock_branched_assembly do
241
+ group = union 'test1', 'test2' do
242
+ min 'offset' => 'min_offset'
243
+ end
244
+ end
245
+
246
+ assert_equal Java::CascadingPipe::GroupBy, group.class
247
+ assert_equal Java::CascadingPipe::Every, assembly.tail_pipe.class
248
+ assert assembly.tail_pipe.aggregator?
249
+ assert_equal Java::CascadingOperationAggregator::Min, assembly.tail_pipe.aggregator.class
250
+
251
+ left_grouping_fields = group.key_selectors['test1']
252
+ assert_equal ['offset'], left_grouping_fields.to_a
253
+ right_grouping_fields = group.key_selectors['test2']
254
+ assert_equal ['offset'], right_grouping_fields.to_a
255
+
256
+ assert_equal ['offset', 'min_offset'], assembly.scope.values_fields.to_a
257
+ assert_equal ['offset', 'min_offset'], assembly.scope.grouping_fields.to_a
258
+ end
259
+
260
+ def test_create_union_aggregate_by
261
+ group = nil
262
+ assembly = mock_branched_assembly do
263
+ group = union 'test1', 'test2', :on => 'line' do
264
+ sum 'offset'
265
+ end
266
+ end
267
+
268
+ # GroupBy replaced by SubAssembly, the tail of which is a Sum
269
+ assert_equal SubAssembly, group.class
270
+ assert_equal Java::CascadingPipe::Every, assembly.tail_pipe.class
271
+ assert assembly.tail_pipe.aggregator?
272
+ assert_equal Java::CascadingOperationAggregator::Sum, assembly.tail_pipe.aggregator.class
273
+
274
+ assert_equal ['line', 'offset'], assembly.scope.values_fields.to_a
275
+ assert_equal ['line', 'offset'], assembly.scope.grouping_fields.to_a
276
+
277
+ assembly = mock_branched_assembly do
278
+ group = union 'test1', 'test2', :on => 'offset' do
279
+ sum :mapping => {'offset' => 'sum_offset'}, :type => :double
280
+ end
281
+ end
282
+
283
+ # GroupBy replaced by SubAssembly, the tail of which is a Sum
284
+ assert_equal SubAssembly, group.class
285
+ assert_equal Java::CascadingPipe::Every, assembly.tail_pipe.class
286
+ assert assembly.tail_pipe.aggregator?
287
+ assert_equal Java::CascadingOperationAggregator::Sum, assembly.tail_pipe.aggregator.class
288
+
289
+ assert_equal ['offset', 'sum_offset'], assembly.scope.values_fields.to_a
290
+ assert_equal ['offset', 'sum_offset'], assembly.scope.grouping_fields.to_a
291
+
292
+ assembly = mock_branched_assembly do
293
+ group = union 'test1', 'test2' do
294
+ sum :mapping => {'offset' => 'sum_offset'}
295
+ end
296
+ end
297
+
298
+ # GroupBy replaced by SubAssembly, the tail of which is a Sum
299
+ assert_equal SubAssembly, group.class
300
+ assert_equal Java::CascadingPipe::Every, assembly.tail_pipe.class
301
+ assert assembly.tail_pipe.aggregator?
302
+ assert_equal Java::CascadingOperationAggregator::Sum, assembly.tail_pipe.aggregator.class
303
+
304
+ assert_equal ['offset', 'sum_offset'], assembly.scope.values_fields.to_a
305
+ assert_equal ['offset', 'sum_offset'], assembly.scope.grouping_fields.to_a
306
+ end
307
+
308
+ # max chosen because it does not have a corresponding AggregateBy
309
+ def test_create_union_many_fields
310
+ group = nil
311
+ assembly = mock_branched_assembly do
312
+ group = union 'test1', 'test2', :on => ['offset', 'line'] do
313
+ max 'offset' => 'max_offset'
314
+ end
315
+ end
316
+
317
+ assert_equal Java::CascadingPipe::GroupBy, group.class
318
+ assert_equal Java::CascadingPipe::Every, assembly.tail_pipe.class
319
+ assert assembly.tail_pipe.aggregator?
320
+ assert_equal Java::CascadingOperationAggregator::Max, assembly.tail_pipe.aggregator.class
321
+
322
+ left_grouping_fields = group.key_selectors['test1']
323
+ assert_equal ['offset', 'line'], left_grouping_fields.to_a
324
+
325
+ right_grouping_fields = group.key_selectors['test2']
326
+ assert_equal ['offset', 'line'], right_grouping_fields.to_a
327
+
328
+ assert_equal ['offset', 'line', 'max_offset'], assembly.scope.values_fields.to_a
329
+ assert_equal ['offset', 'line', 'max_offset'], assembly.scope.grouping_fields.to_a
330
+ end
331
+
332
+ def test_create_union_aggregate_by_many_fields
333
+ group = nil
334
+ assembly = mock_branched_assembly do
335
+ group = union 'test1', 'test2', :on => ['offset', 'line'] do
336
+ count
337
+ average 'offset' => 'avg_offset'
338
+ end
339
+ end
340
+
341
+ # GroupBy replaced by SubAssembly, the tail of which is an AverageFinal, not an Average
342
+ assert_equal SubAssembly, group.class
343
+ assert_equal Java::CascadingPipe::Every, assembly.tail_pipe.class
344
+ assert assembly.tail_pipe.aggregator?
345
+ assert_equal Java::CascadingPipeAssembly::AverageBy::AverageFinal, assembly.tail_pipe.aggregator.class
346
+
347
+ assert_equal ['offset', 'line', 'count', 'avg_offset'], assembly.scope.values_fields.to_a
348
+ assert_equal ['offset', 'line', 'count', 'avg_offset'], assembly.scope.grouping_fields.to_a
349
+ end
350
+
351
+ def test_create_union_with_sort
352
+ group = nil
353
+ assembly = mock_branched_assembly do
354
+ group = union 'test1', 'test2', :on => ['offset', 'line'], :sort_by => 'line' do
355
+ count
356
+ end
357
+ end
358
+
359
+ # :sort_by invalidates AggregateBy optimization
360
+ assert_equal Java::CascadingPipe::GroupBy, group.class
361
+ assert_equal Java::CascadingPipe::Every, assembly.tail_pipe.class
362
+ assert assembly.tail_pipe.aggregator?
363
+ assert_equal Java::CascadingOperationAggregator::Count, assembly.tail_pipe.aggregator.class
364
+
365
+ assert group.is_sorted
366
+ assert !group.is_sort_reversed
367
+
368
+ left_grouping_fields = group.key_selectors['test1']
369
+ right_grouping_fields = group.key_selectors['test2']
370
+ left_sorting_fields = group.sorting_selectors['test1']
371
+ right_sorting_fields = group.sorting_selectors['test2']
372
+
373
+ assert_equal ['offset', 'line'], left_grouping_fields.to_a
374
+ assert_equal ['offset', 'line'], right_grouping_fields.to_a
375
+ assert_equal ['line'], left_sorting_fields.to_a
376
+ assert_equal ['line'], right_sorting_fields.to_a
377
+
378
+ assert_equal ['offset', 'line', 'count'], assembly.scope.values_fields.to_a
379
+ assert_equal ['offset', 'line', 'count'], assembly.scope.grouping_fields.to_a
380
+ end
381
+
382
+ def test_create_union_with_sort_reverse
383
+ group = nil
384
+ assembly = mock_branched_assembly do
385
+ group = union 'test1', 'test2', :on => ['offset', 'line'], :sort_by => 'line', :reverse => true do
386
+ count
387
+ end
388
+ end
389
+
390
+ # :sort_by invalidates AggregateBy optimization
391
+ assert_equal Java::CascadingPipe::GroupBy, group.class
392
+ assert_equal Java::CascadingPipe::Every, assembly.tail_pipe.class
393
+ assert assembly.tail_pipe.aggregator?
394
+ assert_equal Java::CascadingOperationAggregator::Count, assembly.tail_pipe.aggregator.class
395
+
396
+ assert group.is_sorted
397
+ assert group.is_sort_reversed
398
+
399
+ left_grouping_fields = group.key_selectors['test1']
400
+ right_grouping_fields = group.key_selectors['test2']
401
+ left_sorting_fields = group.sorting_selectors['test1']
402
+ right_sorting_fields = group.sorting_selectors['test2']
403
+
404
+ assert_equal ['offset', 'line'], left_grouping_fields.to_a
405
+ assert_equal ['offset', 'line'], right_grouping_fields.to_a
406
+ assert_equal ['line'], left_sorting_fields.to_a
407
+ assert_equal ['line'], right_sorting_fields.to_a
408
+
409
+ assert_equal ['offset', 'line', 'count'], assembly.scope.values_fields.to_a
410
+ assert_equal ['offset', 'line', 'count'], assembly.scope.grouping_fields.to_a
411
+ end
412
+
413
+ def test_create_union_reverse
414
+ group = nil
415
+ assembly = mock_branched_assembly do
416
+ group = union 'test1', 'test2', :on => ['offset', 'line'], :reverse => true do
417
+ count
418
+ end
419
+ end
420
+
421
+ # :reverse invalidates AggregateBy optimization
422
+ assert_equal Java::CascadingPipe::GroupBy, group.class
423
+ assert_equal Java::CascadingPipe::Every, assembly.tail_pipe.class
424
+ assert assembly.tail_pipe.aggregator?
425
+ assert_equal Java::CascadingOperationAggregator::Count, assembly.tail_pipe.aggregator.class
426
+
427
+ assert group.is_sorted # FIXME: Missing constructor in wip-255
428
+ assert group.is_sort_reversed
429
+
430
+ left_grouping_fields = group.key_selectors['test1']
431
+ right_grouping_fields = group.key_selectors['test2']
432
+ left_sorting_fields = group.sorting_selectors['test1']
433
+ right_sorting_fields = group.sorting_selectors['test2']
434
+
435
+ assert_equal ['offset', 'line'], left_grouping_fields.to_a
436
+ assert_equal ['offset', 'line'], right_grouping_fields.to_a
437
+ assert_equal ['offset', 'line'], left_sorting_fields.to_a # FIXME: Missing constructor in wip-255
438
+ assert_equal ['offset', 'line'], right_sorting_fields.to_a # FIXME: Missing constructor in wip-255
439
+
440
+ assert_equal ['offset', 'line', 'count'], assembly.scope.values_fields.to_a
441
+ assert_equal ['offset', 'line', 'count'], assembly.scope.grouping_fields.to_a
442
+ end
443
+ end