Ruby 1.8.5
Windows XP Pro, SP2
The File.basename method does not work properly on Windows root paths. IMO, calling File.basename on a root path should
return itself. However, on MS Windows it appears to be dropping the volume name and it doesn't handle UNC root paths
correctly:
require 'test/unit'
class TC_File_Basename_ClassMethod < Test::Unit::TestCase
def test_basename_windows_root_forward_slash
assert_equal("C:/", File.basename("C:/"))
end
def test_basename_windows_root_backslash
assert_equal("C:\\", File.basename("C:\\")) # Or "C:/" if you prefer
end
def test_basename_windows_unc_root_two_elements
assert_equal("\\\\foo\\bar", File.basename("\\\\foo\\bar"))
end
def test_basename_windows_unc_root_one_element
assert_equal("\\\\foo", File.basename("\\\\foo"))
end
end
C:\Documents and Settings\djberge\My Documents\Ruby>ruby basename_bugs.rb
Loaded suite basename_bugs
Started
FFFF
Finished in 0.07 seconds.
1) Failure:
test_basename_windows_root_backslash(TC_File_Basename_ClassMethod) [basename_bugs.rb:9]:
<"C:\\"> expected but was
<"\\">.
2) Failure:
test_basename_windows_root_forward_slash(TC_File_Basename_ClassMethod) [basename_bugs.rb:5]:
<"C:/"> expected but was
<"/">.
3) Failure:
test_basename_windows_unc_root_one_element(TC_File_Basename_ClassMethod) [basename_bugs.rb:17]:
<"\\\\foo"> expected but was
<"/">.
4) Failure:
test_basename_windows_unc_root_two_elements(TC_File_Basename_ClassMethod) [basename_bugs.rb:13]:
<"\\\\foo\\bar"> expected but was
<"/">.
4 tests, 4 assertions, 4 failures, 0 errors
This method should probably be moved to win32.c where you can use the Windows path handling functions from shlwapi.h
to get things right, and convert the path separators as you see fit.
Regards,
Dan |