holidays 7.1.0 → 8.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -1
  3. data/README.md +3 -4
  4. data/doc/CONTRIBUTING.md +2 -1
  5. data/holidays.gemspec +5 -5
  6. data/lib/generated_definitions/MANIFEST +3 -0
  7. data/lib/generated_definitions/REGIONS.rb +2 -2
  8. data/lib/generated_definitions/au.rb +8 -2
  9. data/lib/generated_definitions/ca.rb +14 -13
  10. data/lib/generated_definitions/ch.rb +13 -1
  11. data/lib/generated_definitions/cl.rb +5 -5
  12. data/lib/generated_definitions/de.rb +5 -4
  13. data/lib/generated_definitions/es.rb +4 -2
  14. data/lib/generated_definitions/europe.rb +83 -23
  15. data/lib/generated_definitions/gb.rb +6 -4
  16. data/lib/generated_definitions/hr.rb +8 -6
  17. data/lib/generated_definitions/hu.rb +3 -2
  18. data/lib/generated_definitions/it.rb +14 -5
  19. data/lib/generated_definitions/jp.rb +26 -21
  20. data/lib/generated_definitions/kz.rb +38 -0
  21. data/lib/generated_definitions/lu.rb +2 -0
  22. data/lib/generated_definitions/lv.rb +52 -0
  23. data/lib/generated_definitions/mx.rb +3 -3
  24. data/lib/generated_definitions/ng.rb +33 -0
  25. data/lib/generated_definitions/northamerica.rb +21 -21
  26. data/lib/generated_definitions/ro.rb +5 -2
  27. data/lib/generated_definitions/southamerica.rb +5 -5
  28. data/lib/generated_definitions/tr.rb +5 -3
  29. data/lib/generated_definitions/ua.rb +6 -6
  30. data/lib/generated_definitions/us.rb +5 -6
  31. data/lib/holidays.rb +2 -0
  32. data/lib/holidays/definition/context/generator.rb +20 -34
  33. data/lib/holidays/definition/repository/holidays_by_month.rb +9 -1
  34. data/lib/holidays/finder/context/search.rb +34 -31
  35. data/lib/holidays/finder/rules/year_range.rb +30 -54
  36. data/lib/holidays/version.rb +1 -1
  37. data/test/coverage_report.rb +23 -5
  38. data/test/data/test_custom_year_range_holiday_defs.yaml +6 -10
  39. data/test/data/test_multiple_regions_with_conflicts_region_1.yaml +38 -0
  40. data/test/data/test_multiple_regions_with_conflicts_region_2.yaml +38 -0
  41. data/test/defs/test_defs_ca.rb +27 -5
  42. data/test/defs/test_defs_ch.rb +4 -0
  43. data/test/defs/test_defs_co.rb +3 -3
  44. data/test/defs/test_defs_de.rb +2 -0
  45. data/test/defs/test_defs_es.rb +2 -0
  46. data/test/defs/test_defs_europe.rb +156 -11
  47. data/test/defs/test_defs_federalreservebanks.rb +20 -0
  48. data/test/defs/test_defs_gb.rb +16 -0
  49. data/test/defs/test_defs_hr.rb +6 -6
  50. data/test/defs/test_defs_hu.rb +12 -4
  51. data/test/defs/test_defs_it.rb +20 -0
  52. data/test/defs/test_defs_jp.rb +5 -3
  53. data/test/defs/test_defs_kz.rb +39 -0
  54. data/test/defs/test_defs_lu.rb +6 -0
  55. data/test/defs/test_defs_lv.rb +90 -0
  56. data/test/defs/test_defs_ng.rb +29 -0
  57. data/test/defs/test_defs_northamerica.rb +33 -15
  58. data/test/defs/test_defs_ro.rb +14 -0
  59. data/test/defs/test_defs_southamerica.rb +3 -3
  60. data/test/defs/test_defs_tr.rb +7 -0
  61. data/test/defs/test_defs_us.rb +6 -10
  62. data/test/holidays/core_extensions/test_date.rb +3 -2
  63. data/test/holidays/definition/context/test_generator.rb +5 -18
  64. data/test/holidays/definition/repository/test_holidays_by_month.rb +121 -1
  65. data/test/holidays/finder/rules/test_year_range.rb +43 -47
  66. data/test/integration/test_available_regions.rb +1 -1
  67. data/test/integration/test_custom_year_range_holidays.rb +0 -7
  68. data/test/integration/test_holidays.rb +1 -23
  69. data/test/integration/test_holidays_between.rb +10 -0
  70. data/test/integration/test_multiple_regions_with_conflict.rb +29 -0
  71. metadata +28 -14
@@ -7,6 +7,12 @@ require File.expand_path(File.dirname(__FILE__)) + '/../test_helper'
7
7
  class RoDefinitionTests < Test::Unit::TestCase # :nodoc:
8
8
 
9
9
  def test_ro
