edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Initializers.Generated.cs;C961781
File: Initializers.Generated.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Initializers.Generated.cs;C961781  (server)    6/24/2009 4:17 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Initializers.Generated.cs;FileTest
@@ -48,6 +48,7 @@
             IronRuby.Builtins.RubyModule def33 = DefineGlobalModule("Enumerable", typeof(IronRuby.Builtins.Enumerable), 0x00000103, LoadEnumerable_Instance, null, null, IronRuby.Builtins.RubyModule.EmptyArray);
             IronRuby.Builtins.RubyModule def8 = DefineGlobalModule("Errno", typeof(IronRuby.Builtins.Errno), 0x00000103, null, null, null, IronRuby.Builtins.RubyModule.EmptyArray);
             IronRuby.Builtins.RubyModule def25 = DefineModule("File::Constants", typeof(IronRuby.Builtins.RubyFileOps.Constants), 0x00000103, null, null, LoadFile__Constants_Constants, IronRuby.Builtins.RubyModule.EmptyArray);
+            DefineGlobalModule("FileTest", typeof(IronRuby.Builtins.FileTest), 0x00000103, null, LoadFileTest_Class, null, IronRuby.Builtins.RubyModule.EmptyArray);
             DefineGlobalModule("GC", typeof(IronRuby.Builtins.RubyGC), 0x00000103, LoadGC_Instance, LoadGC_Class, null, IronRuby.Builtins.RubyModule.EmptyArray);
             IronRuby.Builtins.RubyModule def22 = DefineGlobalModule("IronRuby", typeof(IronRuby.Ruby), 0x00000000, null, LoadIronRuby_Class, null, IronRuby.Builtins.RubyModule.EmptyArray);
             IronRuby.Builtins.RubyModule def2 = DefineModule("IronRuby::Clr", typeof(IronRuby.Builtins.IronRubyOps.ClrOps), 0x00000100, null, LoadIronRuby__Clr_Class, null, IronRuby.Builtins.RubyModule.EmptyArray);
@@ -113,7 +114,6 @@
                 new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.IO.FileSystemInfo>(IronRuby.Builtins.RubyFileOps.RubyStatOps.Create)
             );
             #endif
-            DefineGlobalClass("FileTest", typeof(IronRuby.Builtins.FileTestOps), 0x00000103, Context.ObjectClass, null, LoadFileTest_Class, null, IronRuby.Builtins.RubyModule.EmptyArray);
             DefineGlobalClass("Hash", typeof(IronRuby.Builtins.Hash), 0x00000003, Context.ObjectClass, LoadHash_Instance, LoadHash_Class, null, new IronRuby.Builtins.RubyModule[] {def33}, 
                 new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.Hash>(IronRuby.Builtins.HashOps.CreateHash), 
                 new System.Func<IronRuby.Runtime.BlockParam, IronRuby.Builtins.RubyClass, System.Object, IronRuby.Builtins.Hash>(IronRuby.Builtins.HashOps.CreateHash), 
@@ -1034,6 +1034,7 @@
         }
         
         private static void LoadFile_Class(IronRuby.Builtins.RubyModule/*!*/ module) {
+            LoadFileTest_Class(module);
             module.DefineLibraryMethod("atime", 0x61, 
                 new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.DateTime>(IronRuby.Builtins.RubyFileOps.AccessTime)
             );
@@ -1042,14 +1043,6 @@
                 new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString>(IronRuby.Builtins.RubyFileOps.Basename)
             );
             
-            module.DefineLibraryMethod("blockdev?", 0x61, 
-                new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.RubyFileOps.IsBlockDevice)
-            );
-            
-            module.DefineLibraryMethod("chardev?", 0x61, 
-                new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.RubyFileOps.IsCharDevice)
-            );
-            
             module.DefineLibraryMethod("chmod", 0x61, 
                 new System.Func<IronRuby.Builtins.RubyClass, System.Int32, IronRuby.Builtins.MutableString, System.Int32>(IronRuby.Builtins.RubyFileOps.Chmod)
             );
@@ -1068,30 +1061,10 @@
                 new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString[], System.Int32>(IronRuby.Builtins.RubyFileOps.Delete)
             );
             
