1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60523 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
eregon 2017-10-28 15:14:55 +00:00
parent ad1b64d35d
commit 974e862db9
12 changed files with 89 additions and 60 deletions

View file

@ -7,12 +7,12 @@ script:
- bundle exec rspec
matrix:
include:
- rvm: 2.2.7
- rvm: 2.3.4
- rvm: 2.4.1
- rvm: 2.2.8
- rvm: 2.3.5
- rvm: 2.4.2
- rvm: ruby-head
- jdk: oraclejdk8
install:
- curl -L https://github.com/graalvm/truffleruby/releases/download/vm-enterprise-0.27/truffleruby-testing-0.27.tar.gz | tar xz
- curl -L https://github.com/graalvm/truffleruby/releases/download/vm-enterprise-0.28/truffleruby-testing-0.28.tar.gz | tar xz
- source truffleruby/setup_env
- bundle install

View file

@ -37,7 +37,7 @@ class MSpecMain < MSpecScript
options.targets
options.on("--warnings", "Don't supress warnings") do
options.on("--warnings", "Don't suppress warnings") do
config[:flags] << '-w'
ENV['OUTPUT_WARNINGS'] = '1'
end
@ -171,6 +171,7 @@ class MSpecMain < MSpecScript
exit multi_exec(argv)
else
$stderr.puts "$ #{argv.join(' ')}"
$stderr.flush
exec(*argv, close_others: false)
end
end

View file

@ -7,44 +7,48 @@ class ComplainMatcher
def matches?(proc)
@saved_err = $stderr
@stderr = $stderr = IOStub.new
@verbose = $VERBOSE
$VERBOSE = false
proc.call
begin
err = $stderr = IOStub.new
$VERBOSE = false
Thread.current[:in_mspec_complain_matcher] = true
proc.call
ensure
$VERBOSE = @verbose
$stderr = @saved_err
Thread.current[:in_mspec_complain_matcher] = false
end
@warning = err.to_s
unless @complaint.nil?
case @complaint
when Regexp
return false unless $stderr =~ @complaint
return false unless @warning =~ @complaint
else
return false unless $stderr == @complaint
return false unless @warning == @complaint
end
end
return $stderr.empty? ? false : true
ensure
$VERBOSE = @verbose
$stderr = @saved_err
return @warning.empty? ? false : true
end
def failure_message
if @complaint.nil?
["Expected a warning", "but received none"]
elsif @complaint.kind_of? Regexp
["Expected warning to match: #{@complaint.inspect}", "but got: #{@stderr.chomp.inspect}"]
["Expected warning to match: #{@complaint.inspect}", "but got: #{@warning.chomp.inspect}"]
else
["Expected warning: #{@complaint.inspect}", "but got: #{@stderr.chomp.inspect}"]
["Expected warning: #{@complaint.inspect}", "but got: #{@warning.chomp.inspect}"]
end
end
def negative_failure_message
if @complaint.nil?
["Unexpected warning: ", @stderr.chomp.inspect]
["Unexpected warning: ", @warning.chomp.inspect]
elsif @complaint.kind_of? Regexp
["Expected warning not to match: #{@complaint.inspect}", "but got: #{@stderr.chomp.inspect}"]
["Expected warning not to match: #{@complaint.inspect}", "but got: #{@warning.chomp.inspect}"]
else
["Expected warning: #{@complaint.inspect}", "but got: #{@stderr.chomp.inspect}"]
["Expected warning: #{@complaint.inspect}", "but got: #{@warning.chomp.inspect}"]
end
end
end

View file

@ -53,13 +53,19 @@ class RaiseErrorMatcher
exception_class_and_message(exception.class, exception.message)
end
def format_result(result)
result.pretty_inspect.chomp
rescue => e
"#pretty_inspect raised #{e.class}; A #<#{result.class}>"
end
def failure_message
message = ["Expected #{format_expected_exception}"]
if @actual
message << "but got #{format_exception(@actual)}"
else
message << "but no exception was raised (#{@result.pretty_inspect.chomp} was returned)"
message << "but no exception was raised (#{format_result(@result)} was returned)"
end
message

View file

