[macruby-changes] [1853] MacRuby/branches/experimental/mspec

source_changes at macosforge.org source_changes at macosforge.org
Sun Jun 14 11:53:44 PDT 2009


Revision: 1853
          http://trac.macosforge.org/projects/ruby/changeset/1853
Author:   eloy.de.enige at gmail.com
Date:     2009-06-14 11:53:44 -0700 (Sun, 14 Jun 2009)
Log Message:
-----------
Updated MSpec to d47b8987fd1f9114b36a4bc45bf683fe121f0397

Modified Paths:
--------------
    MacRuby/branches/experimental/mspec/Rakefile
    MacRuby/branches/experimental/mspec/lib/mspec/helpers/environment.rb
    MacRuby/branches/experimental/mspec/lib/mspec/helpers.rb
    MacRuby/branches/experimental/mspec/lib/mspec/mocks/mock.rb
    MacRuby/branches/experimental/mspec/lib/mspec/mocks/object.rb
    MacRuby/branches/experimental/mspec/lib/mspec/mocks/proxy.rb
    MacRuby/branches/experimental/mspec/lib/mspec/utils/options.rb
    MacRuby/branches/experimental/mspec/lib/mspec/version.rb
    MacRuby/branches/experimental/mspec/mspec.gemspec
    MacRuby/branches/experimental/mspec/spec/commands/mkspec_spec.rb
    MacRuby/branches/experimental/mspec/spec/commands/mspec_spec.rb
    MacRuby/branches/experimental/mspec/spec/mocks/mock_spec.rb
    MacRuby/branches/experimental/mspec/upstream

Added Paths:
-----------
    MacRuby/branches/experimental/mspec/lib/mspec/helpers/ducktype.rb
    MacRuby/branches/experimental/mspec/lib/mspec/helpers/metaclass.rb
    MacRuby/branches/experimental/mspec/spec/helpers/ducktype_spec.rb

Modified: MacRuby/branches/experimental/mspec/Rakefile
===================================================================
--- MacRuby/branches/experimental/mspec/Rakefile	2009-06-14 00:26:05 UTC (rev 1852)
+++ MacRuby/branches/experimental/mspec/Rakefile	2009-06-14 18:53:44 UTC (rev 1853)
@@ -18,7 +18,7 @@
 
   s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
   s.authors                   = ["Brian Ford"]
-  s.date                      = %q{2009-3-30}
+  s.date                      = %q{2009-6-8}
   s.email                     = %q{bford at engineyard.com}
   s.has_rdoc                  = true
   s.extra_rdoc_files          = %w[ README LICENSE ]

Added: MacRuby/branches/experimental/mspec/lib/mspec/helpers/ducktype.rb
===================================================================
--- MacRuby/branches/experimental/mspec/lib/mspec/helpers/ducktype.rb	                        (rev 0)
+++ MacRuby/branches/experimental/mspec/lib/mspec/helpers/ducktype.rb	2009-06-14 18:53:44 UTC (rev 1853)
@@ -0,0 +1,33 @@
+class Object
+  def responds_to(sym)
+    metaclass.class_eval <<-END
+      def respond_to?(sym, include_private=false)
+        sym.to_sym == #{sym.to_sym.inspect} ? true : super
+      end
+    END
+  end
+
+  def does_not_respond_to(sym)
+    metaclass.class_eval <<-END
+      def respond_to?(sym, include_private=false)
+        sym.to_sym == #{sym.to_sym.inspect} ? false : super
+      end
+    END
+  end
+
+  def undefine(sym)
+    metaclass.class_eval <<-END
+      undef_method #{sym.to_sym.inspect}
+    END
+  end
+
+  def fake!(sym, value=nil)
+    responds_to sym
+
+    metaclass.class_eval <<-END
+      def method_missing(sym, *args)
+        return #{value.inspect} if sym.to_sym == #{sym.to_sym.inspect}
+      end
+    END
+  end
+end

