opal-rspec-cj 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/.gitmodules +15 -0
- data/.travis.yml +13 -0
- data/.yardopts +5 -0
- data/CHANGELOG.md +25 -0
- data/Gemfile +8 -0
- data/README.md +147 -0
- data/Rakefile +26 -0
- data/config.ru +10 -0
- data/example/Gemfile +4 -0
- data/example/README.md +13 -0
- data/example/Rakefile +8 -0
- data/example/opal/user.rb +11 -0
- data/example/spec/user_spec.rb +15 -0
- data/lib/opal-rspec.rb +2 -0
- data/lib/opal/rspec.rb +20 -0
- data/lib/opal/rspec/rake_task.rb +63 -0
- data/lib/opal/rspec/version.rb +5 -0
- data/opal-rspec.gemspec +21 -0
- data/opal/opal-rspec.rb +1 -0
- data/opal/opal/rspec.rb +25 -0
- data/opal/opal/rspec/async.rb +289 -0
- data/opal/opal/rspec/browser_formatter.rb +188 -0
- data/opal/opal/rspec/fixes.rb +116 -0
- data/opal/opal/rspec/requires.rb +45 -0
- data/opal/opal/rspec/runner.rb +69 -0
- data/opal/opal/rspec/sprockets_runner.rb.erb +11 -0
- data/opal/opal/rspec/text_formatter.rb +74 -0
- data/spec/async_spec.rb +38 -0
- data/spec/example_spec.rb +163 -0
- data/spec/matchers_spec.rb +201 -0
- data/spec/mock_spec.rb +63 -0
- data/spec/named_subject_spec.rb +11 -0
- data/spec/should_syntax_spec.rb +17 -0
- data/vendor/spec_runner.js +50 -0
- data/vendor_lib/rspec-expectations.rb +1 -0
- data/vendor_lib/rspec.rb +3 -0
- data/vendor_lib/rspec/autorun.rb +2 -0
- data/vendor_lib/rspec/core.rb +203 -0
- data/vendor_lib/rspec/core/backport_random.rb +302 -0
- data/vendor_lib/rspec/core/backtrace_formatter.rb +65 -0
- data/vendor_lib/rspec/core/command_line.rb +36 -0
- data/vendor_lib/rspec/core/configuration.rb +1129 -0
- data/vendor_lib/rspec/core/configuration_options.rb +143 -0
- data/vendor_lib/rspec/core/drb_command_line.rb +26 -0
- data/vendor_lib/rspec/core/drb_options.rb +87 -0
- data/vendor_lib/rspec/core/dsl.rb +26 -0
- data/vendor_lib/rspec/core/example.rb +312 -0
- data/vendor_lib/rspec/core/example_group.rb +540 -0
- data/vendor_lib/rspec/core/filter_manager.rb +224 -0
- data/vendor_lib/rspec/core/flat_map.rb +17 -0
- data/vendor_lib/rspec/core/formatters.rb +54 -0
- data/vendor_lib/rspec/core/formatters/base_formatter.rb +291 -0
- data/vendor_lib/rspec/core/formatters/base_text_formatter.rb +307 -0
- data/vendor_lib/rspec/core/formatters/deprecation_formatter.rb +193 -0
- data/vendor_lib/rspec/core/formatters/documentation_formatter.rb +67 -0
- data/vendor_lib/rspec/core/formatters/helpers.rb +82 -0
- data/vendor_lib/rspec/core/formatters/html_formatter.rb +155 -0
- data/vendor_lib/rspec/core/formatters/html_printer.rb +408 -0
- data/vendor_lib/rspec/core/formatters/json_formatter.rb +99 -0
- data/vendor_lib/rspec/core/formatters/progress_formatter.rb +32 -0
- data/vendor_lib/rspec/core/formatters/snippet_extractor.rb +101 -0
- data/vendor_lib/rspec/core/hooks.rb +535 -0
- data/vendor_lib/rspec/core/memoized_helpers.rb +431 -0
- data/vendor_lib/rspec/core/metadata.rb +313 -0
- data/vendor_lib/rspec/core/mocking/with_absolutely_nothing.rb +11 -0
- data/vendor_lib/rspec/core/mocking/with_flexmock.rb +27 -0
- data/vendor_lib/rspec/core/mocking/with_mocha.rb +52 -0
- data/vendor_lib/rspec/core/mocking/with_rr.rb +27 -0
- data/vendor_lib/rspec/core/mocking/with_rspec.rb +27 -0
- data/vendor_lib/rspec/core/option_parser.rb +234 -0
- data/vendor_lib/rspec/core/ordering.rb +154 -0
- data/vendor_lib/rspec/core/pending.rb +110 -0
- data/vendor_lib/rspec/core/project_initializer.rb +88 -0
- data/vendor_lib/rspec/core/rake_task.rb +128 -0
- data/vendor_lib/rspec/core/reporter.rb +132 -0
- data/vendor_lib/rspec/core/ruby_project.rb +44 -0
- data/vendor_lib/rspec/core/runner.rb +97 -0
- data/vendor_lib/rspec/core/shared_context.rb +53 -0
- data/vendor_lib/rspec/core/shared_example_group.rb +146 -0
- data/vendor_lib/rspec/core/shared_example_group/collection.rb +27 -0
- data/vendor_lib/rspec/core/version.rb +7 -0
- data/vendor_lib/rspec/core/warnings.rb +22 -0
- data/vendor_lib/rspec/core/world.rb +131 -0
- data/vendor_lib/rspec/expectations.rb +75 -0
- data/vendor_lib/rspec/expectations/differ.rb +154 -0
- data/vendor_lib/rspec/expectations/errors.rb +9 -0
- data/vendor_lib/rspec/expectations/expectation_target.rb +87 -0
- data/vendor_lib/rspec/expectations/extensions.rb +1 -0
- data/vendor_lib/rspec/expectations/extensions/object.rb +29 -0
- data/vendor_lib/rspec/expectations/fail_with.rb +79 -0
- data/vendor_lib/rspec/expectations/handler.rb +68 -0
- data/vendor_lib/rspec/expectations/syntax.rb +182 -0
- data/vendor_lib/rspec/expectations/version.rb +8 -0
- data/vendor_lib/rspec/matchers.rb +633 -0
- data/vendor_lib/rspec/matchers/built_in.rb +39 -0
- data/vendor_lib/rspec/matchers/built_in/base_matcher.rb +68 -0
- data/vendor_lib/rspec/matchers/built_in/be.rb +213 -0
- data/vendor_lib/rspec/matchers/built_in/be_instance_of.rb +15 -0
- data/vendor_lib/rspec/matchers/built_in/be_kind_of.rb +11 -0
- data/vendor_lib/rspec/matchers/built_in/be_within.rb +55 -0
- data/vendor_lib/rspec/matchers/built_in/change.rb +141 -0
- data/vendor_lib/rspec/matchers/built_in/cover.rb +21 -0
- data/vendor_lib/rspec/matchers/built_in/eq.rb +22 -0
- data/vendor_lib/rspec/matchers/built_in/eql.rb +23 -0
- data/vendor_lib/rspec/matchers/built_in/equal.rb +48 -0
- data/vendor_lib/rspec/matchers/built_in/exist.rb +26 -0
- data/vendor_lib/rspec/matchers/built_in/has.rb +48 -0
- data/vendor_lib/rspec/matchers/built_in/include.rb +61 -0
- data/vendor_lib/rspec/matchers/built_in/match.rb +17 -0
- data/vendor_lib/rspec/matchers/built_in/match_array.rb +51 -0
- data/vendor_lib/rspec/matchers/built_in/raise_error.rb +154 -0
- data/vendor_lib/rspec/matchers/built_in/respond_to.rb +74 -0
- data/vendor_lib/rspec/matchers/built_in/satisfy.rb +30 -0
- data/vendor_lib/rspec/matchers/built_in/start_and_end_with.rb +48 -0
- data/vendor_lib/rspec/matchers/built_in/throw_symbol.rb +94 -0
- data/vendor_lib/rspec/matchers/built_in/yield.rb +297 -0
- data/vendor_lib/rspec/matchers/compatibility.rb +14 -0
- data/vendor_lib/rspec/matchers/configuration.rb +113 -0
- data/vendor_lib/rspec/matchers/dsl.rb +23 -0
- data/vendor_lib/rspec/matchers/generated_descriptions.rb +35 -0
- data/vendor_lib/rspec/matchers/matcher.rb +301 -0
- data/vendor_lib/rspec/matchers/method_missing.rb +12 -0
- data/vendor_lib/rspec/matchers/operator_matcher.rb +99 -0
- data/vendor_lib/rspec/matchers/pretty.rb +70 -0
- data/vendor_lib/rspec/matchers/test_unit_integration.rb +11 -0
- data/vendor_lib/rspec/mocks.rb +100 -0
- data/vendor_lib/rspec/mocks/any_instance/chain.rb +92 -0
- data/vendor_lib/rspec/mocks/any_instance/expectation_chain.rb +47 -0
- data/vendor_lib/rspec/mocks/any_instance/message_chains.rb +75 -0
- data/vendor_lib/rspec/mocks/any_instance/recorder.rb +200 -0
- data/vendor_lib/rspec/mocks/any_instance/stub_chain.rb +45 -0
- data/vendor_lib/rspec/mocks/any_instance/stub_chain_chain.rb +23 -0
- data/vendor_lib/rspec/mocks/argument_list_matcher.rb +104 -0
- data/vendor_lib/rspec/mocks/argument_matchers.rb +264 -0
- data/vendor_lib/rspec/mocks/arity_calculator.rb +66 -0
- data/vendor_lib/rspec/mocks/configuration.rb +111 -0
- data/vendor_lib/rspec/mocks/error_generator.rb +203 -0
- data/vendor_lib/rspec/mocks/errors.rb +12 -0
- data/vendor_lib/rspec/mocks/example_methods.rb +201 -0
- data/vendor_lib/rspec/mocks/extensions/marshal.rb +17 -0
- data/vendor_lib/rspec/mocks/framework.rb +36 -0
- data/vendor_lib/rspec/mocks/instance_method_stasher.rb +112 -0
- data/vendor_lib/rspec/mocks/matchers/have_received.rb +99 -0
- data/vendor_lib/rspec/mocks/matchers/receive.rb +112 -0
- data/vendor_lib/rspec/mocks/matchers/receive_messages.rb +72 -0
- data/vendor_lib/rspec/mocks/message_expectation.rb +643 -0
- data/vendor_lib/rspec/mocks/method_double.rb +209 -0
- data/vendor_lib/rspec/mocks/method_reference.rb +95 -0
- data/vendor_lib/rspec/mocks/mock.rb +7 -0
- data/vendor_lib/rspec/mocks/mutate_const.rb +406 -0
- data/vendor_lib/rspec/mocks/object_reference.rb +90 -0
- data/vendor_lib/rspec/mocks/order_group.rb +82 -0
- data/vendor_lib/rspec/mocks/proxy.rb +269 -0
- data/vendor_lib/rspec/mocks/proxy_for_nil.rb +37 -0
- data/vendor_lib/rspec/mocks/space.rb +95 -0
- data/vendor_lib/rspec/mocks/standalone.rb +3 -0
- data/vendor_lib/rspec/mocks/stub_chain.rb +51 -0
- data/vendor_lib/rspec/mocks/syntax.rb +374 -0
- data/vendor_lib/rspec/mocks/targets.rb +90 -0
- data/vendor_lib/rspec/mocks/test_double.rb +109 -0
- data/vendor_lib/rspec/mocks/verifying_double.rb +77 -0
- data/vendor_lib/rspec/mocks/verifying_message_expecation.rb +60 -0
- data/vendor_lib/rspec/mocks/verifying_proxy.rb +151 -0
- data/vendor_lib/rspec/mocks/version.rb +7 -0
- data/vendor_lib/rspec/support.rb +6 -0
- data/vendor_lib/rspec/support/caller_filter.rb +56 -0
- data/vendor_lib/rspec/support/spec.rb +14 -0
- data/vendor_lib/rspec/support/spec/deprecation_helpers.rb +29 -0
- data/vendor_lib/rspec/support/spec/in_sub_process.rb +40 -0
- data/vendor_lib/rspec/support/spec/stderr_splitter.rb +50 -0
- data/vendor_lib/rspec/support/version.rb +7 -0
- data/vendor_lib/rspec/support/warnings.rb +41 -0
- data/vendor_lib/rspec/version.rb +5 -0
- metadata +268 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
require 'rspec/support/caller_filter'
|
|
2
|
+
require 'rspec/support/warnings'
|
|
3
|
+
|
|
4
|
+
require 'rspec/expectations/extensions'
|
|
5
|
+
require 'rspec/matchers'
|
|
6
|
+
require 'rspec/expectations/expectation_target'
|
|
7
|
+
require 'rspec/matchers/configuration'
|
|
8
|
+
require 'rspec/expectations/fail_with'
|
|
9
|
+
require 'rspec/expectations/errors'
|
|
10
|
+
require 'rspec/expectations/handler'
|
|
11
|
+
require 'rspec/expectations/version'
|
|
12
|
+
require 'rspec/expectations/differ'
|
|
13
|
+
|
|
14
|
+
module RSpec
|
|
15
|
+
# RSpec::Expectations adds two instance methods to every object:
|
|
16
|
+
#
|
|
17
|
+
# should(matcher=nil)
|
|
18
|
+
# should_not(matcher=nil)
|
|
19
|
+
#
|
|
20
|
+
# Both methods take an optional matcher object (See
|
|
21
|
+
# [RSpec::Matchers](../RSpec/Matchers)). When `should` is invoked with a
|
|
22
|
+
# matcher, it turns around and calls `matcher.matches?(self)`. For example,
|
|
23
|
+
# in the expression:
|
|
24
|
+
#
|
|
25
|
+
# order.total.should eq(Money.new(5.55, :USD))
|
|
26
|
+
#
|
|
27
|
+
# the `should` method invokes the equivalent of `eq.matches?(order.total)`. If
|
|
28
|
+
# `matches?` returns true, the expectation is met and execution continues. If
|
|
29
|
+
# `false`, then the spec fails with the message returned by
|
|
30
|
+
# `eq.failure_message_for_should`.
|
|
31
|
+
#
|
|
32
|
+
# Given the expression:
|
|
33
|
+
#
|
|
34
|
+
# order.entries.should_not include(entry)
|
|
35
|
+
#
|
|
36
|
+
# the `should_not` method invokes the equivalent of
|
|
37
|
+
# `include.matches?(order.entries)`, but it interprets `false` as success, and
|
|
38
|
+
# `true` as a failure, using the message generated by
|
|
39
|
+
# `eq.failure_message_for_should_not`.
|
|
40
|
+
#
|
|
41
|
+
# rspec-expectations ships with a standard set of useful matchers, and writing
|
|
42
|
+
# your own matchers is quite simple.
|
|
43
|
+
#
|
|
44
|
+
# See [RSpec::Matchers](../RSpec/Matchers) for more information about the
|
|
45
|
+
# built-in matchers that ship with rspec-expectations, and how to write your
|
|
46
|
+
# own custom matchers.
|
|
47
|
+
module Expectations
|
|
48
|
+
|
|
49
|
+
# @api private
|
|
50
|
+
KERNEL_METHOD_METHOD = ::Kernel.instance_method(:method)
|
|
51
|
+
|
|
52
|
+
# @api private
|
|
53
|
+
#
|
|
54
|
+
# Used internally to get a method handle for a particular object
|
|
55
|
+
# and method name.
|
|
56
|
+
#
|
|
57
|
+
# Includes handling for a few special cases:
|
|
58
|
+
#
|
|
59
|
+
# - Objects that redefine #method (e.g. an HTTPRequest struct)
|
|
60
|
+
# - BasicObject subclasses that mixin a Kernel dup (e.g. SimpleDelegator)
|
|
61
|
+
if RUBY_VERSION.to_i >= 2
|
|
62
|
+
def self.method_handle_for(object, method_name)
|
|
63
|
+
KERNEL_METHOD_METHOD.bind(object).call(method_name)
|
|
64
|
+
end
|
|
65
|
+
else
|
|
66
|
+
def self.method_handle_for(object, method_name)
|
|
67
|
+
if ::Kernel === object
|
|
68
|
+
KERNEL_METHOD_METHOD.bind(object).call(method_name)
|
|
69
|
+
else
|
|
70
|
+
object.method(method_name)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
require 'diff/lcs'
|
|
2
|
+
require 'diff/lcs/hunk'
|
|
3
|
+
require 'pp'
|
|
4
|
+
|
|
5
|
+
module RSpec
|
|
6
|
+
module Expectations
|
|
7
|
+
class Differ
|
|
8
|
+
|
|
9
|
+
# This is snagged from diff/lcs/ldiff.rb (which is a commandline tool)
|
|
10
|
+
def diff_as_string(input_data_new, input_data_old)
|
|
11
|
+
encoding = pick_encoding input_data_new, input_data_old
|
|
12
|
+
output = matching_encoding("", encoding)
|
|
13
|
+
data_old = input_data_old.split(matching_encoding("\n", encoding)).map! { |e| e.chomp }
|
|
14
|
+
data_new = input_data_new.split(matching_encoding("\n", encoding)).map! { |e| e.chomp }
|
|
15
|
+
diffs = Diff::LCS.diff(data_old, data_new)
|
|
16
|
+
return output if diffs.empty?
|
|
17
|
+
oldhunk = hunk = nil
|
|
18
|
+
file_length_difference = 0
|
|
19
|
+
diffs.each do |piece|
|
|
20
|
+
begin
|
|
21
|
+
hunk = Diff::LCS::Hunk.new(
|
|
22
|
+
data_old, data_new, piece, context_lines, file_length_difference
|
|
23
|
+
)
|
|
24
|
+
file_length_difference = hunk.file_length_difference
|
|
25
|
+
next unless oldhunk
|
|
26
|
+
# Hunks may overlap, which is why we need to be careful when our
|
|
27
|
+
# diff includes lines of context. Otherwise, we might print
|
|
28
|
+
# redundant lines.
|
|
29
|
+
if (context_lines > 0) and hunk.overlaps?(oldhunk)
|
|
30
|
+
if hunk.respond_to?(:merge)
|
|
31
|
+
# diff-lcs 1.2.x
|
|
32
|
+
hunk.merge(oldhunk)
|
|
33
|
+
else
|
|
34
|
+
# diff-lcs 1.1.3
|
|
35
|
+
hunk.unshift(oldhunk)
|
|
36
|
+
end
|
|
37
|
+
else
|
|
38
|
+
output << matching_encoding(oldhunk.diff(format).to_s, encoding)
|
|
39
|
+
end
|
|
40
|
+
ensure
|
|
41
|
+
oldhunk = hunk
|
|
42
|
+
output << matching_encoding("\n", encoding)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
#Handle the last remaining hunk
|
|
46
|
+
output << matching_encoding(oldhunk.diff(format).to_s, encoding)
|
|
47
|
+
output << matching_encoding("\n", encoding)
|
|
48
|
+
color_diff output
|
|
49
|
+
rescue Encoding::CompatibilityError
|
|
50
|
+
if input_data_new.encoding != input_data_old.encoding
|
|
51
|
+
"Could not produce a diff because the encoding of the actual string (#{input_data_old.encoding}) "+
|
|
52
|
+
"differs from the encoding of the expected string (#{input_data_new.encoding})"
|
|
53
|
+
else
|
|
54
|
+
"Could not produce a diff because of the encoding of the string (#{input_data_old.encoding})"
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def diff_as_object(actual, expected)
|
|
59
|
+
actual_as_string = object_to_string(actual)
|
|
60
|
+
expected_as_string = object_to_string(expected)
|
|
61
|
+
if diff = diff_as_string(actual_as_string, expected_as_string)
|
|
62
|
+
color_diff diff
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
protected
|
|
67
|
+
|
|
68
|
+
def format
|
|
69
|
+
:unified
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def context_lines
|
|
73
|
+
3
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def color(text, color_code)
|
|
77
|
+
"\e[#{color_code}m#{text}\e[0m"
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def red(text)
|
|
81
|
+
color(text, 31)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def green(text)
|
|
85
|
+
color(text, 32)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def blue(text)
|
|
89
|
+
color(text, 34)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def color_diff(diff)
|
|
93
|
+
return diff unless RSpec::Matchers.configuration.color?
|
|
94
|
+
|
|
95
|
+
diff.lines.map { |line|
|
|
96
|
+
case line[0].chr
|
|
97
|
+
when "+"
|
|
98
|
+
green line
|
|
99
|
+
when "-"
|
|
100
|
+
red line
|
|
101
|
+
when "@"
|
|
102
|
+
line[1].chr == "@" ? blue(line) : line
|
|
103
|
+
else
|
|
104
|
+
line
|
|
105
|
+
end
|
|
106
|
+
}.join
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def object_to_string(object)
|
|
110
|
+
case object
|
|
111
|
+
when Hash
|
|
112
|
+
object.keys.sort_by { |k| k.to_s }.map do |key|
|
|
113
|
+
pp_key = PP.singleline_pp(key, "")
|
|
114
|
+
pp_value = PP.singleline_pp(object[key], "")
|
|
115
|
+
|
|
116
|
+
# on 1.9.3 PP seems to minimise to US-ASCII, ensure we're matching source encoding
|
|
117
|
+
#
|
|
118
|
+
# note, PP is used to ensure the ordering of the internal values of key/value e.g.
|
|
119
|
+
# <# a: b: c:> not <# c: a: b:>
|
|
120
|
+
encoding = pick_encoding pp_key, pp_value
|
|
121
|
+
matching_encoding("#{pp_key} => #{pp_value}", encoding)
|
|
122
|
+
end.join(",\n")
|
|
123
|
+
when String
|
|
124
|
+
object =~ /\n/ ? object : object.inspect
|
|
125
|
+
else
|
|
126
|
+
PP.pp(object,"")
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
private
|
|
131
|
+
|
|
132
|
+
if String.method_defined?(:encoding)
|
|
133
|
+
def pick_encoding(source_a, source_b)
|
|
134
|
+
Encoding.compatible?(source_a, source_b) || Encoding.default_external
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def matching_encoding(string, encoding)
|
|
138
|
+
string.encode encoding
|
|
139
|
+
rescue Encoding::UndefinedConversionError
|
|
140
|
+
string.encode(encoding, :undef => :replace)
|
|
141
|
+
end
|
|
142
|
+
else
|
|
143
|
+
def pick_encoding(source_a, source_b)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def matching_encoding(string, encoding)
|
|
147
|
+
string
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
module RSpec
|
|
2
|
+
module Expectations
|
|
3
|
+
# Wraps the target of an expectation.
|
|
4
|
+
# @example
|
|
5
|
+
# expect(something) # => ExpectationTarget wrapping something
|
|
6
|
+
#
|
|
7
|
+
# # used with `to`
|
|
8
|
+
# expect(actual).to eq(3)
|
|
9
|
+
#
|
|
10
|
+
# # with `not_to`
|
|
11
|
+
# expect(actual).not_to eq(3)
|
|
12
|
+
class ExpectationTarget
|
|
13
|
+
class << self
|
|
14
|
+
attr_accessor :deprecated_should_enabled
|
|
15
|
+
alias deprecated_should_enabled? deprecated_should_enabled
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# @api private
|
|
19
|
+
def initialize(target)
|
|
20
|
+
@target = target
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Runs the given expectation, passing if `matcher` returns true.
|
|
24
|
+
# @example
|
|
25
|
+
# expect(value).to eq(5)
|
|
26
|
+
# expect { perform }.to raise_error
|
|
27
|
+
# @param [Matcher]
|
|
28
|
+
# matcher
|
|
29
|
+
# @param [String or Proc] message optional message to display when the expectation fails
|
|
30
|
+
# @return [Boolean] true if the expectation succeeds (else raises)
|
|
31
|
+
# @see RSpec::Matchers
|
|
32
|
+
def to(matcher=nil, message=nil, &block)
|
|
33
|
+
prevent_operator_matchers(:to, matcher)
|
|
34
|
+
RSpec::Expectations::PositiveExpectationHandler.handle_matcher(@target, matcher, message, &block)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Runs the given expectation, passing if `matcher` returns false.
|
|
38
|
+
# @example
|
|
39
|
+
# expect(value).not_to eq(5)
|
|
40
|
+
# @param [Matcher]
|
|
41
|
+
# matcher
|
|
42
|
+
# @param [String or Proc] message optional message to display when the expectation fails
|
|
43
|
+
# @return [Boolean] false if the negative expectation succeeds (else raises)
|
|
44
|
+
# @see RSpec::Matchers
|
|
45
|
+
def not_to(matcher=nil, message=nil, &block)
|
|
46
|
+
prevent_operator_matchers(:not_to, matcher)
|
|
47
|
+
RSpec::Expectations::NegativeExpectationHandler.handle_matcher(@target, matcher, message, &block)
|
|
48
|
+
end
|
|
49
|
+
alias to_not not_to
|
|
50
|
+
|
|
51
|
+
def self.enable_deprecated_should
|
|
52
|
+
return if deprecated_should_enabled?
|
|
53
|
+
|
|
54
|
+
def should(*args)
|
|
55
|
+
RSpec.deprecate "`expect { }.should`", :replacement => "`expect { }.to`"
|
|
56
|
+
@target.should(*args)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def should_not(*args)
|
|
60
|
+
RSpec.deprecate "`expect { }.should_not`", :replacement => "`expect { }.not_to`"
|
|
61
|
+
@target.should_not(*args)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
self.deprecated_should_enabled = true
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def self.disable_deprecated_should
|
|
68
|
+
return unless deprecated_should_enabled?
|
|
69
|
+
|
|
70
|
+
remove_method :should
|
|
71
|
+
remove_method :should_not
|
|
72
|
+
|
|
73
|
+
self.deprecated_should_enabled = false
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
private
|
|
77
|
+
|
|
78
|
+
def prevent_operator_matchers(verb, matcher)
|
|
79
|
+
return if matcher
|
|
80
|
+
|
|
81
|
+
raise ArgumentError, "The expect syntax does not support operator matchers, " +
|
|
82
|
+
"so you must pass a matcher to `##{verb}`."
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'rspec/expectations/extensions/object'
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module RSpec
|
|
2
|
+
module Expectations
|
|
3
|
+
module DeprecatedConstants
|
|
4
|
+
# Displays deprecation warning when it captures Rspec and Spec. Otherwise
|
|
5
|
+
# delegates to super.
|
|
6
|
+
def const_missing(name)
|
|
7
|
+
case name
|
|
8
|
+
when :Rspec, :Spec
|
|
9
|
+
RSpec.deprecate(name.to_s, :replacement => "RSpec")
|
|
10
|
+
RSpec
|
|
11
|
+
else
|
|
12
|
+
begin
|
|
13
|
+
super
|
|
14
|
+
rescue Exception => e
|
|
15
|
+
e.backtrace.reject! {|l| l =~ Regexp.compile(__FILE__) }
|
|
16
|
+
raise e
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# @deprecated (no replacement)
|
|
23
|
+
def differ=(ignore)
|
|
24
|
+
RSpec.deprecate("RSpec::Expectations.differ=(differ)")
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
extend RSpec::Expectations::DeprecatedConstants
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
module RSpec
|
|
2
|
+
module Expectations
|
|
3
|
+
class << self
|
|
4
|
+
# @private
|
|
5
|
+
def differ
|
|
6
|
+
@differ ||= Differ.new
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# Raises an RSpec::Expectations::ExpectationNotMetError with message.
|
|
10
|
+
# @param [String] message
|
|
11
|
+
# @param [Object] expected
|
|
12
|
+
# @param [Object] actual
|
|
13
|
+
#
|
|
14
|
+
# Adds a diff to the failure message when `expected` and `actual` are
|
|
15
|
+
# both present.
|
|
16
|
+
def fail_with(message, expected=nil, actual=nil)
|
|
17
|
+
if !message
|
|
18
|
+
raise ArgumentError, "Failure message is nil. Does your matcher define the " +
|
|
19
|
+
"appropriate failure_message_for_* method to return a string?"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
if actual && expected
|
|
23
|
+
if all_strings?(actual, expected)
|
|
24
|
+
if any_multiline_strings?(actual, expected)
|
|
25
|
+
message << "\nDiff:" << differ.diff_as_string(coerce_to_string(actual), coerce_to_string(expected))
|
|
26
|
+
end
|
|
27
|
+
elsif no_procs?(actual, expected) && no_numbers?(actual, expected)
|
|
28
|
+
message << "\nDiff:" << differ.diff_as_object(actual, expected)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
raise(RSpec::Expectations::ExpectationNotMetError.new(message))
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
private
|
|
36
|
+
|
|
37
|
+
def no_procs?(*args)
|
|
38
|
+
args.flatten.none? {|a| Proc === a}
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def all_strings?(*args)
|
|
42
|
+
args.flatten.all? {|a| String === a}
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def any_multiline_strings?(*args)
|
|
46
|
+
all_strings?(*args) && args.flatten.any? { |a| multiline?(a) }
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def no_numbers?(*args)
|
|
50
|
+
args.flatten.none? {|a| Numeric === a}
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def coerce_to_string(string_or_array)
|
|
54
|
+
return string_or_array unless Array === string_or_array
|
|
55
|
+
diffably_stringify(string_or_array).join("\n")
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def diffably_stringify(array)
|
|
59
|
+
array.map do |entry|
|
|
60
|
+
if Array === entry
|
|
61
|
+
entry.inspect
|
|
62
|
+
else
|
|
63
|
+
entry.to_s.gsub("\n", "\\n")
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
if String.method_defined?(:encoding)
|
|
69
|
+
def multiline?(string)
|
|
70
|
+
string.include?("\n".encode(string.encoding))
|
|
71
|
+
end
|
|
72
|
+
else
|
|
73
|
+
def multiline?(string)
|
|
74
|
+
string.include?("\n")
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
module RSpec
|
|
2
|
+
module Expectations
|
|
3
|
+
|
|
4
|
+
class ExpectationHandler
|
|
5
|
+
def self.check_message(msg)
|
|
6
|
+
unless msg.nil? || msg.respond_to?(:to_str) || msg.respond_to?(:call)
|
|
7
|
+
::Kernel.warn [
|
|
8
|
+
"WARNING: ignoring the provided expectation message argument (",
|
|
9
|
+
msg.inspect,
|
|
10
|
+
") since it is not a string or a proc."
|
|
11
|
+
].join
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
class PositiveExpectationHandler < ExpectationHandler
|
|
17
|
+
|
|
18
|
+
def self.handle_matcher(actual, matcher, message=nil, &block)
|
|
19
|
+
check_message(message)
|
|
20
|
+
::RSpec::Matchers.last_should = :should
|
|
21
|
+
::RSpec::Matchers.last_matcher = matcher
|
|
22
|
+
return ::RSpec::Matchers::BuiltIn::PositiveOperatorMatcher.new(actual) if matcher.nil?
|
|
23
|
+
|
|
24
|
+
match = matcher.matches?(actual, &block)
|
|
25
|
+
return match if match
|
|
26
|
+
|
|
27
|
+
message = message.call if message.respond_to?(:call)
|
|
28
|
+
|
|
29
|
+
message ||= matcher.respond_to?(:failure_message_for_should) ?
|
|
30
|
+
matcher.failure_message_for_should :
|
|
31
|
+
matcher.failure_message
|
|
32
|
+
|
|
33
|
+
if matcher.respond_to?(:diffable?) && matcher.diffable?
|
|
34
|
+
::RSpec::Expectations.fail_with message, matcher.expected, matcher.actual
|
|
35
|
+
else
|
|
36
|
+
::RSpec::Expectations.fail_with message
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
class NegativeExpectationHandler < ExpectationHandler
|
|
42
|
+
def self.handle_matcher(actual, matcher, message=nil, &block)
|
|
43
|
+
check_message(message)
|
|
44
|
+
::RSpec::Matchers.last_should = :should_not
|
|
45
|
+
::RSpec::Matchers.last_matcher = matcher
|
|
46
|
+
return ::RSpec::Matchers::BuiltIn::NegativeOperatorMatcher.new(actual) if matcher.nil?
|
|
47
|
+
|
|
48
|
+
match = matcher.respond_to?(:does_not_match?) ?
|
|
49
|
+
!matcher.does_not_match?(actual, &block) :
|
|
50
|
+
matcher.matches?(actual, &block)
|
|
51
|
+
return match unless match
|
|
52
|
+
|
|
53
|
+
message = message.call if message.respond_to?(:call)
|
|
54
|
+
|
|
55
|
+
message ||= matcher.respond_to?(:failure_message_for_should_not) ?
|
|
56
|
+
matcher.failure_message_for_should_not :
|
|
57
|
+
matcher.negative_failure_message
|
|
58
|
+
|
|
59
|
+
if matcher.respond_to?(:diffable?) && matcher.diffable?
|
|
60
|
+
::RSpec::Expectations.fail_with message, matcher.expected, matcher.actual
|
|
61
|
+
else
|
|
62
|
+
::RSpec::Expectations.fail_with message
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|