-            module.DefineLibraryMethod("directory?", 0x61, 
-                new System.Func<IronRuby.Runtime.RubyContext, System.Object, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.RubyFileOps.IsDirectory)
-            );
-            
             module.DefineLibraryMethod("dirname", 0x61, 
                 new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString>(IronRuby.Builtins.RubyFileOps.DirName)
             );
             
-            module.DefineLibraryMethod("executable?", 0x61, 
-                new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.RubyFileOps.IsExecutable)
-            );
-            
-            module.DefineLibraryMethod("executable_real?", 0x61, 
-                new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.RubyFileOps.IsExecutable)
-            );
-            
-            module.DefineLibraryMethod("exist?", 0x61, 
-                new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.RubyFileOps.Exists)
-            );
-            
-            module.DefineLibraryMethod("exists?", 0x61, 
-                new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.RubyFileOps.Exists)
-            );
-            
             #if !SILVERLIGHT
             module.DefineLibraryMethod("expand_path", 0x61, 
                 new System.Func<IronRuby.Runtime.RubyContext, IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString>(IronRuby.Builtins.RubyFileOps.ExpandPath)
@@ -1102,10 +1075,6 @@
                 new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString>(IronRuby.Builtins.RubyFileOps.GetExtension)
             );
             
-            module.DefineLibraryMethod("file?", 0x61, 
-                new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.RubyFileOps.IsAFile)
-            );
-            
             module.DefineLibraryMethod("fnmatch", 0x61, 
                 new System.Func<System.Object, IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString, System.Int32, System.Boolean>(IronRuby.Builtins.RubyFileOps.FnMatch)
             );
@@ -1118,10 +1087,6 @@
                 new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString>(IronRuby.Builtins.RubyFileOps.FileType)
             );
             
-            module.DefineLibraryMethod("grpowned?", 0x61, 
-                new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.RubyFileOps.IsGroupOwned)
-            );
-            
             module.DefineLibraryMethod("join", 0x61, 
                 new System.Func<IronRuby.Runtime.ConversionStorage<IronRuby.Builtins.MutableString>, IronRuby.Builtins.RubyClass, System.Object[], IronRuby.Builtins.MutableString>(IronRuby.Builtins.RubyFileOps.Join)
             );
@@ -1136,22 +1101,6 @@
             
             module.DefineRuleGenerator("open", 0x61, IronRuby.Builtins.RubyFileOps.Open());
             
-            module.DefineLibraryMethod("owned?", 0x61, 
-                new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.RubyFileOps.IsUserOwned)
-            );
-            
-            module.DefineLibraryMethod("pipe?", 0x61, 
-                new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.RubyFileOps.IsPipe)
-            );
-            
-            module.DefineLibraryMethod("readable?", 0x61, 
-                new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.RubyFileOps.IsReadable)
-            );
-            
-            module.DefineLibraryMethod("readable_real?", 0x61, 
-                new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.RubyFileOps.IsReadable)
-            );
-            
             module.DefineLibraryMethod("readlink", 0x61, 
                 new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.RubyFileOps.Readlink)
             );
@@ -1160,26 +1109,6 @@
                 new System.Func<IronRuby.Runtime.RubyContext, IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString, System.Int32>(IronRuby.Builtins.RubyFileOps.Rename)
             );
             
-            module.DefineLibraryMethod("setgid?", 0x61, 
-                new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.RubyFileOps.IsSetGid)
-            );
-            
-            module.DefineLibraryMethod("setuid?", 0x61, 
-                new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.RubyFileOps.IsSetUid)
-            );
-            
-            module.DefineLibraryMethod("size", 0x61, 
-                new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Int32>(IronRuby.Builtins.RubyFileOps.Size)
-            );
-            
-            module.DefineLibraryMethod("size?", 0x61, 
-                new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Object>(IronRuby.Builtins.RubyFileOps.NullableSize)
-            );
-            
-            module.DefineLibraryMethod("socket?", 0x61, 
-                new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.RubyFileOps.IsSocket)
-            );
-            
             module.DefineLibraryMethod("split", 0x61, 
                 new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, IronRuby.Builtins.RubyArray>(IronRuby.Builtins.RubyFileOps.Split)
             );
@@ -1188,22 +1117,12 @@
                 new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.IO.FileSystemInfo>(IronRuby.Builtins.RubyFileOps.Stat)
             );
             