@ -6,7 +6,7 @@
#--
# A note on naming: this is named _ContextState_ rather
# than _DescribeState_ because +describe+ is the keyword
# in the DSL for refering to the context in which an example
# in the DSL for referring to the context in which an example
# is evaluated, just as +it+ refers to the example itself.
#++
class ContextState

View file

@ -1,4 +1,5 @@
require 'mspec/guards/guard'
require 'mspec/guards/version'
require 'mspec/utils/warnings'
# MSpecScript provides a skeleton for all the MSpec runner scripts.
@ -38,7 +39,7 @@ class MSpecScript
end
def initialize
if RUBY_VERSION < '2.2'
ruby_version_is ""..."2.2" do
abort "MSpec needs Ruby 2.2 or more recent"
end
@ -200,27 +201,30 @@ class MSpecScript
abort "Could not find spec file #{partial}"
end
# Resolves each entry in +list+ to a set of files.
# Resolves each entry in +patterns+ to a set of files.
#
# If the entry has a leading '^' character, the list of files
# If the pattern has a leading '^' character, the list of files
# is subtracted from the list of files accumulated to that point.
#
# If the entry has a leading ':' character, the corresponding
# key is looked up in the config object and the entries in the
# value retrieved are processed through #entries.
def files(list)
list.inject([]) do |files, item|
case item[0]
def files(patterns)
list = []
patterns.each do |pattern|
case pattern[0]
when ?^
files -= entries(item[1..-1])
list -= entries(pattern[1..-1])
when ?:
key = item[1..-1].to_sym
files += files(Array(config[key]))
key = pattern[1..-1].to_sym
value = config[key]
abort "Key #{pattern} not found in mspec config." unless value
list += files(Array(value))
else
files += entries(item)
list += entries(pattern)
end
files
end
list
end
def files_from_patterns(patterns)
@ -231,12 +235,10 @@ class MSpecScript
if patterns.empty? and File.directory? "./spec"
patterns = ["spec/"]
end
if patterns.empty?
puts "No files specified."
exit 1
end
end
files patterns
list = files(patterns)
abort "No files specified." if list.empty?
list
end
def cores(max)

View file

@ -1,6 +1,6 @@
require 'mspec/guards/version'
if RUBY_ENGINE == "ruby" and RUBY_VERSION >= "2.4.0"
if RUBY_ENGINE == "ruby" and ruby_version_is("2.4")
ruby_version_is "2.4"..."2.5" do
# Kernel#warn does not delegate to Warning.warn in 2.4
module Kernel
@ -16,9 +16,19 @@ if RUBY_ENGINE == "ruby" and RUBY_VERSION >= "2.4.0"
end
def Warning.warn(message)
if Thread.current[:in_mspec_complain_matcher]
return $stderr.write(message)
end
case message
# $VERBOSE = true warnings
when /possibly useless use of (<|<=|==|>=|>|\+|-) in void context/
when /(.+\.rb):(\d+):.+possibly useless use of (<|<=|==|>=|>) in void context/
# Make sure there is a .should otherwise it is missing
line_nb = Integer($2)
unless File.exist?($1) and /\.should(_not)? (<|<=|==|>=|>)/ === File.readlines($1)[line_nb-1]
$stderr.write message
end
when /possibly useless use of (\+|-) in void context/
when /assigned but unused variable/
when /method redefined/
when /previous definition of/

View file

@ -17,8 +17,6 @@ end
describe MSpecRun, "#options" do
before :each do
@stdout, $stdout = $stdout, IOStub.new
@argv = [one_spec, two_spec]
@options, @config = new_option
MSpecOptions.stub(:new).and_return(@options)
@ -27,10 +25,6 @@ describe MSpecRun, "#options" do
@script.stub(:config).and_return(@config)
end
after :each do
$stdout = @stdout
end
it "enables the filter options" do
@options.should_receive(:filters)
@script.options @argv
@ -114,15 +108,14 @@ describe MSpecRun, "#options" do
it "exits if there are no files to process and './spec' is not a directory" do
File.should_receive(:directory?).with("./spec").and_return(false)
@options.should_receive(:parse).and_return([])
@script.should_receive(:exit)
@script.should_receive(:abort).with("No files specified.")
@script.options
$stdout.should include "No files specified"
end
it "process 'spec/' if it is a directory and no files were specified" do
File.should_receive(:directory?).with("./spec").and_return(true)
@options.should_receive(:parse).and_return([])
@script.should_receive(:files).with(["spec/"])
@script.should_receive(:files).with(["spec/"]).and_return(["spec/a_spec.rb"])
@script.options
end

