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
@@ -0,0 +1,52 @@
1
+ module Lemon
2
+
3
+ module CLI
4
+
5
+ require 'lemon/cli/base'
6
+
7
+ # Coverage Command
8
+ class Coverage < Base
9
+
10
+ # Ouput coverage report.
11
+ def command_run(test_files)
12
+ require 'lemon/coverage/analyzer'
13
+
14
+ #loadpath = options[:loadpath] || []
15
+ #requires = options[:requires] || []
16
+
17
+ #loadpath.each{ |path| $LOAD_PATH.unshift(path) }
18
+ #requires.each{ |path| require(path) }
19
+
20
+ $stderr.print "Calculating... "
21
+ $stderr.flush
22
+
23
+ cover = Lemon::CoverageAnalyzer.new(test_files, options)
24
+
25
+ cover.calculate # this just helps calcs get done up front
26
+
27
+ $stderr.puts
28
+
29
+ cover.render
30
+ end
31
+
32
+ #
33
+ def command_parse(argv)
34
+ option_parser.banner = "Usage: lemonade coverage [options] [files ...]"
35
+ #option_parser.separator("Check test coverage.")
36
+
37
+ option_namespaces
38
+ option_private
39
+ option_zealous
40
+ option_output
41
+ option_format
42
+ option_loadpath
43
+ option_requires
44
+
45
+ option_parser.parse!(argv)
46
+ end
47
+
48
+ end
49
+
50
+ end
51
+
52
+ end
@@ -0,0 +1,51 @@
1
+ module Lemon
2
+
3
+ module CLI
4
+
5
+ require 'lemon/cli/base'
6
+
7
+ # Generate Command
8
+ class Generate < Base
9
+
10
+ # Generate test templates.
11
+ def command_run(test_files)
12
+ require 'lemon/generator'
13
+
14
+ loadpath = options[:loadpath] || []
15
+ requires = options[:requires] || []
16
+
17
+ loadpath.each{ |path| $LOAD_PATH.unshift(path) }
18
+ requires.each{ |path| require(path) }
19
+
20
+ #cover = options[:uncovered]
21
+ #suite = Lemon::TestSuite.new(test_files, :cover=>cover) #, :cover_all=>true)
22
+ generator = Lemon::Generator.new(test_files, options)
23
+
24
+ #if uncovered
25
+ # puts cover.generate_uncovered #(output)
26
+ #else
27
+ puts generator.generate #(output)
28
+ #end
29
+ end
30
+
31
+ #
32
+ def command_parse(argv)
33
+ option_parser.banner = "Usage: lemonade generate [options] [files ...]"
34
+ #option_parser.separator("Generate test scaffolding.")
35
+
36
+ option_namespaces
37
+ option_covered
38
+ option_uncovered
39
+ option_all
40
+ option_private
41
+ option_loadpath
42
+ option_requires
43
+
44
+ option_parser.parse!(argv)
45
+ end
46
+
47
+ end
48
+
49
+ end
50
+
51
+ end
@@ -0,0 +1,50 @@
1
+ module Lemon
2
+
3
+ module CLI
4
+
5
+ require 'lemon/cli/base'
6
+
7
+ # Test Command
8
+ class Test < Base
9
+
10
+ # Run unit tests.
11
+ def command_run(scripts)
12
+ require 'lemon/runner'
13
+
14
+ loadpath = options[:loadpath] || ['lib'] # + ['lib'] ?
15
+ requires = options[:requires] || []
16
+
17
+ loadpath.each{ |path| $LOAD_PATH.unshift(path) }
18
+ requires.each{ |path| require(path) }
19
+
20
+ #suite = Lemon::Test::Suite.new(files, :cover=>cover)
21
+ #runner = Lemon::Runner.new(suite, :format=>format, :cover=>cover, :namespaces=>namespaces)
22
+
23
+ runner = Lemon::TestRunner.new(
24
+ scripts, :format=>options[:format], :namespaces=>options[:namespaces]
25
+ )
26
+
27
+ success = runner.run
28
+
29
+ exit -1 unless success
30
+ end
31
+
32
+ #
33
+ def command_parse(argv)
34
+ option_parser.banner = "Usage: lemonade test [options] [files ...]"
35
+ #option_parser.separator("Run unit tests.")
36
+
37
+ option_format
38
+ option_verbose
39
+ option_namespaces
40
+ option_loadpath
41
+ option_requires
42
+
43
+ option_parser.parse!(argv)
44
+ end
45
+
46
+ end
47
+
48
+ end
49
+
50
+ end
@@ -0,0 +1,7 @@
1
+ if RUBY_VERSION > '1.9'
2
+ require_relative 'core_ext/kernel'
3
+ require_relative 'core_ext/omission'
4
+ else
5
+ require 'lemon/core_ext/kernel'
6
+ require 'lemon/core_ext/omission'
7
+ end
@@ -0,0 +1,20 @@
1
+ module Kernel
2
+
3
+ unless method_defined?(:qua_class)
4
+
5
+ def qua_class(&block)
6
+ if block_given?
7
+ (class << self; self; end).class_eval(&block)
8
+ else
9
+ (class << self; self; end)
10
+ end
11
+ end
12
+
13
+ alias :quaclass :qua_class
14
+ end
15
+
16
+ unless method_defined?(:singleton_class)
17
+ alias :singleton_class :quaclass
18
+ end
19
+
20
+ end
@@ -0,0 +1,18 @@
1
+ # The Omission class is a subclass of NotImplementedError with
2
+ # it's assertion flag set to true. This will be recognized by
3
+ # Ruby Test as a test omission.
4
+ #
5
+ # @example
6
+ # test "some feature" do
7
+ # raise Omission, "feature can't be tested"
8
+ # end
9
+ #
10
+ class Omission < NotImplementedError
11
+ def assertion?
12
+ true
13
+ end
14
+ def to_proc
15
+ error = self
16
+ lambda{ raise error }
17
+ end
18
+ end
@@ -1,5 +1,5 @@
1
- require 'lemon/model/snapshot'
2
- require 'lemon/model/main'
1
+ require 'lemon'
2
+ require 'lemon/coverage/snapshot'
3
3
 
