assert('Dir') do
  assert_equal(Class, Dir.class)
end

assert('DirTest.setup') do
  assert_nothing_raised{DirTest.setup}
end

assert('Dir.chdir') do
  assert_equal 0, Dir.chdir(DirTest.sandbox)
end

assert('Dir.entries') do
  a = Dir.entries(DirTest.sandbox)
  assert_true a.include?("a")
  assert_true a.include?("b")
end

assert('Dir.exist?') do
  assert_true Dir.exist?(DirTest.sandbox)
  assert_false Dir.exist?(DirTest.sandbox + "/nosuchdir")
end

assert('Dir.foreach') do
  a = []
  Dir.foreach(DirTest.sandbox) { |s| a << s }
  assert_true a.include?("a")
  assert_true a.include?("b")
end

assert('Dir.getwd') do
  s = Dir.getwd
  assert_true s.kind_of? String
end

assert('Dir.mkdir') do
  m1 = DirTest.sandbox + "/mkdir1"
  m2 = DirTest.sandbox + "/mkdir2"
  assert_equal 0, Dir.mkdir(m1)
  assert_equal 0, Dir.mkdir(m2, 0765)
end

assert('Dir.delete') do
  s = DirTest.sandbox + "/delete"
  Dir.mkdir(s)
  assert_true Dir.exist?(s)

  Dir.delete(s)
  assert_false Dir.exist?(s)
end

assert('Dir.open') do
  a = []
  Dir.open(DirTest.sandbox) { |d|
    d.each_child { |s| a << s }
  }
  assert_true a.include?("a")
  assert_true a.include?("b")
end

assert('Dir#initialize and Dir#close') do
  d = Dir.new(".")
  assert_true d.instance_of?(Dir)
  assert_nil d.close
end

assert('Dir#close') do
  d = Dir.new(".")
  assert_nothing_raised{d.close}
end

assert('Dir#each_child') do
  a = []
  d = Dir.open(DirTest.sandbox)
  d.each_child { |s| a << s }
  d.close
  assert_true a.include?("a")
  assert_true a.include?("b")
end

assert('Dir#read') do
  a = []
  d = Dir.open(DirTest.sandbox)
  while s = d.read
    a << s
  end
  d.close
  assert_true a.include?("a")
  assert_true a.include?("b")
end

assert('Dir#rewind') do
  d = Dir.open(DirTest.sandbox)
  while d.read; end

  assert_equal d, d.rewind

  a = []
  while s = d.read
    a << s
  end
  d.close
  assert_true a.include? "a"
  assert_true a.include? "b"
end

# Note: behaviors of seekdir(3) and telldir(3) are so platform-dependent
# that we cannot write portable tests here.

assert('Dir#tell') do
  n = nil
  begin
    Dir.open(DirTest.sandbox) { |d|
      n = d.tell
    }
    assert_true n.is_a? Integer
  rescue NotImplementedError => e
    skip e.message
  end
end

assert('Dir#seek') do
  d1 = Dir.open(DirTest.sandbox)
  d1.read
  begin
    n = d1.tell
    d1.read
    d2 = d1.seek(n)
    assert_equal d1, d2
  rescue NotImplementedError => e
    skip e.message
  end
end

assert('DirTest.teardown') do
  GC.start
  assert_nothing_raised{DirTest.teardown}
end
