win32-dir 0.3.7 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,18 @@
1
+ module Dir::Constants
2
+ private
3
+
4
+ FILE_DEVICE_FILE_SYSTEM = 0x00000009
5
+ INVALID_HANDLE_VALUE = 0xFFFFFFFF
6
+ INVALID_FILE_ATTRIBUTES = 0xFFFFFFFF
7
+ FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000
8
+ FILE_FLAG_BACKUP_SEMANTICS = 0x02000000
9
+ FILE_ATTRIBUTE_DIRECTORY = 0x00000010
10
+ FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400
11
+ ERROR_ALREADY_EXISTS = 183
12
+ METHOD_BUFFERED = 0
13
+ OPEN_EXISTING = 3
14
+ GENERIC_READ = 0x80000000
15
+ GENERIC_WRITE = 0x40000000
16
+ SHGFI_DISPLAYNAME = 0x000000200
17
+ SHGFI_PIDL = 0x000000008
18
+ end
@@ -0,0 +1,35 @@
1
+ # Necessary to force JRuby to use the gem, not its builtin version
2
+ if RUBY_PLATFORM == 'java'
3
+ require 'rubygems'
4
+ gem 'ffi'
5
+ end
6
+
7
+ require 'ffi'
8
+
9
+ module Dir::Functions
10
+ extend FFI::Library
11
+
12
+ ffi_lib :shell32
13
+
14
+ attach_function :SHGetFolderPathW, [:ulong, :int, :ulong, :ulong, :buffer_out], :ulong
15
+ attach_function :SHGetFolderLocation, [:ulong, :int, :ulong, :ulong, :pointer], :ulong
16
+ attach_function :SHGetFileInfo, [:ulong, :ulong, :pointer, :uint, :uint], :ulong
17
+
18
+ ffi_lib :shlwapi
19
+
20
+ attach_function :PathIsDirectoryEmptyW, [:buffer_in], :bool
21
+
22
+ ffi_lib :kernel32
23
+
24
+ attach_function :CloseHandle, [:ulong], :bool
25
+ attach_function :CreateDirectoryW, [:buffer_in, :pointer], :bool
26
+ attach_function :CreateFileW, [:buffer_in, :ulong, :ulong, :pointer, :ulong, :ulong, :ulong], :ulong
27
+ attach_function :DeviceIoControl, [:ulong, :ulong, :pointer, :ulong, :pointer, :ulong, :pointer, :pointer], :bool
28
+ attach_function :GetCurrentDirectoryW, [:ulong, :buffer_out], :ulong
29
+ attach_function :GetFileAttributesW, [:buffer_in], :ulong
30
+ attach_function :GetLastError, [], :ulong
31
+ attach_function :GetShortPathNameW, [:buffer_in, :buffer_out, :ulong], :ulong
32
+ attach_function :GetLongPathNameW, [:buffer_in, :buffer_out, :ulong], :ulong
33
+ attach_function :GetFullPathNameW, [:buffer_in, :ulong, :buffer_out, :pointer], :ulong
34
+ attach_function :RemoveDirectoryW, [:buffer_in], :bool
35
+ end
@@ -0,0 +1,29 @@
1
+ require 'ffi'
2
+
3
+ module Dir::Structs
4
+ extend FFI::Library
5
+
6
+ class SHFILEINFO < FFI::Struct
7
+ layout(
8
+ :hIcon, :ulong,
9
+ :iIcon, :int,
10
+ :dwAttributes, :ulong,
11
+ :szDisplayName, [:char, 256],
12
+ :szTypeName, [:char, 80]
13
+ )
14
+ end
15
+
16
+ # I fudge a bit, assuming a MountPointReparseBuffer
17
+ class REPARSE_JDATA_BUFFER < FFI::Struct
18
+ layout(
19
+ :ReparseTag, :ulong,
20
+ :ReparseDataLength, :ushort,
21
+ :Reserved, :ushort,
22
+ :SubstituteNameOffset, :ushort,
23
+ :SubstituteNameLength, :ushort,
24
+ :PrintNameOffset, :ushort,
25
+ :PrintNameLength, :ushort,
26
+ :PathBuffer, [:char, 1024]
27
+ )
28
+ end
29
+ end
@@ -5,30 +5,27 @@
5
5
  # Test suite for the win32-dir library. You should run this test case