-            module.DefineLibraryMethod("sticky?", 0x61, 
-                new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.RubyFileOps.IsSticky)
-            );
-            
             #if !SILVERLIGHT
             module.DefineLibraryMethod("symlink", 0x61, 
                 new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Object>(IronRuby.Builtins.RubyFileOps.SymLink)
             );
             
             #endif
-            #if !SILVERLIGHT
-            module.DefineLibraryMethod("symlink?", 0x61, 
-                new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.RubyFileOps.IsSymLink)
-            );
-            
-            #endif
             module.DefineLibraryMethod("umask", 0x61, 
                 new System.Func<IronRuby.Builtins.RubyClass, System.Int32, System.Int32>(IronRuby.Builtins.RubyFileOps.GetUmask), 
                 new System.Func<IronRuby.Builtins.RubyClass, System.Int32>(IronRuby.Builtins.RubyFileOps.GetUmask)
@@ -1221,18 +1140,6 @@
             );
             
             #endif
-            module.DefineLibraryMethod("writable?", 0x61, 
-                new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.RubyFileOps.IsWritable)
-            );
-            
-            module.DefineLibraryMethod("writable_real?", 0x61, 
-                new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.RubyFileOps.IsWritable)
-            );
-            
-            module.DefineLibraryMethod("zero?", 0x61, 
-                new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.RubyFileOps.IsZeroLength)
-            );
-            
         }
         
         private static void LoadFile__Constants_Constants(IronRuby.Builtins.RubyModule/*!*/ module) {
@@ -1424,14 +1331,100 @@
         #endif
         
         private static void LoadFileTest_Class(IronRuby.Builtins.RubyModule/*!*/ module) {
+            module.DefineLibraryMethod("blockdev?", 0x61, 
+                new System.Func<IronRuby.Builtins.RubyModule, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.FileTest.IsBlockDevice)
+            );
+            
+            module.DefineLibraryMethod("chardev?", 0x61, 
+                new System.Func<IronRuby.Builtins.RubyModule, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.FileTest.IsCharDevice)
+            );
+            
+            module.DefineLibraryMethod("directory?", 0x61, 
+                new System.Func<IronRuby.Builtins.RubyModule, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.FileTest.IsDirectory)
+            );
+            
+            module.DefineLibraryMethod("executable?", 0x61, 
+                new System.Func<IronRuby.Builtins.RubyModule, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.FileTest.IsExecutable)
+            );
+            
+            module.DefineLibraryMethod("executable_real?", 0x61, 
+                new System.Func<IronRuby.Builtins.RubyModule, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.FileTest.IsExecutable)
+            );
+            
             module.DefineLibraryMethod("exist?", 0x61, 
-                new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.FileTestOps.Exists)
+                new System.Func<IronRuby.Builtins.RubyModule, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.FileTest.Exists)
             );
             
             module.DefineLibraryMethod("exists?", 0x61, 
-                new System.Func<IronRuby.Builtins.RubyClass, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.FileTestOps.Exists)
+                new System.Func<IronRuby.Builtins.RubyModule, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.FileTest.Exists)
             );
             
