sparkql 1.2.4 → 1.2.8

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.
@@ -1,6 +1,6 @@
1
1
  #
2
2
  # DO NOT MODIFY!!!!
3
- # This file is automatically generated by Racc 1.4.14
3
+ # This file is automatically generated by Racc 1.4.15
4
4
  # from Racc grammer file "".
5
5
  #
6
6
 
@@ -85,7 +85,7 @@ module Sparkql::ParserCompatibility
85
85
 
86
86
  # Delegator for methods to process the error list.
87
87
  def process_errors
88
- Sparkql::ErrorsProcessor.new(@errors)
88
+ Sparkql::ErrorsProcessor.new(errors)
89
89
  end
90
90
 
91
91
  # delegate :errors?, :fatal_errors?, :dropped_errors?, :recovered_errors?, :to => :process_errors
@@ -126,6 +126,8 @@ module Sparkql::ParserTools
126
126
  end
127
127
 
128
128
  def tokenize_arithmetic_group(lhs)
129
+ @lexer.leveldown
130
+ @lexer.block_group_identifier -= 1
129
131
  lhs = {type: :field, value: lhs} if lhs.is_a?(String)
130
132
  {
131
133
  type: :arithmetic,
@@ -260,6 +262,8 @@ module Sparkql::ParserTools
260
262
  end
261
263
 
262
264
  def group_fold(exp)
265
+ @lexer.leveldown
266
+ @lexer.block_group_identifier -= 1
263
267
  exp
264
268
  end
265
269
 
data/sparkql.gemspec CHANGED
@@ -1,30 +1,32 @@
1
- # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "sparkql/version"
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.push File.expand_path('lib', __dir__)
4
+ require 'sparkql/version'
4
5
 
5
6
  Gem::Specification.new do |s|
6
- s.name = "sparkql"
7
+ s.name = 'sparkql'
7
8
  s.version = Sparkql::VERSION
8
- s.authors = ["Wade McEwen"]
9
- s.email = ["wade@fbsdata.com"]
10
- s.homepage = ""
11
- s.summary = %q{API Parser engine for filter searching}
12
- s.description = %q{Specification and base implementation of the Spark API parsing system.}
9
+ s.authors = ['Wade McEwen']
10
+ s.email = ['wade@fbsdata.com']
11
+ s.homepage = ''
12
+ s.summary = 'API Parser engine for filter searching'
13
+ s.description = 'Specification and base implementation of the Spark API parsing system.'
14
+
15
+ s.rubyforge_project = 'sparkql'
13
16
 
14
- s.rubyforge_project = "sparkql"
15
-
16
17
  s.license = 'Apache 2.0'
17
-
18
+
18
19
  s.files = `git ls-files`.split("\n")
19
20
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
- s.require_paths = ["lib"]
21
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
22
+ s.require_paths = ['lib']
23
+
24
+ s.required_ruby_version = '>= 2.3'
22
25
 
23
26
  s.add_dependency 'georuby', '~> 2.0'
27
+ s.add_development_dependency 'ci_reporter', '~> 1.6'
28
+ s.add_development_dependency 'mocha', '~> 0.12.0'
24
29
  s.add_development_dependency 'racc', '~> 1.4.8'
25
30
  s.add_development_dependency 'rake', '~> 0.9.2'
26
31
  s.add_development_dependency 'test-unit', '~> 2.1.0'
27
- s.add_development_dependency 'ci_reporter', '~> 1.6'
28
- s.add_development_dependency 'mocha', '~> 0.12.0'
29
-
30
32
  end
@@ -1,21 +1,37 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
  require 'sparkql/geo'
3
5
 
4
6
  class FunctionResolverTest < Test::Unit::TestCase
5
7
  include Sparkql
6
-
7
- EXAMPLE_DATE = DateTime.parse("2013-07-26T10:22:15.422804")
8
8
 
9
- test "function parameters and name preserved" do
10
- f = FunctionResolver.new('radius', [{:type => :character,
11
- :value => "35.12 -68.33"},{:type => :decimal, :value => 1.0}])
9
+ EXAMPLE_DATE = DateTime.parse('2013-07-26T10:22:15.422804')
10
+
11
+ test 'all with field' do
12
+ f = FunctionResolver.new('all', [
13
+ { type: :field, value: 'Name' }
14
+ ])
15
+
16
+ f.validate
17
+ assert !f.errors?, "Errors #{f.errors.inspect}"
18
+ value = f.call
19
+
20
+ assert_equal :function, value[:type]
21
+ assert_equal 'all', value[:value]
22
+ assert_equal 'Name', value[:args].first[:value]
23
+ end
24
+
25
+ test 'function parameters and name preserved' do
26
+ f = FunctionResolver.new('radius', [{ type: :character,
27
+ value: '35.12 -68.33' }, { type: :decimal, value: 1.0 }])
12
28
  value = f.call
13
29
  assert_equal 'radius', value[:function_name]
14
- assert_equal(["35.12 -68.33", 1.0], value[:function_parameters])
30
+ assert_equal(['35.12 -68.33', 1.0], value[:function_parameters])
15
31
  end
16
32
 
17
- test "round(float)" do
18
- f = FunctionResolver.new('round', [{:type => :decimal, :value => 0.5}])
33
+ test 'round(float)' do
34
+ f = FunctionResolver.new('round', [{ type: :decimal, value: 0.5 }])
19
35
  f.validate
20
36
  assert !f.errors?, "Errors #{f.errors.inspect}"
21
37
  value = f.call
@@ -23,22 +39,22 @@ class FunctionResolverTest < Test::Unit::TestCase
23
39
  assert_equal '1', value[:value]
24
40
  end
25
41
 
26
- test "round(Field)" do
27
- f = FunctionResolver.new('round', [{:type => :field, :value => 'ListPrice'}])
42
+ test 'round(Field)' do
43
+ f = FunctionResolver.new('round', [{ type: :field, value: 'ListPrice' }])
28
44
  f.validate
29
45
  assert !f.errors?, "Errors #{f.errors.inspect}"
30
46
  value = f.call
31
47
 
32
48
  assert_equal :function, value[:type]
33
49
  assert_equal 'round', value[:value]
34
- assert_equal "ListPrice", value[:args].first[:value]
50
+ assert_equal 'ListPrice', value[:args].first[:value]
35
51
  end
36
52
 
37
- test "substring character one index" do
53
+ test 'substring character one index' do
38
54
  f = FunctionResolver.new('substring', [
39
- {:type => :character, :value => 'ListPrice'},
40
- {:type => :integer, :value => 1}
41
- ])
55
+ { type: :character, value: 'ListPrice' },
56
+ { type: :integer, value: 1 }
57
+ ])
42
58
 
43
59
  f.validate
44
60
  assert !f.errors?, "Errors #{f.errors.inspect}"
@@ -48,26 +64,26 @@ class FunctionResolverTest < Test::Unit::TestCase
48
64
  assert_equal 'istPrice', value[:value]
49
65
  end
50
66
 
