lemon 0.8.1 → 0.8.2
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY.rdoc +15 -0
- data/README.rdoc +32 -14
- data/bin/lemon +3 -2
- data/demo/case_example_fail.rb +15 -0
- data/demo/case_example_pass.rb +32 -0
- data/demo/case_example_pending.rb +14 -0
- data/demo/case_example_untested.rb +10 -0
- data/demo/fixture/example-use.rb +5 -0
- data/demo/fixture/example.rb +20 -0
- data/lib/lemon.rb +2 -2
- data/lib/lemon/cli.rb +281 -0
- data/lib/lemon/controller/coverage_analyzer.rb +343 -0
- data/lib/lemon/controller/scaffold_generator.rb +110 -0
- data/lib/lemon/controller/test_runner.rb +284 -0
- data/lib/lemon/meta/data.rb +29 -0
- data/lib/lemon/meta/gemfile +24 -0
- data/{PROFILE → lib/lemon/meta/profile} +6 -5
- data/lib/lemon/model/ae.rb +4 -0
- data/lib/lemon/model/cover_unit.rb +75 -0
- data/lib/lemon/{dsl.rb → model/main.rb} +22 -28
- data/lib/lemon/model/pending.rb +10 -0
- data/lib/lemon/model/snapshot.rb +203 -0
- data/lib/lemon/model/source_parser.rb +198 -0
- data/lib/lemon/model/test_case.rb +221 -0
- data/lib/lemon/model/test_context.rb +90 -0
- data/lib/lemon/model/test_suite.rb +216 -0
- data/lib/lemon/{test/unit.rb → model/test_unit.rb} +40 -28
- data/lib/lemon/{coversheet → view/cover_reports}/abstract.rb +19 -20
- data/lib/lemon/view/cover_reports/compact.rb +37 -0
- data/lib/lemon/view/cover_reports/outline.rb +45 -0
- data/lib/lemon/view/cover_reports/verbose.rb +51 -0
- data/lib/lemon/view/cover_reports/yaml.rb +15 -0
- data/lib/lemon/view/test_reports/abstract.rb +149 -0
- data/lib/lemon/view/test_reports/dotprogress.rb +73 -0
- data/lib/lemon/view/test_reports/html.rb +146 -0
- data/lib/lemon/view/test_reports/outline.rb +118 -0
- data/lib/lemon/view/test_reports/summary.rb +131 -0
- data/lib/lemon/view/test_reports/tap.rb +49 -0
- data/lib/lemon/view/test_reports/verbose.rb +197 -0
- data/meta/data.rb +29 -0
- data/meta/gemfile +24 -0
- data/meta/profile +17 -0
- data/test/api/applique/fs.rb +18 -0
- data/test/api/coverage/complete.rdoc +136 -0
- data/test/api/coverage/extensions.rdoc +61 -0
- data/test/api/coverage/incomplete.rdoc +97 -0
- data/{features → test/cli}/coverage.feature +4 -4
- data/{features → test/cli}/generate.feature +2 -2
- data/{features → test/cli}/step_definitions/coverage_steps.rb +0 -0
- data/{features → test/cli}/support/ae.rb +0 -0
- data/{features → test/cli}/support/aruba.rb +0 -0
- data/{features → test/cli}/test.feature +0 -0
- data/test/fixtures/case_complete.rb +17 -4
- data/test/fixtures/case_inclusion.rb +18 -0
- data/test/fixtures/case_incomplete.rb +4 -4
- data/test/fixtures/example.rb +5 -0
- data/test/fixtures/helper.rb +13 -0
- data/test/runner +3 -0
- data/test/unit/case_coverage_analyzer.rb +25 -0
- data/test/unit/case_test_case_dsl.rb +46 -0
- metadata +87 -42
- data/REQUIRE +0 -9
- data/VERSION +0 -6
- data/lib/lemon/command.rb +0 -184
- data/lib/lemon/coverage.rb +0 -260
- data/lib/lemon/coversheet/outline.rb +0 -47
- data/lib/lemon/kernel.rb +0 -24
- data/lib/lemon/reporter.rb +0 -22
- data/lib/lemon/reporter/abstract.rb +0 -97
- data/lib/lemon/reporter/dotprogress.rb +0 -68
- data/lib/lemon/reporter/outline.rb +0 -105
- data/lib/lemon/reporter/verbose.rb +0 -143
- data/lib/lemon/runner.rb +0 -308
- data/lib/lemon/snapshot.rb +0 -185
- data/lib/lemon/test/case.rb +0 -139
- data/lib/lemon/test/concern.rb +0 -52
- data/lib/lemon/test/suite.rb +0 -229
- data/test/case_coverage.rb +0 -26
- data/test/case_testcase.rb +0 -58
@@ -0,0 +1,203 @@
|
|
1
|
+
module Lemon
|
2
|
+
|
3
|
+
# Snapshot is used to record the "unit picture" of the system
|
4
|
+
# at a given moment.
|
5
|
+
class Snapshot
|
6
|
+
|
7
|
+
include Enumerable
|
8
|
+
|
9
|
+
#
|
10
|
+
def self.capture(namespaces=nil)
|
11
|
+
o = new
|
12
|
+
o.capture(namespaces)
|
13
|
+
o
|
14
|
+
end
|
15
|
+
|
16
|
+
#
|
17
|
+
attr :units
|
18
|
+
|
19
|
+
#
|
20
|
+
def initialize(units=[])
|
21
|
+
@units = units
|
22
|
+
end
|
23
|
+
|
24
|
+
#
|
25
|
+
def each(&block)
|
26
|
+
units.each(&block)
|
27
|
+
end
|
28
|
+
|
29
|
+
#
|
30
|
+
def size
|
31
|
+
@units.size
|
32
|
+
end
|
33
|
+
|
34
|
+
#
|
35
|
+
def reset
|
36
|
+
each{ |u| u.covered = false }
|
37
|
+
end
|
38
|
+
|
39
|
+
# Select units by namespace (i.e. module or class).
|
40
|
+
#def [](mod)
|
41
|
+
# @units.select{ |u| u.namespace == mod }
|
42
|
+
#end
|
43
|
+
|
44
|
+
#
|
45
|
+
def capture(namespaces=nil)
|
46
|
+
@units = []
|
47
|
+
ObjectSpace.each_object(Module) do |mod|
|
48
|
+
next if mod.name.empty?
|
49
|
+
#next if namespaces and !namespaces.any?{ |ns| /^#{ns}(::|$)/ =~ mod.to_s }
|
50
|
+
next if namespaces and !namespaces.any?{ |ns| ns.to_s == mod.to_s }
|
51
|
+
capture_namespace(mod)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
#
|
56
|
+
def capture_namespace(mod)
|
57
|
+
['', 'protected_', 'private_'].each do |access|
|
58
|
+
methods = mod.__send__("#{access}instance_methods", false)
|
59
|
+
#methods -= Object.__send__("#{access}instance_methods", true)
|
60
|
+
methods.each do |method|
|
61
|
+
@units << Unit.new(mod, method, :access=>access)
|
62
|
+
end
|
63
|
+
|
64
|
+
methods = mod.__send__("#{access}methods", false)
|
65
|
+
#methods -= Object.__send__("#{access}methods", true)
|
66
|
+
methods.each do |method|
|
67
|
+
@units << Unit.new(mod, method, :access=>access, :function=>true)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
return @units
|
71
|
+
end
|
72
|
+
|
73
|
+
#
|
74
|
+
def to_a
|
75
|
+
@units
|
76
|
+
end
|
77
|
+
|
78
|
+
#
|
79
|
+
def public_units
|
80
|
+
@units.select{ |u| u.public? }
|
81
|
+
end
|
82
|
+
|
83
|
+
#
|
84
|
+
def -(other)
|
85
|
+
Snapshot.new(units - other.units)
|
86
|
+
end
|
87
|
+
|
88
|
+
#
|
89
|
+
def +(other)
|
90
|
+
Snapshot.new(units + other.units)
|
91
|
+
end
|
92
|
+
|
93
|
+
#
|
94
|
+
def <<(other)
|
95
|
+
@units.concat(other.units)
|
96
|
+
end
|
97
|
+
|
98
|
+
# Snapshot Unit encapsulates a method and it's various characteristics.
|
99
|
+
class Unit
|
100
|
+
|
101
|
+
# Clsss or module.
|
102
|
+
attr :target
|
103
|
+
|
104
|
+
# Method name.
|
105
|
+
attr :method
|
106
|
+
|
107
|
+
# Is the method a "class method", rather than an instance method.
|
108
|
+
attr :function
|
109
|
+
|
110
|
+
def initialize(target, method, props={})
|
111
|
+
@target = target
|
112
|
+
@method = method.to_sym
|
113
|
+
@function = props[:function] ? true : false
|
114
|
+
@covered = props[:covered]
|
115
|
+
|
116
|
+
if @function
|
117
|
+
@private = @target.private_methods.find{ |m| m.to_sym == @method }
|
118
|
+
@protected = @target.protected_methods.find{ |m| m.to_sym == @method }
|
119
|
+
else
|
120
|
+
@private = @target.private_instance_methods.find{ |m| m.to_sym == @method }
|
121
|
+
@protected = @target.protected_instance_methods.find{ |m| m.to_sym == @method }
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
# Can be used to flag a unit as covered.
|
126
|
+
attr_accessor :covered
|
127
|
+
|
128
|
+
# Alternate name for target.
|
129
|
+
def namespace
|
130
|
+
@target
|
131
|
+
end
|
132
|
+
|
133
|
+
#
|
134
|
+
def function?
|
135
|
+
@function
|
136
|
+
end
|
137
|
+
|
138
|
+
# Method access is public?
|
139
|
+
def public?
|
140
|
+
!(@private or @protected)
|
141
|
+
end
|
142
|
+
|
143
|
+
# Method access is public?
|
144
|
+
def private?
|
145
|
+
@private
|
146
|
+
end
|
147
|
+
|
148
|
+
#
|
149
|
+
def protected?
|
150
|
+
@protected
|
151
|
+
end
|
152
|
+
|
153
|
+
#
|
154
|
+
def access
|
155
|
+
return :private if private?
|
156
|
+
return :protected if protected?
|
157
|
+
:public
|
158
|
+
end
|
159
|
+
|
160
|
+
# Marked as covered?
|
161
|
+
def covered?
|
162
|
+
@covered
|
163
|
+
end
|
164
|
+
|
165
|
+
#
|
166
|
+
def hash
|
167
|
+
@target.hash ^ @method.hash ^ @function.hash
|
168
|
+
end
|
169
|
+
|
170
|
+
#
|
171
|
+
def to_s
|
172
|
+
if @function
|
173
|
+
"#{@target}.#{@method}"
|
174
|
+
else
|
175
|
+
"#{@target}##{@method}"
|
176
|
+
end
|
177
|
+
end
|
178
|
+
alias to_str to_s
|
179
|
+
|
180
|
+
def eql?(other)
|
181
|
+
return false unless Unit === other
|
182
|
+
return false unless target == other.target
|
183
|
+
return false unless method == other.method
|
184
|
+
return false unless function == other.function
|
185
|
+
return true
|
186
|
+
end
|
187
|
+
|
188
|
+
def inspect
|
189
|
+
"#{target}#{function ? '.' : '#'}#{method}"
|
190
|
+
end
|
191
|
+
|
192
|
+
def <=>(other)
|
193
|
+
c = (target.name <=> other.target.name)
|
194
|
+
return c unless c == 0
|
195
|
+
return -1 if function && !other.function
|
196
|
+
return 1 if !function && other.function
|
197
|
+
method.to_s <=> other.method.to_s
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
end
|
202
|
+
|
203
|
+
end
|
@@ -0,0 +1,198 @@
|
|
1
|
+
module Lemon
|
2
|
+
|
3
|
+
require 'ruby_parser'
|
4
|
+
|
5
|
+
#
|
6
|
+
class SourceParser
|
7
|
+
# Converts Ruby code into a data structure.
|
8
|
+
#
|
9
|
+
# text - A String of Ruby code.
|
10
|
+
#
|
11
|
+
# Returns a Hash with each key a namespace and each value another
|
12
|
+
# Hash or a TomDoc::Scope.
|
13
|
+
def self.parse(text)
|
14
|
+
new.parse(text)
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_accessor :parser, :scopes, :options
|
18
|
+
|
19
|
+
# Each instance of SourceParser accumulates scopes with each
|
20
|
+
# parse, making it easy to parse an entire project in chunks but
|
21
|
+
# more difficult to parse disparate files in one go. Create
|
22
|
+
# separate instances for separate global scopes.
|
23
|
+
#
|
24
|
+
# Returns an instance of TomDoc::SourceParser
|
25
|
+
def initialize(options = {})
|
26
|
+
@options = {}
|
27
|
+
@parser = RubyParser.new
|
28
|
+
@scopes = {}
|
29
|
+
end
|
30
|
+
|
31
|
+
# Resets the state of the parser to a pristine one. Maintains options.
|
32
|
+
#
|
33
|
+
# Returns nothing.
|
34
|
+
def reset
|
35
|
+
initialize(@options)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Converts Ruby code into a data structure. Note that at the
|
39
|
+
# instance level scopes accumulate, which makes it easy to parse
|
40
|
+
# multiple files in a single project but harder to parse files
|
41
|
+
# that have no connection.
|
42
|
+
#
|
43
|
+
# text - A String of Ruby code.
|
44
|
+
#
|
45
|
+
# Examples
|
46
|
+
# @parser = TomDoc::SourceParser.new
|
47
|
+
# files.each do |file|
|
48
|
+
# @parser.parse(File.read(file))
|
49
|
+
# end
|
50
|
+
# pp @parser.scopes
|
51
|
+
#
|
52
|
+
# Returns a Hash with each key a namespace and each value another
|
53
|
+
# Hash or a TomDoc::Scope.
|
54
|
+
def parse(text)
|
55
|
+
process(tokenize(sexp(text)))
|
56
|
+
@scopes
|
57
|
+
end
|
58
|
+
|
59
|
+
# Converts Ruby sourcecode into an AST.
|
60
|
+
#
|
61
|
+
# text - A String of Ruby source.
|
62
|
+
#
|
63
|
+
# Returns a Sexp representing the AST.
|
64
|
+
def sexp(text)
|
65
|
+
@parser.parse(text)
|
66
|
+
end
|
67
|
+
|
68
|
+
# Converts a tokenized Array of classes, modules, and methods into
|
69
|
+
# Scopes and Methods, adding them to the @scopes instance variable
|
70
|
+
# as it works.
|
71
|
+
#
|
72
|
+
# ast - Tokenized Array produced by calling `tokenize`.
|
73
|
+
# scope - An optional Scope object for nested classes or modules.
|
74
|
+
#
|
75
|
+
# Returns nothing.
|
76
|
+
def process(ast, scope = nil)
|
77
|
+
case Array(ast)[0]
|
78
|
+
when :module, :class
|
79
|
+
name = ast[1]
|
80
|
+
new_scope = Scope.new(name, ast[2])
|
81
|
+
|
82
|
+
if scope
|
83
|
+
scope.scopes[name] = new_scope
|
84
|
+
elsif @scopes[name]
|
85
|
+
new_scope = @scopes[name]
|
86
|
+
else
|
87
|
+
@scopes[name] = new_scope
|
88
|
+
end
|
89
|
+
|
90
|
+
process(ast[3], new_scope)
|
91
|
+
when :imethod
|
92
|
+
ast.shift
|
93
|
+
scope.instance_methods << Method.new(*ast)
|
94
|
+
when :cmethod
|
95
|
+
ast.shift
|
96
|
+
scope.class_methods << Method.new(*ast)
|
97
|
+
when Array
|
98
|
+
ast.map { |a| process(a, scope) }
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# Converts a Ruby AST-style Sexp into an Array of more useful tokens.
|
103
|
+
#
|
104
|
+
# node - A Ruby AST Sexp or Array
|
105
|
+
#
|
106
|
+
# Examples
|
107
|
+
#
|
108
|
+
# [:module, :Math, "",
|
109
|
+
# [:class, :Multiplexer, "# Class Comment",
|
110
|
+
# [:cmethod,
|
111
|
+
# :multiplex, "# Class Method Comment", [:text]],
|
112
|
+
# [:imethod,
|
113
|
+
# :multiplex, "# Instance Method Comment", [:text, :count]]]]
|
114
|
+
#
|
115
|
+
# # In others words:
|
116
|
+
# # [ :type, :name, :comment, other ]
|
117
|
+
#
|
118
|
+
# Returns an Array in the above format.
|
119
|
+
def tokenize(node)
|
120
|
+
case Array(node)[0]
|
121
|
+
when :module
|
122
|
+
name = node[1]
|
123
|
+
[ :module, name, node.comments, tokenize(node[2]) ]
|
124
|
+
when :class
|
125
|
+
name = node[1]
|
126
|
+
[ :class, name, node.comments, tokenize(node[3]) ]
|
127
|
+
when :defn
|
128
|
+
name = node[1]
|
129
|
+
args = args_for_node(node[2])
|
130
|
+
[ :imethod, name, node.comments, args ]
|
131
|
+
when :defs
|
132
|
+
name = node[2]
|
133
|
+
args = args_for_node(node[3])
|
134
|
+
[ :cmethod, name, node.comments, args ]
|
135
|
+
when :block
|
136
|
+
tokenize(node[1..-1])
|
137
|
+
when :scope
|
138
|
+
tokenize(node[1])
|
139
|
+
when Array
|
140
|
+
node.map { |n| tokenize(n) }.compact
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
# Given a method sexp, returns an array of the args.
|
145
|
+
def args_for_node(node)
|
146
|
+
Array(node)[1..-1].select { |arg| arg.is_a? Symbol }
|
147
|
+
end
|
148
|
+
|
149
|
+
# A Scope is a Module or Class.
|
150
|
+
# It may contain other scopes.
|
151
|
+
class Scope
|
152
|
+
include Enumerable
|
153
|
+
|
154
|
+
attr_accessor :name, :comment, :instance_methods, :class_methods
|
155
|
+
attr_accessor :scopes
|
156
|
+
|
157
|
+
def initialize(name, comment = '', instance_methods = [], class_methods = [])
|
158
|
+
@name = name
|
159
|
+
@comment = comment
|
160
|
+
@instance_methods = instance_methods
|
161
|
+
@class_methods = class_methods
|
162
|
+
@scopes = {}
|
163
|
+
end
|
164
|
+
|
165
|
+
def tomdoc
|
166
|
+
@tomdoc ||= TomDoc.new(@comment)
|
167
|
+
end
|
168
|
+
|
169
|
+
def [](scope)
|
170
|
+
@scopes[scope]
|
171
|
+
end
|
172
|
+
|
173
|
+
def keys
|
174
|
+
@scopes.keys
|
175
|
+
end
|
176
|
+
|
177
|
+
def each(&block)
|
178
|
+
@scopes.each(&block)
|
179
|
+
end
|
180
|
+
|
181
|
+
def to_s
|
182
|
+
inspect
|
183
|
+
end
|
184
|
+
|
185
|
+
def inspect
|
186
|
+
scopes = @scopes.keys.join(', ')
|
187
|
+
imethods = @instance_methods.inspect
|
188
|
+
cmethods = @class_methods.inspect
|
189
|
+
|
190
|
+
"<#{name} scopes:[#{scopes}] :#{cmethods}: ##{imethods}#>"
|
191
|
+
end
|
192
|
+
|
193
|
+
end
|
194
|
+
|
195
|
+
end
|
196
|
+
|
197
|
+
end
|
198
|
+
|
@@ -0,0 +1,221 @@
|
|
1
|
+
require 'lemon/model/pending'
|
2
|
+
require 'lemon/model/test_context'
|
3
|
+
require 'lemon/model/test_unit'
|
4
|
+
|
5
|
+
module Lemon
|
6
|
+
|
7
|
+
# Test Case encapsulates a collection of
|
8
|
+
# unit tests organized into groups of contexts.
|
9
|
+
class TestCase
|
10
|
+
|
11
|
+
# The test suite to which this testcase belongs.
|
12
|
+
attr :suite
|
13
|
+
|
14
|
+
# A testcase +target+ is a class or module.
|
15
|
+
attr :target
|
16
|
+
|
17
|
+
# Description of the aspect of the test class/module
|
18
|
+
# to be testd.
|
19
|
+
attr :aspect
|
20
|
+
|
21
|
+
# Ordered list of testunits.
|
22
|
+
attr :units
|
23
|
+
|
24
|
+
# Before any test case units are run.
|
25
|
+
attr :before
|
26
|
+
#attr_accessor :prepare
|
27
|
+
|
28
|
+
# After all test case units are run.
|
29
|
+
attr :after
|
30
|
+
#attr_accessor :cleanup
|
31
|
+
|
32
|
+
# Module for parsing test case scripts.
|
33
|
+
attr :dsl
|
34
|
+
|
35
|
+
# A test case +target+ is a class or module.
|
36
|
+
def initialize(suite, target, aspect=nil, &block)
|
37
|
+
@suite = suite
|
38
|
+
@target = target
|
39
|
+
@aspect = aspect
|
40
|
+
|
41
|
+
#@steps = []
|
42
|
+
@units = []
|
43
|
+
|
44
|
+
#@prepare = nil
|
45
|
+
#@cleanup = nil
|
46
|
+
|
47
|
+
@before = {}
|
48
|
+
@after = {}
|
49
|
+
|
50
|
+
@dsl = DSL.new(self, &block)
|
51
|
+
end
|
52
|
+
|
53
|
+
# DEPRECATE
|
54
|
+
alias_method :testunits, :units
|
55
|
+
|
56
|
+
# Iterate over each test unit.
|
57
|
+
def each(&block)
|
58
|
+
units.each(&block)
|
59
|
+
end
|
60
|
+
|
61
|
+
#
|
62
|
+
def size
|
63
|
+
testunits.size
|
64
|
+
end
|
65
|
+
|
66
|
+
#
|
67
|
+
def to_s
|
68
|
+
target.to_s.sub(/^\#\<.*?\>::/, '')
|
69
|
+
end
|
70
|
+
|
71
|
+
#
|
72
|
+
def prepare
|
73
|
+
@before[[]]
|
74
|
+
end
|
75
|
+
|
76
|
+
#
|
77
|
+
def cleanup
|
78
|
+
@after[[]]
|
79
|
+
end
|
80
|
+
|
81
|
+
#
|
82
|
+
class DSL < Module
|
83
|
+
#
|
84
|
+
def initialize(testcase, &casecode)
|
85
|
+
@testcase = testcase
|
86
|
+
@context = nil #Instance.new(self)
|
87
|
+
module_eval(&casecode)
|
88
|
+
end
|
89
|
+
|
90
|
+
# Define a unit test for this case.
|
91
|
+
def unit(*target, &block)
|
92
|
+
target = target.map{ |x| Hash === x ? x.to_a : x }.flatten
|
93
|
+
method, aspect = *target
|
94
|
+
unit = TestUnit.new(
|
95
|
+
@testcase, method,
|
96
|
+
:function => false,
|
97
|
+
:aspect => aspect,
|
98
|
+
:context => @context,
|
99
|
+
&block
|
100
|
+
)
|
101
|
+
#@testcase.steps << unit
|
102
|
+
@testcase.units << unit
|
103
|
+
unit
|
104
|
+
end
|
105
|
+
alias_method :TestUnit, :unit
|
106
|
+
alias_method :testunit, :unit
|
107
|
+
alias_method :Unit, :unit
|
108
|
+
|
109
|
+
# Define a meta-method unit test for this case.
|
110
|
+
def meta(*target, &block)
|
111
|
+
target = target.map{ |x| Hash === x ? x.to_a : x }.flatten
|
112
|
+
method, aspect = *target
|
113
|
+
unit = TestUnit.new(
|
114
|
+
@testcase, method,
|
115
|
+
:function => true,
|
116
|
+
:aspect => aspect,
|
117
|
+
:context => @context,
|
118
|
+
&block
|
119
|
+
)
|
120
|
+
#@testcase.steps << unit
|
121
|
+
@testcase.units << unit
|
122
|
+
unit
|
123
|
+
end
|
124
|
+
alias_method :MetaUnit, :meta
|
125
|
+
alias_method :metaunit, :meta
|
126
|
+
alias_method :Meta, :meta
|
127
|
+
|
128
|
+
# Omit a unit from testing.
|
129
|
+
#
|
130
|
+
# omit unit :foo do
|
131
|
+
# # ...
|
132
|
+
# end
|
133
|
+
#
|
134
|
+
def Omit(unit)
|
135
|
+
unit.omit = true
|
136
|
+
end
|
137
|
+
alias_method :omit, :Omit
|
138
|
+
|
139
|
+
#
|
140
|
+
def setup(description=nil, &block)
|
141
|
+
if block
|
142
|
+
context = TestContext.new(@testcase, description, &block)
|
143
|
+
@context = context
|
144
|
+
#@function = false
|
145
|
+
#@testcase.steps << context
|
146
|
+
end
|
147
|
+
end
|
148
|
+
alias_method :Setup, :setup
|
149
|
+
alias_method :Concern, :setup
|
150
|
+
alias_method :concern, :setup
|
151
|
+
alias_method :Context, :setup
|
152
|
+
alias_method :context, :setup
|
153
|
+
|
154
|
+
## Define a new test instance for this case.
|
155
|
+
#def instance(description=nil, &block)
|
156
|
+
# context = TestInstance.new(@testcase, description, &block)
|
157
|
+
# @context = context
|
158
|
+
# @function = false
|
159
|
+
# #@testcase.steps << context
|
160
|
+
#end
|
161
|
+
#alias_method :Instance, :instance
|
162
|
+
|
163
|
+
# Define a new test singleton for this case.
|
164
|
+
#def Singleton(description=nil, &block)
|
165
|
+
# context = TestSingleton.new(@testcase, description, &block)
|
166
|
+
# @context = context
|
167
|
+
# @function = true
|
168
|
+
# #@testcase.steps << context
|
169
|
+
#end
|
170
|
+
#alias_method :singleton, :Singleton
|
171
|
+
|
172
|
+
def teardown(&block)
|
173
|
+
@context.teardown = block
|
174
|
+
end
|
175
|
+
alias_method :Teardown, :teardown
|
176
|
+
|
177
|
+
# TODO: Make Before and After more generic to handle before and after
|
178
|
+
# units, contexts/concerns, etc.
|
179
|
+
|
180
|
+
# Define a before procedure for this case.
|
181
|
+
def before(*matches, &block)
|
182
|
+
@testcase.before[matches] = block
|
183
|
+
end
|
184
|
+
alias_method :Before, :before
|
185
|
+
|
186
|
+
# Define an after procedure for this case.
|
187
|
+
def after(*matches, &block)
|
188
|
+
@testcase.after[matches] = block
|
189
|
+
end
|
190
|
+
alias_method :After, :after
|
191
|
+
|
192
|
+
#
|
193
|
+
#def prepare(&block)
|
194
|
+
# @testcase.prepare = block
|
195
|
+
#end
|
196
|
+
#alias_method :Prepare, :prepare
|
197
|
+
|
198
|
+
#
|
199
|
+
#def cleanup(&block)
|
200
|
+
# @testcase.cleanup = block
|
201
|
+
#end
|
202
|
+
#alias_method :Cleanup, :cleanup
|
203
|
+
|
204
|
+
# Load a helper script applicable to this test case.
|
205
|
+
def helper(file)
|
206
|
+
instance_eval(File.read(file), file)
|
207
|
+
end
|
208
|
+
alias_method :Helper, :helper
|
209
|
+
|
210
|
+
#def include(*mods)
|
211
|
+
# extend *mods
|
212
|
+
#end
|
213
|
+
|
214
|
+
#def pending(message=nil)
|
215
|
+
# raise Pending.new(message)
|
216
|
+
#end
|
217
|
+
end
|
218
|
+
|
219
|
+
end
|
220
|
+
|
221
|
+
end
|