6
6
  # via the 'rake test' task.
7
7
  ###########################################################################
8
- require 'rubygems'
9
- gem 'test-unit'
10
-
11
- require 'test/unit'
8
+ require 'test-unit'
12
9
  require 'win32/dir'
10
+ require 'tmpdir'
13
11
  require 'fileutils'
14
12
 
15
13
  class TC_Win32_Dir < Test::Unit::TestCase
16
14
  def self.startup
17
- @@test_home = File.dirname(File.expand_path(__FILE__))
15
+ @@java = RUBY_PLATFORM == 'java'
16
+ @@temp = Dir.tmpdir
17
+ @@from = File.join(@@temp, "test_from_directory")
18
+ Dir.mkdir(@@from)
18
19
  end
19
20
 
20
21
  def setup
21
- Dir.chdir(@@test_home) unless File.basename(Dir.pwd) == 'test'
22
- @@from = File.join(Dir.pwd, "test_from_directory")
23
-
24
- @ascii_to = "test_to_directory"
25
- @unicode_to = "Ελλάσ" # Greek - the word is 'Hellas'
22
+ @ascii_to = File.join(@@temp, "test_to_directory")
23
+ @unicode_to = File.join(@@temp, "Ελλάσ")
26
24
  @test_file = File.join(@@from, "test.txt")
27
- Dir.mkdir(@@from)
28
25
  end
29
-
26
+
30
27
  def test_version
31
- assert_equal('0.3.7', Dir::VERSION)
28
+ assert_equal('0.4.0', Dir::VERSION)
32
29
  end
33
30
 
34
31
  test 'glob handles backslashes' do
@@ -53,327 +50,336 @@ class TC_Win32_Dir < Test::Unit::TestCase
53
50
  assert_nothing_raised{ Dir[pattern] }
54
51
  assert_true(Dir[pattern].size > 0)
55
52
  end
56
-
57
- def test_create_junction_basic
53
+
54
+ test "create_junction basic functionality" do
58
55
  assert_respond_to(Dir, :create_junction)
59
56
  end
60
57
 
61
- def test_create_junction_ascii
58
+ test "create_junction works as expected with ascii characters" do
62
59
  assert_nothing_raised{ Dir.create_junction(@ascii_to, @@from) }
63
60
  assert_true(File.exists?(@ascii_to))
64
61
  File.open(@test_file, 'w'){ |fh| fh.puts "Hello World" }
65
62
  assert_equal(Dir.entries(@@from), Dir.entries(@ascii_to))
66
63
  end
67
64
 
68
- def test_create_junction_unicode
65
+ test "create_junction works as expected with unicode characters" do
69
66
  assert_nothing_raised{ Dir.create_junction(@unicode_to, @@from) }
70
67
  assert_true(File.exists?(@unicode_to))
71
68
  File.open(@test_file, 'w'){ |fh| fh.puts "Hello World" }
72
69
  assert_equal(Dir.entries(@@from), Dir.entries(@unicode_to))
73
70
  end
74
-
75
- def test_is_junction
71
+
72
+ test "junction? method returns boolean value" do
76
73
  assert_respond_to(Dir, :junction?)
77
74
  assert_nothing_raised{ Dir.create_junction(@ascii_to, @@from) }
78
- assert_equal(false, Dir.junction?(@@from))
79
- assert_equal(true, Dir.junction?(@ascii_to))
75
+ assert_false(Dir.junction?(@@from))
76
+ assert_true(Dir.junction?(@ascii_to))
80
77
  end