51
- test "substring character two indexes" do
67
+ test 'substring character two indexes' do
52
68
  f = FunctionResolver.new('substring', [
53
- {:type => :character, :value => 'alfb'},
54
- {:type => :integer, :value => 1},
55
- {:type => :integer, :value => 2}
56
- ])
69
+ { type: :character, value: 'alfb' },
70
+ { type: :integer, value: 1 },
71
+ { type: :integer, value: 2 }
72
+ ])
57
73
 
58
74
  f.validate
59
75
  assert !f.errors?, "Errors #{f.errors.inspect}"
60
76
  value = f.call
61
77
 
62
78
  assert_equal :character, value[:type]
63
- assert_equal "lf", value[:value]
79
+ assert_equal 'lf', value[:value]
64
80
  end
65
81
 
66
- test "substring character large first index" do
82
+ test 'substring character large first index' do
67
83
  f = FunctionResolver.new('substring', [
68
- {:type => :character, :value => 'ListPrice'},
69
- {:type => :integer, :value => 10}
70
- ])
84
+ { type: :character, value: 'ListPrice' },
85
+ { type: :integer, value: 10 }
86
+ ])
71
87
 
72
88
  f.validate
73
89
  assert !f.errors?, "Errors #{f.errors.inspect}"
@@ -77,11 +93,11 @@ class FunctionResolverTest < Test::Unit::TestCase
77
93
  assert_equal '', value[:value]
78
94
  end
79
95
 
80
- test "substring field one index" do
96
+ test 'substring field one index' do
81
97
  f = FunctionResolver.new('substring', [
82
- {:type => :field, :value => 'ListPrice'},
83
- {:type => :integer, :value => 1}
84
- ])
98
+ { type: :field, value: 'ListPrice' },
99
+ { type: :integer, value: 1 }
100
+ ])
85
101
 
86
102
  f.validate
87
103
  assert !f.errors?, "Errors #{f.errors.inspect}"
@@ -89,16 +105,16 @@ class FunctionResolverTest < Test::Unit::TestCase
89
105
 
90
106
  assert_equal :function, value[:type]
91
107
  assert_equal 'substring', value[:value]
92
- assert_equal "ListPrice", value[:args].first[:value]
108
+ assert_equal 'ListPrice', value[:args].first[:value]
93
109
  assert_equal 2, value[:args].size
94
110
  end
95
111
 
96
- test "substring field two indexes" do
112
+ test 'substring field two indexes' do
97
113
  f = FunctionResolver.new('substring', [
98
- {:type => :field, :value => 'ListPrice'},
99
- {:type => :integer, :value => 1},
100
- {:type => :integer, :value => 2}
101
- ])
114
+ { type: :field, value: 'ListPrice' },
115
+ { type: :integer, value: 1 },
116
+ { type: :integer, value: 2 }
117
+ ])
102
118
 
103
119
  f.validate
104
120
  assert !f.errors?, "Errors #{f.errors.inspect}"
@@ -106,28 +122,28 @@ class FunctionResolverTest < Test::Unit::TestCase
106
122
 
107
123
  assert_equal :function, value[:type]
108
124
  assert_equal 'substring', value[:value]
109
- assert_equal "ListPrice", value[:args].first[:value]
125
+ assert_equal 'ListPrice', value[:args].first[:value]
110
126
  assert_equal 2, value[:args].last[:value]
111
127
  end
112
128
 
113
- test "substring with negative M is a parse error" do
129
+ test 'substring with negative M is a parse error' do
114
130
  f = FunctionResolver.new('substring', [
115
- {:type => :field, :value => 'ListPrice'},
116
- {:type => :integer, :value => 1},
117
- {:type => :integer, :value => -5}
118
- ])
131
+ { type: :field, value: 'ListPrice' },
132
+ { type: :integer, value: 1 },
133
+ { type: :integer, value: -5 }
134
+ ])
119
135
 
120
136
  f.validate
121
137
  f.call
122
138
  assert f.errors?
123
139
  end
124
140
 
125
- test "character substring with negative M is a parse error" do
141
+ test 'character substring with negative M is a parse error' do
126
142
  f = FunctionResolver.new('substring', [
127
- {:type => :character, :value => 'ListPrice'},
128
- {:type => :integer, :value => 1},
129
- {:type => :integer, :value => -5}
130
- ])
143
+ { type: :character, value: 'ListPrice' },
144
+ { type: :integer, value: 1 },
145
+ { type: :integer, value: -5 }
146
+ ])
131
147
 
132
148
  f.validate
133
149
  f.call
@@ -136,8 +152,8 @@ class FunctionResolverTest < Test::Unit::TestCase
136
152
 
137
153
  test 'trim with field' do
138
154
  f = FunctionResolver.new('trim', [
139
- {:type => :field, :value => 'Name'}
140
- ])
155
+ { type: :field, value: 'Name' }
156
+ ])
141
157
 
142
158
  f.validate
143
159
  assert !f.errors?, "Errors #{f.errors.inspect}"
@@ -145,13 +161,13 @@ class FunctionResolverTest < Test::Unit::TestCase
145
161
 
146
162
  assert_equal :function, value[:type]
147
163
  assert_equal 'trim', value[:value]
148
- assert_equal "Name", value[:args].first[:value]
164
+ assert_equal 'Name', value[:args].first[:value]
149
165
  end
150
166
 
151
167
  test 'trim with character' do
152
168
  f = FunctionResolver.new('trim', [
153
- {:type => :character, :value => ' val '}
154
- ])
169
+ { type: :character, value: ' val ' }
170
+ ])
155
171
 
156
172
  f.validate
157
173
  assert !f.errors?, "Errors #{f.errors.inspect}"
@@ -162,7 +178,7 @@ class FunctionResolverTest < Test::Unit::TestCase
162
178
  end
163
179
 
164
180
  test "tolower('string')" do
165
- f = FunctionResolver.new('tolower', [{:type => :character, :value => "STRING"}])
181
+ f = FunctionResolver.new('tolower', [{ type: :character, value: 'STRING' }])
166
182
  f.validate
167
183
  assert !f.errors?, "Errors #{f.errors.inspect}"
168
184
  value = f.call
@@ -170,18 +186,18 @@ class FunctionResolverTest < Test::Unit::TestCase
170
186
  assert_equal "'string'", value[:value]
171
187
  end
172
188
 
173
- test "toupper(SomeField)" do
174
- f = FunctionResolver.new('toupper', [{:type => :field, :value => "City"}])
189
+ test 'toupper(SomeField)' do
190
+ f = FunctionResolver.new('toupper', [{ type: :field, value: 'City' }])
175
191
  f.validate
176
192
  assert !f.errors?, "Errors #{f.errors.inspect}"
177
193
  value = f.call
178
194
  assert_equal :function, value[:type]
179
195
  assert_equal 'toupper', value[:value]
180
- assert_equal "City", value[:args].first[:value]
196
+ assert_equal 'City', value[:args].first[:value]
181
197
  end
182
198
 
183
199
  test "toupper('string')" do
