From 195c7d9067fc42272531cb36302a565ebd44a2f0 Mon Sep 17 00:00:00 2001
From: Jim Deville <jdeville@microsoft.com>
Date: Wed, 9 Jul 2008 09:22:21 -0700
Subject: [PATCH] modifications to dir specs to work on windows

---
 1.8/core/dir/chdir_spec.rb      |   10 ++++---
 1.8/core/dir/close_spec.rb      |   22 ++++++++-------
 1.8/core/dir/each_spec.rb       |    2 +-
 1.8/core/dir/fixtures/common.rb |    3 +-
 1.8/core/dir/glob_spec.rb       |   30 +++++++++++----------
 1.8/core/dir/mkdir_spec.rb      |   54 ++++++++++++++++++++++++++-------------
 1.8/core/dir/pwd_spec.rb        |    9 ++++--
 1.8/core/dir/read_spec.rb       |    2 +-
 1.8/core/dir/shared/delete.rb   |   27 ++++++++++---------
 1.8/core/dir/shared/glob.rb     |   10 +++---
 1.8/core/dir/shared/open.rb     |    2 +-
 1.8/core/dir/shared/pwd.rb      |    7 ++++-
 12 files changed, 106 insertions(+), 72 deletions(-)

diff --git a/1.8/core/dir/chdir_spec.rb b/1.8/core/dir/chdir_spec.rb
index 73010a3..cc1291b 100644
--- a/1.8/core/dir/chdir_spec.rb
+++ b/1.8/core/dir/chdir_spec.rb
@@ -11,11 +11,13 @@ describe "Dir.chdir" do
   end
   
   it "defaults to $HOME with no arguments" do
-    Dir.chdir(ENV['HOME'])
-    home = Dir.pwd
+    if ENV['HOME']
+      Dir.chdir(ENV['HOME'])
+      home = Dir.pwd
 
-    Dir.chdir
-    Dir.pwd.should == home
+      Dir.chdir
+      Dir.pwd.should == home
+    end
   end
   
   it "changes to the specified directory" do
diff --git a/1.8/core/dir/close_spec.rb b/1.8/core/dir/close_spec.rb
index 2ae6106..ecfcbc7 100644
--- a/1.8/core/dir/close_spec.rb
+++ b/1.8/core/dir/close_spec.rb
@@ -3,18 +3,20 @@ require File.dirname(__FILE__) + '/fixtures/common'
 require File.dirname(__FILE__) + '/shared/closed'
 
 describe "Dir#close" do
-  it "closes the stream and fd and returns nil" do
-    # This is a bit convoluted but we are trying to ensure the file gets closed.
-    # To do that, we peek to see what the next FD number is and then probe that
-    # to see whether it has been closed.
-    peek = IO.sysopen DirSpecs.mock_dir
-    File.for_fd(peek).close
+  platform_is_not :windows do
+    it "closes the stream and fd and returns nil" do
+      # This is a bit convoluted but we are trying to ensure the file gets closed.
+      # To do that, we peek to see what the next FD number is and then probe that
+      # to see whether it has been closed.
+      peek = IO.sysopen DirSpecs.mock_dir
+      File.for_fd(peek).close
 
-    dir = Dir.open DirSpecs.mock_dir
-    File.for_fd(peek).close                   # Should be open here
+      dir = Dir.open DirSpecs.mock_dir
+      File.for_fd(peek).close                   # Should be open here
 
-    dir.close.should == nil
-    lambda { File.for_fd(peek).close }.should raise_error(SystemCallError)  # And closed here
+      dir.close.should == nil
+      lambda { File.for_fd(peek).close }.should raise_error(SystemCallError)  # And closed here
+    end
   end
 end
 
diff --git a/1.8/core/dir/each_spec.rb b/1.8/core/dir/each_spec.rb
index 022657f..bf7744f 100644
--- a/1.8/core/dir/each_spec.rb
+++ b/1.8/core/dir/each_spec.rb
@@ -20,7 +20,7 @@ describe "Dir#each" do
 
   it "returns the directory which remains open" do
     # an FS does not necessarily impose order
