holidays 2.2.0 → 3.0.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -0
- data/README.md +22 -8
- data/Rakefile +26 -8
- data/bin/console +7 -0
- data/bin/setup +5 -0
- data/{data → definitions}/SYNTAX.rdoc +0 -0
- data/{data → definitions}/ar.yaml +0 -0
- data/{data → definitions}/at.yaml +1 -1
- data/{data → definitions}/au.yaml +80 -51
- data/{data → definitions}/be.yaml +0 -0
- data/{data → definitions}/br.yaml +0 -0
- data/{data → definitions}/ca.yaml +0 -0
- data/{data → definitions}/ch.yaml +0 -0
- data/{data → definitions}/cl.yaml +0 -0
- data/{data → definitions}/cr.yaml +0 -0
- data/{data → definitions}/cz.yaml +0 -0
- data/{data → definitions}/de.yaml +25 -34
- data/{data → definitions}/dk.yaml +0 -0
- data/{data → definitions}/ecb_target.yaml +2 -2
- data/{data → definitions}/el.yaml +0 -0
- data/{data → definitions}/es.yaml +37 -26
- data/{data → definitions}/federal_reserve.yaml +0 -0
- data/{data → definitions}/fedex.yaml +9 -3
- data/{data → definitions}/fi.yaml +0 -0
- data/{data → definitions}/fr.yaml +0 -0
- data/{data → definitions}/gb.yaml +19 -19
- data/{data → definitions}/hr.yaml +0 -0
- data/{data → definitions}/hu.yaml +1 -1
- data/{data → definitions}/ie.yaml +0 -0
- data/{data → definitions}/index.yaml +0 -0
- data/{data → definitions}/is.yaml +0 -0
- data/{data → definitions}/it.yaml +0 -0
- data/{data → definitions}/jp.yaml +3 -3
- data/{data → definitions}/li.yaml +3 -3
- data/{data → definitions}/lt.yaml +0 -0
- data/{data → definitions}/ma.yaml +0 -0
- data/{data → definitions}/mx.yaml +0 -0
- data/{data → definitions}/nerc.yaml +0 -0
- data/{data → definitions}/nl.yaml +0 -0
- data/{data → definitions}/no.yaml +0 -0
- data/{data → definitions}/north_america_informal.yaml +0 -0
- data/{data → definitions}/nyse.yaml +0 -0
- data/{data → definitions}/nz.yaml +21 -10
- data/{data → definitions}/ph.yaml +0 -0
- data/{data → definitions}/pl.yaml +0 -0
- data/{data → definitions}/pt.yaml +0 -0
- data/{data → definitions}/ro.yaml +1 -2
- data/{data → definitions}/se.yaml +0 -0
- data/{data → definitions}/sg.yaml +0 -0
- data/{data → definitions}/si.yaml +6 -6
- data/{data → definitions}/sk.yaml +0 -0
- data/{data → definitions}/united_nations.yaml +0 -0
- data/{data → definitions}/ups.yaml +17 -11
- data/{data → definitions}/us.yaml +20 -15
- data/{data → definitions}/ve.yaml +0 -0
- data/{data → definitions}/vi.yaml +0 -0
- data/{data → definitions}/za.yaml +0 -0
- data/holidays.gemspec +2 -1
- data/lib/generated_definitions/MANIFEST +56 -0
- data/lib/generated_definitions/REGIONS.rb +4 -0
- data/lib/{holidays → generated_definitions}/ar.rb +2 -2
- data/lib/{holidays → generated_definitions}/at.rb +2 -2
- data/lib/{holidays → generated_definitions}/au.rb +19 -10
- data/lib/{holidays → generated_definitions}/be.rb +2 -2
- data/lib/{holidays → generated_definitions}/br.rb +2 -2
- data/lib/{holidays → generated_definitions}/ca.rb +2 -2
- data/lib/{holidays → generated_definitions}/ch.rb +2 -2
- data/lib/{holidays → generated_definitions}/cl.rb +2 -2
- data/lib/{holidays → generated_definitions}/cr.rb +2 -2
- data/lib/{holidays → generated_definitions}/cz.rb +2 -2
- data/lib/{holidays → generated_definitions}/de.rb +5 -4
- data/lib/{holidays → generated_definitions}/dk.rb +2 -2
- data/lib/{holidays → generated_definitions}/ecb_target.rb +2 -2
- data/lib/{holidays → generated_definitions}/el.rb +2 -2
- data/lib/{holidays → generated_definitions}/es.rb +6 -6
- data/lib/{holidays → generated_definitions}/europe.rb +7 -6
- data/lib/{holidays → generated_definitions}/fed_ex.rb +8 -3
- data/lib/{holidays → generated_definitions}/federal_reserve.rb +2 -2
- data/lib/{holidays → generated_definitions}/fi.rb +2 -2
- data/lib/{holidays → generated_definitions}/fr.rb +2 -2
- data/lib/{holidays → generated_definitions}/gb.rb +2 -2
- data/lib/{holidays → generated_definitions}/hr.rb +2 -2
- data/lib/{holidays → generated_definitions}/hu.rb +2 -2
- data/lib/{holidays → generated_definitions}/ie.rb +2 -2
- data/lib/{holidays → generated_definitions}/is.rb +2 -2
- data/lib/{holidays → generated_definitions}/it.rb +2 -2
- data/lib/{holidays → generated_definitions}/jp.rb +5 -5
- data/lib/{holidays → generated_definitions}/li.rb +2 -2
- data/lib/{holidays → generated_definitions}/lt.rb +2 -2
- data/lib/{holidays → generated_definitions}/ma.rb +2 -2
- data/lib/{holidays → generated_definitions}/mx.rb +2 -2
- data/lib/{holidays → generated_definitions}/nerc.rb +2 -2
- data/lib/{holidays → generated_definitions}/nl.rb +2 -2
- data/lib/{holidays → generated_definitions}/no.rb +2 -2
- data/lib/{holidays → generated_definitions}/north_america.rb +8 -3
- data/lib/{holidays → generated_definitions}/nyse.rb +2 -2
- data/lib/{holidays → generated_definitions}/nz.rb +5 -5
- data/lib/{holidays → generated_definitions}/ph.rb +2 -2
- data/lib/{holidays → generated_definitions}/pl.rb +2 -2
- data/lib/{holidays → generated_definitions}/pt.rb +2 -2
- data/lib/{holidays → generated_definitions}/ro.rb +2 -2
- data/lib/{holidays → generated_definitions}/scandinavia.rb +2 -2
- data/lib/{holidays → generated_definitions}/se.rb +2 -2
- data/lib/{holidays → generated_definitions}/sg.rb +2 -2
- data/lib/{holidays → generated_definitions}/si.rb +2 -2
- data/lib/{holidays → generated_definitions}/sk.rb +2 -2
- data/lib/{holidays → generated_definitions}/united_nations.rb +2 -2
- data/lib/{holidays → generated_definitions}/ups.rb +8 -3
- data/lib/{holidays → generated_definitions}/us.rb +8 -3
- data/lib/{holidays → generated_definitions}/ve.rb +2 -2
- data/lib/{holidays → generated_definitions}/vi.rb +2 -2
- data/lib/{holidays → generated_definitions}/za.rb +2 -2
- data/lib/holidays.rb +120 -665
- data/lib/holidays/core_extensions/date.rb +39 -0
- data/lib/holidays/date_calculator/day_of_month.rb +68 -0
- data/lib/holidays/date_calculator/easter.rb +58 -0
- data/lib/holidays/date_calculator/weekend_modifier.rb +49 -0
- data/lib/holidays/date_calculator_factory.rb +21 -0
- data/lib/holidays/definition/context/generator.rb +216 -0
- data/lib/holidays/definition/context/merger.rb +26 -0
- data/lib/holidays/definition/repository/cache.rb +33 -0
- data/lib/holidays/definition/repository/holidays_by_month.rb +49 -0
- data/lib/holidays/definition/repository/proc_cache.rb +36 -0
- data/lib/holidays/definition/repository/regions.rb +36 -0
- data/lib/holidays/definition/validator/region.rb +45 -0
- data/lib/holidays/definition_factory.rb +50 -0
- data/lib/holidays/option/context/parse_options.rb +96 -0
- data/lib/holidays/option_factory.rb +14 -0
- data/lib/holidays/use_case/context/between.rb +105 -0
- data/lib/holidays/use_case/context/dates_driver_builder.rb +64 -0
- data/lib/holidays/use_case_factory.rb +20 -0
- data/lib/holidays/version.rb +1 -1
- data/test/defs/test_defs_ar.rb +1 -1
- data/test/defs/test_defs_at.rb +2 -2
- data/test/defs/test_defs_au.rb +61 -43
- data/test/defs/test_defs_be.rb +1 -1
- data/test/defs/test_defs_br.rb +1 -1
- data/test/defs/test_defs_ca.rb +1 -1
- data/test/defs/test_defs_ch.rb +1 -1
- data/test/defs/test_defs_cl.rb +1 -1
- data/test/defs/test_defs_cr.rb +1 -1
- data/test/defs/test_defs_cz.rb +1 -1
- data/test/defs/test_defs_de.rb +18 -30
- data/test/defs/test_defs_dk.rb +1 -1
- data/test/defs/test_defs_ecb_target.rb +3 -3
- data/test/defs/test_defs_el.rb +1 -1
- data/test/defs/test_defs_es.rb +36 -25
- data/test/defs/test_defs_europe.rb +82 -84
- data/test/defs/test_defs_fed_ex.rb +4 -1
- data/test/defs/test_defs_federal_reserve.rb +1 -1
- data/test/defs/test_defs_fi.rb +1 -1
- data/test/defs/test_defs_fr.rb +1 -1
- data/test/defs/test_defs_gb.rb +20 -20
- data/test/defs/test_defs_hr.rb +1 -1
- data/test/defs/test_defs_hu.rb +2 -2
- data/test/defs/test_defs_ie.rb +1 -1
- data/test/defs/test_defs_is.rb +1 -1
- data/test/defs/test_defs_it.rb +1 -1
- data/test/defs/test_defs_jp.rb +1 -1
- data/test/defs/test_defs_li.rb +4 -4
- data/test/defs/test_defs_lt.rb +1 -1
- data/test/defs/test_defs_ma.rb +1 -1
- data/test/defs/test_defs_mx.rb +1 -1
- data/test/defs/test_defs_nerc.rb +1 -1
- data/test/defs/test_defs_nl.rb +1 -1
- data/test/defs/test_defs_no.rb +1 -1
- data/test/defs/test_defs_north_america.rb +5 -3
- data/test/defs/test_defs_nyse.rb +1 -1
- data/test/defs/test_defs_nz.rb +19 -9
- data/test/defs/test_defs_ph.rb +1 -1
- data/test/defs/test_defs_pl.rb +1 -1
- data/test/defs/test_defs_pt.rb +1 -1
- data/test/defs/test_defs_ro.rb +2 -3
- data/test/defs/test_defs_scandinavia.rb +1 -1
- data/test/defs/test_defs_se.rb +1 -1
- data/test/defs/test_defs_sg.rb +1 -1
- data/test/defs/test_defs_si.rb +7 -7
- data/test/defs/test_defs_sk.rb +1 -1
- data/test/defs/test_defs_united_nations.rb +1 -1
- data/test/defs/test_defs_ups.rb +5 -2
- data/test/defs/test_defs_us.rb +5 -3
- data/test/defs/test_defs_ve.rb +1 -1
- data/test/defs/test_defs_vi.rb +1 -1
- data/test/defs/test_defs_za.rb +1 -1
- data/test/{test_date.rb → holidays/core_extensions/test_date.rb} +8 -2
- data/test/holidays/date_calculator/test_day_of_month.rb +27 -0
- data/test/holidays/date_calculator/test_easter.rb +29 -0
- data/test/holidays/date_calculator/test_weekend_modifier.rb +33 -0
- data/test/holidays/definition/context/test_generator.rb +84 -0
- data/test/holidays/definition/context/test_merger.rb +22 -0
- data/test/holidays/definition/repository/test_cache.rb +82 -0
- data/test/holidays/definition/repository/test_holidays_by_month.rb +187 -0
- data/test/holidays/definition/repository/test_proc_cache.rb +29 -0
- data/test/holidays/definition/repository/test_regions.rb +86 -0
- data/test/holidays/definition/validator/test_region.rb +50 -0
- data/test/holidays/option/context/test_parse_options.rb +69 -0
- data/test/holidays/test_date_calculator_factory.rb +21 -0
- data/test/holidays/test_definition_factory.rb +34 -0
- data/test/holidays/test_option_factory.rb +9 -0
- data/test/holidays/test_use_case_factory.rb +13 -0
- data/test/holidays/use_case/context/test_between.rb +75 -0
- data/test/holidays/use_case/context/test_dates_driver_builder.rb +91 -0
- data/test/test_all_regions.rb +14 -3
- data/test/test_helper.rb +2 -1
- data/test/test_holidays.rb +19 -24
- data/test/test_holidays_between.rb +85 -0
- data/test/test_multiple_regions.rb +2 -2
- data/test/test_parse_definitions.rb +10 -4
- metadata +181 -111
- data/.coveralls.yml +0 -1
- data/lib/holidays/MANIFEST +0 -55
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__)) + '/../../../test_helper'
|
|
2
|
+
|
|
3
|
+
require 'holidays/definition/repository/proc_cache'
|
|
4
|
+
|
|
5
|
+
class ProcCacheRepoTests < Test::Unit::TestCase
|
|
6
|
+
def setup
|
|
7
|
+
@subject = Holidays::Definition::Repository::ProcCache.new
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_lookup_stores_and_returns_result_of_function_if_it_is_not_present
|
|
11
|
+
function = lambda { |year| Date.civil(year, 2, 1) - 1 }
|
|
12
|
+
year = 2015
|
|
13
|
+
|
|
14
|
+
assert_equal(Date.civil(year, 1, 31), @subject.lookup(function, year))
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
#FIXME This test stinks. I don't know how to show that the second invocation
|
|
18
|
+
# doesn't call the function. In rspec I could just do an expect().not_to
|
|
19
|
+
# but it doesn't seem like Mocha can do that? I'm punting.
|
|
20
|
+
def test_lookup_simply_returns_result_of_cache_if_present_after_first_call
|
|
21
|
+
function = lambda { |year| Date.civil(year, 2, 1) - 1 }
|
|
22
|
+
year = 2015
|
|
23
|
+
|
|
24
|
+
@subject.lookup(function, year)
|
|
25
|
+
|
|
26
|
+
assert_equal(Date.civil(year, 1, 31), @subject.lookup(function, year))
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__)) + '/../../../test_helper'
|
|
2
|
+
|
|
3
|
+
require 'holidays/definition/repository/regions'
|
|
4
|
+
|
|
5
|
+
class RegionsRepoTests < Test::Unit::TestCase
|
|
6
|
+
def setup
|
|
7
|
+
@subject = Holidays::Definition::Repository::Regions.new
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_all_returns_an_empty_array_if_just_initialize
|
|
11
|
+
assert_equal([], @subject.all)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_add_successfully_adds_a_region
|
|
15
|
+
@subject.add(:test)
|
|
16
|
+
assert_equal([:test], @subject.all)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def test_add_raises_error_if_symbol_not_provided
|
|
20
|
+
assert_raises ArgumentError do
|
|
21
|
+
@subject.add('not-a-symbol')
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def test_add_raises_error_if_argument_is_nil
|
|
26
|
+
assert_raises ArgumentError do
|
|
27
|
+
@subject.add(nil)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def test_add_raises_error_if_any_region_is_not_a_symbol
|
|
32
|
+
assert_raises ArgumentError do
|
|
33
|
+
@subject.add([:test, 'not-a-symbol'])
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def test_add_does_not_add_if_the_region_already_exists
|
|
38
|
+
@subject.add(:test)
|
|
39
|
+
@subject.add(:test)
|
|
40
|
+
assert_equal([:test], @subject.all)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def test_add_accepts_array_of_regions
|
|
44
|
+
@subject.add([:test, :test2])
|
|
45
|
+
assert_equal([:test, :test2], @subject.all)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_exists_returns_true_if_region_is_present
|
|
49
|
+
@subject.add(:test)
|
|
50
|
+
assert @subject.exists?(:test)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def tests_exists_returns_false_if_region_is_not_present
|
|
54
|
+
assert_equal(false, @subject.exists?(:something))
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def test_exists_raises_error_if_invalid_argument
|
|
58
|
+
assert_raises ArgumentError do
|
|
59
|
+
@subject.exists?(nil)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def test_search_returns_empty_array_if_no_matches_found
|
|
64
|
+
assert_equal([], @subject.search("something"))
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def test_search_returns_matches_on_prefix
|
|
68
|
+
@subject.add([:another_region, :test_region])
|
|
69
|
+
assert_equal([:test_region], @subject.search("test_"))
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def test_search_returns_multiple_matches_on_prefix
|
|
73
|
+
@subject.add([:another_region, :test_region, :test_region2])
|
|
74
|
+
assert_equal([:test_region, :test_region2], @subject.search("test_"))
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def test_search_raises_error_if_prefix_is_not_a_string
|
|
78
|
+
assert_raises ArgumentError do
|
|
79
|
+
@subject.search(:sym)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
assert_raises ArgumentError do
|
|
83
|
+
@subject.search(nil)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__)) + '/../../../test_helper'
|
|
2
|
+
|
|
3
|
+
require 'holidays/definition/validator/region'
|
|
4
|
+
|
|
5
|
+
class RegionValidatorTests < Test::Unit::TestCase
|
|
6
|
+
def setup
|
|
7
|
+
@regions_repo = mock()
|
|
8
|
+
@regions_repo.stubs(:exists?).returns(false)
|
|
9
|
+
|
|
10
|
+
@subject = Holidays::Definition::Validator::Region.new(@regions_repo)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def test_returns_true_if_region_exists_in_generated_files
|
|
14
|
+
assert(@subject.valid?(:us))
|
|
15
|
+
assert(@subject.valid?(:federal_reserve))
|
|
16
|
+
assert(@subject.valid?(:ecb_target))
|
|
17
|
+
assert(@subject.valid?(:gb))
|
|
18
|
+
assert(@subject.valid?(:jp))
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def test_returns_true_if_region_is_in_regions_repository
|
|
22
|
+
@regions_repo.expects(:exists?).with(:custom).returns(true)
|
|
23
|
+
assert(@subject.valid?(:custom))
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def test_returns_false_if_region_does_not_exist_in_generated_files_or_regions_repo
|
|
27
|
+
@regions_repo.expects(:exists?).with(:unknown_region).returns(false)
|
|
28
|
+
assert_equal(false, @subject.valid?(:unknown_region))
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def test_returns_false_if_region_is_not_a_symbol
|
|
32
|
+
assert_equal(false, @subject.valid?('not-a-symbol'))
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_returns_true_if_subregion
|
|
36
|
+
assert(@subject.valid?(:ca_qc))
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def test_returns_true_if_region_is_any
|
|
40
|
+
assert(@subject.valid?(:any))
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def test_returns_true_if_wildcard_region_is_valid
|
|
44
|
+
assert(@subject.valid?(:gb_))
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def test_returns_false_if_wildcard_region_is_invalid
|
|
48
|
+
assert_equal(false, @subject.valid?(:somethingweird_))
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__)) + '/../../../test_helper'
|
|
2
|
+
|
|
3
|
+
require 'holidays/option/context/parse_options'
|
|
4
|
+
|
|
5
|
+
#TODO This set of tests need love. Since the class itself requires actual
|
|
6
|
+
# definition files we have real defs in here, meaning that these tests
|
|
7
|
+
# could break if a definition is removed/changed.
|
|
8
|
+
# Also, there are no actual tests that the files are actually required.
|
|
9
|
+
# We need a mechanism to load things from the defs and then BOOM. We can test
|
|
10
|
+
# that this mechanism is called.
|
|
11
|
+
class ParseOptionsTests < Test::Unit::TestCase
|
|
12
|
+
def setup
|
|
13
|
+
@regions_repo = mock()
|
|
14
|
+
|
|
15
|
+
@region_validator = mock()
|
|
16
|
+
@region_validator.stubs(:valid?).returns(true)
|
|
17
|
+
|
|
18
|
+
@subject = Holidays::Option::Context::ParseOptions.new(
|
|
19
|
+
@regions_repo,
|
|
20
|
+
@region_validator,
|
|
21
|
+
)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def test_returns_observed_true_if_options_contains_observed_flag
|
|
25
|
+
@regions_repo.expects(:exists?).returns(false)
|
|
26
|
+
regions, observed, informal = @subject.call([:ca, :observed])
|
|
27
|
+
assert_equal(true, observed)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_returns_observed_false_if_options_contains_observed_flag
|
|
31
|
+
@regions_repo.expects(:exists?).returns(false)
|
|
32
|
+
regions, observed, informal = @subject.call([:ca])
|
|
33
|
+
assert_equal(false, observed)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def test_returns_informal_true_if_options_contains_informal_flag
|
|
37
|
+
@regions_repo.expects(:exists?).returns(false)
|
|
38
|
+
regions, observed, informal = @subject.call([:ca, :informal])
|
|
39
|
+
assert_equal(true, informal)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_returns_informal_false_if_options_contains_informal_flag
|
|
43
|
+
@regions_repo.expects(:exists?).returns(false)
|
|
44
|
+
regions, observed, informal = @subject.call([:ca])
|
|
45
|
+
assert_equal(false, informal)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_returns_any_if_no_regions_are_provided
|
|
49
|
+
regions, observed, informal = @subject.call(:informal)
|
|
50
|
+
assert_equal([:any], regions)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def test_wildcard_regions_are_removed_if_found
|
|
54
|
+
@regions_repo.expects(:exists?).with(:ch).returns(true)
|
|
55
|
+
@regions_repo.expects(:exists?).with(:ch_zh).returns(true)
|
|
56
|
+
@regions_repo.expects(:search).with('ch_').returns([:ch_zh])
|
|
57
|
+
|
|
58
|
+
regions, observed, informal = @subject.call([:ch_])
|
|
59
|
+
assert_equal(false, regions.include?(:ch_))
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def test_raises_error_if_regions_are_invalid
|
|
63
|
+
@region_validator.stubs(:valid?).returns(false)
|
|
64
|
+
|
|
65
|
+
assert_raise Holidays::UnknownRegionError do
|
|
66
|
+
@subject.call([:unknown_region])
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__)) + '/../test_helper'
|
|
2
|
+
|
|
3
|
+
require 'holidays/date_calculator_factory'
|
|
4
|
+
|
|
5
|
+
class DateCalculatorFactoryTests < Test::Unit::TestCase
|
|
6
|
+
def setup
|
|
7
|
+
@subject = Holidays::DateCalculatorFactory
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_day_of_month_calculator
|
|
11
|
+
assert @subject.day_of_month_calculator.is_a?(Holidays::DateCalculator::DayOfMonth)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_weekend_modifier
|
|
15
|
+
assert @subject.weekend_modifier.is_a?(Holidays::DateCalculator::WeekendModifier)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_easter_calculator
|
|
19
|
+
assert @subject.easter_calculator.is_a?(Holidays::DateCalculator::Easter)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__)) + '/../test_helper'
|
|
2
|
+
|
|
3
|
+
require 'holidays/definition_factory'
|
|
4
|
+
|
|
5
|
+
class DefinitionFactoryTests < Test::Unit::TestCase
|
|
6
|
+
def test_definition_file_parser
|
|
7
|
+
assert Holidays::DefinitionFactory.file_parser.is_a?(Holidays::Definition::Context::Generator)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_definition_source_generator
|
|
11
|
+
assert Holidays::DefinitionFactory.source_generator.is_a?(Holidays::Definition::Context::Generator)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_definition_merger
|
|
15
|
+
assert Holidays::DefinitionFactory.merger.is_a?(Holidays::Definition::Context::Merger)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_holidays_by_month_repository
|
|
19
|
+
assert Holidays::DefinitionFactory.holidays_by_month_repository.is_a?(Holidays::Definition::Repository::HolidaysByMonth)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def test_regions_repository
|
|
23
|
+
assert Holidays::DefinitionFactory.regions_repository.is_a?(Holidays::Definition::Repository::Regions)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def test_cache_repository
|
|
27
|
+
assert Holidays::DefinitionFactory.cache_repository.is_a?(Holidays::Definition::Repository::Cache)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_proc_cache_repository
|
|
31
|
+
assert Holidays::DefinitionFactory.proc_cache_repository.is_a?(Holidays::Definition::Repository::ProcCache)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__)) + '/../test_helper'
|
|
2
|
+
|
|
3
|
+
require 'holidays/option_factory'
|
|
4
|
+
|
|
5
|
+
class OptionFactoryTests < Test::Unit::TestCase
|
|
6
|
+
def test_parse_options_factory
|
|
7
|
+
assert Holidays::OptionFactory.parse_options.is_a?(Holidays::Option::Context::ParseOptions)
|
|
8
|
+
end
|
|
9
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__)) + '/../test_helper'
|
|
2
|
+
|
|
3
|
+
require 'holidays/use_case_factory'
|
|
4
|
+
|
|
5
|
+
class UseCaseFactoryTests < Test::Unit::TestCase
|
|
6
|
+
def test_between_factory
|
|
7
|
+
assert Holidays::UseCaseFactory.between.is_a?(Holidays::UseCase::Context::Between)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_dates_driver_builder_factory
|
|
11
|
+
assert Holidays::UseCaseFactory.dates_driver_builder.is_a?(Holidays::UseCase::Context::DatesDriverBuilder)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__)) + '/../../../test_helper'
|
|
2
|
+
|
|
3
|
+
require 'holidays/use_case/context/between'
|
|
4
|
+
|
|
5
|
+
#TODO These tests need love. This is the heart of the holiday logic and I'm only
|
|
6
|
+
# now starting to tear bits and pieces of it apart to untangle it. This is a start
|
|
7
|
+
# but definitely needs more coverage.
|
|
8
|
+
class BetweenTests < Test::Unit::TestCase
|
|
9
|
+
def setup
|
|
10
|
+
@holidays_by_month_repo = mock()
|
|
11
|
+
@day_of_month_calculator = mock()
|
|
12
|
+
@proc_cache_repo = mock()
|
|
13
|
+
|
|
14
|
+
@subject = Holidays::UseCase::Context::Between.new(
|
|
15
|
+
@holidays_by_month_repo,
|
|
16
|
+
@day_of_month_calculator,
|
|
17
|
+
@proc_cache_repo,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
@start_date = Date.civil(2015, 1, 1)
|
|
21
|
+
@end_date = Date.civil(2015, 1, 1)
|
|
22
|
+
@dates_driver = {2015 => [0, 1, 2], 2014 => [0, 12]}
|
|
23
|
+
@regions = [:us]
|
|
24
|
+
@observed = false
|
|
25
|
+
@informal = false
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def test_returns_error_if_start_date_is_missing
|
|
29
|
+
assert_raise ArgumentError do
|
|
30
|
+
@subject.call(nil, @end_date, @dates_driver, @regions, @observed, @informal)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def test_returns_error_if_end_date_is_missing
|
|
35
|
+
assert_raise ArgumentError do
|
|
36
|
+
@subject.call(@start_date, nil, @dates_driver, @regions, @observed, @informal)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def test_returns_error_if_driver_hash_is_nil
|
|
41
|
+
assert_raise ArgumentError do
|
|
42
|
+
@subject.call(@start_date, @end_date, nil, @regions, @observed, @informal)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def test_returns_error_if_driver_hash_is_empty
|
|
47
|
+
assert_raise ArgumentError do
|
|
48
|
+
@subject.call(@start_date, @end_date, {}, @regions, @observed, @informal)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def test_returns_error_if_driver_hash_has_empty_months_array
|
|
53
|
+
assert_raise ArgumentError do
|
|
54
|
+
@subject.call(@start_date, @end_date, {2015 => nil}, @regions, @observed, @informal)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
assert_raise ArgumentError do
|
|
58
|
+
@subject.call(@start_date, @end_date, {2015 => []}, @regions, @observed, @informal)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
assert_raise ArgumentError do
|
|
62
|
+
@subject.call(@start_date, @end_Date, {2015 => [1], 2016 => [1], 2017 => []}, @regions, @observed, @informal)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def test_returns_error_if_regions_are_missing_or_empty
|
|
67
|
+
assert_raise ArgumentError do
|
|
68
|
+
@subject.call(@start_date, @end_date, @dates_driver, nil, @observed, @informal)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
assert_raise ArgumentError do
|
|
72
|
+
@subject.call(@start_date, @end_date, @dates_driver, [], @observed, @informal)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__)) + '/../../../test_helper'
|
|
2
|
+
|
|
3
|
+
require 'holidays/use_case/context/dates_driver_builder'
|
|
4
|
+
|
|
5
|
+
class DatesDriverBuilderTests < Test::Unit::TestCase
|
|
6
|
+
def setup
|
|
7
|
+
@subject = Holidays::UseCase::Context::DatesDriverBuilder.new
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_returns_appropriately_formatted_hash
|
|
11
|
+
start_date = Date.civil(2015, 1, 1)
|
|
12
|
+
end_date = Date.civil(2015, 1, 31)
|
|
13
|
+
|
|
14
|
+
dates_driver = @subject.call(start_date, end_date)
|
|
15
|
+
|
|
16
|
+
assert(dates_driver.is_a?(Hash))
|
|
17
|
+
|
|
18
|
+
dates_driver.each do |year, months|
|
|
19
|
+
assert(year.is_a?(Integer))
|
|
20
|
+
assert(months.is_a?(Array))
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def test_all_years_always_contains_variable_month
|
|
25
|
+
start_date = Date.civil(2010, 1, 1)
|
|
26
|
+
end_date = Date.civil(2020, 1, 1)
|
|
27
|
+
|
|
28
|
+
dates_driver = @subject.call(start_date, end_date)
|
|
29
|
+
|
|
30
|
+
assert(dates_driver[2010].include?(0))
|
|
31
|
+
assert(dates_driver[2011].include?(0))
|
|
32
|
+
assert(dates_driver[2012].include?(0))
|
|
33
|
+
assert(dates_driver[2013].include?(0))
|
|
34
|
+
assert(dates_driver[2014].include?(0))
|
|
35
|
+
assert(dates_driver[2015].include?(0))
|
|
36
|
+
assert(dates_driver[2016].include?(0))
|
|
37
|
+
assert(dates_driver[2017].include?(0))
|
|
38
|
+
assert(dates_driver[2018].include?(0))
|
|
39
|
+
assert(dates_driver[2019].include?(0))
|
|
40
|
+
assert(dates_driver[2020].include?(0))
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def test_january_includes_february
|
|
44
|
+
dates_driver = @subject.call(Date.civil(2015, 1, 1), Date.civil(2015, 1, 1))
|
|
45
|
+
|
|
46
|
+
assert(dates_driver[2015].include?(1))
|
|
47
|
+
assert(dates_driver[2015].include?(2))
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def test_january_includes_previous_year_december
|
|
51
|
+
dates_driver = @subject.call(Date.civil(2015, 1, 1), Date.civil(2015, 1, 1))
|
|
52
|
+
|
|
53
|
+
assert(dates_driver[2015].include?(1))
|
|
54
|
+
assert(dates_driver[2014].include?(12))
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def test_december_includes_november
|
|
58
|
+
dates_driver = @subject.call(Date.civil(2015, 12, 1), Date.civil(2015, 12, 1))
|
|
59
|
+
|
|
60
|
+
assert(dates_driver[2015].include?(12))
|
|
61
|
+
assert(dates_driver[2015].include?(11))
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def test_december_includes_next_year_january
|
|
65
|
+
dates_driver = @subject.call(Date.civil(2015, 12, 1), Date.civil(2015, 12, 1))
|
|
66
|
+
|
|
67
|
+
assert(dates_driver[2015].include?(12))
|
|
68
|
+
assert(dates_driver[2016].include?(1))
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def test_middle_months_include_border_months
|
|
72
|
+
dates_driver = @subject.call(Date.civil(2015, 5, 1), Date.civil(2015, 5, 1))
|
|
73
|
+
assert(dates_driver[2015].include?(4))
|
|
74
|
+
assert(dates_driver[2015].include?(5))
|
|
75
|
+
assert(dates_driver[2015].include?(6))
|
|
76
|
+
|
|
77
|
+
dates_driver = @subject.call(Date.civil(2015, 10, 1), Date.civil(2015, 10, 1))
|
|
78
|
+
assert(dates_driver[2015].include?(9))
|
|
79
|
+
assert(dates_driver[2015].include?(10))
|
|
80
|
+
assert(dates_driver[2015].include?(11))
|
|
81
|
+
|
|
82
|
+
dates_driver = @subject.call(Date.civil(2015, 3, 1), Date.civil(2015, 7, 1))
|
|
83
|
+
assert(dates_driver[2015].include?(2))
|
|
84
|
+
assert(dates_driver[2015].include?(3))
|
|
85
|
+
assert(dates_driver[2015].include?(4))
|
|
86
|
+
assert(dates_driver[2015].include?(5))
|
|
87
|
+
assert(dates_driver[2015].include?(6))
|
|
88
|
+
assert(dates_driver[2015].include?(7))
|
|
89
|
+
assert(dates_driver[2015].include?(8))
|
|
90
|
+
end
|
|
91
|
+
end
|