184
- f = FunctionResolver.new('toupper', [{:type => :character, :value => "string"}])
200
+ f = FunctionResolver.new('toupper', [{ type: :character, value: 'string' }])
185
201
  f.validate
186
202
  assert !f.errors?, "Errors #{f.errors.inspect}"
187
203
  value = f.call
@@ -189,18 +205,18 @@ class FunctionResolverTest < Test::Unit::TestCase
189
205
  assert_equal "'STRING'", value[:value]
190
206
  end
191
207
 
192
- test "length(SomeField)" do
193
- f = FunctionResolver.new('length', [{:type => :field, :value => "City"}])
208
+ test 'length(SomeField)' do
209
+ f = FunctionResolver.new('length', [{ type: :field, value: 'City' }])
194
210
  f.validate
195
211
  assert !f.errors?, "Errors #{f.errors.inspect}"
196
212
  value = f.call
197
213
  assert_equal :function, value[:type]
198
214
  assert_equal 'length', value[:value]
199
- assert_equal "City", value[:args].first[:value]
215
+ assert_equal 'City', value[:args].first[:value]
200
216
  end
201
217
 
202
218
  test "length('string')" do
203
- f = FunctionResolver.new('length', [{:type => :character, :value => "string"}])
219
+ f = FunctionResolver.new('length', [{ type: :character, value: 'string' }])
204
220
  f.validate
205
221
  assert !f.errors?, "Errors #{f.errors.inspect}"
206
222
  value = f.call
@@ -208,7 +224,7 @@ class FunctionResolverTest < Test::Unit::TestCase
208
224
  assert_equal '6', value[:value]
209
225
  end
210
226
 
211
- test "now()" do
227
+ test 'now()' do
212
228
  start = Time.now
213
229
  f = FunctionResolver.new('now', [])
214
230
  f.validate
@@ -216,10 +232,11 @@ class FunctionResolverTest < Test::Unit::TestCase
216
232
  value = f.call
217
233
  assert_equal :datetime, value[:type]
218
234
  test_time = Time.parse(value[:value])
219
- assert (-5 < test_time - start && 5 > test_time - start), "Time range off by more than five seconds #{test_time - start} '#{test_time} - #{start}'"
235
+ assert (test_time - start > -5 && test_time - start < 5),
236
+ "Time range off by more than five seconds #{test_time - start} '#{test_time} - #{start}'"
220
237
  end
221
238
 
222
- test "mindatetime()" do
239
+ test 'mindatetime()' do
223
240
  f = FunctionResolver.new('mindatetime', [])
224
241
  f.validate
225
242
  assert !f.errors?, "Errors #{f.errors.inspect}"
@@ -229,7 +246,7 @@ class FunctionResolverTest < Test::Unit::TestCase
229
246
  assert_equal '1970-01-01T00:00:00+00:00', value[:value]
230
247
  end
231
248
 
232
- test "maxdatetime()" do
249
+ test 'maxdatetime()' do
233
250
  f = FunctionResolver.new('maxdatetime', [])
234
251
  f.validate
235
252
  assert !f.errors?, "Errors #{f.errors.inspect}"
@@ -239,8 +256,8 @@ class FunctionResolverTest < Test::Unit::TestCase
239
256
  assert_equal '9999-12-31T23:59:59+00:00', value[:value]
240
257
  end
241
258
 
242
- test "floor(float)" do
243
- f = FunctionResolver.new('floor', [{:type => :decimal, :value => 0.5}])
259
+ test 'floor(float)' do
260
+ f = FunctionResolver.new('floor', [{ type: :decimal, value: 0.5 }])
244
261
  f.validate
245
262
  assert !f.errors?, "Errors #{f.errors.inspect}"
246
263
  value = f.call
@@ -248,19 +265,19 @@ class FunctionResolverTest < Test::Unit::TestCase
248
265
  assert_equal '0', value[:value]
249
266
  end
250
267
 
251
- test "floor(Field)" do
252
- f = FunctionResolver.new('floor', [{:type => :field, :value => 'ListPrice'}])
268
+ test 'floor(Field)' do
269
+ f = FunctionResolver.new('floor', [{ type: :field, value: 'ListPrice' }])
253
270
  f.validate
254
271
  assert !f.errors?, "Errors #{f.errors.inspect}"
255
272
  value = f.call
256
273
 
257
274
  assert_equal :function, value[:type]
258
275
  assert_equal 'floor', value[:value]
259
- assert_equal "ListPrice", value[:args].first[:value]
276
+ assert_equal 'ListPrice', value[:args].first[:value]
260
277
  end
261
278
 
262
- test "ceiling(float)" do
263
- f = FunctionResolver.new('ceiling', [{:type => :decimal, :value => 0.5}])
279
+ test 'ceiling(float)' do
280
+ f = FunctionResolver.new('ceiling', [{ type: :decimal, value: 0.5 }])
264
281
  f.validate
265
282
  assert !f.errors?, "Errors #{f.errors.inspect}"
266
283
  value = f.call
@@ -268,93 +285,344 @@ class FunctionResolverTest < Test::Unit::TestCase
268
285
  assert_equal '1', value[:value]
269
286
  end
270
287
 
271
- test "ceiling(Field)" do
272
- f = FunctionResolver.new('ceiling', [{:type => :field, :value => 'ListPrice'}])
288
+ test 'ceiling(Field)' do
289
+ f = FunctionResolver.new('ceiling', [{ type: :field, value: 'ListPrice' }])
273
290
  f.validate
274
291
  assert !f.errors?, "Errors #{f.errors.inspect}"
275
292
  value = f.call
276
293
 
277
294
  assert_equal :function, value[:type]
278
295
  assert_equal 'ceiling', value[:value]
279
- assert_equal "ListPrice", value[:args].first[:value]
296
+ assert_equal 'ListPrice', value[:args].first[:value]
297
+ end
298
+
299
+ test 'seconds()' do
300
+ test_time = Time.new(2019, 4, 1, 8, 30, 20, 0)
301
+
302
+ f = FunctionResolver.new('seconds', [{ type: :integer, value: 7 }])
303
+ f.expects(:current_time).returns(test_time)
304
+ f.validate
305
+ assert !f.errors?, "Errors #{f.errors.inspect}"
306
+ value = f.call
307
+
308
+ assert_equal :datetime, value[:type]
309
+ d = DateTime.parse(value[:value])
310
+ assert_equal test_time.year, d.year
311
+ assert_equal test_time.month, d.month
312
+ assert_equal test_time.mday, d.mday
313
+ assert_equal test_time.hour, d.hour
314
+ assert_equal test_time.min, d.min
315
+ assert_equal test_time.sec + 7, d.sec
316
+
317
+ f = FunctionResolver.new('seconds', [{ type: :integer, value: -21 }])
318
+ f.expects(:current_time).returns(test_time)
319
+ f.validate
320
+ assert !f.errors?, "Errors #{f.errors.inspect}"
321
+ value = f.call
322
+
323
+ assert_equal :datetime, value[:type]
324
+ d = DateTime.parse(value[:value])
325
+ assert_equal test_time.year, d.year
326
+ assert_equal test_time.month, d.month
327
+ assert_equal test_time.mday, d.mday
328
+ assert_equal test_time.hour, d.hour
329
+ assert_equal test_time.min - 1, d.min
330
+ assert_equal 29, d.min
331
+ assert_equal 59, d.sec
332
+
333
+ f = FunctionResolver.new('seconds', [{ type: :integer,
334
+ value: -Sparkql::FunctionResolver::SECONDS_IN_DAY }])
335
+ f.expects(:current_time).returns(test_time)
336
+ f.validate
337
+ assert !f.errors?, "Errors #{f.errors.inspect}"
338
+ value = f.call
339
+
340
+ assert_equal :datetime, value[:type]
341
+ d = DateTime.parse(value[:value])
342
+ assert_equal test_time.year, d.year
343
+ assert_equal test_time.month - 1, d.month
344
+ assert_equal 31, d.mday
345
+ assert_equal test_time.hour, d.hour
346
+ assert_equal test_time.min, d.min
347
+ assert_equal test_time.min, d.min
348
+ assert_equal test_time.sec, d.sec
280
349
  end