Modified: MacRuby/branches/experimental/mspec/lib/mspec/helpers/environment.rb
===================================================================
--- MacRuby/branches/experimental/mspec/lib/mspec/helpers/environment.rb	2009-06-14 00:26:05 UTC (rev 1852)
+++ MacRuby/branches/experimental/mspec/lib/mspec/helpers/environment.rb	2009-06-14 18:53:44 UTC (rev 1853)
@@ -11,13 +11,22 @@
     env
   end
 
+  def windows_env_echo(var)
+    `cmd.exe /C ECHO %#{var}%`.strip
+  end  
+
   def username
     user = ""
     if SpecGuard.windows?
-      user = `cmd.exe /C ECHO %USERNAME%`.strip
+      user = windows_env_echo('USERNAME')
     else
       user = `whoami`.strip
     end
     user
   end
+
+  def home_directory
+    return ENV['HOME'] unless SpecGuard.windows?
+    windows_env_echo('HOMEDRIVE') + windows_env_echo('HOMEPATH')
+  end  
 end

Added: MacRuby/branches/experimental/mspec/lib/mspec/helpers/metaclass.rb
===================================================================
--- MacRuby/branches/experimental/mspec/lib/mspec/helpers/metaclass.rb	                        (rev 0)
+++ MacRuby/branches/experimental/mspec/lib/mspec/helpers/metaclass.rb	2009-06-14 18:53:44 UTC (rev 1853)
@@ -0,0 +1,7 @@
+class Object
+  unless method_defined? :metaclass
+    def metaclass
+      class << self; self; end
+    end
+  end
+end

Modified: MacRuby/branches/experimental/mspec/lib/mspec/helpers.rb
===================================================================
--- MacRuby/branches/experimental/mspec/lib/mspec/helpers.rb	2009-06-14 00:26:05 UTC (rev 1852)
+++ MacRuby/branches/experimental/mspec/lib/mspec/helpers.rb	2009-06-14 18:53:44 UTC (rev 1853)
@@ -1,6 +1,7 @@
 require 'mspec/helpers/argv'
 require 'mspec/helpers/bignum'
 require 'mspec/helpers/const_lookup'
+require 'mspec/helpers/ducktype'
 require 'mspec/helpers/enumerator_class'
 require 'mspec/helpers/environment'
 require 'mspec/helpers/fixture'
@@ -8,6 +9,7 @@
 require 'mspec/helpers/hash'
 require 'mspec/helpers/io'
 require 'mspec/helpers/language_version'
+require 'mspec/helpers/metaclass'
 require 'mspec/helpers/ruby_exe'
 require 'mspec/helpers/scratch'
 require 'mspec/helpers/tmp'

Modified: MacRuby/branches/experimental/mspec/lib/mspec/mocks/mock.rb
===================================================================
--- MacRuby/branches/experimental/mspec/lib/mspec/mocks/mock.rb	2009-06-14 00:26:05 UTC (rev 1852)
+++ MacRuby/branches/experimental/mspec/lib/mspec/mocks/mock.rb	2009-06-14 18:53:44 UTC (rev 1853)
@@ -1,10 +1,15 @@
 require 'mspec/expectations/expectations'
+require 'mspec/helpers/metaclass'
 
 module Mock
   def self.reset
-    @mocks = @stubs = nil
+    @mocks = @stubs = @objects = nil
   end
 
+  def self.objects
+    @objects ||= {}
+  end
+
   def self.mocks
     @mocks ||= Hash.new { |h,k| h[k] = [] }
   end
@@ -14,23 +19,38 @@
   end
 
   def self.replaced_name(obj, sym)
-    :"__ms_#{obj.__id__}_#{sym}__"
+    :"__mspec_#{obj.__id__}_#{sym}__"
   end
 
   def self.replaced_key(obj, sym)
-    [replaced_name(obj, sym), obj, sym]
+    [replaced_name(obj, sym), sym]
   end
 
-  def self.replaced?(key)
-    !!(mocks.keys + stubs.keys).find { |k| k.first == key.first }
+  def self.has_key?(keys, sym)
+    !!keys.find { |k| k.first == sym }
   end
 