+            module.DefineLibraryMethod("file?", 0x61, 
+                new System.Func<IronRuby.Builtins.RubyModule, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.FileTest.IsAFile)
+            );
+            
+            module.DefineLibraryMethod("grpowned?", 0x61, 
+                new System.Func<IronRuby.Builtins.RubyModule, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.FileTest.IsGroupOwned)
+            );
+            
+            module.DefineLibraryMethod("owned?", 0x61, 
+                new System.Func<IronRuby.Builtins.RubyModule, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.FileTest.IsUserOwned)
+            );
+            
+            module.DefineLibraryMethod("pipe?", 0x61, 
+                new System.Func<IronRuby.Builtins.RubyModule, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.FileTest.IsPipe)
+            );
+            
+            module.DefineLibraryMethod("readable?", 0x61, 
+                new System.Func<IronRuby.Builtins.RubyModule, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.FileTest.IsReadable)
+            );
+            
+            module.DefineLibraryMethod("readable_real?", 0x61, 
+                new System.Func<IronRuby.Builtins.RubyModule, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.FileTest.IsReadable)
+            );
+            
+            module.DefineLibraryMethod("setgid?", 0x61, 
+                new System.Func<IronRuby.Builtins.RubyModule, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.FileTest.IsSetGid)
+            );
+            
+            module.DefineLibraryMethod("setuid?", 0x61, 
+                new System.Func<IronRuby.Builtins.RubyModule, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.FileTest.IsSetUid)
+            );
+            
+            module.DefineLibraryMethod("size", 0x61, 
+                new System.Func<IronRuby.Builtins.RubyModule, IronRuby.Builtins.MutableString, System.Int32>(IronRuby.Builtins.FileTest.Size)
+            );
+            
+            module.DefineLibraryMethod("size?", 0x61, 
+                new System.Func<IronRuby.Builtins.RubyModule, IronRuby.Builtins.MutableString, System.Object>(IronRuby.Builtins.FileTest.NullableSize)
+            );
+            
+            module.DefineLibraryMethod("socket?", 0x61, 
+                new System.Func<IronRuby.Builtins.RubyModule, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.FileTest.IsSocket)
+            );
+            
+            module.DefineLibraryMethod("sticky?", 0x61, 
+                new System.Func<IronRuby.Builtins.RubyModule, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.FileTest.IsSticky)
+            );
+            
+            #if !SILVERLIGHT
+            module.DefineLibraryMethod("symlink?", 0x61, 
+                new System.Func<IronRuby.Builtins.RubyModule, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.FileTest.IsSymLink)
+            );
+            
+            #endif
+            module.DefineLibraryMethod("writable?", 0x61, 
+                new System.Func<IronRuby.Builtins.RubyModule, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.FileTest.IsWritable)
+            );
+            
+            module.DefineLibraryMethod("writable_real?", 0x61, 
+                new System.Func<IronRuby.Builtins.RubyModule, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.FileTest.IsWritable)
+            );
+            
+            module.DefineLibraryMethod("zero?", 0x61, 
+                new System.Func<IronRuby.Builtins.RubyModule, IronRuby.Builtins.MutableString, System.Boolean>(IronRuby.Builtins.FileTest.IsZeroLength)
+            );
+            
         }
         
         private static void LoadFixnum_Instance(IronRuby.Builtins.RubyModule/*!*/ module) {
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/IronRuby.Libraries.csproj;C942557
File: IronRuby.Libraries.csproj
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/IronRuby.Libraries.csproj;C942557  (server)    6/24/2009 4:07 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/IronRuby.Libraries.csproj;FileTest
@@ -81,7 +81,7 @@
     <Compile Include="Builtins\Exceptions.cs" />
     <Compile Include="Builtins\FalseClass.cs" />
     <Compile Include="Builtins\FileOps.cs" />
-    <Compile Include="Builtins\FileTestOps.cs" />
+    <Compile Include="Builtins\FileTest.cs" />
     <Compile Include="Builtins\FixnumOps.cs" />
     <Compile Include="Builtins\FloatOps.cs" />
     <Compile Include="Builtins\RubyGC.cs" />
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/IronRuby.Libraries.csproj.vspscc;C390406
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/FileOps.cs;C949767
File: FileOps.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/FileOps.cs;C949767  (server)    6/24/2009 4:09 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/FileOps.cs;FileTest
@@ -14,17 +14,16 @@
  * ***************************************************************************/
 
 using System;
+using System.Collections;
+using System.Collections.Generic;
 using System.Diagnostics;
 using System.IO;
 using System.Runtime.InteropServices;
+using System.Text;
 using IronRuby.Runtime;
 using IronRuby.Runtime.Calls;
 using Microsoft.Scripting;
 using Microsoft.Scripting.Runtime;
-using Microsoft.Scripting.Utils;
-using System.Collections;
-using System.Collections.Generic;
-using System.Text;
 
 namespace IronRuby.Builtins {
 
@@ -32,7 +31,8 @@
     /// File builtin class. Derives from IO
     /// </summary>
     [RubyClass("File", Extends = typeof(RubyFile))]
-    public class RubyFileOps {
+    [Includes(typeof(FileTest), Copy = true)]
+    public static class RubyFileOps {
 
         #region Construction
 
@@ -232,16 +232,6 @@
             return RubyUtils.CanonicalizePath(MutableString.Create(strResult)).TaintBy(path);
         }
 
-        [RubyMethod("blockdev?", RubyMethodAttributes.PublicSingleton)]
-        public static bool IsBlockDevice(RubyClass/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
-            return RubyStatOps.IsBlockDevice(RubyStatOps.Create(self.Context, path));
-        }
-
-        [RubyMethod("chardev?", RubyMethodAttributes.PublicSingleton)]
-        public static bool IsCharDevice(RubyClass/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
-            return RubyStatOps.IsCharDevice(RubyStatOps.Create(self.Context, path));
-        }
-
         internal static void Chmod(string path, int permission) {
 #if !SILVERLIGHT
             FileAttributes oldAttributes = File.GetAttributes(path);
@@ -300,7 +290,7 @@
             return context.DomainManager.Platform.FileExists(path);
         }
 
-        private static bool DirectoryExists(RubyContext/*!*/ context, string/*!*/ path) {
+        internal static bool DirectoryExists(RubyContext/*!*/ context, string/*!*/ path) {
             return context.DomainManager.Platform.DirectoryExists(path);
         }
 
@@ -338,11 +328,6 @@
             return paths.Length;
         }
 
-        [RubyMethod("directory?", RubyMethodAttributes.PublicSingleton)]
-        public static bool IsDirectory(RubyContext/*!*/ context, object/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
-            return DirectoryExists(context, path.ConvertToString());
-        }
-
         [RubyMethod("dirname", RubyMethodAttributes.PublicSingleton)]
         public static MutableString/*!*/ DirName(RubyClass/*!*/ self, [NotNull]MutableString/*!*/ path) {
             string strPath = path.ConvertToString();
@@ -397,19 +382,6 @@
             return path;
         }
 
-        [RubyMethod("executable?", RubyMethodAttributes.PublicSingleton)]
-        [RubyMethod("executable_real?", RubyMethodAttributes.PublicSingleton)]
-        public static bool IsExecutable(RubyClass/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
-            return RubyStatOps.IsExecutable(RubyStatOps.Create(self.Context, path));
-        }
-
-        [RubyMethod("exist?", RubyMethodAttributes.PublicSingleton)]
-        [RubyMethod("exists?", RubyMethodAttributes.PublicSingleton)]
-        public static bool Exists(RubyClass/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
-            string strPath = path.ConvertToString();
-            return FileExists(self.Context, strPath) || DirectoryExists(self.Context, strPath);
-        }
-
         [RubyMethod("extname", RubyMethodAttributes.PublicSingleton)]
         public static MutableString/*!*/ GetExtension(RubyClass/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
             string pathStr = path.ConvertToString();
@@ -422,11 +394,6 @@
             return MutableString.Create(extension).TaintBy(path);
         }
 
-        [RubyMethod("file?", RubyMethodAttributes.PublicSingleton)]
-        public static bool IsAFile(RubyClass/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
-            return FileExists(self.Context, path.ConvertToString());
-        }
-
         #region fnmatch
 
         [RubyMethod("fnmatch", RubyMethodAttributes.PublicSingleton)]
@@ -442,13 +409,6 @@
             return RubyStatOps.FileType(RubyStatOps.Create(self.Context, path));
         }
 
-        [RubyMethod("grpowned?", RubyMethodAttributes.PublicSingleton)]
-        public static bool IsGroupOwned(RubyClass/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
-            return RubyStatOps.IsGroupOwned(RubyStatOps.Create(self.Context, path));
-        }
-
-        //identical?
-
         #region join
 
         private static readonly MutableString InfiniteRecursionMarker = MutableString.Create("[...]").Freeze();
@@ -735,31 +695,6 @@
             return RubyStatOps.ModifiedTime(RubyStatOps.Create(self.Context, path));
         }
 
-        [RubyMethod("owned?", RubyMethodAttributes.PublicSingleton)]
-        public static bool IsUserOwned(RubyClass/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
-            return RubyStatOps.IsUserOwned(RubyStatOps.Create(self.Context, path));
-        }
-
-        [RubyMethod("pipe?", RubyMethodAttributes.PublicSingleton)]
-        public static bool IsPipe(RubyClass/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
-            return RubyStatOps.IsPipe(RubyStatOps.Create(self.Context, path));
-        }
-
-        private static bool IsReadableImpl(RubyContext/*!*/ context, string/*!*/ path) {
-            FileSystemInfo fsi;
-            if (RubyStatOps.TryCreate(context, path, out fsi)) {
-                return RubyStatOps.IsReadable(fsi);
-            } else {
-                return false;
-            }
-        }
-
-        [RubyMethod("readable?", RubyMethodAttributes.PublicSingleton)]
-        [RubyMethod("readable_real?", RubyMethodAttributes.PublicSingleton)]
-        public static bool IsReadable(RubyClass/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
-            return IsReadableImpl(self.Context, path.ConvertToString());
-        }
-
         [RubyMethod("readlink", RubyMethodAttributes.PublicSingleton)]
         public static bool Readlink(RubyClass/*!*/ self, [NotNull]MutableString/*!*/ path) {
             throw new IronRuby.Builtins.NotImplementedError("readlink() function is unimplemented on this machine");
@@ -796,31 +731,6 @@
             return 0;
         }
 
-        [RubyMethod("setgid?", RubyMethodAttributes.PublicSingleton)]
-        public static bool IsSetGid(RubyClass/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
-            return RubyStatOps.IsSetGid(RubyStatOps.Create(self.Context, path));
-        }
-
-        [RubyMethod("setuid?", RubyMethodAttributes.PublicSingleton)]
-        public static bool IsSetUid(RubyClass/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
-            return RubyStatOps.IsSetUid(RubyStatOps.Create(self.Context, path));
-        }
-
-        [RubyMethod("size", RubyMethodAttributes.PublicSingleton)]
-        public static int Size(RubyClass/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
-            return RubyStatOps.Size(RubyStatOps.Create(self.Context, path));
-        }
-
-        [RubyMethod("size?", RubyMethodAttributes.PublicSingleton)]
-        public static object NullableSize(RubyClass/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
-            return RubyStatOps.NullableSize(RubyStatOps.Create(self.Context, path));
-        }
-
-        [RubyMethod("socket?", RubyMethodAttributes.PublicSingleton)]
-        public static bool IsSocket(RubyClass/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
-            return RubyStatOps.IsSocket(RubyStatOps.Create(self.Context, path));
-        }
-
         [RubyMethod("split", RubyMethodAttributes.PublicSingleton)]
         public static RubyArray Split(RubyClass/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
             RubyArray result = new RubyArray(2);
@@ -829,11 +739,6 @@
             return result;
         }
 
-        [RubyMethod("sticky?", RubyMethodAttributes.PublicSingleton)]
-        public static bool IsSticky(RubyClass/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
-            return RubyStatOps.IsSticky(RubyStatOps.Create(self.Context, path));
-        }
-
         //truncate
 
         internal static readonly object UmaskKey = new object();
@@ -860,11 +765,6 @@
             throw new NotImplementedError("symlnk() function is unimplemented on this machine");
         }
 
