aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/test/core_ext/numeric_ext_test.rb
blob: bbbd706aa1142573ad7ba6c4b77c3548af9b92d4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
require File.dirname(__FILE__) + '/../abstract_unit'

class NumericExtTimeAndDateTimeTest < Test::Unit::TestCase
  def setup
    @now = Time.now
    @dtnow = DateTime.now
    @seconds = {
      1.minute   => 60,
      10.minutes => 600,
      1.hour + 15.minutes => 4500,
      2.days + 4.hours + 30.minutes => 189000,
      5.years + 1.month + 1.fortnight => 161589600
    }
  end

  def test_units
    @seconds.each do |actual, expected|
      assert_equal expected, actual
    end
  end

  def test_intervals
    @seconds.values.each do |seconds|
      assert_equal seconds.since(@now), @now + seconds
      assert_equal seconds.until(@now), @now - seconds
    end
  end

  # Test intervals based from Time.now
  def test_now
    @seconds.values.each do |seconds|
      now = Time.now
      assert seconds.ago >= now - seconds
      now = Time.now
      assert seconds.from_now >= now + seconds
    end
  end
  
  def test_irregular_durations
    assert_equal @now.advance(:days => 3000), 3000.days.since(@now)
    assert_equal @now.advance(:months => 1), 1.month.since(@now)
    assert_equal @now.advance(:months => -1), 1.month.until(@now)
    assert_equal @now.advance(:years => 20), 20.years.since(@now)
    assert_equal @dtnow.advance(:days => 3000), 3000.days.since(@dtnow)
    assert_equal @dtnow.advance(:months => 1), 1.month.since(@dtnow)
    assert_equal @dtnow.advance(:months => -1), 1.month.until(@dtnow)
    assert_equal @dtnow.advance(:years => 20), 20.years.since(@dtnow)
  end
  
  def test_duration_addition
    assert_equal @now.advance(:days => 1).advance(:months => 1), (1.day + 1.month).since(@now)
    assert_equal @now.advance(:days => 7), (1.week + 5.seconds - 5.seconds).since(@now)
    assert_equal @now.advance(:years => 2), (4.years - 2.years).since(@now)
    assert_equal @dtnow.advance(:days => 1).advance(:months => 1), (1.day + 1.month).since(@dtnow)
    assert_equal @dtnow.advance(:days => 7), (1.week + 5.seconds - 5.seconds).since(@dtnow)
    assert_equal @dtnow.advance(:years => 2), (4.years - 2.years).since(@dtnow)    
  end
  
  def test_time_plus_duration
    assert_equal @now + 8, @now + 8.seconds
    assert_equal @now + 22.9, @now + 22.9.seconds
    assert_equal @now.advance(:days => 15), @now + 15.days
    assert_equal @now.advance(:months => 1), @now + 1.month
    assert_equal @dtnow.since(8), @dtnow + 8.seconds
    assert_equal @dtnow.since(22.9), @dtnow + 22.9.seconds
    assert_equal @dtnow.advance(:days => 15), @dtnow + 15.days
    assert_equal @dtnow.advance(:months => 1), @dtnow + 1.month
  end
  
  def test_chaining_duration_operations
    assert_equal @now.advance(:days => 2).advance(:months => -3), @now + 2.days - 3.months
    assert_equal @now.advance(:days => 1).advance(:months => 2), @now + 1.day + 2.months
    assert_equal @dtnow.advance(:days => 2).advance(:months => -3), @dtnow + 2.days - 3.months
    assert_equal @dtnow.advance(:days => 1).advance(:months => 2), @dtnow + 1.day + 2.months    
  end
  
  def test_duration_after_convertion_is_no_longer_accurate
    assert_equal 30.days.to_i.since(@now), 1.month.to_i.since(@now)
    assert_equal 365.25.days.to_f.since(@now), 1.year.to_f.since(@now)
    assert_equal 30.days.to_i.since(@dtnow), 1.month.to_i.since(@dtnow)
    assert_equal 365.25.days.to_f.since(@dtnow), 1.year.to_f.since(@dtnow)    
  end
end

class NumericExtDateTest < Test::Unit::TestCase
  def setup
    @today = Date.today
  end

  def test_date_plus_duration
    assert_equal @today + 1, @today + 1.day
    assert_equal @today >> 1, @today + 1.month
    assert_equal @today.to_time.since(1), @today + 1.second
    assert_equal @today.to_time.since(60), @today + 1.minute
    assert_equal @today.to_time.since(60*60), @today + 1.hour
  end
  
  def test_chaining_duration_operations
    assert_equal @today.advance(:days => 2).advance(:months => -3), @today + 2.days - 3.months
    assert_equal @today.advance(:days => 1).advance(:months => 2), @today + 1.day + 2.months
  end
end

class NumericExtSizeTest < Test::Unit::TestCase
  def test_unit_in_terms_of_another
    relationships = {
        1024.bytes     =>   1.kilobyte,
        1024.kilobytes =>   1.megabyte,
      3584.0.kilobytes => 3.5.megabytes,
      3584.0.megabytes => 3.5.gigabytes,
      1.kilobyte ** 4  =>   1.terabyte,
      1024.kilobytes + 2.megabytes =>   3.megabytes,
                   2.gigabytes / 4 => 512.megabytes,
      256.megabytes * 20 + 5.gigabytes => 10.gigabytes,
      1.kilobyte ** 5 => 1.petabyte,
      1.kilobyte ** 6 => 1.exabyte
    }

    relationships.each do |left, right|
      assert_equal right, left
    end
  end
end