81
78
 
82
- def test_reparse_dir_alias
83
- assert_respond_to(Dir, :reparse_dir?) # alias
84
- assert_equal(true, Dir.method(:reparse_dir?) == Dir.method(:junction?))
79
+ test "reparse_dir? is an aliase for junction?" do
80
+ assert_respond_to(Dir, :reparse_dir?)
81
+ assert_true(Dir.method(:reparse_dir?) == Dir.method(:junction?))
85
82
  end
86
-
87
- def test_is_empty
83
+
84
+ test "empty? method returns expected result" do
88
85
  assert_respond_to(Dir, :empty?)
89
- assert_equal(false, Dir.empty?("C:\\")) # One would think
90
- assert_equal(true, Dir.empty?(@@from))
86
+ assert_false(Dir.empty?("C:\\")) # One would think
87
+ assert_true(Dir.empty?(@@from))
91
88
  end
92
89
 
93
- def test_pwd_basic
90
+ test "pwd basic functionality" do
91
+ omit_if(@@java)
94
92
  assert_respond_to(Dir, :pwd)
95
93
  assert_nothing_raised{ Dir.pwd }
96
94
  assert_kind_of(String, Dir.pwd)
97
95
  end
98
96
 
99
- def test_pwd_short_path
97
+ test "pwd returns full path even if short path was just used" do
98
+ omit_if(@@java)
100
99
  Dir.chdir("C:\\Progra~1")
101
100
  assert_equal("C:\\Program Files", Dir.pwd)
102
101
  end
103
102
 
104
- def test_pwd_long_path
103
+ test "pwd returns full path if long path was just used" do
104
+ omit_if(@@java)
105
105
  Dir.chdir("C:\\Program Files")
106
106
  assert_equal("C:\\Program Files", Dir.pwd)
107
107
  end
108
-
109
- def test_pwd_caps
108
+
109
+ test "pwd uses standard case conventions" do
110
+ omit_if(@@java)
110
111
  Dir.chdir("C:\\PROGRAM FILES")
111
112
  assert_equal("C:\\Program Files", Dir.pwd)
112
113
  end
113
-
114
- def test_pwd_forward_slash
114
+
115
+ test "pwd converts forward slashes to backslashes" do
116
+ omit_if(@@java)
115
117
  Dir.chdir("C:/Program Files")
116
118
  assert_equal("C:\\Program Files", Dir.pwd)
117
119
  end
118
-
119
- def test_pwd_is_proper_alias
120
+
121
+ test "pwd and getwd are aliases" do
122
+ omit_if(@@java)
120
123
  assert_true(Dir.method(:getwd) == Dir.method(:pwd))
121
124
  end
122
125
 
123
- def test_admintools
126
+ test "admintools constant is set" do
124
127
  assert_not_nil(Dir::ADMINTOOLS)
125
128
  assert_kind_of(String, Dir::ADMINTOOLS)
126
129
  end
127
-
128
- def test_altstartup
130
+
131
+ test "altstartup constant is set" do
129
132
  assert_not_nil(Dir::ALTSTARTUP)
130
133
  assert_kind_of(String, Dir::ALTSTARTUP)
131
134
  end
132
-
133
- def test_appdata
135
+
136
+ test "appdata constant is set" do
134
137
  assert_not_nil(Dir::APPDATA)
135
138
  assert_kind_of(String, Dir::APPDATA)
136
139
  end
137
-
138
- def test_bitbucket
140
+
141
+ test "bitbucket constant is set" do
139
142
  assert_not_nil(Dir::BITBUCKET)
140
143
  assert_kind_of(String, Dir::BITBUCKET)
141
144
  end
142
-
143
- def test_cdburn_area
145
+
146
+ test "cdburn area is set" do
144
147
  assert_not_nil(Dir::CDBURN_AREA)
145
148
  assert_kind_of(String, Dir::CDBURN_AREA)