+  def self.replaced?(sym)
+    has_key?(mocks.keys, sym) or has_key?(stubs.keys, sym)
+  end
+
+  def self.mock_respond_to?(obj, sym)
+    name = replaced_name(obj, :respond_to?)
+    if replaced? name
+      obj.__send__ name, sym
+    else
+      obj.respond_to? sym
+    end
+  end
+
   def self.install_method(obj, sym, type=nil)
-    meta = class << obj; self; end
+    meta = obj.metaclass
 
     key = replaced_key obj, sym
-    if (sym.to_sym == :respond_to? or obj.respond_to?(sym)) and !replaced?(key)
-      meta.__send__ :alias_method, key.first, sym.to_sym
+    sym = sym.to_sym
+
+    if (sym == :respond_to? or mock_respond_to?(obj, sym)) and !replaced?(key.first)
+      meta.__send__ :alias_method, key.first, sym
     end
 
     meta.class_eval <<-END
@@ -51,6 +71,7 @@
     else
       mocks[key] << proxy
     end
+    objects[key] = obj
 
     proxy
   end
@@ -61,7 +82,7 @@
 
   def self.verify_count
     mocks.each do |key, proxies|
-      replaced, obj, sym = *key
+      obj = objects[key]
       proxies.each do |proxy|
         qualifier, count = proxy.count
         pass = case qualifier
@@ -78,7 +99,7 @@
         end
         unless pass
           SpecExpectation.fail_with(
-            "Mock '#{name_or_inspect obj}' expected to receive '#{sym}' " \
+            "Mock '#{name_or_inspect obj}' expected to receive '#{key.last}' " \
             "#{qualifier.to_s.sub('_', ' ')} #{count} times",
             "but received it #{proxy.calls} times")
         end
@@ -93,45 +114,46 @@
     end
 
     key = replaced_key obj, sym
-    proxies = mocks[key] + stubs[key]
-    proxies.each do |proxy|
-      pass = case proxy.arguments
-      when :any_args
-        true
-      when :no_args
-        compare.nil?
-      else
-        proxy.arguments == compare
-      end
+    [mocks, stubs].each do |proxies|
+      proxies[key].each do |proxy|
+        pass = case proxy.arguments
+        when :any_args
+          true
+        when :no_args
+          compare.nil?
+        else
+          proxy.arguments == compare
+        end
 
-      if proxy.yielding?
-        if block
-          proxy.yielding.each do |args_to_yield|
-            if block.arity == -1 || block.arity == args_to_yield.size
-              block.call(*args_to_yield)
-            else
-              SpecExpectation.fail_with(
-                "Mock '#{name_or_inspect obj}' asked to yield " \
-                "|#{proxy.yielding.join(', ')}| on #{sym}\n",
-                "but a block with arity #{block.arity} was passed")
+        if proxy.yielding?
+          if block
+            proxy.yielding.each do |args_to_yield|
+              if block.arity == -1 || block.arity == args_to_yield.size
+                block.call(*args_to_yield)
+              else
+                SpecExpectation.fail_with(
+                  "Mock '#{name_or_inspect obj}' asked to yield " \
+                  "|#{proxy.yielding.join(', ')}| on #{sym}\n",
+                  "but a block with arity #{block.arity} was passed")
+              end
             end
+          else
+            SpecExpectation.fail_with(
+              "Mock '#{name_or_inspect obj}' asked to yield " \
+              "|[#{proxy.yielding.join('], [')}]| on #{sym}\n",
+              "but no block was passed")
           end
-        else
-          SpecExpectation.fail_with(
-            "Mock '#{name_or_inspect obj}' asked to yield " \
-            "|[#{proxy.yielding.join('], [')}]| on #{sym}\n",
-            "but no block was passed")
         end
-      end
 
-      if pass
-        proxy.called
-        return proxy.returning
+        if pass
+          proxy.called
+          return proxy.returning
+        end
       end
     end
 
     if sym.to_sym == :respond_to?
