holidays 2.2.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|