281
350
 
282
- test "days()" do
283
- d = Date.new(2012,10,20)
284
- Date.expects(:today).returns(d)
285
- dt = DateTime.new(d.year, d.month,d.day, 0,0,0, DateTime.now.offset)
286
- start = Time.parse(dt.to_s)
287
- f = FunctionResolver.new('days', [{:type=>:integer, :value =>7}])
351
+ test 'minutes()' do
352
+ test_time = Time.new(2019, 4, 1, 8, 30, 20, 0)
353
+
354
+ f = FunctionResolver.new('minutes', [{ type: :integer, value: 7 }])
355
+ f.expects(:current_time).returns(test_time)
356
+ f.validate
357
+ assert !f.errors?, "Errors #{f.errors.inspect}"
358
+ value = f.call
359
+
360
+ assert_equal :datetime, value[:type]
361
+ d = DateTime.parse(value[:value])
362
+ assert_equal test_time.year, d.year
363
+ assert_equal test_time.month, d.month
364
+ assert_equal test_time.mday, d.mday
365
+ assert_equal test_time.hour, d.hour
366
+ assert_equal test_time.min + 7, d.min
367
+ assert_equal test_time.sec, d.sec
368
+
369
+ f = FunctionResolver.new('minutes', [{ type: :integer, value: -37 }])
370
+ f.expects(:current_time).returns(test_time)
371
+ f.validate
372
+ assert !f.errors?, "Errors #{f.errors.inspect}"
373
+ value = f.call
374
+
375
+ assert_equal :datetime, value[:type]
376
+ d = DateTime.parse(value[:value])
377
+ assert_equal test_time.year, d.year
378
+ assert_equal test_time.month, d.month
379
+ assert_equal test_time.mday, d.mday
380
+ assert_equal test_time.hour - 1, d.hour
381
+ assert_equal 53, d.min
382
+
383
+ f = FunctionResolver.new('minutes', [{ type: :integer,
384
+ value: -1440 }])
385
+ f.expects(:current_time).returns(test_time)
386
+ f.validate
387
+ assert !f.errors?, "Errors #{f.errors.inspect}"
388
+ value = f.call
389
+
390
+ assert_equal :datetime, value[:type]
391
+ d = DateTime.parse(value[:value])
392
+ assert_equal test_time.year, d.year
393
+ assert_equal test_time.month - 1, d.month
394
+ assert_equal 31, d.mday
395
+ assert_equal test_time.hour, d.hour
396
+ assert_equal test_time.min, d.min
397
+ end
398
+
399
+ test 'hours(), same day' do
400
+ test_time = Time.new(2019, 4, 1, 8, 30, 20, 0)
401
+ tests = [1, -1, 5, -5, 12]
402
+
403
+ tests.each do |offset|
404
+ f = FunctionResolver.new('hours', [{ type: :integer,
405
+ value: offset }])
406
+ f.expects(:current_time).returns(test_time)
407
+ f.validate
408
+ assert !f.errors?, "Errors #{f.errors.inspect}"
409
+ value = f.call
410
+
411
+ assert_equal :datetime, value[:type]
412
+ d = DateTime.parse(value[:value])
413
+ assert_equal test_time.year, d.year
414
+ assert_equal test_time.month, d.month
415
+ assert_equal test_time.mday, d.mday
416
+ assert_equal test_time.hour + offset, d.hour
417
+ assert_equal test_time.min, d.min
418
+ assert_equal test_time.sec, d.sec
419
+ end
420
+ end
421
+
422
+ test 'hours(), wrap day' do
423
+ test_time = Time.new(2019, 4, 1, 8, 30, 20, 0)
424
+
425
+ # Jump forward a few days, and a few hours.
426
+ f = FunctionResolver.new('hours', [{ type: :integer, value: 52 }])
427
+ f.expects(:current_time).returns(test_time)
428
+ f.validate
429
+ assert !f.errors?, "Errors #{f.errors.inspect}"
430
+ value = f.call
431
+
432
+ assert_equal :datetime, value[:type]
433
+ d = DateTime.parse(value[:value])
434
+ assert_equal test_time.year, d.year
435
+ assert_equal test_time.month, d.month
436
+ assert_equal test_time.mday + 2, d.mday
437
+ assert_equal test_time.hour + 4, d.hour
438
+ assert_equal test_time.min, d.min
439
+
440
+ # Drop back to the previous day, which'll also hit the previous month
441
+ f = FunctionResolver.new('hours', [{ type: :integer, value: -24 }])
442
+ f.expects(:current_time).returns(test_time)
443
+ f.validate
444
+ assert !f.errors?, "Errors #{f.errors.inspect}"
445
+ value = f.call
446
+
447
+ assert_equal :datetime, value[:type]
448
+ d = DateTime.parse(value[:value])
449
+ assert_equal test_time.year, d.year
450
+ assert_equal test_time.month - 1, d.month
451
+ assert_equal 31, d.mday
452
+ assert_equal test_time.hour, d.hour
453
+ assert_equal test_time.min, d.min
454
+
455
+ # Drop back one full year's worth of hours.
456
+ f = FunctionResolver.new('hours', [{ type: :integer, value: -8760 }])
457
+ f.expects(:current_time).returns(test_time)
458
+ f.validate
459
+ assert !f.errors?, "Errors #{f.errors.inspect}"
460
+ value = f.call
461
+
462
+ assert_equal :datetime, value[:type]
463
+ d = DateTime.parse(value[:value])
464
+ assert_equal test_time.year - 1, d.year
465
+ assert_equal test_time.month, d.month
466
+ assert_equal test_time.mday, d.mday
467
+ assert_equal test_time.hour, d.hour
468
+ assert_equal test_time.min, d.min
469
+ end
470
+
471
+ test 'days()' do
472
+ test_date = Date.new(2012, 10, 20) # Sat, 20 Oct 2012 00:00:00 GMT
473
+ f = FunctionResolver.new('days', [{ type: :integer, value: 7 }])
474
+ f.expects(:current_date).returns(test_date)
288
475
  f.validate
