date-constructor 0.0.1

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.
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