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 +10 -0
- data/LICENSE.txt +19 -0
- data/README.rdoc +0 -0
- data/Rakefile +84 -0
- data/date-constructor.gemspec +66 -0
- data/lib/date/constructor.rb +51 -0
- data/test/test_date.rb +145 -0
- data/test/test_date_arith.rb +286 -0
- data/test/test_date_attr.rb +112 -0
- data/test/test_date_base.rb +442 -0
- data/test/test_date_compat.rb +21 -0
- data/test/test_date_conv.rb +137 -0
- data/test/test_date_marshal.rb +29 -0
- data/test/test_date_new.rb +271 -0
- data/test/test_date_parse.rb +1097 -0
- data/test/test_date_strftime.rb +401 -0
- data/test/test_date_strptime.rb +486 -0
- data/test/test_switch_hitter.rb +577 -0
- metadata +142 -0
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -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.
|
data/README.rdoc
ADDED
File without changes
|
data/Rakefile
ADDED
@@ -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
|
data/test/test_date.rb
ADDED
@@ -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
|