289
476
  assert !f.errors?, "Errors #{f.errors.inspect}"
290
477
  value = f.call
291
478
  assert_equal :date, value[:type]
292
- test_time = Time.parse(value[:value])
293
- assert (615000 > test_time - start && 600000 < test_time - start), "Time range off by more than five seconds #{test_time - start} '#{test_time} - #{start}'"
479
+ assert_equal '2012-10-27', value[:value]
480
+ end
481
+
482
+ test 'weekdays()' do
483
+ friday = Date.new(2012, 10, 19)
484
+ saturday = Date.new(2012, 10, 20)
485
+ sunday = Date.new(2012, 10, 21)
486
+ monday = Date.new(2012, 10, 22)
487
+ {
488
+ friday => [
489
+ [-5, '2012-10-12'],
490
+ [-4, '2012-10-15'],
491
+ [-1, '2012-10-18'],
492
+ [0, '2012-10-19'],
493
+ [1, '2012-10-22'],
494
+ [2, '2012-10-23'],
495
+ [5, '2012-10-26'],
496
+ [6, '2012-10-29'],
497
+ [7, '2012-10-30'],
498
+ [31, '2012-12-03']
499
+ ],
500
+ saturday => [
501
+ [-6, '2012-10-12'],
502
+ [-5, '2012-10-15'],
503
+ [-1, '2012-10-19'],
504
+ [0, '2012-10-22'],
505
+ [1, '2012-10-22'],
506
+ [2, '2012-10-23'],
507
+ [3, '2012-10-24'],
508
+ [4, '2012-10-25'],
509
+ [5, '2012-10-26'],
510
+ [6, '2012-10-29'],
511
+ [7, '2012-10-30'],
512
+ [31, '2012-12-03']
513
+ ],
514
+ sunday => [
515
+ [-6, '2012-10-12'],
516
+ [-5, '2012-10-15'],
517
+ [-1, '2012-10-19'],
518
+ [0, '2012-10-22'],
519
+ [1, '2012-10-22'],
520
+ [2, '2012-10-23'],
521
+ [5, '2012-10-26'],
522
+ [6, '2012-10-29'],
523
+ [7, '2012-10-30'],
524
+ [31, '2012-12-03']
525
+ ],
526
+ monday => [
527
+ [-6, '2012-10-12'],
528
+ [-5, '2012-10-15'],
529
+ [-1, '2012-10-19'],
530
+ [0, '2012-10-22'],
531
+ [1, '2012-10-23'],
532
+ [2, '2012-10-24'],
533
+ [5, '2012-10-29'],
534
+ [6, '2012-10-30'],
535
+ [7, '2012-10-31'],
536
+ [31, '2012-12-04']
537
+ ]
538
+ }.each do |test_date, weekday_tests|
539
+ weekday_tests.each do |days, expected_value|
540
+ f = FunctionResolver.new('weekdays', [{ type: :integer, value: days }])
541
+ f.expects(:current_date).returns(test_date)
542
+ f.validate
543
+ assert !f.errors?, "#{test_date}: #{days} = #{expected_value}"
544
+ value = f.call
545
+ assert_equal :date, value[:type]
546
+ assert_equal expected_value, value[:value], "#{test_date}: #{days} = #{expected_value}"
547
+ end
548
+ end
294
549
  end
295
550
 
296
- test "months()" do
551
+ test 'months()' do
297
552
  dt = DateTime.new(2014, 1, 6, 0, 0, 0, 0)
298
553
  DateTime.expects(:now).once.returns(dt)
299
554
 
300
- f = FunctionResolver.new('months', [{:type=>:integer, :value =>3}])
555
+ f = FunctionResolver.new('months', [{ type: :integer, value: 3 }])
301
556
  f.validate
302
557
  assert !f.errors?, "Errors resolving months(): #{f.errors.inspect}"
303
558
  value = f.call
304
559
  assert_equal :date, value[:type]
305
560
 
306
- assert_equal "2014-04-06", value[:value]
561
+ assert_equal '2014-04-06', value[:value]
307
562
  end
308
-
309
- test "years()" do
563
+
564
+ test 'years()' do
310
565
  dt = DateTime.new(2014, 1, 6, 0, 0, 0, 0)
311
566
  DateTime.expects(:now).once.returns(dt)
312
- f = FunctionResolver.new('years', [{:type=>:integer, :value =>-4}])
567
+ f = FunctionResolver.new('years', [{ type: :integer, value: -4 }])
313
568
  f.validate
314
569
  assert !f.errors?, "Errors resolving years(): #{f.errors.inspect}"
315
570
  value = f.call
316
571
  assert_equal :date, value[:type]
317
- assert_equal '2010-01-06', value[:value], "negative values should go back in time"
572
+ assert_equal '2010-01-06', value[:value], 'negative values should go back in time'
318
573
  end
319
574
 
320
- test "year(), month(), and day()" do
321
- ['year', 'month', 'day'].each do |function|
322
- f = FunctionResolver.new(function, [{:type => :field, :value => "OriginalEntryTimestamp"}])
575
+ test 'year(), month(), and day()' do
576
+ %w[year month day].each do |function|
577
+ f = FunctionResolver.new(function, [{ type: :field, value: 'OriginalEntryTimestamp' }])
323
578
  f.validate
324
579
  assert !f.errors?, "Errors #{f.errors.inspect}"
325
580
  value = f.call
326
581
  assert_equal :function, value[:type]
327
582
  assert_equal function, value[:value]
328
- assert_equal "OriginalEntryTimestamp", value[:args].first[:value]
583
+ assert_equal 'OriginalEntryTimestamp', value[:args].first[:value]
329
584
  end
330
585
  end
331
586
 
332
- test "hour(), minute(), and second()" do
333
- ['year', 'month', 'day'].each do |function|
334
- f = FunctionResolver.new(function, [{:type => :field, :value => "OriginalEntryTimestamp"}])
587
+ test 'hour(), minute(), and second()' do
588
+ %w[year month day].each do |function|
589
+ f = FunctionResolver.new(function, [{ type: :field, value: 'OriginalEntryTimestamp' }])
335
590
  f.validate
336
591
  assert !f.errors?, "Errors #{f.errors.inspect}"
337
592
  value = f.call
338
593
  assert_equal :function, value[:type]
339
594
  assert_equal function, value[:value]
340
- assert_equal "OriginalEntryTimestamp", value[:args].first[:value]
595
+ assert_equal 'OriginalEntryTimestamp', value[:args].first[:value]
341
596
  end
342
597
  end
343
598
 
344
- test "fractionalseconds()" do
345
- f = FunctionResolver.new('fractionalseconds', [{:type => :field, :value => "OriginalEntryTimestamp"}])
599
+ test 'day of week and day of year parse' do
600
+ %w[dayofyear dayofweek].each do |function|
601
+ f = FunctionResolver.new(function, [{ type: :field, value: 'OriginalEntryTimestamp' }])
602
+ f.validate
603
+ assert !f.errors?, "Errors #{f.errors.inspect}"
604
+ value = f.call
605
+ assert_equal :function, value[:type]
606
+ assert_equal function, value[:value]
607
+ assert_equal 'OriginalEntryTimestamp', value[:args].first[:value]
608
+ end
609
+ end
610
+
611
+ test 'fractionalseconds()' do
612
+ f = FunctionResolver.new('fractionalseconds', [{ type: :field, value: 'OriginalEntryTimestamp' }])
346
613
  f.validate
