PageRenderTime 49ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/activesupport/test/core_ext/numeric_ext_test.rb

https://bitbucket.org/druly/rails_cherry_pick
Ruby | 188 lines | 163 code | 20 blank | 5 comment | 0 complexity | 60da1cb49f5f0a35721a84dad695f857 MD5 | raw file
  1. require 'abstract_unit'
  2. require 'active_support/time'
  3. require 'active_support/core_ext/numeric'
  4. require 'active_support/core_ext/integer'
  5. class NumericExtTimeAndDateTimeTest < Test::Unit::TestCase
  6. def setup
  7. @now = Time.local(2005,2,10,15,30,45)
  8. @dtnow = DateTime.civil(2005,2,10,15,30,45)
  9. @seconds = {
  10. 1.minute => 60,
  11. 10.minutes => 600,
  12. 1.hour + 15.minutes => 4500,
  13. 2.days + 4.hours + 30.minutes => 189000,
  14. 5.years + 1.month + 1.fortnight => 161589600
  15. }
  16. end
  17. def test_units
  18. @seconds.each do |actual, expected|
  19. assert_equal expected, actual
  20. end
  21. end
  22. def test_intervals
  23. @seconds.values.each do |seconds|
  24. assert_equal seconds.since(@now), @now + seconds
  25. assert_equal seconds.until(@now), @now - seconds
  26. end
  27. end
  28. # Test intervals based from Time.now
  29. def test_now
  30. @seconds.values.each do |seconds|
  31. now = Time.now
  32. assert seconds.ago >= now - seconds
  33. now = Time.now
  34. assert seconds.from_now >= now + seconds
  35. end
  36. end
  37. def test_irregular_durations
  38. assert_equal @now.advance(:days => 3000), 3000.days.since(@now)
  39. assert_equal @now.advance(:months => 1), 1.month.since(@now)
  40. assert_equal @now.advance(:months => -1), 1.month.until(@now)
  41. assert_equal @now.advance(:years => 20), 20.years.since(@now)
  42. assert_equal @dtnow.advance(:days => 3000), 3000.days.since(@dtnow)
  43. assert_equal @dtnow.advance(:months => 1), 1.month.since(@dtnow)
  44. assert_equal @dtnow.advance(:months => -1), 1.month.until(@dtnow)
  45. assert_equal @dtnow.advance(:years => 20), 20.years.since(@dtnow)
  46. end
  47. def test_duration_addition
  48. assert_equal @now.advance(:days => 1).advance(:months => 1), (1.day + 1.month).since(@now)
  49. assert_equal @now.advance(:days => 7), (1.week + 5.seconds - 5.seconds).since(@now)
  50. assert_equal @now.advance(:years => 2), (4.years - 2.years).since(@now)
  51. assert_equal @dtnow.advance(:days => 1).advance(:months => 1), (1.day + 1.month).since(@dtnow)
  52. assert_equal @dtnow.advance(:days => 7), (1.week + 5.seconds - 5.seconds).since(@dtnow)
  53. assert_equal @dtnow.advance(:years => 2), (4.years - 2.years).since(@dtnow)
  54. end
  55. def test_time_plus_duration
  56. assert_equal @now + 8, @now + 8.seconds
  57. assert_equal @now + 22.9, @now + 22.9.seconds
  58. assert_equal @now.advance(:days => 15), @now + 15.days
  59. assert_equal @now.advance(:months => 1), @now + 1.month
  60. assert_equal @dtnow.since(8), @dtnow + 8.seconds
  61. assert_equal @dtnow.since(22.9), @dtnow + 22.9.seconds
  62. assert_equal @dtnow.advance(:days => 15), @dtnow + 15.days
  63. assert_equal @dtnow.advance(:months => 1), @dtnow + 1.month
  64. end
  65. def test_chaining_duration_operations
  66. assert_equal @now.advance(:days => 2).advance(:months => -3), @now + 2.days - 3.months
  67. assert_equal @now.advance(:days => 1).advance(:months => 2), @now + 1.day + 2.months
  68. assert_equal @dtnow.advance(:days => 2).advance(:months => -3), @dtnow + 2.days - 3.months
  69. assert_equal @dtnow.advance(:days => 1).advance(:months => 2), @dtnow + 1.day + 2.months
  70. end
  71. def test_duration_after_convertion_is_no_longer_accurate
  72. assert_equal 30.days.to_i.since(@now), 1.month.to_i.since(@now)
  73. assert_equal 365.25.days.to_f.since(@now), 1.year.to_f.since(@now)
  74. assert_equal 30.days.to_i.since(@dtnow), 1.month.to_i.since(@dtnow)
  75. assert_equal 365.25.days.to_f.since(@dtnow), 1.year.to_f.since(@dtnow)
  76. end
  77. def test_add_one_year_to_leap_day
  78. assert_equal Time.utc(2005,2,28,15,15,10), Time.utc(2004,2,29,15,15,10) + 1.year
  79. assert_equal DateTime.civil(2005,2,28,15,15,10), DateTime.civil(2004,2,29,15,15,10) + 1.year
  80. end
  81. def test_since_and_ago_anchored_to_time_now_when_time_zone_is_not_set
  82. Time.zone = nil
  83. with_env_tz 'US/Eastern' do
  84. Time.stubs(:now).returns Time.local(2000)
  85. # since
  86. assert_equal false, 5.since.is_a?(ActiveSupport::TimeWithZone)
  87. assert_equal Time.local(2000,1,1,0,0,5), 5.since
  88. # ago
  89. assert_equal false, 5.ago.is_a?(ActiveSupport::TimeWithZone)
  90. assert_equal Time.local(1999,12,31,23,59,55), 5.ago
  91. end
  92. end
  93. def test_since_and_ago_anchored_to_time_zone_now_when_time_zone_is_set
  94. Time.zone = ActiveSupport::TimeZone['Eastern Time (US & Canada)']
  95. with_env_tz 'US/Eastern' do
  96. Time.stubs(:now).returns Time.local(2000)
  97. # since
  98. assert_equal true, 5.since.is_a?(ActiveSupport::TimeWithZone)
  99. assert_equal Time.utc(2000,1,1,0,0,5), 5.since.time
  100. assert_equal 'Eastern Time (US & Canada)', 5.since.time_zone.name
  101. # ago
  102. assert_equal true, 5.ago.is_a?(ActiveSupport::TimeWithZone)
  103. assert_equal Time.utc(1999,12,31,23,59,55), 5.ago.time
  104. assert_equal 'Eastern Time (US & Canada)', 5.ago.time_zone.name
  105. end
  106. ensure
  107. Time.zone = nil
  108. end
  109. protected
  110. def with_env_tz(new_tz = 'US/Eastern')
  111. old_tz, ENV['TZ'] = ENV['TZ'], new_tz
  112. yield
  113. ensure
  114. old_tz ? ENV['TZ'] = old_tz : ENV.delete('TZ')
  115. end
  116. end
  117. class NumericExtDateTest < Test::Unit::TestCase
  118. def setup
  119. @today = Date.today
  120. end
  121. def test_date_plus_duration
  122. assert_equal @today + 1, @today + 1.day
  123. assert_equal @today >> 1, @today + 1.month
  124. assert_equal @today.to_time.since(1), @today + 1.second
  125. assert_equal @today.to_time.since(60), @today + 1.minute
  126. assert_equal @today.to_time.since(60*60), @today + 1.hour
  127. end
  128. def test_chaining_duration_operations
  129. assert_equal @today.advance(:days => 2).advance(:months => -3), @today + 2.days - 3.months
  130. assert_equal @today.advance(:days => 1).advance(:months => 2), @today + 1.day + 2.months
  131. end
  132. def test_add_one_year_to_leap_day
  133. assert_equal Date.new(2005,2,28), Date.new(2004,2,29) + 1.year
  134. end
  135. end
  136. class NumericExtSizeTest < Test::Unit::TestCase
  137. def test_unit_in_terms_of_another
  138. relationships = {
  139. 1024.bytes => 1.kilobyte,
  140. 1024.kilobytes => 1.megabyte,
  141. 3584.0.kilobytes => 3.5.megabytes,
  142. 3584.0.megabytes => 3.5.gigabytes,
  143. 1.kilobyte ** 4 => 1.terabyte,
  144. 1024.kilobytes + 2.megabytes => 3.megabytes,
  145. 2.gigabytes / 4 => 512.megabytes,
  146. 256.megabytes * 20 + 5.gigabytes => 10.gigabytes,
  147. 1.kilobyte ** 5 => 1.petabyte,
  148. 1.kilobyte ** 6 => 1.exabyte
  149. }
  150. relationships.each do |left, right|
  151. assert_equal right, left
  152. end
  153. end
  154. def test_units_as_bytes_independently
  155. assert_equal 3145728, 3.megabytes
  156. assert_equal 3145728, 3.megabyte
  157. assert_equal 3072, 3.kilobytes
  158. assert_equal 3072, 3.kilobyte
  159. assert_equal 3221225472, 3.gigabytes
  160. assert_equal 3221225472, 3.gigabyte
  161. assert_equal 3298534883328, 3.terabytes
  162. assert_equal 3298534883328, 3.terabyte
  163. assert_equal 3377699720527872, 3.petabytes
  164. assert_equal 3377699720527872, 3.petabyte
  165. assert_equal 3458764513820540928, 3.exabytes
  166. assert_equal 3458764513820540928, 3.exabyte
  167. end
  168. end