# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

class TestFileInfo < Test::Unit::TestCase
  def setup
    @file_info = Arrow::FileInfo.new
  end

  sub_test_case("#type") do
    test("default") do
      assert_equal(Arrow::FileType::UNKNOWN,
                   @file_info.type)
    end
  end

  test("#type=") do
    @file_info.type = :dir
    assert_equal(Arrow::FileType::DIR,
                 @file_info.type)
  end

  sub_test_case("#path") do
    test("default") do
      assert_equal("", @file_info.path)
    end
  end

  test("#path=") do
    @file_info.path = "/a/b/c.d"
    assert_equal("/a/b/c.d",
                 @file_info.path)
  end

  sub_test_case("#base_name") do
    test("default") do
      assert_equal("", @file_info.base_name)
    end

    test("with directory") do
      @file_info.path = "/a/b/c.d"
      assert_equal("c.d", @file_info.base_name)
    end
  end

  sub_test_case("#dir_name") do
    test("default") do
      assert_equal("", @file_info.dir_name)
    end

    test("with directory") do
      @file_info.path = "/a/b/c.d"
      assert_equal("/a/b", @file_info.dir_name)
    end
  end

  sub_test_case("#extension") do
    test("default") do
      assert_equal("", @file_info.extension)
    end

    test("exist") do
      @file_info.path = "/a/b/c.d"
      assert_equal("d", @file_info.extension)
    end
  end

  sub_test_case("#size") do
    test("default") do
      assert_equal(-1, @file_info.size)
    end
  end

  sub_test_case("#mtime") do
    test("default") do
      assert_equal(-1, @file_info.mtime)
    end
  end

  sub_test_case("#==") do
    def setup
      super
      @other_file_info = Arrow::FileInfo.new
    end

    test("all the properties are the same") do
      assert do
        @file_info == @other_file_info
      end
    end

    test("the different type") do
      @other_file_info.type = Arrow::FileType::FILE
      assert do
        @file_info != @other_file_info
      end
    end

    test("the different path") do
      @other_file_info.path = "/a/b/c"
      assert do
        @file_info != @other_file_info
      end
    end

    test("the different size") do
      @other_file_info.size = 42
      assert do
        @file_info != @other_file_info
      end
    end

    test("the different mtime") do
      @other_file_info.mtime = Time.now.to_i
      assert do
        @file_info != @other_file_info
      end
    end
  end

  sub_test_case("#file?") do
    test("true") do
      @file_info.type = :file
      assert do
        @file_info.file?
      end
    end

    test("false") do
      @file_info.type = :dir
      assert do
        not @file_info.file?
      end
    end
  end

  sub_test_case("#dir?") do
    test("true") do
      @file_info.type = :dir
      assert do
        @file_info.dir?
      end
    end

    test("false") do
      @file_info.type = :file
      assert do
        not @file_info.dir?
      end
    end
  end

  test("#to_s") do
    assert_equal("FileInfo(FileType::Unknown, )",
                 @file_info.to_s)
  end
end
