mspec 1.0.0
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/LICENSE +22 -0
- data/README +101 -0
- data/Rakefile +44 -0
- data/bin/mkspec +7 -0
- data/bin/mspec +7 -0
- data/bin/mspec-ci +8 -0
- data/bin/mspec-run +8 -0
- data/bin/mspec-tag +8 -0
- data/lib/mspec.rb +6 -0
- data/lib/mspec/commands/mkspec.rb +147 -0
- data/lib/mspec/commands/mspec-ci.rb +71 -0
- data/lib/mspec/commands/mspec-run.rb +80 -0
- data/lib/mspec/commands/mspec-tag.rb +87 -0
- data/lib/mspec/commands/mspec.rb +143 -0
- data/lib/mspec/expectations.rb +2 -0
- data/lib/mspec/expectations/expectations.rb +12 -0
- data/lib/mspec/expectations/should.rb +23 -0
- data/lib/mspec/guards.rb +13 -0
- data/lib/mspec/guards/bug.rb +27 -0
- data/lib/mspec/guards/compliance.rb +18 -0
- data/lib/mspec/guards/conflict.rb +16 -0
- data/lib/mspec/guards/endian.rb +40 -0
- data/lib/mspec/guards/extensions.rb +12 -0
- data/lib/mspec/guards/guard.rb +120 -0
- data/lib/mspec/guards/noncompliance.rb +12 -0
- data/lib/mspec/guards/platform.rb +38 -0
- data/lib/mspec/guards/quarantine.rb +15 -0
- data/lib/mspec/guards/runner.rb +30 -0
- data/lib/mspec/guards/superuser.rb +15 -0
- data/lib/mspec/guards/support.rb +12 -0
- data/lib/mspec/guards/version.rb +40 -0
- data/lib/mspec/helpers.rb +6 -0
- data/lib/mspec/helpers/bignum.rb +5 -0
- data/lib/mspec/helpers/const_lookup.rb +5 -0
- data/lib/mspec/helpers/flunk.rb +5 -0
- data/lib/mspec/helpers/io.rb +13 -0
- data/lib/mspec/helpers/scratch.rb +17 -0
- data/lib/mspec/helpers/tmp.rb +32 -0
- data/lib/mspec/matchers.rb +16 -0
- data/lib/mspec/matchers/base.rb +95 -0
- data/lib/mspec/matchers/be_ancestor_of.rb +24 -0
- data/lib/mspec/matchers/be_close.rb +27 -0
- data/lib/mspec/matchers/be_empty.rb +20 -0
- data/lib/mspec/matchers/be_false.rb +20 -0
- data/lib/mspec/matchers/be_kind_of.rb +24 -0
- data/lib/mspec/matchers/be_nil.rb +20 -0
- data/lib/mspec/matchers/be_true.rb +20 -0
- data/lib/mspec/matchers/complain.rb +56 -0
- data/lib/mspec/matchers/eql.rb +26 -0
- data/lib/mspec/matchers/equal.rb +26 -0
- data/lib/mspec/matchers/equal_utf16.rb +34 -0
- data/lib/mspec/matchers/include.rb +32 -0
- data/lib/mspec/matchers/output.rb +67 -0
- data/lib/mspec/matchers/output_to_fd.rb +71 -0
- data/lib/mspec/matchers/raise_error.rb +48 -0
- data/lib/mspec/mocks.rb +3 -0
- data/lib/mspec/mocks/mock.rb +123 -0
- data/lib/mspec/mocks/object.rb +28 -0
- data/lib/mspec/mocks/proxy.rb +112 -0
- data/lib/mspec/runner.rb +13 -0
- data/lib/mspec/runner/actions.rb +6 -0
- data/lib/mspec/runner/actions/debug.rb +17 -0
- data/lib/mspec/runner/actions/filter.rb +40 -0
- data/lib/mspec/runner/actions/gdb.rb +17 -0
- data/lib/mspec/runner/actions/tag.rb +97 -0
- data/lib/mspec/runner/actions/tally.rb +80 -0
- data/lib/mspec/runner/actions/timer.rb +22 -0
- data/lib/mspec/runner/filters.rb +4 -0
- data/lib/mspec/runner/filters/match.rb +22 -0
- data/lib/mspec/runner/filters/profile.rb +54 -0
- data/lib/mspec/runner/filters/regexp.rb +7 -0
- data/lib/mspec/runner/filters/tag.rb +29 -0
- data/lib/mspec/runner/formatters.rb +7 -0
- data/lib/mspec/runner/formatters/dotted.rb +81 -0
- data/lib/mspec/runner/formatters/html.rb +87 -0
- data/lib/mspec/runner/formatters/specdoc.rb +27 -0
- data/lib/mspec/runner/formatters/spinner.rb +89 -0
- data/lib/mspec/runner/formatters/summary.rb +8 -0
- data/lib/mspec/runner/formatters/unit.rb +25 -0
- data/lib/mspec/runner/formatters/yaml.rb +43 -0
- data/lib/mspec/runner/mspec.rb +232 -0
- data/lib/mspec/runner/object.rb +20 -0
- data/lib/mspec/runner/shared.rb +12 -0
- data/lib/mspec/runner/state.rb +116 -0
- data/lib/mspec/runner/tag.rb +20 -0
- data/lib/mspec/utils/name_map.rb +130 -0
- data/lib/mspec/utils/options.rb +344 -0
- data/lib/mspec/utils/script.rb +77 -0
- data/lib/mspec/version.rb +3 -0
- data/spec/commands/mkspec_spec.rb +321 -0
- data/spec/commands/mspec_ci_spec.rb +139 -0
- data/spec/commands/mspec_run_spec.rb +146 -0
- data/spec/commands/mspec_spec.rb +359 -0
- data/spec/commands/mspec_tag_spec.rb +131 -0
- data/spec/expectations/expectations_spec.rb +16 -0
- data/spec/expectations/should_spec.rb +99 -0
- data/spec/guards/bug_spec.rb +137 -0
- data/spec/guards/compliance_spec.rb +70 -0
- data/spec/guards/conflict_spec.rb +20 -0
- data/spec/guards/endian_spec.rb +42 -0
- data/spec/guards/extensions_spec.rb +36 -0
- data/spec/guards/guard_spec.rb +355 -0
- data/spec/guards/noncompliance_spec.rb +36 -0
- data/spec/guards/platform_spec.rb +84 -0
- data/spec/guards/quarantine_spec.rb +19 -0
- data/spec/guards/runner_spec.rb +75 -0
- data/spec/guards/superuser_spec.rb +22 -0
- data/spec/guards/support_spec.rb +22 -0
- data/spec/guards/version_spec.rb +133 -0
- data/spec/helpers/bignum_spec.rb +11 -0
- data/spec/helpers/const_lookup_spec.rb +19 -0
- data/spec/helpers/flunk_spec.rb +15 -0
- data/spec/helpers/io_spec.rb +34 -0
- data/spec/helpers/scratch_spec.rb +22 -0
- data/spec/helpers/tmp_spec.rb +72 -0
- data/spec/matchers/base_spec.rb +180 -0
- data/spec/matchers/be_ancestor_of_spec.rb +28 -0
- data/spec/matchers/be_close_spec.rb +46 -0
- data/spec/matchers/be_empty_spec.rb +26 -0
- data/spec/matchers/be_false_spec.rb +28 -0
- data/spec/matchers/be_kind_of_spec.rb +29 -0
- data/spec/matchers/be_nil_spec.rb +27 -0
- data/spec/matchers/be_true_spec.rb +28 -0
- data/spec/matchers/complain_spec.rb +52 -0
- data/spec/matchers/eql_spec.rb +33 -0
- data/spec/matchers/equal_spec.rb +33 -0
- data/spec/matchers/equal_utf16_spec.rb +47 -0
- data/spec/matchers/include_spec.rb +37 -0
- data/spec/matchers/output_spec.rb +74 -0
- data/spec/matchers/output_to_fd_spec.rb +33 -0
- data/spec/matchers/raise_error_spec.rb +56 -0
- data/spec/mocks/mock_spec.rb +272 -0
- data/spec/mocks/proxy_spec.rb +259 -0
- data/spec/runner/actions/debug_spec.rb +61 -0
- data/spec/runner/actions/filter_spec.rb +84 -0
- data/spec/runner/actions/gdb_spec.rb +61 -0
- data/spec/runner/actions/tag_spec.rb +253 -0
- data/spec/runner/actions/tally_spec.rb +107 -0
- data/spec/runner/actions/timer_spec.rb +42 -0
- data/spec/runner/filters/a.yaml +4 -0
- data/spec/runner/filters/b.yaml +11 -0
- data/spec/runner/filters/match_spec.rb +44 -0
- data/spec/runner/filters/profile_spec.rb +117 -0
- data/spec/runner/filters/regexp_spec.rb +13 -0
- data/spec/runner/filters/tag_spec.rb +77 -0
- data/spec/runner/formatters/dotted_spec.rb +184 -0
- data/spec/runner/formatters/html_spec.rb +191 -0
- data/spec/runner/formatters/specdoc_spec.rb +57 -0
- data/spec/runner/formatters/spinner_spec.rb +78 -0
- data/spec/runner/formatters/summary_spec.rb +29 -0
- data/spec/runner/formatters/unit_spec.rb +71 -0
- data/spec/runner/formatters/yaml_spec.rb +123 -0
- data/spec/runner/mspec_spec.rb +393 -0
- data/spec/runner/shared_spec.rb +41 -0
- data/spec/runner/state_spec.rb +535 -0
- data/spec/runner/tag_spec.rb +93 -0
- data/spec/runner/tags.txt +3 -0
- data/spec/spec_helper.rb +46 -0
- data/spec/utils/name_map_spec.rb +178 -0
- data/spec/utils/options_spec.rb +862 -0
- data/spec/utils/script_spec.rb +240 -0
- metadata +217 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
require 'mspec/runner/formatters/dotted'
|
|
2
|
+
|
|
3
|
+
# MSpecScript provides a skeleton for all the MSpec runner scripts.
|
|
4
|
+
|
|
5
|
+
class MSpecScript
|
|
6
|
+
def self.config
|
|
7
|
+
@config ||= { :path => ['.', 'spec'] }
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.set(key, value)
|
|
11
|
+
config[key] = value
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def initialize
|
|
15
|
+
config[:tags_dir] = 'spec/tags'
|
|
16
|
+
config[:formatter] = DottedFormatter
|
|
17
|
+
config[:includes] = []
|
|
18
|
+
config[:excludes] = []
|
|
19
|
+
config[:patterns] = []
|
|
20
|
+
config[:xpatterns] = []
|
|
21
|
+
config[:tags] = []
|
|
22
|
+
config[:xtags] = []
|
|
23
|
+
config[:profiles] = []
|
|
24
|
+
config[:xprofiles] = []
|
|
25
|
+
config[:atags] = []
|
|
26
|
+
config[:astrings] = []
|
|
27
|
+
config[:abort] = true
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def config
|
|
31
|
+
MSpecScript.config
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def load(name)
|
|
35
|
+
return Kernel.load(name) if File.exist?(File.expand_path(name))
|
|
36
|
+
|
|
37
|
+
config[:path].each do |dir|
|
|
38
|
+
file = File.join dir, name
|
|
39
|
+
return Kernel.load(file) if File.exist? file
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def register
|
|
44
|
+
config[:formatter].new(config[:output]).register
|
|
45
|
+
|
|
46
|
+
MatchFilter.new(:include, *config[:includes]).register unless config[:includes].empty?
|
|
47
|
+
MatchFilter.new(:exclude, *config[:excludes]).register unless config[:excludes].empty?
|
|
48
|
+
RegexpFilter.new(:include, *config[:patterns]).register unless config[:patterns].empty?
|
|
49
|
+
RegexpFilter.new(:exclude, *config[:xpatterns]).register unless config[:xpatterns].empty?
|
|
50
|
+
TagFilter.new(:include, *config[:tags]).register unless config[:tags].empty?
|
|
51
|
+
TagFilter.new(:exclude, *config[:xtags]).register unless config[:xtags].empty?
|
|
52
|
+
ProfileFilter.new(:include, *config[:profiles]).register unless config[:profiles].empty?
|
|
53
|
+
ProfileFilter.new(:exclude, *config[:xprofiles]).register unless config[:xprofiles].empty?
|
|
54
|
+
|
|
55
|
+
DebugAction.new(config[:atags], config[:astrings]).register if config[:debugger]
|
|
56
|
+
GdbAction.new(config[:atags], config[:astrings]).register if config[:gdb]
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def signals
|
|
60
|
+
if config[:abort]
|
|
61
|
+
Signal.trap "INT" do
|
|
62
|
+
puts "\nProcess aborted!"
|
|
63
|
+
exit! 1
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def self.main
|
|
69
|
+
script = new
|
|
70
|
+
script.load 'default.mspec'
|
|
71
|
+
script.load '~/.mspecrc'
|
|
72
|
+
script.options
|
|
73
|
+
script.signals
|
|
74
|
+
script.register
|
|
75
|
+
script.run
|
|
76
|
+
end
|
|
77
|
+
end
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
|
2
|
+
require 'mspec/commands/mkspec'
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
describe "The -c, --constant CONSTANT option" do
|
|
6
|
+
before :each do
|
|
7
|
+
@options = OptionParser.new
|
|
8
|
+
OptionParser.stub!(:new).and_return(@options)
|
|
9
|
+
@script = MkSpec.new
|
|
10
|
+
@config = @script.config
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "is enabled by #options" do
|
|
14
|
+
@options.stub!(:on)
|
|
15
|
+
@options.should_receive(:on).with("-c", "--constant CONSTANT",
|
|
16
|
+
String, an_instance_of(String))
|
|
17
|
+
@script.options
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "adds CONSTANT to the list of constants" do
|
|
21
|
+
["-c", "--constant"].each do |opt|
|
|
22
|
+
@config[:constants] = []
|
|
23
|
+
@script.options [opt, "Object"]
|
|
24
|
+
@config[:constants].should include("Object")
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe "The -b, --base DIR option" do
|
|
30
|
+
before :each do
|
|
31
|
+
@options = OptionParser.new
|
|
32
|
+
OptionParser.stub!(:new).and_return(@options)
|
|
33
|
+
@script = MkSpec.new
|
|
34
|
+
@config = @script.config
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "is enabled by #options" do
|
|
38
|
+
@options.stub!(:on)
|
|
39
|
+
@options.should_receive(:on).with("-b", "--base DIR",
|
|
40
|
+
String, an_instance_of(String))
|
|
41
|
+
@script.options
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "sets the base directory relative to which the spec directories are created" do
|
|
45
|
+
["-b", "--base"].each do |opt|
|
|
46
|
+
@config[:base] = nil
|
|
47
|
+
@script.options [opt, "superspec"]
|
|
48
|
+
@config[:base].should == File.expand_path("superspec")
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
describe "The -r, --require LIBRARY option" do
|
|
54
|
+
before :each do
|
|
55
|
+
@options = OptionParser.new
|
|
56
|
+
OptionParser.stub!(:new).and_return(@options)
|
|
57
|
+
@script = MkSpec.new
|
|
58
|
+
@config = @script.config
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "is enabled by #options" do
|
|
62
|
+
@options.stub!(:on)
|
|
63
|
+
@options.should_receive(:on).with("-r", "--require LIBRARY",
|
|
64
|
+
String, an_instance_of(String))
|
|
65
|
+
@script.options
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
it "adds CONSTANT to the list of constants" do
|
|
69
|
+
["-r", "--require"].each do |opt|
|
|
70
|
+
@config[:requires] = []
|
|
71
|
+
@script.options [opt, "libspec"]
|
|
72
|
+
@config[:requires].should include("libspec")
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
describe MkSpec, "#options" do
|
|
78
|
+
before :each do
|
|
79
|
+
@options = OptionParser.new
|
|
80
|
+
OptionParser.stub!(:new).and_return(@options)
|
|
81
|
+
@script = MkSpec.new
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "parses the command line options" do
|
|
85
|
+
@options.should_receive(:parse).with(["--this", "and", "--that"])
|
|
86
|
+
@script.options ["--this", "and", "--that"]
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it "parses ARGV unless passed other options" do
|
|
90
|
+
@options.should_receive(:parse).with(ARGV)
|
|
91
|
+
@script.options
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
it "prints help and exits if passed an unrecognized option" do
|
|
95
|
+
@script.should_receive(:puts).exactly(3).times
|
|
96
|
+
@script.should_receive(:exit)
|
|
97
|
+
@script.options "--iunknown"
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
describe MkSpec, "#create_directory" do
|
|
102
|
+
before :each do
|
|
103
|
+
@script = MkSpec.new
|
|
104
|
+
@script.config[:base] = "spec"
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it "prints a warning if a file with the directory name exists" do
|
|
108
|
+
File.should_receive(:exist?).and_return(true)
|
|
109
|
+
File.should_receive(:directory?).and_return(false)
|
|
110
|
+
FileUtils.should_not_receive(:mkdir_p)
|
|
111
|
+
@script.should_receive(:puts).with("spec/class already exists and is not a directory.")
|
|
112
|
+
@script.create_directory("Class").should == nil
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
it "does nothing if the directory already exists" do
|
|
116
|
+
File.should_receive(:exist?).and_return(true)
|
|
117
|
+
File.should_receive(:directory?).and_return(true)
|
|
118
|
+
FileUtils.should_not_receive(:mkdir_p)
|
|
119
|
+
@script.create_directory("Class").should == "spec/class"
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
it "creates the directory if it does not exist" do
|
|
123
|
+
File.should_receive(:exist?).and_return(false)
|
|
124
|
+
FileUtils.should_receive(:mkdir_p).with("spec/class")
|
|
125
|
+
@script.create_directory("Class").should == "spec/class"
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
it "creates the directory for a namespaced module if it does not exist" do
|
|
129
|
+
File.should_receive(:exist?).and_return(false)
|
|
130
|
+
FileUtils.should_receive(:mkdir_p).with("spec/struct/tms")
|
|
131
|
+
@script.create_directory("Struct::Tms").should == "spec/struct/tms"
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
describe MkSpec, "#write_requires" do
|
|
136
|
+
before :each do
|
|
137
|
+
@script = MkSpec.new
|
|
138
|
+
@script.config[:base] = "spec"
|
|
139
|
+
|
|
140
|
+
@file = mock("file")
|
|
141
|
+
File.stub!(:open).and_yield(@file)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
it "writes the spec_helper require line" do
|
|
145
|
+
@file.should_receive(:puts).with("require File.dirname(__FILE__) + '/../../../spec_helper'")
|
|
146
|
+
@script.write_requires("spec/core/tcejbo", "spec/core/tcejbo/inspect_spec.rb")
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
it "writes require lines for each library specified on the command line" do
|
|
150
|
+
@file.stub!(:puts)
|
|
151
|
+
@file.should_receive(:puts).with("require File.dirname(__FILE__) + '/../../../spec_helper'")
|
|
152
|
+
@file.should_receive(:puts).with("require 'complex'")
|
|
153
|
+
@script.config[:requires] << 'complex'
|
|
154
|
+
@script.write_requires("spec/core/tcejbo", "spec/core/tcejbo/inspect_spec.rb")
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
describe MkSpec, "#write_spec" do
|
|
159
|
+
before :each do
|
|
160
|
+
@file = mock("file")
|
|
161
|
+
@file.stub!(:puts)
|
|
162
|
+
File.stub!(:open).and_yield(@file)
|
|
163
|
+
|
|
164
|
+
@script = MkSpec.new
|
|
165
|
+
@script.stub!(:puts)
|
|
166
|
+
|
|
167
|
+
@response = mock("system command response")
|
|
168
|
+
@response.stub!(:=~).and_return(false)
|
|
169
|
+
@script.stub!(:`).and_return(@response)
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
it "checks if specs exist for the method if the spec file exists" do
|
|
173
|
+
@script.should_receive(:`).with(
|
|
174
|
+
/mspec\/bin\/mspec-run --dry-run -fs -e 'Object#inspect' spec\/core\/tcejbo\/inspect_spec.rb/)
|
|
175
|
+
@script.write_spec("spec/core/tcejbo/inspect_spec.rb", "Object#inspect", true)
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
it "escapes the Regexp when checking for method name in the spec file output" do
|
|
179
|
+
Regexp.should_receive(:escape).with("Array#[]=")
|
|
180
|
+
@script.write_spec("spec/core/yarra/element_set_spec.rb", "Array#[]=", true)
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
it "returns nil if the spec file exists and contains a spec for the method" do
|
|
184
|
+
@response.stub!(:=~).and_return(true)
|
|
185
|
+
@script.write_spec("spec/core/tcejbo/inspect_spec.rb", "Object#inspect", true).should == nil
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
it "does not print the spec file name if it exists and contains a spec for the method" do
|
|
189
|
+
@response.stub!(:=~).and_return(true)
|
|
190
|
+
@script.should_not_receive(:puts)
|
|
191
|
+
@script.write_spec("spec/core/tcejbo/inspect_spec.rb", "Object#inspect", true)
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
it "prints the spec file name if a template spec is written" do
|
|
195
|
+
@script.should_receive(:puts).with("spec/core/tcejbo/inspect_spec.rb")
|
|
196
|
+
@script.write_spec("spec/core/tcejbo/inspect_spec.rb", "Object#inspect", true)
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
it "writes a template spec to the file if the spec file does not exist" do
|
|
200
|
+
@file.should_receive(:puts)
|
|
201
|
+
@script.should_receive(:puts).with("spec/core/tcejbo/inspect_spec.rb")
|
|
202
|
+
@script.write_spec("spec/core/tcejbo/inspect_spec.rb", "Object#inspect", false)
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
it "writes a template spec to the file if it exists but contains no spec for the method" do
|
|
206
|
+
@response.should_receive(:=~).and_return(false)
|
|
207
|
+
@file.should_receive(:puts)
|
|
208
|
+
@script.should_receive(:puts).with("spec/core/tcejbo/inspect_spec.rb")
|
|
209
|
+
@script.write_spec("spec/core/tcejbo/inspect_spec.rb", "Object#inspect", true)
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
describe MkSpec, "#create_file" do
|
|
214
|
+
before :each do
|
|
215
|
+
@script = MkSpec.new
|
|
216
|
+
@script.stub!(:write_requires)
|
|
217
|
+
@script.stub!(:write_spec)
|
|
218
|
+
|
|
219
|
+
File.stub!(:exist?).and_return(false)
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
it "generates a file name based on the directory, class/module, and method" do
|
|
223
|
+
File.should_receive(:join).with("spec/tcejbo", "inspect_spec.rb"
|
|
224
|
+
).and_return("spec/tcejbo/inspect_spec.rb")
|
|
225
|
+
@script.create_file("spec/tcejbo", "Object", "inspect", "Object#inspect")
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
it "does not call #write_requires if the spec file already exists" do
|
|
229
|
+
File.should_receive(:exist?).and_return(true)
|
|
230
|
+
@script.should_not_receive(:write_requires)
|
|
231
|
+
@script.create_file("spec/tcejbo", "Object", "inspect", "Object#inspect")
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
it "calls #write_requires if the spec file does not exist" do
|
|
235
|
+
File.should_receive(:exist?).and_return(false)
|
|
236
|
+
@script.should_receive(:write_requires).with(
|
|
237
|
+
"spec/tcejbo", "spec/tcejbo/inspect_spec.rb")
|
|
238
|
+
@script.create_file("spec/tcejbo", "Object", "inspect", "Object#inspect")
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
it "calls #write_spec with the file, method name" do
|
|
242
|
+
@script.should_receive(:write_spec).with(
|
|
243
|
+
"spec/tcejbo/inspect_spec.rb", "Object#inspect", false)
|
|
244
|
+
@script.create_file("spec/tcejbo", "Object", "inspect", "Object#inspect")
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
describe MkSpec, "#run" do
|
|
249
|
+
before :each do
|
|
250
|
+
@options = OptionParser.new
|
|
251
|
+
OptionParser.stub!(:new).and_return(@options)
|
|
252
|
+
|
|
253
|
+
@map = NameMap.new
|
|
254
|
+
NameMap.stub!(:new).and_return(@map)
|
|
255
|
+
|
|
256
|
+
@script = MkSpec.new
|
|
257
|
+
@script.stub!(:create_directory).and_return("spec/mkspec")
|
|
258
|
+
@script.stub!(:create_file)
|
|
259
|
+
@script.config[:constants] = [MkSpec]
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
it "loads files in the requires list" do
|
|
263
|
+
@script.stub!(:require)
|
|
264
|
+
@script.should_receive(:require).with("alib")
|
|
265
|
+
@script.should_receive(:require).with("blib")
|
|
266
|
+
@script.config[:requires] = ["alib", "blib"]
|
|
267
|
+
@script.run
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
it "creates a map of constants to methods" do
|
|
271
|
+
@map.should_receive(:map).with({}, @script.config[:constants]).and_return({})
|
|
272
|
+
@script.run
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
it "creates a map of Object.constants if not constants are specified" do
|
|
276
|
+
@script.config[:constants] = []
|
|
277
|
+
Object.stub!(:constants).and_return(["Object"])
|
|
278
|
+
@map.should_receive(:filter).with(["Object"]).and_return(["Object"])
|
|
279
|
+
@map.should_receive(:map).with({}, ["Object"]).and_return({})
|
|
280
|
+
@script.run
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
it "calls #create_directory for each class/module in the map" do
|
|
284
|
+
@script.should_receive(:create_directory).with("MkSpec").twice
|
|
285
|
+
@script.run
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
it "calls #create_file for each method on each class/module in the map" do
|
|
289
|
+
@map.should_receive(:map).with({}, @script.config[:constants]).and_return({"MkSpec#" => "run"})
|
|
290
|
+
@script.should_receive(:create_file).with("spec/mkspec", "MkSpec", "run", "MkSpec#run")
|
|
291
|
+
@script.run
|
|
292
|
+
end
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
describe MkSpec, ".main" do
|
|
296
|
+
before :each do
|
|
297
|
+
@script = mock("MkSpec", :null_object => true)
|
|
298
|
+
MkSpec.stub!(:new).and_return(@script)
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
it "sets MSPEC_RUNNER = '1' in the environment" do
|
|
302
|
+
ENV["MSPEC_RUNNER"] = "0"
|
|
303
|
+
MkSpec.main
|
|
304
|
+
ENV["MSPEC_RUNNER"].should == "1"
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
it "creates an instance of MSpecScript" do
|
|
308
|
+
MkSpec.should_receive(:new).and_return(@script)
|
|
309
|
+
MkSpec.main
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
it "calls the #options method on the script" do
|
|
313
|
+
@script.should_receive(:options)
|
|
314
|
+
MkSpec.main
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
it "calls the #run method on the script" do
|
|
318
|
+
@script.should_receive(:run)
|
|
319
|
+
MkSpec.main
|
|
320
|
+
end
|
|
321
|
+
end
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
|
2
|
+
require 'mspec/runner/mspec'
|
|
3
|
+
require 'mspec/runner/filters/tag'
|
|
4
|
+
require 'mspec/commands/mspec-ci'
|
|
5
|
+
|
|
6
|
+
describe MSpecCI, "#options" do
|
|
7
|
+
before :each do
|
|
8
|
+
@options, @config = new_option
|
|
9
|
+
MSpecOptions.stub!(:new).and_return(@options)
|
|
10
|
+
|
|
11
|
+
@script = MSpecCI.new
|
|
12
|
+
@script.stub!(:config).and_return(@config)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "enables the config option" do
|
|
16
|
+
@options.should_receive(:add_config)
|
|
17
|
+
@script.options
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "provides a custom action (block) to the config option" do
|
|
21
|
+
@script.should_receive(:load).with("cfg.mspec")
|
|
22
|
+
@script.options ["-B", "cfg.mspec"]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "enables the name option" do
|
|
26
|
+
@options.should_receive(:add_name)
|
|
27
|
+
@script.options
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "enables the tags dir option" do
|
|
31
|
+
@options.should_receive(:add_tags_dir)
|
|
32
|
+
@script.options
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "enables the dry run option" do
|
|
36
|
+
@options.should_receive(:add_pretend)
|
|
37
|
+
@script.options
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "enables the interrupt single specs option" do
|
|
41
|
+
@options.should_receive(:add_interrupt)
|
|
42
|
+
@script.options
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "enables the formatter options" do
|
|
46
|
+
@options.should_receive(:add_formatters)
|
|
47
|
+
@script.options
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "enables the verbose option" do
|
|
51
|
+
@options.should_receive(:add_verbose)
|
|
52
|
+
@script.options
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it "enables the action options" do
|
|
56
|
+
@options.should_receive(:add_actions)
|
|
57
|
+
@script.options
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it "enables the action filter options" do
|
|
61
|
+
@options.should_receive(:add_action_filters)
|
|
62
|
+
@script.options
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "enables the version option" do
|
|
66
|
+
@options.should_receive(:add_version)
|
|
67
|
+
@script.options
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "enables the help option" do
|
|
71
|
+
@options.should_receive(:add_help)
|
|
72
|
+
@script.options
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
describe MSpecCI, "#run" do
|
|
77
|
+
before :each do
|
|
78
|
+
MSpec.stub!(:process)
|
|
79
|
+
|
|
80
|
+
@filter = mock("TagFilter")
|
|
81
|
+
TagFilter.stub!(:new).and_return(@filter)
|
|
82
|
+
@filter.stub!(:register)
|
|
83
|
+
|
|
84
|
+
stat = mock("stat")
|
|
85
|
+
stat.stub!(:file?).and_return(true)
|
|
86
|
+
stat.stub!(:directory?).and_return(false)
|
|
87
|
+
File.stub!(:expand_path)
|
|
88
|
+
File.stub!(:stat).and_return(stat)
|
|
89
|
+
|
|
90
|
+
@config = { :ci_files => ["one", "two"] }
|
|
91
|
+
@script = MSpecCI.new
|
|
92
|
+
@script.stub!(:exit)
|
|
93
|
+
@script.stub!(:config).and_return(@config)
|
|
94
|
+
@script.options
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it "registers the tags directory path" do
|
|
98
|
+
@config[:tags_dir] = "tags_dir"
|
|
99
|
+
MSpec.should_receive(:register_tags_path).with("tags_dir")
|
|
100
|
+
@script.run
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it "registers the files to process" do
|
|
104
|
+
MSpec.should_receive(:register_files).with(["one", "two"])
|
|
105
|
+
@script.run
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it "registers a tag filter for 'fails'" do
|
|
109
|
+
filter = mock("fails filter")
|
|
110
|
+
TagFilter.should_receive(:new).with(:exclude, 'fails').and_return(filter)
|
|
111
|
+
filter.should_receive(:register)
|
|
112
|
+
@script.run
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
it "registers a tag filter for 'unstable'" do
|
|
116
|
+
filter = mock("unstable filter")
|
|
117
|
+
TagFilter.should_receive(:new).with(:exclude, 'unstable').and_return(filter)
|
|
118
|
+
filter.should_receive(:register)
|
|
119
|
+
@script.run
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
it "registers a tag filter for 'incomplete'" do
|
|
123
|
+
filter = mock("incomplete filter")
|
|
124
|
+
TagFilter.should_receive(:new).with(:exclude, 'incomplete').and_return(filter)
|
|
125
|
+
filter.should_receive(:register)
|
|
126
|
+
@script.run
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
it "processes the files" do
|
|
130
|
+
MSpec.should_receive(:process)
|
|
131
|
+
@script.run
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
it "exits with the exit code registered with MSpec" do
|
|
135
|
+
MSpec.stub!(:exit_code).and_return(7)
|
|
136
|
+
@script.should_receive(:exit).with(7)
|
|
137
|
+
@script.run
|
|
138
|
+
end
|
|
139
|
+
end
|