[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