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,256 +0,0 @@
1
- module Lemon::TestReports
2
-
3
- # Test Reporter Base Class
4
- class Abstract
5
-
6
- require 'ansi/core'
7
-
8
- #
9
- def self.inherited(base)
10
- registry << base
11
- end
12
-
13
- #
14
- def self.registry
15
- @registry ||= []
16
- end
17
-
18
- #
19
- def initialize(runner)
20
- @runner = runner
21
- @source = {}
22
- end
23
-
24
- #
25
- attr :runner
26
-
27
- #
28
- def start_suite(suite)
29
- end
30
-
31
- #
32
- def start_case(instance)
33
- end
34
-
35
- #
36
- #def instance(instance)
37
- #end
38
-
39
- #
40
- def start_unit(unit)
41
- end
42
-
43
- # Report an omitted unit test.
44
- def omit(unit)
45
- end
46
-
47
- #
48
- def pass(unit)
49
- end
50
-
51
- #
52
- def fail(unit, exception)
53
- end
54
-
55
- #
56
- def error(unit, exception)
57
- end
58
-
59
- #
60
- def finish_unit(testunit)
61
- end
62
-
63
- #
64
- def finish_case(instance)
65
- end
66
-
67
- #
68
- def finish_suite(suite)
69
- end
70
-
71
- private
72
-
73
- def record ; runner.record ; end
74
-
75
- # Is coverage information requested?
76
- #def cover? ; runner.cover? ; end
77
-
78
- #
79
- def total
80
- %w{pending pass fail error omit}.inject(0){ |s,r| s += record[r.to_sym].size; s }
81
- end
82
-
83
- #
84
- def tally
85
- sizes = %w{pending fail error omit pass}.map{ |r| record[r.to_sym].size }
86
- data = [total] + sizes
87
- s = "%s tests: %s pending, %s fail, %s err, %s omit, %s pass " % data
88
- #s += "(#{uncovered_units.size} uncovered, #{undefined_units.size} undefined)" if cover?
89
- s
90
- end
91
-
92
- #FILE_SEPARATOR = Regexp.escape(File::SEPARATOR)
93
-
94
- #
95
- INTERNALS = /(lib|bin)[\\\/]lemon/
96
-
97
- # Clean the backtrace of any reference to ko/ paths and code.
98
- def clean_backtrace(backtrace)
99
- trace = backtrace.reject{ |bt| bt =~ INTERNALS }
100
- trace.map do |bt|
101
- if i = bt.index(':in')
102
- bt[0...i]
103
- else
104
- bt
105
- end
106
- end
107
- end
108
-
109
- # Have to thank Suraj N. Kurapati for the crux of this code.
110
- def code_snippet(exception, bredth=3)
111
- backtrace = exception.backtrace.reject{ |bt| bt =~ INTERNALS }
112
- backtrace.first =~ /(.+?):(\d+(?=:|\z))/ or return ""
113
- source_file, source_line = $1, $2.to_i
114
-
115
- source = source(source_file)
116
-
117
- radius = bredth # number of surrounding lines to show
118
- region = [source_line - radius, 1].max ..
119
- [source_line + radius, source.length].min
120
-
121
- # ensure proper alignment by zero-padding line numbers
122
- format = " %2s %0#{region.last.to_s.length}d %s"
123
-
124
- pretty = region.map do |n|
125
- format % [('=>' if n == source_line), n, source[n-1].chomp]
126
- end #.unshift "[#{region.inspect}] in #{source_file}"
127
-
128
- pretty
129
- end
130
-
131
- =begin
132
- #
133
- def code_snippet_hash(exception, bredth=3)
134
- backtrace = filtered_backtrace(exception)
135
-
136
- backtrace.first =~ /(.+?):(\d+(?=:|\z))/ or return ""
137
- source_file, source_line = $1, $2.to_i
138
-
139
- source = source(source_file)
140
-
141
- radius = bredth # number of surrounding lines to show
142
- region = [source_line - radius, 1].max ..
143
- [source_line + radius, source.length].min
144
-
145
- # ensure proper alignment by zero-padding line numbers
146
- format = " %2s %0#{region.last.to_s.length}d %s"
147
-
148
- hash = {}
149
- region.each do |n|
150
- hash[n] = source[n-1].chomp
151
- end
152
- hash
153
- end
154
- =end
155
-
156
- #
157
- def code_snippet_array(exception, bredth=3)
158
- backtrace = filtered_backtrace(exception)
159
- backtrace.first =~ /(.+?):(\d+(?=:|\z))/ or return ""
160
- source_file, source_line = $1, $2.to_i
161
-
162
- source = source(source_file)
163
-
164
- radius = bredth # number of surrounding lines to show
165
- region = [source_line - radius, 1].max ..
166
- [source_line + radius, source.length].min
167
-
168
- # ensure proper alignment by zero-padding line numbers
169
- #format = " %2s %0#{region.last.to_s.length}d %s"
170
-
171
- region.map do |n|
172
- source[n-1].chomp
173
- end
174
- end
175
-
176
- #
177
- def code_snippet_omap(exception, bredth=3)
178
- backtrace = filtered_backtrace(exception)
179
- backtrace.first =~ /(.+?):(\d+(?=:|\z))/ or return ""
180
- source_file, source_line = $1, $2.to_i
181
-
182
- source = source(source_file)
183
-
184
- radius = bredth # number of surrounding lines to show
185
- region = [source_line - radius, 1].max ..
186
- [source_line + radius, source.length].min
187
-
188
- # ensure proper alignment by zero-padding line numbers
189
- #format = " %2s %0#{region.last.to_s.length}d %s"
190
-
191
- a = []
192
- region.each do |n|
193
- a << {n=> source[n-1].chomp}
194
- end
195
- a
196
- end
197
-
198
- # TODO: improve
199
- def code_line(exception)
200
- code_snippet_array(exception, 0).first.strip
201
- end
202
-
203
- #
204
- def source(file)
205
- @source[file] ||= (
206
- File.readlines(file)
207
- )
208
- end
209
-
210
- # TODO: Show more of the file name than just the basename.
211
- def file_and_line(exception)
212
- line = exception.backtrace[0]
213
- return "" unless line
214
- i = line.rindex(':in')
215
- line = i ? line[0...i] : line
216
- File.basename(line)
217
- end
218
-
219
- #
220
- def file_and_line_array(exception)
221
- case exception
222
- when Exception
223
- line = exception.backtrace[0]
224
- else
225
- line = exception[0] # backtrace
226
- end
227
- return ["", 0] unless line
228
- i = line.rindex(':in')
229
- line = i ? line[0...i] : line
230
- f, l = File.basename(line).split(':')
231
- return [f, l.to_i]
232
- end
233
-
234
-
235
- def file(exception)
236
- file_and_line_array(exception).first
237
- end
238
-
239
- def line(exception)
240
- file_and_line_array(exception).last
241
- end
242
-
243
- #
244
- def filtered_backtrace(exception)
245
- case exception
246
- when Exception
247
- backtrace = exception.backtrace
248
- else
249
- backtrace = exception
250
- end
251
- backtrace.reject{ |bt| bt =~ INTERNALS }
252
- end
253
-
254
- end
255
-
256
- end
@@ -1,73 +0,0 @@
1
- require 'lemon/view/test_reports/abstract'
2
-
3
- module Lemon::TestReports
4
-
5
- # Simple Dot-Progress Reporter
6
- class Dotprogress < Abstract
7
-
8
- def omit(unit)
9
- print "O"; $stdout.flush
10
- end
11
-
12
- def pass(unit)
13
- print "."; $stdout.flush
14
- end
15
-
16
- def fail(unit, exception)
17
- print "F"
18
- end
19
-
20
- def error(unit, exception)
21
- print "E"
22
- end
23
-
24
- def pending(unit, exception)
25
- print "P"
26
- end
27
-
28
- def finish_suite(suite)
29
- puts; puts
30
-
31
- ## if verbose
32
- unless record[:omit].empty?
33
- puts "OMITTED:\n\n"
34
- puts record[:omit].map{ |u| u.to_s }.sort.join(' ')
35
- puts
36
- end
37
- ## end
38
-
39
- unless record[:pending].empty?
40
- puts "PENDING:\n\n"
41
- record[:pending].each do |testunit, exception|
42
- puts " #{testunit}"
43
- end
44
- puts
45
- end
46
-
47
- unless record[:fail].empty?
48
- puts "FAILURES:\n\n"
49
- record[:fail].each do |testunit, exception|
50
- puts " #{testunit}"
51
- puts " #{exception}"
52
- puts " #{exception.backtrace[0]}"
53
- puts
54
- end
55
- end
56
-
57
- unless record[:error].empty?
58
- puts "ERRORS:\n\n"
59
- record[:error].each do |testunit, exception|
60
- puts " #{testunit}"
61
- puts " #{exception}"
62
- puts " #{exception.backtrace[0]}"
63
- puts
64
- end
65
- end
66
-
67
- puts tally
68
- end
69
-
70
- end
71
-
72
- end
73
-
@@ -1,146 +0,0 @@
1
- require 'lemon/view/test_reports/abstract'
2
-
3
- module Lemon::TestReports
4
-
5
- # HTML Test Reporter
6
- #
7
- # TODO: Make this more like a microformat and add timer info.
8
- class Html < Abstract
9
-
10
- #
11
- def start_suite(suite)
12
- timer_reset
13
- @html = []
14
- @html << %[<html>]
15
- @html << %[<head>]
16
- @html << %[<title>Unit Test Report</title>]
17
- @html << %[ <style>]
18
- @html << %[ html{ background: #fff; margin: 0; padding: 0; font-family: helvetica; }]
19
- @html << %[ body{ margin: 0; padding: 0;}]
20
- @html << %[ h3{color:#555;}]
21
- @html << %[ #main{ margin: 0 auto; color: #110; width: 600px; ]
22
- @html << %[ border-right: 1px solid #ddd; border-left: 1px solid #ddd; ]
23
- @html << %[ padding: 10px 30px; width: 500px; } ]
24
- @html << %[ .lemon{ color: gold; font-size: 22px; font-weight: bold; ]
25
- @html << %[ font-family: courier; margin-bottom: -15px;}]
26
- @html << %[ .tally{ font-weight: bold; margin-bottom: 10px; }]
27
- @html << %[ .omit{ color: cyan; }]
28
- @html << %[ .pass{ color: green; }]
29
- @html << %[ .fail{ color: red; }]
30
- @html << %[ .footer{ font-size: 0.7em; color: #666; margin: 20px 0; }]
31
- @html << %[ </style>]
32
- @html << %[</head>]
33
- @html << %[<body>]
34
- @html << %[<div id="main">]
35
- @html << %[<div class="lemon">L E M O N</div>]
36
- @html << %[<h1>Unit Test Report</h1>]
37
- @body = []
38
- end
39
-
40
- #
41
- def start_case(tc)
42
- @body << "<h2>"
43
- @body << tc.to_s
44
- @body << "</h2>"
45
- end
46
-
47
- #
48
- def instance(instance)
49
- @body << "<h3>"
50
- @body << "#{instance}"
51
- @body << "</h3>"
52
- end
53
-
54
- #
55
- def start_unit(unit)
56
- instance = unit.instance
57
- if @instance != instance
58
- @instance = instance
59
- instance(instance)
60
- end
61
- end
62
-
63
- #
64
- def omit(unit)
65
- @body << %[<li class="omit">]
66
- @body << " %s %s %s" % ["OMIT", unit.name, unit.aspect]
67
- @body << %[</li>]
68
- end
69
-
70
- #
71
- def pass(unit)
72
- @body << %[<li class="pass">]
73
- @body << "%s %s %s" % ["PASS", unit.name, unit.aspect]
74
- @body << %[</li>]
75
- end
76
-
77
- #
78
- def fail(unit, exception)
79
- @body << %[<li class="fail">]
80
- @body << "%s %s %s" % ["FAIL", unit.name, unit.aspect]
81
- @body << "<pre>"
82
- @body << " FAIL #{exception.backtrace[0]}"
83
- @body << " #{exception}"
84
- @body << "</pre>"
85
- @body << %[</li>]
86
- end
87
-
88
- #
89
- def error(unit, exception)
90
- @body << %[<li class="error">]
91
- @body << "%s %s %s" % ["ERROR", unit.name, unit.aspect]
92
- @body << "<pre>"
93
- @body << " ERROR #{exception.class}"
94
- @body << " #{exception}"
95
- @body << " " + exception.backtrace.join("\n ")
96
- @body << "</pre>"
97
- @body << %[</li>]
98
- end
99
-
100
- #
101
- def pending(unit, exception)
102
- @body << %[<li class="pending">]
103
- @body << " %s %s %s" % ["PENDING", unit.name, unit.aspect]
104
- @body << %[</li>]
105
- end
106
-
107
- #
108
- def finish_suite(suite)
109
- @html << ""
110
- @html << %[<div class="tally">]
111
- @html << tally
112
- @html << %[</div>]
113
- @html << ""
114
-
115
- @body << ""
116
- @body << %[<div class="footer">]
117
- @body << %[Generated by <a href="http://proutils.github.com/lemon">Lemon</a>]
118
- @body << %[on #{Time.now}.]
119
- @body << %[</div>]
120
- @body << ""
121
- @body << %[</div>]
122
- @body << %[</div>]
123
- @body << ""
124
- @body << %[</body>]
125
- @body << %[</html>]
126
-
127
- puts @html.join("\n")
128
- puts @body.join("\n")
129
- end
130
-
131
- #
132
- def timer
133
- secs = Time.now - @time
134
- @time = Time.now
135
- return "%0.5fs" % [secs.to_s]
136
- end
137
-
138
- #
139
- def timer_reset
140
- @time = Time.now
141
- end
142
-
143
- end
144
-
145
- end
146
-