146
149
  end
147
-
148
- def test_common_admintools
150
+
151
+ test "common admintools is set" do
149
152
  assert_not_nil(Dir::COMMON_ADMINTOOLS)
150
153
  assert_kind_of(String, Dir::COMMON_ADMINTOOLS)
151
154
  end
152
-
153
- def test_common_altstartup
155
+
156
+ test "common_altstartup constant is set" do
154
157
  assert_not_nil(Dir::COMMON_ALTSTARTUP)
155
158
  assert_kind_of(String, Dir::COMMON_ALTSTARTUP)
156
159
  end
157
-
158
- def test_common_appdata
160
+
161
+ test "common_appdata constant is set" do
159
162
  assert_not_nil(Dir::COMMON_APPDATA)
160
163
  assert_kind_of(String, Dir::COMMON_APPDATA)
161
164
  end
162
-
163
- def test_common_desktopdirectory
165
+
166
+ test "common desktopdirectory constant is set" do
164
167
  assert_not_nil(Dir::COMMON_DESKTOPDIRECTORY)
165
168
  assert_kind_of(String, Dir::COMMON_DESKTOPDIRECTORY)
166
169
  end
167
-
168
- def test_common_documents
170
+
171
+ test "common_documents constant is set" do
169
172
  assert_not_nil(Dir::COMMON_DOCUMENTS)
170
173
  assert_kind_of(String, Dir::COMMON_DOCUMENTS)
171
174
  end
172
-
173
- def test_common_favorites
175
+
176
+ test "common_favorites constant is set" do
174
177
  assert_not_nil(Dir::COMMON_FAVORITES)
175
178
  assert_kind_of(String, Dir::COMMON_FAVORITES)
176
179
  end
177
-
178
- def test_common_music
180
+
181
+ test "common_music constant is set" do
179
182
  assert_not_nil(Dir::COMMON_MUSIC)
180
183
  assert_kind_of(String, Dir::COMMON_MUSIC)
181
184
  end
182
-
183
- def test_common_pictures
185
+
186
+ test "common_pictures constant is set" do
184
187
  assert_not_nil(Dir::COMMON_PICTURES)
185
188
  assert_kind_of(String, Dir::COMMON_PICTURES)
186
189
  end
187
-
188
- def test_common_programs
190
+
191
+ test "common_programs constant is set" do
189
192
  assert_not_nil(Dir::COMMON_PROGRAMS)
190
193
  assert_kind_of(String, Dir::COMMON_PROGRAMS)
191
194
  end
192
-
193
- def test_common_startmenu
195
+
196
+ test "common_startmenu constant is set" do
194
197
  assert_not_nil(Dir::COMMON_STARTMENU)
195
198
  assert_kind_of(String, Dir::COMMON_STARTMENU)
196
199
  end
197
-
198
- def test_common_startup
200
+
201
+ test "common_startup constant is set" do
199
202
  assert_not_nil(Dir::COMMON_STARTUP)
200
203
  assert_kind_of(String, Dir::COMMON_STARTUP)
201
204
  end
202
-
203
- def test_common_templates
205
+
206
+ test "common_templates constant is set" do
204
207
  assert_not_nil(Dir::COMMON_TEMPLATES)
205
208
  assert_kind_of(String, Dir::COMMON_TEMPLATES)
206
209
  end
207
-
208
- def test_common_video
210
+
211
+ test "common_video constant is set" do
209
212
  assert_not_nil(Dir::COMMON_VIDEO)
210
213
  assert_kind_of(String, Dir::COMMON_VIDEO)
211
214
  end
212
-
213
- def test_controls
215
+
216
+ test "controls constant is set" do
214
217
  assert_not_nil(Dir::CONTROLS)
215
218
  assert_kind_of(String, Dir::CONTROLS)
216
219
  end
217
-
218
- def test_cookies
220
+
221
+ test "cookies constant is set" do
219
222
  assert_not_nil(Dir::COOKIES)