10
+ assert_nil (Holidays.on(Date.civil(2017, 4, 14), [:ro])[0] || {})[:name]
11
+
12
+ assert_equal "Paștele - Vinerea Mare", (Holidays.on(Date.civil(2018, 4, 6), [:ro], [:informal])[0] || {})[:name]
13
+
14
+ assert_equal "Paștele - Vinerea Mare", (Holidays.on(Date.civil(2019, 4, 26), [:ro], [:informal])[0] || {})[:name]
15
+
10
16
  assert_equal "Paștele - duminică", (Holidays.on(Date.civil(1961, 4, 9), [:ro], [:informal])[0] || {})[:name]
11
17
 
12
18
  assert_equal "Paștele - luni", (Holidays.on(Date.civil(1961, 4, 10), [:ro], [:informal])[0] || {})[:name]
@@ -33,8 +39,16 @@ class RoDefinitionTests < Test::Unit::TestCase # :nodoc:
33
39
 
34
40
  assert_equal "Anul nou", (Holidays.on(Date.civil(2014, 1, 2), [:ro], [:informal])[0] || {})[:name]
35
41
 
42
+ assert_equal "Unirea Principatelor Române", (Holidays.on(Date.civil(2017, 1, 24), [:ro], [:informal])[0] || {})[:name]
43
+
44
+ assert_nil (Holidays.on(Date.civil(2016, 1, 24), [:ro])[0] || {})[:name]
45
+
36
46
  assert_equal "Ziua muncii", (Holidays.on(Date.civil(2009, 5, 1), [:ro], [:informal])[0] || {})[:name]
37
47
 
48
+ assert_equal "Ziua Copilului", (Holidays.on(Date.civil(2017, 6, 1), [:ro], [:informal])[0] || {})[:name]
49
+
50
+ assert_nil (Holidays.on(Date.civil(2016, 6, 1), [:ro])[0] || {})[:name]
51
+
38
52
  assert_equal "Adormirea Maicii Domnului", (Holidays.on(Date.civil(2012, 8, 15), [:ro], [:informal])[0] || {})[:name]
39
53
 
40
54
  assert_equal "Sfântul Apostol Andrei", (Holidays.on(Date.civil(2013, 11, 30), [:ro], [:informal])[0] || {})[:name]
@@ -179,11 +179,11 @@ class SouthamericaDefinitionTests < Test::Unit::TestCase # :nodoc:
179
179
 
180
180
  assert_equal "Día de la Ascensión", (Holidays.on(Date.civil(2017, 5, 29), [:co])[0] || {})[:name]
181
181
 
182
- assert_equal "Corpus Christi", (Holidays.on(Date.civil(2014, 6, 19), [:co])[0] || {})[:name]
182
+ assert_equal "Corpus Christi", (Holidays.on(Date.civil(2014, 6, 23), [:co])[0] || {})[:name]
183
183
 
184
- assert_equal "Corpus Christi", (Holidays.on(Date.civil(2016, 5, 26), [:co])[0] || {})[:name]
184
+ assert_equal "Corpus Christi", (Holidays.on(Date.civil(2016, 5, 30), [:co])[0] || {})[:name]
185
185
 
186
- assert_equal "Corpus Christi", (Holidays.on(Date.civil(2017, 6, 15), [:co])[0] || {})[:name]
186
+ assert_equal "Corpus Christi", (Holidays.on(Date.civil(2017, 6, 19), [:co])[0] || {})[:name]
187
187
 
188
188
  assert_equal "Sagrado Corazón", (Holidays.on(Date.civil(2014, 6, 30), [:co])[0] || {})[:name]
189
189
 
@@ -22,32 +22,39 @@ class TrDefinitionTests < Test::Unit::TestCase # :nodoc:
22
22
  assert_equal "Ramazan Bayramı", (Holidays.on(Date.civil(2017, 6, 25), [:tr])[0] || {})[:name]
23
23
  assert_equal "Ramazan Bayramı", (Holidays.on(Date.civil(2018, 6, 15), [:tr])[0] || {})[:name]
24
24
  assert_equal "Ramazan Bayramı", (Holidays.on(Date.civil(2019, 6, 4), [:tr])[0] || {})[:name]
25
+ assert_equal "Ramazan Bayramı", (Holidays.on(Date.civil(2020, 5, 24), [:tr])[0] || {})[:name]
25
26
 
26
27
  assert_equal "Ramazan Bayramı (ikinci tatil)", (Holidays.on(Date.civil(2017, 6, 26), [:tr])[0] || {})[:name]
27
28
  assert_equal "Ramazan Bayramı (ikinci tatil)", (Holidays.on(Date.civil(2018, 6, 16), [:tr])[0] || {})[:name]
28
29
  assert_equal "Ramazan Bayramı (ikinci tatil)", (Holidays.on(Date.civil(2019, 6, 5), [:tr])[0] || {})[:name]