View file

@ -90,6 +90,18 @@ describe RaiseErrorMatcher do
["Expected ExpectedException (expected)", "but no exception was raised (nil was returned)"]
end
it "provides a useful failure message when no exception is raised and the result raises in #pretty_inspect" do
result = Object.new
def result.pretty_inspect
raise ArgumentError, "bad"
end
proc = Proc.new { result }
matcher = RaiseErrorMatcher.new(ExpectedException, "expected")
matcher.matches?(proc)
matcher.failure_message.should ==
["Expected ExpectedException (expected)", "but no exception was raised (#pretty_inspect raised ArgumentError; A #<Object> was returned)"]
end
it "provides a useful negative failure message" do
proc = Proc.new { raise ExpectedException, "expected" }
matcher = RaiseErrorMatcher.new(ExpectedException, "expected")

View file

@ -284,21 +284,21 @@ describe Mock, ".verify_call" do
ScratchPad.recorded.should == 1
end
it "raises an expection when it is expected to yield but no block is given" do
it "raises an exception when it is expected to yield but no block is given" do
@proxy.and_yield(1, 2, 3)
lambda {
Mock.verify_call(@mock, :method_call)
}.should raise_error(SpecExpectationNotMetError)
end
it "raises an expection when it is expected to yield more arguments than the block can take" do
it "raises an exception when it is expected to yield more arguments than the block can take" do
@proxy.and_yield(1, 2, 3)
lambda {
Mock.verify_call(@mock, :method_call) {|a, b|}
}.should raise_error(SpecExpectationNotMetError)
end
it "does not raise an expection when it is expected to yield to a block that can take any number of arguments" do
it "does not raise an exception when it is expected to yield to a block that can take any number of arguments" do
@proxy.and_yield(1, 2, 3)
expect {
Mock.verify_call(@mock, :method_call) {|*a|}

View file

@ -15,25 +15,25 @@ describe ProfileFilter, "#find" do
@filter.find(@file).should == @file
end
it "attemps to locate the file in 'spec/profiles'" do
it "attempts to locate the file in 'spec/profiles'" do
path = File.join "spec/profiles", @file
File.should_receive(:exist?).with(path).and_return(true)
@filter.find(@file).should == path
end
it "attemps to locate the file in 'spec'" do
it "attempts to locate the file in 'spec'" do
path = File.join "spec", @file
File.should_receive(:exist?).with(path).and_return(true)
@filter.find(@file).should == path
end
it "attemps to locate the file in 'profiles'" do
it "attempts to locate the file in 'profiles'" do
path = File.join "profiles", @file
File.should_receive(:exist?).with(path).and_return(true)
@filter.find(@file).should == path
end
it "attemps to locate the file in '.'" do
it "attempts to locate the file in '.'" do
path = File.join ".", @file
File.should_receive(:exist?).with(path).and_return(true)
@filter.find(@file).should == path

View file

@ -172,7 +172,7 @@ describe MSpecScript, "#load" do
@script.load(@base).should == :loaded
end
it "attemps to locate the file in '.'" do
it "attempts to locate the file in '.'" do
path = File.expand_path @file, "."
File.should_receive(:exist?).with(path).and_return(true)
Kernel.should_receive(:load).with(path).and_return(:loaded)
@ -186,7 +186,7 @@ describe MSpecScript, "#load" do
@script.load(@base).should == :loaded
end
it "attemps to locate the file in 'spec'" do
it "attempts to locate the file in 'spec'" do
path = File.expand_path @file, "spec"
File.should_receive(:exist?).with(path).and_return(true)
Kernel.should_receive(:load).with(path).and_return(:loaded)
@ -438,8 +438,9 @@ describe MSpecScript, "#files" do
@script.files([":files"]).should == ["file1", "file2"]
end
it "returns an empty list if the config key is not set" do
@script.files([":all_files"]).should == []
it "aborts if the config key is not set" do
@script.should_receive(:abort).with("Key :all_files not found in mspec config.")
@script.files([":all_files"])
end
end