220
223
  assert_kind_of(String, Dir::COOKIES)
221
224
  end
222
-
223
- def test_desktop
225
+
226
+ test "desktop constant is set" do
224
227
  assert_not_nil(Dir::DESKTOP)
225
228
  assert_kind_of(String, Dir::DESKTOP)
226
229
  end
227
-
228
- def test_desktopdirectory
230
+
231
+ test "desktopdirectory is set" do
229
232
  assert_not_nil(Dir::DESKTOPDIRECTORY)
230
233
  assert_kind_of(String, Dir::DESKTOPDIRECTORY)
231
234
  end
232
-
233
- def test_drives
235
+
236
+ test "drives constant is set" do
234
237
  assert_not_nil(Dir::DRIVES)
235
238
  assert_kind_of(String, Dir::DRIVES)
236
239
  end
237
240
 
238
- def test_favorites
241
+ test "favorites constant is set" do
239
242
  assert_not_nil(Dir::FAVORITES)
240
243
  assert_kind_of(String, Dir::FAVORITES)
241
244
  end
242
-
243
- def test_fonts
245
+
246
+ test "fonts constant is set" do
244
247
  assert_not_nil(Dir::FONTS)
245
248
  assert_kind_of(String, Dir::FONTS)
246
249
  end
247
-
248
- def test_history
250
+
251
+ test "history constant is set" do
249
252
  assert_not_nil(Dir::HISTORY)
250
253
  assert_kind_of(String, Dir::HISTORY)
251
254
  end
252
-
253
- def test_internet
255
+
256
+ test "internet constant is set" do
254
257
  assert_not_nil(Dir::INTERNET)
255
258
  assert_kind_of(String, Dir::INTERNET)
256
259
  end
257
-
258
- def test_internet_cache
260
+
261
+ test "internet_cache constant is set" do
259
262
  assert_not_nil(Dir::INTERNET_CACHE)
260
263
  assert_kind_of(String, Dir::INTERNET_CACHE)
261
264
  end
262
-
263
- def test_local_appdata
265
+
266
+ test "local_appdata constant is set" do
264
267
  assert_not_nil(Dir::LOCAL_APPDATA)
265
268
  assert_kind_of(String, Dir::LOCAL_APPDATA)
266
269
  end
267
-
268
- def test_mydocuments
270
+
271
+ test "mydocuments constant is set" do
269
272
  assert_not_nil(Dir::MYDOCUMENTS)
270
273
  assert_kind_of(String, Dir::MYDOCUMENTS)
271
274
  end
272
-
273
- def test_local_mymusic
275
+
276
+ test "mymusic constant is set" do
274
277
  assert_not_nil(Dir::MYMUSIC)
275
278
  assert_kind_of(String, Dir::MYMUSIC)
276
279
  end
277
-
278
- def test_local_mypictures
280
+
281
+ test "mypictures constant is set" do
279
282
  assert_not_nil(Dir::MYPICTURES)
280
283
  assert_kind_of(String, Dir::MYPICTURES)
281
284
  end
282
-
283
- def test_local_myvideo
285
+
286
+ test "myvideo constant is set" do
284
287
  assert_not_nil(Dir::MYVIDEO)
285
288
  assert_kind_of(String, Dir::MYVIDEO)
286
289
  end
287
-
288
- def test_nethood
290
+
291
+ test "nethood constant is set" do
289
292
  assert_not_nil(Dir::NETHOOD)
290
293
  assert_kind_of(String, Dir::NETHOOD)
291
294
  end
292
-
293
- def test_network
295
+
296
+ test "network constant is set" do
294
297
  assert_not_nil(Dir::NETWORK)
295
298
  assert_kind_of(String, Dir::NETWORK)
296
299
  end
297
300
 
298
- def test_personal
301
+ test "personal constant is set" do
299
302
  assert_not_nil(Dir::PERSONAL)