-      return obj.__send__(replaced_name(obj, sym), compare)
+      mock_respond_to? obj, compare
     else
       SpecExpectation.fail_with("Mock '#{name_or_inspect obj}': method #{sym}\n",
                             "called with unexpected arguments (#{Array(compare).join(' ')})")
@@ -139,15 +161,16 @@
   end
 
   def self.cleanup
-    symbols = mocks.keys + stubs.keys
-    symbols.uniq.each do |replaced, obj, sym|
-      meta = class << obj; self; end
+    objects.each do |key, obj|
+      replaced = key.first
+      sym = key.last
+      meta = obj.metaclass
 
-      if meta.instance_methods.map { |x| x.to_sym }.include?(replaced.to_sym)
-        meta.__send__ :alias_method, sym.to_sym, replaced
+      if meta.instance_methods.map { |x| x.to_sym }.include?(replaced)
+        meta.__send__ :alias_method, sym, replaced
         meta.__send__ :remove_method, replaced
       else
-        meta.__send__ :remove_method, sym.to_sym
+        meta.__send__ :remove_method, sym
       end
     end
     reset

Modified: MacRuby/branches/experimental/mspec/lib/mspec/mocks/object.rb
===================================================================
--- MacRuby/branches/experimental/mspec/lib/mspec/mocks/object.rb	2009-06-14 00:26:05 UTC (rev 1852)
+++ MacRuby/branches/experimental/mspec/lib/mspec/mocks/object.rb	2009-06-14 18:53:44 UTC (rev 1853)
@@ -17,4 +17,8 @@
   def mock(name, options={})
     MockObject.new name, options
   end
+
+  def mock_numeric(name, options={})
+    NumericMockObject.new name, options
+  end
 end

Modified: MacRuby/branches/experimental/mspec/lib/mspec/mocks/proxy.rb
===================================================================
--- MacRuby/branches/experimental/mspec/lib/mspec/mocks/proxy.rb	2009-06-14 00:26:05 UTC (rev 1852)
+++ MacRuby/branches/experimental/mspec/lib/mspec/mocks/proxy.rb	2009-06-14 18:53:44 UTC (rev 1853)
@@ -9,6 +9,20 @@
   end
 end
 
+class NumericMockObject < Numeric
+  def initialize(name, options={})
+    @name = name
+    @null = options[:null_object]
+  end
+
+  def method_missing(sym, *args, &block)
+    @null ? self : super
+  end
+
+  def singleton_method_added(val)
+  end
+end
+
 class MockProxy
   def initialize(type=nil)
     @multiple_returns = nil
@@ -112,11 +126,11 @@
     @yielding << args
     self
   end
-  
+
   def yielding
     @yielding
   end
-  
+
   def yielding?
     !@yielding.empty?
   end

Modified: MacRuby/branches/experimental/mspec/lib/mspec/utils/options.rb
===================================================================
--- MacRuby/branches/experimental/mspec/lib/mspec/utils/options.rb	2009-06-14 00:26:05 UTC (rev 1852)
+++ MacRuby/branches/experimental/mspec/lib/mspec/utils/options.rb	2009-06-14 18:53:44 UTC (rev 1853)
@@ -207,7 +207,7 @@
 
   def targets
     on("-t", "--target", "TARGET",
-       "Implementation to run the specs, where:") do |t|
+       "Implementation to run the specs, where TARGET is:") do |t|
       case t
       when 'r', 'ruby'
         config[:target] = 'ruby'
@@ -232,7 +232,8 @@
     doc "     x or rubinius          invokes ./bin/rbx"
     doc "     X or rbx               invokes rbx in PATH"
     doc "     j or jruby             invokes jruby in PATH"
-    doc "     i or ironruby          invokes ir in PATH\n"
+    doc "     i or ironruby          invokes ir in PATH"
+    doc "     full path to EXE       invokes EXE directly\n"
 
     on("-T", "--target-opt", "OPT",
        "Pass OPT as a flag to the target implementation") do |t|