347
614
  assert !f.errors?, "Errors #{f.errors.inspect}"
348
615
  value = f.call
349
616
  assert_equal :function, value[:type]
350
617
  assert_equal 'fractionalseconds', value[:value]
351
- assert_equal "OriginalEntryTimestamp", value[:args].first[:value]
618
+ assert_equal 'OriginalEntryTimestamp', value[:args].first[:value]
352
619
  end
353
620
 
354
621
  # Polygon searches
355
-
356
- test "radius()" do
357
- f = FunctionResolver.new('radius', [{:type => :character, :value => "35.12 -68.33"},{:type => :decimal, :value => 1.0}])
622
+
623
+ test 'radius()' do
624
+ f = FunctionResolver.new('radius',
625
+ [{ type: :character, value: '35.12 -68.33' }, { type: :decimal, value: 1.0 }])
358
626
  f.validate
359
627
  assert !f.errors?, "Errors #{f.errors.inspect}"
360
628
  value = f.call
@@ -364,38 +632,41 @@ class FunctionResolverTest < Test::Unit::TestCase
364
632
  assert_equal 1.0, value[:value].radius, "#{value[:value].inspect} "
365
633
  end
366
634
 
367
- test "radius() can be overloaded with a ListingKey" do
368
- f = FunctionResolver.new('radius', [{:type => :character, :value => "20100000000000000000000000"},
369
- {:type => :decimal, :value => 1.0}])
635
+ test 'radius() can be overloaded with a ListingKey' do
636
+ f = FunctionResolver.new('radius', [{ type: :character, value: '20100000000000000000000000' },
637
+ { type: :decimal, value: 1.0 }])
370
638
  f.validate
371
639
  assert !f.errors?, "Errors #{f.errors.inspect}"
372
640
  value = f.call
373
641
  assert_equal :shape, value[:type]
374
642
  assert_equal Sparkql::Geo::RecordRadius, value[:value].class
375
- assert_equal "20100000000000000000000000", value[:value].record_id, "#{value[:value].inspect} "
643
+ assert_equal '20100000000000000000000000', value[:value].record_id, "#{value[:value].inspect} "
376
644
  assert_equal 1.0, value[:value].radius, "#{value[:value].inspect} "
377
645
  end
378
646
 
379
- test "radius() fails if not given coords or a flex ID" do
380
- f = FunctionResolver.new('radius', [{:type => :character, :value => "35.12,-68.33"},
381
- {:type => :decimal, :value => 1.0}])
647
+ test 'radius() fails if not given coords or a flex ID' do
648
+ f = FunctionResolver.new('radius', [{ type: :character, value: '35.12,-68.33' },
649
+ { type: :decimal, value: 1.0 }])
382
650
  f.validate
383
651
  f.call
384
652
  assert f.errors?
385
653
  end
386
654
 
387
- test "polygon()" do
388
- f = FunctionResolver.new('polygon', [{:type => :character, :value => "35.12 -68.33,35.12 -68.32, 35.13 -68.32,35.13 -68.33"}])
655
+ test 'polygon()' do
656
+ f = FunctionResolver.new('polygon',
657
+ [{ type: :character,
658
+ value: '35.12 -68.33,35.12 -68.32, 35.13 -68.32,35.13 -68.33' }])
389
659
  f.validate
390
660
  assert !f.errors?, "Errors #{f.errors.inspect}"
391
661
  value = f.call
392
662
  assert_equal :shape, value[:type]
393
663
  assert_equal GeoRuby::SimpleFeatures::Polygon, value[:value].class
394
- assert_equal [[-68.33, 35.12], [-68.32, 35.12], [-68.32, 35.13], [-68.33, 35.13], [-68.33, 35.12]], value[:value].to_coordinates.first, "#{value[:value].inspect} "
664
+ assert_equal [[-68.33, 35.12], [-68.32, 35.12], [-68.32, 35.13], [-68.33, 35.13], [-68.33, 35.12]],
665
+ value[:value].to_coordinates.first, "#{value[:value].inspect} "
395
666
  end
396
-
397
- test "linestring()" do
398
- f = FunctionResolver.new('linestring', [{:type => :character, :value => "35.12 -68.33,35.12 -68.32"}])
667
+
668
+ test 'linestring()' do
669
+ f = FunctionResolver.new('linestring', [{ type: :character, value: '35.12 -68.33,35.12 -68.32' }])
399
670
  f.validate
400
671
  assert !f.errors?, "Errors #{f.errors.inspect}"
401
672
  value = f.call
@@ -404,70 +675,72 @@ class FunctionResolverTest < Test::Unit::TestCase
404
675
  assert_equal [[-68.33, 35.12], [-68.32, 35.12]], value[:value].to_coordinates, "#{value[:value].inspect} "
405
676
  end
406
677
 
407
- test "rectangle()" do
408
- f = FunctionResolver.new('rectangle', [{:type => :character, :value => "35.12 -68.33, 35.13 -68.32"}])
678
+ test 'rectangle()' do
679
+ f = FunctionResolver.new('rectangle', [{ type: :character, value: '35.12 -68.33, 35.13 -68.32' }])
409
680
  f.validate
410
681
  assert !f.errors?, "Errors #{f.errors.inspect}"
411
682
  value = f.call
412
683
  assert_equal :shape, value[:type]
413
684
  assert_equal GeoRuby::SimpleFeatures::Polygon, value[:value].class
414
- assert_equal [[-68.33,35.12], [-68.32,35.12], [-68.32,35.13], [-68.33,35.13], [-68.33,35.12]], value[:value].to_coordinates.first, "#{value[:value].inspect} "
685
+ assert_equal [[-68.33, 35.12], [-68.32, 35.12], [-68.32, 35.13], [-68.33, 35.13], [-68.33, 35.12]],
686
+ value[:value].to_coordinates.first, "#{value[:value].inspect} "
415
687
  end
416
688
 
417
- test "range()" do
418
- f = FunctionResolver.new('range', [{:type => :character, :value => "M01"},
419
- {:type => :character, :value => "M05"}])
689
+ test 'range()' do
690
+ f = FunctionResolver.new('range', [{ type: :character, value: 'M01' },
691
+ { type: :character, value: 'M05' }])
420
692
  f.validate
421
693
  assert !f.errors?, "Errors #{f.errors.inspect}"
422
694
  value = f.call
423
695
  assert_equal :character, value[:type]
424
- assert_equal ["M01", "M05"], value[:value]
696
+ assert_equal %w[M01 M05], value[:value]
425
697
  end
