##
# ENV test
#

if Object.const_defined?(:MTest)
  class ENVTest < MTest::Unit::TestCase
    def test_env_class
      assert_equal(Object, ENV.class)
    end

    def setup
      @env_hash = ENV.to_hash
      ENV.clear
    end

    def teardown
      ENV.clear
      @env_hash.each do |k, v|
        ENV[k] = v
      end
    end

    def set_dummy_env
      ENV['FOO'] = 'bar'
    end

    def test_size_empty
      assert_equal(0, ENV.size)
    end

    def test_keys_empty
      assert_empty(ENV.keys)
    end

    def test_values_empty
      assert_empty(ENV.values)
    end

    def test_env_to_s_empty
      assert_equal("ENV", ENV.to_s)
    end

    def test_env_inspect_empty
      assert_equal("{}", ENV.inspect)
    end

    def test_env_to_hash_empty
      assert_equal({}, ENV.to_hash)
    end

    def test_env_get_val
      set_dummy_env
      assert_equal('bar', ENV['FOO'])
    end

    def test_env_keys
      set_dummy_env
      assert_equal(['FOO'], ENV.keys)
    end

    def test_env_values
      set_dummy_env
      assert_equal(['bar'], ENV.values)
    end

    def test_env_to_s
      set_dummy_env
      assert_equal("ENV", ENV.to_s)
    end

    def test_env_has_key
      set_dummy_env
      assert_true  ENV.has_key?("FOO")
      assert_false ENV.has_key?("BAR")
    end

    def test_env_inspect
      set_dummy_env
      assert_equal("{\"FOO\"=>\"bar\"}", ENV.inspect)
    end

    def test_env_delete
      set_dummy_env
      old = ENV['FOO']
      ret = ENV.delete('FOO')
      assert_equal(0, ENV.size)
      assert_equal(old, ret)
      assert_equal(nil, ENV.delete('nosuchenv'))
    end

    def test_env_fetch
      set_dummy_env
      assert_equal 'bar', ENV.fetch('FOO')
      assert_equal 'val', ENV.fetch('BAR', 'val')
      assert_equal 'val2', ENV.fetch('BAR') { |key| 'val2' }
      assert_raise(KeyError) do
        ENV.fetch('BAR')
      end
    end

    def test_env_subst_nil
      set_dummy_env
      ENV['FOO'] = nil
      assert_equal(0, ENV.size)
    end

    def test_env_store
      ENV['a'] = 'b'
      assert_equal 'b', ENV['a']

      ENV['a'] = 'c'
      assert_equal 'c', ENV['a']

      ENV['a'] = nil
      assert_equal nil, ENV['a']

      ENV['b'] = nil
      assert_equal nil, ENV['b']
      assert_equal 0, ENV.size
    end
  end

  if $ok_test
    MTest::Unit.new.mrbtest
  else
    MTest::Unit.new.run
  end
else
  $asserts << "test skip of mruby-env/test/env_test.rb"  if $asserts
end

