lemon 0.8.5 → 0.9.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/{lemon.gemspec → .gemspec} +0 -0
- data/.ruby +4 -11
- data/Assembly +5 -11
- data/HISTORY.rdoc +31 -0
- data/MANIFEST +45 -55
- data/PROFILE +6 -6
- data/README.md +113 -0
- data/Rakefile +12 -3
- data/VERSION +1 -1
- data/bin/lemonade +8 -0
- data/lib/lemon.rb +52 -2
- data/lib/lemon.yml +4 -11
- data/lib/lemon/{model/ae.rb → ae.rb} +0 -0
- data/lib/lemon/cli.rb +28 -279
- data/lib/lemon/cli/base.rb +139 -0
- data/lib/lemon/cli/coverage.rb +52 -0
- data/lib/lemon/cli/generate.rb +51 -0
- data/lib/lemon/cli/test.rb +50 -0
- data/lib/lemon/core_ext.rb +7 -0
- data/lib/lemon/core_ext/kernel.rb +20 -0
- data/lib/lemon/core_ext/omission.rb +18 -0
- data/lib/lemon/{controller/coverage_analyzer.rb → coverage/analyzer.rb} +41 -19
- data/lib/lemon/{model → coverage}/cover_unit.rb +0 -0
- data/lib/lemon/{view/cover_reports → coverage/formats}/abstract.rb +0 -0
- data/lib/lemon/{view/cover_reports → coverage/formats}/compact.rb +1 -1
- data/lib/lemon/{view/cover_reports → coverage/formats}/outline.rb +1 -1
- data/lib/lemon/{view/cover_reports → coverage/formats}/verbose.rb +1 -1
- data/lib/lemon/{view/cover_reports → coverage/formats}/yaml.rb +1 -1
- data/lib/lemon/{model → coverage}/snapshot.rb +0 -0
- data/lib/lemon/{model → coverage}/source_parser.rb +0 -0
- data/lib/lemon/{controller/scaffold_generator.rb → generator.rb} +53 -14
- data/lib/lemon/test_advice.rb +63 -0
- data/lib/lemon/test_case.rb +270 -0
- data/lib/lemon/test_class.rb +28 -0
- data/lib/lemon/test_method.rb +207 -0
- data/lib/lemon/test_module.rb +114 -0
- data/lib/lemon/test_proc.rb +140 -0
- data/lib/lemon/test_setup.rb +54 -0
- data/lib/lemon/test_world.rb +9 -0
- data/notes/{2010-05-06-files_not_classes.rdoc → 2010-05-06-files-not-classes.rdoc} +0 -0
- data/notes/{2010-07-11-acid_testing.rdoc → 2010-07-11-acid-testing.rdoc} +0 -0
- data/notes/2011-07-07-nailing-down-the-nomenclature.md +6 -0
- data/site/index.html +7 -6
- data/{qed → spec}/applique/fs.rb +0 -0
- data/{qed → spec}/coverage/01_complete.rdoc +26 -16
- data/{qed → spec}/coverage/02_incomplete.rdoc +10 -7
- data/{qed → spec}/coverage/03_extensions.rdoc +10 -6
- data/spec/coverage/applique/lemon.rb +1 -0
- data/try/.test +8 -0
- data/try/case_error.rb +18 -0
- data/try/case_fail.rb +19 -0
- data/try/case_pass.rb +42 -0
- data/try/case_pending.rb +18 -0
- data/try/case_singleton.rb +18 -0
- data/try/case_untested.rb +14 -0
- data/try/fixtures/calculator.rb +15 -0
- data/{demo/fixture → try/fixtures}/example-use.rb +0 -0
- data/{demo/fixture → try/fixtures}/example.rb +0 -0
- data/try/helpers/loadpath.rb +1 -0
- data/{.config → work/deprecated}/cucumber.yml +0 -0
- data/{features → work/deprecated/features}/coverage.feature +0 -0
- data/{features → work/deprecated/features}/generate.feature +0 -0
- data/{features → work/deprecated/features}/step_definitions/coverage_steps.rb +0 -0
- data/{features → work/deprecated/features}/support/ae.rb +0 -0
- data/{features → work/deprecated/features}/support/aruba.rb +0 -0
- data/{features → work/deprecated/features}/test.feature +0 -0
- data/work/deprecated/model/dsl/advice.rb +78 -0
- data/work/deprecated/model/dsl/subject.rb +40 -0
- data/{lib/lemon → work/deprecated}/model/main.rb +40 -29
- data/work/deprecated/model/test.rb +54 -0
- data/work/deprecated/model/test_base_dsl.rb +88 -0
- data/work/deprecated/model/test_clause.rb +112 -0
- data/{lib/lemon → work/deprecated}/model/test_context.rb +24 -24
- data/work/deprecated/model/test_feature.rb +128 -0
- data/work/deprecated/model/test_scenario.rb +137 -0
- data/{lib/lemon → work/deprecated}/model/test_suite.rb +113 -32
- data/work/deprecated/rake.rb +103 -0
- data/{test → work/deprecated/test}/case_coverage_analyzer.rb +0 -0
- data/{test → work/deprecated/test}/case_test_case_dsl.rb +2 -2
- data/{test → work/deprecated/test}/fixtures/case_complete.rb +0 -0
- data/{test → work/deprecated/test}/fixtures/case_inclusion.rb +0 -0
- data/{test → work/deprecated/test}/fixtures/case_incomplete.rb +0 -0
- data/{test → work/deprecated/test}/fixtures/example.rb +0 -0
- data/{test → work/deprecated/test}/fixtures/helper.rb +0 -0
- data/{test → work/deprecated/test}/runner +0 -0
- data/work/old-tests/case_example.rb +15 -0
- data/work/old-tests/feature_example.rb +40 -0
- data/work/reference/dsl2.rb +4 -0
- metadata +101 -98
- data/README.rdoc +0 -103
- data/bin/lemon +0 -4
- data/demo/case_example_error.rb +0 -10
- data/demo/case_example_fail.rb +0 -15
- data/demo/case_example_pass.rb +0 -32
- data/demo/case_example_pending.rb +0 -14
- data/demo/case_example_untested.rb +0 -10
- data/lib/lemon/controller/test_runner.rb +0 -299
- data/lib/lemon/model/pending.rb +0 -10
- data/lib/lemon/model/test_case.rb +0 -305
- data/lib/lemon/model/test_unit.rb +0 -147
- data/lib/lemon/view/test_reports/abstract.rb +0 -256
- data/lib/lemon/view/test_reports/dotprogress.rb +0 -73
- data/lib/lemon/view/test_reports/html.rb +0 -146
- data/lib/lemon/view/test_reports/outline.rb +0 -118
- data/lib/lemon/view/test_reports/summary.rb +0 -131
- data/lib/lemon/view/test_reports/tap.rb +0 -49
- data/lib/lemon/view/test_reports/tapj.rb +0 -130
- data/lib/lemon/view/test_reports/tapy.rb +0 -141
- data/lib/lemon/view/test_reports/verbose.rb +0 -197
- data/work/sandbox/lib/sample.rb +0 -13
- data/work/sandbox/test/sample_case.rb +0 -12
- data/work/trash/example-cover.rb +0 -5
- data/work/trash/example.rb +0 -16
data/README.rdoc
DELETED
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
= Lemon
|
|
2
|
-
|
|
3
|
-
* Homepage[http://rubyworks.github.com/lemon]
|
|
4
|
-
* Development[http://github.com/rubyworks/lemon]
|
|
5
|
-
* Issues[http://github.com/rubyworks/lemon/issues]
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
== DESCRIPTION
|
|
9
|
-
|
|
10
|
-
Lemon is a Unit Testing Framework that enforces a test case construction mirroring the class/module and method design of the target system. Arguably this promotes the proper technique for unit testing and helps ensure good test coverage.
|
|
11
|
-
|
|
12
|
-
The difference between unit testing and functional testing, and all other forms of testing for that matter, is simply a matter of where the *concern* lies. The concerns of unit testing are the concerns of unit tests -- the individual methods.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
== HOW TO USE
|
|
16
|
-
|
|
17
|
-
=== Writing Tests
|
|
18
|
-
|
|
19
|
-
Say our library 'mylib.rb' consists of the class X:
|
|
20
|
-
|
|
21
|
-
class X
|
|
22
|
-
def a; "a"; end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
The simplest test case would be written as follows:
|
|
26
|
-
|
|
27
|
-
covers 'mylib'
|
|
28
|
-
|
|
29
|
-
testcase X do
|
|
30
|
-
unit :a => "method #a does something expected" do
|
|
31
|
-
x = X.new
|
|
32
|
-
x.a.assert.is_a? String
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
The +Covers+ method works just like +require+ with the exception that Lemon records the file for reference --under certain scenarios it can be used to improve overall test covered.
|
|
37
|
-
|
|
38
|
-
As tests grow, we might need to organize them into special concerns. For this Lemon provides a #concern method and a #setup method. Technically the two methods are the same, but #concern is used more for descriptive purposes whereas #setup is used to create an instance of the testcase's target class.
|
|
39
|
-
|
|
40
|
-
covers 'mylib'
|
|
41
|
-
|
|
42
|
-
testcase X do
|
|
43
|
-
setup "Description of a concern that the following unit tests address." do
|
|
44
|
-
X.new
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
unit :a => "method #a does something expected" do |x|
|
|
48
|
-
x.a.assert.is_a? String
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
Notice that the parameter passed to the block of +unit+ method is the instance of +X+ created in the +setup+ block. This block is run for every subsequent +Unit+ until a new concern is defined.
|
|
53
|
-
|
|
54
|
-
In conjunction with the #setup methods, there is a #teardown method which can be used "tidy-up" after each unit run if need be.
|
|
55
|
-
|
|
56
|
-
Lastly, there are the +before+ and +after+ methods which can be used only once for each testcase. The +before+ method defines a procedure to run before any of the testcase's units are run, and the +after+ method defines a procedure to run after that are all finished.
|
|
57
|
-
|
|
58
|
-
That is the bulk of the matter for writing Lemon tests. There are few other features not mentions here. You can learn more about hose by reading the wiki[http://wiki.github.com/proutils/lemon].
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
=== Running Tests
|
|
62
|
-
|
|
63
|
-
To run tests use the +lemon+ command-line utility.
|
|
64
|
-
|
|
65
|
-
$ lemon test/cases/name_case.rb
|
|
66
|
-
|
|
67
|
-
Normal output is typical <i>dot-progress</i>. For verbose output, use the <code>--verbose</code> or <code>-v</code> option.
|
|
68
|
-
|
|
69
|
-
$ lemon -v test/cases/name_case.rb
|
|
70
|
-
|
|
71
|
-
Other output types can be specified by the `--format` or `-f` option.
|
|
72
|
-
|
|
73
|
-
$ lemon -f tap test/cases/name_case.rb
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
=== Checking Test Coverage
|
|
77
|
-
|
|
78
|
-
Lemon can check test coverage by loading your target system and comparing it to your tests. To do this supply the <code>lemon</code> command the <code>--coverage</code> or <code>-c</code> option.
|
|
79
|
-
|
|
80
|
-
$ lemon -c -Ilib test/cases/*.rb
|
|
81
|
-
|
|
82
|
-
=== Generating Test Skeletons
|
|
83
|
-
|
|
84
|
-
Because of the one to one correspondence of case-unit to class-method, Lemon can also generate test scaffolding for previously written code. To do this, use the <code>--generate</code> or <code>-g</code> option and provide the lib location, or files, of the scripts for which to generate test scaffolding, and the output location for the test scripts.
|
|
85
|
-
|
|
86
|
-
$ lemon -g -Ilib test/cases/*.rb
|
|
87
|
-
|
|
88
|
-
Generating test case scaffolding from code will undoubtedly strike test-driven developers as a case of putting the cart before the horse. However, it is not unreasonable to argue that high-level, behavior-driven, functional testing frameworks, such as Q.E.D. and Cucumber are better suited to test-first methodologies. While test-driven development can obviously be done with Lemon, unit-testing is more appropriate for testing specific, critical portions of code, or for achieving full test coverage for mission critical applications.
|
|
89
|
-
|
|
90
|
-
=== Test Directory
|
|
91
|
-
|
|
92
|
-
There is no special directory for Lemon tests. Since they are unit tests, `test/` or `test/unit/` are good choices. Other options are `cases/` and `test/cases` since each file generally defines a single testcase. However, I recommend using interface-based names, regardless of the framework you actually use. In which case, `test/unit` is still a good choice, but also `test/api` if Lemon will be the only framework you use to test the API directly.
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
== COPYRIGHT
|
|
96
|
-
|
|
97
|
-
Lemon Unit Testing Framework
|
|
98
|
-
|
|
99
|
-
Copyright (c) 2009 Thomas Sawyer
|
|
100
|
-
|
|
101
|
-
BSD 2 Clause License
|
|
102
|
-
|
|
103
|
-
See COPYING.rdoc for details.
|
data/bin/lemon
DELETED
data/demo/case_example_error.rb
DELETED
data/demo/case_example_fail.rb
DELETED
data/demo/case_example_pass.rb
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
covers File.dirname(__FILE__) + '/fixture/example.rb'
|
|
2
|
-
|
|
3
|
-
testcase Example do
|
|
4
|
-
|
|
5
|
-
setup "without multipler" do
|
|
6
|
-
Example.new
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
unit :f do |ex|
|
|
10
|
-
ex.f(1,2).assert == 3
|
|
11
|
-
ex.f(2,2).assert == 4
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
setup "with multipler" do
|
|
15
|
-
Example.new(2)
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
unit :f => "incorporate the multiplier" do |ex|
|
|
19
|
-
ex.f(1,2).assert == 4
|
|
20
|
-
ex.f(2,2).assert == 6
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
teardown do
|
|
24
|
-
# ...
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
meta :m do
|
|
28
|
-
Example.m(1,1).assert == 1
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
end
|
|
32
|
-
|
|
@@ -1,299 +0,0 @@
|
|
|
1
|
-
module Lemon
|
|
2
|
-
|
|
3
|
-
require 'lemon/model/main'
|
|
4
|
-
require 'lemon/model/test_suite'
|
|
5
|
-
|
|
6
|
-
# The TestRunner class handles the execution of Lemon tests.
|
|
7
|
-
class TestRunner
|
|
8
|
-
|
|
9
|
-
# Test suite to run.
|
|
10
|
-
attr :suite
|
|
11
|
-
|
|
12
|
-
#
|
|
13
|
-
attr :files
|
|
14
|
-
|
|
15
|
-
# Report format.
|
|
16
|
-
attr :format
|
|
17
|
-
|
|
18
|
-
# Record pass, fail, error, pending and omitted units.
|
|
19
|
-
attr :record
|
|
20
|
-
|
|
21
|
-
# New Runner.
|
|
22
|
-
def initialize(files, options={})
|
|
23
|
-
@files = files
|
|
24
|
-
@options = options
|
|
25
|
-
|
|
26
|
-
@record = {:pass=>[], :fail=>[], :error=>[], :pending=>[], :omit=>[]}
|
|
27
|
-
|
|
28
|
-
## TODO: can we create and assign the suite here?
|
|
29
|
-
@suite = Lemon::TestSuite.new(files) #([])
|
|
30
|
-
#@suite = Lemon.suite
|
|
31
|
-
|
|
32
|
-
initialize_rc # TODO: before or after @suite =
|
|
33
|
-
|
|
34
|
-
#files = files.map{ |f| Dir[f] }.flatten
|
|
35
|
-
#files = files.map{ |f|
|
|
36
|
-
# if File.directory?(f)
|
|
37
|
-
# Dir[File.join(f, '**/*.rb')]
|
|
38
|
-
# else
|
|
39
|
-
# f
|
|
40
|
-
# end
|
|
41
|
-
#}.flatten.uniq
|
|
42
|
-
#files = files.map{ |f| File.expand_path(f) }
|
|
43
|
-
#files.each{ |s| require s }
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
# Samples
|
|
47
|
-
#
|
|
48
|
-
# * .lemon/rc
|
|
49
|
-
# * .lemon/rc.rb
|
|
50
|
-
# * .config/lemon/rc
|
|
51
|
-
# * .config/lemon/rc.rb
|
|
52
|
-
#
|
|
53
|
-
RC_GLOB = '{.,.config/,config/}lemon/rc{,.rb}'
|
|
54
|
-
|
|
55
|
-
#
|
|
56
|
-
def initialize_rc
|
|
57
|
-
if file = Dir[RC_GLOB].first
|
|
58
|
-
require file
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
#
|
|
63
|
-
def format
|
|
64
|
-
@options[:format]
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
#
|
|
68
|
-
#def cover?
|
|
69
|
-
# @options[:cover]
|
|
70
|
-
#end
|
|
71
|
-
|
|
72
|
-
# Namespaces option specifies the selection of test cases
|
|
73
|
-
# to run. Is is an array of strings which are matched
|
|
74
|
-
# against the module/class names using #start_wtih?
|
|
75
|
-
def namespaces
|
|
76
|
-
@options[:namespaces] || []
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
# Run tests.
|
|
80
|
-
#
|
|
81
|
-
# @return [Boolean]
|
|
82
|
-
# Whether tests ran without error or failure.
|
|
83
|
-
def run
|
|
84
|
-
#prepare
|
|
85
|
-
report.start_suite(suite)
|
|
86
|
-
each do |testcase|
|
|
87
|
-
scope = Object.new
|
|
88
|
-
scope.extend(testcase.dsl)
|
|
89
|
-
report.start_case(testcase)
|
|
90
|
-
if testcase.prepare #before[[]]
|
|
91
|
-
scope.instance_eval(&testcase.prepare)
|
|
92
|
-
end
|
|
93
|
-
testcase.each do |unit|
|
|
94
|
-
#case step
|
|
95
|
-
#when TestInstance
|
|
96
|
-
# reporter.report_instance(step)
|
|
97
|
-
#when TestUnit
|
|
98
|
-
# unit = step
|
|
99
|
-
if unit.omit?
|
|
100
|
-
report.omit(unit)
|
|
101
|
-
record[:omit] << unit
|
|
102
|
-
next
|
|
103
|
-
end
|
|
104
|
-
report.start_unit(unit)
|
|
105
|
-
run_pretest_procedures(unit, scope) #, suite, testcase)
|
|
106
|
-
begin
|
|
107
|
-
run_unit(unit, scope)
|
|
108
|
-
#unit.call(scope)
|
|
109
|
-
report.pass(unit)
|
|
110
|
-
record[:pass] << unit
|
|
111
|
-
rescue Pending => exception
|
|
112
|
-
exception = clean_backtrace(exception)
|
|
113
|
-
report.pending(unit, exception)
|
|
114
|
-
record[:pending] << [unit, exception]
|
|
115
|
-
rescue Assertion => exception
|
|
116
|
-
exception = clean_backtrace(exception)
|
|
117
|
-
report.fail(unit, exception)
|
|
118
|
-
record[:fail] << [unit, exception]
|
|
119
|
-
rescue Exception => exception
|
|
120
|
-
exception = clean_backtrace(exception)
|
|
121
|
-
report.error(unit, exception)
|
|
122
|
-
record[:error] << [unit, exception]
|
|
123
|
-
end
|
|
124
|
-
report.finish_unit(unit)
|
|
125
|
-
run_postest_procedures(unit, scope) #, suite, testcase)
|
|
126
|
-
#end
|
|
127
|
-
end
|
|
128
|
-
if testcase.cleanup #after[[]]
|
|
129
|
-
scope.instance_eval(&testcase.cleanup)
|
|
130
|
-
end
|
|
131
|
-
report.finish_case(testcase)
|
|
132
|
-
end
|
|
133
|
-
report.finish_suite(suite) #(successes, failures, errors, pendings)
|
|
134
|
-
return record[:error].size + record[:fail].size > 0 ? false : true
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
# Iterate over suite testcases, filtering out unselected testcases
|
|
138
|
-
# if any namespaces are provided.
|
|
139
|
-
def each(&block)
|
|
140
|
-
if namespaces.empty?
|
|
141
|
-
suite.each do |testcase|
|
|
142
|
-
block.call(testcase)
|
|
143
|
-
end
|
|
144
|
-
else
|
|
145
|
-
suite.each do |testcase|
|
|
146
|
-
next unless namespaces.any?{ |n| testcase.target.name.start_with?(n) }
|
|
147
|
-
block.call(testcase)
|
|
148
|
-
end
|
|
149
|
-
end
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
# All output is handled by a reporter.
|
|
153
|
-
def report
|
|
154
|
-
@report ||= report_find(format)
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
# Find a report type be name fragment.
|
|
158
|
-
def report_find(format)
|
|
159
|
-
format = format ? format.to_s.downcase : 'dotprogress'
|
|
160
|
-
format = report_list.find do |r|
|
|
161
|
-
/^#{format}/ =~ r
|
|
162
|
-
end
|
|
163
|
-
raise "unsupported format" unless format
|
|
164
|
-
require "lemon/view/test_reports/#{format}"
|
|
165
|
-
reporter = Lemon::TestReports.const_get(format.capitalize)
|
|
166
|
-
reporter.new(self)
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
# Returns a list of report types.
|
|
170
|
-
def report_list
|
|
171
|
-
Dir[File.dirname(__FILE__) + '/../view/test_reports/*.rb'].map do |rb|
|
|
172
|
-
File.basename(rb).chomp('.rb')
|
|
173
|
-
end
|
|
174
|
-
end
|
|
175
|
-
|
|
176
|
-
private
|
|
177
|
-
|
|
178
|
-
#
|
|
179
|
-
def run_unit(unit, scope)
|
|
180
|
-
if unit.function?
|
|
181
|
-
base = (class << unit.testcase.target; self; end)
|
|
182
|
-
else
|
|
183
|
-
base = unit.testcase.target
|
|
184
|
-
end
|
|
185
|
-
|
|
186
|
-
raise Pending unless unit.procedure
|
|
187
|
-
|
|
188
|
-
begin
|
|
189
|
-
base.class_eval do
|
|
190
|
-
alias_method "_lemon_#{unit.target}", unit.target
|
|
191
|
-
define_method(unit.target) do |*a,&b|
|
|
192
|
-
unit.tested = true
|
|
193
|
-
__send__("_lemon_#{unit.target}",*a,&b)
|
|
194
|
-
end
|
|
195
|
-
end
|
|
196
|
-
rescue => error
|
|
197
|
-
Kernel.eval <<-END, unit.procedure.binding
|
|
198
|
-
raise #{error.class}, "#{unit.target} not tested"
|
|
199
|
-
END
|
|
200
|
-
end
|
|
201
|
-
#Lemon.test_stack << self # hack
|
|
202
|
-
|
|
203
|
-
begin
|
|
204
|
-
if unit.context && unit.procedure.arity != 0
|
|
205
|
-
cntx = unit.context.setup(scope)
|
|
206
|
-
scope.instance_exec(cntx, &unit.procedure) #procedure.call
|
|
207
|
-
else
|
|
208
|
-
scope.instance_exec(&unit.procedure) #procedure.call
|
|
209
|
-
end
|
|
210
|
-
unit.context.teardown(scope) if unit.context
|
|
211
|
-
ensure
|
|
212
|
-
#Lemon.test_stack.pop
|
|
213
|
-
base.class_eval %{
|
|
214
|
-
alias_method "#{unit.target}", "_lemon_#{unit.target}"
|
|
215
|
-
}
|
|
216
|
-
end
|
|
217
|
-
if !unit.tested
|
|
218
|
-
#exception = Untested.new("#{unit.target} not tested")
|
|
219
|
-
if RUBY_VERSION < '1.9'
|
|
220
|
-
Kernel.eval %[raise Pending, "#{unit.target} not tested"], unit.procedure
|
|
221
|
-
else
|
|
222
|
-
Kernel.eval %[raise Pending, "#{unit.target} not tested"], unit.procedure.binding
|
|
223
|
-
end
|
|
224
|
-
end
|
|
225
|
-
end
|
|
226
|
-
|
|
227
|
-
=begin
|
|
228
|
-
#
|
|
229
|
-
def run_concern_procedures(concern, scope) #suite, testcase)
|
|
230
|
-
tc = concern.testcase
|
|
231
|
-
suite = tc.suite
|
|
232
|
-
suite.when_clauses.each do |match, block|
|
|
233
|
-
if match.nil? or match === concern.to_s
|
|
234
|
-
#block.call #(test_case)
|
|
235
|
-
scope.instance_exec(tc, &block)
|
|
236
|
-
end
|
|
237
|
-
end
|
|
238
|
-
tc.when_clauses.each do |match, block|
|
|
239
|
-
if match.nil? or match === concern.to_s
|
|
240
|
-
if match === concern.to_s
|
|
241
|
-
#block.call #(test_case)
|
|
242
|
-
scope.instance_exec(tc, &block)
|
|
243
|
-
end
|
|
244
|
-
end
|
|
245
|
-
end
|
|
246
|
-
concern.call(scope)
|
|
247
|
-
end
|
|
248
|
-
=end
|
|
249
|
-
|
|
250
|
-
# Run pre-test advice.
|
|
251
|
-
def run_pretest_procedures(unit, scope) #, suite, testcase)
|
|
252
|
-
suite = unit.testcase.suite
|
|
253
|
-
suite.before.each do |matches, block|
|
|
254
|
-
if matches.all?{ |match| unit.match?(match) }
|
|
255
|
-
scope.instance_exec(unit, &block) #block.call(unit)
|
|
256
|
-
end
|
|
257
|
-
end
|
|
258
|
-
unit.testcase.before.each do |matches, block|
|
|
259
|
-
if matches.all?{ |match| unit.match?(match) }
|
|
260
|
-
scope.instance_exec(unit, &block) #block.call(unit)
|
|
261
|
-
end
|
|
262
|
-
end
|
|
263
|
-
end
|
|
264
|
-
|
|
265
|
-
# Run post-test advice.
|
|
266
|
-
def run_postest_procedures(unit, scope) #, suite, testcase)
|
|
267
|
-
suite = unit.testcase.suite
|
|
268
|
-
unit.testcase.after.each do |matches, block|
|
|
269
|
-
if matches.all?{ |match| unit.match?(match) }
|
|
270
|
-
scope.instance_exec(unit, &block) #block.call(unit)
|
|
271
|
-
end
|
|
272
|
-
end
|
|
273
|
-
suite.after.each do |matches, block|
|
|
274
|
-
if matches.all?{ |match| unit.match?(match) }
|
|
275
|
-
scope.instance_exec(unit, &block) #block.call(unit)
|
|
276
|
-
end
|
|
277
|
-
end
|
|
278
|
-
end
|
|
279
|
-
|
|
280
|
-
EXCLUDE = Regexp.new(Regexp.escape(File.dirname(File.dirname(__FILE__))))
|
|
281
|
-
|
|
282
|
-
# Remove reference to lemon library from backtrace.
|
|
283
|
-
# TODO: Matching `bin/lemon` is not robust.
|
|
284
|
-
def clean_backtrace(exception)
|
|
285
|
-
trace = (Exception === exception ? exception.backtrace : exception)
|
|
286
|
-
trace = trace.reject{ |t| t =~ /bin\/lemon/ }
|
|
287
|
-
trace = trace.reject{ |t| t =~ EXCLUDE }
|
|
288
|
-
if trace.empty?
|
|
289
|
-
exception
|
|
290
|
-
else
|
|
291
|
-
exception.set_backtrace(trace) if Exception === exception
|
|
292
|
-
exception
|
|
293
|
-
end
|
|
294
|
-
end
|
|
295
|
-
|
|
296
|
-
end
|
|
297
|
-
|
|
298
|
-
end
|
|
299
|
-
|