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.
Files changed (113) hide show
  1. data/{lemon.gemspec → .gemspec} +0 -0
  2. data/.ruby +4 -11
  3. data/Assembly +5 -11
  4. data/HISTORY.rdoc +31 -0
  5. data/MANIFEST +45 -55
  6. data/PROFILE +6 -6
  7. data/README.md +113 -0
  8. data/Rakefile +12 -3
  9. data/VERSION +1 -1
  10. data/bin/lemonade +8 -0
  11. data/lib/lemon.rb +52 -2
  12. data/lib/lemon.yml +4 -11
  13. data/lib/lemon/{model/ae.rb → ae.rb} +0 -0
  14. data/lib/lemon/cli.rb +28 -279
  15. data/lib/lemon/cli/base.rb +139 -0
  16. data/lib/lemon/cli/coverage.rb +52 -0
  17. data/lib/lemon/cli/generate.rb +51 -0
  18. data/lib/lemon/cli/test.rb +50 -0
  19. data/lib/lemon/core_ext.rb +7 -0
  20. data/lib/lemon/core_ext/kernel.rb +20 -0
  21. data/lib/lemon/core_ext/omission.rb +18 -0
  22. data/lib/lemon/{controller/coverage_analyzer.rb → coverage/analyzer.rb} +41 -19
  23. data/lib/lemon/{model → coverage}/cover_unit.rb +0 -0
  24. data/lib/lemon/{view/cover_reports → coverage/formats}/abstract.rb +0 -0
  25. data/lib/lemon/{view/cover_reports → coverage/formats}/compact.rb +1 -1
  26. data/lib/lemon/{view/cover_reports → coverage/formats}/outline.rb +1 -1
  27. data/lib/lemon/{view/cover_reports → coverage/formats}/verbose.rb +1 -1
  28. data/lib/lemon/{view/cover_reports → coverage/formats}/yaml.rb +1 -1
  29. data/lib/lemon/{model → coverage}/snapshot.rb +0 -0
  30. data/lib/lemon/{model → coverage}/source_parser.rb +0 -0
  31. data/lib/lemon/{controller/scaffold_generator.rb → generator.rb} +53 -14
  32. data/lib/lemon/test_advice.rb +63 -0
  33. data/lib/lemon/test_case.rb +270 -0
  34. data/lib/lemon/test_class.rb +28 -0
  35. data/lib/lemon/test_method.rb +207 -0
  36. data/lib/lemon/test_module.rb +114 -0
  37. data/lib/lemon/test_proc.rb +140 -0
  38. data/lib/lemon/test_setup.rb +54 -0
  39. data/lib/lemon/test_world.rb +9 -0
  40. data/notes/{2010-05-06-files_not_classes.rdoc → 2010-05-06-files-not-classes.rdoc} +0 -0
  41. data/notes/{2010-07-11-acid_testing.rdoc → 2010-07-11-acid-testing.rdoc} +0 -0
  42. data/notes/2011-07-07-nailing-down-the-nomenclature.md +6 -0
  43. data/site/index.html +7 -6
  44. data/{qed → spec}/applique/fs.rb +0 -0
  45. data/{qed → spec}/coverage/01_complete.rdoc +26 -16
  46. data/{qed → spec}/coverage/02_incomplete.rdoc +10 -7
  47. data/{qed → spec}/coverage/03_extensions.rdoc +10 -6
  48. data/spec/coverage/applique/lemon.rb +1 -0
  49. data/try/.test +8 -0
  50. data/try/case_error.rb +18 -0
  51. data/try/case_fail.rb +19 -0
  52. data/try/case_pass.rb +42 -0
  53. data/try/case_pending.rb +18 -0
  54. data/try/case_singleton.rb +18 -0
  55. data/try/case_untested.rb +14 -0
  56. data/try/fixtures/calculator.rb +15 -0
  57. data/{demo/fixture → try/fixtures}/example-use.rb +0 -0
  58. data/{demo/fixture → try/fixtures}/example.rb +0 -0
  59. data/try/helpers/loadpath.rb +1 -0
  60. data/{.config → work/deprecated}/cucumber.yml +0 -0
  61. data/{features → work/deprecated/features}/coverage.feature +0 -0
  62. data/{features → work/deprecated/features}/generate.feature +0 -0
  63. data/{features → work/deprecated/features}/step_definitions/coverage_steps.rb +0 -0
  64. data/{features → work/deprecated/features}/support/ae.rb +0 -0
  65. data/{features → work/deprecated/features}/support/aruba.rb +0 -0
  66. data/{features → work/deprecated/features}/test.feature +0 -0
  67. data/work/deprecated/model/dsl/advice.rb +78 -0
  68. data/work/deprecated/model/dsl/subject.rb +40 -0
  69. data/{lib/lemon → work/deprecated}/model/main.rb +40 -29
  70. data/work/deprecated/model/test.rb +54 -0
  71. data/work/deprecated/model/test_base_dsl.rb +88 -0
  72. data/work/deprecated/model/test_clause.rb +112 -0
  73. data/{lib/lemon → work/deprecated}/model/test_context.rb +24 -24
  74. data/work/deprecated/model/test_feature.rb +128 -0
  75. data/work/deprecated/model/test_scenario.rb +137 -0
  76. data/{lib/lemon → work/deprecated}/model/test_suite.rb +113 -32
  77. data/work/deprecated/rake.rb +103 -0
  78. data/{test → work/deprecated/test}/case_coverage_analyzer.rb +0 -0
  79. data/{test → work/deprecated/test}/case_test_case_dsl.rb +2 -2
  80. data/{test → work/deprecated/test}/fixtures/case_complete.rb +0 -0
  81. data/{test → work/deprecated/test}/fixtures/case_inclusion.rb +0 -0
  82. data/{test → work/deprecated/test}/fixtures/case_incomplete.rb +0 -0
  83. data/{test → work/deprecated/test}/fixtures/example.rb +0 -0
  84. data/{test → work/deprecated/test}/fixtures/helper.rb +0 -0
  85. data/{test → work/deprecated/test}/runner +0 -0
  86. data/work/old-tests/case_example.rb +15 -0
  87. data/work/old-tests/feature_example.rb +40 -0
  88. data/work/reference/dsl2.rb +4 -0
  89. metadata +101 -98
  90. data/README.rdoc +0 -103
  91. data/bin/lemon +0 -4
  92. data/demo/case_example_error.rb +0 -10
  93. data/demo/case_example_fail.rb +0 -15
  94. data/demo/case_example_pass.rb +0 -32
  95. data/demo/case_example_pending.rb +0 -14
  96. data/demo/case_example_untested.rb +0 -10
  97. data/lib/lemon/controller/test_runner.rb +0 -299
  98. data/lib/lemon/model/pending.rb +0 -10
  99. data/lib/lemon/model/test_case.rb +0 -305
  100. data/lib/lemon/model/test_unit.rb +0 -147
  101. data/lib/lemon/view/test_reports/abstract.rb +0 -256
  102. data/lib/lemon/view/test_reports/dotprogress.rb +0 -73
  103. data/lib/lemon/view/test_reports/html.rb +0 -146
  104. data/lib/lemon/view/test_reports/outline.rb +0 -118
  105. data/lib/lemon/view/test_reports/summary.rb +0 -131
  106. data/lib/lemon/view/test_reports/tap.rb +0 -49
  107. data/lib/lemon/view/test_reports/tapj.rb +0 -130
  108. data/lib/lemon/view/test_reports/tapy.rb +0 -141
  109. data/lib/lemon/view/test_reports/verbose.rb +0 -197
  110. data/work/sandbox/lib/sample.rb +0 -13
  111. data/work/sandbox/test/sample_case.rb +0 -12
  112. data/work/trash/example-cover.rb +0 -5
  113. data/work/trash/example.rb +0 -16
