date-constructor 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rake', :group => [:development, :test]
4
+
5
+ group :development do
6
+ gem 'jeweler'
7
+ end
8
+
9
+ group :test do
10
+ end
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2013 Clifford Heath.
2
+
3
+ This software is provided 'as-is', without any express or implied warranty.
4
+ In no event will the authors be held liable for any damages arising from the
5
+ use of this software.
6
+
7
+ Permission is granted to anyone to use this software for any purpose,
8
+ including commercial applications, and to alter it and redistribute it
9
+ freely, subject to the following restrictions:
10
+
11
+ 1. The origin of this software must not be misrepresented; you must not
12
+ claim that you wrote the original software. If you use this software
13
+ in a product, an acknowledgment in the product documentation would be
14
+ appreciated but is not required.
15
+
16
+ 2. Altered source versions must be plainly marked as such, and must not be
17
+ misrepresented as being the original software.
18
+
19
+ 3. This notice may not be removed or altered from any source distribution.
File without changes
@@ -0,0 +1,84 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ require 'jeweler'
5
+ Jeweler::Tasks.new do |gem|
6
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
7
+ gem.name = "date-constructor"
8
+ gem.homepage = "http://github.com/cjheath/date-constructor"
9
+ gem.license = "MIT"
10
+ gem.summary = "Add flexible constructors to Ruby's Date and DateTime"
11
+ gem.description = %q{
12
+ Date and DateTime don't have sensible constructors. You can't construct
13
+ one using an existing Date/Time, nor by passing a string to be parsed.
14
+ Instead you have to call special-purpose routines. This gem adds some
15
+ sensible options to the existing modes of the constructors
16
+ }
17
+ gem.email = "clifford.heath@gmail.com"
18
+ gem.authors = ["Clifford Heath"]
19
+ # Include your dependencies below. Runtime dependencies are required when using your gem,
20
+ # and development dependencies are only needed for development (ie running rake tasks, tests, etc)
21
+ gem.add_development_dependency "bundler", "~> 1.0.0"
22
+ gem.add_development_dependency "rdoc", ">= 2.4.2"
23
+ gem.files = [
24
+ "Gemfile",
25
+ "LICENSE.txt",
26
+ "README.rdoc",
27
+ "Rakefile",
28
+ "date-constructor.gemspec",
29
+ "lib/date/constructor.rb",
30
+ "test/test_date.rb",
31
+ "test/test_date_arith.rb",
32
+ "test/test_date_attr.rb",
33
+ "test/test_date_base.rb",
34
+ "test/test_date_compat.rb",
35
+ "test/test_date_conv.rb",
36
+ "test/test_date_marshal.rb",
37
+ "test/test_date_new.rb",
38
+ "test/test_date_parse.rb",
39
+ "test/test_date_strftime.rb",
40
+ "test/test_date_strptime.rb",
41
+ "test/test_switch_hitter.rb"
42
+ ]
43
+ end
44
+ Jeweler::RubygemsDotOrgTasks.new
45
+
46
+ task :default => :test
47
+
48
+ require 'rake/testtask'
49
+ Rake::TestTask.new do |t|
50
+ here = "#{File.dirname(__FILE__)}"
51
+ t.libs << "test"
52
+ t.test_files = FileList['test/test_*.rb']
53
+ t.options = "-q"
54
+ load "#{here}/lib/date/constructor.rb"
55
+ end
56
+
57
+ namespace :test do
58
+ namespace :rubies do
59
+ SUPPORTED_RUBIES = %w{ 1.8.7 1.9.2 1.9.3 jruby-1.7.0 rbx }
60
+
61
+ desc "Run tests on all supported rubies"
62
+ task :all_tasks => [:install_gems, :exec]
63
+
64
+ desc "Run `bundle install` on all rubies"
65
+ task :install_gems do
66
+ sh %{ rvm #{SUPPORTED_RUBIES.join(',')} exec bundle install }
67
+ end
68
+
69
+ desc "Run `bundle exec rake` on all rubies"
70
+ task :exec do
71
+ sh %{ rvm #{SUPPORTED_RUBIES.join(',')} exec bundle exec rake test }
72
+ end
73
+ end
74
+ end
75
+
76
+ require 'rdoc/task'
77
+ Rake::RDocTask.new do |rdoc|
78
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
79
+
80
+ rdoc.rdoc_dir = 'rdoc'
81
+ rdoc.title = "date-constructor #{version}"
82
+ rdoc.rdoc_files.include('README*')
83
+ rdoc.rdoc_files.include('lib/**/*.rb')
84
+ end
@@ -0,0 +1,66 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "date-constructor"
8
+ s.version = "0.0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Clifford Heath"]
12
+ s.date = "2013-01-04"
13
+ s.description = "\nDate and DateTime don't have sensible constructors. You can't construct\none using an existing Date/Time, nor by passing a string to be parsed.\nInstead you have to call special-purpose routines. This gem adds some\nsensible options to the existing modes of the constructors\n"
14
+ s.email = "clifford.heath@gmail.com"
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ "Gemfile",
21
+ "LICENSE.txt",
22
+ "README.rdoc",
23
+ "Rakefile",
24
+ "date-constructor.gemspec",
25
+ "lib/date/constructor.rb",
26
+ "test/test_date.rb",
27
+ "test/test_date_arith.rb",
28
+ "test/test_date_attr.rb",
29
+ "test/test_date_base.rb",
30
+ "test/test_date_compat.rb",
31
+ "test/test_date_conv.rb",
32
+ "test/test_date_marshal.rb",
33
+ "test/test_date_new.rb",
34
+ "test/test_date_parse.rb",
35
+ "test/test_date_strftime.rb",
36
+ "test/test_date_strptime.rb",
37
+ "test/test_switch_hitter.rb"
38
+ ]
39
+ s.homepage = "http://github.com/cjheath/date-constructor"
40
+ s.licenses = ["MIT"]
41
+ s.require_paths = ["lib"]
42
+ s.rubygems_version = "1.8.24"
43
+ s.summary = "Add flexible constructors to Ruby's Date and DateTime"
44
+
45
+ if s.respond_to? :specification_version then
46
+ s.specification_version = 3
47
+
48
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
49
+ s.add_development_dependency(%q<rake>, [">= 0"])
50
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
51
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
52
+ s.add_development_dependency(%q<rdoc>, [">= 2.4.2"])
53
+ else
54
+ s.add_dependency(%q<rake>, [">= 0"])
55
+ s.add_dependency(%q<jeweler>, [">= 0"])
56
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
57
+ s.add_dependency(%q<rdoc>, [">= 2.4.2"])
58
+ end
59
+ else
60
+ s.add_dependency(%q<rake>, [">= 0"])
61
+ s.add_dependency(%q<jeweler>, [">= 0"])
62
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
63
+ s.add_dependency(%q<rdoc>, [">= 2.4.2"])
64
+ end
65
+ end
66
+
@@ -0,0 +1,51 @@
1
+ require 'date'
2
+
3
+ # Allow a Date to be constructed from any Date or DateTime subclass, or parsed from a String
4
+ class ::Date
5
+ # If someone calls allocate/initialize, make that work
6
+ # ... just don't mess up DateTime which is a subclass of Date
7
+ def initialize *a, &b
8
+ marshal_load(self.class.new(*a, &b).marshal_dump) unless self.is_a?(DateTime)
9
+ end
10
+
11
+ def self.new *a, &b
12
+ if a[0].is_a?(String)
13
+ parse(*a)
14
+ elsif (a.size == 1)
15
+ case a[0]
16
+ when DateTime
17
+ civil(a[0].year, a[0].month, a[0].day, a[0].start)
18
+ when Date
19
+ a[0].clone
20
+ else
21
+ civil(*a, &b)
22
+ end
23
+ else
24
+ civil(*a, &b)
25
+ end
26
+ end
27
+ end
28
+
29
+ # Allow a DateTime to be constructed from any Date or DateTime subclass, or parsed from a String
30
+ class ::DateTime
31
+ def initialize *a, &b
32
+ marshal_load(self.class.new(*a, &b).marshal_dump)
33
+ end
34
+
35
+ def self.new *a, &b
36
+ if a[0].is_a?(String)
37
+ parse(*a)
38
+ elsif (a.size == 1)
39
+ case a[0]
40
+ when DateTime
41
+ a[0].clone
42
+ when Date
43
+ civil(a[0].year, a[0].month, a[0].day, 0, 0, 0, a[0].start)
44
+ else
45
+ civil(*a, &b)
46
+ end
47
+ else
48
+ civil(*a, &b)
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,145 @@
1
+ require 'test/unit'
2
+ require 'date'
3
+ require 'date/constructor'
4
+
5
+ class DateSub < Date; end
6
+ class DateTimeSub < DateTime; end
7
+
8
+ class TestDate < Test::Unit::TestCase
9
+
10
+ def test__const
11
+ assert_nil(Date::MONTHNAMES[0])
12
+ assert_equal('January', Date::MONTHNAMES[1])
13
+ assert_equal(13, Date::MONTHNAMES.size)
14
+ assert_equal('Sunday', Date::DAYNAMES[0])
15
+ assert_equal(7, Date::DAYNAMES.size)
16
+
17
+ assert_nil(Date::ABBR_MONTHNAMES[0])
18
+ assert_equal('Jan', Date::ABBR_MONTHNAMES[1])
19
+ assert_equal(13, Date::ABBR_MONTHNAMES.size)
20
+ assert_equal('Sun', Date::ABBR_DAYNAMES[0])
21
+ assert_equal(7, Date::ABBR_DAYNAMES.size)
22
+
23
+ assert(Date::MONTHNAMES.frozen?)
24
+ assert(!Date::MONTHNAMES[0].frozen?)
25
+ assert(Date::MONTHNAMES[1].frozen?)
26
+ assert(Date::DAYNAMES.frozen?)
27
+ assert(Date::DAYNAMES[0].frozen?)
28
+
29
+ assert(Date::ABBR_MONTHNAMES.frozen?)
30
+ assert(Date::ABBR_MONTHNAMES[1].frozen?)
31
+ assert(Date::ABBR_DAYNAMES.frozen?)
32
+ assert(Date::ABBR_DAYNAMES[0].frozen?)
33
+ end
34
+
35
+ def test_sub
36
+ d = DateSub.new
37
+ dt = DateTimeSub.new
38
+
39
+ assert_instance_of(DateSub, d)
40
+ assert_instance_of(DateTimeSub, dt)
41
+
42
+ assert_instance_of(DateSub, DateSub.today)
43
+ assert_instance_of(DateTimeSub, DateTimeSub.now)
44
+
45
+ # assert_equal('#<DateSub: -4712-01-01 (-1/2,0,2299161)>', d.inspect)
46
+ assert_equal('-4712-01-01', d.to_s)
47
+ # assert_equal('#<DateTimeSub: -4712-01-01T00:00:00+00:00 (-1/2,0,2299161)>', dt.inspect)
48
+ assert_equal('-4712-01-01T00:00:00+00:00', dt.to_s)
49
+
50
+ d2 = d + 1
51
+ assert_instance_of(DateSub, d2)
52
+ d2 = d - 1
53
+ assert_instance_of(DateSub, d2)
54
+ d2 = d >> 1
55
+ assert_instance_of(DateSub, d2)
56
+ d2 = d << 1
57
+ assert_instance_of(DateSub, d2)
58
+ d2 = d.succ
59
+ assert_instance_of(DateSub, d2)
60
+ d2 = d.next
61
+ assert_instance_of(DateSub, d2)
62
+ d2 = d.italy
63
+ assert_instance_of(DateSub, d2)
64
+ d2 = d.england
65
+ assert_instance_of(DateSub, d2)
66
+ d2 = d.julian
67
+ assert_instance_of(DateSub, d2)
68
+ d2 = d.gregorian
69
+ assert_instance_of(DateSub, d2)
70
+ s = Marshal.dump(d)
71
+ d2 = Marshal.load(s)
72
+ assert_equal(d2, d)
73
+ assert_instance_of(DateSub, d2)
74
+
75
+ dt2 = dt + 1
76
+ assert_instance_of(DateTimeSub, dt2)
77
+ dt2 = dt - 1
78
+ assert_instance_of(DateTimeSub, dt2)
79
+ dt2 = dt >> 1
80
+ assert_instance_of(DateTimeSub, dt2)
81
+ dt2 = dt << 1
82
+ assert_instance_of(DateTimeSub, dt2)
83
+ dt2 = dt.succ
84
+ assert_instance_of(DateTimeSub, dt2)
85
+ dt2 = dt.next
86
+ assert_instance_of(DateTimeSub, dt2)
87
+ dt2 = dt.italy
88
+ assert_instance_of(DateTimeSub, dt2)
89
+ dt2 = dt.england
90
+ assert_instance_of(DateTimeSub, dt2)
91
+ dt2 = dt.julian
92
+ assert_instance_of(DateTimeSub, dt2)
93
+ dt2 = dt.gregorian
94
+ assert_instance_of(DateTimeSub, dt2)
95
+ s = Marshal.dump(dt)
96
+ dt2 = Marshal.load(s)
97
+ assert_equal(dt2, dt)
98
+ assert_instance_of(DateTimeSub, dt2)
99
+ end
100
+
101
+ def test_eql_p
102
+ d = Date.jd(0)
103
+ d2 = Date.jd(0)
104
+ dt = DateTime.jd(0)
105
+ dt2 = DateTime.jd(0)
106
+
107
+ assert_equal(d, d2)
108
+ assert_not_equal(d, 0)
109
+
110
+ assert_equal(dt, dt2)
111
+ assert_not_equal(dt, 0)
112
+
113
+ assert_equal(d, dt)
114
+ assert_equal(d2, dt2)
115
+ end
116
+
117
+ def test_hash
118
+ h = {}
119
+ h[Date.new(1999,5,23)] = 0
120
+ h[Date.new(1999,5,24)] = 1
121
+ h[Date.new(1999,5,25)] = 2
122
+ h[Date.new(1999,5,25)] = 9
123
+ assert_equal(3, h.size)
124
+ assert_equal(9, h[Date.new(1999,5,25)])
125
+ assert_equal(9, h[DateTime.new(1999,5,25)])
126
+
127
+ h = {}
128
+ h[DateTime.new(1999,5,23)] = 0
129
+ h[DateTime.new(1999,5,24)] = 1
130
+ h[DateTime.new(1999,5,25)] = 2
131
+ h[DateTime.new(1999,5,25)] = 9
132
+ assert_equal(3, h.size)
133
+ assert_equal(9, h[Date.new(1999,5,25)])
134
+ assert_equal(9, h[DateTime.new(1999,5,25)])
135
+ end
136
+
137
+ def test_freeze
138
+ d = Date.new
139
+ d.freeze
140
+ assert_equal(true, d.frozen?)
141
+ assert_instance_of(Fixnum, d.yday)
142
+ assert_instance_of(String, d.to_s)
143
+ end
144
+
145
+ end
@@ -0,0 +1,286 @@
1
+ require 'test/unit'
2
+ require 'date'
3
+
4
+ class TestDateArith < Test::Unit::TestCase
5
+
6
+ def new_offset
7
+ d = DateTime.new(2002, 3, 14)
8
+ assert_equal(Rational(9, 24), d.new_offset(Rational(9, 24)).offset)
9
+ assert_equal(Rational(9, 24), d.new_offset('+0900').offset)
10
+ end
11
+
12
+ def test__plus
13
+ d = Date.new(2000,2,29) + -1
14
+ assert_equal([2000, 2, 28], [d.year, d.mon, d.mday])
15
+ d = Date.new(2000,2,29) + 0
16
+ assert_equal([2000, 2, 29], [d.year, d.mon, d.mday])
17
+ d = Date.new(2000,2,29) + 1
18
+ assert_equal([2000, 3, 1], [d.year, d.mon, d.mday])
19
+
20
+ d = DateTime.new(2000,2,29) + 1.to_r/2
21
+ assert_equal([2000, 2, 29, 12, 0, 0],
22
+ [d.year, d.mon, d.mday, d.hour, d.min, d.sec])
23
+ end
24
+
25
+ def test__plus__ex
26
+ e = TypeError
27
+ assert_raise(e) do
28
+ Date.new(2000,2,29) + 'foo'
29
+ end
30
+ assert_raise(e) do
31
+ DateTime.new(2000,2,29) + 'foo'
32
+ end
33
+ assert_raise(e) do
34
+ Date.new(2000,2,29) + Time.mktime(2000,2,29)
35
+ end
36
+ assert_raise(e) do
37
+ DateTime.new(2000,2,29) + Time.mktime(2000,2,29)
38
+ end
39
+ end
40
+
41
+ def test__minus
42
+ d = Date.new(2000,3,1) - -1
43
+ assert_equal([2000, 3, 2], [d.year, d.mon, d.mday])
44
+ d = Date.new(2000,3,1) - 0
45
+ assert_equal([2000, 3, 1], [d.year, d.mon, d.mday])
46
+ d = Date.new(2000,3,1) - 1
47
+ assert_equal([2000, 2, 29], [d.year, d.mon, d.mday])
48
+
49
+ d = Date.new(2000,3,1) - Date.new(2000,2,29)
50
+ assert_equal(1, d)
51
+ d = Date.new(2000,2,29) - Date.new(2000,3,1)
52
+ assert_equal(-1, d)
53
+
54
+ d = DateTime.new(2000,3,1) - 1.to_r/2
55
+ assert_equal([2000, 2, 29, 12, 0, 0],
56
+ [d.year, d.mon, d.mday, d.hour, d.min, d.sec])
57
+ end
58
+
59
+ def test__minus__ex
60
+ e = TypeError
61
+ assert_raise(e) do
62
+ Date.new(2000,2,29) - 'foo'
63
+ end
64
+ assert_raise(e) do
65
+ DateTime.new(2000,2,29) - 'foo'
66
+ end
67
+ assert_raise(e) do
68
+ Date.new(2000,2,29) - Time.mktime(2000,2,29)
69
+ end
70
+ assert_raise(e) do
71
+ DateTime.new(2000,2,29) - Time.mktime(2000,2,29)
72
+ end
73
+ end
74
+
75
+ def test__compare
76
+ assert_equal(0, (Date.new(2000,1,1) <=> Date.new(2000,1,1)))
77
+ assert_equal(-1, (Date.new(2000,1,1) <=> Date.new(2000,1,2)))
78
+ assert_equal(1, (Date.new(2000,1,2) <=> Date.new(2000,1,1)))
79
+ assert_equal(0, (Date.new(2001,1,4,Date::JULIAN) <=>
80
+ Date.new(2001,1,17, Date::GREGORIAN)))
81
+ assert_equal(0, (DateTime.new(2001,1,4,0,0,0,0,Date::JULIAN) <=>
82
+ DateTime.new(2001,1,17,0,0,0,0,Date::GREGORIAN)))
83
+ end
84
+
85
+ def test_prev
86
+ d = Date.new(2000,1,1)
87
+ assert_raise(NoMethodError) do
88
+ d.prev
89
+ end
90
+ end
91
+
92
+ def test_prev_day
93
+ d = Date.new(2001,1,1).prev_day
94
+ assert_equal([2000, 12, 31], [d.year, d.mon, d.mday])
95
+ d = Date.new(2001,1,1).prev_day(2)
96
+ assert_equal([2000, 12, 30], [d.year, d.mon, d.mday])
97
+ d = Date.new(2000,12,31).prev_day(-2)
98
+ assert_equal([2001, 1, 2], [d.year, d.mon, d.mday])
99
+
100
+ d = DateTime.new(2000,3,1).prev_day(1.to_r/2)
101
+ assert_equal([2000, 2, 29, 12, 0, 0], [d.year, d.mon, d.mday, d.hour, d.min, d.sec])
102
+ end
103
+
104
+ def test_prev_month
105
+ d = Date.new(2000,1,31) << -1
106
+ assert_equal([2000, 2, 29], [d.year, d.mon, d.mday])
107
+ d = Date.new(2000,1,31) << 1
108
+ assert_equal([1999, 12, 31], [d.year, d.mon, d.mday])
109
+ d = Date.new(2000,1,31) << 12
110
+ assert_equal([1999, 1, 31], [d.year, d.mon, d.mday])
111
+ d = Date.new(2000,1,31) << 14
112
+ assert_equal([1998, 11, 30], [d.year, d.mon, d.mday])
113
+
114
+ end
115
+
116
+ def test_prev_month__2
117
+ d = Date.new(2000,1,31).prev_month(-1)
118
+ assert_equal([2000, 2, 29], [d.year, d.mon, d.mday])
119
+ d = Date.new(2000,1,31).prev_month
120
+ assert_equal([1999, 12, 31], [d.year, d.mon, d.mday])
121
+ d = Date.new(2000,1,31).prev_month(12)
122
+ assert_equal([1999, 1, 31], [d.year, d.mon, d.mday])
123
+ d = Date.new(2000,1,31).prev_month(14)
124
+ assert_equal([1998, 11, 30], [d.year, d.mon, d.mday])
125
+ end
126
+
127
+ def test_prev_year
128
+ d = Date.new(2000,1,31).prev_year(-1)
129
+ assert_equal([2001, 1, 31], [d.year, d.mon, d.mday])
130
+ d = Date.new(2000,1,31).prev_year
131
+ assert_equal([1999, 1, 31], [d.year, d.mon, d.mday])
132
+ d = Date.new(2000,1,31).prev_year(10)
133
+ assert_equal([1990, 1, 31], [d.year, d.mon, d.mday])
134
+ d = Date.new(2000,1,31).prev_year(100)
135
+ assert_equal([1900, 1, 31], [d.year, d.mon, d.mday])
136
+ end
137
+
138
+ def test_next
139
+ d = Date.new(2000,12,31).next
140
+ assert_equal([2001, 1, 1], [d.year, d.mon, d.mday])
141
+ d = Date.new(2000,12,31).succ
142
+ assert_equal([2001, 1, 1], [d.year, d.mon, d.mday])
143
+
144
+ d = Date.today
145
+ d2 = d.next
146
+ assert_equal(d, (d2 - 1))
147
+ d = Date.today
148
+ d2 = d.succ
149
+ assert_equal(d, (d2 - 1))
150
+
151
+ d = DateTime.now
152
+ d2 = d.next
153
+ assert_equal(d, (d2 - 1))
154
+ d = DateTime.now
155
+ d2 = d.succ
156
+ assert_equal(d, (d2 - 1))
157
+ end
158
+
159
+ def test_next_day
160
+ d = Date.new(2000,12,31).next_day
161
+ assert_equal([2001, 1, 1], [d.year, d.mon, d.mday])
162
+ d = Date.new(2000,12,31).next_day(2)
163
+ assert_equal([2001, 1, 2], [d.year, d.mon, d.mday])
164
+ d = Date.new(2001,1,1).next_day(-2)
165
+ assert_equal([2000, 12, 30], [d.year, d.mon, d.mday])
166
+
167
+ d = DateTime.new(2000,2,29).next_day(1.to_r/2)
168
+ assert_equal([2000, 2, 29, 12, 0, 0], [d.year, d.mon, d.mday, d.hour, d.min, d.sec])
169
+ end
170
+
171
+ def test_next_month
172
+ d = Date.new(2000,1,31) >> -1
173
+ assert_equal([1999, 12, 31], [d.year, d.mon, d.mday])
174
+ d = Date.new(2000,1,31) >> 1
175
+ assert_equal([2000, 2, 29], [d.year, d.mon, d.mday])
176
+ d = Date.new(2000,1,31) >> 12
177
+ assert_equal([2001, 1, 31], [d.year, d.mon, d.mday])
178
+ d = Date.new(2000,1,31) >> 13
179
+ assert_equal([2001, 2, 28], [d.year, d.mon, d.mday])
180
+ end
181
+
182
+ def test_next_month__2
183
+ d = Date.new(2000,1,31).next_month(-1)
184
+ assert_equal([1999, 12, 31], [d.year, d.mon, d.mday])
185
+ d = Date.new(2000,1,31).next_month
186
+ assert_equal([2000, 2, 29], [d.year, d.mon, d.mday])
187
+ d = Date.new(2000,1,31).next_month(12)
188
+ assert_equal([2001, 1, 31], [d.year, d.mon, d.mday])
189
+ d = Date.new(2000,1,31).next_month(13)
190
+ assert_equal([2001, 2, 28], [d.year, d.mon, d.mday])
191
+ end
192
+
193
+ def test_next_year
194
+ d = Date.new(2000,1,31).next_year(-1)
195
+ assert_equal([1999, 1, 31], [d.year, d.mon, d.mday])
196
+ d = Date.new(2000,1,31).next_year
197
+ assert_equal([2001, 1, 31], [d.year, d.mon, d.mday])
198
+ d = Date.new(2000,1,31).next_year(10)
199
+ assert_equal([2010, 1, 31], [d.year, d.mon, d.mday])
200
+ d = Date.new(2000,1,31).next_year(100)
201
+ assert_equal([2100, 1, 31], [d.year, d.mon, d.mday])
202
+ end
203
+
204
+ def test_downto
205
+ p = Date.new(2001,1,14)
206
+ q = Date.new(2001,1,7)
207
+ i = 0
208
+ p.downto(q) do |d|
209
+ i += 1
210
+ end
211
+ assert_equal(8, i)
212
+ end
213
+
214
+ def test_downto__noblock
215
+ p = Date.new(2001,1,14)
216
+ q = Date.new(2001,1,7)
217
+ e = p.downto(q)
218
+ assert_equal(8, e.to_a.size)
219
+ end
220
+
221
+ def test_upto
222
+ p = Date.new(2001,1,14)
223
+ q = Date.new(2001,1,21)
224
+ i = 0
225
+ p.upto(q) do |d|
226
+ i += 1
227
+ end
228
+ assert_equal(8, i)
229
+ end
230
+
231
+ def test_upto__noblock
232
+ p = Date.new(2001,1,14)
233
+ q = Date.new(2001,1,21)
234
+ e = p.upto(q)
235
+ assert_equal(8, e.to_a.size)
236
+ end
237
+
238
+ def test_step
239
+ p = Date.new(2001,1,14)
240
+ q = Date.new(2001,1,21)
241
+ i = 0
242
+ p.step(q, 2) do |d|
243
+ i += 1
244
+ end
245
+ assert_equal(4, i)
246
+
247
+ i = 0
248
+ p.step(q) do |d|
249
+ i += 1
250
+ end
251
+ assert_equal(8, i)
252
+ end
253
+
254
+ def test_step__noblock
255
+ p = Date.new(2001,1,14)
256
+ q = Date.new(2001,1,21)
257
+ e = p.step(q, 2)
258
+ assert_equal(4, e.to_a.size)
259
+
260
+ e = p.step(q)
261
+ assert_equal(8, e.to_a.size)
262
+ end
263
+
264
+ =begin
265
+ def test_step__inf
266
+ p = Date.new(2001,1,14)
267
+ q = Date.new(2001,1,21)
268
+ inf = 1.0/0
269
+
270
+ if inf.infinite?
271
+ [p, q].each do |a|
272
+ [p, q].each do |b|
273
+ [inf, -inf].each do |c|
274
+ i = 0
275
+ a.step(b, c) do |d|
276
+ i += 1
277
+ end
278
+ assert_equal(0, i)
279
+ end
280
+ end
281
+ end
282
+ end
283
+ end
284
+ =end
285
+
286
+ end