Modified: MacRuby/branches/experimental/mspec/lib/mspec/version.rb
===================================================================
--- MacRuby/branches/experimental/mspec/lib/mspec/version.rb	2009-06-14 00:26:05 UTC (rev 1852)
+++ MacRuby/branches/experimental/mspec/lib/mspec/version.rb	2009-06-14 18:53:44 UTC (rev 1853)
@@ -1,5 +1,5 @@
 require 'mspec/utils/version'
 
 module MSpec
-  VERSION = SpecVersion.new "1.5.11"
+  VERSION = SpecVersion.new "1.5.12"
 end

Modified: MacRuby/branches/experimental/mspec/mspec.gemspec
===================================================================
--- MacRuby/branches/experimental/mspec/mspec.gemspec	2009-06-14 00:26:05 UTC (rev 1852)
+++ MacRuby/branches/experimental/mspec/mspec.gemspec	2009-06-14 18:53:44 UTC (rev 1853)
@@ -1,12 +1,12 @@
 Gem::Specification.new do |s|
   s.name                      = %q{mspec}
-  s.version                   = "1.5.11"
+  s.version                   = "1.5.12"
 
   s.specification_version     = 2 if s.respond_to? :specification_version=
 
   s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
   s.authors                   = ["Brian Ford"]
-  s.date                      = %q{2009-3-30}
+  s.date                      = %q{2009-6-8}
   s.email                     = %q{bford at engineyard.com}
   s.has_rdoc                  = true
   s.extra_rdoc_files          = %w[ README LICENSE ]