-        [RubyMethod("symlink?", RubyMethodAttributes.PublicSingleton, BuildConfig = "!SILVERLIGHT")]
-        public static bool IsSymLink(RubyClass/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
-            return RubyStatOps.IsSymLink(RubyStatOps.Create(self.Context, path));
-        }
-
         [RubyMethod("utime", RubyMethodAttributes.PublicSingleton, BuildConfig = "!SILVERLIGHT")]
         public static int UpdateTimes(RubyClass/*!*/ self, DateTime accessTime, DateTime modifiedTime, [NotNull]MutableString/*!*/ path) {
             string strPath = path.ConvertToString();
@@ -906,37 +806,6 @@
             }
         }
 
-        private static bool IsWritableImpl(RubyContext/*!*/ context, string/*!*/ path) {
-            FileSystemInfo fsi;
-            if (RubyStatOps.TryCreate(context, path, out fsi)) {
-                return RubyStatOps.IsWritable(fsi);
-            } else {
-                return false;
-            }
-        }
-
-        [RubyMethod("writable?", RubyMethodAttributes.PublicSingleton)]
-        [RubyMethod("writable_real?", RubyMethodAttributes.PublicSingleton)]
-        public static bool IsWritable(RubyClass/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
-            return IsWritableImpl(self.Context, path.ConvertToString());            
-        }
-
-        [RubyMethod("zero?", RubyMethodAttributes.PublicSingleton)]
-        public static bool IsZeroLength(RubyClass/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
-            string strPath = path.ConvertToString();
-
-            // NUL/nul is a special-cased filename on Windows
-            if (strPath.ToLower() == "nul") {
-                return RubyStatOps.IsZeroLength(RubyStatOps.Create(self.Context, strPath));
-            }
-
-            if (DirectoryExists(self.Context, strPath) || !FileExists(self.Context, strPath)) {
-                return false;
-            }
-
-            return RubyStatOps.IsZeroLength(RubyStatOps.Create(self.Context, strPath));
-        }
-
         #endregion
 
         #region Public Instance Methods
