holidays 7.1.0 → 8.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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