-    ls = `ls -a #{DirSpecs.mock_dir}`.split
+    ls = Dir.entries(DirSpecs.mock_dir)
     @dir.each {}.should == @dir
     @dir.read.should == nil
     @dir.rewind
diff --git a/1.8/core/dir/fixtures/common.rb b/1.8/core/dir/fixtures/common.rb
index 408f603..4aff3ac 100644
--- a/1.8/core/dir/fixtures/common.rb
+++ b/1.8/core/dir/fixtures/common.rb
@@ -16,7 +16,8 @@ module DirSpecs
   end
 
   def DirSpecs.clear_dirs
-    ['nonexisting', 'default_perms','reduced', 'always_returns_0', '???'].each do |dir|
+    old_kcode, $KCODE = $KCODE, 'u'
+    ['nonexisting', 'default_perms','reduced', 'always_returns_0', '???', [0xe9].pack('U')].each do |dir|
       begin
         Dir.rmdir dir
       rescue
diff --git a/1.8/core/dir/glob_spec.rb b/1.8/core/dir/glob_spec.rb
index a96a08e..dfd69f9 100644
--- a/1.8/core/dir/glob_spec.rb
+++ b/1.8/core/dir/glob_spec.rb
@@ -38,23 +38,25 @@ describe "Dir.glob" do
 
     Dir.glob('**/', File::FNM_DOTMATCH).sort.should == expected
   end
+  
+  platform_is_not(:windows) do
+    it "matches the literal character '\\' with option File::FNM_NOESCAPE" do
+      Dir.mkdir 'foo?bar'
 
-  it "matches the literal character '\\' with option File::FNM_NOESCAPE" do
-    Dir.mkdir 'foo?bar'
-
-    begin
-      Dir.glob('foo?bar', File::FNM_NOESCAPE).should == %w|foo?bar|
-      Dir.glob('foo\?bar', File::FNM_NOESCAPE).should == []
-    ensure
-      Dir.rmdir 'foo?bar'
-    end
+      begin
+        Dir.glob('foo?bar', File::FNM_NOESCAPE).should == %w|foo?bar|
+        Dir.glob('foo\?bar', File::FNM_NOESCAPE).should == []
+      ensure
+        Dir.rmdir 'foo?bar'
+      end
 
-    Dir.mkdir 'foo\?bar'
+      Dir.mkdir 'foo\?bar'
 
-    begin
-      Dir.glob('foo\?bar', File::FNM_NOESCAPE).should == %w|foo\\?bar|
-    ensure
-      Dir.rmdir 'foo\?bar'
+      begin
+        Dir.glob('foo\?bar', File::FNM_NOESCAPE).should == %w|foo\\?bar|
+      ensure
+        Dir.rmdir 'foo\?bar'
+      end
     end
   end
 
diff --git a/1.8/core/dir/mkdir_spec.rb b/1.8/core/dir/mkdir_spec.rb
index 1283082..936455f 100644
--- a/1.8/core/dir/mkdir_spec.rb
+++ b/1.8/core/dir/mkdir_spec.rb
@@ -9,30 +9,48 @@ describe "Dir.mkdir" do
       File.exist?('nonexisting').should == false
       Dir.mkdir 'nonexisting'
       File.exist?('nonexisting').should == true
-
-      Dir.mkdir 'default_perms'
-      a = File.stat('default_perms').mode
-      Dir.mkdir 'reduced', (a - 1)
-      File.stat('reduced').mode.should_not == a
+      platform_is_not :windows do
+        Dir.mkdir 'default_perms'
+        a = File.stat('default_perms').mode
+        Dir.mkdir 'reduced', (a - 1)
+        File.stat('reduced').mode.should_not == a
+      end
+      platform_is :windows do
+        Dir.mkdir 'default_perms', 0666
+        a = File.stat('default_perms').mode
+        Dir.mkdir 'reduced', 0444
+        File.stat('reduced').mode.should_not == a
+      end
 
       Dir.mkdir('always_returns_0').should == 0