4
4
  module Lemon
5
5
 
@@ -38,13 +38,15 @@ module Lemon
38
38
 
39
39
  @reporter = reporter_find(@format)
40
40
 
41
+ reset_suite
42
+
41
43
  initialize_prerequisites(options)
42
44
 
43
- @canonical = Snapshot.capture #system #@suite.canonical
45
+ @canonical = Snapshot.capture #system #@suite.canonical
44
46
 
45
47
  #@suite = Lemon.suite
46
- @suite = Lemon::TestSuite.new(files, :cover=>true) #@suite = suite
47
- Lemon.suite = @suite
48
+ #@suite = Lemon::TestSuite.new(files, :cover=>true) #@suite = suite
49
+ #Lemon.suite = @suite
48
50
 
49
51
  files = files.map{ |f| Dir[f] }.flatten
50
52
  files = files.map{ |f|
@@ -57,6 +59,8 @@ module Lemon
57
59
  files = files.map{ |f| File.expand_path(f) }
58
60
 
59
61
  files.each{ |s| load s } #require s }
62
+
63
+ @suite = $TEST_SUITE.dup
60
64
  end
61
65
 
62
66
  # Load in prerequisites
@@ -69,7 +73,14 @@ module Lemon
69
73
  end
70
74
 
71
75
  #
72
- attr :suite
76
+ def reset_suite
77
+ $TEST_SUITE = []
78
+ end
79
+
80
+ #
81
+ def suite
82
+ @suite
83
+ end
73
84
 
74
85
  # Paths of lemon tests and/or ruby scripts to be compared and covered.
75
86
  # This can include directories too, in which case all .rb scripts below
@@ -131,19 +142,31 @@ module Lemon
131
142
  def covered_units
132
143
  @covered_units ||= (
133
144
  list = []
134
- suite.each do |testcase|
135
- testcase.testunits.each do |unit|
136
- list << Snapshot::Unit.new(
137
- unit.testcase.target,
138
- unit.target,
139
- :function=>unit.function?
140
- )
141
- end
145
+ suite.each do |test|
146
+ covered_unit(test, list)
142
147
  end
143
148
  list.uniq
144
149
  )
145
150
  end
146
151
 
152
+ #
153
+ def covered_unit(test, list)
154
+ case test
155
+ when Lemon::TestModule
156
+ test.each do |t|
157
+ covered_unit(t, list)
158
+ end
159
+ when Lemon::TestMethod
160
+ list << Snapshot::Unit.new(
161
+ test.context.target,
162
+ test.target,
163
+ :function=>test.function?
164
+ )
165
+ else
166
+ # ignore
167
+ end
168
+ end
169
+
147
170
  #
148
171
  def covered_namespaces
149
172
  @covered_namespaces ||= covered_units.map{ |u| u.namespace }.uniq
@@ -325,19 +348,18 @@ module Lemon
325
348
  /^#{format}/ =~ name
326
349
  end
327
350
  raise "unsupported format" unless format
328
- require "lemon/view/cover_reports/#{format}"
351
+ require "lemon/coverage/formats/#{format}"
329
352
  reporter = Lemon::CoverReports.const_get(format.capitalize)
330
353
  reporter.new(self)
331
354
  end
332
355
 
333
356
  #
334
357
  def reporter_list
335
- Dir[File.dirname(__FILE__) + '/../view/cover_reports/*.rb'].map do |rb|
358
+ Dir[File.dirname(__FILE__) + '/formats/*.rb'].map do |rb|
336
359
  File.basename(rb).chomp('.rb')
337
360
  end
338
361
  end
339
362
 
340
- end#class Coverage
341
-
342
- end#module Lemon
363
+ end
343
364
 
365
+ end
@@ -1,4 +1,4 @@
1
- require 'lemon/view/cover_reports/abstract'
1
+ require 'lemon/coverage/formats/abstract'
2
2
 
3
3
  module Lemon::CoverReports
4
4
 
@@ -1,4 +1,4 @@
1
- require 'lemon/view/cover_reports/abstract'
1
+ require 'lemon/coverage/formats/abstract'
2
2
 
3
3
  module Lemon::CoverReports
4
4
 
@@ -1,4 +1,4 @@
1
- require 'lemon/view/cover_reports/abstract'
1
+ require 'lemon/coverage/formats/abstract'
2
2
 
3
3
  module Lemon::CoverReports
4
4
 
@@ -1,4 +1,4 @@
1
- require 'lemon/view/cover_reports/abstract'
1
+ require 'lemon/coverage/formats/abstract'
2
2
 
3
3
  module Lemon::CoverReports
4
4
 
@@ -1,12 +1,33 @@
1
- require 'lemon/controller/coverage_analyzer'
2
-
3
1
  module Lemon
4
2
 
3
+ require 'lemon/coverage/analyzer'
4
+
5
+ #--
6
+ # TODO: Generator options for selecting all, covered and uncovered still
7
+ # need some clarification.
8
+ #++
9
+
10
+ # Test Scaffold Generator.
5
11
  #
6
- class ScaffoldGenerator
12
+ class Generator
7
13
 
8
14
  # New Scaffold Generator.
9
15
  #
16
+ # @option options [Array] :namespaces
17
+ # List of class/module names to limit scaffolding.
18
+ #
19
+ # @option options [Boolean] :private
20
+ # Include private methods in scaffolding.
21
+ #
22
+ # @option options [Boolean] :covered
23
+ # Include covered targets in scaffolding.
24
+ #
25
+ # @option options [Boolean] :uncovered
26
+ # Include uncovered targets in scaffolding.
27
+ #
28
+ # @option options [Boolean] :all
29
+ # Include all possible targets in scaffolding.
30
+ #
10
31
  def initialize(files, options={})
11
32
  @files = files
12
33
 
@@ -15,8 +36,16 @@ module Lemon
15
36
 
16
37
  @namespaces = options[:namespaces]
17
38
  @private = options[:private]
39
+ @covered = options[:covered]
18
40
  @uncovered = options[:uncovered]
19
41
  @all = options[:all]
42
+
43
+ if @namespaces
44
+ unless @covered or @uncovered
45
+ @all = true
46
+ end
47
+ end
48
+
20
49
  end
21
50
 
22
51
  # Returns CoverageAnalyzer instance.
@@ -24,22 +53,22 @@ module Lemon
24
53
  @coverage
25
54
  end
26
55
 
27
- #
56
+ # List of class and module namespaces to limit scaffolding.
28
57
  def namespaces
29
58
  @namespaces
30
59
  end
31
60
 
32
- #
61
+ # Include all targets.
33
62
  def all?
34
63
  @all
35
64
  end
36
65
 
37
- #
66
+ # Include targets that are already covered.
38
67
  def covered?
39
68
  @covered
40
69
  end
41
70
 
42
- # Include only uncovered methods.
71
+ # Include only uncovered targrts.
43
72
  def uncovered?
44
73
  @uncovered
45
74
  end
@@ -60,22 +89,22 @@ module Lemon
60
89
  end
61
90
  end
62
91
 
63
- #
92
+ # Generate code template for covered.
64
93
  def generate_target
65
94
  render(filter(coverage.target.units))
66
95
  end
67
96
 
68
- #
97
+ # Generate code template for uncovered.
69
98
  def generate_uncovered
70
99
  render(filter(coverage.uncovered))
71
100
  end
72
101
 
73
- # Generate code template.
102
+ # Generate code template for all.
74
103
  def generate_all
75
104
  render(Snapshot.capture(namespaces).units)
76
105
  end
77
106
 
78
- #
107
+ # Filter targets to include only specified namespaces.
79
108
  def filter(units)
80
109
  return units if namespaces.nil? or namespaces.empty?
81
110
  units.select do |u|
@@ -90,13 +119,23 @@ module Lemon
90
119
  code = []
91
120
  mods = units.group_by{ |u| u.namespace }
92
121
  mods.each do |mod, units|
93
- code << "TestCase #{mod} do"
122
+ if Class === mod
123
+ code << "TestClass #{mod} do"
124
+ else
125
+ code << "TestModule #{mod} do"
126
+ end
94
127
  units.each do |unit|
95
128
  next unless private? or unit.public?
96
129
  if unit.function?
97
- code << "\n MetaUnit :#{unit.method} => '' do\n\n end"
130
+ code << "\n ClassMethod :#{unit.method} do"
131
+ code << "\n Test '' do"
132
+ code << "\n end"
133
+ code << "end"
98
134
  else
99
- code << "\n Unit :#{unit.method} => '' do\n\n end"
135
+ code << "\n Method :#{unit.method} do"
136
+ code << "\n Test '' do"
137
+ code << "\n end"
138
+ code << "\n end"
100
139
  end
101
140
  end
102
141
  code << "\nend\n"