PageRenderTime 59ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/test/date/test_date_base.rb

http://github.com/ruby/ruby
Ruby | 443 lines | 369 code | 45 blank | 29 comment | 19 complexity | 59cc824f1b78ed93f95117ff31243042 MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause, AGPL-3.0
  1. # frozen_string_literal: false
  2. require 'test/unit'
  3. require 'date'
  4. begin
  5. require 'calendar'
  6. include Calendar
  7. rescue LoadError
  8. end
  9. class TestDateBase < Test::Unit::TestCase
  10. def setup
  11. if defined?(Calendar)
  12. @from ||= julian_day_number_from_absolute(absolute_from_julian(1, 1, 1601))
  13. @to ||= julian_day_number_from_absolute(absolute_from_julian(12, 31, 2400))
  14. @from4t ||= julian_day_number_from_absolute(absolute_from_julian(1, 1, 1970))
  15. @to4t ||= julian_day_number_from_absolute(absolute_from_julian(12, 31, 2037))
  16. end
  17. end
  18. def test__inf
  19. assert_equal(0, Date::Infinity.new(-1) <=> Date::Infinity.new(-1))
  20. assert_equal(-1, Date::Infinity.new(-1) <=> Date::Infinity.new(+1))
  21. assert_equal(-1, Date::Infinity.new(-1) <=> 0)
  22. assert_equal(1, Date::Infinity.new(+1) <=> Date::Infinity.new(-1))
  23. assert_equal(0, Date::Infinity.new(+1) <=> Date::Infinity.new(+1))
  24. assert_equal(1, Date::Infinity.new(+1) <=> 0)
  25. assert_equal(1, 0 <=> Date::Infinity.new(-1))
  26. assert_equal(-1, 0 <=> Date::Infinity.new(+1))
  27. assert_equal(0, 0 <=> 0)
  28. assert_equal(0, Date::ITALY <=> Date::ITALY)
  29. assert_equal(-1, Date::ITALY <=> Date::ENGLAND)
  30. assert_equal(-1, Date::ITALY <=> Date::JULIAN)
  31. assert_equal(1, Date::ITALY <=> Date::GREGORIAN)
  32. assert_equal(1, Date::ENGLAND <=> Date::ITALY)
  33. assert_equal(0, Date::ENGLAND <=> Date::ENGLAND)
  34. assert_equal(-1, Date::ENGLAND <=> Date::JULIAN)
  35. assert_equal(1, Date::ENGLAND <=> Date::GREGORIAN)
  36. assert_equal(1, Date::JULIAN <=> Date::ITALY)
  37. assert_equal(1, Date::JULIAN <=> Date::ENGLAND)
  38. assert_equal(0, Date::JULIAN <=> Date::JULIAN)
  39. assert_equal(1, Date::JULIAN <=> Date::GREGORIAN)
  40. assert_equal(-1, Date::GREGORIAN <=> Date::ITALY)
  41. assert_equal(-1, Date::GREGORIAN <=> Date::ENGLAND)
  42. assert_equal(-1, Date::GREGORIAN <=> Date::JULIAN)
  43. assert_equal(0, Date::GREGORIAN <=> Date::GREGORIAN)
  44. end
  45. def test_ordinal__julian
  46. skip unless defined?(Calendar)
  47. for j in @from..@to
  48. m, d, y = julian_from_absolute(absolute_from_julian_day_number(j))
  49. j0 = julian_day_number_from_absolute(absolute_from_julian(12, 31, y - 1))
  50. j2 = julian_day_number_from_absolute(absolute_from_julian(m, d, y))
  51. assert_equal(j, j2)
  52. oy, od = Date.__send__(:jd_to_ordinal, j, Date::JULIAN)
  53. assert_equal(y, oy)
  54. assert_equal(j2 - j0, od)
  55. oj = Date.__send__(:ordinal_to_jd, oy, od, Date::JULIAN)
  56. assert_equal(j, oj)
  57. end
  58. end
  59. def test_ordinal__gregorian
  60. skip unless defined?(Calendar)
  61. for j in @from..@to
  62. m, d, y = gregorian_from_absolute(absolute_from_julian_day_number(j))
  63. j0 =
  64. julian_day_number_from_absolute(absolute_from_gregorian(12, 31, y - 1))
  65. j2 = julian_day_number_from_absolute(absolute_from_gregorian(m, d, y))
  66. assert_equal(j, j2)
  67. oy, od = Date.__send__(:jd_to_ordinal, j, Date::GREGORIAN)
  68. assert_equal(y, oy)
  69. assert_equal(j2 - j0, od)
  70. oj = Date.__send__(:ordinal_to_jd, oy, od, Date::GREGORIAN)
  71. assert_equal(j, oj)
  72. end
  73. end
  74. def test_civil__julian
  75. skip unless defined?(Calendar)
  76. for j in @from..@to
  77. m, d, y = julian_from_absolute(absolute_from_julian_day_number(j))
  78. j2 = julian_day_number_from_absolute(absolute_from_julian(m, d, y))
  79. assert_equal(j2, j)
  80. cy, cm, cd = Date.__send__(:jd_to_civil, j, Date::JULIAN)
  81. assert_equal(y, cy)
  82. assert_equal(m, cm)
  83. assert_equal(d, cd)
  84. cj = Date.__send__(:civil_to_jd, cy, cm, cd, Date::JULIAN)
  85. assert_equal(j, cj)
  86. end
  87. end
  88. def test_civil__gregorian
  89. skip unless defined?(Calendar)
  90. for j in @from..@to
  91. m, d, y = gregorian_from_absolute(absolute_from_julian_day_number(j))
  92. j2 = julian_day_number_from_absolute(absolute_from_gregorian(m, d, y))
  93. assert_equal(j2, j)
  94. cy, cm, cd = Date.__send__(:jd_to_civil, j, Date::GREGORIAN)
  95. assert_equal(y, cy)
  96. assert_equal(m, cm)
  97. assert_equal(d, cd)
  98. cj = Date.__send__(:civil_to_jd, cy, cm, cd, Date::GREGORIAN)
  99. assert_equal(j, cj)
  100. end
  101. end
  102. def test_commercial__gregorian
  103. skip unless defined?(Calendar)
  104. for j in @from..@to
  105. w, d, y = iso_from_absolute(absolute_from_julian_day_number(j))
  106. j2 = julian_day_number_from_absolute(absolute_from_iso(w, d, y))
  107. assert_equal(j2, j)
  108. cy, cw, cd = Date.__send__(:jd_to_commercial, j, Date::GREGORIAN)
  109. assert_equal(y, cy)
  110. assert_equal(w, cw)
  111. assert_equal(d, cd)
  112. cj = Date.__send__(:commercial_to_jd, cy, cw, cd, Date::GREGORIAN)
  113. assert_equal(j, cj)
  114. end
  115. end
  116. def test_weeknum
  117. skip unless defined?(Calendar)
  118. for j in @from..@to
  119. for k in 0..1
  120. wy, ww, wd = Date.__send__(:jd_to_weeknum, j, k, Date::GREGORIAN)
  121. wj = Date.__send__(:weeknum_to_jd, wy, ww, wd, k, Date::GREGORIAN)
  122. assert_equal(j, wj)
  123. end
  124. end
  125. end
  126. def test_weeknum__2
  127. skip unless defined?(Calendar)
  128. for j in @from4t..@to4t
  129. d = Date.jd(j)
  130. t = Time.mktime(d.year, d.mon, d.mday)
  131. [
  132. '%Y %U %w',
  133. '%Y %U %u',
  134. '%Y %W %w',
  135. '%Y %W %u'
  136. ].each do |fmt|
  137. s = t.strftime(fmt)
  138. d2 = Date.strptime(s, fmt)
  139. assert_equal(j, d2.jd)
  140. end
  141. end
  142. end
  143. def test_nth_kday
  144. skip unless defined?(Calendar)
  145. skip unless (Date.respond_to?(:nth_kday_to_jd, true) &&
  146. Date.respond_to?(:jd_to_nth_kday, true))
  147. for y in 1601..2401
  148. for m in 1..12
  149. for n in -5..5
  150. next if n == 0
  151. for k in 0..6
  152. j = julian_day_number_from_absolute(Nth_Kday(n, k, m, y))
  153. j2 = Date.__send__(:nth_kday_to_jd, y, m, n, k, Date::GREGORIAN)
  154. assert_equal(j, j2)
  155. d1 = Date.__send__(:jd_to_nth_kday, j2, Date::GREGORIAN)
  156. j3 = Date.__send__(:nth_kday_to_jd, *d1)
  157. assert_equal(j, j3)
  158. end
  159. end
  160. end
  161. end
  162. end
  163. def test_jd
  164. assert_equal(1 << 33, Date.jd(1 << 33).jd)
  165. end
  166. def test_mjd
  167. skip unless Date.respond_to?(:mjd_to_jd, true)
  168. jd = Date.__send__(:mjd_to_jd, 51321)
  169. mjd = Date.__send__(:jd_to_mjd, jd)
  170. assert_equal(51321, mjd)
  171. end
  172. def test_ld
  173. skip unless Date.respond_to?(:ld_to_jd, true)
  174. jd = Date.__send__(:ld_to_jd, 152162)
  175. ld = Date.__send__(:jd_to_ld, jd)
  176. assert_equal(152162, ld)
  177. end
  178. def test_wday
  179. skip unless Date.respond_to?(:jd_to_wday, true)
  180. assert_equal(4, Date.__send__(:jd_to_wday, 3))
  181. assert_equal(3, Date.__send__(:jd_to_wday, 2))
  182. assert_equal(2, Date.__send__(:jd_to_wday, 1))
  183. assert_equal(1, Date.__send__(:jd_to_wday, 0))
  184. assert_equal(0, Date.__send__(:jd_to_wday, -1))
  185. assert_equal(6, Date.__send__(:jd_to_wday, -2))
  186. assert_equal(5, Date.__send__(:jd_to_wday, -3))
  187. end
  188. def test_leap?
  189. assert_equal(true, Date.julian_leap?(1900))
  190. assert_equal(false, Date.julian_leap?(1999))
  191. assert_equal(true, Date.julian_leap?(2000))
  192. assert_equal(false, Date.gregorian_leap?(1900))
  193. assert_equal(false, Date.gregorian_leap?(1999))
  194. assert_equal(true, Date.gregorian_leap?(2000))
  195. assert_equal(Date.leap?(1990), Date.gregorian_leap?(1900))
  196. assert_equal(Date.leap?(1999), Date.gregorian_leap?(1999))
  197. assert_equal(Date.leap?(2000), Date.gregorian_leap?(2000))
  198. end
  199. def test_valid_jd
  200. valid_jd_p = :_valid_jd?
  201. skip unless Date.respond_to?(valid_jd_p, true)
  202. assert_equal(-1, Date.__send__(valid_jd_p, -1))
  203. assert_equal(0, Date.__send__(valid_jd_p, 0))
  204. assert_equal(1, Date.__send__(valid_jd_p, 1))
  205. assert_equal(2452348, Date.__send__(valid_jd_p, 2452348))
  206. end
  207. def test_valid_ordinal
  208. valid_ordinal_p = :_valid_ordinal?
  209. skip unless Date.respond_to?(valid_ordinal_p, true)
  210. assert_nil(Date.__send__(valid_ordinal_p, 1999,366))
  211. assert_equal(2451910, Date.__send__(valid_ordinal_p, 2000,366))
  212. assert_nil(Date.__send__(valid_ordinal_p, 1999,-366))
  213. assert_equal(2451545, Date.__send__(valid_ordinal_p, 2000,-366))
  214. assert_equal(2452275, Date.__send__(valid_ordinal_p, 2001,365))
  215. assert_nil(Date.__send__(valid_ordinal_p, 2001,366))
  216. assert_equal(Date.__send__(valid_ordinal_p, 2001,1),
  217. Date.__send__(valid_ordinal_p, 2001,-365))
  218. assert_nil(Date.__send__(valid_ordinal_p, 2001,-366))
  219. assert_equal(2452348, Date.__send__(valid_ordinal_p, 2002,73))
  220. end
  221. def test_valid_ordinal__edge
  222. valid_ordinal_p = :_valid_ordinal?
  223. skip unless Date.respond_to?(valid_ordinal_p, true)
  224. (1601..2400).each do |y|
  225. d = if Date.leap?(y) then 366 else 365 end
  226. assert_not_nil(Date.__send__(valid_ordinal_p, y,d))
  227. assert_nil(Date.__send__(valid_ordinal_p, y,d + 1))
  228. assert_not_nil(Date.__send__(valid_ordinal_p, y,-d))
  229. assert_nil(Date.__send__(valid_ordinal_p, y,-(d + 1)))
  230. end
  231. end
  232. # October 1582
  233. # S M Tu W Th F S
  234. # 274 275 276 277 288 289
  235. # 290 291 292 293 294 295 296
  236. # 297 298 299 300 301 302 303
  237. # 304
  238. # October 1582
  239. # S M Tu W Th F S
  240. # -92 -91 -90 -89 -78 -77
  241. # -76 -75 -74 -73 -72 -71 -70
  242. # -69 -68 -67 -66 -65 -64 -63
  243. # -62
  244. def test_valid_ordinal__italy
  245. valid_ordinal_p = :_valid_ordinal?
  246. skip unless Date.respond_to?(valid_ordinal_p, true)
  247. (1..355).each do |d|
  248. assert_not_nil(Date.__send__(valid_ordinal_p, 1582,d,Date::ITALY))
  249. end
  250. (356..365).each do |d|
  251. assert_nil(Date.__send__(valid_ordinal_p, 1582,d,Date::ITALY))
  252. end
  253. end
  254. # September 1752
  255. # S M Tu W Th F S
  256. # 245 246 258 259 260
  257. # 261 262 263 264 265 266 267
  258. # 268 269 270 271 272 273 274
  259. def test_valid_ordinal__england
  260. valid_ordinal_p = :_valid_ordinal?
  261. skip unless Date.respond_to?(valid_ordinal_p, true)
  262. (1..355).each do |d|
  263. assert_not_nil(Date.__send__(valid_ordinal_p, 1752,d,Date::ENGLAND))
  264. end
  265. (356..366).each do |d|
  266. assert_nil(Date.__send__(valid_ordinal_p, 1752,d,Date::ENGLAND))
  267. end
  268. end
  269. def test_valid_civil
  270. valid_civil_p = :_valid_civil?
  271. skip unless Date.respond_to?(valid_civil_p, true)
  272. assert_nil(Date.__send__(valid_civil_p, 1999,2,29))
  273. assert_equal(2451604, Date.__send__(valid_civil_p, 2000,2,29))
  274. assert_nil(Date.__send__(valid_civil_p, 1999,2,-29))
  275. assert_equal(2451576, Date.__send__(valid_civil_p, 2000,2,-29))
  276. assert_equal(2451941, Date.__send__(valid_civil_p, 2001,1,31))
  277. assert_nil(Date.__send__(valid_civil_p, 2001,1,32))
  278. assert_equal(Date.__send__(valid_civil_p, 2001,1,1),
  279. Date.__send__(valid_civil_p, 2001,1,-31))
  280. assert_nil(Date.__send__(valid_civil_p, 2001,1,-32))
  281. assert_equal(2452348, Date.__send__(valid_civil_p, 2002,3,14))
  282. assert_nil(Date.__send__(valid_civil_p, 2010,-13,-1))
  283. end
  284. def test_valid_civil__edge
  285. valid_civil_p = :_valid_civil?
  286. skip unless Date.respond_to?(valid_civil_p, true)
  287. (1601..2400).each do |y|
  288. d = if Date.leap?(y) then 29 else 28 end
  289. assert_not_nil(Date.__send__(valid_civil_p, y,2,d))
  290. assert_nil(Date.__send__(valid_civil_p, y,2,d + 1))
  291. assert_not_nil(Date.__send__(valid_civil_p, y,2,-d))
  292. assert_nil(Date.__send__(valid_civil_p, y,2,-(d + 1)))
  293. end
  294. end
  295. # October 1582
  296. # S M Tu W Th F S
  297. # 1 2 3 4 15 16
  298. # 17 18 19 20 21 22 23
  299. # 24 25 26 27 28 29 30
  300. # 31
  301. def test_valid_civil__italy
  302. valid_civil_p = :_valid_civil?
  303. skip unless Date.respond_to?(valid_civil_p, true)
  304. (1..4).each do |d|
  305. assert_not_nil(Date.__send__(valid_civil_p, 1582,10,d,Date::ITALY))
  306. end
  307. (5..14).each do |d|
  308. assert_nil(Date.__send__(valid_civil_p, 1582,10,d,Date::ITALY))
  309. end
  310. (15..31).each do |d|
  311. assert_not_nil(Date.__send__(valid_civil_p, 1582,10,d,Date::ITALY))
  312. end
  313. (32..100).each do |d|
  314. assert_nil(Date.__send__(valid_civil_p, 1582,10,d,Date::ITALY))
  315. end
  316. (-31..-22).each do |d|
  317. assert_nil(Date.__send__(valid_civil_p, 1582,10,d,Date::ITALY))
  318. end
  319. (-21..-1).each do |d|
  320. assert_not_nil(Date.__send__(valid_civil_p, 1582,10,d,Date::ITALY))
  321. end
  322. end
  323. # September 1752
  324. # S M Tu W Th F S
  325. # 1 2 14 15 16
  326. # 17 18 19 20 21 22 23
  327. # 24 25 26 27 28 29 30
  328. def test_valid_civil__england
  329. valid_civil_p = :_valid_civil?
  330. skip unless Date.respond_to?(valid_civil_p, true)
  331. (1..2).each do |d|
  332. assert_not_nil(Date.__send__(valid_civil_p, 1752,9,d,Date::ENGLAND))
  333. end
  334. (3..13).each do |d|
  335. assert_nil(Date.__send__(valid_civil_p, 1752,9,d,Date::ENGLAND))
  336. end
  337. (14..30).each do |d|
  338. assert_not_nil(Date.__send__(valid_civil_p, 1752,9,d,Date::ENGLAND))
  339. end
  340. (31..100).each do |d|
  341. assert_nil(Date.__send__(valid_civil_p, 1752,9,d,Date::ENGLAND))
  342. end
  343. (-31..-20).each do |d|
  344. assert_nil(Date.__send__(valid_civil_p, 1752,9,d,Date::ENGLAND))
  345. end
  346. (-19..-1).each do |d|
  347. assert_not_nil(Date.__send__(valid_civil_p, 1752,9,d,Date::ENGLAND))
  348. end
  349. end
  350. def test_valid_commercial
  351. valid_commercial_p = :_valid_commercial?
  352. skip unless Date.respond_to?(valid_commercial_p, true)
  353. assert_nil(Date.__send__(valid_commercial_p, 1999,53,1))
  354. assert_equal(2453367, Date.__send__(valid_commercial_p, 2004,53,1))
  355. assert_nil(Date.__send__(valid_commercial_p, 1999,-53,-1))
  356. assert_equal(2453009, Date.__send__(valid_commercial_p, 2004,-53,-1))
  357. assert_equal(2452348, Date.__send__(valid_commercial_p, 2002,11,4))
  358. end
  359. def test_valid_weeknum
  360. valid_weeknum_p = :_valid_weeknum?
  361. skip unless Date.respond_to?(valid_weeknum_p, true)
  362. assert_nil(Date.__send__(valid_weeknum_p, 1999,53,0, 0))
  363. assert_equal(2454101, Date.__send__(valid_weeknum_p, 2006,53,0, 0))
  364. assert_nil(Date.__send__(valid_weeknum_p, 1999,-53,-1, 0))
  365. assert_equal(2453743, Date.__send__(valid_weeknum_p, 2006,-53,-1, 0))
  366. assert_equal(2452355, Date.__send__(valid_weeknum_p, 2002,11,4, 0))
  367. assert_nil(Date.__send__(valid_weeknum_p, 1999,53,0, 1))
  368. assert_equal(2454101, Date.__send__(valid_weeknum_p, 2006,52,6, 1))
  369. assert_nil(Date.__send__(valid_weeknum_p, 1999,-53,-1, 1))
  370. assert_equal(2453743, Date.__send__(valid_weeknum_p, 2006,-52,-2, 1))
  371. assert_equal(2452355, Date.__send__(valid_weeknum_p, 2002,11,3, 1))
  372. end
  373. def test_valid_nth_kday
  374. valid_nth_kday_p = :_valid_nth_kday?
  375. skip unless Date.respond_to?(valid_nth_kday_p, true)
  376. assert_nil(Date.__send__(valid_nth_kday_p, 1992,2, 5,0))
  377. assert_equal(2448682, Date.__send__(valid_nth_kday_p, 1992,2, 5,6))
  378. assert_equal(2448682, Date.__send__(valid_nth_kday_p, 1992,2, 5,-1))
  379. assert_equal(2448682, Date.__send__(valid_nth_kday_p, 1992,2, -1,6))
  380. assert_equal(2448682, Date.__send__(valid_nth_kday_p, 1992,2, -1,-1))
  381. end
  382. def test_valid_time
  383. valid_time_p = :_valid_time?
  384. skip unless Date.respond_to?(valid_time_p, true)
  385. assert_equal(Rational(0), DateTime.__send__(valid_time_p, 0,0,0))
  386. assert_nil(DateTime.__send__(valid_time_p, 25,59,59))
  387. assert_nil(DateTime.__send__(valid_time_p, 23,60,59))
  388. assert_nil(DateTime.__send__(valid_time_p, 23,59,60))
  389. assert_equal(Rational(86399, 86400),
  390. DateTime.__send__(valid_time_p, 23,59,59))
  391. assert_equal(Rational(86399, 86400),
  392. DateTime.__send__(valid_time_p, -1,-1,-1))
  393. assert_equal(Rational(1), DateTime.__send__(valid_time_p, 24,0,0))
  394. assert_nil(DateTime.__send__(valid_time_p, 24,0,1))
  395. assert_nil(DateTime.__send__(valid_time_p, 24,1,0))
  396. assert_nil(DateTime.__send__(valid_time_p, 24,1,1))
  397. end
  398. end