426
-
427
- test "invalid params" do
428
- f = FunctionResolver.new('now', [{:type => :character, :value=>'bad value'}])
698
+
699
+ test 'invalid params' do
700
+ f = FunctionResolver.new('now', [{ type: :character, value: 'bad value' }])
429
701
  f.validate
430
702
  assert f.errors?, "'now' function does not support parameters"
431
-
703
+
432
704
  f = FunctionResolver.new('days', [])
433
705
  f.validate
434
706
  assert f.errors?, "'days' function requires one parameter"
435
-
436
- f = FunctionResolver.new('days', [{:type => :character, :value=>'bad value'}])
707
+
708
+ f = FunctionResolver.new('days', [{ type: :character, value: 'bad value' }])
437
709
  f.validate
438
710
  assert f.errors?, "'days' function needs integer parameter"
439
711
  end
440
712
 
441
- test "assert nil returned when function called with errors" do
442
- f = FunctionResolver.new('radius', [{:type => :character,
443
- :value => "35.12 -68.33, 35.13 -68.34"},{:type => :decimal,
444
- :value => 1.0}])
713
+ test 'assert nil returned when function called with errors' do
714
+ f = FunctionResolver.new('radius', [{ type: :character,
715
+ value: '35.12 -68.33, 35.13 -68.34' }, { type: :decimal,
716
+ value: 1.0 }])
445
717
  assert_nil f.call
446
718
  end
447
-
448
- test "return_type" do
449
- f = FunctionResolver.new('radius', [{:type => :character,
450
- :value => "35.12 -68.33, 35.13 -68.34"},{:type => :decimal,
451
- :value => 1.0}])
719
+
720
+ test 'return_type' do
721
+ f = FunctionResolver.new('radius', [{ type: :character,
722
+ value: '35.12 -68.33, 35.13 -68.34' }, { type: :decimal,
723
+ value: 1.0 }])
452
724
  assert_equal :shape, f.return_type
453
725
  end
454
726
 
455
727
  test 'return_type for cast()' do
456
- f = FunctionResolver.new('cast', [{:type => :character,
457
- :value => "1"},{:type => :character,
458
- :value => 'decimal'}])
728
+ f = FunctionResolver.new('cast', [{ type: :character,
729
+ value: '1' }, { type: :character,
730
+ value: 'decimal' }])
459
731
 
460
732
  assert_equal :decimal, f.return_type
461
733
 
462
- f = FunctionResolver.new('cast', [{:type => :character,
463
- :value => "1"},{:type => :character,
464
- :value => 'integer'}])
734
+ f = FunctionResolver.new('cast', [{ type: :character,
735
+ value: '1' }, { type: :character,
736
+ value: 'integer' }])
465
737
 
466
738
  assert_equal :integer, f.return_type
467
739
  end
468
740
 
469
- test "cast() decimal to integer" do
470
- f = FunctionResolver.new('cast', [{:type => :decimal, :value => '1.2'}, {type: :character, :value => 'integer'}])
741
+ test 'cast() decimal to integer' do
742
+ f = FunctionResolver.new('cast',
743
+ [{ type: :decimal, value: '1.2' }, { type: :character, value: 'integer' }])
471
744
  f.validate
472
745
  assert !f.errors?, "Errors #{f.errors.inspect}"
473
746
  value = f.call
@@ -476,8 +749,8 @@ class FunctionResolverTest < Test::Unit::TestCase
476
749
  assert_equal '1', value[:value]
477
750
  end
478
751
 
479
- test "cast() integer to decimal" do
480
- f = FunctionResolver.new('cast', [{:type => :decimal, :value => '1'}, {type: :character, :value => 'decimal'}])
752
+ test 'cast() integer to decimal' do
753
+ f = FunctionResolver.new('cast', [{ type: :decimal, value: '1' }, { type: :character, value: 'decimal' }])
481
754
  f.validate
482
755
  assert !f.errors?, "Errors #{f.errors.inspect}"
483
756
  value = f.call
@@ -486,8 +759,8 @@ class FunctionResolverTest < Test::Unit::TestCase
486
759
  assert_equal '1.0', value[:value]
487
760
  end
488
761
 
489
- test "cast() nil to integer" do
490
- f = FunctionResolver.new('cast', [{:type => :null, :value => 'NULL'}, {type: :character, :value => 'integer'}])
762
+ test 'cast() nil to integer' do
763
+ f = FunctionResolver.new('cast', [{ type: :null, value: 'NULL' }, { type: :character, value: 'integer' }])
491
764
  f.validate
492
765
  assert !f.errors?, "Errors #{f.errors.inspect}"
493
766
  value = f.call
@@ -496,8 +769,8 @@ class FunctionResolverTest < Test::Unit::TestCase
496
769
  assert_equal '0', value[:value]
497
770
  end
498
771
 
499
- test "cast() nil to decimal" do
500
- f = FunctionResolver.new('cast', [{:type => :null, :value => 'NULL'}, {type: :character, :value => 'decimal'}])
772
+ test 'cast() nil to decimal' do
773
+ f = FunctionResolver.new('cast', [{ type: :null, value: 'NULL' }, { type: :character, value: 'decimal' }])
501
774
  f.validate
502
775
  assert !f.errors?, "Errors #{f.errors.inspect}"
503
776
  value = f.call
@@ -506,8 +779,9 @@ class FunctionResolverTest < Test::Unit::TestCase
506
779
  assert_equal '0.0', value[:value]
507
780
  end
508
781
 
509
- test "cast() nil to character" do
510
- f = FunctionResolver.new('cast', [{:type => :null, :value => 'NULL'}, {type: :character, :value => 'character'}])
782
+ test 'cast() nil to character' do
783
+ f = FunctionResolver.new('cast',
784
+ [{ type: :null, value: 'NULL' }, { type: :character, value: 'character' }])
511
785
  f.validate
512
786
  assert !f.errors?, "Errors #{f.errors.inspect}"
513
787
  value = f.call
@@ -516,39 +790,43 @@ class FunctionResolverTest < Test::Unit::TestCase
516
790
  assert_equal "''", value[:value]
517
791
  end
518
792
 
519
- test "cast() character to decimal" do
520
- f = FunctionResolver.new('cast', [{:type => :character, :value => "1.1"}, {type: :character, :value => 'decimal'}])
793
+ test 'cast() character to decimal' do
794
+ f = FunctionResolver.new('cast',
795
+ [{ type: :character, value: '1.1' }, { type: :character, value: 'decimal' }])
521
796
  f.validate
522
797
  assert !f.errors?, "Errors #{f.errors.inspect}"
523
798
  value = f.call
524
799
 
525
800
  assert_equal :decimal, value[:type]
526
- assert_equal "1.1", value[:value]
801
+ assert_equal '1.1', value[:value]
527
802
  end
528
803
 
529
- test "cast() character to integer" do
530
- f = FunctionResolver.new('cast', [{:type => :character, :value => "1"}, {type: :character, :value => 'integer'}])
804
+ test 'cast() character to integer' do
805
+ f = FunctionResolver.new('cast',
806
+ [{ type: :character, value: '1' }, { type: :character, value: 'integer' }])
531
807
  f.validate