-
-      system "chmod 0777 nonexisting default_perms reduced always_returns_0"
+      platform_is_not(:windows) do
+        File.chmod(0777, "nonexisting","default_perms","reduced","always_returns_0")
+      end
+      platform_is_not(:windows) do
+        File.chmod(0644, "nonexisting","default_perms","reduced","always_returns_0")
+      end
     ensure
       DirSpecs.clear_dirs
     end
   end
-
-  it "raises a SystemCallError when lacking adequate permissions in the parent dir" do
-    # In case something happened it it didn't get cleaned up.
-    Dir.rmdir 'noperms' if File.directory? 'noperms'
-
-    Dir.mkdir 'noperms', 0000
-
-    lambda { Dir.mkdir 'noperms/subdir' }.should raise_error(SystemCallError)
-
-    system 'chmod 0777 noperms'
-    Dir.rmdir 'noperms'
+  ruby_bug "238", "1.9" do
+    it "raises a SystemCallError when lacking adequate permissions in the parent dir" do
+      # In case something happened it it didn't get cleaned up.
+      FileUtils.rm_rf 'noperms' if File.directory? 'noperms'
+
+      Dir.mkdir 'noperms', 0000
+
+      lambda { Dir.mkdir 'noperms/subdir' }.should raise_error(SystemCallError)
+
+      system 'chmod 0777 noperms'
+      platform_is_not :windows do
+        File.chmod 0777, "noperms"
+      end
+      platform_is :windows do
+        File.chmod 0666, "noperms"
+      end
+      Dir.rmdir 'noperms'
+    end
   end
 
   it "raises a SystemCallError if any of the directories in the path before the last does not exist" do
diff --git a/1.8/core/dir/pwd_spec.rb b/1.8/core/dir/pwd_spec.rb
index 43fd02d..260d1d1 100644
--- a/1.8/core/dir/pwd_spec.rb
+++ b/1.8/core/dir/pwd_spec.rb
@@ -9,13 +9,16 @@ describe "Dir.pwd" do
     DirSpecs.clear_dirs
 
     begin
-      Dir.mkdir '???'
-      File.exist?('???').should == true
+      old_kcode, $KCODE=$KCODE,'u'
+      str = [0xe9].pack 'U' #Unicode é
+      Dir.mkdir str
+      File.exist?(str).should == true
 
       old_pwd = Dir.pwd
-      Dir.chdir('???') { Dir.pwd.should == File.join(old_pwd, '???') }
+      Dir.chdir(str) { Dir.pwd.should == File.join(old_pwd, str) }
     ensure
       DirSpecs.clear_dirs
+      $KCODE=old_kcode
     end
   end
 end
diff --git a/1.8/core/dir/read_spec.rb b/1.8/core/dir/read_spec.rb
index df832f1..f0546ff 100644
--- a/1.8/core/dir/read_spec.rb
+++ b/1.8/core/dir/read_spec.rb
@@ -5,7 +5,7 @@ require File.dirname(__FILE__) + '/shared/closed'
 describe "Dir#read" do
   it "returns the file name in the current seek position" do
     # an FS does not necessarily impose order
-    ls = `ls -a #{DirSpecs.mock_dir}`.split
+    ls = Dir.entries DirSpecs.mock_dir
     dir = Dir.open DirSpecs.mock_dir
     ls.should include(dir.read)
     dir.close
diff --git a/1.8/core/dir/shared/delete.rb b/1.8/core/dir/shared/delete.rb
index edce3ab..f489c59 100644
--- a/1.8/core/dir/shared/delete.rb
+++ b/1.8/core/dir/shared/delete.rb
@@ -1,29 +1,30 @@
 shared :dir_delete do |cmd|
   describe "Dir.#{cmd}" do
     it "removes empty directories" do
-      %w|rmdir delete unlink|.each {|cmd|
-        Dir.mkdir 'empty_subdir'
-        Dir.send(cmd, 'empty_subdir').should == 0
-      }
+      Dir.mkdir 'empty_subdir'
+      Dir.send(cmd, 'empty_subdir').should == 0
     end
 
     it "raises a SystemCallError when trying to remove a nonempty directory" do