Modified: MacRuby/branches/experimental/mspec/spec/commands/mkspec_spec.rb
===================================================================
--- MacRuby/branches/experimental/mspec/spec/commands/mkspec_spec.rb	2009-06-14 00:26:05 UTC (rev 1852)
+++ MacRuby/branches/experimental/mspec/spec/commands/mkspec_spec.rb	2009-06-14 18:53:44 UTC (rev 1853)
@@ -172,7 +172,7 @@
 
   it "checks if specs exist for the method if the spec file exists" do
     @script.should_receive(:`).with(
-        /mspec\/bin\/mspec-run --dry-run -fs -e 'Object#inspect' spec\/core\/tcejbo\/inspect_spec.rb/)
+        %r"#{@script.ruby} #{MSPEC_HOME}/bin/mspec-run --dry-run -fs -e 'Object#inspect' spec/core/tcejbo/inspect_spec.rb")
     @script.write_spec("spec/core/tcejbo/inspect_spec.rb", "Object#inspect", true)
   end
 

Modified: MacRuby/branches/experimental/mspec/spec/commands/mspec_spec.rb
===================================================================
--- MacRuby/branches/experimental/mspec/spec/commands/mspec_spec.rb	2009-06-14 00:26:05 UTC (rev 1852)
+++ MacRuby/branches/experimental/mspec/spec/commands/mspec_spec.rb	2009-06-14 18:53:44 UTC (rev 1853)
@@ -239,7 +239,7 @@
   end
 
   it "uses exec to invoke the runner script" do
-    @script.should_receive(:exec).with("ruby", "-v", %r"mspec/bin/mspec-run$")
+    @script.should_receive(:exec).with("ruby", "-v", %r"#{MSPEC_HOME}/bin/mspec-run$")
     @script.options []
     @script.run
   end
@@ -248,7 +248,7 @@
     @script.should_receive(:multi_exec).and_return do |arg|
       arg.length.should == 3
       arg[0].should == "-v"
-      arg[1].should =~ %r"mspec/bin/mspec-ci$"
+      arg[1].should =~ %r"#{MSPEC_HOME}/bin/mspec-ci$"
       arg[2].should == "-fy"
     end
     @script.options ["ci", "-j"]

Added: MacRuby/branches/experimental/mspec/spec/helpers/ducktype_spec.rb
===================================================================
--- MacRuby/branches/experimental/mspec/spec/helpers/ducktype_spec.rb	                        (rev 0)
+++ MacRuby/branches/experimental/mspec/spec/helpers/ducktype_spec.rb	2009-06-14 18:53:44 UTC (rev 1853)
@@ -0,0 +1,44 @@
+require File.dirname(__FILE__) + '/../spec_helper'
+require 'mspec/helpers/ducktype'
+
+describe Object, "#responds_to" do
+  it "returns true for specified symbols" do
+    obj = mock("obj")
+    obj.responds_to(:to_flo)
+    obj.should respond_to(:to_flo)
+    obj.should respond_to(:to_s)
+  end
+end
+
+describe Object, "#does_not_respond_to" do
+  it "returns false for specified symbols" do
+    obj = mock("obj")
+    obj.does_not_respond_to(:to_s)
+    obj.should_not respond_to(:to_s)
+  end
+end
+
+describe Object, "#undefine" do
+  it "undefines the method" do
+    # cannot use a mock here because of the way RSpec handles method_missing
+    obj = Object.new
+    obj.undefine(:to_s)
+    lambda { obj.send :to_s }.should raise_error(NoMethodError)
+  end
+end
+
+describe Object, "#fake!" do
+  before :each do
+    @obj = mock("obj")
+  end
+
+  it "makes the object respond to the message" do
+    @obj.fake!(:to_flo)
+    @obj.should respond_to(:to_flo)
+  end
+
+  it "returns the value when the obj is sent the message" do
+    @obj.fake!(:to_flo, 1.2)
+    @obj.to_flo.should == 1.2
+  end
+end

Modified: MacRuby/branches/experimental/mspec/spec/mocks/mock_spec.rb
===================================================================
--- MacRuby/branches/experimental/mspec/spec/mocks/mock_spec.rb	2009-06-14 00:26:05 UTC (rev 1852)
+++ MacRuby/branches/experimental/mspec/spec/mocks/mock_spec.rb	2009-06-14 18:53:44 UTC (rev 1853)
@@ -23,7 +23,7 @@
   it "returns the name for a method that is being replaced by a mock method" do
     m = mock('a fake id')
     m.stub!(:__id__).and_return(42)
-    Mock.replaced_name(m, :method_call).should == :__ms_42_method_call__
+    Mock.replaced_name(m, :method_call).should == :__mspec_42_method_call__
   end
 end
 
@@ -31,7 +31,7 @@
   it "returns a key used internally by Mock" do
     m = mock('a fake id')
     m.stub!(:__id__).and_return(42)
-    Mock.replaced_key(m, :method_call).should == [:__ms_42_method_call__, m, :method_call]
+    Mock.replaced_key(m, :method_call).should == [:__mspec_42_method_call__, :method_call]
   end
 end
 
@@ -44,16 +44,16 @@
 
   it "returns true if a method has been stubbed on an object" do
     Mock.install_method @mock, :method_call
-    Mock.replaced?(Mock.replaced_key(@mock, :method_call)).should be_true
+    Mock.replaced?(Mock.replaced_name(@mock, :method_call)).should be_true
   end
 
   it "returns true if a method has been mocked on an object" do
     Mock.install_method @mock, :method_call, :stub
-    Mock.replaced?(Mock.replaced_key(@mock, :method_call)).should be_true
+    Mock.replaced?(Mock.replaced_name(@mock, :method_call)).should be_true
   end
 
   it "returns false if a method has not been stubbed or mocked" do
-    Mock.replaced?(Mock.replaced_key(@mock, :method_call)).should be_false
+    Mock.replaced?(Mock.replaced_name(@mock, :method_call)).should be_false
   end
 end
 

Modified: MacRuby/branches/experimental/mspec/upstream
===================================================================
--- MacRuby/branches/experimental/mspec/upstream	2009-06-14 00:26:05 UTC (rev 1852)
+++ MacRuby/branches/experimental/mspec/upstream	2009-06-14 18:53:44 UTC (rev 1853)
@@ -1 +1 @@
-f27da63e165e286e8e717af15b9ed0cb809a3979
\ No newline at end of file
+d47b8987fd1f9114b36a4bc45bf683fe121f0397
\ No newline at end of file
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090614/3cbf6bcb/attachment-0001.html>


More information about the macruby-changes mailing list