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,80 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
$:.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
|
|
4
|
+
|
|
5
|
+
require 'optparse'
|
|
6
|
+
require 'mspec/utils/options'
|
|
7
|
+
require 'mspec/utils/script'
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class MSpecRun < MSpecScript
|
|
11
|
+
def options(argv=ARGV)
|
|
12
|
+
options = MSpecOptions.new config, "run", "", 28, " "
|
|
13
|
+
|
|
14
|
+
options.separator " Ask yourself:"
|
|
15
|
+
options.separator " 1. What specs to run?"
|
|
16
|
+
options.separator " 2. How to modify the execution?"
|
|
17
|
+
options.separator " 3. How to display the output?"
|
|
18
|
+
options.separator " 4. What action to perform?"
|
|
19
|
+
options.separator " 5. When to perform it?"
|
|
20
|
+
|
|
21
|
+
options.separator "\n What specs to run"
|
|
22
|
+
options.add_filters
|
|
23
|
+
|
|
24
|
+
options.separator "\n How to modify the execution"
|
|
25
|
+
options.add_config { |f| load f }
|
|
26
|
+
options.add_name
|
|
27
|
+
options.add_tags_dir
|
|
28
|
+
options.add_randomize
|
|
29
|
+
options.add_pretend
|
|
30
|
+
options.add_interrupt
|
|
31
|
+
|
|
32
|
+
options.separator "\n How to display their output"
|
|
33
|
+
options.add_formatters
|
|
34
|
+
options.add_verbose
|
|
35
|
+
|
|
36
|
+
options.separator "\n What action to perform"
|
|
37
|
+
options.add_actions
|
|
38
|
+
options.add_verify
|
|
39
|
+
|
|
40
|
+
options.separator "\n When to perform it"
|
|
41
|
+
options.add_action_filters
|
|
42
|
+
|
|
43
|
+
options.separator "\n Help!"
|
|
44
|
+
options.add_version
|
|
45
|
+
options.add_help
|
|
46
|
+
|
|
47
|
+
options.separator "\n How might this work in the real world?"
|
|
48
|
+
options.separator "\n 1. To simply run some specs"
|
|
49
|
+
options.separator "\n $ mspec path/to/the/specs"
|
|
50
|
+
options.separator " mspec path/to/the_file_spec.rb"
|
|
51
|
+
options.separator "\n 2. To run specs tagged with 'fails'"
|
|
52
|
+
options.separator "\n $ mspec -g fails path/to/the_file_spec.rb"
|
|
53
|
+
options.separator "\n 3. To start the debugger before the spec matching 'this crashes'"
|
|
54
|
+
options.separator "\n $ mspec --spec-debug -S 'this crashes' path/to/the_file_spec.rb"
|
|
55
|
+
options.separator ""
|
|
56
|
+
|
|
57
|
+
@patterns = options.parse argv
|
|
58
|
+
if @patterns.empty?
|
|
59
|
+
puts options.parser
|
|
60
|
+
puts "No files specified."
|
|
61
|
+
exit 1
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def run
|
|
66
|
+
files = []
|
|
67
|
+
@patterns.each do |item|
|
|
68
|
+
stat = File.stat(File.expand_path(item))
|
|
69
|
+
files << item if stat.file?
|
|
70
|
+
files.concat(Dir[item+"/**/*_spec.rb"].sort) if stat.directory?
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
MSpec.register_tags_path config[:tags_dir]
|
|
74
|
+
MSpec.register_files files
|
|
75
|
+
|
|
76
|
+
MSpec.process
|
|
77
|
+
exit MSpec.exit_code
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'optparse'
|
|
4
|
+
require 'mspec/utils/options'
|
|
5
|
+
require 'mspec/utils/script'
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class MSpecTag < MSpecScript
|
|
9
|
+
def initialize
|
|
10
|
+
super
|
|
11
|
+
|
|
12
|
+
config[:tagger] = :add
|
|
13
|
+
config[:tag] = 'fails:'
|
|
14
|
+
config[:outcome] = :fail
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def options(argv=ARGV)
|
|
18
|
+
options = MSpecOptions.new config, "tag", "", 28, " "
|
|
19
|
+
|
|
20
|
+
options.separator " Ask yourself:"
|
|
21
|
+
options.separator " 1. What specs to run?"
|
|
22
|
+
options.separator " 2. How to modify the execution?"
|
|
23
|
+
options.separator " 3. How to display the output?"
|
|
24
|
+
options.separator " 4. What tag action to perform?"
|
|
25
|
+
options.separator " 5. When to perform it?"
|
|
26
|
+
|
|
27
|
+
options.separator "\n What specs to run"
|
|
28
|
+
options.add_filters
|
|
29
|
+
|
|
30
|
+
options.separator "\n How to modify the execution"
|
|
31
|
+
options.add_config { |f| load f }
|
|
32
|
+
options.add_name
|
|
33
|
+
options.add_tags_dir
|
|
34
|
+
options.add_pretend
|
|
35
|
+
options.add_interrupt
|
|
36
|
+
|
|
37
|
+
options.separator "\n How to display their output"
|
|
38
|
+
options.add_formatters
|
|
39
|
+
options.add_verbose
|
|
40
|
+
|
|
41
|
+
options.separator "\n What action to perform and when to perform it"
|
|
42
|
+
options.add_tagging
|
|
43
|
+
|
|
44
|
+
options.separator "\n Help!"
|
|
45
|
+
options.add_version
|
|
46
|
+
options.add_help
|
|
47
|
+
|
|
48
|
+
options.separator "\n How might this work in the real world?"
|
|
49
|
+
options.separator "\n 1. To add the 'fails' tag to failing specs"
|
|
50
|
+
options.separator "\n $ mspec tag path/to/the_file_spec.rb"
|
|
51
|
+
options.separator "\n 2. To remove the 'fails' tag from passing specs"
|
|
52
|
+
options.separator "\n $ mspec tag --del fails path/to/the_file_spec.rb"
|
|
53
|
+
options.separator ""
|
|
54
|
+
|
|
55
|
+
@patterns = options.parse argv
|
|
56
|
+
if @patterns.empty?
|
|
57
|
+
puts options.parser
|
|
58
|
+
puts "No files specified."
|
|
59
|
+
exit 1
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def register
|
|
64
|
+
super
|
|
65
|
+
|
|
66
|
+
tag = SpecTag.new config[:tag]
|
|
67
|
+
tagger = TagAction.new(config[:tagger], config[:outcome], tag.tag, tag.comment,
|
|
68
|
+
config[:atags], config[:astrings])
|
|
69
|
+
tagger.register
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def run
|
|
73
|
+
files = []
|
|
74
|
+
@patterns.each do |item|
|
|
75
|
+
stat = File.stat(File.expand_path(item))
|
|
76
|
+
files << item if stat.file?
|
|
77
|
+
files.concat(Dir[item+"/**/*_spec.rb"].sort) if stat.directory?
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
MSpec.register_tags_path config[:tags_dir]
|
|
81
|
+
MSpec.register_files files
|
|
82
|
+
|
|
83
|
+
MSpec.process
|
|
84
|
+
exit MSpec.exit_code
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
MSPEC_HOME = File.expand_path(File.dirname(__FILE__) + '/../../..')
|
|
4
|
+
|
|
5
|
+
require 'optparse'
|
|
6
|
+
require 'mspec/utils/options'
|
|
7
|
+
require 'mspec/utils/script'
|
|
8
|
+
require 'mspec/helpers/tmp'
|
|
9
|
+
require 'mspec/runner/actions/timer'
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class MSpecMain < MSpecScript
|
|
13
|
+
def initialize
|
|
14
|
+
config[:includes] = []
|
|
15
|
+
config[:requires] = []
|
|
16
|
+
config[:target] = ENV['RUBY'] || 'ruby'
|
|
17
|
+
config[:flags] = []
|
|
18
|
+
config[:command] = nil
|
|
19
|
+
config[:options] = []
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def options(argv=ARGV)
|
|
23
|
+
if ["ci", "run", "tag"].include? argv[0]
|
|
24
|
+
config[:command] = argv.shift
|
|
25
|
+
config[:options] << "-h" if argv.delete("-h") || argv.delete("--help")
|
|
26
|
+
config[:options] << "-v" if argv.delete("-v") || argv.delete("--version")
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
options = MSpecOptions.new config, "[COMMAND]", "", 28, " "
|
|
30
|
+
|
|
31
|
+
options.separator ""
|
|
32
|
+
options.separator " The mspec command sets up and invokes the sub-commands"
|
|
33
|
+
options.separator " (see below) to enable, for instance, running the specs"
|
|
34
|
+
options.separator " with different implementations like ruby, jruby, rbx, etc.\n"
|
|
35
|
+
|
|
36
|
+
options.add_config do |f|
|
|
37
|
+
config[:options] << '-B' << f
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
options.add_targets
|
|
41
|
+
|
|
42
|
+
options.on("-D", "--gdb", "Run under gdb") do
|
|
43
|
+
config[:flags] << '--gdb'
|
|
44
|
+
end
|
|
45
|
+
options.on("-A", "--valgrind", "Run under valgrind") do
|
|
46
|
+
config[:flags] << '--valgrind'
|
|
47
|
+
end
|
|
48
|
+
options.on("--warnings", "Don't supress warnings") do
|
|
49
|
+
config[:flags] << '-w'
|
|
50
|
+
ENV['OUTPUT_WARNINGS'] = '1'
|
|
51
|
+
end
|
|
52
|
+
options.on("-j", "--multi", "Run multiple (possibly parallel) subprocesses") do
|
|
53
|
+
config[:multi] = true
|
|
54
|
+
config[:options] << "-fy"
|
|
55
|
+
end
|
|
56
|
+
options.add_version
|
|
57
|
+
options.on("-h", "--help", "Show this message") do
|
|
58
|
+
puts options.parser
|
|
59
|
+
exit
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# The rest of the help output
|
|
63
|
+
options.separator "\n where COMMAND is one of:\n"
|
|
64
|
+
options.separator " run - Run the specified specs (default)"
|
|
65
|
+
options.separator " ci - Run the known good specs"
|
|
66
|
+
options.separator " tag - Add or remove tags\n"
|
|
67
|
+
options.separator " mspec COMMAND -h for more options\n"
|
|
68
|
+
|
|
69
|
+
config[:options] += options.parser.filter! argv
|
|
70
|
+
options.parse argv
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def register; end
|
|
74
|
+
|
|
75
|
+
def parallel
|
|
76
|
+
@parallel ||= !(Object.const_defined?(:JRUBY_VERSION) ||
|
|
77
|
+
/(mswin|mingw)/ =~ RUBY_PLATFORM)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def fork(&block)
|
|
81
|
+
parallel ? Kernel.fork(&block) : block.call
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def report(files, timer)
|
|
85
|
+
require 'yaml'
|
|
86
|
+
|
|
87
|
+
exceptions = []
|
|
88
|
+
tally = Tally.new
|
|
89
|
+
|
|
90
|
+
files.each do |file|
|
|
91
|
+
d = File.open(file, "r") { |f| YAML.load f }
|
|
92
|
+
File.delete file
|
|
93
|
+
|
|
94
|
+
exceptions += Array(d['exceptions'])
|
|
95
|
+
tally.files! d['files']
|
|
96
|
+
tally.examples! d['examples']
|
|
97
|
+
tally.expectations! d['expectations']
|
|
98
|
+
tally.errors! d['errors']
|
|
99
|
+
tally.failures! d['failures']
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
print "\n"
|
|
103
|
+
exceptions.each_with_index do |exc, index|
|
|
104
|
+
print "\n#{index+1})\n", exc, "\n"
|
|
105
|
+
end
|
|
106
|
+
print "\n#{timer.format}\n\n#{tally.format}\n"
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def multi_exec(argv)
|
|
110
|
+
timer = TimerAction.new
|
|
111
|
+
timer.start
|
|
112
|
+
|
|
113
|
+
files = config[:ci_files].inject([]) do |list, item|
|
|
114
|
+
name = tmp "mspec-ci-multi-#{list.size}"
|
|
115
|
+
|
|
116
|
+
rest = argv + ["-o", name, item]
|
|
117
|
+
fork { system [config[:target], *rest].join(" ") }
|
|
118
|
+
|
|
119
|
+
list << name
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
Process.waitall
|
|
123
|
+
timer.finish
|
|
124
|
+
report files, timer
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def run
|
|
128
|
+
ENV['MSPEC_RUNNER'] = '1'
|
|
129
|
+
|
|
130
|
+
argv = config[:flags]
|
|
131
|
+
argv.concat config[:includes]
|
|
132
|
+
argv.concat config[:requires]
|
|
133
|
+
argv << "#{MSPEC_HOME}/bin/mspec-#{ config[:command] || "run" }"
|
|
134
|
+
argv.concat config[:options]
|
|
135
|
+
|
|
136
|
+
if config[:multi] and config[:command] == "ci"
|
|
137
|
+
multi_exec argv
|
|
138
|
+
else
|
|
139
|
+
exec config[:target], *argv
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
class ExpectationNotMetError < StandardError; end
|
|
2
|
+
|
|
3
|
+
class Expectation
|
|
4
|
+
def self.fail_with(expected, actual)
|
|
5
|
+
if expected.to_s.size + actual.to_s.size > 80
|
|
6
|
+
message = expected.to_s.chomp + "\n" + actual.to_s
|
|
7
|
+
else
|
|
8
|
+
message = expected.to_s + " " + actual.to_s
|
|
9
|
+
end
|
|
10
|
+
Kernel.raise ExpectationNotMetError, message
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
class Object
|
|
2
|
+
def should(matcher=nil)
|
|
3
|
+
MSpec.actions :expectation, MSpec.current.state
|
|
4
|
+
if matcher
|
|
5
|
+
unless matcher.matches?(self)
|
|
6
|
+
Expectation.fail_with(*matcher.failure_message)
|
|
7
|
+
end
|
|
8
|
+
else
|
|
9
|
+
PositiveOperatorMatcher.new(self)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def should_not(matcher=nil)
|
|
14
|
+
MSpec.actions :expectation, MSpec.current.state
|
|
15
|
+
if matcher
|
|
16
|
+
if matcher.matches?(self)
|
|
17
|
+
Expectation.fail_with(*matcher.negative_failure_message)
|
|
18
|
+
end
|
|
19
|
+
else
|
|
20
|
+
NegativeOperatorMatcher.new(self)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
data/lib/mspec/guards.rb
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
require 'mspec/guards/bug'
|
|
2
|
+
require 'mspec/guards/compliance'
|
|
3
|
+
require 'mspec/guards/extensions'
|
|
4
|
+
require 'mspec/guards/guard'
|
|
5
|
+
require 'mspec/guards/noncompliance'
|
|
6
|
+
require 'mspec/guards/platform'
|
|
7
|
+
require 'mspec/guards/quarantine'
|
|
8
|
+
require 'mspec/guards/runner'
|
|
9
|
+
require 'mspec/guards/support'
|
|
10
|
+
require 'mspec/guards/endian'
|
|
11
|
+
require 'mspec/guards/superuser'
|
|
12
|
+
require 'mspec/guards/conflict'
|
|
13
|
+
require 'mspec/guards/version'
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require 'mspec/guards/version'
|
|
2
|
+
|
|
3
|
+
class BugGuard < VersionGuard
|
|
4
|
+
def initialize(bug, version)
|
|
5
|
+
@bug = bug
|
|
6
|
+
@version = to_v version
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def to_v(str)
|
|
10
|
+
major, minor, tiny, patch = str.split "."
|
|
11
|
+
tiny = 99 unless tiny
|
|
12
|
+
patch = 9999 unless patch
|
|
13
|
+
("1%02d%02d%02d%04d" % [major, minor, tiny, patch].map { |x| x.to_i }).to_i
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def match?
|
|
17
|
+
implementation?(:ruby, :ruby18, :ruby19) && ruby_version <= @version
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
class Object
|
|
22
|
+
def ruby_bug(bug="Please add a bug tracker number", version="0")
|
|
23
|
+
g = BugGuard.new bug, version
|
|
24
|
+
yield if g.yield? true
|
|
25
|
+
g.unregister
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'mspec/guards/guard'
|
|
2
|
+
|
|
3
|
+
class ComplianceGuard < SpecGuard
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
class Object
|
|
7
|
+
def compliant_on(*args)
|
|
8
|
+
g = ComplianceGuard.new(*args)
|
|
9
|
+
yield if g.yield?
|
|
10
|
+
g.unregister
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def not_compliant_on(*args)
|
|
14
|
+
g = ComplianceGuard.new(*args)
|
|
15
|
+
yield if g.yield? true
|
|
16
|
+
g.unregister
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
require 'mspec/guards/guard'
|
|
2
|
+
|
|
3
|
+
class ConflictsGuard < SpecGuard
|
|
4
|
+
def match?
|
|
5
|
+
constants = Object.constants
|
|
6
|
+
@args.any? { |mod| constants.include? mod.to_s }
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class Object
|
|
11
|
+
def conflicts_with(*modules)
|
|
12
|
+
g = ConflictsGuard.new(*modules)
|
|
13
|
+
yield if g.yield? true
|
|
14
|
+
g.unregister
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
require 'mspec/guards/guard'
|
|
2
|
+
|
|
3
|
+
# Despite that these are inverses, the two classes are
|
|
4
|
+
# used to simplify MSpec guard reporting modes
|
|
5
|
+
|
|
6
|
+
class BigEndianGuard < SpecGuard
|
|
7
|
+
def pattern
|
|
8
|
+
[1].pack('L')
|
|
9
|
+
end
|
|
10
|
+
private :pattern
|
|
11
|
+
|
|
12
|
+
def match?
|
|
13
|
+
pattern[-1] == 1
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
class LittleEndianGuard < SpecGuard
|
|
18
|
+
def pattern
|
|
19
|
+
[1].pack('L')
|
|
20
|
+
end
|
|
21
|
+
private :pattern
|
|
22
|
+
|
|
23
|
+
def match?
|
|
24
|
+
pattern[-1] == 0
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
class Object
|
|
29
|
+
def big_endian
|
|
30
|
+
g = BigEndianGuard.new
|
|
31
|
+
yield if g.yield?
|
|
32
|
+
g.unregister
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def little_endian
|
|
36
|
+
g = LittleEndianGuard.new
|
|
37
|
+
yield if g.yield?
|
|
38
|
+
g.unregister
|
|
39
|
+
end
|
|
40
|
+
end
|