#-- # Copyright (c) 2012-2013 Philip Ross # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. #++ require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils') require 'tmpdir' include TZInfo class TCDataSource < Test::Unit::TestCase class InitDataSource < DataSource end class DummyDataSource < DataSource end def setup @orig_data_source = DataSource.get DataSource.set(InitDataSource.new) @orig_search_path = ZoneinfoDataSource.search_path.clone end def teardown DataSource.set(@orig_data_source) ZoneinfoDataSource.search_path = @orig_search_path end def test_get data_source = DataSource.get assert_kind_of(InitDataSource, data_source) end def test_get_default_ruby_only code = <<-EOF require 'tmpdir' begin Dir.mktmpdir('tzinfo_test_dir') do |dir| TZInfo::ZoneinfoDataSource.search_path = [dir] puts TZInfo::DataSource.get.class end rescue Exception => e puts "Unexpected exception: \#{e}" end EOF assert_sub_process_returns(['TZInfo::RubyDataSource'], code, [TZINFO_TEST_DATA_DIR]) end def test_get_default_zoneinfo_only code = <<-EOF require 'tmpdir' begin Dir.mktmpdir('tzinfo_test_dir') do |dir| TZInfo::ZoneinfoDataSource.search_path = [dir, '#{TZINFO_TEST_ZONEINFO_DIR}'] puts TZInfo::DataSource.get.class puts TZInfo::DataSource.get.zoneinfo_dir end rescue Exception => e puts "Unexpected exception: \#{e}" end EOF assert_sub_process_returns( ['TZInfo::ZoneinfoDataSource', TZINFO_TEST_ZONEINFO_DIR], code) end def test_get_default_ruby_and_zoneinfo code = <<-EOF begin TZInfo::ZoneinfoDataSource.search_path = ['#{TZINFO_TEST_ZONEINFO_DIR}'] puts TZInfo::DataSource.get.class rescue Exception => e puts "Unexpected exception: \#{e}" end EOF assert_sub_process_returns(['TZInfo::RubyDataSource'], code, [TZINFO_TEST_DATA_DIR]) end def test_get_default_no_data code = <<-EOF require 'tmpdir' begin Dir.mktmpdir('tzinfo_test_dir') do |dir| TZInfo::ZoneinfoDataSource.search_path = [dir] begin data_source = TZInfo::DataSource.get puts "No exception raised, returned \#{data_source} instead" rescue Exception => e puts e.class end end rescue Exception => e puts "Unexpected exception: \#{e}" end EOF assert_sub_process_returns(['TZInfo::DataSourceNotFound'], code) end def test_set_instance DataSource.set(DummyDataSource.new) data_source = DataSource.get assert_kind_of(DummyDataSource, data_source) end def test_set_standard_ruby DataSource.set(:ruby) data_source = DataSource.get assert_kind_of(RubyDataSource, data_source) end def test_set_standard_zoneinfo_search Dir.mktmpdir('tzinfo_test_dir') do |dir| FileUtils.touch(File.join(dir, 'iso3166.tab')) FileUtils.touch(File.join(dir, 'zone.tab')) ZoneinfoDataSource.search_path = [dir] DataSource.set(:zoneinfo) data_source = DataSource.get assert_kind_of(ZoneinfoDataSource, data_source) assert_equal(dir, data_source.zoneinfo_dir) end end def test_set_standard_zoneinfo_explicit Dir.mktmpdir('tzinfo_test_dir') do |dir| FileUtils.touch(File.join(dir, 'iso3166.tab')) FileUtils.touch(File.join(dir, 'zone.tab')) DataSource.set(:zoneinfo, dir) data_source = DataSource.get assert_kind_of(ZoneinfoDataSource, data_source) assert_equal(dir, data_source.zoneinfo_dir) end end def test_set_standard_zoneinfo_search_not_found Dir.mktmpdir('tzinfo_test_dir') do |dir| ZoneinfoDataSource.search_path = [dir] assert_raises(ZoneinfoDirectoryNotFound) do DataSource.set(:zoneinfo) end assert_kind_of(InitDataSource, DataSource.get) end end def test_set_standard_zoneinfo_explicit_invalid Dir.mktmpdir('tzinfo_test_dir') do |dir| assert_raises(InvalidZoneinfoDirectory) do DataSource.set(:zoneinfo, dir) end assert_kind_of(InitDataSource, DataSource.get) end end def test_set_standard_zoneinfo_wrong_arg_count assert_raises(ArgumentError) do DataSource.set(:zoneinfo, 1, 2) end assert_kind_of(InitDataSource, DataSource.get) end end