30
+ assert_equal "Ramazan Bayramı (ikinci tatil)", (Holidays.on(Date.civil(2020, 5, 25), [:tr])[0] || {})[:name]
29
31
 
30
32
  assert_equal "Ramazan Bayramı (üçüncü tatil)", (Holidays.on(Date.civil(2017, 6, 27), [:tr])[0] || {})[:name]
31
33
  assert_equal "Ramazan Bayramı (üçüncü tatil)", (Holidays.on(Date.civil(2018, 6, 17), [:tr])[0] || {})[:name]
32
34
  assert_equal "Ramazan Bayramı (üçüncü tatil)", (Holidays.on(Date.civil(2019, 6, 6), [:tr])[0] || {})[:name]
35
+ assert_equal "Ramazan Bayramı (üçüncü tatil)", (Holidays.on(Date.civil(2020, 5, 26), [:tr])[0] || {})[:name]
33
36
 
34
37
  assert_equal "Demokrasi ve Milli Birlik Günü", (Holidays.on(Date.civil(2017, 7, 15), [:tr])[0] || {})[:name]
35
38
 
36
39
  assert_equal "Kurban Bayramı", (Holidays.on(Date.civil(2017, 9, 1), [:tr])[0] || {})[:name]
37
40
  assert_equal "Kurban Bayramı", (Holidays.on(Date.civil(2018, 8, 21), [:tr])[0] || {})[:name]
38
41
  assert_equal "Kurban Bayramı", (Holidays.on(Date.civil(2019, 8, 11), [:tr])[0] || {})[:name]
42
+ assert_equal "Kurban Bayramı", (Holidays.on(Date.civil(2020, 7, 31), [:tr])[0] || {})[:name]
39
43
 
40
44
  assert_equal "Kurban Bayramı (ikinci tatil)", (Holidays.on(Date.civil(2017, 9, 2), [:tr])[0] || {})[:name]
41
45
  assert_equal "Kurban Bayramı (ikinci tatil)", (Holidays.on(Date.civil(2018, 8, 22), [:tr])[0] || {})[:name]
42
46
  assert_equal "Kurban Bayramı (ikinci tatil)", (Holidays.on(Date.civil(2019, 8, 12), [:tr])[0] || {})[:name]
47
+ assert_equal "Kurban Bayramı (ikinci tatil)", (Holidays.on(Date.civil(2020, 8, 1), [:tr])[0] || {})[:name]
43
48
 
44
49
  assert_equal "Kurban Bayramı (üçüncü tatil)", (Holidays.on(Date.civil(2017, 9, 3), [:tr])[0] || {})[:name]
45
50
  assert_equal "Kurban Bayramı (üçüncü tatil)", (Holidays.on(Date.civil(2018, 8, 23), [:tr])[0] || {})[:name]
46
51
  assert_equal "Kurban Bayramı (üçüncü tatil)", (Holidays.on(Date.civil(2019, 8, 13), [:tr])[0] || {})[:name]
52
+ assert_equal "Kurban Bayramı (üçüncü tatil)", (Holidays.on(Date.civil(2020, 8, 2), [:tr])[0] || {})[:name]
47
53
 
48
54
  assert_equal "Kurban Bayramı (dördüncü tatil)", (Holidays.on(Date.civil(2017, 9, 4), [:tr])[0] || {})[:name]
49
55
  assert_equal "Kurban Bayramı (dördüncü tatil)", (Holidays.on(Date.civil(2018, 8, 24), [:tr])[0] || {})[:name]
50
56
  assert_equal "Kurban Bayramı (dördüncü tatil)", (Holidays.on(Date.civil(2019, 8, 14), [:tr])[0] || {})[:name]
57
+ assert_equal "Kurban Bayramı (dördüncü tatil)", (Holidays.on(Date.civil(2020, 8, 3), [:tr])[0] || {})[:name]
51
58
 
52
59
  end
53
60
  end
