win32-file 0.6.9 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES +10 -4
- data/MANIFEST +6 -6
- data/README +30 -63
- data/Rakefile +3 -21
- data/lib/win32/file.rb +347 -1154
- data/lib/win32/file/constants.rb +27 -0
- data/lib/win32/file/functions.rb +49 -0
- data/lib/win32/file/structs.rb +24 -0
- data/test/test_win32_file_link.rb +141 -0
- data/test/test_win32_file_misc.rb +16 -0
- data/test/test_win32_file_path.rb +42 -35
- data/test/test_win32_file_stat.rb +275 -105
- data/win32-file.gemspec +5 -4
- metadata +19 -26
- data/test/test_win32_file_attributes.rb +0 -285
- data/test/test_win32_file_constants.rb +0 -46
- data/test/test_win32_file_encryption.rb +0 -44
- data/test/test_win32_file_security.rb +0 -66
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'ffi'
|
2
|
+
|
3
|
+
module Windows
|
4
|
+
module File
|
5
|
+
module Constants
|
6
|
+
FILE_ATTRIBUTE_NORMAL = 0x00000080
|
7
|
+
FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400
|
8
|
+
FILE_FLAG_BACKUP_SEMANTICS = 0x02000000
|
9
|
+
FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000
|
10
|
+
FILE_SHARE_READ = 1
|
11
|
+
|
12
|
+
FILE_TYPE_UNKNOWN = 0x0000
|
13
|
+
FILE_TYPE_CHAR = 0x0002
|
14
|
+
NO_ERROR = 0
|
15
|
+
|
16
|
+
GENERIC_READ = 0x80000000
|
17
|
+
INVALID_HANDLE_VALUE = (1 << FFI::Platform::ADDRESS_SIZE) - 1
|
18
|
+
INVALID_FILE_ATTRIBUTES = (1 << FFI::Platform::ADDRESS_SIZE) - 1
|
19
|
+
IO_REPARSE_TAG_SYMLINK = 0xA000000C
|
20
|
+
OPEN_EXISTING = 3
|
21
|
+
|
22
|
+
DRIVE_REMOVABLE = 2
|
23
|
+
DRIVE_CDROM = 5
|
24
|
+
DRIVE_RAMDISK = 6
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Windows
|
2
|
+
module File
|
3
|
+
module Functions
|
4
|
+
extend FFI::Library
|
5
|
+
ffi_lib :kernel32
|
6
|
+
|
7
|
+
typedef :ulong, :dword
|
8
|
+
typedef :uintptr_t, :handle
|
9
|
+
typedef :pointer, :ptr
|
10
|
+
|
11
|
+
def self.attach_pfunc(*args)
|
12
|
+
attach_function(*args)
|
13
|
+
private args[0]
|
14
|
+
end
|
15
|
+
|
16
|
+
attach_pfunc :CloseHandle, [:handle], :bool
|
17
|
+
attach_pfunc :CreateFileW, [:buffer_in, :dword, :dword, :pointer, :dword, :dword, :handle], :handle
|
18
|
+
attach_pfunc :CreateSymbolicLinkW, [:buffer_in, :buffer_in, :dword], :bool
|
19
|
+
attach_pfunc :FindFirstFileW, [:buffer_in, :pointer], :handle
|
20
|
+
attach_pfunc :GetDiskFreeSpaceW, [:buffer_in, :pointer, :pointer, :pointer, :pointer], :bool
|
21
|
+
attach_pfunc :GetDriveTypeW, [:buffer_in], :uint
|
22
|
+
attach_pfunc :GetFileType, [:handle], :dword
|
23
|
+
attach_pfunc :GetFileAttributesW, [:buffer_in], :dword
|
24
|
+
attach_pfunc :GetFinalPathNameByHandleW, [:handle, :buffer_out, :dword, :dword], :dword
|
25
|
+
attach_pfunc :GetShortPathNameW, [:buffer_in, :buffer_out, :dword], :dword
|
26
|
+
attach_pfunc :GetLongPathNameW, [:buffer_in, :buffer_out, :dword], :dword
|
27
|
+
attach_pfunc :QueryDosDeviceA, [:string, :buffer_out, :dword], :dword
|
28
|
+
|
29
|
+
ffi_lib :shlwapi
|
30
|
+
|
31
|
+
attach_pfunc :PathFindExtensionW, [:buffer_in], :pointer
|
32
|
+
attach_pfunc :PathIsRootW, [:buffer_in], :bool
|
33
|
+
attach_pfunc :PathStripPathW, [:pointer], :void
|
34
|
+
attach_pfunc :PathRemoveBackslashW, [:buffer_in], :string
|
35
|
+
attach_pfunc :PathRemoveFileSpecW, [:pointer], :bool
|
36
|
+
attach_pfunc :PathRemoveExtensionW, [:buffer_in], :void
|
37
|
+
attach_pfunc :PathStripToRootW, [:buffer_in], :bool
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class String
|
43
|
+
# Read a wide character string up until the first double null, and delete
|
44
|
+
# any remaining null characters.
|
45
|
+
def wstrip
|
46
|
+
self.force_encoding('UTF-16LE').encode('UTF-8',:invalid=>:replace,:undef=>:replace).
|
47
|
+
split("\x00")[0].encode(Encoding.default_external)
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Windows
|
2
|
+
module File
|
3
|
+
module Structs
|
4
|
+
class FILETIME < FFI::Struct
|
5
|
+
layout(:dwLowDateTime, :ulong, :dwHighDateTime, :ulong)
|
6
|
+
end
|
7
|
+
|
8
|
+
class WIN32_FIND_DATA < FFI::Struct
|
9
|
+
layout(
|
10
|
+
:dwFileAttributes, :ulong,
|
11
|
+
:ftCreationTime, FILETIME,
|
12
|
+
:ftLastAccessTime, FILETIME,
|
13
|
+
:ftLastWriteTime, FILETIME,
|
14
|
+
:nFileSizeHigh, :ulong,
|
15
|
+
:nFileSizeLow, :ulong,
|
16
|
+
:dwReserved0, :ulong,
|
17
|
+
:dwReserved1, :ulong,
|
18
|
+
:cFileName, [:uint8, 260*2],
|
19
|
+
:cAlternateFileName, [:uint8, 14*2]
|
20
|
+
)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
#############################################################################
|
2
|
+
# test_win32_file_link.rb
|
3
|
+
#
|
4
|
+
# Test case for the link related methods of win32-file. You should run this
|
5
|
+
# test via the 'rake test' or 'rake test:link' task.
|
6
|
+
#############################################################################
|
7
|
+
require 'test-unit'
|
8
|
+
require 'win32/security'
|
9
|
+
require 'win32/file'
|
10
|
+
|
11
|
+
class TC_Win32_File_Link < Test::Unit::TestCase
|
12
|
+
def self.startup
|
13
|
+
Dir.chdir(File.expand_path(File.dirname(__FILE__)))
|
14
|
+
@@file = File.join(Dir.pwd, 'link_test.txt')
|
15
|
+
File.open(@@file, 'w'){ |fh| fh.puts "This is a link test." }
|
16
|
+
end
|
17
|
+
|
18
|
+
def setup
|
19
|
+
@link = "this_is_a_symlink"
|
20
|
+
@file = "link_test.txt"
|
21
|
+
@admin = Win32::Security.elevated_security?
|
22
|
+
end
|
23
|
+
|
24
|
+
test "symlink basic functionality" do
|
25
|
+
assert_respond_to(File, :symlink)
|
26
|
+
end
|
27
|
+
|
28
|
+
test "symlink to a file works as expected" do
|
29
|
+
omit_unless(@admin)
|
30
|
+
assert_nothing_raised{ File.symlink(@@file, @link) }
|
31
|
+
assert_true(File.exists?(@link))
|
32
|
+
assert_true(File.symlink?(@link))
|
33
|
+
end
|
34
|
+
|
35
|
+
test "symlink method returns zero" do
|
36
|
+
omit_unless(@admin)
|
37
|
+
assert_equal(0, File.symlink(@@file, @link))
|
38
|
+
end
|
39
|
+
|
40
|
+
test "symlink requires two arguments" do
|
41
|
+
assert_raise(ArgumentError){ File.symlink }
|
42
|
+
assert_raise(ArgumentError){ File.symlink(@link) }
|
43
|
+
assert_raise(ArgumentError){ File.symlink(@@file, @link, @link) }
|
44
|
+
end
|
45
|
+
|
46
|
+
test "symlink fails if link already exists" do
|
47
|
+
omit_unless(@admin)
|
48
|
+
File.symlink(@@file, @link)
|
49
|
+
assert_raise(SystemCallError){ File.symlink(@@file, @link) }
|
50
|
+
end
|
51
|
+
|
52
|
+
test "symlink does not fail if target does not exist" do
|
53
|
+
omit_unless(@admin)
|
54
|
+
assert_nothing_raised{ File.symlink('bogus.txt', @link) }
|
55
|
+
end
|
56
|
+
|
57
|
+
test "symlink? basic functionality" do
|
58
|
+
assert_respond_to(File, :symlink?)
|
59
|
+
assert_boolean(File.symlink?(@@file))
|
60
|
+
end
|
61
|
+
|
62
|
+
test "symlink? returns expected result" do
|
63
|
+
omit_unless(@admin)
|
64
|
+
File.symlink(@@file, @link)
|
65
|
+
assert_true(File.symlink?(@link))
|
66
|
+
assert_false(File.symlink?(@file))
|
67
|
+
end
|
68
|
+
|
69
|
+
test "symlink? requires one argument only" do
|
70
|
+
assert_raise(ArgumentError){ File.symlink? }
|
71
|
+
assert_raise(ArgumentError){ File.symlink?(@@file, @@file) }
|
72
|
+
end
|
73
|
+
|
74
|
+
test "readlink basic functionality" do
|
75
|
+
assert_respond_to(File, :readlink)
|
76
|
+
end
|
77
|
+
|
78
|
+
test "readlink returns the expected value when reading a symlink" do
|
79
|
+
omit_unless(@admin)
|
80
|
+
File.symlink(@file, @link)
|
81
|
+
expected = File.expand_path(@file).tr("/", "\\")
|
82
|
+
assert_equal(expected, File.readlink(@link))
|
83
|
+
end
|
84
|
+
|
85
|
+
test "readlink raises an error when reading a regular file" do
|
86
|
+
assert_raise(Errno::EINVAL){ File.readlink(@@file) }
|
87
|
+
end
|
88
|
+
|
89
|
+
test "readlink requires one argument only" do
|
90
|
+
assert_raise(ArgumentError){ File.readlink }
|
91
|
+
assert_raise(ArgumentError){ File.readlink(@link, @link) }
|
92
|
+
end
|
93
|
+
|
94
|
+
test "readlink raises an error if the file is not found" do
|
95
|
+
assert_raise(Errno::ENOENT){ File.readlink('bogus.txt') }
|
96
|
+
end
|
97
|
+
|
98
|
+
test "realdirpath basic functionality" do
|
99
|
+
assert_respond_to(File, :realdirpath)
|
100
|
+
end
|
101
|
+
|
102
|
+
test "realdirpath returns the expected value for a regular file" do
|
103
|
+
assert_equal(Dir.pwd, File.realdirpath(Dir.pwd))
|
104
|
+
assert_equal(@@file, File.realdirpath(@@file).tr("/", "\\"))
|
105
|
+
end
|
106
|
+
|
107
|
+
test "realdirpath returns the expected value for a symlink" do
|
108
|
+
omit_unless(@admin)
|
109
|
+
File.symlink(@@file, @link)
|
110
|
+
expected = File.expand_path(@file).tr("/", "\\")
|
111
|
+
assert_equal(expected, File.realdirpath(@link))
|
112
|
+
end
|
113
|
+
|
114
|
+
test "realpath basic functionality" do
|
115
|
+
assert_respond_to(File, :realpath)
|
116
|
+
end
|
117
|
+
|
118
|
+
test "realpath returns the expected value for a regular file" do
|
119
|
+
assert_equal(Dir.pwd, File.realpath(Dir.pwd))
|
120
|
+
assert_equal(@@file, File.realpath(@@file).tr("/", "\\"))
|
121
|
+
end
|
122
|
+
|
123
|
+
test "realpath returns the expected value for a symlink" do
|
124
|
+
omit_unless(@admin)
|
125
|
+
File.symlink(@@file, @link)
|
126
|
+
expected = File.expand_path(@file).tr("/", "\\")
|
127
|
+
assert_equal(expected, File.realpath(@link))
|
128
|
+
end
|
129
|
+
|
130
|
+
def teardown
|
131
|
+
File.delete(@link) rescue nil # Necessary for dangling links
|
132
|
+
@link = nil
|
133
|
+
@admin = nil
|
134
|
+
@file = nil
|
135
|
+
end
|
136
|
+
|
137
|
+
def self.shutdown
|
138
|
+
File.delete(@@file) if File.exists?(@@file)
|
139
|
+
@@file = nil
|
140
|
+
end
|
141
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
########################################################################
|
2
|
+
# Miscellaneous tests for win32-file that didn't fit anywhere else.
|
3
|
+
########################################################################
|
4
|
+
require 'win32/file'
|
5
|
+
require 'test-unit'
|
6
|
+
|
7
|
+
class TC_Win32_File_Misc < Test::Unit::TestCase
|
8
|
+
test "version constant is set to expected value" do
|
9
|
+
assert_equal('0.7.0', File::WIN32_FILE_VERSION)
|
10
|
+
end
|
11
|
+
|
12
|
+
test "ffi functions are private" do
|
13
|
+
assert_not_respond_to(File, :CloseHandle)
|
14
|
+
assert_not_respond_to(File, :CreateFileW)
|
15
|
+
end
|
16
|
+
end
|
@@ -2,32 +2,29 @@
|
|
2
2
|
# test_win32_file_path.rb
|
3
3
|
#
|
4
4
|
# Test case for the path related methods of win32-file. You should run this
|
5
|
-
# test via the 'rake
|
5
|
+
# test via the 'rake' or 'rake test:path' task.
|
6
6
|
#############################################################################
|
7
|
-
require '
|
8
|
-
gem 'test-unit'
|
9
|
-
|
10
|
-
require 'test/unit'
|
7
|
+
require 'test-unit'
|
11
8
|
require 'win32/file'
|
12
9
|
|
13
10
|
class TC_Win32_File_Path < Test::Unit::TestCase
|
14
11
|
def self.startup
|
15
|
-
Dir.chdir(File.
|
12
|
+
Dir.chdir(File.expand_path(File.dirname(__FILE__)))
|
16
13
|
@@file = File.join(Dir.pwd, 'path_test.txt')
|
17
14
|
File.open(@@file, 'w'){ |fh| fh.puts "This is a path test." }
|
18
15
|
end
|
19
16
|
|
20
17
|
def setup
|
21
|
-
@long_file = File.join(Dir.pwd, 'path_test.txt')
|
22
|
-
@short_file = File.join(Dir.pwd, 'PATH_T~1.TXT')
|
18
|
+
@long_file = File.join(Dir.pwd, 'path_test.txt').tr("/", "\\")
|
19
|
+
@short_file = File.join(Dir.pwd, 'PATH_T~1.TXT').tr("/", "\\")
|
23
20
|
end
|
24
|
-
|
21
|
+
|
25
22
|
test "basename method basic functionality" do
|
26
23
|
assert_respond_to(File, :basename)
|
27
24
|
assert_nothing_raised{ File.basename("C:\\foo") }
|
28
25
|
assert_kind_of(String, File.basename("C:\\foo"))
|
29
26
|
end
|
30
|
-
|
27
|
+
|
31
28
|
test "basename method handles standard paths" do
|
32
29
|
assert_equal("baz.txt", File.basename("C:\\foo\\bar\\baz.txt"))
|
33
30
|
assert_equal("baz", File.basename("C:\\foo\\bar\\baz.txt", ".txt"))
|
@@ -37,14 +34,14 @@ class TC_Win32_File_Path < Test::Unit::TestCase
|
|
37
34
|
assert_equal("foo", File.basename("C:\\foo"))
|
38
35
|
assert_equal("C:\\", File.basename("C:\\"))
|
39
36
|
end
|
40
|
-
|
37
|
+
|
41
38
|
test "basename method handles unc paths" do
|
42
39
|
assert_equal("baz.txt", File.basename("\\\\foo\\bar\\baz.txt"))
|
43
40
|
assert_equal("baz", File.basename("\\\\foo\\bar\\baz"))
|
44
41
|
assert_equal("\\\\foo", File.basename("\\\\foo"))
|
45
42
|
assert_equal("\\\\foo\\bar", File.basename("\\\\foo\\bar"))
|
46
43
|
end
|
47
|
-
|
44
|
+
|
48
45
|
test "basename method handles forward slashes in standard unix paths" do
|
49
46
|
assert_equal("bar", File.basename("/foo/bar"))
|
50
47
|
assert_equal("bar.txt", File.basename("/foo/bar.txt"))
|
@@ -58,7 +55,7 @@ class TC_Win32_File_Path < Test::Unit::TestCase
|
|
58
55
|
assert_equal("\\\\foo", File.basename("//foo"))
|
59
56
|
assert_equal("\\\\foo\\bar", File.basename("//foo/bar"))
|
60
57
|
end
|
61
|
-
|
58
|
+
|
62
59
|
test "basename method handles forward slashes in windows paths" do
|
63
60
|
assert_equal("bar", File.basename("C:/foo/bar"))
|
64
61
|
assert_equal("bar", File.basename("C:/foo/bar/"))
|
@@ -66,14 +63,14 @@ class TC_Win32_File_Path < Test::Unit::TestCase
|
|
66
63
|
assert_equal("C:\\", File.basename("C:/"))
|
67
64
|
assert_equal("bar", File.basename("C:/foo/bar//"))
|
68
65
|
end
|
69
|
-
|
66
|
+
|
70
67
|
test "basename handles edge cases as expected" do
|
71
68
|
assert_equal("", File.basename(""))
|
72
69
|
assert_equal(".", File.basename("."))
|
73
70
|
assert_equal("..", File.basename(".."))
|
74
71
|
assert_equal("foo", File.basename("//foo/"))
|
75
72
|
end
|
76
|
-
|
73
|
+
|
77
74
|
test "basename handles path names with suffixes" do
|
78
75
|
assert_equal("bar", File.basename("bar.txt", ".txt"))
|
79
76
|
assert_equal("bar", File.basename("/foo/bar.txt", ".txt"))
|
@@ -83,11 +80,11 @@ class TC_Win32_File_Path < Test::Unit::TestCase
|
|
83
80
|
assert_equal("bar", File.basename("bar.txt", ".*"))
|
84
81
|
assert_equal("bar.txt", File.basename("bar.txt.exe", ".*"))
|
85
82
|
end
|
86
|
-
|
83
|
+
|
87
84
|
test "basename method does not modify its argument" do
|
88
85
|
path = "C:\\foo\\bar"
|
89
86
|
assert_nothing_raised{ File.basename(path) }
|
90
|
-
assert_equal("C:\\foo\\bar", path)
|
87
|
+
assert_equal("C:\\foo\\bar", path)
|
91
88
|
end
|
92
89
|
|
93
90
|
test "basename removes all trailing slashes" do
|
@@ -99,13 +96,13 @@ class TC_Win32_File_Path < Test::Unit::TestCase
|
|
99
96
|
assert_equal("foo.txt", File.basename("C:\\foo.txt\\\\\\"))
|
100
97
|
assert_equal("foo.txt", File.basename("foo.txt\\\\\\"))
|
101
98
|
end
|
102
|
-
|
99
|
+
|
103
100
|
test "dirname basic functionality" do
|
104
101
|
assert_respond_to(File, :dirname)
|
105
102
|
assert_nothing_raised{ File.dirname("C:\\foo") }
|
106
103
|
assert_kind_of(String, File.dirname("C:\\foo"))
|
107
104
|
end
|
108
|
-
|
105
|
+
|
109
106
|
test "dirname handles standard windows paths as expected" do
|
110
107
|
assert_equal("C:\\foo", File.dirname("C:\\foo\\bar.txt"))
|
111
108
|
assert_equal("C:\\foo", File.dirname("C:\\foo\\bar"))
|
@@ -113,14 +110,14 @@ class TC_Win32_File_Path < Test::Unit::TestCase
|
|
113
110
|
assert_equal("C:\\", File.dirname("C:\\"))
|
114
111
|
assert_equal(".", File.dirname("foo"))
|
115
112
|
end
|
116
|
-
|
113
|
+
|
117
114
|
test "dirname handles unc windows paths as expected" do
|
118
115
|
assert_equal("\\\\foo\\bar", File.dirname("\\\\foo\\bar\\baz"))
|
119
116
|
assert_equal("\\\\foo\\bar", File.dirname("\\\\foo\\bar"))
|
120
117
|
assert_equal("\\\\foo", File.dirname("\\\\foo"))
|
121
118
|
assert_equal("\\\\", File.dirname("\\\\"))
|
122
119
|
end
|
123
|
-
|
120
|
+
|
124
121
|
test "dirname handles forward slashes in standard windows path names" do
|
125
122
|
assert_equal("C:\\foo", File.dirname("C:/foo/bar.txt"))
|
126
123
|
assert_equal("C:\\foo", File.dirname("C:/foo/bar"))
|
@@ -139,14 +136,14 @@ class TC_Win32_File_Path < Test::Unit::TestCase
|
|
139
136
|
assert_equal(".", File.dirname("./foo"))
|
140
137
|
assert_equal(".\\foo", File.dirname("./foo/bar"))
|
141
138
|
end
|
142
|
-
|
139
|
+
|
143
140
|
test "dirname handles various edge cases as expected" do
|
144
141
|
assert_equal(".", File.dirname(""))
|
145
142
|
assert_equal(".", File.dirname("."))
|
146
143
|
assert_equal(".", File.dirname(".."))
|
147
144
|
assert_equal(".", File.dirname("./"))
|
148
145
|
end
|
149
|
-
|
146
|
+
|
150
147
|
test "dirname method does not modify its argument" do
|
151
148
|
path = "C:\\foo\\bar"
|
152
149
|
assert_nothing_raised{ File.dirname(path) }
|
@@ -171,9 +168,9 @@ class TC_Win32_File_Path < Test::Unit::TestCase
|
|
171
168
|
assert_nothing_raised{ File.split("C:\\foo\\bar") }
|
172
169
|
assert_kind_of(Array, File.split("C:\\foo\\bar"))
|
173
170
|
end
|
174
|
-
|
171
|
+
|
175
172
|
test "split method handles standard windows path names" do
|
176
|
-
assert_equal(["C:\\foo", "bar"], File.split("C:\\foo\\bar"))
|
173
|
+
assert_equal(["C:\\foo", "bar"], File.split("C:\\foo\\bar"))
|
177
174
|
assert_equal([".", "foo"], File.split("foo"))
|
178
175
|
end
|
179
176
|
|
@@ -181,13 +178,13 @@ class TC_Win32_File_Path < Test::Unit::TestCase
|
|
181
178
|
assert_equal(["C:\\foo", "bar"], File.split("C:/foo/bar"))
|
182
179
|
assert_equal([".", "foo"], File.split("foo"))
|
183
180
|
end
|
184
|
-
|
181
|
+
|
185
182
|
test "split method handles standard unix paths as expected" do
|
186
183
|
assert_equal(["\\foo","bar"], File.split("/foo/bar"))
|
187
184
|
assert_equal(["\\", "foo"], File.split("/foo"))
|
188
185
|
assert_equal([".", "foo"], File.split("foo"))
|
189
186
|
end
|
190
|
-
|
187
|
+
|
191
188
|
test "split method handles unc paths as expected" do
|
192
189
|
assert_equal(["\\\\foo\\bar", "baz"], File.split("\\\\foo\\bar\\baz"))
|
193
190
|
assert_equal(["\\\\foo\\bar", ""], File.split("\\\\foo\\bar"))
|
@@ -199,22 +196,32 @@ class TC_Win32_File_Path < Test::Unit::TestCase
|
|
199
196
|
assert_equal(["C:\\", ""], File.split("C:\\"))
|
200
197
|
assert_equal(["", ""], File.split(""))
|
201
198
|
end
|
202
|
-
|
199
|
+
|
203
200
|
test "split method does not modify its arguments" do
|
204
201
|
path = "C:\\foo\\bar"
|
205
202
|
assert_nothing_raised{ File.split(path) }
|
206
203
|
assert_equal("C:\\foo\\bar", path)
|
207
204
|
end
|
208
|
-
|
209
|
-
test "long_path
|
205
|
+
|
206
|
+
test "File.long_path basic functionality" do
|
210
207
|
assert_respond_to(File, :long_path)
|
208
|
+
assert_nothing_raised{ File.long_path(@short_file) }
|
209
|
+
assert_kind_of(String, File.long_path(@short_file))
|
210
|
+
end
|
211
|
+
|
212
|
+
test "File.long_path returns the expected result" do
|
211
213
|
assert_equal(@long_file, File.long_path(@short_file))
|
212
|
-
assert_equal('PATH_T~1.TXT', File.basename(@short_file))
|
213
214
|
end
|
214
|
-
|
215
|
-
test "short_path
|
215
|
+
|
216
|
+
test "File.short_path basic functionality" do
|
216
217
|
assert_respond_to(File, :short_path)
|
217
|
-
|
218
|
+
assert_nothing_raised{ File.short_path(@short_file) }
|
219
|
+
assert_kind_of(String, File.short_path(@short_file))
|
220
|
+
end
|
221
|
+
|
222
|
+
test "File.short_path returns the expected result" do
|
223
|
+
path = File.short_path(@long_file)
|
224
|
+
assert_equal('PATH_T~1.TXT', File.basename(path))
|
218
225
|
end
|
219
226
|
|
220
227
|
test "join method works as expected" do
|
@@ -243,7 +250,7 @@ class TC_Win32_File_Path < Test::Unit::TestCase
|
|
243
250
|
assert_equal('foo', File.join('foo'))
|
244
251
|
assert_equal('c:', File.join('c:'))
|
245
252
|
end
|
246
|
-
|
253
|
+
|
247
254
|
def teardown
|
248
255
|
@short_file = nil
|
249
256
|
@long_file = nil
|