diff options
Diffstat (limited to 'jni/ruby/test/pathname/test_pathname.rb')
-rw-r--r-- | jni/ruby/test/pathname/test_pathname.rb | 1389 |
1 files changed, 1389 insertions, 0 deletions
diff --git a/jni/ruby/test/pathname/test_pathname.rb b/jni/ruby/test/pathname/test_pathname.rb new file mode 100644 index 0000000..046f3f0 --- /dev/null +++ b/jni/ruby/test/pathname/test_pathname.rb @@ -0,0 +1,1389 @@ +require 'test/unit' +require 'pathname' + +require 'fileutils' +require 'tmpdir' +require 'enumerator' + + +class TestPathname < Test::Unit::TestCase + def self.define_assertion(name, linenum, &block) + name = "test_#{name}_#{linenum}" + define_method(name, &block) + end + + def self.get_linenum + if /:(\d+):/ =~ caller[1] + $1.to_i + else + nil + end + end + + def self.defassert(name, result, *args) + define_assertion(name, get_linenum) { + mesg = "#{name}(#{args.map {|a| a.inspect }.join(', ')})" + assert_nothing_raised(mesg) { + assert_equal(result, self.send(name, *args), mesg) + } + } + end + + def self.defassert_raise(name, exc, *args) + define_assertion(name, get_linenum) { + message = "#{name}(#{args.map {|a| a.inspect }.join(', ')})" + assert_raise(exc, message) { self.send(name, *args) } + } + end + + DOSISH = File::ALT_SEPARATOR != nil + DOSISH_DRIVE_LETTER = File.dirname("A:") == "A:." + DOSISH_UNC = File.dirname("//") == "//" + + def cleanpath_aggressive(path) + Pathname.new(path).cleanpath.to_s + end + + defassert(:cleanpath_aggressive, '/', '/') + defassert(:cleanpath_aggressive, '.', '') + defassert(:cleanpath_aggressive, '.', '.') + defassert(:cleanpath_aggressive, '..', '..') + defassert(:cleanpath_aggressive, 'a', 'a') + defassert(:cleanpath_aggressive, '/', '/.') + defassert(:cleanpath_aggressive, '/', '/..') + defassert(:cleanpath_aggressive, '/a', '/a') + defassert(:cleanpath_aggressive, '.', './') + defassert(:cleanpath_aggressive, '..', '../') + defassert(:cleanpath_aggressive, 'a', 'a/') + defassert(:cleanpath_aggressive, 'a/b', 'a//b') + defassert(:cleanpath_aggressive, 'a', 'a/.') + defassert(:cleanpath_aggressive, 'a', 'a/./') + defassert(:cleanpath_aggressive, '.', 'a/..') + defassert(:cleanpath_aggressive, '.', 'a/../') + defassert(:cleanpath_aggressive, '/a', '/a/.') + defassert(:cleanpath_aggressive, '..', './..') + defassert(:cleanpath_aggressive, '..', '../.') + defassert(:cleanpath_aggressive, '..', './../') + defassert(:cleanpath_aggressive, '..', '.././') + defassert(:cleanpath_aggressive, '/', '/./..') + defassert(:cleanpath_aggressive, '/', '/../.') + defassert(:cleanpath_aggressive, '/', '/./../') + defassert(:cleanpath_aggressive, '/', '/.././') + defassert(:cleanpath_aggressive, 'a/b/c', 'a/b/c') + defassert(:cleanpath_aggressive, 'b/c', './b/c') + defassert(:cleanpath_aggressive, 'a/c', 'a/./c') + defassert(:cleanpath_aggressive, 'a/b', 'a/b/.') + defassert(:cleanpath_aggressive, '.', 'a/../.') + defassert(:cleanpath_aggressive, '/a', '/../.././../a') + defassert(:cleanpath_aggressive, '../../d', 'a/b/../../../../c/../d') + + if DOSISH_UNC + defassert(:cleanpath_aggressive, '//a/b/c', '//a/b/c/') + else + defassert(:cleanpath_aggressive, '/', '///') + defassert(:cleanpath_aggressive, '/a', '///a') + defassert(:cleanpath_aggressive, '/', '///..') + defassert(:cleanpath_aggressive, '/', '///.') + defassert(:cleanpath_aggressive, '/', '///a/../..') + end + + if DOSISH + defassert(:cleanpath_aggressive, 'c:/foo/bar', 'c:\\foo\\bar') + end + + def cleanpath_conservative(path) + Pathname.new(path).cleanpath(true).to_s + end + + defassert(:cleanpath_conservative, '/', '/') + defassert(:cleanpath_conservative, '.', '') + defassert(:cleanpath_conservative, '.', '.') + defassert(:cleanpath_conservative, '..', '..') + defassert(:cleanpath_conservative, 'a', 'a') + defassert(:cleanpath_conservative, '/', '/.') + defassert(:cleanpath_conservative, '/', '/..') + defassert(:cleanpath_conservative, '/a', '/a') + defassert(:cleanpath_conservative, '.', './') + defassert(:cleanpath_conservative, '..', '../') + defassert(:cleanpath_conservative, 'a/', 'a/') + defassert(:cleanpath_conservative, 'a/b', 'a//b') + defassert(:cleanpath_conservative, 'a/.', 'a/.') + defassert(:cleanpath_conservative, 'a/.', 'a/./') + defassert(:cleanpath_conservative, 'a/..', 'a/../') + defassert(:cleanpath_conservative, '/a/.', '/a/.') + defassert(:cleanpath_conservative, '..', './..') + defassert(:cleanpath_conservative, '..', '../.') + defassert(:cleanpath_conservative, '..', './../') + defassert(:cleanpath_conservative, '..', '.././') + defassert(:cleanpath_conservative, '/', '/./..') + defassert(:cleanpath_conservative, '/', '/../.') + defassert(:cleanpath_conservative, '/', '/./../') + defassert(:cleanpath_conservative, '/', '/.././') + defassert(:cleanpath_conservative, 'a/b/c', 'a/b/c') + defassert(:cleanpath_conservative, 'b/c', './b/c') + defassert(:cleanpath_conservative, 'a/c', 'a/./c') + defassert(:cleanpath_conservative, 'a/b/.', 'a/b/.') + defassert(:cleanpath_conservative, 'a/..', 'a/../.') + defassert(:cleanpath_conservative, '/a', '/../.././../a') + defassert(:cleanpath_conservative, 'a/b/../../../../c/../d', 'a/b/../../../../c/../d') + + if DOSISH + defassert(:cleanpath_conservative, 'c:/foo/bar', 'c:\\foo\\bar') + end + + if DOSISH_UNC + defassert(:cleanpath_conservative, '//', '//') + else + defassert(:cleanpath_conservative, '/', '//') + end + + # has_trailing_separator?(path) -> bool + def has_trailing_separator?(path) + Pathname.allocate.__send__(:has_trailing_separator?, path) + end + + defassert(:has_trailing_separator?, false, "/") + defassert(:has_trailing_separator?, false, "///") + defassert(:has_trailing_separator?, false, "a") + defassert(:has_trailing_separator?, true, "a/") + + def add_trailing_separator(path) + Pathname.allocate.__send__(:add_trailing_separator, path) + end + + def del_trailing_separator(path) + Pathname.allocate.__send__(:del_trailing_separator, path) + end + + defassert(:del_trailing_separator, "/", "/") + defassert(:del_trailing_separator, "/a", "/a") + defassert(:del_trailing_separator, "/a", "/a/") + defassert(:del_trailing_separator, "/a", "/a//") + defassert(:del_trailing_separator, ".", ".") + defassert(:del_trailing_separator, ".", "./") + defassert(:del_trailing_separator, ".", ".//") + + if DOSISH_DRIVE_LETTER + defassert(:del_trailing_separator, "A:", "A:") + defassert(:del_trailing_separator, "A:/", "A:/") + defassert(:del_trailing_separator, "A:/", "A://") + defassert(:del_trailing_separator, "A:.", "A:.") + defassert(:del_trailing_separator, "A:.", "A:./") + defassert(:del_trailing_separator, "A:.", "A:.//") + end + + if DOSISH_UNC + defassert(:del_trailing_separator, "//", "//") + defassert(:del_trailing_separator, "//a", "//a") + defassert(:del_trailing_separator, "//a", "//a/") + defassert(:del_trailing_separator, "//a", "//a//") + defassert(:del_trailing_separator, "//a/b", "//a/b") + defassert(:del_trailing_separator, "//a/b", "//a/b/") + defassert(:del_trailing_separator, "//a/b", "//a/b//") + defassert(:del_trailing_separator, "//a/b/c", "//a/b/c") + defassert(:del_trailing_separator, "//a/b/c", "//a/b/c/") + defassert(:del_trailing_separator, "//a/b/c", "//a/b/c//") + else + defassert(:del_trailing_separator, "/", "///") + defassert(:del_trailing_separator, "///a", "///a/") + end + + if DOSISH + defassert(:del_trailing_separator, "a", "a\\") + defassert(:del_trailing_separator, "\225\\".force_encoding("cp932"), "\225\\\\".force_encoding("cp932")) + defassert(:del_trailing_separator, "\225".force_encoding("cp437"), "\225\\\\".force_encoding("cp437")) + end + + def test_plus + assert_kind_of(Pathname, Pathname("a") + Pathname("b")) + end + + def plus(path1, path2) # -> path + (Pathname.new(path1) + Pathname.new(path2)).to_s + end + + defassert(:plus, '/', '/', '/') + defassert(:plus, 'a/b', 'a', 'b') + defassert(:plus, 'a', 'a', '.') + defassert(:plus, 'b', '.', 'b') + defassert(:plus, '.', '.', '.') + defassert(:plus, '/b', 'a', '/b') + + defassert(:plus, '/', '/', '..') + defassert(:plus, '.', 'a', '..') + defassert(:plus, 'a', 'a/b', '..') + defassert(:plus, '../..', '..', '..') + defassert(:plus, '/c', '/', '../c') + defassert(:plus, 'c', 'a', '../c') + defassert(:plus, 'a/c', 'a/b', '../c') + defassert(:plus, '../../c', '..', '../c') + + defassert(:plus, 'a//b/d//e', 'a//b/c', '../d//e') + + def test_slash + assert_kind_of(Pathname, Pathname("a") / Pathname("b")) + end + + def test_parent + assert_equal(Pathname("."), Pathname("a").parent) + end + + def parent(path) # -> path + Pathname.new(path).parent.to_s + end + + defassert(:parent, '/', '/') + defassert(:parent, '/', '/a') + defassert(:parent, '/a', '/a/b') + defassert(:parent, '/a/b', '/a/b/c') + defassert(:parent, '.', 'a') + defassert(:parent, 'a', 'a/b') + defassert(:parent, 'a/b', 'a/b/c') + defassert(:parent, '..', '.') + defassert(:parent, '../..', '..') + + def test_join + r = Pathname("a").join(Pathname("b"), Pathname("c")) + assert_equal(Pathname("a/b/c"), r) + r = Pathname("/a").join(Pathname("b"), Pathname("c")) + assert_equal(Pathname("/a/b/c"), r) + r = Pathname("/a").join(Pathname("/b"), Pathname("c")) + assert_equal(Pathname("/b/c"), r) + r = Pathname("/a").join(Pathname("/b"), Pathname("/c")) + assert_equal(Pathname("/c"), r) + r = Pathname("/a").join("/b", "/c") + assert_equal(Pathname("/c"), r) + r = Pathname("/foo/var").join() + assert_equal(Pathname("/foo/var"), r) + end + + def test_absolute + assert_equal(true, Pathname("/").absolute?) + assert_equal(false, Pathname("a").absolute?) + end + + def relative?(path) + Pathname.new(path).relative? + end + + defassert(:relative?, false, '/') + defassert(:relative?, false, '/a') + defassert(:relative?, false, '/..') + defassert(:relative?, true, 'a') + defassert(:relative?, true, 'a/b') + + if DOSISH_DRIVE_LETTER + defassert(:relative?, false, 'A:') + defassert(:relative?, false, 'A:/') + defassert(:relative?, false, 'A:/a') + end + + if File.dirname('//') == '//' + defassert(:relative?, false, '//') + defassert(:relative?, false, '//a') + defassert(:relative?, false, '//a/') + defassert(:relative?, false, '//a/b') + defassert(:relative?, false, '//a/b/') + defassert(:relative?, false, '//a/b/c') + end + + def relative_path_from(dest_directory, base_directory) + Pathname.new(dest_directory).relative_path_from(Pathname.new(base_directory)).to_s + end + + defassert(:relative_path_from, "../a", "a", "b") + defassert(:relative_path_from, "../a", "a", "b/") + defassert(:relative_path_from, "../a", "a/", "b") + defassert(:relative_path_from, "../a", "a/", "b/") + defassert(:relative_path_from, "../a", "/a", "/b") + defassert(:relative_path_from, "../a", "/a", "/b/") + defassert(:relative_path_from, "../a", "/a/", "/b") + defassert(:relative_path_from, "../a", "/a/", "/b/") + + defassert(:relative_path_from, "../b", "a/b", "a/c") + defassert(:relative_path_from, "../a", "../a", "../b") + + defassert(:relative_path_from, "a", "a", ".") + defassert(:relative_path_from, "..", ".", "a") + + defassert(:relative_path_from, ".", ".", ".") + defassert(:relative_path_from, ".", "..", "..") + defassert(:relative_path_from, "..", "..", ".") + + defassert(:relative_path_from, "c/d", "/a/b/c/d", "/a/b") + defassert(:relative_path_from, "../..", "/a/b", "/a/b/c/d") + defassert(:relative_path_from, "../../../../e", "/e", "/a/b/c/d") + defassert(:relative_path_from, "../b/c", "a/b/c", "a/d") + + defassert(:relative_path_from, "../a", "/../a", "/b") + defassert(:relative_path_from, "../../a", "../a", "b") + defassert(:relative_path_from, ".", "/a/../../b", "/b") + defassert(:relative_path_from, "..", "a/..", "a") + defassert(:relative_path_from, ".", "a/../b", "b") + + defassert(:relative_path_from, "a", "a", "b/..") + defassert(:relative_path_from, "b/c", "b/c", "b/..") + + defassert_raise(:relative_path_from, ArgumentError, "/", ".") + defassert_raise(:relative_path_from, ArgumentError, ".", "/") + defassert_raise(:relative_path_from, ArgumentError, "a", "..") + defassert_raise(:relative_path_from, ArgumentError, ".", "..") + + def with_tmpchdir(base=nil) + Dir.mktmpdir(base) {|d| + d = Pathname.new(d).realpath.to_s + Dir.chdir(d) { + yield d + } + } + end + + def has_symlink? + begin + File.symlink(nil, nil) + rescue NotImplementedError + return false + rescue TypeError + end + return true + end + + def realpath(path, basedir=nil) + Pathname.new(path).realpath(basedir).to_s + end + + def test_realpath + return if !has_symlink? + with_tmpchdir('rubytest-pathname') {|dir| + assert_raise(Errno::ENOENT) { realpath("#{dir}/not-exist") } + File.symlink("not-exist-target", "#{dir}/not-exist") + assert_raise(Errno::ENOENT) { realpath("#{dir}/not-exist") } + + File.symlink("loop", "#{dir}/loop") + assert_raise(Errno::ELOOP) { realpath("#{dir}/loop") } + assert_raise(Errno::ELOOP) { realpath("#{dir}/loop", dir) } + + File.symlink("../#{File.basename(dir)}/./not-exist-target", "#{dir}/not-exist2") + assert_raise(Errno::ENOENT) { realpath("#{dir}/not-exist2") } + + File.open("#{dir}/exist-target", "w") {} + File.symlink("../#{File.basename(dir)}/./exist-target", "#{dir}/exist2") + assert_nothing_raised { realpath("#{dir}/exist2") } + + File.symlink("loop-relative", "loop-relative") + assert_raise(Errno::ELOOP) { realpath("#{dir}/loop-relative") } + + Dir.mkdir("exist") + assert_equal("#{dir}/exist", realpath("exist")) + assert_raise(Errno::ELOOP) { realpath("../loop", "#{dir}/exist") } + + File.symlink("loop1/loop1", "loop1") + assert_raise(Errno::ELOOP) { realpath("#{dir}/loop1") } + + File.symlink("loop2", "loop3") + File.symlink("loop3", "loop2") + assert_raise(Errno::ELOOP) { realpath("#{dir}/loop2") } + + Dir.mkdir("b") + + File.symlink("b", "c") + assert_equal("#{dir}/b", realpath("c")) + assert_equal("#{dir}/b", realpath("c/../c")) + assert_equal("#{dir}/b", realpath("c/../c/../c/.")) + + File.symlink("..", "b/d") + assert_equal("#{dir}/b", realpath("c/d/c/d/c")) + + File.symlink("#{dir}/b", "e") + assert_equal("#{dir}/b", realpath("e")) + + Dir.mkdir("f") + Dir.mkdir("f/g") + File.symlink("f/g", "h") + assert_equal("#{dir}/f/g", realpath("h")) + File.chmod(0000, "f") + assert_raise(Errno::EACCES) { realpath("h") } + File.chmod(0755, "f") + } + end + + def realdirpath(path) + Pathname.new(path).realdirpath.to_s + end + + def test_realdirpath + return if !has_symlink? + Dir.mktmpdir('rubytest-pathname') {|dir| + rdir = realpath(dir) + assert_equal("#{rdir}/not-exist", realdirpath("#{dir}/not-exist")) + assert_raise(Errno::ENOENT) { realdirpath("#{dir}/not-exist/not-exist-child") } + File.symlink("not-exist-target", "#{dir}/not-exist") + assert_equal("#{rdir}/not-exist-target", realdirpath("#{dir}/not-exist")) + File.symlink("../#{File.basename(dir)}/./not-exist-target", "#{dir}/not-exist2") + assert_equal("#{rdir}/not-exist-target", realdirpath("#{dir}/not-exist2")) + File.open("#{dir}/exist-target", "w") {} + File.symlink("../#{File.basename(dir)}/./exist-target", "#{dir}/exist") + assert_equal("#{rdir}/exist-target", realdirpath("#{dir}/exist")) + File.symlink("loop", "#{dir}/loop") + assert_raise(Errno::ELOOP) { realdirpath("#{dir}/loop") } + } + end + + def descend(path) + Pathname.new(path).enum_for(:descend).map {|v| v.to_s } + end + + defassert(:descend, %w[/ /a /a/b /a/b/c], "/a/b/c") + defassert(:descend, %w[a a/b a/b/c], "a/b/c") + defassert(:descend, %w[. ./a ./a/b ./a/b/c], "./a/b/c") + defassert(:descend, %w[a/], "a/") + + def ascend(path) + Pathname.new(path).enum_for(:ascend).map {|v| v.to_s } + end + + defassert(:ascend, %w[/a/b/c /a/b /a /], "/a/b/c") + defassert(:ascend, %w[a/b/c a/b a], "a/b/c") + defassert(:ascend, %w[./a/b/c ./a/b ./a .], "./a/b/c") + defassert(:ascend, %w[a/], "a/") + + def test_initialize + p1 = Pathname.new('a') + assert_equal('a', p1.to_s) + p2 = Pathname.new(p1) + assert_equal(p1, p2) + end + + def test_initialize_nul + assert_raise(ArgumentError) { Pathname.new("a\0") } + end + + class AnotherStringLike # :nodoc: + def initialize(s) @s = s end + def to_str() @s end + def ==(other) @s == other end + end + + def test_equality + obj = Pathname.new("a") + str = "a" + sym = :a + ano = AnotherStringLike.new("a") + assert_equal(false, obj == str) + assert_equal(false, str == obj) + assert_equal(false, obj == ano) + assert_equal(false, ano == obj) + assert_equal(false, obj == sym) + assert_equal(false, sym == obj) + + obj2 = Pathname.new("a") + assert_equal(true, obj == obj2) + assert_equal(true, obj === obj2) + assert_equal(true, obj.eql?(obj2)) + end + + def test_hashkey + h = {} + h[Pathname.new("a")] = 1 + h[Pathname.new("a")] = 2 + assert_equal(1, h.size) + end + + def assert_pathname_cmp(e, s1, s2) + p1 = Pathname.new(s1) + p2 = Pathname.new(s2) + r = p1 <=> p2 + assert(e == r, + "#{p1.inspect} <=> #{p2.inspect}: <#{e}> expected but was <#{r}>") + end + def test_comparison + assert_pathname_cmp( 0, "a", "a") + assert_pathname_cmp( 1, "b", "a") + assert_pathname_cmp(-1, "a", "b") + ss = %w( + a + a/ + a/b + a. + a0 + ) + s1 = ss.shift + ss.each {|s2| + assert_pathname_cmp(-1, s1, s2) + s1 = s2 + } + end + + def test_comparison_string + assert_equal(nil, Pathname.new("a") <=> "a") + assert_equal(nil, "a" <=> Pathname.new("a")) + end + + def pathsub(path, pat, repl) Pathname.new(path).sub(pat, repl).to_s end + defassert(:pathsub, "a.o", "a.c", /\.c\z/, ".o") + + def pathsubext(path, repl) Pathname.new(path).sub_ext(repl).to_s end + defassert(:pathsubext, 'a.o', 'a.c', '.o') + defassert(:pathsubext, 'a.o', 'a.c++', '.o') + defassert(:pathsubext, 'a.png', 'a.gif', '.png') + defassert(:pathsubext, 'ruby.tar.bz2', 'ruby.tar.gz', '.bz2') + defassert(:pathsubext, 'd/a.o', 'd/a.c', '.o') + defassert(:pathsubext, 'foo', 'foo.exe', '') + defassert(:pathsubext, 'lex.yy.o', 'lex.yy.c', '.o') + defassert(:pathsubext, 'fooaa.o', 'fooaa', '.o') + defassert(:pathsubext, 'd.e/aa.o', 'd.e/aa', '.o') + defassert(:pathsubext, 'long_enough.bug-3664', 'long_enough.not_to_be_embeded[ruby-core:31640]', '.bug-3664') + + def test_sub_matchdata + result = Pathname("abc.gif").sub(/\..*/) { + assert_not_nil($~) + assert_equal(".gif", $~[0]) + ".png" + } + assert_equal("abc.png", result.to_s) + end + + def root?(path) + Pathname.new(path).root? + end + + defassert(:root?, true, "/") + defassert(:root?, true, "//") + defassert(:root?, true, "///") + defassert(:root?, false, "") + defassert(:root?, false, "a") + + def test_mountpoint? + r = Pathname("/").mountpoint? + assert_include([true, false], r) + end + + def test_mountpoint_enoent + r = Pathname("/nonexistent").mountpoint? + assert_equal false, r + end + + def test_destructive_update + path = Pathname.new("a") + path.to_s.replace "b" + assert_equal(Pathname.new("a"), path) + end + + def test_null_character + assert_raise(ArgumentError) { Pathname.new("\0") } + end + + def test_taint + obj = Pathname.new("a"); assert_same(obj, obj.taint) + obj = Pathname.new("a"); assert_same(obj, obj.untaint) + + assert_equal(false, Pathname.new("a" ) .tainted?) + assert_equal(false, Pathname.new("a" ) .to_s.tainted?) + assert_equal(true, Pathname.new("a" ).taint .tainted?) + assert_equal(true, Pathname.new("a" ).taint.to_s.tainted?) + assert_equal(true, Pathname.new("a".taint) .tainted?) + assert_equal(true, Pathname.new("a".taint) .to_s.tainted?) + assert_equal(true, Pathname.new("a".taint).taint .tainted?) + assert_equal(true, Pathname.new("a".taint).taint.to_s.tainted?) + + str = "a" + path = Pathname.new(str) + str.taint + assert_equal(false, path .tainted?) + assert_equal(false, path.to_s.tainted?) + end + + def test_untaint + obj = Pathname.new("a"); assert_same(obj, obj.untaint) + + assert_equal(false, Pathname.new("a").taint.untaint .tainted?) + assert_equal(false, Pathname.new("a").taint.untaint.to_s.tainted?) + + str = "a".taint + path = Pathname.new(str) + str.untaint + assert_equal(true, path .tainted?) + assert_equal(true, path.to_s.tainted?) + end + + def test_freeze + obj = Pathname.new("a"); assert_same(obj, obj.freeze) + + assert_equal(false, Pathname.new("a" ) .frozen?) + assert_equal(false, Pathname.new("a".freeze) .frozen?) + assert_equal(true, Pathname.new("a" ).freeze .frozen?) + assert_equal(true, Pathname.new("a".freeze).freeze .frozen?) + assert_equal(false, Pathname.new("a" ) .to_s.frozen?) + assert_equal(false, Pathname.new("a".freeze) .to_s.frozen?) + assert_equal(false, Pathname.new("a" ).freeze.to_s.frozen?) + assert_equal(false, Pathname.new("a".freeze).freeze.to_s.frozen?) + end + + def test_freeze_and_taint + obj = Pathname.new("a") + obj.freeze + assert_equal(false, obj.tainted?) + assert_raise(RuntimeError) { obj.taint } + + obj = Pathname.new("a") + obj.taint + assert_equal(true, obj.tainted?) + obj.freeze + assert_equal(true, obj.tainted?) + assert_nothing_raised { obj.taint } + end + + def test_to_s + str = "a" + obj = Pathname.new(str) + assert_equal(str, obj.to_s) + assert_not_same(str, obj.to_s) + assert_not_same(obj.to_s, obj.to_s) + end + + def test_kernel_open + count = 0 + result = Kernel.open(Pathname.new(__FILE__)) {|f| + assert(File.identical?(__FILE__, f)) + count += 1 + 2 + } + assert_equal(1, count) + assert_equal(2, result) + end + + def test_each_filename + result = [] + Pathname.new("/usr/bin/ruby").each_filename {|f| result << f } + assert_equal(%w[usr bin ruby], result) + assert_equal(%w[usr bin ruby], Pathname.new("/usr/bin/ruby").each_filename.to_a) + end + + def test_kernel_pathname + assert_equal(Pathname.new("a"), Pathname("a")) + end + + def test_children + with_tmpchdir('rubytest-pathname') {|dir| + open("a", "w") {} + open("b", "w") {} + Dir.mkdir("d") + open("d/x", "w") {} + open("d/y", "w") {} + assert_equal([Pathname("a"), Pathname("b"), Pathname("d")], Pathname(".").children.sort) + assert_equal([Pathname("d/x"), Pathname("d/y")], Pathname("d").children.sort) + assert_equal([Pathname("x"), Pathname("y")], Pathname("d").children(false).sort) + } + end + + def test_each_child + with_tmpchdir('rubytest-pathname') {|dir| + open("a", "w") {} + open("b", "w") {} + Dir.mkdir("d") + open("d/x", "w") {} + open("d/y", "w") {} + a = []; Pathname(".").each_child {|v| a << v }; a.sort! + assert_equal([Pathname("a"), Pathname("b"), Pathname("d")], a) + a = []; Pathname("d").each_child {|v| a << v }; a.sort! + assert_equal([Pathname("d/x"), Pathname("d/y")], a) + a = []; Pathname("d").each_child(false) {|v| a << v }; a.sort! + assert_equal([Pathname("x"), Pathname("y")], a) + } + end + + def test_each_line + with_tmpchdir('rubytest-pathname') {|dir| + open("a", "w") {|f| f.puts 1, 2 } + a = [] + Pathname("a").each_line {|line| a << line } + assert_equal(["1\n", "2\n"], a) + + a = [] + Pathname("a").each_line("2") {|line| a << line } + assert_equal(["1\n2", "\n"], a) + + a = [] + Pathname("a").each_line(1) {|line| a << line } + assert_equal(["1", "\n", "2", "\n"], a) + + a = [] + Pathname("a").each_line("2", 1) {|line| a << line } + assert_equal(["1", "\n", "2", "\n"], a) + + a = [] + enum = Pathname("a").each_line + enum.each {|line| a << line } + assert_equal(["1\n", "2\n"], a) + } + end + + def test_readlines + with_tmpchdir('rubytest-pathname') {|dir| + open("a", "w") {|f| f.puts 1, 2 } + a = Pathname("a").readlines + assert_equal(["1\n", "2\n"], a) + } + end + + def test_read + with_tmpchdir('rubytest-pathname') {|dir| + open("a", "w") {|f| f.puts 1, 2 } + assert_equal("1\n2\n", Pathname("a").read) + } + end + + def test_binread + with_tmpchdir('rubytest-pathname') {|dir| + open("a", "w") {|f| f.write "abc" } + str = Pathname("a").binread + assert_equal("abc", str) + assert_equal(Encoding::ASCII_8BIT, str.encoding) + } + end + + def test_write + with_tmpchdir('rubytest-pathname') {|dir| + path = Pathname("a") + path.write "abc" + assert_equal("abc", path.read) + } + end + + def test_binwrite + with_tmpchdir('rubytest-pathname') {|dir| + path = Pathname("a") + path.binwrite "abc\x80" + assert_equal("abc\x80".b, path.binread) + } + end + + def test_sysopen + with_tmpchdir('rubytest-pathname') {|dir| + open("a", "w") {|f| f.write "abc" } + fd = Pathname("a").sysopen + io = IO.new(fd) + begin + assert_equal("abc", io.read) + ensure + io.close + end + } + end + + def test_atime + assert_kind_of(Time, Pathname(__FILE__).atime) + end + + def test_birthtime + assert_kind_of(Time, Pathname(__FILE__).birthtime) + rescue NotImplementedError + assert_raise(NotImplementedError) do + File.birthtime(__FILE__) + end + end + + def test_ctime + assert_kind_of(Time, Pathname(__FILE__).ctime) + end + + def test_mtime + assert_kind_of(Time, Pathname(__FILE__).mtime) + end + + def test_chmod + with_tmpchdir('rubytest-pathname') {|dir| + open("a", "w") {|f| f.write "abc" } + path = Pathname("a") + old = path.stat.mode + path.chmod(0444) + assert_equal(0444, path.stat.mode & 0777) + path.chmod(old) + } + end + + def test_lchmod + return if !has_symlink? + with_tmpchdir('rubytest-pathname') {|dir| + open("a", "w") {|f| f.write "abc" } + File.symlink("a", "l") + path = Pathname("l") + old = path.lstat.mode + begin + path.lchmod(0444) + rescue NotImplementedError + next + end + assert_equal(0444, path.lstat.mode & 0777) + path.chmod(old) + } + end + + def test_chown + with_tmpchdir('rubytest-pathname') {|dir| + open("a", "w") {|f| f.write "abc" } + path = Pathname("a") + old_uid = path.stat.uid + old_gid = path.stat.gid + begin + path.chown(0, 0) + rescue Errno::EPERM + next + end + assert_equal(0, path.stat.uid) + assert_equal(0, path.stat.gid) + path.chown(old_uid, old_gid) + } + end + + def test_lchown + return if !has_symlink? + with_tmpchdir('rubytest-pathname') {|dir| + open("a", "w") {|f| f.write "abc" } + File.symlink("a", "l") + path = Pathname("l") + old_uid = path.stat.uid + old_gid = path.stat.gid + begin + path.lchown(0, 0) + rescue Errno::EPERM + next + end + assert_equal(0, path.stat.uid) + assert_equal(0, path.stat.gid) + path.lchown(old_uid, old_gid) + } + end + + def test_fnmatch + path = Pathname("a") + assert_equal(true, path.fnmatch("*")) + assert_equal(false, path.fnmatch("*.*")) + assert_equal(false, Pathname(".foo").fnmatch("*")) + assert_equal(true, Pathname(".foo").fnmatch("*", File::FNM_DOTMATCH)) + end + + def test_fnmatch? + path = Pathname("a") + assert_equal(true, path.fnmatch?("*")) + assert_equal(false, path.fnmatch?("*.*")) + end + + def test_ftype + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + assert_equal("file", Pathname("f").ftype) + Dir.mkdir("d") + assert_equal("directory", Pathname("d").ftype) + } + end + + def test_make_link + with_tmpchdir('rubytest-pathname') {|dir| + open("a", "w") {|f| f.write "abc" } + Pathname("l").make_link(Pathname("a")) + assert_equal("abc", Pathname("l").read) + } + end + + def test_open + with_tmpchdir('rubytest-pathname') {|dir| + open("a", "w") {|f| f.write "abc" } + path = Pathname("a") + + path.open {|f| + assert_equal("abc", f.read) + } + + path.open("r") {|f| + assert_equal("abc", f.read) + } + + Pathname("b").open("w", 0444) {|f| f.write "def" } + assert_equal(0444, File.stat("b").mode & 0777) + assert_equal("def", File.read("b")) + + Pathname("c").open("w", 0444, {}) {|f| f.write "ghi" } + assert_equal(0444, File.stat("c").mode & 0777) + assert_equal("ghi", File.read("c")) + + g = path.open + assert_equal("abc", g.read) + g.close + } + end + + def test_readlink + return if !has_symlink? + with_tmpchdir('rubytest-pathname') {|dir| + open("a", "w") {|f| f.write "abc" } + File.symlink("a", "l") + assert_equal(Pathname("a"), Pathname("l").readlink) + } + end + + def test_rename + with_tmpchdir('rubytest-pathname') {|dir| + open("a", "w") {|f| f.write "abc" } + Pathname("a").rename(Pathname("b")) + assert_equal("abc", File.read("b")) + } + end + + def test_stat + with_tmpchdir('rubytest-pathname') {|dir| + open("a", "w") {|f| f.write "abc" } + s = Pathname("a").stat + assert_equal(3, s.size) + } + end + + def test_lstat + return if !has_symlink? + with_tmpchdir('rubytest-pathname') {|dir| + open("a", "w") {|f| f.write "abc" } + File.symlink("a", "l") + s = Pathname("l").lstat + assert_equal(true, s.symlink?) + s = Pathname("l").stat + assert_equal(false, s.symlink?) + assert_equal(3, s.size) + s = Pathname("a").lstat + assert_equal(false, s.symlink?) + assert_equal(3, s.size) + } + end + + def test_make_symlink + return if !has_symlink? + with_tmpchdir('rubytest-pathname') {|dir| + open("a", "w") {|f| f.write "abc" } + Pathname("l").make_symlink(Pathname("a")) + s = Pathname("l").lstat + assert_equal(true, s.symlink?) + } + end + + def test_truncate + with_tmpchdir('rubytest-pathname') {|dir| + open("a", "w") {|f| f.write "abc" } + Pathname("a").truncate(2) + assert_equal("ab", File.read("a")) + } + end + + def test_utime + with_tmpchdir('rubytest-pathname') {|dir| + open("a", "w") {|f| f.write "abc" } + atime = Time.utc(2000) + mtime = Time.utc(1999) + Pathname("a").utime(atime, mtime) + s = File.stat("a") + assert_equal(atime, s.atime) + assert_equal(mtime, s.mtime) + } + end + + def test_basename + assert_equal(Pathname("basename"), Pathname("dirname/basename").basename) + assert_equal(Pathname("bar"), Pathname("foo/bar.x").basename(".x")) + end + + def test_dirname + assert_equal(Pathname("dirname"), Pathname("dirname/basename").dirname) + end + + def test_extname + assert_equal(".ext", Pathname("basename.ext").extname) + end + + def test_expand_path + drv = DOSISH_DRIVE_LETTER ? Dir.pwd.sub(%r(/.*), '') : "" + assert_equal(Pathname(drv + "/a"), Pathname("/a").expand_path) + assert_equal(Pathname(drv + "/a"), Pathname("a").expand_path("/")) + assert_equal(Pathname(drv + "/a"), Pathname("a").expand_path(Pathname("/"))) + assert_equal(Pathname(drv + "/b"), Pathname("/b").expand_path(Pathname("/a"))) + assert_equal(Pathname(drv + "/a/b"), Pathname("b").expand_path(Pathname("/a"))) + end + + def test_split + assert_equal([Pathname("dirname"), Pathname("basename")], Pathname("dirname/basename").split) + end + + def test_blockdev? + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + assert_equal(false, Pathname("f").blockdev?) + } + end + + def test_chardev? + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + assert_equal(false, Pathname("f").chardev?) + } + end + + def test_executable? + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + assert_equal(false, Pathname("f").executable?) + } + end + + def test_executable_real? + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + assert_equal(false, Pathname("f").executable_real?) + } + end + + def test_exist? + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + assert_equal(true, Pathname("f").exist?) + } + end + + def test_grpowned? + skip "Unix file owner test" if DOSISH + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + File.chown(-1, Process.gid, "f") + assert_equal(true, Pathname("f").grpowned?) + } + end + + def test_directory? + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + assert_equal(false, Pathname("f").directory?) + Dir.mkdir("d") + assert_equal(true, Pathname("d").directory?) + } + end + + def test_file? + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + assert_equal(true, Pathname("f").file?) + Dir.mkdir("d") + assert_equal(false, Pathname("d").file?) + } + end + + def test_pipe? + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + assert_equal(false, Pathname("f").pipe?) + } + end + + def test_socket? + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + assert_equal(false, Pathname("f").socket?) + } + end + + def test_owned? + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + assert_equal(true, Pathname("f").owned?) + } + end + + def test_readable? + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + assert_equal(true, Pathname("f").readable?) + } + end + + def test_world_readable? + skip "Unix file mode bit test" if DOSISH + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + File.chmod(0400, "f") + assert_equal(nil, Pathname("f").world_readable?) + File.chmod(0444, "f") + assert_equal(0444, Pathname("f").world_readable?) + } + end + + def test_readable_real? + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + assert_equal(true, Pathname("f").readable_real?) + } + end + + def test_setuid? + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + assert_equal(false, Pathname("f").setuid?) + } + end + + def test_setgid? + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + assert_equal(false, Pathname("f").setgid?) + } + end + + def test_size + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + assert_equal(3, Pathname("f").size) + open("z", "w") {|f| } + assert_equal(0, Pathname("z").size) + assert_raise(Errno::ENOENT) { Pathname("not-exist").size } + } + end + + def test_size? + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + assert_equal(3, Pathname("f").size?) + open("z", "w") {|f| } + assert_equal(nil, Pathname("z").size?) + assert_equal(nil, Pathname("not-exist").size?) + } + end + + def test_sticky? + skip "Unix file mode bit test" if DOSISH + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + assert_equal(false, Pathname("f").sticky?) + } + end + + def test_symlink? + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + assert_equal(false, Pathname("f").symlink?) + } + end + + def test_writable? + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + assert_equal(true, Pathname("f").writable?) + } + end + + def test_world_writable? + skip "Unix file mode bit test" if DOSISH + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + File.chmod(0600, "f") + assert_equal(nil, Pathname("f").world_writable?) + File.chmod(0666, "f") + assert_equal(0666, Pathname("f").world_writable?) + } + end + + def test_writable_real? + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + assert_equal(true, Pathname("f").writable?) + } + end + + def test_zero? + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + assert_equal(false, Pathname("f").zero?) + open("z", "w") {|f| } + assert_equal(true, Pathname("z").zero?) + assert_equal(false, Pathname("not-exist").zero?) + } + end + + def test_s_glob + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + Dir.mkdir("d") + assert_equal([Pathname("d"), Pathname("f")], Pathname.glob("*").sort) + a = [] + Pathname.glob("*") {|path| a << path } + a.sort! + assert_equal([Pathname("d"), Pathname("f")], a) + } + end + + def test_s_getwd + wd = Pathname.getwd + assert_kind_of(Pathname, wd) + end + + def test_s_pwd + wd = Pathname.pwd + assert_kind_of(Pathname, wd) + end + + def test_entries + with_tmpchdir('rubytest-pathname') {|dir| + open("a", "w") {} + open("b", "w") {} + assert_equal([Pathname("."), Pathname(".."), Pathname("a"), Pathname("b")], Pathname(".").entries.sort) + } + end + + def test_each_entry + with_tmpchdir('rubytest-pathname') {|dir| + open("a", "w") {} + open("b", "w") {} + a = [] + Pathname(".").each_entry {|v| a << v } + assert_equal([Pathname("."), Pathname(".."), Pathname("a"), Pathname("b")], a.sort) + } + end + + def test_mkdir + with_tmpchdir('rubytest-pathname') {|dir| + Pathname("d").mkdir + assert(File.directory?("d")) + Pathname("e").mkdir(0770) + assert(File.directory?("e")) + } + end + + def test_rmdir + with_tmpchdir('rubytest-pathname') {|dir| + Pathname("d").mkdir + assert(File.directory?("d")) + Pathname("d").rmdir + assert(!File.exist?("d")) + } + end + + def test_opendir + with_tmpchdir('rubytest-pathname') {|dir| + open("a", "w") {} + open("b", "w") {} + a = [] + Pathname(".").opendir {|d| + d.each {|e| a << e } + } + assert_equal([".", "..", "a", "b"], a.sort) + } + end + + def test_find + with_tmpchdir('rubytest-pathname') {|dir| + open("a", "w") {} + open("b", "w") {} + Dir.mkdir("d") + open("d/x", "w") {} + open("d/y", "w") {} + a = []; Pathname(".").find {|v| a << v }; a.sort! + assert_equal([Pathname("."), Pathname("a"), Pathname("b"), Pathname("d"), Pathname("d/x"), Pathname("d/y")], a) + a = []; Pathname("d").find {|v| a << v }; a.sort! + assert_equal([Pathname("d"), Pathname("d/x"), Pathname("d/y")], a) + a = Pathname(".").find.sort + assert_equal([Pathname("."), Pathname("a"), Pathname("b"), Pathname("d"), Pathname("d/x"), Pathname("d/y")], a) + a = Pathname("d").find.sort + assert_equal([Pathname("d"), Pathname("d/x"), Pathname("d/y")], a) + + begin + File.unlink("d/y") + File.chmod(0600, "d") + a = []; Pathname(".").find(ignore_error: true) {|v| a << v }; a.sort! + assert_equal([Pathname("."), Pathname("a"), Pathname("b"), Pathname("d"), Pathname("d/x")], a) + a = []; Pathname("d").find(ignore_error: true) {|v| a << v }; a.sort! + assert_equal([Pathname("d"), Pathname("d/x")], a) + + skip "no meaning test on Windows" if /mswin|mingw/ =~ RUBY_PLATFORM + a = []; + assert_raise_with_message(Errno::EACCES, %r{d/x}) do + Pathname(".").find(ignore_error: false) {|v| a << v } + end + a.sort! + assert_equal([Pathname("."), Pathname("a"), Pathname("b"), Pathname("d"), Pathname("d/x")], a) + a = []; + assert_raise_with_message(Errno::EACCES, %r{d/x}) do + Pathname("d").find(ignore_error: false) {|v| a << v } + end + a.sort! + assert_equal([Pathname("d"), Pathname("d/x")], a) + ensure + File.chmod(0700, "d") + end + } + end + + def test_mkpath + with_tmpchdir('rubytest-pathname') {|dir| + Pathname("a/b/c/d").mkpath + assert(File.directory?("a/b/c/d")) + } + end + + def test_rmtree + with_tmpchdir('rubytest-pathname') {|dir| + Pathname("a/b/c/d").mkpath + assert(File.exist?("a/b/c/d")) + Pathname("a").rmtree + assert(!File.exist?("a")) + } + end + + def test_unlink + with_tmpchdir('rubytest-pathname') {|dir| + open("f", "w") {|f| f.write "abc" } + Pathname("f").unlink + assert(!File.exist?("f")) + Dir.mkdir("d") + Pathname("d").unlink + assert(!File.exist?("d")) + } + end + + def test_matchop + assert_raise(NoMethodError) { Pathname("a") =~ /a/ } + end + + def test_file_basename + assert_equal("bar", File.basename(Pathname.new("foo/bar"))) + end + + def test_file_dirname + assert_equal("foo", File.dirname(Pathname.new("foo/bar"))) + end + + def test_file_split + assert_equal(["foo", "bar"], File.split(Pathname.new("foo/bar"))) + end + + def test_file_extname + assert_equal(".baz", File.extname(Pathname.new("bar.baz"))) + end + + def test_file_fnmatch + assert(File.fnmatch("*.*", Pathname.new("bar.baz"))) + end + + def test_file_join + assert_equal("foo/bar", File.join(Pathname.new("foo"), Pathname.new("bar"))) + lambda { + $SAFE = 1 + assert_equal("foo/bar", File.join(Pathname.new("foo"), Pathname.new("bar").taint)) + }.call + end + + def test_relative_path_from_casefold + assert_separately([], <<-'end;') # do + module File::Constants + remove_const :FNM_SYSCASE + FNM_SYSCASE = FNM_CASEFOLD + end + require 'pathname' + foo = Pathname.new("fo\u{f6}") + bar = Pathname.new("b\u{e4}r".encode("ISO-8859-1")) + assert_instance_of(Pathname, foo.relative_path_from(bar)) + end; + end +end |