@@ -87,10 +87,6 @@ assert_equal "Presidents' Day", (Holidays.on(Date.civil(2018, 2, 19), [:us])[0]
87
87
  assert_nil (Holidays.on(Date.civil(2018, 3, 5), [:us])[0] || {})[:name]
88
88
  assert_nil (Holidays.on(Date.civil(2019, 3, 4), [:us])[0] || {})[:name]
89
89
 
90
- assert_equal "Casimir Pulaski Day", (Holidays.on(Date.civil(2017, 3, 6), [:us_il])[0] || {})[:name]
91
- assert_equal "Casimir Pulaski Day", (Holidays.on(Date.civil(2018, 3, 5), [:us_il])[0] || {})[:name]
92
- assert_equal "Casimir Pulaski Day", (Holidays.on(Date.civil(2019, 3, 4), [:us_il])[0] || {})[:name]
93
-
94
90
  assert_nil (Holidays.on(Date.civil(2017, 3, 7), [:us])[0] || {})[:name]
95
91
  assert_nil (Holidays.on(Date.civil(2018, 3, 6), [:us])[0] || {})[:name]
96
92
  assert_nil (Holidays.on(Date.civil(2019, 3, 5), [:us])[0] || {})[:name]
@@ -127,7 +123,7 @@ assert_equal "Seward's Day", (Holidays.on(Date.civil(2019, 3, 25), [:us_ak])[0]
127
123
  assert_equal "Emancipation Day", (Holidays.on(Date.civil(2022, 4, 15), [:us_dc, :us_ca], [:observed])[0] || {})[:name]
128
124
  assert_equal "Emancipation Day", (Holidays.on(Date.civil(2028, 4, 17), [:us_dc, :us_ca], [:observed])[0] || {})[:name]
129
125
 
130
- assert_equal "Emancipation Day", (Holidays.on(Date.civil(2017, 4, 16), [:us_dc, :us_ca])[0] || {})[:name]
126
+ assert_equal "Emancipation Day", (Holidays.on(Date.civil(2017, 4, 16), [:us_dc])[0] || {})[:name]
131
127
 
132
128
  assert_nil (Holidays.on(Date.civil(2017, 4, 17), [:us])[0] || {})[:name]
133
129
  assert_nil (Holidays.on(Date.civil(2018, 4, 16), [:us])[0] || {})[:name]
@@ -303,9 +299,9 @@ assert_equal "Nevada Day", (Holidays.on(Date.civil(2019, 10, 25), [:us_nv])[0] |
303
299
  assert_nil (Holidays.on(Date.civil(2018, 11, 6), [:us])[0] || {})[:name]
304
300
  assert_nil (Holidays.on(Date.civil(2021, 11, 2), [:us])[0] || {})[:name]
305
301
 
306
- assert_equal "Election Day", (Holidays.on(Date.civil(2017, 11, 7), [:us_de, :us_hi, :us_il, :us_in, :us_mt, :us_nj, :us_ny, :us_pa, :us_ri])[0] || {})[:name]
307
- assert_equal "Election Day", (Holidays.on(Date.civil(2018, 11, 6), [:us_de, :us_hi, :us_il, :us_in, :us_mt, :us_nj, :us_ny, :us_pa, :us_ri])[0] || {})[:name]
308
- assert_equal "Election Day", (Holidays.on(Date.civil(2021, 11, 2), [:us_de, :us_hi, :us_il, :us_in, :us_mt, :us_nj, :us_ny, :us_pa, :us_ri])[0] || {})[:name]
302
+ assert_equal "Election Day", (Holidays.on(Date.civil(2017, 11, 7), [:us_de, :us_hi, :us_in, :us_mt, :us_nj, :us_ny, :us_pa, :us_ri])[0] || {})[:name]
303
+ assert_equal "Election Day", (Holidays.on(Date.civil(2018, 11, 6), [:us_de, :us_hi, :us_in, :us_mt, :us_nj, :us_ny, :us_pa, :us_ri])[0] || {})[:name]
304
+ assert_equal "Election Day", (Holidays.on(Date.civil(2021, 11, 2), [:us_de, :us_hi, :us_in, :us_mt, :us_nj, :us_ny, :us_pa, :us_ri])[0] || {})[:name]
309
305
 
310
306
  assert_equal "Veterans Day", (Holidays.on(Date.civil(2017, 11, 10), [:us], [:observed])[0] || {})[:name]
311
307
  assert_equal "Veterans Day", (Holidays.on(Date.civil(2018, 11, 12), [:us], [:observed])[0] || {})[:name]
@@ -355,9 +351,9 @@ assert_equal "Christmas Eve (Holiday)", (Holidays.on(Date.civil(2028, 12, 22), [
355
351
  assert_nil (Holidays.on(Date.civil(2022, 12, 26), [:us])[0] || {})[:name]
356
352
  assert_nil (Holidays.on(Date.civil(2027, 12, 27), [:us])[0] || {})[:name]
357
353
 
358
- assert_equal "Christmas Day", (Holidays.on(Date.civil(2021, 12, 27), [:us], [:observed])[0] || {})[:name]
354
+ assert_equal "Christmas Day", (Holidays.on(Date.civil(2021, 12, 24), [:us], [:observed])[0] || {})[:name]
359
355
  assert_equal "Christmas Day", (Holidays.on(Date.civil(2022, 12, 26), [:us], [:observed])[0] || {})[:name]
360
- assert_equal "Christmas Day", (Holidays.on(Date.civil(2027, 12, 27), [:us], [:observed])[0] || {})[:name]
356
+ assert_equal "Christmas Day", (Holidays.on(Date.civil(2027, 12, 24), [:us], [:observed])[0] || {})[:name]
361
357
 
362
358
  assert_equal "Christmas Day", (Holidays.on(Date.civil(2017, 12, 25), [:us])[0] || {})[:name]
363
359
 
@@ -1,5 +1,6 @@
1
1
  require File.expand_path(File.dirname(__FILE__)) + '/../../test_helper'
2
2
 
3
+ require 'date'
3
4
  require 'holidays/core_extensions/date'
4
5
 
5
6
  class Date
@@ -114,8 +115,8 @@ class CoreExtensionDateTests < Test::Unit::TestCase
114
115
 
115
116
  def test_datetime_holiday?
116
117
  # in situations with activesupport
117
- assert DateTime.now.to_date.holiday?('test') if DateTime.now.respond_to?(:to_date)
118
- assert DateTime.now.holiday?('test')
118
+ assert DateTime.civil(2008, 1, 1).to_date.holiday?('ca')
119
+ assert DateTime.civil(2008, 1, 1).holiday?('ca')
119
120
  end
120
121
 
121
122
  end
@@ -143,31 +143,25 @@ class GeneratorTests < Test::Unit::TestCase
143
143
  :name => "after_year",
144
144
  :regions => [:custom_year_range_file],
145
145
  :mday => 1,
146
- :year_ranges => [{"after" => 2016}]
146
+ :year_ranges => {:from => 2016}
147
147
  },
148
148
  {
149
149
  :name => "before_year",
150
150
  :regions => [:custom_year_range_file],
151
151
  :mday => 2,
152
- :year_ranges => [{"before" => 2017}]
152
+ :year_ranges => {:until => 2017}
153
153
  },
154
154
  {
155
155
  :name => "between_year",
156
156
  :regions => [:custom_year_range_file],
157
157
  :mday => 3,
158
- :year_ranges => [{"between" => 2016..2018}]
158
+ :year_ranges => {:between => 2016..2018 }
159
159
  },
160
160
  {
161
161
  :name => "limited_year",
162
162
  :regions => [:custom_year_range_file],
163
163
  :mday => 4,
164
- :year_ranges => [{"limited" => [2016,2018,2019]}]
165
- },
166
- {
167
- :name => "multiple_conditions",
168
- :regions => [:custom_year_range_file],
169
- :mday => 5,
170
- :year_ranges => [{"before" => 2015}, {"after" => 2017}]
164
+ :year_ranges => {:limited => [2016,2018,2019]}
171
165
  }
172
166
  ]
173
167
  }
@@ -183,7 +177,7 @@ class GeneratorTests < Test::Unit::TestCase
183
177
 
184
178
  @test_source_generator.expects(:call).with('test', ['test/data/test_custom_year_range_holiday_defs.yaml'], ['parsed tests']).returns('test source')
185
179
 
186
- @module_source_generator.expects(:call).with("test", ["test/data/test_custom_year_range_holiday_defs.yaml"], [:custom_year_range_file], [" 6 => [{:mday => 1, :year_ranges => [{:after => 2016}],:name => \"after_year\", :regions => [:custom_year_range_file]},\n {:mday => 2, :year_ranges => [{:before => 2017}],:name => \"before_year\", :regions => [:custom_year_range_file]},\n {:mday => 3, :year_ranges => [{:between => 2016..2018}],:name => \"between_year\", :regions => [:custom_year_range_file]},\n {:mday => 4, :year_ranges => [{:limited => [2016, 2018, 2019]}],:name => \"limited_year\", :regions => [:custom_year_range_file]},\n {:mday => 5, :year_ranges => [{:before => 2015},{:after => 2017}],:name => \"multiple_conditions\", :regions => [:custom_year_range_file]}]"], "").returns('module_source')
180
+ @module_source_generator.expects(:call).with("test", ["test/data/test_custom_year_range_holiday_defs.yaml"], [:custom_year_range_file], [" 6 => [{:mday => 1, :year_ranges => { :from => 2016 },:name => \"after_year\", :regions => [:custom_year_range_file]},\n {:mday => 2, :year_ranges => { :until => 2017 },:name => \"before_year\", :regions => [:custom_year_range_file]},\n {:mday => 3, :year_ranges => { :between => 2016..2018 },:name => \"between_year\", :regions => [:custom_year_range_file]},\n {:mday => 4, :year_ranges => { :limited => [2016, 2018, 2019] },:name => \"limited_year\", :regions => [:custom_year_range_file]}]"], "").returns('module_source')
187
181
 
188
182
  regions, rules_by_month, custom_methods, tests = @generator.parse_definition_files(files)
189
183
  module_src = @generator.generate_definition_source("test", files, regions, rules_by_month, custom_methods, tests)[0]
@@ -229,11 +223,4 @@ class GeneratorTests < Test::Unit::TestCase
229
223
 
230
224
  assert_equal 'test source', test_src
231
225
  end
232
-
233
- #TODO Missing test scenarios. Adding here so I don't forget when I split this
234
- # apart into smaller components.
235
- #
236
- # 1) If a year_range contains empty entries then we should blow up.
237
- # 2) If year_range contains invalid (i.e. too many types per entry) then
238
- # we should blow up
239
226
  end
@@ -109,7 +109,7 @@ class HolidaysByMonthRepoTests < Test::Unit::TestCase
109
109
  assert_equal(expected, @subject.all)
110
110
  end
111
111
 
112
- def test_add_is_successful_and_updates_regions_to_existing_matching_definitions
112
+ def test_add_is_successful_if_only_region_is_different_and_updates_regions_to_existing_matching_definitions
113
113
  target_holidays = {0 => [:mday => 1, :name => "Test", :regions => [:test2]]}
114
114
 
115
115
  @subject.add(@existing_holidays_by_month)
@@ -152,4 +152,124 @@ class HolidaysByMonthRepoTests < Test::Unit::TestCase
152
152
  @subject.find_by_month(-1)
153
153
  end
154
154
  end
155
+
156
+ def test_add_is_successful_if_only_function_is_different
157
+ initial_holidays = {0=> [{:mday => 1, :name=>"Test", :regions=>[:test], :function=>"easter(year)", :function_arguments=>[:year]}]}
158
+
159
+ @subject.add(initial_holidays)
160
+
161
+ second_holidays = {0=> [{:mday => 1, :name=>"Test", :regions=>[:test2], :function=>"orthodox_easter(year)", :function_arguments=>[:year]}]}
162
+ @subject.add(second_holidays)
163
+
164
+ expected = {
165
+ 0 => [
166
+ {
167
+ :function=>"easter(year)",
168
+ :function_arguments=>[:year],
169
+ :mday=>1,
170
+ :name=>"Test",
171
+ :regions=>[:test]
172
+ },
173
+ {
174
+ :function=>"orthodox_easter(year)",
175
+ :function_arguments=>[:year],
176
+ :mday=>1,
177
+ :name=>"Test",
178
+ :regions=>[:test2]
179
+ }
180
+ ]
181
+ }
182
+
183
+ assert_equal(expected, @subject.all)
184
+ end
185
+
186
+ def test_add_is_successful_if_only_function_modifier_is_different
187
+ initial_holidays = {0=> [{:mday => 1, :name=>"Test", :regions=>[:test], :function=>"easter(year)", :function_modifier=>1, :function_arguments=>[:year]}]}
188
+
189
+ @subject.add(initial_holidays)
190
+
191
+ second_holidays = {0=> [{:mday => 1, :name=>"Test", :regions=>[:test2], :function=>"easter(year)", :function_modifier=>2, :function_arguments=>[:year]}]}
192
+ @subject.add(second_holidays)
193
+
194
+ expected = {
195
+ 0 => [
196
+ {
197
+ :function=>"easter(year)",
198
+ :function_arguments=>[:year],
199
+ :function_modifier=>1,
200
+ :mday=>1,
201
+ :name=>"Test",
202
+ :regions=>[:test]
203
+ },
204
+ {
205
+ :function=>"easter(year)",
206
+ :function_arguments=>[:year],
207
+ :function_modifier=>2,
208
+ :mday=>1,
209
+ :name=>"Test",
210
+ :regions=>[:test2]
211
+ }
212
+ ]
213
+ }
214
+
215
+ assert_equal(expected, @subject.all)
216
+ end
217
+
218
+ def test_add_is_successful_if_only_observed_is_different
219
+ initial_holidays = {0=> [{:mday => 1, :name=>"Test", :regions=>[:test], :observed=>"to_weekday_if_weekend(year)", :function_arguments=>[:year]}]}
220
+
221
+ @subject.add(initial_holidays)
222
+
223
+ second_holidays = {0=> [{:mday => 1, :name=>"Test", :regions=>[:test2], :observed =>"to_friday_if_saturday(year)", :function_arguments=>[:year]}]}
224
+ @subject.add(second_holidays)
225
+
226
+ expected = {
227
+ 0 => [
228
+ {
229
+ :observed =>"to_weekday_if_weekend(year)",
230
+ :function_arguments=>[:year],
231
+ :mday=>1,
232
+ :name=>"Test",
233
+ :regions=>[:test]
234
+ },
235
+ {
236
+ :observed =>"to_friday_if_saturday(year)",
237
+ :function_arguments=>[:year],
238
+ :mday=>1,
239
+ :name=>"Test",
240
+ :regions=>[:test2]
241
+ }
242
+ ]
243
+ }
244
+
245
+ assert_equal(expected, @subject.all)
246
+ end
247
+
248
+ def test_add_is_successful_if_only_year_ranges_is_different
249
+ initial_holidays = {0=> [{:mday => 1, :name=>"Test", :regions=>[:test], :year_ranges => {:from => 1990}}]}
250
+
251
+ @subject.add(initial_holidays)
252
+
253
+ second_holidays = {0=> [{:mday => 1, :name=>"Test", :regions=>[:test2], :year_ranges => {:until => 2002}}]}
254
+ @subject.add(second_holidays)
255
+
256
+ expected = {
257
+ 0 => [
258
+ {
259
+ :mday=>1,
260
+ :name=>"Test",
261
+ :regions=>[:test],
262
+ :year_ranges => {:from => 1990}
263
+ },
264
+ {
265
+ :mday=>1,
266
+ :name=>"Test",
267
+ :regions=>[:test2],
268
+ :year_ranges => {:until => 2002}
269
+ }
270
+ ]
271
+ }
272
+
273
+ assert_equal(expected, @subject.all)
274
+ end
155
275
  end
@@ -5,7 +5,7 @@ require 'holidays/finder/rules/year_range'
5
5
  class FinderRulesYearRangeTests < Test::Unit::TestCase
6
6
  def setup
7
7
  @year = 2015
8
- @year_ranges = [{between: 1996..2002}]
8
+ @year_ranges = {between: 1996..2002}
9
9
  @subject = Holidays::Finder::Rules::YearRange
10
10
  end
11
11
 
@@ -29,13 +29,13 @@ class FinderRulesYearRangeTests < Test::Unit::TestCase
29
29
  end
30
30
 
31
31
  def test_returns_error_if_year_ranges_contains_only_non_hash
32
- @year_ranges = [:test]
32
+ @year_ranges = :test
33
33
  assert_raises ArgumentError do
34
34
  @subject.call(@year, @year_ranges)
35
35
  end
36
36
  end
37
37
 
38
- def test_returns_error_if_year_ranges_contains_only_empty_hashes
38
+ def test_returns_error_if_year_ranges_is_empty
39
39
  @year_ranges = [{}, {}]
40
40
  assert_raises ArgumentError do
41
41
  @subject.call(@year, @year_ranges)
@@ -43,128 +43,124 @@ class FinderRulesYearRangeTests < Test::Unit::TestCase
43
43
  end
44
44
 
45
45
  def test_returns_error_if_year_range_contains_a_hash_with_multiple_entries
46
- @year_ranges = [{:between => 1996..2002, :after => 2002}]
46
+ @year_ranges = {:between => 1996..2002, :after => 2002}
47
47
  assert_raises ArgumentError do
48
48
  @subject.call(@year, @year_ranges)
49
49
  end
50
50
  end
51
51
 
52
52
  def test_returns_error_if_year_range_contains_unrecognized_operator
53
- @year_ranges = [{:what => 2002}]
53
+ @year_ranges = {:what => 2002}
54
54
  assert_raises ArgumentError do
55
55
  @subject.call(@year, @year_ranges)
56
56
  end
57
57
  end
58
58
 
59
- def test_returns_error_if_before_operator_and_value_is_not_a_number
60
- @year_ranges = [{before: "bad"}]
59
+ def test_returns_error_if_until_operator_and_value_is_not_a_number
60
+ @year_ranges = {until: "bad"}
61
61
  assert_raises ArgumentError do
62
62
  @subject.call(@year, @year_ranges)
63
63
  end
64
64
  end
65
65
 
66
- def test_returns_true_if_before_operator_and_target_is_before
67
- @year_ranges = [{before: 2000}]
66
+ def test_returns_true_if_until_operator_and_target_is_until
67
+ @year_ranges = {until: 2000}
68
68
  assert_equal(true, @subject.call(1999, @year_ranges))
69
69
  end
70
70
 
71
- def test_returns_true_if_before_operator_and_target_is_equal
72
- @year_ranges = [{before: 2000}]
71
+ def test_returns_true_if_until_operator_and_target_is_equal
72
+ @year_ranges = {until: 2000}
73
73
  assert_equal(true, @subject.call(2000, @year_ranges))
74
74
  end
75
75
 
76
- def test_returns_false_if_before_operator_and_target_is_after
77
- @year_ranges = [{before: 2000}]
76
+ def test_returns_false_if_until_operator_and_target_is_after
77
+ @year_ranges = {until: 2000}
78
78
  assert_equal(false, @subject.call(2001, @year_ranges))
79
79
  end
80
80
 
81
- def test_returns_error_if_after_operator_with_bad_value
82
- @year_ranges = [{after: "bad"}]
81
+ def test_returns_error_if_from_operator_with_bad_value
82
+ @year_ranges = {from: "bad"}
83
83
  assert_raises ArgumentError do
84
84
  @subject.call(@year, @year_ranges)
85
85
  end
86
86
  end
87
87
 
88
- def test_returns_false_if_after_operator_and_target_is_before
89
- @year_ranges = [{after: 2000}]
88
+ def test_returns_false_if_from_operator_and_target_is_before
89
+ @year_ranges = {from: 2000}
90
90
  assert_equal(false, @subject.call(1999, @year_ranges))
91
91
  end
92
92
 
93
- def test_returns_true_if_after_operator_and_target_is_equal
94
- @year_ranges = [{after: 2000}]
93
+ def test_returns_true_if_from_operator_and_target_is_equal
94
+ @year_ranges = {from: 2000}
95
95
  assert_equal(true, @subject.call(2000, @year_ranges))
96
96
  end
97
97
 
98
- def test_returns_true_if_after_operator_and_target_is_after
99
- @year_ranges = [{after: 2000}]
98
+ def test_returns_true_if_from_operator_and_target_is_after
99
+ @year_ranges = {from: 2000}
100
100
  assert_equal(true, @subject.call(2001, @year_ranges))
101
101
  end
102
102
 
103
103
  def test_returns_error_if_limited_operator_and_bad_value
104
- @year_ranges = [{limited: "bad"}]
104
+ @year_ranges = {limited: "bad"}
105
+ assert_raises ArgumentError do
106
+ @subject.call(@year, @year_ranges)
107
+ end
108
+ end
109
+
110
+ def test_returns_error_if_limited_operator_with_empty_array
111
+ @year_ranges = {limited: []}
112
+ assert_raises ArgumentError do
113
+ @subject.call(@year, @year_ranges)
114
+ end
115
+ end
116
+
117
+ def test_returns_error_if_limited_operator_with_array_containing_non_integer_value
118
+ @year_ranges = {limited: ["bad"]}
105
119
  assert_raises ArgumentError do
106
120
  @subject.call(@year, @year_ranges)
107
121
  end
108
122
  end
109
123
 
110
124
  def test_returns_true_if_limited_operator_and_value_is_number_that_matches_target
111
- @year_ranges = [{limited: 2002}]
125
+ @year_ranges = {limited: [2002]}
112
126
  assert_equal(true, @subject.call(2002, @year_ranges))
113
127
  end
114
128
 
115
129
  def test_returns_false_if_limited_operator_and_target_is_not_included
116
- @year_ranges = [{limited: [1998,2000]}]
130
+ @year_ranges = {limited: [1998,2000]}
117
131
  assert_equal(false, @subject.call(1997, @year_ranges))
118
132
  assert_equal(false, @subject.call(1999, @year_ranges))
119
133
  assert_equal(false, @subject.call(2002, @year_ranges))
120
134
  end
121
135
 
122
136
  def test_returns_true_if_limited_operator_and_target_is_included
123
- @year_ranges = [{limited: [1998, 2000, 2002]}]
137
+ @year_ranges = {limited: [1998, 2000, 2002]}
124
138
  assert_equal(true, @subject.call(1998, @year_ranges))
125
139
  assert_equal(true, @subject.call(2000, @year_ranges))
126
140
  assert_equal(true, @subject.call(2002, @year_ranges))
127
141
  end
128
142
 
129
143
  def test_returns_error_if_between_operator_and_value_not_a_range
130
- @year_ranges = [{between: 2000}]
144
+ @year_ranges = {between: 2000}
131
145
  assert_raises ArgumentError do
132
146
  @subject.call(2003, @year_ranges)
133
147
  end
134
148
  end
135
149
 
136
150
  def test_returns_false_if_between_operator_and_target_is_before
137
- @year_ranges = [{between: 1998..2002}]
151
+ @year_ranges = {between: 1998..2002}
138
152
  assert_equal(false, @subject.call(1997, @year_ranges))
139
153
  end
140
154
 
141
155
  def test_returns_true_if_between_operator_and_target_is_covered
142
- @year_ranges = [{between: 1998..2002}]
156
+ @year_ranges = {between: 1998..2002}
143
157
  assert_equal(true, @subject.call(1998, @year_ranges))
144
158
  assert_equal(true, @subject.call(2000, @year_ranges))
145
159
  assert_equal(true, @subject.call(2002, @year_ranges))
146
160
  end
147
161
 
148
162
  def test_returns_false_if_between_operator_and_target_is_after
149
- @year_ranges = [{between: 1998..2002}]
163
+ @year_ranges = {between: 1998..2002}
150
164
  assert_equal(false, @subject.call(2003, @year_ranges))
151
165
  end
152
-
153
- def test_returns_false_multiple_nonmatching_operators
154
- @year_ranges = [{between: 1998..2002}, {:after => 2005}]
155
- assert_equal(false, @subject.call(2003, @year_ranges))
156
-
157
- @year_ranges = [{before: 1995}, {:limited => [1990, 1991, 1992]}]
158
- assert_equal(false, @subject.call(1996, @year_ranges))
159
- end
160
-
161
- def test_returns_true_multiple_operators_all_matching
162
- @year_ranges = [{between: 1998..2002}, {:limited=> [2000, 2001]}]
163
- assert_equal(true, @subject.call(2001, @year_ranges))
164
- end
165
-
166
- def test_returns_true_if_multiple_operators_and_only_one_matches
167
- @year_ranges = [{before: 2015}, {:after=> 2017}]
168
- assert_equal(true, @subject.call(2001, @year_ranges))
169
- end
170
166
  end