marsdate 1.1.7 → 2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +18 -0
- data/LICENSE.txt +21 -0
- data/README.md +650 -0
- data/bin/marsdate +16 -14
- data/lib/marsdate/calendar.rb +128 -0
- data/lib/marsdate/timescale.rb +314 -0
- data/lib/marsdate/version.rb +3 -0
- data/lib/marsdate.rb +291 -241
- data/marsdate.gemspec +31 -0
- data/test/calendar_test.rb +142 -0
- data/test/cli_test.rb +57 -0
- data/test/test.rb +305 -313
- data/test/timescale_test.rb +124 -0
- metadata +49 -11
- data/test/spec/marsdate_spec.rb +0 -382
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# Tests for MarsDateTime::TimeScale (NASA/Allison / Mars24).
|
|
3
|
+
# Run: ruby test/timescale_test.rb
|
|
4
|
+
|
|
5
|
+
require 'minitest/autorun'
|
|
6
|
+
require_relative '../lib/marsdate/timescale'
|
|
7
|
+
require 'date'
|
|
8
|
+
|
|
9
|
+
class TimeScaleTest < Minitest::Test
|
|
10
|
+
TS = MarsDateTime::TimeScale
|
|
11
|
+
|
|
12
|
+
def test_tai_utc_table
|
|
13
|
+
assert_in_delta 10.0, TS.tai_utc(Date.new(1972, 1, 1)), 1e-9
|
|
14
|
+
assert_in_delta 32.0, TS.tai_utc(Date.new(1999, 6, 1)), 1e-9
|
|
15
|
+
assert_in_delta 32.0, TS.tai_utc(Date.new(2000, 1, 6)), 1e-9
|
|
16
|
+
assert_in_delta 37.0, TS.tai_utc(Date.new(2017, 1, 1)), 1e-9
|
|
17
|
+
assert_in_delta 37.0, TS.tai_utc(Date.new(2026, 8, 13)), 1e-9
|
|
18
|
+
assert_in_delta 64.184, TS.tt_utc(Date.new(2000, 1, 6)), 1e-9
|
|
19
|
+
assert_in_delta 69.184, TS.tt_utc(Date.new(2017, 1, 1)), 1e-9
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def test_mars24_2000_jan_6
|
|
23
|
+
# Mars24 worked example: 2000-01-06 00:00:00 UTC → MST 23:59:39
|
|
24
|
+
dt = DateTime.new(2000, 1, 6, 0, 0, 0)
|
|
25
|
+
assert_in_delta 2_451_549.5, TS.jd_ut(dt), 1e-9
|
|
26
|
+
assert_in_delta 2_451_549.500742407, TS.jd_tt(dt), 2e-6
|
|
27
|
+
h, m, s = TS.mtc_hms(dt)
|
|
28
|
+
hours = hms_to_hours(h, m, s)
|
|
29
|
+
assert_in_delta hms_to_hours(23, 59, 39), hours, 1.5 / 3600.0
|
|
30
|
+
assert_equal 23, h
|
|
31
|
+
assert_equal 59, m
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def test_offset_independent
|
|
35
|
+
utc = DateTime.new(2000, 1, 1, 12, 0, 0)
|
|
36
|
+
est = utc.new_offset(Rational(-5, 24))
|
|
37
|
+
assert_in_delta TS.msd(utc), TS.msd(est), 1e-12
|
|
38
|
+
assert_in_delta TS.mtc_hours(utc), TS.mtc_hours(est), 1e-12
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def test_wikipedia_2026_aug_12
|
|
42
|
+
# Wikipedia Timekeeping_on_Mars snapshot: 12 Aug 2026 00:25:08 UTC
|
|
43
|
+
# JDTT = 2461264.51825, MSD = 54251.08514, MTC = 02:02:36
|
|
44
|
+
dt = DateTime.new(2026, 8, 12, 0, 25, 8)
|
|
45
|
+
assert_in_delta 2_461_264.51825, TS.jd_tt(dt), 5e-5
|
|
46
|
+
assert_in_delta 54_251.08514, TS.msd(dt), 5e-5
|
|
47
|
+
h, m, s = TS.mtc_hms(dt)
|
|
48
|
+
assert_in_delta hms_to_hours(2, 2, 36), hms_to_hours(h, m, s), 2.0 / 3600.0
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def test_mxt_vs_mtc
|
|
52
|
+
dt = DateTime.new(2000, 1, 6, 0, 0, 0)
|
|
53
|
+
frac = TS.sol_fraction(dt)
|
|
54
|
+
assert_operator frac, :>=, 0
|
|
55
|
+
assert_operator frac, :<, 1
|
|
56
|
+
si = TS.mxt_si_seconds(dt)
|
|
57
|
+
assert_in_delta frac * TS::SOL_SI_SECONDS, si, 1e-6
|
|
58
|
+
mtc_h = TS.mtc_hours(dt)
|
|
59
|
+
mxt_h = si / 3600.0
|
|
60
|
+
assert_in_delta mtc_h * TS::SOL_DAYS, mxt_h, 1e-6
|
|
61
|
+
assert_includes 88_775.0..88_776.0, TS::SOL_SI_SECONDS
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def test_mtc_rounding_stays_below_24_hours
|
|
65
|
+
h, m, s = TS.hours_to_hms(24.0.prev_float, limit: 24)
|
|
66
|
+
|
|
67
|
+
assert_equal [23, 59], [h, m]
|
|
68
|
+
assert_operator s, :<, 60
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def test_ls_j2000_region
|
|
72
|
+
dt = DateTime.new(2000, 1, 6, 0, 0, 0)
|
|
73
|
+
ls = TS.ls_deg(TS.jd_tt(dt))
|
|
74
|
+
assert_in_delta 277.19, ls, 0.05
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def test_earth_from_msd_round_trip
|
|
78
|
+
dt = DateTime.new(2000, 1, 6, 0, 0, 0)
|
|
79
|
+
back = TS.earth_from_msd(TS.msd(dt))
|
|
80
|
+
assert_in_delta 0, (back - dt).to_f, 1e-9
|
|
81
|
+
|
|
82
|
+
dt = DateTime.new(2026, 8, 13, 0, 6, 56)
|
|
83
|
+
back = TS.earth_from_msd(TS.msd(dt))
|
|
84
|
+
assert_in_delta 0, (back - dt).to_f, 1e-8
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def test_year1_caption_treats_tt_as_ut
|
|
88
|
+
r = TS.epoch_report
|
|
89
|
+
assert_match(/no year-1/, r[:caveat])
|
|
90
|
+
assert_equal(-665773, r[:epoch_msd])
|
|
91
|
+
cap = r[:epoch_earth_if_tt_were_ut]
|
|
92
|
+
assert_equal 1, cap.year
|
|
93
|
+
assert_equal 1, cap.month
|
|
94
|
+
assert_equal 23, cap.day
|
|
95
|
+
assert_equal 13, cap.hour
|
|
96
|
+
assert_equal 40, cap.min
|
|
97
|
+
eq = r[:ls0_earth_if_tt_were_ut]
|
|
98
|
+
assert_equal 1, eq.year
|
|
99
|
+
assert_equal 1, eq.month
|
|
100
|
+
assert_equal 24, eq.day
|
|
101
|
+
assert_equal 5, eq.hour
|
|
102
|
+
assert_equal 53, eq.min
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def test_year1_equinox_sol
|
|
106
|
+
hint = DateTime.new(1, 1, 22, 12, 0, 0)
|
|
107
|
+
eq = TS.vernal_equinox_jd_tt(hint.ajd.to_f)
|
|
108
|
+
ls = TS.ls_deg(eq)
|
|
109
|
+
dist = [ls, (ls - 360).abs].min
|
|
110
|
+
assert_operator dist, :<, 0.01, "year-1 Ls=0 search: Ls=#{ls} at JD_TT=#{eq}"
|
|
111
|
+
m = TS.msd(jd_tt: eq)
|
|
112
|
+
assert_operator m, :<, 0, "year-1 MSD should be before 1873 (got #{m})"
|
|
113
|
+
frac = m % 1.0
|
|
114
|
+
frac += 1 if frac < 0
|
|
115
|
+
assert_operator frac, :>=, 0
|
|
116
|
+
assert_operator frac, :<, 1
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
private
|
|
120
|
+
|
|
121
|
+
def hms_to_hours(h, m, s)
|
|
122
|
+
h + m / 60.0 + s / 3600.0
|
|
123
|
+
end
|
|
124
|
+
end
|
metadata
CHANGED
|
@@ -1,15 +1,42 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: marsdate
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 2.0.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Hal Fulton
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
12
|
-
dependencies:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: minitest
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - "~>"
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '6.0'
|
|
19
|
+
type: :development
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - "~>"
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '6.0'
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: rake
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - "~>"
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '13.4'
|
|
33
|
+
type: :development
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - "~>"
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '13.4'
|
|
13
40
|
description: |2
|
|
14
41
|
This is a library for handling dates and times on Mars
|
|
15
42
|
for the Martian Common Era calendar (created by Hal Fulton).
|
|
@@ -20,15 +47,27 @@ executables:
|
|
|
20
47
|
extensions: []
|
|
21
48
|
extra_rdoc_files: []
|
|
22
49
|
files:
|
|
50
|
+
- CHANGELOG.md
|
|
51
|
+
- LICENSE.txt
|
|
52
|
+
- README.md
|
|
23
53
|
- bin/marsdate
|
|
24
54
|
- lib/marsdate.rb
|
|
25
|
-
-
|
|
55
|
+
- lib/marsdate/calendar.rb
|
|
56
|
+
- lib/marsdate/timescale.rb
|
|
57
|
+
- lib/marsdate/version.rb
|
|
58
|
+
- marsdate.gemspec
|
|
59
|
+
- test/calendar_test.rb
|
|
60
|
+
- test/cli_test.rb
|
|
26
61
|
- test/test.rb
|
|
62
|
+
- test/timescale_test.rb
|
|
27
63
|
homepage: https://github.com/Hal9000/marsdate
|
|
28
64
|
licenses:
|
|
29
|
-
-
|
|
30
|
-
metadata:
|
|
31
|
-
|
|
65
|
+
- MIT
|
|
66
|
+
metadata:
|
|
67
|
+
bug_tracker_uri: https://github.com/Hal9000/marsdate/issues
|
|
68
|
+
changelog_uri: https://github.com/Hal9000/marsdate/blob/master/CHANGELOG.md
|
|
69
|
+
source_code_uri: https://github.com/Hal9000/marsdate
|
|
70
|
+
post_install_message: "\n Success! Run executable 'marsdate' for help.\n "
|
|
32
71
|
rdoc_options: []
|
|
33
72
|
require_paths:
|
|
34
73
|
- lib
|
|
@@ -36,15 +75,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
36
75
|
requirements:
|
|
37
76
|
- - ">="
|
|
38
77
|
- !ruby/object:Gem::Version
|
|
39
|
-
version: '
|
|
78
|
+
version: '2.7'
|
|
40
79
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
41
80
|
requirements:
|
|
42
81
|
- - ">="
|
|
43
82
|
- !ruby/object:Gem::Version
|
|
44
83
|
version: '0'
|
|
45
84
|
requirements: []
|
|
46
|
-
rubygems_version: 3.
|
|
47
|
-
signing_key:
|
|
85
|
+
rubygems_version: 3.6.9
|
|
48
86
|
specification_version: 4
|
|
49
87
|
summary: Date/time library for Mars
|
|
50
88
|
test_files: []
|
data/test/spec/marsdate_spec.rb
DELETED
|
@@ -1,382 +0,0 @@
|
|
|
1
|
-
$: << "lib"
|
|
2
|
-
require 'marsdate'
|
|
3
|
-
|
|
4
|
-
require 'rubygems'
|
|
5
|
-
require 'minitest'
|
|
6
|
-
require 'minitest/spec'
|
|
7
|
-
require 'minitest/autorun'
|
|
8
|
-
|
|
9
|
-
require 'pp'
|
|
10
|
-
|
|
11
|
-
def my_assert(expr)
|
|
12
|
-
if !expr && block_given?
|
|
13
|
-
puts "\n--- DEBUG: "
|
|
14
|
-
yield
|
|
15
|
-
end
|
|
16
|
-
assert(expr)
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def my_assert_equal(e1, e2)
|
|
20
|
-
if e1 != e2 && block_given?
|
|
21
|
-
puts "\n--- DEBUG: "
|
|
22
|
-
yield
|
|
23
|
-
end
|
|
24
|
-
assert_equal(e1, e2)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
## experimenting...
|
|
28
|
-
|
|
29
|
-
describe "Mars date 1/1/1" do
|
|
30
|
-
md = MarsDateTime.new(1,1,1)
|
|
31
|
-
it "should compute backwards to same result" do
|
|
32
|
-
assert_equal([1,1,1,0,0,0],md.ymshms)
|
|
33
|
-
end
|
|
34
|
-
it "should be a Sunday" do
|
|
35
|
-
assert_equal(0,md.dow)
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
describe "Mars date 2/3/4" do
|
|
40
|
-
md = MarsDateTime.new(2,3,4)
|
|
41
|
-
it "should compute backwards to same result" do
|
|
42
|
-
assert_equal([2,3,4,0,0,0],md.ymshms)
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
describe "Mars date 5/4/24" do
|
|
47
|
-
md = MarsDateTime.new(5,4,24)
|
|
48
|
-
it "should compute backwards to same result" do
|
|
49
|
-
assert_equal([5,4,24,0,0,0],md.ymshms)
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
describe "Mars date 1054/20/20" do
|
|
54
|
-
md = MarsDateTime.new(1054,20,20)
|
|
55
|
-
it "should compute backwards to same result" do
|
|
56
|
-
assert_equal([1054,20,20,0,0,0],md.ymshms)
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
describe "Earth date 1/1/22" do
|
|
61
|
-
ed = DateTime.new(1,1,22)
|
|
62
|
-
md = MarsDateTime.new(ed)
|
|
63
|
-
it "should be approximately M-date 1/1/1" do
|
|
64
|
-
assert_equal([1,1,1],md.ymshms[0..2])
|
|
65
|
-
end
|
|
66
|
-
it "should yield a Martian Sunday" do
|
|
67
|
-
assert_equal(md.day_of_week,"Sunday")
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
describe "Earth date May 23, 1961" do
|
|
72
|
-
e = DateTime.new(1961,5,23)
|
|
73
|
-
m = MarsDateTime.new(e)
|
|
74
|
-
it "should yield a Martian Thursday" do
|
|
75
|
-
assert_equal(m.day_of_week,"Thursday")
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
describe "Earth date May 24, 1961" do
|
|
80
|
-
e = DateTime.new(1961,5,24)
|
|
81
|
-
m = MarsDateTime.new(e)
|
|
82
|
-
it "should yield a Martian Friday" do
|
|
83
|
-
assert_equal(m.day_of_week,"Friday")
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
describe "A Martian date/time (y,m,s,h,m,s)" do
|
|
88
|
-
m = MarsDateTime.new(1043,2,15,12,34,45)
|
|
89
|
-
it "should set all its accessors properly" do
|
|
90
|
-
assert_equal(1043,m.myear)
|
|
91
|
-
assert_equal(2,m.month)
|
|
92
|
-
assert_equal(15,m.sol)
|
|
93
|
-
assert_equal(12,m.hr)
|
|
94
|
-
assert_equal(34,m.min)
|
|
95
|
-
assert_equal(45,m.sec)
|
|
96
|
-
assert_equal(4,m.dow)
|
|
97
|
-
assert_equal("Thursday",m.day_of_week)
|
|
98
|
-
assert_equal(43,m.year_sol)
|
|
99
|
-
assert_equal(696715,m.epoch_sol)
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
describe "The 2007 Martian equinox" do
|
|
104
|
-
e = DateTime.new(2007,12,9,17,20,0).new_offset(-5)
|
|
105
|
-
m = MarsDateTime.new(e)
|
|
106
|
-
m11 = MarsDateTime.new(1068,1,1)
|
|
107
|
-
it "should fall on or near 1/1 (MCE)" do
|
|
108
|
-
diff = (m11-m).abs
|
|
109
|
-
flag = diff < 1.0
|
|
110
|
-
assert(flag, "Difference: #{diff}")
|
|
111
|
-
end
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
describe "Constructing without parameters" do
|
|
115
|
-
m = MarsDateTime.new
|
|
116
|
-
e = DateTime.now
|
|
117
|
-
m2e = m.earth_date
|
|
118
|
-
it "should default to today" do
|
|
119
|
-
diff = (e-m2e).abs # m - e doesn't work!
|
|
120
|
-
assert(diff < 1.0)
|
|
121
|
-
end
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
describe "Constructing with a DateTime" do
|
|
125
|
-
it "should convert from Gregorian to MCE" do
|
|
126
|
-
e = DateTime.new(1902,8,12,7,0,0)
|
|
127
|
-
m = MarsDateTime.new(e)
|
|
128
|
-
diff = (m.earth_date - e).abs # days as a float
|
|
129
|
-
x = assert(diff < 1.0)
|
|
130
|
-
end
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
describe "A Martian date/time (933,1,2)" do
|
|
134
|
-
m = MarsDateTime.new(933,1,2)
|
|
135
|
-
it "should set the three obvious accessors properly" do
|
|
136
|
-
assert_equal(933,m.myear)
|
|
137
|
-
assert_equal(1,m.month)
|
|
138
|
-
assert_equal(2,m.sol)
|
|
139
|
-
end
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
describe "A Martian date/time (933,1,1)" do
|
|
143
|
-
m = MarsDateTime.new(933,1,1)
|
|
144
|
-
it "should set the three obvious accessors properly" do
|
|
145
|
-
assert_equal(933,m.myear)
|
|
146
|
-
assert_equal(1,m.month)
|
|
147
|
-
assert_equal(1,m.sol)
|
|
148
|
-
end
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
describe "The Martian date 24/25" do
|
|
152
|
-
describe "in a leap year" do
|
|
153
|
-
year = 1067
|
|
154
|
-
it "should exist" do
|
|
155
|
-
assert( MarsDateTime.leap?(year) )
|
|
156
|
-
MarsDateTime.new(year,24,25) # may raise exception - no #wont_raise
|
|
157
|
-
end
|
|
158
|
-
end
|
|
159
|
-
describe "in a non-leap year" do
|
|
160
|
-
year = 1066
|
|
161
|
-
it "should not exist" do
|
|
162
|
-
assert( ! MarsDateTime.leap?(year) )
|
|
163
|
-
lambda { MarsDateTime.new(year,24,25) }.must_raise(RuntimeError)
|
|
164
|
-
end
|
|
165
|
-
end
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
describe "The earth_date convertor" do
|
|
169
|
-
m = MarsDateTime.new(1,1,1)
|
|
170
|
-
it "should convert to a Gregorian date" do
|
|
171
|
-
e = m.earth_date
|
|
172
|
-
assert_equal(1,e.year)
|
|
173
|
-
assert_equal(1,e.month)
|
|
174
|
-
assert((e.day-22).abs <= 1, "e - 22 = #{e.day - 22}")
|
|
175
|
-
end
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
describe "An Earthly date" do
|
|
179
|
-
e1 = DateTime.new(1961,5,31)
|
|
180
|
-
it "should (approximately) make the conversion roundtrip" do
|
|
181
|
-
m1 = MarsDateTime.new(e1)
|
|
182
|
-
e2 = m1.earth_date
|
|
183
|
-
diff = e2 - e1
|
|
184
|
-
assert(diff.abs <= 0.01, "Difference = #{diff}")
|
|
185
|
-
end
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
describe "A Martian date" do
|
|
189
|
-
m1 = MarsDateTime.new(1067,1,1)
|
|
190
|
-
it "should (approximately) make the conversion roundtrip" do
|
|
191
|
-
e1 = m1.earth_date
|
|
192
|
-
m2 = MarsDateTime.new(e1)
|
|
193
|
-
diff = m2 - m1
|
|
194
|
-
assert(diff.abs < 0.01)
|
|
195
|
-
end
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
describe "An arbitrary Martian date" do
|
|
199
|
-
m1 = MarsDateTime.new(1069,15,24)
|
|
200
|
-
m2 = MarsDateTime.new(933,6,4)
|
|
201
|
-
m3 = MarsDateTime.new(1055,14,1)
|
|
202
|
-
it "should format well with strftime" do
|
|
203
|
-
assert_equal("Mon",m1.strftime("%a"))
|
|
204
|
-
assert_equal("Monday",m1.strftime("%A"))
|
|
205
|
-
assert_equal("Aug",m1.strftime("%b"))
|
|
206
|
-
assert_equal("M-August",m1.strftime("%B"))
|
|
207
|
-
assert_equal("24",m1.strftime("%d"))
|
|
208
|
-
assert_equal("24",m1.strftime("%e"))
|
|
209
|
-
assert_equal("1069-15-24",m1.strftime("%F"))
|
|
210
|
-
assert_equal("416",m1.strftime("%j"))
|
|
211
|
-
assert_equal("15",m1.strftime("%m"))
|
|
212
|
-
assert_equal("0",m1.strftime("%s"))
|
|
213
|
-
assert_equal("2",m1.strftime("%u"))
|
|
214
|
-
assert_equal("60",m1.strftime("%U"))
|
|
215
|
-
assert_equal("1",m1.strftime("%w"))
|
|
216
|
-
assert_equal("1069/15/24",m1.strftime("%x"))
|
|
217
|
-
assert_equal("1069",m1.strftime("%Y"))
|
|
218
|
-
assert_equal("\n",m1.strftime("%n"))
|
|
219
|
-
assert_equal("\t",m1.strftime("%t"))
|
|
220
|
-
assert_equal("%",m1.strftime("%%"))
|
|
221
|
-
|
|
222
|
-
assert_equal("Wed",m2.strftime("%a"))
|
|
223
|
-
assert_equal("Wednesday",m2.strftime("%A"))
|
|
224
|
-
assert_equal("Leo",m2.strftime("%b"))
|
|
225
|
-
assert_equal("Leo",m2.strftime("%B"))
|
|
226
|
-
assert_equal("04",m2.strftime("%d"))
|
|
227
|
-
assert_equal(" 4",m2.strftime("%e"))
|
|
228
|
-
assert_equal("933-06-04",m2.strftime("%F"))
|
|
229
|
-
assert_equal("144",m2.strftime("%j"))
|
|
230
|
-
assert_equal("06",m2.strftime("%m"))
|
|
231
|
-
assert_equal("0",m2.strftime("%s"))
|
|
232
|
-
assert_equal("4",m2.strftime("%u"))
|
|
233
|
-
assert_equal("21",m2.strftime("%U"))
|
|
234
|
-
assert_equal("3",m2.strftime("%w"))
|
|
235
|
-
assert_equal("933/06/04",m2.strftime("%x"))
|
|
236
|
-
assert_equal("933",m2.strftime("%Y"))
|
|
237
|
-
|
|
238
|
-
assert_equal("Sag",m3.strftime("%b"))
|
|
239
|
-
assert_equal("Sagittarius",m3.strftime("%B"))
|
|
240
|
-
end
|
|
241
|
-
end
|
|
242
|
-
|
|
243
|
-
describe "An Earthly date with h:m:s" do
|
|
244
|
-
e1 = DateTime.new(1976,7,4,16,30,0) # July 4, 1976 16:30
|
|
245
|
-
m1 = MarsDateTime.new(e1)
|
|
246
|
-
it "should make the conversion roundtrip" do
|
|
247
|
-
30.times do
|
|
248
|
-
m1 = MarsDateTime.new(e1)
|
|
249
|
-
e2 = m1.earth_date
|
|
250
|
-
diff = e2 - e1
|
|
251
|
-
assert(diff.abs <= 0.01) { STDERR.puts " diff = #{diff}" }
|
|
252
|
-
e1 += 1
|
|
253
|
-
end
|
|
254
|
-
end
|
|
255
|
-
end
|
|
256
|
-
|
|
257
|
-
describe "Martian dates" do
|
|
258
|
-
m1 = MarsDateTime.new(1068,14,22)
|
|
259
|
-
m2 = MarsDateTime.new(1068,14,21)
|
|
260
|
-
e1 = DateTime.new(2002,4,19)
|
|
261
|
-
e2 = DateTime.new(2012,9,29)
|
|
262
|
-
it "should compare with each other" do
|
|
263
|
-
assert(m1 > m2)
|
|
264
|
-
assert(m2 < m1)
|
|
265
|
-
end
|
|
266
|
-
it "should compare with Earth dates" do
|
|
267
|
-
assert(m1 > e1)
|
|
268
|
-
assert(m2 < e2)
|
|
269
|
-
end
|
|
270
|
-
it "should honor equality (within roundoff)" do
|
|
271
|
-
assert(m1 == m1)
|
|
272
|
-
assert(m1 != m2)
|
|
273
|
-
end
|
|
274
|
-
end
|
|
275
|
-
|
|
276
|
-
describe "The 'now' and 'today' class methods" do
|
|
277
|
-
t1 = MarsDateTime.now
|
|
278
|
-
t0 = MarsDateTime.today
|
|
279
|
-
it "should be less than a day apart" do
|
|
280
|
-
diff = t1 - t0
|
|
281
|
-
assert(diff < 1.0)
|
|
282
|
-
end
|
|
283
|
-
end
|
|
284
|
-
|
|
285
|
-
describe "In M-year 1043, each month" do
|
|
286
|
-
md = (1..24).to_a.map {|mm| MarsDateTime.new(1043,mm,1) }
|
|
287
|
-
it "should start on a Thursday" do
|
|
288
|
-
md.each {|m| assert(m.day_of_week == "Thursday") }
|
|
289
|
-
end
|
|
290
|
-
end
|
|
291
|
-
|
|
292
|
-
describe "Converting 1961/5/31 to Martian" do
|
|
293
|
-
e = DateTime.new(1961,5,31)
|
|
294
|
-
m = MarsDateTime.new(e)
|
|
295
|
-
it "should yield Friday M-April 9, 1043 MCE" do
|
|
296
|
-
assert(m.year == 1043, "bad year: #{m.year}")
|
|
297
|
-
assert(m.month == 7, "bad month: #{m.month}")
|
|
298
|
-
assert(m.sol == 9, "bad sol: #{m.sol}")
|
|
299
|
-
end
|
|
300
|
-
it "should give a Martian Saturday" do
|
|
301
|
-
assert(m.day_of_week == "Friday", "got: #{m.day_of_week}")
|
|
302
|
-
end
|
|
303
|
-
end
|
|
304
|
-
|
|
305
|
-
describe "The 1609 Martian equinox" do
|
|
306
|
-
e = DateTime.new(1609,3,12).new_offset(-5)
|
|
307
|
-
m = MarsDateTime.new(e)
|
|
308
|
-
m11 = MarsDateTime.new(856,1,1)
|
|
309
|
-
it "should fall on or near 1/1 (MCE)" do
|
|
310
|
-
diff = (m11-m).abs
|
|
311
|
-
assert(diff < 1.0, "Difference = #{diff}")
|
|
312
|
-
end
|
|
313
|
-
end
|
|
314
|
-
|
|
315
|
-
describe "The 1902 Martian equinox" do
|
|
316
|
-
e = DateTime.new(1902,8,12,7,0,0).new_offset(-5)
|
|
317
|
-
m = MarsDateTime.new(e)
|
|
318
|
-
m11 = MarsDateTime.new(1012,1,1)
|
|
319
|
-
it "should fall on or near 1/1 (MCE)" do
|
|
320
|
-
diff = (m11-m).abs
|
|
321
|
-
assert(diff < 1.0, "Difference: #{diff}")
|
|
322
|
-
end
|
|
323
|
-
end
|
|
324
|
-
|
|
325
|
-
describe "A Martian date" do
|
|
326
|
-
puts "***** Entering problem test..."
|
|
327
|
-
m = MarsDateTime.new(1068,1,1)
|
|
328
|
-
p m
|
|
329
|
-
describe "plus 7 days" do
|
|
330
|
-
m2 = m + 7
|
|
331
|
-
p m2
|
|
332
|
-
it "should be the same day of the week" do
|
|
333
|
-
assert_equal(m.day_of_week, m2.day_of_week)
|
|
334
|
-
end
|
|
335
|
-
end
|
|
336
|
-
describe "plus 14 days" do
|
|
337
|
-
m3 = m + 14
|
|
338
|
-
p m3
|
|
339
|
-
it "should be the same day of the week" do
|
|
340
|
-
assert_equal(m.day_of_week, m3.day_of_week)
|
|
341
|
-
end
|
|
342
|
-
end
|
|
343
|
-
describe "plus 21 days" do
|
|
344
|
-
m4 = m + 21
|
|
345
|
-
p m4
|
|
346
|
-
it "should be the same day of the week" do
|
|
347
|
-
assert_equal(m.day_of_week, m4.day_of_week)
|
|
348
|
-
end
|
|
349
|
-
end
|
|
350
|
-
puts "***** Exiting problem test"
|
|
351
|
-
end
|
|
352
|
-
|
|
353
|
-
describe "Martian April 1, 1043" do
|
|
354
|
-
m = MarsDateTime.new(1043,7,1)
|
|
355
|
-
it "should be a Thursday" do
|
|
356
|
-
assert_equal(m.day_of_week,"Thursday")
|
|
357
|
-
end
|
|
358
|
-
end
|
|
359
|
-
|
|
360
|
-
describe "A Martian date" do
|
|
361
|
-
md = MarsDateTime.new(1062,20,20)
|
|
362
|
-
m2 = MarsDateTime.new(1062,20,17)
|
|
363
|
-
it "should allow subtraction of another date" do
|
|
364
|
-
m = md - m2
|
|
365
|
-
assert( (m - 3.0) < 0.01) # sols
|
|
366
|
-
end
|
|
367
|
-
it "should allow subtraction of an Earth date" do
|
|
368
|
-
e = DateTime.new(1998, 3, 12, 16, 45, 0)
|
|
369
|
-
m = md - e
|
|
370
|
-
assert( (m - 3.0) < 0.01) # sols
|
|
371
|
-
end
|
|
372
|
-
it "should allow subtraction of a Fixnum" do
|
|
373
|
-
m = md - 3 # sols
|
|
374
|
-
assert( (m - m2) < 0.01)
|
|
375
|
-
end
|
|
376
|
-
it "should allow subtraction of a Float" do
|
|
377
|
-
m = md - 3.0 # sols
|
|
378
|
-
assert( (m - m2) < 0.01)
|
|
379
|
-
end
|
|
380
|
-
end
|
|
381
|
-
|
|
382
|
-
|