time_zone_test.rb 4.0 KB
Newer Older
1
require 'abstract_unit'
2 3

class TimeZoneTest < Test::Unit::TestCase
4 5 6 7 8 9 10 11 12
  
  uses_tzinfo 'TestTimeZoneCalculations' do
    
    def test_utc_to_local
      silence_warnings do # silence warnings raised by tzinfo gem
        zone = TimeZone['Eastern Time (US & Canada)']
        assert_equal Time.utc(1999, 12, 31, 19), zone.utc_to_local(Time.utc(2000, 1)) # standard offset -0500
        assert_equal Time.utc(2000, 6, 30, 20), zone.utc_to_local(Time.utc(2000, 7)) # dst offset -0400
      end
13
    end
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
  
    def test_local_to_utc
      silence_warnings do # silence warnings raised by tzinfo gem
        zone = TimeZone['Eastern Time (US & Canada)']
        assert_equal Time.utc(2000, 1, 1, 5), zone.local_to_utc(Time.utc(2000, 1)) # standard offset -0500
        assert_equal Time.utc(2000, 7, 1, 4), zone.local_to_utc(Time.utc(2000, 7)) # dst offset -0400
      end
    end
    
    def test_period_for_local
      silence_warnings do # silence warnings raised by tzinfo gem
        zone = TimeZone['Eastern Time (US & Canada)']
        assert_instance_of TZInfo::TimezonePeriod, zone.period_for_local(Time.utc(2000))
      end
    end
    
    TimeZone::MAPPING.keys.each do |name|
      define_method("test_map_#{name.downcase.gsub(/[^a-z]/, '_')}_to_tzinfo") do
        silence_warnings do # silence warnings raised by tzinfo gem
          zone = TimeZone[name]
          assert zone.tzinfo.respond_to?(:period_for_local)
        end
      end
37
    end
38

39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
    TimeZone.all.each do |zone|
      name = zone.name.downcase.gsub(/[^a-z]/, '_')
      define_method("test_from_#{name}_to_map") do
        silence_warnings do # silence warnings raised by tzinfo gem
          assert_instance_of TimeZone, TimeZone[zone.name]
        end
      end

      define_method("test_utc_offset_for_#{name}") do
        silence_warnings do # silence warnings raised by tzinfo gem
          period = zone.tzinfo.period_for_utc(Time.utc(2006,1,1,0,0,0))
          assert_equal period.utc_offset, zone.utc_offset
        end
      end
    end
54

55 56 57
    uses_mocha 'TestTimeZoneNowAndToday' do
      def test_now
        TZInfo::DataTimezone.any_instance.stubs(:now).returns(Time.utc(2000))
58 59 60 61
        zone = TimeZone['Eastern Time (US & Canada)']
        assert_instance_of ActiveSupport::TimeWithZone, zone.now
        assert_equal Time.utc(2000), zone.now.time
        assert_equal zone, zone.now.time_zone
62 63 64 65 66 67 68 69 70
      end
    
      def test_today
        TZInfo::DataTimezone.any_instance.stubs(:now).returns(Time.utc(2000))
        assert_equal Date.new(2000), TimeZone['Eastern Time (US & Canada)'].today
      end
    end
  end
  
71
  def test_formatted_offset_positive
72 73 74
    zone = TimeZone['Moscow']
    assert_equal "+03:00", zone.formatted_offset
    assert_equal "+0300", zone.formatted_offset(false)
75
  end
76
  
77
  def test_formatted_offset_negative
78 79 80
    zone = TimeZone['Eastern Time (US & Canada)']
    assert_equal "-05:00", zone.formatted_offset
    assert_equal "-0500", zone.formatted_offset(false)
81
  end
82
  
83 84 85 86 87 88
  def test_formatted_offset_zero
    zone = TimeZone['London']
    assert_equal "+00:00", zone.formatted_offset
    assert_equal "UTC", zone.formatted_offset(true, 'UTC')
  end
  
89
  def test_zone_compare
90 91
    zone1 = TimeZone['Central Time (US & Canada)'] # offset -0600
    zone2 = TimeZone['Eastern Time (US & Canada)'] # offset -0500
92 93 94 95
    assert zone1 < zone2
    assert zone2 > zone1
    assert zone1 == zone1
  end
96
  
97
  def test_to_s
98
    assert_equal "(GMT+03:00) Moscow", TimeZone['Moscow'].to_s
99
  end
100
  
101 102 103 104 105 106
  def test_all_sorted
    all = TimeZone.all
    1.upto( all.length-1 ) do |i|
      assert all[i-1] < all[i]
    end
  end
107
  
108 109
  def test_index
    assert_nil TimeZone["bogus"]
110 111
    assert_instance_of TimeZone, TimeZone["Central Time (US & Canada)"]
    assert_instance_of TimeZone, TimeZone[8]
112
    assert_raises(ArgumentError) { TimeZone[false] }
113
  end
114
  
115
  def test_new
116
    assert_equal TimeZone["Central Time (US & Canada)"], TimeZone.new("Central Time (US & Canada)")
117
  end
118 119 120 121 122
  
  def test_us_zones
    assert TimeZone.us_zones.include?(TimeZone["Hawaii"])
    assert !TimeZone.us_zones.include?(TimeZone["Kuala Lumpur"])
  end 
123
end
124