diff --git a/README b/README
index d254ab1..bf043f4 100644
--- a/README
+++ b/README
@@ -1,13 +1,12 @@
= Ruby Holidays Gem
-A set of classes to deal with public/statutory holidays in Ruby.
+A set of classes to deal with holidays in Ruby.
Extends Ruby's built-in Date class and supports custom holiday definition lists.
=== Examples
==== Using the Holidays class
-
# Get all holidays on April 25, 2008 in Australia
date = Date.civil(2008,4,25)
Holidays.by_day(date, :au)
@@ -23,9 +22,6 @@ Extends Ruby's built-in Date class and supports custom holiday definition lists.
==== Extending Ruby's Date class
- require 'date'
- require 'holidays'
-
# Lookup Canada Day in the :ca region
Date.civil(2008,7,1).is_holiday?(:ca)
=> true
diff --git a/create_defs.rb b/create_defs.rb
index e01da81..ffc26f3 100644
--- a/create_defs.rb
+++ b/create_defs.rb
@@ -1,46 +1,53 @@
require 'yaml'
-module_name = 'TestModule'
+module_name = 'CA'
# Load the data files
-files = ['data/ca.yaml']
-regions = [] #wtf
+files = ['data/ca.yaml', 'data/common_methods.yaml']
+regions = []
rules_by_month = {}
custom_methods = {}
files.each do |file|
def_file = YAML.load_file(file)
- def_file['months'].each do |month, definitions|
- rules_by_month[month] = []
- definitions.each do |definition|
- rule = {}
- definition.each do |key, val|
- rule[key] = val
- end
- regions = rule['regions'].collect { |r| r.to_sym }
- rule['regions'] = regions
+ puts "Loading #{file}"
+ if def_file['months']
+ puts " importing dates..."
+ def_file['months'].each do |month, definitions|
+ rules_by_month[month] = [] unless rules_by_month[month]
+ definitions.each do |definition|
+ rule = {}
+ definition.each do |key, val|
+ rule[key] = val
+ end
+
+ rule['regions'] = rule['regions'].collect { |r| r.to_sym }
+
+ regions << rule['regions']
- existed = false
-# rules_by_month[month].each do |ex|
-# if ex['name'] == rule['name'] and ex['wday'] == rule['wday'] and ex['mday'] == rule['mday'] and ex['week'] == rule['week']
-# ex['regions'] << rule['regions'].flatten
-# existed = true
-# end
-# end
- unless existed
- rules_by_month[month] << rule
- end
-
- end # /defs.each
+ exists = false
+ rules_by_month[month].each do |ex|
+ if ex['name'] == rule['name'] and ex['wday'] == rule['wday'] and ex['mday'] == rule['mday'] and ex['week'] == rule['week']
+# ex['regions'] << rule['regions'].flatten
+ exists = true
+ end
+ end
+ #unless exists
+ rules_by_month[month] << rule
+ #end
+ end # /defs.each
+ end
+ end
+ if def_file['methods']
+ puts " importing methods..."
def_file['methods'].each do |name, code|
custom_methods[name] = code
end # /methods.each
end
+
end
-
-
# Build the definitions
month_strs = []
rules_by_month.each do |month, rules|
@@ -76,20 +83,20 @@ end
# Build the output file
out =<<-EOC
-# This file is generated by the Ruby Holiday gem.
-#
-# To use the definitions in the file, load them right after you load the
-# Holiday gem:
-#
-# require 'holidays'
-# require 'path/to/#{module_name.downcase}'
-#
-# More definitions are available at http://code.dunae.ca/holidays.
-#
-# Definitions loaded: #{files.join(',')}
module Holidays
- module #{module_name}
- DEFINED_REGIONS = [:#{regions.join(', :')}]
+ # This file is generated by the Ruby Holiday gem.
+ #
+ # Definitions loaded: #{files.join(', ')}
+ #
+ # To use the definitions in the file, load them right after you load the
+ # Holiday gem:
+ #
+ # require 'holidays'
+ # require 'path/to/#{module_name.downcase}'
+ #
+ # More definitions are available at http://code.dunae.ca/holidays.
+ module #{module_name} # :nodoc:
+ DEFINED_REGIONS = [:#{regions.flatten.uniq.join(', :')}]
HOLIDAYS_BY_MONTH = {
#{month_strs.join(",\n")}
diff --git a/data/ca.yaml b/data/ca.yaml
index 57c1ae4..e9d0f45 100644
--- a/data/ca.yaml
+++ b/data/ca.yaml
@@ -55,7 +55,7 @@ months:
regions: [ca]
mday: 1
- name: Orangemen's Day
- regions: [ca]
+ regions: [ca_nf]
mday: 12
- name: Nunavut Day
regions: [ca_nu]
@@ -65,7 +65,7 @@ months:
week: 1
regions: [ca_bc]
wday: 1
- - name: Saskatchewan Day
+ - name: Saskatchewan Day
week: 1
regions: [ca_sk]
wday: 1
@@ -107,10 +107,6 @@ months:
regions: [ca]
mday: 26
methods:
- easter: |
- def self.easter(year)
- Date.civil(2008,1,1)
- end
ca_victoria_day: |
# Monday on or before May 24
def self.ca_victoria_day(year)
diff --git a/lib/holidays/easter.rb b/data/common_methods.yaml
similarity index 83%
rename from lib/holidays/easter.rb
rename to data/common_methods.yaml
index b3918d4..d937e9a 100644
--- a/lib/holidays/easter.rb
+++ b/data/common_methods.yaml
@@ -1,5 +1,8 @@
-module Holidays
- module Easter
+# Common method definitions for the Ruby Holiday gem.
+# Updated 2008-11-21.
+---
+methods:
+ easter: |
# Get the date of Easter in a given year.
#
# +year+ must be a valid Gregorian year.
@@ -8,7 +11,7 @@ module Holidays
#--
# from http://snippets.dzone.com/posts/show/765
# TODO: check year to ensure Gregorian
- def easter(year)
+ def self.easter(year)
y = year
a = y % 19
b = y / 100
@@ -26,5 +29,4 @@ module Holidays
day = ((h + l - 7 * m + 114) % 31) + 1
Date.civil(year, month, day)
end
- end
-end
+
diff --git a/lib/holidays.rb b/lib/holidays.rb
index 80885dd..092eea9 100644
--- a/lib/holidays.rb
+++ b/lib/holidays.rb
@@ -1,32 +1,17 @@
$:.unshift File.dirname(__FILE__)
-require 'holidays/easter'
module Holidays
# Exception thrown when an unknown region is requested.
class UnkownRegionError < ArgumentError; end
- self.extend Easter
-
VERSION = '0.9.0'
WEEKS = {:first => 1, :second => 2, :third => 3, :fourth => 4, :fifth => 5, :last => -1}
- MONTH_LENGTHS = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
-
- DEFINED_REGIONS = [:us, :au]
- HOLIDAYS_TYPES = [:bank, :statutory, :religious, :informal]
-
-
- # :wday Day of the week (0 is Sunday, 6 is Saturday)
- # :function Can return an integer representing mday or a Date object.
- #
- # The month 0 is used to store events that require lambda calculations
- # and may occur in more than one month.
- HOLIDAYS_BY_MONTH = {
- 1 => [{:mday => 1, :name => 'New Year\'s Day', :regions => [:ca, :au]},
- {:mday => 1, :name => 'Australia Day', :regions => [:au]}]
- }
-
+ MONTH_LENGTHS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
+ #--
+ #HOLIDAYS_TYPES = [:bank, :statutory, :religious, :informal]
+ #++
# Get all holidays on a given date.
#
@@ -34,6 +19,16 @@ module Holidays
# [regions] A symbol (e.g. :ca) or an array of symbols
# (e.g. [:ca, :ca_bc, :us]).
#
+ # Returns an array of hashes or nil. See Holidays#between for the output
+ # format.
+ #
+ # Also available via Date#holidays.
+ def self.on(date, regions = :any)
+ self.between(date, date, regions)
+ end
+
+ # Get all holidays occuring between two dates, inclusively.
+ #
# Returns an array of hashes or nil.
#
# Each holiday is returned as a hash with the following fields:
@@ -42,57 +37,16 @@ module Holidays
# [:day] Integer.
# [:name] String.
# [:regions] An array of region symbols.
- # [:types] An array of holiday-type symbols.
- def self.by_day(date, regions = :any)
- regions = validate_regions(regions)
-
- hbm = HOLIDAYS_BY_MONTH.values_at(0,date.mon).flatten
-
- holidays = []
-
- year = date.year
- month = date.month
- mday = date.mday
- wday = date.wday
-
- hbm.each do |h|
- # start with the region check
- next unless h[:regions].any?{ |reg| regions.include?(reg) }
-
- if h[:mday] and h[:mday] == mday
- # fixed day of the month
- holidays << h
- elsif h[:wday] == wday
- # by week calculation
- if Date.calculate_mday(year, month, h[:week], h[:wday]) == mday
- holidays << h
- end
- elsif h[:function]
- result = h[:function].call(year)
- if result.kind_of?(Date) and result.mon == month and result.mday == mday
- holidays << h
- elsif result == mday
- holidays << h
- end
-
- end
- end
- holidays
- end
-
- # Get all holidays occuring between two dates, inclusively.
- #
- # Returns an array of hashes or nil. See Holidays#by_day for the output
- # format.
#--
- # TODO: do not take full months
+ # [:types] An array of holiday-type symbols.
def self.between(start_date, end_date, regions = :any)
regions = validate_regions(regions)
holidays = []
dates = {}
(start_date..end_date).each do |date|
- dates[date.year] = Array.new unless dates[date.year]
+ # Always include month '0' for variable-month holidays
+ dates[date.year] = [0] unless dates[date.year]
# TODO: test this, maybe should push then flatten
dates[date.year] << date.month unless dates[date.year].include?(date.month)
end
@@ -101,21 +55,24 @@ module Holidays
months.each do |month|
next unless hbm = HOLIDAYS_BY_MONTH[month]
hbm.each do |h|
- next unless h[:regions].any?{ |reg| regions.include?(reg) }
+ next unless in_region?(regions, h[:regions])
if h[:function]
result = h[:function].call(year)
- if result.kind_of?(Date) and result.mon == month
- holidays << h.merge({:day => result.mday})
- else #if result == mday
- holidays << h
+ if result.kind_of?(Date)
+ month = result.month
+ mday = result.mday
+ else
+ day = result
end
-
-
else
- day = h[:mday] || Date.calculate_mday(year, month, h[:week], h[:wday])
- holidays << {:month => month, :day => day, :year => year, :name => h[:name], :regions => h[:regions]}
+ mday = h[:mday] || Date.calculate_mday(year, month, h[:week], h[:wday])
end
+
+ if Date.new(year, month, mday).between?(start_date, end_date)
+ holidays << {:month => month, :day => mday, :year => year, :name => h[:name], :regions => h[:regions]}
+ end
+
end
end
end
@@ -135,6 +92,24 @@ private
regions
end
+ # Check sub regions.
+ #
+ # When request :any, all holidays should be returned.
+ # When requesting :ca_bc, holidays in :ca or :ca_bc should be returned.
+ # When requesting :ca, only holidays in :ca should be returned.
+ def self.in_region?(requested, available) # :nodoc:
+ return true if requested.include?(:any)
+
+ # When an underscore is encountered, derive the parent regions
+ # symbol and include both in the requested array.
+ requested = requested.collect do |r|
+ r.to_s =~ /_/ ? [r, r.to_s.gsub(/_[\w]*$/, '').to_sym] : r
+ end
+
+ requested = requested.flatten.uniq
+
+ available.any? { |r| requested.include?(r) }
+ end
end
@@ -143,21 +118,27 @@ class Date
# Get holidays on the current date.
#
- # Returns an array.
+ # Returns an array of hashes or nil. See Holidays#between for the output
+ # format.
#
# Date.civil('2008-01-01').holidays(:ca)
# => [{:name => 'Canada Day',...}]
+ #
+ # Also available via Holidays#on.
def holidays(regions = :any)
- holidays = Holidays.by_day(self, regions)
- !holidays.empty?
+ Holidays.on(self, regions)
end
# Check if the current date is a holiday.
#
+ # Returns an array of hashes or nil. See Holidays#between for the output
+ # format.
+ #
# Date.civil('2008-01-01').holiday?(:ca)
# => true
def holiday?(regions = :any)
- !self.holidays(regions).empty?
+ holidays = self.holidays(regions)
+ holidays && !holidays.empty?
end
# Calculate day of the month based on the week number and the day of the
@@ -185,9 +166,9 @@ class Date
#--
# see http://www.irt.org/articles/js050/index.htm
def self.calculate_mday(year, month, week, wday)
- raise ArgumentError, "Week parameter must be one of Holidays::WEEKS (provided #{week})." unless WEEKS.include?(week)
+ raise ArgumentError, "Week parameter must be one of Holidays::WEEKS (provided #{week})." unless WEEKS.include?(week) or WEEKS.has_value?(week)
- week = WEEKS[week]
+ week = WEEKS[week] if week.kind_of?(Symbol)
# :first, :second, :third, :fourth or :fifth
if week > 0
@@ -195,10 +176,9 @@ class Date
end
days = MONTH_LENGTHS[month-1]
- if month == 1 and Date.civil(year,1,1).leap?
- days = 29
- end
+ days = 29 if month == 1 and Date.civil(year,1,1).leap?
+
return days - ((Date.civil(year, month, days).wday - wday + 7) % 7)
end
diff --git a/lib/holidays/ca.rb b/lib/holidays/ca.rb
new file mode 100644
index 0000000..cb55c39
--- /dev/null
+++ b/lib/holidays/ca.rb
@@ -0,0 +1,105 @@
+module Holidays
+ # This file is generated by the Ruby Holiday gem.
+ #
+ # Definitions loaded: data/ca.yaml, data/common_methods.yaml
+ #
+ # To use the definitions in the file, load them right after you load the
+ # Holiday gem:
+ #
+ # require 'holidays'
+ # require 'path/to/ca'
+ #
+ # More definitions are available at http://code.dunae.ca/holidays.
+ module CA # :nodoc:
+ DEFINED_REGIONS = [:ca, :ca_qc, :ca_nf, :ca_nt, :ca_nu, :ca_ab, :ca_on, :ca_sk, :ca_mb, :ca_bc, :ca_ns, :ca_yk]
+
+ HOLIDAYS_BY_MONTH = {
+ 5 => [{:function => lambda { |year| ca_victoria_day(year) }, :name => "Victoria Day", :regions => [:ca]},
+ {:function => lambda { |year| ca_victoria_day(year) }, :name => "National Patriotes Day", :regions => [:ca_qc]}],
+ 0 => [{:function => lambda { |year| easter(year)-2 }, :name => "Good Friday", :regions => [:ca]},
+ {:function => lambda { |year| easter(year)+1 }, :name => "Easter Monday", :regions => [:ca_qc]}],
+ 11 => [{:mday => 11, :name => "Rememberance Day", :regions => [:ca]}],
+ 6 => [{:mday => 24, :name => "Discovery Day", :regions => [:ca_nf]},
+ {:mday => 24, :name => "Fête Nationale", :regions => [:ca_qc]},
+ {:mday => 21, :name => "National Aboriginal Day", :regions => [:ca_nt]}],
+ 1 => [{:mday => 1, :name => "New Year's Day", :regions => [:ca]},
+ {:mday => 2, :name => "New Year's", :regions => [:ca_qc]}],
+ 12 => [{:mday => 25, :name => "Christmas Day", :regions => [:ca]},
+ {:mday => 26, :name => "Boxing Day", :regions => [:ca]}],
+ 7 => [{:mday => 1, :name => "Canada Day", :regions => [:ca]},
+ {:mday => 12, :name => "Orangemen's Day", :regions => [:ca_nf]},
+ {:mday => 9, :name => "Nunavut Day", :regions => [:ca_nu]}],
+ 2 => [{:wday => 1, :week => 3, :name => "Family Day", :regions => [:ca_ab, :ca_on, :ca_sk]},
+ {:wday => 1, :week => 3, :name => "Louis Riel Day", :regions => [:ca_mb]}],
+ 8 => [{:wday => 1, :week => 1, :name => "BC Day", :regions => [:ca_bc]},
+ {:wday => 1, :week => 1, :name => "Saskatchewan Day", :regions => [:ca_sk]},
+ {:wday => 1, :week => 1, :name => "Heritage Day", :regions => [:ca_ab]},
+ {:wday => 1, :week => 1, :name => "Natal Day", :regions => [:ca_ns]},
+ {:wday => 1, :week => 1, :name => "Civic Holiday", :regions => [:ca_on]},
+ {:wday => 1, :week => 3, :name => "Discovery Day", :regions => [:ca_yk]}],
+ 3 => [{:mday => 23, :name => "St. George's Day", :regions => [:ca_nf]}],
+ 9 => [{:wday => 1, :week => 1, :name => "Labour Day", :regions => [:ca]}],
+ 10 => [{:wday => 1, :week => 2, :name => "Thanksgiving", :regions => [:ca]}]
+ }
+
+# Get the date of Easter in a given year.
+#
+# +year+ must be a valid Gregorian year.
+#
+# Returns a Date object.
+#--
+# from http://snippets.dzone.com/posts/show/765
+# TODO: check year to ensure Gregorian
+def self.easter(year)
+ y = year
+ a = y % 19
+ b = y / 100
+ c = y % 100
+ d = b / 4
+ e = b % 4
+ f = (b + 8) / 25
+ g = (b - f + 1) / 3
+ h = (19 * a + b - d - g + 15) % 30
+ i = c / 4
+ k = c % 4
+ l = (32 + 2 * e + 2 * i - h - k) % 7
+ m = (a + 11 * h + 22 * l) / 451
+ month = (h + l - 7 * m + 114) / 31
+ day = ((h + l - 7 * m + 114) % 31) + 1
+ Date.civil(year, month, day)
+end
+
+
+# Monday on or before May 24
+def self.ca_victoria_day(year)
+ date = Date.civil(year,5,24)
+ if date.wday > 1
+ date -= (date.wday - 1)
+ elsif date.wday == 0
+ date -= 6
+ end
+ date
+end
+
+
+ end
+end
+
+Holidays.class_eval do
+ existing_regions = []
+ if const_defined?(:DEFINED_REGIONS)
+ existing_regions = const_get(:DEFINED_REGIONS)
+ remove_const(:DEFINED_REGIONS)
+ end
+ const_set(:DEFINED_REGIONS, existing_regions | Holidays::CA::DEFINED_REGIONS)
+
+ existing_defs = {}
+ if const_defined?(:HOLIDAYS_BY_MONTH)
+ existing_defs = const_get(:HOLIDAYS_BY_MONTH)
+ remove_const(:HOLIDAYS_BY_MONTH)
+ end
+ #const_set(:HOLIDAYS_BY_MONTH, existing_defs.merge(Holidays::CA::HOLIDAYS_BY_MONTH))
+ const_set(:HOLIDAYS_BY_MONTH, Holidays::CA::HOLIDAYS_BY_MONTH)
+
+ include Holidays::CA
+end
diff --git a/test/test_easter.rb b/test/test_common_methods.rb
similarity index 65%
rename from test/test_easter.rb
rename to test/test_common_methods.rb
index 77189d7..50c048f 100644
--- a/test/test_easter.rb
+++ b/test/test_common_methods.rb
@@ -1,7 +1,10 @@
require File.dirname(__FILE__) + '/test_helper'
-class HolidaysTests < Test::Unit::TestCase
- def test_easter_dates
+class CommonMethodsTests < Test::Unit::TestCase
+
+ def test_inclusion
+ assert Holidays.include?(Holidays::CA)
+ flunk
assert_equal '1800-04-13', Holidays.easter(1800).to_s
assert_equal '1899-04-02', Holidays.easter(1899).to_s
assert_equal '1900-04-15', Holidays.easter(1900).to_s
@@ -14,16 +17,14 @@ class HolidaysTests < Test::Unit::TestCase
end
def test_easter_lambda
- [Date.civil(1800,4,13), Date.civil(1899,4,2), Date.civil(1900,4,15),
- Date.civil(2008,3,23), Date.civil(2035,3,25)].each do |date|
- assert_equal 'Easter Sunday', Holidays.by_day(date, :christian)[0][:name]
- end
- end
-
- def test_good_friday_lambda
[Date.civil(1800,4,11), Date.civil(1899,3,31), Date.civil(1900,4,13),
Date.civil(2008,3,21), Date.civil(2035,3,23)].each do |date|
- assert_equal 'Good Friday', Holidays.by_day(date, :christian)[0][:name]
+ assert_equal 'Good Friday', Holidays.on(date, :ca)[0][:name]
+ end
+
+ [Date.civil(1800,4,14), Date.civil(1899,4,3), Date.civil(1900,4,16),
+ Date.civil(2008,3,24), Date.civil(2035,3,26)].each do |date|
+ assert_equal 'Easter Monday', Holidays.on(date, :ca_qc)[0][:name]
end
end
end
diff --git a/test/test_date.rb b/test/test_date.rb
new file mode 100644
index 0000000..495f286
--- /dev/null
+++ b/test/test_date.rb
@@ -0,0 +1,73 @@
+require File.dirname(__FILE__) + '/test_helper'
+
+class DateTests < Test::Unit::TestCase
+ def setup
+ @date = Date.civil(2008,1,1)
+ end
+
+ def test_extending_date_class
+ assert @date.respond_to?('holiday?')
+ assert @date.respond_to?('holiday?')
+ end
+
+ def test_calculating_mdays
+ # US Memorial day
+ assert_equal 29, Date.calculate_mday(2006, 5, :last, 1)
+ assert_equal 28, Date.calculate_mday(2007, 5, :last, 1)
+ assert_equal 26, Date.calculate_mday(2008, 5, :last, 1)
+ assert_equal 25, Date.calculate_mday(2009, 5, :last, 1)
+ assert_equal 31, Date.calculate_mday(2010, 5, :last, 1)
+ assert_equal 30, Date.calculate_mday(2011, 5, :last, 1)
+
+ # Labour day
+ assert_equal 3, Date.calculate_mday(2007, 9, :first, 1)
+ assert_equal 1, Date.calculate_mday(2008, 9, :first, 1)
+ assert_equal 7, Date.calculate_mday(2009, 9, :first, 1)
+ assert_equal 5, Date.calculate_mday(2011, 9, :first, 1)
+ assert_equal 5, Date.calculate_mday(2050, 9, :first, 1)
+ assert_equal 4, Date.calculate_mday(2051, 9, :first, 1)
+
+ # Canadian thanksgiving
+ assert_equal 8, Date.calculate_mday(2007, 10, :second, 1)
+ assert_equal 13, Date.calculate_mday(2008, 10, :second, 1)
+ assert_equal 12, Date.calculate_mday(2009, 10, :second, 1)
+ assert_equal 11, Date.calculate_mday(2010, 10, :second, 1)
+
+ # Misc
+ assert_equal 21, Date.calculate_mday(2008, 1, :third, 1)
+ assert_equal 1, Date.calculate_mday(2007, 1, :first, 1)
+ assert_equal 2, Date.calculate_mday(2007, 3, :first, 5)
+ end
+
+ def test_mday_allows_integers_or_symbols
+ assert_nothing_raised do
+ Date.calculate_mday(2008, 1, 1, 1)
+ end
+
+ assert_nothing_raised do
+ Date.calculate_mday(2008, 1, -1, 1)
+ end
+
+ assert_nothing_raised do
+ Date.calculate_mday(2008, 1, :last, 1)
+ end
+ end
+
+ def test_mday_requires_valid_week
+ assert_raises ArgumentError do
+ Date.calculate_mday(2008, 1, :none, 1)
+ end
+
+ assert_raises ArgumentError do
+ Date.calculate_mday(2008, 1, nil, 1)
+ end
+
+ assert_raises ArgumentError do
+ Date.calculate_mday(2008, 1, 0, 1)
+ end
+ end
+
+ def test_holiday?
+ assert Date.civil(2008,1,1).holiday?('ca')
+ end
+end
diff --git a/test/test_helper.rb b/test/test_helper.rb
index d5fa452..5eab881 100644
--- a/test/test_helper.rb
+++ b/test/test_helper.rb
@@ -4,3 +4,4 @@ require 'rubygems'
require 'test/unit'
require 'date'
require 'holidays'
+require 'holidays/ca'
diff --git a/test/test_holidays.rb b/test/test_holidays.rb
index e4339f5..a313e5c 100644
--- a/test/test_holidays.rb
+++ b/test/test_holidays.rb
@@ -6,67 +6,34 @@ class HolidaysTests < Test::Unit::TestCase
@date = Date.civil(2008,1,1)
end
- def test_extending_date_class
- assert @date.respond_to?('is_holiday?')
+ def test_on
+ h = Holidays.on(Date.civil(2008,9,1), :ca)
+ assert_equal 'Labour Day', h[0][:name]
+
+ holidays = Holidays.on(Date.civil(2008,7,1), :ca)
+ assert_equal 1, holidays.length
+
+ holidays = Holidays.on(Date.civil(2008,7,4), :ca)
+ assert_equal 0, holidays.length
end
- def test_date_ranges
- holidays = Holidays.between(Date.civil(2008,1,1), Date.civil(2008,12,31), :au)
- holidays.each do |h|
- #puts h.inspect
- end
- end
-
- def test_calculating_mdays
- # US Memorial day
- assert_equal 29, Date.calculate_mday(2006, 5, :last, 1)
- assert_equal 28, Date.calculate_mday(2007, 5, :last, 1)
- assert_equal 26, Date.calculate_mday(2008, 5, :last, 1)
- assert_equal 25, Date.calculate_mday(2009, 5, :last, 1)
- assert_equal 31, Date.calculate_mday(2010, 5, :last, 1)
- assert_equal 30, Date.calculate_mday(2011, 5, :last, 1)
+ def test_between
+ holidays = Holidays.between(Date.civil(2008,7,1), Date.civil(2008,7,31), :ca)
+ assert_equal 1, holidays.length
- # Labour day
- assert_equal 3, Date.calculate_mday(2007, 9, :first, 1)
- assert_equal 1, Date.calculate_mday(2008, 9, :first, 1)
- assert_equal 7, Date.calculate_mday(2009, 9, :first, 1)
- assert_equal 5, Date.calculate_mday(2011, 9, :first, 1)
- assert_equal 5, Date.calculate_mday(2050, 9, :first, 1)
- assert_equal 4, Date.calculate_mday(2051, 9, :first, 1)
-
- # Canadian thanksgiving
- assert_equal 8, Date.calculate_mday(2007, 10, :second, 1)
- assert_equal 13, Date.calculate_mday(2008, 10, :second, 1)
- assert_equal 12, Date.calculate_mday(2009, 10, :second, 1)
- assert_equal 11, Date.calculate_mday(2010, 10, :second, 1)
-
- # Misc
- assert_equal 21, Date.calculate_mday(2008, 1, :third, 1)
- assert_equal 1, Date.calculate_mday(2007, 1, :first, 1)
- assert_equal 2, Date.calculate_mday(2007, 3, :first, 5)
+ holidays = Holidays.between(Date.civil(2008,7,2), Date.civil(2008,7,31), :ca)
+ assert_equal 0, holidays.length
end
- def test_requires_valid_week
- assert_raises ArgumentError do
- Date.calculate_mday(2008, 1, :none, 1)
- end
-
- assert_raises ArgumentError do
- Date.calculate_mday(2008, 1, nil, 1)
- end
-
- assert_raises ArgumentError do
- Date.calculate_mday(2008, 1, 0, 1)
- end
- end
+
def test_requires_valid_regions
assert_raises Holidays::UnkownRegionError do
- Holidays.by_day(Date.civil(2008,1,1), :xx)
+ Holidays.on(Date.civil(2008,1,1), :xx)
end
assert_raises Holidays::UnkownRegionError do
- Holidays.by_day(Date.civil(2008,1,1), [:ca,:xx])
+ Holidays.on(Date.civil(2008,1,1), [:ca,:xx])
end
assert_raises Holidays::UnkownRegionError do
@@ -75,38 +42,30 @@ class HolidaysTests < Test::Unit::TestCase
end
def test_region_params
- holidays = Holidays.by_day(@date, :us)
+ holidays = Holidays.on(@date, :ca)
assert_equal 1, holidays.length
- holidays = Holidays.by_day(@date, [:us,:ca])
+ holidays = Holidays.on(@date, [:ca_bc,:ca])
assert_equal 1, holidays.length
end
-
- def test_by_day_spot_checks
- h = Holidays.by_day(Date.civil(2008,5,1), :gr)
- assert_equal 'Labour Day', h[0][:name]
-
- h = Holidays.by_day(Date.civil(2045,11,1), :fr)
- assert_equal 'Touissant', h[0][:name]
- end
-
- def test_by_day_and_iterate
- holidays = Holidays.by_day(@date, :ca)
- holidays.each do |h|
- #puts h[:name]
- end
- end
-
- def test_lookup_holiday
- holidays = Holidays.by_day(Date.civil(2008,1,21), :ca)
- assert_equal 0, holidays.length
-
- holidays = Holidays.by_day(Date.civil(2008,1,21), :us)
+
+ def test_any_region
+ # Should return Victoria Day
+ holidays = Holidays.between(Date.civil(2008,5,1), Date.civil(2008,5,31), :ca)
assert_equal 1, holidays.length
- end
- def test_basic
- assert Date.civil(2008,1,1).is_holiday?('ca')
+ # Should return Victoria Day and National Patriotes Day
+ holidays = Holidays.between(Date.civil(2008,5,1), Date.civil(2008,5,31), :any)
+ assert_equal 2, holidays.length
end
+
+ def test_sub_regions
+ # Should return Victoria Day
+ holidays = Holidays.between(Date.civil(2008,5,1), Date.civil(2008,5,31), :ca)
+ assert_equal 1, holidays.length
+ # Should return Victoria Day and National Patriotes Day
+ holidays = Holidays.between(Date.civil(2008,5,1), Date.civil(2008,5,31), :ca_qc)
+ assert_equal 2, holidays.length
+ end
end
diff --git a/test/test_mixins.rb b/test/test_mixins.rb
index be9918b..8fb34d0 100644
--- a/test/test_mixins.rb
+++ b/test/test_mixins.rb
@@ -1,11 +1,10 @@
require File.dirname(__FILE__) + '/test_helper'
-require 'fixtures/ca'
class CATests < Test::Unit::TestCase
def test_ca_victoria_day
[Date.civil(2004,5,24), Date.civil(2005,5,23), Date.civil(2006,5,22),
Date.civil(2007,5,21), Date.civil(2008,5,19)].each do |date|
- assert_equal 'Victoria Day', Holidays.by_day(date, :ca)[0][:name]
+ assert_equal 'Victoria Day', Holidays.on(date, :ca)[0][:name]
end
end
end