@@ -1,10 +0,0 @@
1
- require 'lemon/model/ae'
2
-
3
- class Pending < Assertion
4
- def self.to_proc; lambda{ raise self }; end
5
- end
6
-
7
- class Untested < Pending
8
- def self.to_proc; lambda{ raise self }; end
9
- end
10
-
@@ -1,305 +0,0 @@
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 matching test units.
25
- attr :before
26
- #attr_accessor :prepare
27
-
28
- # After matching test units.
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
- #
92
- # @example
93
- # unit :puts => "print message with new line to stdout" do
94
- # puts "Hello"
95
- # end
96
- #
97
- def unit(*target, &block)
98
- target = target.map{ |x| Hash === x ? x.to_a : x }.flatten
99
- method, aspect = *target
100
- unit = TestUnit.new(
101
- @testcase, method,
102
- :function => false,
103
- :aspect => aspect,
104
- :context => @context,
105
- :caller => caller,
106
- &block
107
- )
108
- #@testcase.steps << unit
109
- @testcase.units << unit
110
- unit
111
- end
112
- alias_method :TestUnit, :unit
113
- alias_method :testunit, :unit
114
- alias_method :Unit, :unit
115
-
116
- # Define a meta-method unit test for this case.
117
- def meta(*target, &block)
118
- target = target.map{ |x| Hash === x ? x.to_a : x }.flatten
119
- method, aspect = *target
120
- unit = TestUnit.new(
121
- @testcase, method,
122
- :function => true,
123
- :aspect => aspect,
124
- :context => @context,
125
- :caller => caller,
126
- &block
127
- )
128
- #@testcase.steps << unit
129
- @testcase.units << unit
130
- unit
131
- end
132
- alias_method :MetaUnit, :meta
133
- alias_method :metaunit, :meta
134
- alias_method :Meta, :meta
135
-
136
- # Omit a unit from testing.
137
- #
138
- # omit unit :foo do
139
- # # ...
140
- # end
141
- #
142
- def Omit(unit)
143
- unit.omit = true
144
- end
145
- alias_method :omit, :Omit
146
-
147
- # Setup is used to set things up for each unit test.
148
- # The setup procedure is run before each unit.
149
- #
150
- # @param [String] description
151
- # A brief description of what the setup procedure sets-up.
152
- #
153
- def setup(description=nil, &procedure)
154
- if procedure
155
- context = TestContext.new(@testcase, description, &procedure)
156
- @context = context
157
- #@function = false
158
- #@testcase.steps << context
159
- end
160
- end
161
- alias_method :Setup, :setup
162
- alias_method :Concern, :setup
163
- alias_method :concern, :setup
164
-
165
- # @deprecate This alias will probably not stick around.
166
- alias_method :Context, :setup
167
- alias_method :context, :setup
168
-
169
- =begin
170
- # TODO: Currently there is no difference between Setup, Instance and Singleton
171
-
172
- ## Define a new test instance for this case.
173
- def instance(description=nil, &block)
174
- if block
175
- #context = TestInstance.new(@testcase, description, &block)
176
- context = TestContext.new(@testcase, description, &block)
177
- else
178
- context = TestContext.new(@testcase, description) do
179
- @testcase.target.new # No arguments!!!
180
- end
181
- end
182
- @context = context
183
- #@function = false
184
- #@testcase.steps << context
185
- end
186
- alias_method :Instance, :instance
187
-
188
- # Define a new test singleton for this case.
189
- def Singleton(description=nil, &block)
190
- if block
191
- #context = TestSingleton.new(@testcase, description, &block)
192
- context = TestContext.new(@testcase, description, &block)
193
- else
194
- context = TestContext.new(@testcase, description){ @testcase.target }
195
- end
196
- @context = context
197
- #@function = true
198
- #@testcase.steps << context
199
- end
200
- alias_method :singleton, :Singleton
201
- =end
202
-
203
- # Teardown procedure is used to clean-up after each unit test.
204
- def teardown(&procedure)
205
- @context.teardown = procedure
206
- end
207
- alias_method :Teardown, :teardown
208
-
209
- # TODO: Make Before and After more generic to handle before and after
210
- # units, contexts/concerns, etc?
211
-
212
- # Define a _complex_ before procedure. The #before method allows
213
- # before procedures to be defined that are triggered by a match
214
- # against the unit's target method name or _aspect_ description.
215
- # This allows groups of tests to be defined that share special
216
- # setup code.
217
- #
218
- # @example
219
- #
220
- # unit :puts => "standard output (@stdout)" do
221
- # puts "Hello"
222
- # end
223
- #
224
- # before /@stdout/ do
225
- # $stdout = StringIO.new
226
- # end
227
- #
228
- # after /@stdout/ do
229
- # $stdout = STDOUT
230
- # end
231
- #
232
- # @param [Array<Symbol,Regexp>] matches
233
- # List of match critera that must _all_ be matched
234
- # to trigger the before procedure.
235
- #
236
- def before(*matches, &procedure)
237
- @testcase.before[matches] = procedure
238
- end
239
- alias_method :Before, :before
240
-
241
- # Define a _complex_ after procedure. The #before method allows
242
- # before procedures to be defined that are triggered by a match
243
- # against the unit's target method name or _aspect_ description.
244
- # This allows groups of tests to be defined that share special
245
- # teardown code.
246
- #
247
- # @example
248
- #
249
- # unit :puts => "standard output (@stdout)" do
250
- # puts "Hello"
251
- # end
252
- #
253
- # before /@stdout/ do
254
- # $stdout = StringIO.new
255
- # end
256
- #
257
- # after /@stdout/ do
258
- # $stdout = STDOUT
259
- # end
260
- #
261
- # @param [Array<Symbol,Regexp>] matches
262
- # List of match critera that must _all_ be matched
263
- # to trigger the after procedure.
264
- #
265
- def after(*matches, &procedure)
266
- @testcase.after[matches] = procedure
267
- end
268
- alias_method :After, :after
269
-
270
- # Define a "before all" procedure.
271
- def prepare(&procedure)
272
- before(&procedure)
273
- end
274
- alias_method :Prepare, :prepare
275
-
276
- # Define an "after all" procedure.
277
- def cleanup(&procedure)
278
- after(&procedure)
279
- end
280
- alias_method :Cleanup, :cleanup
281
-
282
- # Load a helper script applicable to this test case. Unlike requiring
283
- # a helper script, the #helper method will eval the file's contents
284
- # directly into the test context (using instance_eval).
285
- #
286
- # @param [String] file
287
- # File to eval into test context.
288
- #
289
- def helper(file)
290
- instance_eval(File.read(file), file)
291
- end
292
- alias_method :Helper, :helper
293
-
294
- #def include(*mods)
295
- # extend *mods
296
- #end
297
-
298
- #def pending(message=nil)
299
- # raise Pending.new(message)
300
- #end
301
- end
302
-
303
- end
304
-
305
- end
@@ -1,147 +0,0 @@
1
- module Lemon
2
-
3
- #
4
- class TestUnit
5
-
6
- # The test case to which this unit test belongs.
7
- attr :testcase
8
-
9
- # The context to use for this test.
10
- attr :context
11
-
12
- # A test unit +target+ is a method.
13
- attr :target
14
-
15
- # The aspect of the instance this test fulfills.
16
- attr :aspect
17
-
18
- # Test procedure, in which test assertions should be made.
19
- attr :procedure
20
-
21
- #
22
- attr :caller
23
-
24
- # New unit test.
25
- def initialize(testcase, target, options={}, &procedure)
26
- @testcase = testcase
27
- @target = target
28
-
29
- @aspect = options[:aspect]
30
- @function = options[:function] || options[:metaclass]
31
- @context = options[:context]
32
- @omit = options[:omit]
33
- @caller = options[:caller]
34
-
35
- @procedure = procedure
36
-
37
- @tested = false
38
- end
39
-
40
- #
41
- attr_accessor :omit
42
-
43
- #
44
- def name ; @target ; end
45
-
46
- # Is this unit test for a class or module level method?
47
- def function?
48
- @function
49
- end
50
- alias_method :meta?, :function?
51
-
52
- #
53
- def omit?
54
- @omit
55
- end
56
-
57
- #
58
- attr_accessor :tested
59
-
60
- # The suite to which this unit test belongs.
61
- def suite
62
- testcase.suite
63
- end
64
-
65
- # If meta-method return target method's name prefixed with double colons.
66
- # If instance method then return target method's name.
67
- def key
68
- meta? ? "::#{target}" : "#{target}"
69
- end
70
-
71
- # If meta-method return target method's name prefixed with double colons.
72
- # If instance method then return target method's name prefixed with hash character.
73
- def name
74
- meta? ? "::#{target}" : "##{target}"
75
- end
76
-
77
- #
78
- def fullname
79
- meta? ? "#{testcase}.#{target}" : "#{testcase}##{target}"
80
- end
81
-
82
- #
83
- def to_s
84
- if meta?
85
- "#{testcase}.#{target}"
86
- else
87
- "#{testcase}##{target}"
88
- end
89
- end
90
-
91
- #
92
- def description
93
- if meta?
94
- #"#{testcase} .#{target} #{aspect}"
95
- "#{testcase}.#{target} #{context} #{aspect}".strip
96
- else
97
- a = /^[aeiou]/i =~ testcase.to_s ? 'An' : 'A'
98
- #"#{a} #{testcase} receiving ##{target} #{aspect}"
99
- "#{testcase}##{target} #{context} #{aspect}".strip
100
- end
101
- end
102
-
103
- # START-COMMIT. 201105190006
104
-
105
- # The file method returns the file name of +caller+ which
106
- # was created upon initialization of this object. It is
107
- # also the first element of #file_and_line.
108
- #
109
- # Returns file name of caller.
110
- def file
111
- file_and_line.first
112
- end
113
-
114
- # Returns line number of caller.
115
- def line
116
- file_and_line.last
117
- end
118
-
119
- # The file_and_line method returns the file name and line number of
120
- # the caller created upon initialization of this object.
121
- #
122
- # This method is cached.
123
- #
124
- # Examples
125
- # file_and_line #=> ['foo_test.rb', 123]
126
- #
127
- # Returns Array of file name and line number of caller.
128
- def file_and_line
129
- @file_and_line ||= (
130
- line = caller[0]
131
- i = line.rindex(':in')
132
- line = i ? line[0...i] : line
133
- f, l = File.basename(line).split(':')
134
- [f, l]
135
- )
136
- end
137
-
138
- # END-COMMIT.
139
-
140
- #
141
- def match?(match)
142
- match == target || match === aspect
143
- end
144
- end
145
-
146
- end
147
-