===================================================================
add: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/FileTest.cs
File: FileTest.cs
===================================================================
--- [no source file]
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/FileTest.cs;FileTest
@@ -1,0 +1,156 @@
+?/* ****************************************************************************
+ *
+ * Copyright (c) Microsoft Corporation. 
+ *
+ * This source code is subject to terms and conditions of the Microsoft Public License. A 
+ * copy of the license can be found in the License.html file at the root of this distribution. If 
+ * you cannot locate the  Microsoft Public License, please send an email to 
+ * ironruby@microsoft.com. By using this source code in any fashion, you are agreeing to be bound 
+ * by the terms of the Microsoft Public License.
+ *
+ * You must not remove this notice, or any other, from this software.
+ *
+ *
+ * ***************************************************************************/
+
+using System.IO;
+using IronRuby.Runtime;
+using Microsoft.Scripting.Runtime;
+
+namespace IronRuby.Builtins {
+    [RubyModule("FileTest")]
+    public static class FileTest {
+        [RubyMethod("blockdev?", RubyMethodAttributes.PublicSingleton)]
+        public static bool IsBlockDevice(RubyModule/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
+            return RubyFileOps.RubyStatOps.IsBlockDevice(RubyFileOps.RubyStatOps.Create(self.Context, path));
+        }
+
+        [RubyMethod("chardev?", RubyMethodAttributes.PublicSingleton)]
+        public static bool IsCharDevice(RubyModule/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
+            return RubyFileOps.RubyStatOps.IsCharDevice(RubyFileOps.RubyStatOps.Create(self.Context, path));
+        }
+
+        [RubyMethod("directory?", RubyMethodAttributes.PublicSingleton)]
+        public static bool IsDirectory(RubyModule/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
+            return RubyFileOps.DirectoryExists(self.Context, path.ConvertToString());
+        }
+
+        [RubyMethod("executable?", RubyMethodAttributes.PublicSingleton)]
+        [RubyMethod("executable_real?", RubyMethodAttributes.PublicSingleton)]
+        public static bool IsExecutable(RubyModule/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
+            return RubyFileOps.RubyStatOps.IsExecutable(RubyFileOps.RubyStatOps.Create(self.Context, path));
+        }
+
+        [RubyMethod("exist?", RubyMethodAttributes.PublicSingleton)]
+        [RubyMethod("exists?", RubyMethodAttributes.PublicSingleton)]
+        public static bool Exists(RubyModule/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
+            string strPath = path.ConvertToString();
+            return RubyFileOps.FileExists(self.Context, strPath) || RubyFileOps.DirectoryExists(self.Context, strPath);
+        }
+
+        [RubyMethod("file?", RubyMethodAttributes.PublicSingleton)]
+        public static bool IsAFile(RubyModule/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
+            return RubyFileOps.FileExists(self.Context, path.ConvertToString());
+        }
+
+        [RubyMethod("grpowned?", RubyMethodAttributes.PublicSingleton)]
+        public static bool IsGroupOwned(RubyModule/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
+            return RubyFileOps.RubyStatOps.IsGroupOwned(RubyFileOps.RubyStatOps.Create(self.Context, path));
+        }
+
+        //identical?
+
+        [RubyMethod("owned?", RubyMethodAttributes.PublicSingleton)]
+        public static bool IsUserOwned(RubyModule/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
+            return RubyFileOps.RubyStatOps.IsUserOwned(RubyFileOps.RubyStatOps.Create(self.Context, path));
+        }
+
+        [RubyMethod("pipe?", RubyMethodAttributes.PublicSingleton)]
+        public static bool IsPipe(RubyModule/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
+            return RubyFileOps.RubyStatOps.IsPipe(RubyFileOps.RubyStatOps.Create(self.Context, path));
+        }
+
+        [RubyMethod("readable?", RubyMethodAttributes.PublicSingleton)]
+        [RubyMethod("readable_real?", RubyMethodAttributes.PublicSingleton)]
+        public static bool IsReadable(RubyModule/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
+            return IsReadableImpl(self.Context, path.ConvertToString());
+        }
+
+        private static bool IsReadableImpl(RubyContext/*!*/ context, string/*!*/ path) {
+            FileSystemInfo fsi;
+            if (RubyFileOps.RubyStatOps.TryCreate(context, path, out fsi)) {
+                return RubyFileOps.RubyStatOps.IsReadable(fsi);
+            } else {
+                return false;
+            }
+        }
+
+        [RubyMethod("setgid?", RubyMethodAttributes.PublicSingleton)]
+        public static bool IsSetGid(RubyModule/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
+            return RubyFileOps.RubyStatOps.IsSetGid(RubyFileOps.RubyStatOps.Create(self.Context, path));
+        }
+
+        [RubyMethod("setuid?", RubyMethodAttributes.PublicSingleton)]
+        public static bool IsSetUid(RubyModule/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
+            return RubyFileOps.RubyStatOps.IsSetUid(RubyFileOps.RubyStatOps.Create(self.Context, path));
+        }
+
+        [RubyMethod("size", RubyMethodAttributes.PublicSingleton)]
+        public static int Size(RubyModule/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
+            return RubyFileOps.RubyStatOps.Size(RubyFileOps.RubyStatOps.Create(self.Context, path));
+        }
+
+        [RubyMethod("size?", RubyMethodAttributes.PublicSingleton)]
+        public static object NullableSize(RubyModule/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
+            return RubyFileOps.RubyStatOps.NullableSize(RubyFileOps.RubyStatOps.Create(self.Context, path));
+        }
+
+        [RubyMethod("socket?", RubyMethodAttributes.PublicSingleton)]
+        public static bool IsSocket(RubyModule/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
+            return RubyFileOps.RubyStatOps.IsSocket(RubyFileOps.RubyStatOps.Create(self.Context, path));
+        }
+
+        [RubyMethod("sticky?", RubyMethodAttributes.PublicSingleton)]
+        public static bool IsSticky(RubyModule/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
+            return RubyFileOps.RubyStatOps.IsSticky(RubyFileOps.RubyStatOps.Create(self.Context, path));
+        }
+
+#if !SILVERLIGHT
+        [RubyMethod("symlink?", RubyMethodAttributes.PublicSingleton, BuildConfig = "!SILVERLIGHT")]
+        public static bool IsSymLink(RubyModule/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
+            return RubyFileOps.RubyStatOps.IsSymLink(RubyFileOps.RubyStatOps.Create(self.Context, path));
+        }
+#endif
+
+        [RubyMethod("writable?", RubyMethodAttributes.PublicSingleton)]
+        [RubyMethod("writable_real?", RubyMethodAttributes.PublicSingleton)]
+        public static bool IsWritable(RubyModule/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
+            return IsWritableImpl(self.Context, path.ConvertToString());
+        }
+
+        private static bool IsWritableImpl(RubyContext/*!*/ context, string/*!*/ path) {
+            FileSystemInfo fsi;
+            if (RubyFileOps.RubyStatOps.TryCreate(context, path, out fsi)) {
+                return RubyFileOps.RubyStatOps.IsWritable(fsi);
+            } else {
+                return false;
+            }
+        }
+
+        [RubyMethod("zero?", RubyMethodAttributes.PublicSingleton)]
+        public static bool IsZeroLength(RubyModule/*!*/ self, [DefaultProtocol, NotNull]MutableString/*!*/ path) {
+            string strPath = path.ConvertToString();
+
+            // NUL/nul is a special-cased filename on Windows
+            if (strPath.ToLower() == "nul") {
+                return RubyFileOps.RubyStatOps.IsZeroLength(RubyFileOps.RubyStatOps.Create(self.Context, strPath));
+            }
+
+            if (RubyFileOps.DirectoryExists(self.Context, strPath) || !RubyFileOps.FileExists(self.Context, strPath)) {
+                return false;
+            }
+
+            return RubyFileOps.RubyStatOps.IsZeroLength(RubyFileOps.RubyStatOps.Create(self.Context, strPath));
+        }
+    }
+}
===================================================================