300
303
  assert_kind_of(String, Dir::PERSONAL)
301
304
  end
302
-
303
- def test_printers
305
+
306
+ test "printers cosntant is set" do
304
307
  assert_not_nil(Dir::PRINTERS)
305
308
  assert_kind_of(String, Dir::PRINTERS)
306
309
  end
307
-
308
- def test_printhood
310
+
311
+ test "printhood constant is set" do
309
312
  assert_not_nil(Dir::PRINTHOOD)
310
313
  assert_kind_of(String, Dir::PRINTHOOD)
311
314
  end
312
-
313
- def test_profile
315
+
316
+ test "profile constant is set" do
314
317
  assert_not_nil(Dir::PROFILE)
315
318
  assert_kind_of(String, Dir::PROFILE)
316
319
  end
317
-
318
- # Doesn't appear to actually exist
319
- #def test_profiles
320
- # assert_not_nil(Dir::PROFILES)
321
- # assert_kind_of(String,Dir::PROFILES)
322
- #end
323
-
324
- def test_program_files
320
+
321
+ test "program_files constant is set" do
325
322
  assert_not_nil(Dir::PROGRAM_FILES)
326
323
  assert_kind_of(String, Dir::PROGRAM_FILES)
327
324
  end
328
-
329
- def test_program_files_common
325
+
326
+ test "program_files_common constant is set" do
330
327
  assert_not_nil(Dir::PROGRAM_FILES_COMMON)
331
328
  assert_kind_of(String, Dir::PROGRAM_FILES_COMMON)
332
329
  end
333
-
334
- def test_programs
330
+
331
+ test "programs constant is set" do
335
332
  assert_not_nil(Dir::PROGRAMS)
336
333
  assert_kind_of(String, Dir::PROGRAMS)
337
334
  end
338
-
339
- def test_recent
335
+
336
+ test "recent constant is set" do
340
337
  assert_not_nil(Dir::RECENT)
341
338
  assert_kind_of(String, Dir::RECENT)
342
339
  end
343
-
344
- def test_sendto
340
+
341
+ test "sendto constant is set" do
345
342
  assert_not_nil(Dir::SENDTO)
346
343
  assert_kind_of(String, Dir::SENDTO)
347
344
  end
348
-
349
- def test_startmenu
345
+
346
+ test "startmenu constant is set" do
350
347
  assert_not_nil(Dir::STARTMENU)
351
348
  assert_kind_of(String, Dir::STARTMENU)
352
349
  end
353
-
354
- def test_startup
350
+
351
+ test "startup constant is set" do
355
352
  assert_not_nil(Dir::STARTUP)
356
353
  assert_kind_of(String, Dir::STARTUP)
357
354
  end
358
-
359
- def test_system
355
+
356
+ test "system constant is set" do
360
357
  assert_not_nil(Dir::SYSTEM)
361
358
  assert_kind_of(String, Dir::SYSTEM)
362
359
  end
363
-
364
- def test_templates
360
+
361
+ test "templates constant is set" do
365
362
  assert_not_nil(Dir::TEMPLATES)
366
363
  assert_kind_of(String, Dir::TEMPLATES)
367
364
  end
368
365
 
369
- def test_windows_dir
366
+ test "windows constant is set" do
370
367
  assert_not_nil(Dir::WINDOWS)
371
368
  assert_kind_of(String, Dir::WINDOWS)
372
369
  end
373
370
 
371
+ test "ffi functions are private" do
372
+ assert_not_respond_to(Dir, :SHGetFolderPathW)
373
+ end
374
+
374
375
  def teardown
375
376
  FileUtils.rm_rf(@ascii_to)
376
377
  FileUtils.rm_rf(@unicode_to)
378
+ end
379
+
380
+ def self.shutdown
377
381
  FileUtils.rm_rf(@@from)
382
+ @@test_home = nil
383
+ @@from = nil
378
384
  end
379
385
  end