-      %w|rmdir delete unlink|.each {|cmd|
-        lambda { Dir.send cmd, 'subdir_one' }.should raise_error(SystemCallError)
-      }
+      lambda { Dir.send cmd, 'subdir_one' }.should raise_error(SystemCallError)
     end
 
-    it "raises a SystemCallError if lacking adequate permissions to remove the directory" do
-      %w|rmdir delete unlink|.each {|cmd|
-        system "mkdir -p noperm_#{cmd}/child"
-        system "chmod 0000 noperm_#{cmd}"
+    ruby_bug "Ruby bug 238", "1.9" do
+      it "raises a SystemCallError if lacking adequate permissions to remove the directory" do
+        FileUtils.mkdir_p("noperm_#{cmd}/child")
+        File.chmod(0000, "noperm_#{cmd}")
 
         lambda { Dir.send cmd, "noperm_#{cmd}/child" }.should raise_error(SystemCallError)
 
-        system "chmod 0777 noperm_#{cmd}"
+        platform_is_not(:windows) do
+          File.chmod(0777, "noperm_#{cmd}")
+        end
+        platform_is(:windows) do
+          File.chmod(0666, "noperm_#{cmd}")
+        end
         Dir.rmdir "noperm_#{cmd}/child"
         Dir.rmdir "noperm_#{cmd}"
-      }
+      end
     end
   end
 end
diff --git a/1.8/core/dir/shared/glob.rb b/1.8/core/dir/shared/glob.rb
index 3f75dfe..9466d80 100644
--- a/1.8/core/dir/shared/glob.rb
+++ b/1.8/core/dir/shared/glob.rb
@@ -191,14 +191,14 @@ shared :dir_glob do |cmd|
     end
 
     it "matches special characters by escaping with a backslash with '\\<character>'" do
-      Dir.mkdir 'foo*bar'
+      Dir.mkdir 'foo^bar'
 
       begin
-        Dir.glob('foo?bar').should == %w|foo*bar|
-        Dir.glob('foo\?bar').should == []
-        Dir.glob('nond\otfile').should == %w|nondotfile|
+        Dir.send(cmd, 'foo?bar').should == %w|foo^bar|
+        Dir.send(cmd, 'foo\?bar').should == []
+        Dir.send(cmd, 'nond\otfile').should == %w|nondotfile|
       ensure
-        Dir.rmdir 'foo*bar'
+        Dir.rmdir 'foo^bar'
       end
     end
 
diff --git a/1.8/core/dir/shared/open.rb b/1.8/core/dir/shared/open.rb
index 54bc1bb..0b683bb 100644
--- a/1.8/core/dir/shared/open.rb
+++ b/1.8/core/dir/shared/open.rb
@@ -15,7 +15,7 @@ shared :dir_open do |cmd|
     end
 
     it "returns the value of the block if a block is given" do
-      Dir.open(DirSpecs.mock_dir) {|dir| :value }.should == :value
+      Dir.send(cmd, DirSpecs.mock_dir) {|dir| :value }.should == :value
     end
 
     it "closes the Dir instance when the block exits if given a block" do
diff --git a/1.8/core/dir/shared/pwd.rb b/1.8/core/dir/shared/pwd.rb
index e56d0ab..36f735c 100644
--- a/1.8/core/dir/shared/pwd.rb
+++ b/1.8/core/dir/shared/pwd.rb
@@ -6,7 +6,12 @@ shared :dir_pwd do |cmd|
       
       # The following uses inode rather than file names to account for
       # case insensitive file systems like default OS/X file systems
-      File.stat(Dir.send(cmd)).ino.should == File.stat(`/bin/sh -c "pwd -P"`.chomp).ino
+      platform_is_not :windows do
+        File.stat(Dir.send(cmd)).ino.should == File.stat(`/bin/sh -c "pwd -P"`.chomp).ino
+      end
+      platform_is :windows do
+        File.stat(Dir.send(cmd)).ino.should == File.stat(File.expand_path(`cd`.chomp)).ino
+      end
     end
   end
 end
-- 
1.5.5.1015.g9d258

