mspec 1.5.14 → 1.5.15
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.
- data/Rakefile +1 -1
- data/lib/mspec/commands/mspec-ci.rb +5 -2
- data/lib/mspec/guards.rb +1 -0
- data/lib/mspec/guards/conflict.rb +7 -2
- data/lib/mspec/guards/feature.rb +47 -0
- data/lib/mspec/guards/guard.rb +3 -6
- data/lib/mspec/guards/platform.rb +4 -0
- data/lib/mspec/helpers.rb +1 -0
- data/lib/mspec/helpers/encode.rb +21 -0
- data/lib/mspec/helpers/environment.rb +3 -3
- data/lib/mspec/helpers/ruby_exe.rb +2 -2
- data/lib/mspec/matchers/equal_utf16.rb +5 -7
- data/lib/mspec/mocks/mock.rb +8 -0
- data/lib/mspec/runner/context.rb +49 -19
- data/lib/mspec/runner/mspec.rb +13 -0
- data/lib/mspec/version.rb +1 -1
- data/spec/commands/mspec_ci_spec.rb +19 -1
- data/spec/guards/conflict_spec.rb +12 -0
- data/spec/guards/feature_spec.rb +80 -0
- data/spec/guards/guard_spec.rb +1 -28
- data/spec/helpers/encode_spec.rb +26 -0
- data/spec/helpers/environment_spec.rb +12 -31
- data/spec/helpers/ruby_exe_spec.rb +2 -8
- data/spec/matchers/equal_utf16_spec.rb +4 -4
- data/spec/mocks/mock_spec.rb +11 -0
- data/spec/runner/context_spec.rb +44 -17
- data/spec/runner/example_spec.rb +5 -0
- data/spec/runner/formatters/dotted_spec.rb +2 -1
- data/spec/runner/formatters/file_spec.rb +2 -2
- data/spec/runner/formatters/html_spec.rb +1 -0
- data/spec/runner/formatters/method_spec.rb +1 -0
- data/spec/runner/formatters/spinner_spec.rb +1 -1
- data/spec/runner/formatters/unit_spec.rb +1 -0
- data/spec/runner/shared_spec.rb +63 -12
- metadata +6 -2
data/Rakefile
CHANGED
@@ -18,7 +18,7 @@ spec = Gem::Specification.new do |s|
|
|
18
18
|
|
19
19
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
20
20
|
s.authors = ["Brian Ford"]
|
21
|
-
s.date = %q{2010-
|
21
|
+
s.date = %q{2010-02-04}
|
22
22
|
s.email = %q{bford@engineyard.com}
|
23
23
|
s.has_rdoc = true
|
24
24
|
s.extra_rdoc_files = %w[ README LICENSE ]
|
@@ -66,8 +66,11 @@ class MSpecCI < MSpecScript
|
|
66
66
|
def run
|
67
67
|
MSpec.register_tags_patterns config[:tags_patterns]
|
68
68
|
MSpec.register_files @files
|
69
|
-
|
70
|
-
|
69
|
+
|
70
|
+
tags = ["fails", "critical", "unstable", "incomplete", "unsupported"]
|
71
|
+
tags += Array(config[:ci_xtags])
|
72
|
+
|
73
|
+
filter = TagFilter.new(:exclude, *tags)
|
71
74
|
filter.register
|
72
75
|
|
73
76
|
MSpec.process
|
data/lib/mspec/guards.rb
CHANGED
@@ -5,6 +5,7 @@ require 'mspec/guards/compliance'
|
|
5
5
|
require 'mspec/guards/conflict'
|
6
6
|
require 'mspec/guards/endian'
|
7
7
|
require 'mspec/guards/extensions'
|
8
|
+
require 'mspec/guards/feature'
|
8
9
|
require 'mspec/guards/guard'
|
9
10
|
require 'mspec/guards/noncompliance'
|
10
11
|
require 'mspec/guards/platform'
|
@@ -2,12 +2,17 @@ require 'mspec/guards/guard'
|
|
2
2
|
|
3
3
|
class ConflictsGuard < SpecGuard
|
4
4
|
def match?
|
5
|
-
constants
|
6
|
-
|
5
|
+
# Always convert constants to symbols regardless of version.
|
6
|
+
constants = Object.constants.map { |x| x.to_sym }
|
7
|
+
@args.any? { |mod| constants.include? mod }
|
7
8
|
end
|
8
9
|
end
|
9
10
|
|
10
11
|
class Object
|
12
|
+
# In some cases, libraries will modify another Ruby method's
|
13
|
+
# behavior. The specs for the method's behavior will then fail
|
14
|
+
# if that library is loaded. This guard will not run if any of
|
15
|
+
# the specified constants exist in Object.constants.
|
11
16
|
def conflicts_with(*modules)
|
12
17
|
g = ConflictsGuard.new(*modules)
|
13
18
|
g.name = :conflicts_with
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'mspec/guards/guard'
|
2
|
+
|
3
|
+
class FeatureGuard < SpecGuard
|
4
|
+
def self.enabled?(*features)
|
5
|
+
new(*features).match?
|
6
|
+
end
|
7
|
+
|
8
|
+
def match?
|
9
|
+
@parameters.all? { |f| MSpec.feature_enabled? f }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class Object
|
14
|
+
# Provides better documentation in the specs by
|
15
|
+
# naming sets of features that work together as
|
16
|
+
# a whole. Examples include :encoding, :fiber,
|
17
|
+
# :continuation, :fork.
|
18
|
+
#
|
19
|
+
# Usage example:
|
20
|
+
#
|
21
|
+
# with_feature :encoding do
|
22
|
+
# # specs for a method that provides aspects
|
23
|
+
# # of the encoding feature
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# Multiple features must all be enabled for the
|
27
|
+
# guard to run:
|
28
|
+
#
|
29
|
+
# with_feature :one, :two do
|
30
|
+
# # these specs will run if features :one AND
|
31
|
+
# # :two are enabled.
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# The implementation must explicitly enable a feature
|
35
|
+
# by adding code like the following to the .mspec
|
36
|
+
# configuration file:
|
37
|
+
#
|
38
|
+
# MSpec.enable_feature :encoding
|
39
|
+
#
|
40
|
+
def with_feature(*features)
|
41
|
+
g = FeatureGuard.new(*features)
|
42
|
+
g.name = :with_feature
|
43
|
+
yield if g.yield?
|
44
|
+
ensure
|
45
|
+
g.unregister
|
46
|
+
end
|
47
|
+
end
|
data/lib/mspec/guards/guard.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'mspec/runner/mspec'
|
2
2
|
require 'mspec/runner/actions/tally'
|
3
3
|
|
4
|
+
require 'rbconfig'
|
5
|
+
|
4
6
|
class SpecGuard
|
5
7
|
def self.report
|
6
8
|
@report ||= Hash.new { |h,k| h[k] = [] }
|
@@ -56,10 +58,6 @@ class SpecGuard
|
|
56
58
|
version.split('.')[0,n].join('.')
|
57
59
|
end
|
58
60
|
|
59
|
-
def self.windows?(key = RUBY_PLATFORM)
|
60
|
-
!!key.match(/(mswin|mingw)/)
|
61
|
-
end
|
62
|
-
|
63
61
|
attr_accessor :name, :parameters
|
64
62
|
|
65
63
|
def initialize(*args)
|
@@ -136,7 +134,7 @@ class SpecGuard
|
|
136
134
|
end
|
137
135
|
|
138
136
|
def windows?(sym, key)
|
139
|
-
sym == :windows &&
|
137
|
+
sym == :windows && !key.match(/(mswin|mingw)/).nil?
|
140
138
|
end
|
141
139
|
|
142
140
|
def platform?(*args)
|
@@ -154,7 +152,6 @@ class SpecGuard
|
|
154
152
|
end
|
155
153
|
|
156
154
|
def os?(*oses)
|
157
|
-
require 'rbconfig'
|
158
155
|
oses.any? do |os|
|
159
156
|
host_os = Config::CONFIG['host_os'] || RUBY_PLATFORM
|
160
157
|
host_os.downcase!
|
data/lib/mspec/helpers.rb
CHANGED
@@ -2,6 +2,7 @@ require 'mspec/helpers/argv'
|
|
2
2
|
require 'mspec/helpers/bignum'
|
3
3
|
require 'mspec/helpers/const_lookup'
|
4
4
|
require 'mspec/helpers/ducktype'
|
5
|
+
require 'mspec/helpers/encode'
|
5
6
|
require 'mspec/helpers/enumerator_class'
|
6
7
|
require 'mspec/helpers/environment'
|
7
8
|
require 'mspec/helpers/fixture'
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'mspec/guards/feature'
|
2
|
+
|
3
|
+
class Object
|
4
|
+
# Helper to handle String encodings. The +str+ and +encoding+ parameters
|
5
|
+
# must be Strings and an ArgumentError will be raised if not. This ensures
|
6
|
+
# that the encode() helper can be used regardless of whether Encoding exits.
|
7
|
+
# The helper is a no-op (i.e. passes through +str+ unmodified) if the
|
8
|
+
# :encoding feature is not enabled (see with_feature guard). If the
|
9
|
+
# :encoding feature is enabled, +str+.force_encoding(+encoding+) is called.
|
10
|
+
def encode(str, encoding)
|
11
|
+
unless str.is_a? String and encoding.is_a? String
|
12
|
+
raise ArgumentError, "encoding name must be a String"
|
13
|
+
end
|
14
|
+
|
15
|
+
if FeatureGuard.enabled? :encoding
|
16
|
+
str.force_encoding encoding
|
17
|
+
end
|
18
|
+
|
19
|
+
str
|
20
|
+
end
|
21
|
+
end
|
@@ -3,7 +3,7 @@ require 'mspec/guards/guard'
|
|
3
3
|
class Object
|
4
4
|
def env
|
5
5
|
env = ""
|
6
|
-
if
|
6
|
+
if PlatformGuard.windows?
|
7
7
|
env = Hash[*`cmd.exe /C set`.split("\n").map { |e| e.split("=", 2) }.flatten]
|
8
8
|
else
|
9
9
|
env = Hash[*`env`.split("\n").map { |e| e.split("=", 2) }.flatten]
|
@@ -17,7 +17,7 @@ class Object
|
|
17
17
|
|
18
18
|
def username
|
19
19
|
user = ""
|
20
|
-
if
|
20
|
+
if PlatformGuard.windows?
|
21
21
|
user = windows_env_echo('USERNAME')
|
22
22
|
else
|
23
23
|
user = `whoami`.strip
|
@@ -26,7 +26,7 @@ class Object
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def home_directory
|
29
|
-
return ENV['HOME'] unless
|
29
|
+
return ENV['HOME'] unless PlatformGuard.windows?
|
30
30
|
windows_env_echo('HOMEDRIVE') + windows_env_echo('HOMEPATH')
|
31
31
|
end
|
32
32
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'mspec/utils/ruby_name'
|
2
|
-
require 'mspec/guards/
|
2
|
+
require 'mspec/guards/platform'
|
3
3
|
|
4
4
|
# The ruby_exe helper provides a wrapper for invoking the
|
5
5
|
# same Ruby interpreter as the one running the specs and
|
@@ -99,7 +99,7 @@ class Object
|
|
99
99
|
# It has been reported that File.executable is not reliable
|
100
100
|
# on Windows platforms (see commit 56bc555c). So, we check the
|
101
101
|
# platform.
|
102
|
-
if File.exists?(exe) and (
|
102
|
+
if File.exists?(exe) and (PlatformGuard.windows? or File.executable?(exe))
|
103
103
|
return cmd
|
104
104
|
end
|
105
105
|
end
|
@@ -1,19 +1,17 @@
|
|
1
|
+
require 'mspec/helpers/encode'
|
2
|
+
|
1
3
|
class EqualUtf16Matcher
|
2
4
|
def initialize(expected)
|
3
|
-
@expected = expected
|
5
|
+
@expected = Array(expected).map { |x| encode x, "binary" }
|
4
6
|
end
|
5
7
|
|
6
8
|
def matches?(actual)
|
7
|
-
@actual = actual
|
9
|
+
@actual = Array(actual).map { |x| encode x, "binary" }
|
8
10
|
@actual == @expected || @actual == expected_swapped
|
9
11
|
end
|
10
12
|
|
11
13
|
def expected_swapped
|
12
|
-
|
13
|
-
@expected_swapped ||= @expected.to_str.gsub(/(.)(.)/, '\2\1')
|
14
|
-
else
|
15
|
-
@expected_swapped ||= @expected.collect { |s| s.to_str.gsub(/(.)(.)/, '\2\1') }
|
16
|
-
end
|
14
|
+
@expected_swapped ||= @expected.map { |x| x.to_str.gsub(/(.)(.)/, '\2\1') }
|
17
15
|
end
|
18
16
|
|
19
17
|
def failure_message
|
data/lib/mspec/mocks/mock.rb
CHANGED
@@ -38,6 +38,11 @@ module Mock
|
|
38
38
|
has_key?(mocks.keys, sym) or has_key?(stubs.keys, sym)
|
39
39
|
end
|
40
40
|
|
41
|
+
def self.clear_replaced(key)
|
42
|
+
mocks.delete key
|
43
|
+
stubs.delete key
|
44
|
+
end
|
45
|
+
|
41
46
|
def self.mock_respond_to?(obj, sym)
|
42
47
|
name = replaced_name(obj, :respond_to?)
|
43
48
|
if replaced? name
|
@@ -176,7 +181,10 @@ module Mock
|
|
176
181
|
else
|
177
182
|
meta.__send__ :remove_method, sym
|
178
183
|
end
|
184
|
+
|
185
|
+
clear_replaced key
|
179
186
|
end
|
187
|
+
ensure
|
180
188
|
reset
|
181
189
|
end
|
182
190
|
end
|
data/lib/mspec/runner/context.rb
CHANGED
@@ -37,6 +37,12 @@ class ContextState
|
|
37
37
|
@expectation_missing = Proc.new { raise SpecExpectationNotFoundError }
|
38
38
|
end
|
39
39
|
|
40
|
+
# Remove caching when a ContextState is dup'd for shared specs.
|
41
|
+
def initialize_copy(other)
|
42
|
+
@pre = {}
|
43
|
+
@post = {}
|
44
|
+
end
|
45
|
+
|
40
46
|
# Returns true if this is a shared +ContextState+. Essentially, when
|
41
47
|
# created with: describe "Something", :shared => true { ... }
|
42
48
|
def shared?
|
@@ -47,28 +53,51 @@ class ContextState
|
|
47
53
|
# the +parents+ list.
|
48
54
|
def parent=(parent)
|
49
55
|
@description = nil
|
50
|
-
@parent = parent
|
51
|
-
parent.child self if parent and not shared?
|
52
56
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
+
if shared?
|
58
|
+
@parent = nil
|
59
|
+
else
|
60
|
+
@parent = parent
|
61
|
+
parent.child self if parent
|
62
|
+
|
63
|
+
@parents = [self]
|
64
|
+
state = parent
|
65
|
+
while state
|
66
|
+
@parents.unshift state
|
67
|
+
state = state.parent
|
68
|
+
end
|
57
69
|
end
|
58
70
|
end
|
59
71
|
|
60
|
-
def replace_parent(parent)
|
61
|
-
@parents[0] = parent
|
62
|
-
|
63
|
-
children.each { |child| child.replace_parent parent }
|
64
|
-
end
|
65
|
-
|
66
72
|
# Add the ContextState instance +child+ to the list of nested
|
67
73
|
# describe blocks.
|
68
74
|
def child(child)
|
69
75
|
@children << child
|
70
76
|
end
|
71
77
|
|
78
|
+
# Adds a nested ContextState in a shared ContextState to a containing
|
79
|
+
# ContextState.
|
80
|
+
#
|
81
|
+
# Normal adoption is from the parent's perspective. But adopt is a good
|
82
|
+
# verb and it's reasonable for the child to adopt the parent as well. In
|
83
|
+
# this case, manipulating state from inside the child avoids needlessly
|
84
|
+
# exposing the state to manipulate it externally in the dup. (See
|
85
|
+
# #it_should_behave_like)
|
86
|
+
def adopt(parent)
|
87
|
+
self.parent = parent
|
88
|
+
|
89
|
+
@examples = @examples.map do |example|
|
90
|
+
example = example.dup
|
91
|
+
example.context = self
|
92
|
+
example
|
93
|
+
end
|
94
|
+
|
95
|
+
children = @children
|
96
|
+
@children = []
|
97
|
+
|
98
|
+
children.each { |child| child.dup.adopt self }
|
99
|
+
end
|
100
|
+
|
72
101
|
# Returns a list of all before(+what+) blocks from self and any parents.
|
73
102
|
def pre(what)
|
74
103
|
@pre[what] ||= parents.inject([]) { |l, s| l.push(*s.before(what)) }
|
@@ -113,7 +142,7 @@ class ContextState
|
|
113
142
|
|
114
143
|
# Returns a description string generated from self and all parents
|
115
144
|
def description
|
116
|
-
@description ||= parents.map { |p| p.to_s }.join(" ")
|
145
|
+
@description ||= parents.map { |p| p.to_s }.compact.join(" ")
|
117
146
|
end
|
118
147
|
|
119
148
|
# Injects the before/after blocks and examples from the shared
|
@@ -125,18 +154,19 @@ class ContextState
|
|
125
154
|
raise Exception, "Unable to find shared 'describe' for #{desc}"
|
126
155
|
end
|
127
156
|
|
128
|
-
state.examples.each { |ex| ex.context = self; @examples << ex }
|
129
157
|
state.before(:all).each { |b| before :all, &b }
|
130
158
|
state.before(:each).each { |b| before :each, &b }
|
131
159
|
state.after(:each).each { |b| after :each, &b }
|
132
160
|
state.after(:all).each { |b| after :all, &b }
|
133
161
|
|
134
|
-
|
135
|
-
|
136
|
-
|
162
|
+
state.examples.each do |example|
|
163
|
+
example = example.dup
|
164
|
+
example.context = self
|
165
|
+
@examples << example
|
166
|
+
end
|
167
|
+
|
137
168
|
state.children.each do |child|
|
138
|
-
child.
|
139
|
-
@children << child
|
169
|
+
child.dup.adopt self
|
140
170
|
end
|
141
171
|
end
|
142
172
|
|
data/lib/mspec/runner/mspec.rb
CHANGED
@@ -21,6 +21,7 @@ module MSpec
|
|
21
21
|
@modes = []
|
22
22
|
@shared = {}
|
23
23
|
@guarded = []
|
24
|
+
@features = {}
|
24
25
|
@exception = nil
|
25
26
|
@randomize = nil
|
26
27
|
@expectation = nil
|
@@ -162,6 +163,18 @@ module MSpec
|
|
162
163
|
retrieve(:modes).include? mode
|
163
164
|
end
|
164
165
|
|
166
|
+
def self.enable_feature(feature)
|
167
|
+
retrieve(:features)[feature] = true
|
168
|
+
end
|
169
|
+
|
170
|
+
def self.disable_feature(feature)
|
171
|
+
retrieve(:features)[feature] = false
|
172
|
+
end
|
173
|
+
|
174
|
+
def self.feature_enabled?(feature)
|
175
|
+
retrieve(:features)[feature] || false
|
176
|
+
end
|
177
|
+
|
165
178
|
def self.retrieve(symbol)
|
166
179
|
instance_variable_get :"@#{symbol}"
|
167
180
|
end
|
data/lib/mspec/version.rb
CHANGED
@@ -107,6 +107,8 @@ describe MSpecCI, "#run" do
|
|
107
107
|
TagFilter.stub!(:new).and_return(@filter)
|
108
108
|
@filter.stub!(:register)
|
109
109
|
|
110
|
+
@tags = ["fails", "critical", "unstable", "incomplete", "unsupported"]
|
111
|
+
|
110
112
|
@config = { :ci_files => ["one", "two"] }
|
111
113
|
@script = MSpecCI.new
|
112
114
|
@script.stub!(:exit)
|
@@ -127,9 +129,25 @@ describe MSpecCI, "#run" do
|
|
127
129
|
end
|
128
130
|
|
129
131
|
it "registers a tag filter for 'fails', 'unstable', 'incomplete', 'critical', 'unsupported'" do
|
132
|
+
filter = mock("fails filter")
|
133
|
+
TagFilter.should_receive(:new).with(:exclude, *@tags).and_return(filter)
|
134
|
+
filter.should_receive(:register)
|
135
|
+
@script.run
|
136
|
+
end
|
137
|
+
|
138
|
+
it "registers an additional exclude tag specified by :ci_xtags" do
|
139
|
+
@config[:ci_xtags] = "windows"
|
140
|
+
filter = mock("fails filter")
|
141
|
+
TagFilter.should_receive(:new).with(:exclude, *(@tags + ["windows"])).and_return(filter)
|
142
|
+
filter.should_receive(:register)
|
143
|
+
@script.run
|
144
|
+
end
|
145
|
+
|
146
|
+
it "registers additional exclude tags specified by a :ci_xtags array" do
|
147
|
+
@config[:ci_xtags] = ["windows", "windoze"]
|
130
148
|
filter = mock("fails filter")
|
131
149
|
TagFilter.should_receive(:new).with(:exclude,
|
132
|
-
|
150
|
+
*(@tags + ["windows", "windoze"])).and_return(filter)
|
133
151
|
filter.should_receive(:register)
|
134
152
|
@script.run
|
135
153
|
end
|
@@ -12,11 +12,23 @@ describe Object, "#conflicts_with" do
|
|
12
12
|
ScratchPad.recorded.should_not == :yield
|
13
13
|
end
|
14
14
|
|
15
|
+
it "does not yield if Object.constants (as Symbols) includes any of the arguments" do
|
16
|
+
Object.stub!(:constants).and_return([:SomeClass, :OtherClass])
|
17
|
+
conflicts_with(:SomeClass, :AClass, :BClass) { ScratchPad.record :yield }
|
18
|
+
ScratchPad.recorded.should_not == :yield
|
19
|
+
end
|
20
|
+
|
15
21
|
it "yields if Object.constants does not include any of the arguments" do
|
16
22
|
Object.stub!(:constants).and_return(["SomeClass", "OtherClass"])
|
17
23
|
conflicts_with(:AClass, :BClass) { ScratchPad.record :yield }
|
18
24
|
ScratchPad.recorded.should == :yield
|
19
25
|
end
|
26
|
+
|
27
|
+
it "yields if Object.constants (as Symbols) does not include any of the arguments" do
|
28
|
+
Object.stub!(:constants).and_return([:SomeClass, :OtherClass])
|
29
|
+
conflicts_with(:AClass, :BClass) { ScratchPad.record :yield }
|
30
|
+
ScratchPad.recorded.should == :yield
|
31
|
+
end
|
20
32
|
end
|
21
33
|
|
22
34
|
describe Object, "#conflicts_with" do
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
require 'mspec/guards/feature'
|
3
|
+
|
4
|
+
describe FeatureGuard, ".enabled?" do
|
5
|
+
it "returns true if the feature is enabled" do
|
6
|
+
MSpec.should_receive(:feature_enabled?).with(:encoding).and_return(true)
|
7
|
+
FeatureGuard.enabled?(:encoding).should be_true
|
8
|
+
end
|
9
|
+
|
10
|
+
it "returns false if the feature is not enabled" do
|
11
|
+
MSpec.should_receive(:feature_enabled?).with(:encoding).and_return(false)
|
12
|
+
FeatureGuard.enabled?(:encoding).should be_false
|
13
|
+
end
|
14
|
+
|
15
|
+
it "returns true if all the features are enabled" do
|
16
|
+
MSpec.should_receive(:feature_enabled?).with(:one).and_return(true)
|
17
|
+
MSpec.should_receive(:feature_enabled?).with(:two).and_return(true)
|
18
|
+
FeatureGuard.enabled?(:one, :two).should be_true
|
19
|
+
end
|
20
|
+
|
21
|
+
it "returns false if any of the features are not enabled" do
|
22
|
+
MSpec.should_receive(:feature_enabled?).with(:one).and_return(true)
|
23
|
+
MSpec.should_receive(:feature_enabled?).with(:two).and_return(false)
|
24
|
+
FeatureGuard.enabled?(:one, :two).should be_false
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe Object, "#with_feature" do
|
29
|
+
before :each do
|
30
|
+
ScratchPad.clear
|
31
|
+
|
32
|
+
@guard = FeatureGuard.new :encoding
|
33
|
+
FeatureGuard.stub!(:new).and_return(@guard)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "sets the name of the guard to :with_feature" do
|
37
|
+
with_feature(:encoding) { }
|
38
|
+
@guard.name.should == :with_feature
|
39
|
+
end
|
40
|
+
|
41
|
+
it "calls #unregister even when an exception is raised in the guard block" do
|
42
|
+
@guard.should_receive(:match?).and_return(true)
|
43
|
+
@guard.should_receive(:unregister)
|
44
|
+
lambda do
|
45
|
+
with_feature { raise Exception }
|
46
|
+
end.should raise_error(Exception)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe Object, "#with_feature" do
|
51
|
+
before :each do
|
52
|
+
ScratchPad.clear
|
53
|
+
end
|
54
|
+
|
55
|
+
it "yields if the feature is enabled" do
|
56
|
+
MSpec.should_receive(:feature_enabled?).with(:encoding).and_return(true)
|
57
|
+
with_feature(:encoding) { ScratchPad.record :yield }
|
58
|
+
ScratchPad.recorded.should == :yield
|
59
|
+
end
|
60
|
+
|
61
|
+
it "yields if all the features are enabled" do
|
62
|
+
MSpec.should_receive(:feature_enabled?).with(:one).and_return(true)
|
63
|
+
MSpec.should_receive(:feature_enabled?).with(:two).and_return(true)
|
64
|
+
with_feature(:one, :two) { ScratchPad.record :yield }
|
65
|
+
ScratchPad.recorded.should == :yield
|
66
|
+
end
|
67
|
+
|
68
|
+
it "does not yield if the feature is not enabled" do
|
69
|
+
MSpec.should_receive(:feature_enabled?).with(:encoding).and_return(false)
|
70
|
+
with_feature(:encoding) { ScratchPad.record :yield }
|
71
|
+
ScratchPad.recorded.should be_nil
|
72
|
+
end
|
73
|
+
|
74
|
+
it "does not yield if any of the features are not enabled" do
|
75
|
+
MSpec.should_receive(:feature_enabled?).with(:one).and_return(true)
|
76
|
+
MSpec.should_receive(:feature_enabled?).with(:two).and_return(false)
|
77
|
+
with_feature(:one, :two) { ScratchPad.record :yield }
|
78
|
+
ScratchPad.recorded.should be_nil
|
79
|
+
end
|
80
|
+
end
|
data/spec/guards/guard_spec.rb
CHANGED
@@ -47,33 +47,6 @@ describe SpecGuard, ".ruby_version" do
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
describe SpecGuard, ".windows?" do
|
51
|
-
before :all do
|
52
|
-
@ruby_platform = Object.const_get :RUBY_PLATFORM
|
53
|
-
end
|
54
|
-
|
55
|
-
after :all do
|
56
|
-
Object.const_set :RUBY_PLATFORM, @ruby_platform
|
57
|
-
end
|
58
|
-
|
59
|
-
it "returns true if key is mswin32" do
|
60
|
-
SpecGuard.windows?("mswin32").should be_true
|
61
|
-
end
|
62
|
-
|
63
|
-
it "returns true if key is mingw" do
|
64
|
-
SpecGuard.windows?("mingw").should be_true
|
65
|
-
end
|
66
|
-
|
67
|
-
it "returns false for non-windows" do
|
68
|
-
SpecGuard.windows?("notwindows").should be_false
|
69
|
-
end
|
70
|
-
|
71
|
-
it "uses RUBY_PLATFORM by default" do
|
72
|
-
Object.const_set :RUBY_PLATFORM, "mswin32"
|
73
|
-
SpecGuard.windows?.should be_true
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
50
|
describe SpecGuard, "#yield?" do
|
78
51
|
before :each do
|
79
52
|
MSpec.clear_modes
|
@@ -367,7 +340,7 @@ describe SpecGuard, "#os?" do
|
|
367
340
|
end
|
368
341
|
end
|
369
342
|
|
370
|
-
describe SpecGuard, "windows?" do
|
343
|
+
describe SpecGuard, "#windows?" do
|
371
344
|
before :each do
|
372
345
|
@guard = SpecGuard.new
|
373
346
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
require 'mspec/helpers/encode'
|
3
|
+
|
4
|
+
describe Object, "#encode" do
|
5
|
+
it "raises an ArgumentError if the str parameter is not a String" do
|
6
|
+
lambda { encode(Object.new, "utf-8") }.should raise_error(ArgumentError)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "raises an ArgumentError if the encoding parameter is not a String" do
|
10
|
+
lambda { encode("some str", Object.new) }.should raise_error(ArgumentError)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "calls #force_encoding if the :encoding feature is enabled" do
|
14
|
+
FeatureGuard.should_receive(:enabled?).with(:encoding).and_return(true)
|
15
|
+
str = "some text"
|
16
|
+
str.should_receive(:force_encoding).with("utf-8")
|
17
|
+
encode(str, "utf-8")
|
18
|
+
end
|
19
|
+
|
20
|
+
it "does not call #force_encoding if the :encoding feature is not enabled" do
|
21
|
+
FeatureGuard.should_receive(:enabled?).with(:encoding).and_return(false)
|
22
|
+
str = "some text"
|
23
|
+
str.should_not_receive(:force_encoding)
|
24
|
+
encode(str, "utf-8")
|
25
|
+
end
|
26
|
+
end
|
@@ -1,43 +1,30 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
require 'mspec/guards/platform'
|
2
3
|
require 'mspec/helpers/environment'
|
3
4
|
|
4
5
|
describe "#env" do
|
5
|
-
before(:all) do
|
6
|
-
@ruby_platform = Object.const_get :RUBY_PLATFORM
|
7
|
-
end
|
8
|
-
|
9
|
-
after(:all) do
|
10
|
-
Object.const_set :RUBY_PLATFORM, @ruby_platform
|
11
|
-
end
|
12
|
-
|
13
6
|
it "returns a hash of variables" do
|
14
7
|
env.class.should == Hash
|
15
8
|
end
|
16
|
-
|
9
|
+
|
17
10
|
it "calls `env` on non-Windows" do
|
18
|
-
|
11
|
+
PlatformGuard.stub!(:windows?).and_return(false)
|
19
12
|
should_receive(:`).with("env").and_return("one=two\nthree=four")
|
20
13
|
env
|
21
14
|
end
|
22
15
|
|
23
|
-
it "calls `cmd.exe /C set` on Windows
|
24
|
-
|
25
|
-
should_receive(:`).with("cmd.exe /C set").and_return("one=two\nthree=four")
|
26
|
-
env
|
27
|
-
end
|
28
|
-
|
29
|
-
it "calls `cmd.exe /C set` on Windows (mingw)" do
|
30
|
-
Object.const_set :RUBY_PLATFORM, "mingw"
|
16
|
+
it "calls `cmd.exe /C set` on Windows" do
|
17
|
+
PlatformGuard.stub!(:windows?).and_return(true)
|
31
18
|
should_receive(:`).with("cmd.exe /C set").and_return("one=two\nthree=four")
|
32
19
|
env
|
33
20
|
end
|
34
21
|
|
35
22
|
it "returns the current user's environment variables" do
|
36
|
-
|
23
|
+
PlatformGuard.stub!(:windows?).and_return(false)
|
37
24
|
should_receive(:`).with("env").and_return("one=two\nthree=four")
|
38
25
|
env.should == {"one" => "two", "three" => "four"}
|
39
26
|
|
40
|
-
|
27
|
+
PlatformGuard.stub!(:windows?).and_return(true)
|
41
28
|
should_receive(:`).with("cmd.exe /C set").and_return("five=six\nseven=eight")
|
42
29
|
env.should == {"five" => "six", "seven" => "eight"}
|
43
30
|
end
|
@@ -52,30 +39,24 @@ describe "#username" do
|
|
52
39
|
Object.const_set :RUBY_PLATFORM, @ruby_platform
|
53
40
|
end
|
54
41
|
|
55
|
-
it "calls `cmd.exe /C ECHO %USERNAME%` on Windows
|
56
|
-
|
57
|
-
should_receive(:`).with("cmd.exe /C ECHO %USERNAME%").and_return("john")
|
58
|
-
username
|
59
|
-
end
|
60
|
-
|
61
|
-
it "calls `cmd.exe /C ECHO %USERNAME%` on Windows (mingw)" do
|
62
|
-
Object.const_set :RUBY_PLATFORM, "mingw"
|
42
|
+
it "calls `cmd.exe /C ECHO %USERNAME%` on Windows" do
|
43
|
+
PlatformGuard.stub!(:windows?).and_return(true)
|
63
44
|
should_receive(:`).with("cmd.exe /C ECHO %USERNAME%").and_return("john")
|
64
45
|
username
|
65
46
|
end
|
66
47
|
|
67
48
|
it "calls `env` on non-Windows" do
|
68
|
-
|
49
|
+
PlatformGuard.stub!(:windows?).and_return(false)
|
69
50
|
should_receive(:`).with("whoami").and_return("john")
|
70
51
|
username
|
71
52
|
end
|
72
53
|
|
73
54
|
it "returns the user's username" do
|
74
|
-
|
55
|
+
PlatformGuard.stub!(:windows?).and_return(true)
|
75
56
|
should_receive(:`).with("cmd.exe /C ECHO %USERNAME%").and_return("johnonwin")
|
76
57
|
username.should == "johnonwin"
|
77
58
|
|
78
|
-
|
59
|
+
PlatformGuard.stub!(:windows?).and_return(false)
|
79
60
|
should_receive(:`).with("whoami").and_return("john")
|
80
61
|
username.should == "john"
|
81
62
|
end
|
@@ -73,21 +73,15 @@ describe "#resolve_ruby_exe" do
|
|
73
73
|
end
|
74
74
|
|
75
75
|
before :each do
|
76
|
-
@ruby_platform = Object.const_get :RUBY_PLATFORM
|
77
|
-
|
78
76
|
@script = RubyExeSpecs.new
|
79
77
|
end
|
80
78
|
|
81
|
-
after :each do
|
82
|
-
Object.const_set :RUBY_PLATFORM, @ruby_platform
|
83
|
-
end
|
84
|
-
|
85
79
|
after :all do
|
86
80
|
$VERBOSE = @verbose
|
87
81
|
end
|
88
82
|
|
89
83
|
it "returns the value returned by #ruby_exe_options if it exists and is executable" do
|
90
|
-
|
84
|
+
PlatformGuard.stub!(:windows?).and_return(false)
|
91
85
|
@script.should_receive(:ruby_exe_options).and_return(@name)
|
92
86
|
File.should_receive(:exists?).with(@name).and_return(true)
|
93
87
|
File.should_receive(:executable?).with(@name).and_return(true)
|
@@ -95,7 +89,7 @@ describe "#resolve_ruby_exe" do
|
|
95
89
|
end
|
96
90
|
|
97
91
|
it "returns the value returned by #ruby_exe_options if it exists on Windows platforms" do
|
98
|
-
|
92
|
+
PlatformGuard.stub!(:windows?).and_return(true)
|
99
93
|
@script.should_receive(:ruby_exe_options).and_return(@name)
|
100
94
|
File.should_receive(:exists?).with(@name).and_return(true)
|
101
95
|
File.should_not_receive(:executable?)
|
@@ -43,15 +43,15 @@ describe EqualUtf16Matcher do
|
|
43
43
|
matcher = EqualUtf16Matcher.new("a\0b\0")
|
44
44
|
matcher.matches?("a\0b\0c\0")
|
45
45
|
matcher.failure_message.should == [
|
46
|
-
"Expected \"a#{@null}b#{@null}c#{@null}\"\n",
|
47
|
-
"to equal \"a#{@null}b#{@null}\"\n or \"#{@null}a#{@null}b\"\n"]
|
46
|
+
"Expected [\"a#{@null}b#{@null}c#{@null}\"]\n",
|
47
|
+
"to equal [\"a#{@null}b#{@null}\"]\n or [\"#{@null}a#{@null}b\"]\n"]
|
48
48
|
end
|
49
49
|
|
50
50
|
it "provides a useful negative failure message" do
|
51
51
|
matcher = EqualUtf16Matcher.new("a\0b\0")
|
52
52
|
matcher.matches?("\0a\0b")
|
53
53
|
matcher.negative_failure_message.should == [
|
54
|
-
"Expected \"#{@null}a#{@null}b\"\n",
|
55
|
-
"not to equal \"a#{@null}b#{@null}\"\n nor \"#{@null}a#{@null}b\"\n"]
|
54
|
+
"Expected [\"#{@null}a#{@null}b\"]\n",
|
55
|
+
"not to equal [\"a#{@null}b#{@null}\"]\n nor [\"#{@null}a#{@null}b\"]\n"]
|
56
56
|
end
|
57
57
|
end
|
data/spec/mocks/mock_spec.rb
CHANGED
@@ -446,4 +446,15 @@ describe Mock, ".cleanup" do
|
|
446
446
|
Mock.cleanup
|
447
447
|
Mock.stubs.should == {}
|
448
448
|
end
|
449
|
+
|
450
|
+
it "removes the replaced name for mocks" do
|
451
|
+
replaced_key = Mock.replaced_key(@mock, :method_call)
|
452
|
+
Mock.should_receive(:clear_replaced).with(replaced_key)
|
453
|
+
|
454
|
+
replaced_name = Mock.replaced_name(@mock, :method_call)
|
455
|
+
Mock.replaced?(replaced_name).should be_true
|
456
|
+
|
457
|
+
Mock.cleanup
|
458
|
+
Mock.replaced?(replaced_name).should be_false
|
459
|
+
end
|
449
460
|
end
|
data/spec/runner/context_spec.rb
CHANGED
@@ -262,6 +262,12 @@ describe ContextState, "#parent=" do
|
|
262
262
|
state.parent = @parent
|
263
263
|
end
|
264
264
|
|
265
|
+
it "does not set parents if shared" do
|
266
|
+
state = ContextState.new "", :shared => true
|
267
|
+
state.parent = @parent
|
268
|
+
state.parents.should == [state]
|
269
|
+
end
|
270
|
+
|
265
271
|
it "sets self as a child of parent" do
|
266
272
|
@parent.should_receive(:child).with(@state)
|
267
273
|
@state.parent = @parent
|
@@ -910,11 +916,11 @@ end
|
|
910
916
|
|
911
917
|
describe ContextState, "#it_should_behave_like" do
|
912
918
|
before :each do
|
913
|
-
@shared_desc =
|
919
|
+
@shared_desc = :shared_context
|
914
920
|
@shared = ContextState.new(@shared_desc, :shared => true)
|
915
921
|
MSpec.stub!(:retrieve_shared).and_return(@shared)
|
916
922
|
|
917
|
-
@state = ContextState.new ""
|
923
|
+
@state = ContextState.new "Top level"
|
918
924
|
@a = lambda { }
|
919
925
|
@b = lambda { }
|
920
926
|
end
|
@@ -926,36 +932,57 @@ describe ContextState, "#it_should_behave_like" do
|
|
926
932
|
|
927
933
|
describe "for nested ContextState instances" do
|
928
934
|
before :each do
|
929
|
-
@nested = ContextState.new ""
|
935
|
+
@nested = ContextState.new "nested context"
|
930
936
|
@nested.parents.unshift @shared
|
937
|
+
|
931
938
|
@shared.children << @nested
|
939
|
+
|
940
|
+
@nested_dup = @nested.dup
|
941
|
+
@nested.stub!(:dup).and_return(@nested_dup)
|
932
942
|
end
|
933
943
|
|
934
|
-
it "
|
944
|
+
it "duplicates the nested ContextState" do
|
935
945
|
@state.it_should_behave_like @shared_desc
|
936
|
-
@
|
937
|
-
@state.children.should include(*@shared.children)
|
946
|
+
@state.children.first.should equal(@nested_dup)
|
938
947
|
end
|
939
948
|
|
940
|
-
it "
|
941
|
-
@shared.children.first.parents.first.should equal(@shared)
|
949
|
+
it "sets the parent of the nested ContextState to the containing ContextState" do
|
942
950
|
@state.it_should_behave_like @shared_desc
|
943
|
-
@
|
951
|
+
@nested_dup.parent.should equal(@state)
|
952
|
+
end
|
953
|
+
|
954
|
+
it "sets the context for nested examples to the nested ContextState's dup" do
|
955
|
+
@shared.it "an example", &@a
|
956
|
+
@shared.it "another example", &@b
|
957
|
+
@state.it_should_behave_like @shared_desc
|
958
|
+
@nested_dup.examples.each { |x| x.context.should equal(@nested_dup) }
|
959
|
+
end
|
960
|
+
|
961
|
+
it "omits the shored ContextState's description" do
|
962
|
+
@nested.it "an example", &@a
|
963
|
+
@nested.it "another example", &@b
|
964
|
+
@state.it_should_behave_like @shared_desc
|
965
|
+
|
966
|
+
@nested_dup.description.should == "Top level nested context"
|
967
|
+
@nested_dup.examples.first.description.should == "Top level nested context an example"
|
968
|
+
@nested_dup.examples.last.description.should == "Top level nested context another example"
|
944
969
|
end
|
945
970
|
end
|
946
971
|
|
947
|
-
it "adds examples from the shared ContextState" do
|
948
|
-
@shared.it "some", &@a
|
949
|
-
@shared.
|
972
|
+
it "adds duped examples from the shared ContextState" do
|
973
|
+
@shared.it "some method", &@a
|
974
|
+
ex_dup = @shared.examples.first.dup
|
975
|
+
@shared.examples.first.stub!(:dup).and_return(ex_dup)
|
976
|
+
|
950
977
|
@state.it_should_behave_like @shared_desc
|
951
|
-
@state.examples.should
|
978
|
+
@state.examples.should == [ex_dup]
|
952
979
|
end
|
953
980
|
|
954
|
-
it "sets the
|
955
|
-
@shared.it "
|
956
|
-
@shared.it "
|
957
|
-
@shared.examples.each { |ex| ex.should_receive(:context=).with(@state) }
|
981
|
+
it "sets the context for examples to the containing ContextState" do
|
982
|
+
@shared.it "an example", &@a
|
983
|
+
@shared.it "another example", &@b
|
958
984
|
@state.it_should_behave_like @shared_desc
|
985
|
+
@state.examples.each { |x| x.context.should equal(@state) }
|
959
986
|
end
|
960
987
|
|
961
988
|
it "adds before(:all) blocks from the shared ContextState" do
|
data/spec/runner/example_spec.rb
CHANGED
@@ -71,6 +71,11 @@ describe ExampleState, "#filtered?" do
|
|
71
71
|
@filter = mock("filter")
|
72
72
|
end
|
73
73
|
|
74
|
+
after :each do
|
75
|
+
MSpec.store :include, nil
|
76
|
+
MSpec.store :exclude, nil
|
77
|
+
end
|
78
|
+
|
74
79
|
it "returns false if MSpec include filters list is empty" do
|
75
80
|
@state.filtered?.should == false
|
76
81
|
end
|
@@ -2,6 +2,7 @@ require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
2
|
require 'mspec/runner/formatters/dotted'
|
3
3
|
require 'mspec/runner/mspec'
|
4
4
|
require 'mspec/runner/example'
|
5
|
+
require 'mspec/utils/script'
|
5
6
|
|
6
7
|
describe DottedFormatter, "#initialize" do
|
7
8
|
it "permits zero arguments" do
|
@@ -16,10 +17,10 @@ end
|
|
16
17
|
describe DottedFormatter, "#register" do
|
17
18
|
before :each do
|
18
19
|
@formatter = DottedFormatter.new
|
20
|
+
MSpec.stub!(:register)
|
19
21
|
end
|
20
22
|
|
21
23
|
it "registers self with MSpec for appropriate actions" do
|
22
|
-
MSpec.stub!(:register)
|
23
24
|
MSpec.should_receive(:register).with(:exception, @formatter)
|
24
25
|
MSpec.should_receive(:register).with(:before, @formatter)
|
25
26
|
MSpec.should_receive(:register).with(:after, @formatter)
|
@@ -6,17 +6,17 @@ require 'mspec/runner/example'
|
|
6
6
|
describe FileFormatter, "#register" do
|
7
7
|
before :each do
|
8
8
|
@formatter = FileFormatter.new
|
9
|
+
MSpec.stub!(:register)
|
10
|
+
MSpec.stub!(:unregister)
|
9
11
|
end
|
10
12
|
|
11
13
|
it "registers self with MSpec for :load, :unload actions" do
|
12
|
-
MSpec.stub!(:register)
|
13
14
|
MSpec.should_receive(:register).with(:load, @formatter)
|
14
15
|
MSpec.should_receive(:register).with(:unload, @formatter)
|
15
16
|
@formatter.register
|
16
17
|
end
|
17
18
|
|
18
19
|
it "unregisters self with MSpec for :before, :after actions" do
|
19
|
-
MSpec.stub!(:unregister)
|
20
20
|
MSpec.should_receive(:unregister).with(:before, @formatter)
|
21
21
|
MSpec.should_receive(:unregister).with(:after, @formatter)
|
22
22
|
@formatter.register
|
@@ -16,10 +16,10 @@ end
|
|
16
16
|
describe SpinnerFormatter, "#register" do
|
17
17
|
before :each do
|
18
18
|
@formatter = SpinnerFormatter.new
|
19
|
+
MSpec.stub!(:register)
|
19
20
|
end
|
20
21
|
|
21
22
|
it "registers self with MSpec for appropriate actions" do
|
22
|
-
MSpec.stub!(:register)
|
23
23
|
MSpec.should_receive(:register).with(:start, @formatter)
|
24
24
|
MSpec.should_receive(:register).with(:load, @formatter)
|
25
25
|
MSpec.should_receive(:register).with(:after, @formatter)
|
data/spec/runner/shared_spec.rb
CHANGED
@@ -1,27 +1,78 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../spec_helper'
|
2
2
|
require 'mspec/runner/shared'
|
3
|
+
require 'mspec/runner/context'
|
4
|
+
require 'mspec/runner/example'
|
3
5
|
|
4
6
|
describe Object, "#it_behaves_like" do
|
5
7
|
before :each do
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
ScratchPad.clear
|
9
|
+
|
10
|
+
@state = ContextState.new "Top level"
|
11
|
+
@state.instance_variable_set :@parsed, true
|
12
|
+
|
13
|
+
@shared = ContextState.new :shared_spec, :shared => true
|
14
|
+
MSpec.stub!(:retrieve_shared).and_return(@shared)
|
11
15
|
end
|
12
16
|
|
13
17
|
it "creates @method set to the name of the aliased method" do
|
14
|
-
@
|
15
|
-
@
|
18
|
+
@shared.it("an example") { ScratchPad.record @method }
|
19
|
+
@state.it_behaves_like :shared_spec, :some_method
|
20
|
+
@state.process
|
21
|
+
ScratchPad.recorded.should == :some_method
|
16
22
|
end
|
17
23
|
|
18
|
-
it "creates @object if the passed object
|
19
|
-
|
20
|
-
@
|
24
|
+
it "creates @object if the passed object" do
|
25
|
+
object = Object.new
|
26
|
+
@shared.it("an example") { ScratchPad.record @object }
|
27
|
+
@state.it_behaves_like :shared_spec, :some_method, object
|
28
|
+
@state.process
|
29
|
+
ScratchPad.recorded.should == object
|
21
30
|
end
|
22
31
|
|
23
32
|
it "sends :it_should_behave_like" do
|
24
|
-
@
|
25
|
-
@
|
33
|
+
@state.should_receive(:it_should_behave_like)
|
34
|
+
@state.it_behaves_like :shared_spec, :some_method
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "with multiple shared contexts" do
|
38
|
+
before :each do
|
39
|
+
@obj = Object.new
|
40
|
+
@obj2 = Object.new
|
41
|
+
|
42
|
+
@state2 = ContextState.new "Second top level"
|
43
|
+
@state2.instance_variable_set :@parsed, true
|
44
|
+
end
|
45
|
+
|
46
|
+
it "ensures the shared spec state is distinct" do
|
47
|
+
@shared.it("an example") { ScratchPad.record [@method, @object] }
|
48
|
+
|
49
|
+
@state.it_behaves_like :shared_spec, :some_method, @obj
|
50
|
+
|
51
|
+
@state.process
|
52
|
+
ScratchPad.recorded.should == [:some_method, @obj]
|
53
|
+
|
54
|
+
@state2.it_behaves_like :shared_spec, :another_method, @obj2
|
55
|
+
|
56
|
+
@state2.process
|
57
|
+
ScratchPad.recorded.should == [:another_method, @obj2]
|
58
|
+
end
|
59
|
+
|
60
|
+
it "ensures the shared spec state is distinct for nested shared specs" do
|
61
|
+
nested = ContextState.new "nested context"
|
62
|
+
nested.instance_variable_set :@parsed, true
|
63
|
+
nested.parent = @shared
|
64
|
+
|
65
|
+
nested.it("another example") { ScratchPad.record [:shared, @method, @object] }
|
66
|
+
|
67
|
+
@state.it_behaves_like :shared_spec, :some_method, @obj
|
68
|
+
|
69
|
+
@state.process
|
70
|
+
ScratchPad.recorded.should == [:shared, :some_method, @obj]
|
71
|
+
|
72
|
+
@state2.it_behaves_like :shared_spec, :another_method, @obj2
|
73
|
+
|
74
|
+
@state2.process
|
75
|
+
ScratchPad.recorded.should == [:shared, :another_method, @obj2]
|
76
|
+
end
|
26
77
|
end
|
27
78
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.5.
|
4
|
+
version: 1.5.15
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Ford
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-
|
12
|
+
date: 2010-02-04 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -41,6 +41,7 @@ files:
|
|
41
41
|
- lib/mspec/guards/conflict.rb
|
42
42
|
- lib/mspec/guards/endian.rb
|
43
43
|
- lib/mspec/guards/extensions.rb
|
44
|
+
- lib/mspec/guards/feature.rb
|
44
45
|
- lib/mspec/guards/guard.rb
|
45
46
|
- lib/mspec/guards/noncompliance.rb
|
46
47
|
- lib/mspec/guards/platform.rb
|
@@ -56,6 +57,7 @@ files:
|
|
56
57
|
- lib/mspec/helpers/bignum.rb
|
57
58
|
- lib/mspec/helpers/const_lookup.rb
|
58
59
|
- lib/mspec/helpers/ducktype.rb
|
60
|
+
- lib/mspec/helpers/encode.rb
|
59
61
|
- lib/mspec/helpers/enumerator_class.rb
|
60
62
|
- lib/mspec/helpers/environment.rb
|
61
63
|
- lib/mspec/helpers/fixture.rb
|
@@ -170,6 +172,7 @@ files:
|
|
170
172
|
- spec/guards/conflict_spec.rb
|
171
173
|
- spec/guards/endian_spec.rb
|
172
174
|
- spec/guards/extensions_spec.rb
|
175
|
+
- spec/guards/feature_spec.rb
|
173
176
|
- spec/guards/guard_spec.rb
|
174
177
|
- spec/guards/noncompliance_spec.rb
|
175
178
|
- spec/guards/platform_spec.rb
|
@@ -184,6 +187,7 @@ files:
|
|
184
187
|
- spec/helpers/bignum_spec.rb
|
185
188
|
- spec/helpers/const_lookup_spec.rb
|
186
189
|
- spec/helpers/ducktype_spec.rb
|
190
|
+
- spec/helpers/encode_spec.rb
|
187
191
|
- spec/helpers/enumerator_class_spec.rb
|
188
192
|
- spec/helpers/environment_spec.rb
|
189
193
|
- spec/helpers/fixture_spec.rb
|