532
808
  assert !f.errors?, "Errors #{f.errors.inspect}"
533
809
  value = f.call
534
810
 
535
811
  assert_equal :integer, value[:type]
536
- assert_equal "1", value[:value]
812
+ assert_equal '1', value[:value]
537
813
  end
538
814
 
539
- test "cast() Field" do
540
- f = FunctionResolver.new('cast', [{:type => :field, :value => 'Bedrooms'}, {type: :character, :value => 'character'}])
815
+ test 'cast() Field' do
816
+ f = FunctionResolver.new('cast',
817
+ [{ type: :field, value: 'Bedrooms' }, { type: :character, value: 'character' }])
541
818
  f.validate
542
819
  assert !f.errors?, "Errors #{f.errors.inspect}"
543
820
  value = f.call
544
821
 
545
822
  assert_equal :function, value[:type]
546
823
  assert_equal 'cast', value[:value]
547
- assert_equal ['Bedrooms', 'character'], value[:args].map { |v| v[:value]}
824
+ assert_equal(%w[Bedrooms character], value[:args].map{ |v| v[:value] })
548
825
  end
549
826
 
550
- test "invalid cast returns null" do
551
- f = FunctionResolver.new('cast', [{:type => :character, :value => '1.1.1'}, {type: :character, :value => 'integer'}])
827
+ test 'invalid cast returns null' do
828
+ f = FunctionResolver.new('cast',
829
+ [{ type: :character, value: '1.1.1' }, { type: :character, value: 'integer' }])
552
830
  f.validate
553
831
  assert !f.errors?, "Errors #{f.errors.inspect}"
554
832
  value = f.call
@@ -557,14 +835,14 @@ class FunctionResolverTest < Test::Unit::TestCase
557
835
  assert_equal 'NULL', value[:value]
558
836
  end
559
837
 
560
- test "invalid function" do
838
+ test 'invalid function' do
561
839
  f = FunctionResolver.new('then', [])
562
840
  f.validate
563
841
  assert f.errors?, "'then' is not a function"
564
842
  end
565
843
 
566
- test "time(datetime)" do
567
- f = FunctionResolver.new('time', [{:type => :datetime, :value => EXAMPLE_DATE}])
844
+ test 'time(datetime)' do
845
+ f = FunctionResolver.new('time', [{ type: :datetime, value: EXAMPLE_DATE }])
568
846
  f.validate
569
847
  assert !f.errors?, "Errors #{f.errors.inspect}"
570
848
  value = f.call
@@ -572,8 +850,8 @@ class FunctionResolverTest < Test::Unit::TestCase
572
850
  assert_equal '10:22:15.422804000', value[:value]
573
851
  end
574
852
 
575
- test "date(datetime)" do
576
- f = FunctionResolver.new('date', [{:type => :datetime, :value => EXAMPLE_DATE}])
853
+ test 'date(datetime)' do
854
+ f = FunctionResolver.new('date', [{ type: :datetime, value: EXAMPLE_DATE }])
577
855
  f.validate
578
856
  assert !f.errors?, "Errors #{f.errors.inspect}"
579
857
  value = f.call
@@ -581,39 +859,39 @@ class FunctionResolverTest < Test::Unit::TestCase
581
859
  assert_equal '2013-07-26', value[:value]
582
860
  end
583
861
 
584
- ###
585
- # Delayed functions. These functions don't get run immediately and require
586
- # resolution by the backing system
587
- ###
588
-
589
- test "time(field)" do
590
- f = FunctionResolver.new('time', [{:type => :field, :value => "OriginalEntryTimestamp"}])
862
+ ###
863
+ # Delayed functions. These functions don't get run immediately and require
864
+ # resolution by the backing system
865
+ ###
866
+
867
+ test 'time(field)' do
868
+ f = FunctionResolver.new('time', [{ type: :field, value: 'OriginalEntryTimestamp' }])
591
869
  f.validate
592
870
  assert !f.errors?, "Errors #{f.errors.inspect}"
593
871
  value = f.call
594
872
  assert_equal :function, value[:type]
595
873
  assert_equal 'time', value[:value]
596
- assert_equal "OriginalEntryTimestamp", value[:args].first[:value]
874
+ assert_equal 'OriginalEntryTimestamp', value[:args].first[:value]
597
875
  end
598
-
599
- test "date(field)" do
600
- f = FunctionResolver.new('date', [{:type => :field, :value => "OriginalEntryTimestamp"}])
876
+
877
+ test 'date(field)' do
878
+ f = FunctionResolver.new('date', [{ type: :field, value: 'OriginalEntryTimestamp' }])
601
879
  f.validate
602
880
  assert !f.errors?, "Errors #{f.errors.inspect}"
603
881
  value = f.call
604
882
  assert_equal :function, value[:type]
605
883
  assert_equal 'date', value[:value]
606
- assert_equal "OriginalEntryTimestamp", value[:args].first[:value]
884
+ assert_equal 'OriginalEntryTimestamp', value[:args].first[:value]
607
885
  end
608
886
 
609
- test "startswith(), endswith() and contains()" do
610
- [{'startswith' => "^far"},
611
- {'endswith' => "far$"},
612
- {'contains' => "far"}].each do |test_case|
887
+ test 'startswith(), endswith() and contains()' do
888
+ [{ 'startswith' => '^far' },
889
+ { 'endswith' => 'far$' },
890
+ { 'contains' => 'far' }].each do |test_case|
613
891
  function = test_case.keys.first
614
892
  expected_value = test_case[function]
615
893
 
616
- f = FunctionResolver.new(function, [{:type => :character, :value => "far"}])
894
+ f = FunctionResolver.new(function, [{ type: :character, value: 'far' }])
617
895
  f.validate
618
896
  assert !f.errors?, "Errors #{f.errors.inspect}"
619
897
  value = f.call
@@ -626,8 +904,8 @@ class FunctionResolverTest < Test::Unit::TestCase
626
904
 
627
905
  test 'wkt()' do
628
906
  f = FunctionResolver.new('wkt',
629
- [{:type => :character,
630
- :value => "SRID=12345;POLYGON((-127.89734578345 45.234534534,-127.89734578345 45.234534534,-127.89734578345 45.234534534,-127.89734578345 45.234534534))"}])
907
+ [{ type: :character,
908
+ value: 'SRID=12345;POLYGON((-127.89734578345 45.234534534,-127.89734578345 45.234534534,-127.89734578345 45.234534534,-127.89734578345 45.234534534))' }])
631
909
  f.validate
632
910
  assert !f.errors?, "Errors #{f.errors.inspect}"
633
911
  value = f.call
@@ -636,8 +914,8 @@ class FunctionResolverTest < Test::Unit::TestCase
636
914
 
637
915
  test 'wkt() invalid params' do
638
916
  f = FunctionResolver.new('wkt',
639
- [{:type => :character,
640
- :value => "POLYGON((45.234534534))"}])
917
+ [{ type: :character,
918
+ value: 'POLYGON((45.234534534))' }])
641
919
  f.validate
642
920
  f.call
643
921
  assert f.errors?