lemon 0.8.5 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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"