lemon 0.9.0 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. data/.ruby +23 -14
  2. data/.yardopts +6 -0
  3. data/Config.rb +14 -0
  4. data/{HISTORY.rdoc → HISTORY.md} +26 -11
  5. data/LICENSE.txt +27 -0
  6. data/README.md +42 -28
  7. data/SPECSHEET.md +314 -0
  8. data/bin/{lemonade → lemons} +0 -0
  9. data/lib/lemon.yml +23 -14
  10. data/lib/lemon/cli.rb +19 -8
  11. data/lib/lemon/cli/base.rb +50 -20
  12. data/lib/lemon/cli/generate.rb +51 -16
  13. data/lib/lemon/cli/lemon.ascii +84 -0
  14. data/lib/lemon/cli/obrother.rb +35 -0
  15. data/lib/lemon/cli/scaffold.rb +116 -0
  16. data/lib/lemon/core_ext.rb +2 -2
  17. data/lib/lemon/core_ext/module.rb +9 -0
  18. data/lib/lemon/coverage/analyzer.rb +76 -5
  19. data/lib/lemon/coverage/cover_unit.rb +38 -14
  20. data/lib/lemon/coverage/formats/verbose.rb +1 -1
  21. data/lib/lemon/coverage/generator.rb +196 -0
  22. data/lib/lemon/coverage/snapshot.rb +16 -16
  23. data/lib/lemon/coverage/source_parser.rb +103 -37
  24. data/lib/lemon/ignore_callers.rb +19 -0
  25. data/lib/lemon/test_case.rb +135 -26
  26. data/lib/lemon/test_class.rb +16 -3
  27. data/lib/lemon/test_class_method.rb +58 -0
  28. data/lib/lemon/test_method.rb +57 -68
  29. data/lib/lemon/test_module.rb +47 -44
  30. data/lib/lemon/test_proc.rb +28 -2
  31. data/lib/lemon/test_scope.rb +14 -0
  32. data/lib/lemon/test_setup.rb +1 -1
  33. data/lib/lemon/test_world.rb +7 -0
  34. data/{work/deprecated/features/support → spec/applique}/ae.rb +0 -0
  35. data/spec/coverage/{01_complete.rdoc → 01_complete.md} +3 -3
  36. data/spec/coverage/{02_incomplete.rdoc → 02_incomplete.md} +2 -2
  37. data/spec/coverage/{03_extensions.rdoc → 03_extensions.md} +2 -2
  38. data/try/case_scope.rb +19 -0
  39. metadata +50 -102
  40. data/.gemspec +0 -152
  41. data/.gitignore +0 -8
  42. data/.reap/digest +0 -678
  43. data/.reap/test.reap +0 -7
  44. data/Assembly +0 -37
  45. data/COPYING.rdoc +0 -33
  46. data/MANIFEST +0 -55
  47. data/PROFILE +0 -30
  48. data/Rakefile +0 -23
  49. data/VERSION +0 -1
  50. data/lib/lemon/core_ext/omission.rb +0 -18
  51. data/lib/lemon/generator.rb +0 -149
  52. data/notes/2010-05-05-coverage.rdoc +0 -47
  53. data/notes/2010-05-06-files-not-classes.rdoc +0 -19
  54. data/notes/2010-07-11-acid-testing.rdoc +0 -52
  55. data/notes/2010-08-02-enforcing-the-unit.md +0 -68
  56. data/notes/2010-08-03-new-api.md +0 -37
  57. data/notes/2011-07-07-nailing-down-the-nomenclature.md +0 -6
  58. data/site/.rsync-filter +0 -8
  59. data/site/assets/images/cut-lemon.png +0 -0
  60. data/site/assets/images/forkme.png +0 -0
  61. data/site/assets/images/github-logo.png +0 -0
  62. data/site/assets/images/lemon.jpg +0 -0
  63. data/site/assets/images/lemon.svg +0 -39
  64. data/site/assets/images/lemons-are-good.png +0 -0
  65. data/site/assets/images/opensource.png +0 -0
  66. data/site/assets/images/ruby-logo.png +0 -0
  67. data/site/assets/images/skin.jpg +0 -0
  68. data/site/assets/images/skin1.jpg +0 -0
  69. data/site/assets/images/tap.png +0 -0
  70. data/site/assets/images/title.png +0 -0
  71. data/site/assets/styles/class.css +0 -6
  72. data/site/assets/styles/reset.css +0 -17
  73. data/site/assets/styles/site.css +0 -33
  74. data/site/index.html +0 -218
  75. data/work/deprecated/command/abstract.rb +0 -29
  76. data/work/deprecated/command/coverage.rb +0 -115
  77. data/work/deprecated/command/generate.rb +0 -124
  78. data/work/deprecated/command/test.rb +0 -112
  79. data/work/deprecated/cucumber.yml +0 -3
  80. data/work/deprecated/features/coverage.feature +0 -65
  81. data/work/deprecated/features/generate.feature +0 -66
  82. data/work/deprecated/features/step_definitions/coverage_steps.rb +0 -1
  83. data/work/deprecated/features/support/aruba.rb +0 -1
  84. data/work/deprecated/features/test.feature +0 -67
  85. data/work/deprecated/model/dsl/advice.rb +0 -78
  86. data/work/deprecated/model/dsl/subject.rb +0 -40
  87. data/work/deprecated/model/main.rb +0 -87
  88. data/work/deprecated/model/test.rb +0 -54
  89. data/work/deprecated/model/test_base_dsl.rb +0 -88
  90. data/work/deprecated/model/test_clause.rb +0 -112
  91. data/work/deprecated/model/test_context.rb +0 -90
  92. data/work/deprecated/model/test_feature.rb +0 -128
  93. data/work/deprecated/model/test_scenario.rb +0 -137
  94. data/work/deprecated/model/test_suite.rb +0 -297
  95. data/work/deprecated/rake.rb +0 -103
  96. data/work/deprecated/test/case_coverage_analyzer.rb +0 -25
  97. data/work/deprecated/test/case_test_case_dsl.rb +0 -46
  98. data/work/deprecated/test/fixtures/case_complete.rb +0 -25
  99. data/work/deprecated/test/fixtures/case_inclusion.rb +0 -18
  100. data/work/deprecated/test/fixtures/case_incomplete.rb +0 -12
  101. data/work/deprecated/test/fixtures/example.rb +0 -13
  102. data/work/deprecated/test/fixtures/helper.rb +0 -13
  103. data/work/deprecated/test/runner +0 -2
  104. data/work/old-tests/case_example.rb +0 -15
  105. data/work/old-tests/feature_example.rb +0 -40
  106. data/work/reference/dsl2.rb +0 -140
  107. data/work/reference/dynamic_constant_lookup.rb +0 -76
@@ -1,66 +0,0 @@
1
- Feature: Coverage
2
- As a developer
3
- In order to improve test coverge
4
- I want to able to generate test scaffolding
5
- And limit the scaffolding to test units not already covered
6
-
7
- Scenario: Complete Example Case
8
- Given a directory named "example"
9
- Given a file named "example/lib/example.rb" with:
10
- """
11
- class X
12
- def a; "a"; end
13
- def b; "b"; end
14
- def c; "c"; end
15
- end
16
- class Y
17
- def q; "q"; end
18
- end
19
- """
20
- Given a file named "example/test/case_complete.rb" with:
21
- """
22
- Covers 'example'
23
- TestCase X do
24
- Unit :a => "Returns a String" do ; X.new.a.assert.is_a?(String) ; end
25
- Unit :b => "Returns a String" do ; X.new.b.assert.is_a?(String) ; end
26
- Unit :c => "Returns a String" do ; X.new.c.assert.is_a?(String) ; end
27
- end
28
- TestCase Y do
29
- Unit :q => "Returns a String" do ; Y.new.q.assert.is_a?(String) ; end
30
- end
31
- """
32
- When I cd to "example"
33
- And I run "lemon -g -u -Ilib test/case_complete.rb"
34
- Then the stdout should not contain "Unit :a"
35
- And the stdout should not contain "Unit :b"
36
- And the stdout should not contain "Unit :c"
37
- And the stdout should not contain "Unit :q"
38
-
39
- Scenario: Incomplete Example Case
40
- Given a directory named "example"
41
- Given a file named "example/lib/example.rb" with:
42
- """
43
- class X
44
- def a; "a"; end
45
- def b; "b"; end
46
- def c; "c"; end
47
- end
48
- class Y
49
- def q; "q"; end
50
- end
51
- """
52
- Given a file named "example/test/case_complete.rb" with:
53
- """
54
- Covers 'example'
55
- TestCase X do
56
- Unit :a => "Returns a String" do ; X.new.a.assert.is_a?(String) ; end
57
- Unit :b => "Returns a String" do ; X.new.b.assert.is_a?(Fixnum) ; end
58
- Unit :d => "Returns a String" do ; X.new.d.assert.is_a?(String) ; end
59
- end
60
- """
61
- When I cd to "example"
62
- And I run "lemon -g -u -Ilib test/case_complete.rb"
63
- Then the stdout should not contain "Unit :a"
64
- And the stdout should not contain "Unit :b"
65
- And the stdout should contain "Unit :c"
66
-
@@ -1 +0,0 @@
1
- require 'aruba'
@@ -1,67 +0,0 @@
1
- Feature: Coverage
2
- As a developer
3
- In order to improve test coverge
4
- I want to able to write unit tests that target methods
5
- And run those tests
6
-
7
- Scenario: Complete Example Case
8
- Given a directory named "example"
9
- Given a file named "example/lib/example.rb" with:
10
- """
11
- class X
12
- def a; "a"; end
13
- def b; "b"; end
14
- def c; "c"; end
15
- end
16
- class Y
17
- def q; "q"; end
18
- end
19
- """
20
- Given a file named "example/test/case_complete.rb" with:
21
- """
22
- Covers 'example'
23
- TestCase X do
24
- Unit :a => "Returns a String" do ; X.new.a.assert.is_a?(String) ; end
25
- Unit :b => "Returns a String" do ; X.new.b.assert.is_a?(String) ; end
26
- Unit :c => "Returns a String" do ; X.new.c.assert.is_a?(String) ; end
27
- end
28
- TestCase Y do
29
- Unit :q => "Returns a String" do ; Y.new.q.assert.is_a?(String) ; end
30
- end
31
- """
32
- When I cd to "example"
33
- And I run "lemon -Ilib -v test/case_complete.rb"
34
- Then the stdout should contain "4 tests"
35
- And the stdout should contain "4 pass"
36
- And the stdout should contain "0 fail"
37
- And the stdout should contain "0 err"
38
-
39
- Scenario: Incomplete Example Case
40
- Given a directory named "example"
41
- Given a file named "example/lib/example.rb" with:
42
- """
43
- class X
44
- def a; "a"; end
45
- def b; "b"; end
46
- def c; "c"; end
47
- end
48
- class Y
49
- def q; "q"; end
50
- end
51
- """
52
- Given a file named "example/test/case_complete.rb" with:
53
- """
54
- Covers 'example'
55
- TestCase X do
56
- Unit :a => "Returns a String" do ; X.new.a.assert.is_a?(String) ; end
57
- Unit :b => "Returns a String" do ; X.new.b.assert.is_a?(Fixnum) ; end
58
- Unit :d => "Returns a String" do ; X.new.d.assert.is_a?(String) ; end
59
- end
60
- """
61
- When I cd to "example"
62
- And I run "lemon -Ilib -v test/case_complete.rb"
63
- Then the stdout should contain "3 tests"
64
- And the stdout should contain "1 pass"
65
- And the stdout should contain "1 fail"
66
- And the stdout should contain "1 err"
67
-
@@ -1,78 +0,0 @@
1
- module Lemon
2
-
3
- module DSL
4
-
5
- #
6
- #--
7
- # TODO: Allow Before and After to handle before and after
8
- # concerns in addition to units?
9
- #++
10
- module Advice
11
-
12
- # Define a _complex_ before procedure. The #before method allows
13
- # before procedures to be defined that are triggered by a match
14
- # against the unit's target method name or _aspect_ description.
15
- # This allows groups of tests to be defined that share special
16
- # setup code.
17
- #
18
- # @example
19
- # Method :puts do
20
- # Test "standard output (@stdout)" do
21
- # puts "Hello"
22
- # end
23
- #
24
- # Before /@stdout/ do
25
- # $stdout = StringIO.new
26
- # end
27
- #
28
- # After /@stdout/ do
29
- # $stdout = STDOUT
30
- # end
31
- # end
32
- #
33
- # @param [Array<Symbol,Regexp>] matches
34
- # List of match critera that must _all_ be matched
35
- # to trigger the before procedure.
36
- #
37
- def Before(*matches, &procedure)
38
- @context.advice[:before][matches] = procedure
39
- end
40
-
41
- alias_method :before, :Before
42
-
43
- # Define a _complex_ after procedure. The #before method allows
44
- # before procedures to be defined that are triggered by a match
45
- # against the unit's target method name or _aspect_ description.
46
- # This allows groups of tests to be defined that share special
47
- # teardown code.
48
- #
49
- # @example
50
- # Method :puts do
51
- # Test "standard output (@stdout)" do
52
- # puts "Hello"
53
- # end
54
- #
55
- # Before /@stdout/ do
56
- # $stdout = StringIO.new
57
- # end
58
- #
59
- # After /@stdout/ do
60
- # $stdout = STDOUT
61
- # end
62
- # end
63
- #
64
- # @param [Array<Symbol,Regexp>] matches
65
- # List of match critera that must _all_ be matched
66
- # to trigger the after procedure.
67
- #
68
- def After(*matches, &procedure)
69
- @context.advice[:after][matches] = procedure
70
- end
71
-
72
- alias_method :after, :After
73
-
74
- end
75
-
76
- end
77
-
78
- end
@@ -1,40 +0,0 @@
1
- module Lemon
2
-
3
- module DSL
4
-
5
- #
6
- module Subject
7
-
8
- # Setup is used to set things up for each unit test.
9
- # The setup procedure is run before each unit.
10
- #
11
- # @param [String] description
12
- # A brief description of what the setup procedure sets-up.
13
- #
14
- def Setup(description=nil, &procedure)
15
- if procedure
16
- @subject = TestSubject.new(@test_case, description, &procedure)
17
- end
18
- end
19
-
20
- alias_method :setup, :Setup
21
-
22
- alias_method :Concern, :Setup
23
- alias_method :concern, :Setup
24
-
25
- alias_method :Subject, :Setup
26
- alias_method :subject, :Setup
27
-
28
- # Teardown procedure is used to clean-up after each unit test.
29
- #
30
- def Teardown(&procedure)
31
- @subject.teardown = procedure
32
- end
33
-
34
- alias_method :teardown, :Teardown
35
-
36
- end
37
-
38
- end
39
-
40
- end
@@ -1,87 +0,0 @@
1
- # NOTE: This code is not being used. It is here for the time being
2
- # on the outseide change that I decide to go back to a toplevel design.
3
-
4
- require 'lemon/model/test_suite'
5
-
6
- class << self
7
-
8
- #
9
- def Covers(script)
10
- Lemon.suite.dsl.covers(script)
11
- end
12
- alias :Coverage :Covers
13
-
14
- # Define a general test case.
15
- def Case(target, &block)
16
- Lemon.suite.dsl.test_case(target, &block)
17
- end
18
-
19
- # Define a class test.
20
- def Class(target_class, &block)
21
- Lemon.suite.dsl.test_class(target_class, &block)
22
- end
23
-
24
- # Define a module test.
25
- def Module(target_module, &block)
26
- Lemon.suite.dsl.test_module(target_module, &block)
27
- end
28
-
29
- # Define a test feature.
30
- def Feature(target, &block)
31
- Lemon.suite.dsl.test_feature(target, &block)
32
- end
33
-
34
- #
35
- #def Before(match=nil, &block)
36
- # Lemon.suite.Before(match, &block)
37
- #end
38
-
39
- #
40
- #def After(match=nil, &block)
41
- # Lemon.suite.After(match, &block)
42
- #end
43
-
44
- #
45
- #def Helper(script)
46
- # Lemon.suite.Helper(script)
47
- #end
48
- end
49
-
50
- =begin
51
- # FIXME: This is a BIG FAT HACK! For the life of me I cannot find
52
- # a way to resolve module constants included in the test cases.
53
- # Because of closure, the constant lookup goes through here, and not
54
- # the Case singleton class. So to work around we must note each test
55
- # before it is run, and reroute the missing constants.
56
- #
57
- # This sucks and it is not thread safe. If anyone know how to fix,
58
- # please let me know. See Unit#call for the other end of this hack.
59
- #
60
- def Object.const_missing(name)
61
- if unit = Lemon.test_stack.last
62
- begin
63
- (class << unit.test_case; self; end).const_get(name)
64
- rescue NameError
65
- super(name)
66
- end
67
- else
68
- super(name)
69
- end
70
- end
71
-
72
- #def Object.const_missing(name)
73
- # if unit = Lemon.test_stack.last
74
- # klass = (class << unit.test_case; self; end)
75
- # if klass.const_defined?(name)
76
- # return klass.const_get(name)
77
- # end
78
- # end
79
- # super(name)
80
- #end
81
-
82
- # Get current running test. Used for the BIG FAT HACK.
83
- def Lemon.test_stack
84
- @@test_stack ||= []
85
- end
86
- =end
87
-
@@ -1,54 +0,0 @@
1
- require 'lemon/model/test_suite'
2
-
3
- module Test
4
- extend self
5
-
6
- #
7
- def covers(script)
8
- Lemon.suite.dsl.covers(script)
9
- end
10
- alias :Covers :covers
11
-
12
- alias :coverage :covers
13
- alias :Coverage :covers
14
-
15
- # Define a general test case.
16
- def case(target, &block)
17
- Lemon.suite.dsl.test_case(target, &block)
18
- end
19
- alias :Case :case
20
-
21
- # Define a class test.
22
- def class(target_class, &block)
23
- Lemon.suite.dsl.test_class(target_class, &block)
24
- end
25
- alias :Class :class
26
-
27
- # Define a module test.
28
- def module(target_module, &block)
29
- Lemon.suite.dsl.test_module(target_module, &block)
30
- end
31
- alias :Module :module
32
-
33
- # Define a test feature.
34
- def feature(target, &block)
35
- Lemon.suite.dsl.test_feature(target, &block)
36
- end
37
- alias :Feature :feature
38
-
39
- #
40
- #def Before(match=nil, &block)
41
- # Lemon.suite.Before(match, &block)
42
- #end
43
-
44
- #
45
- #def After(match=nil, &block)
46
- # Lemon.suite.After(match, &block)
47
- #end
48
-
49
- #
50
- #def Helper(script)
51
- # Lemon.suite.Helper(script)
52
- #end
53
-
54
- end
@@ -1,88 +0,0 @@
1
- module Lemon
2
-
3
- # Base class for TestCase DSLs.
4
- class BaseDSL < Module
5
-
6
- #
7
- def initialize(context, &code)
8
- @context = context
9
- @subject = context.subject
10
-
11
- module_eval(&code)
12
- end
13
-
14
- #
15
- def context(description, &block)
16
- @context.tests << TestCase.new(@context, description, &block)
17
- end
18
-
19
- #
20
- def test(description, &procedure)
21
- test = TestProc.new(
22
- @context,
23
- :description => description,
24
- :subject => subject,
25
- &procedure
26
- )
27
- @context.tests << test
28
- test
29
- end
30
-
31
- # Omit a test or test case from being run.
32
- #
33
- # omit test "something or other" do
34
- # # ...
35
- # end
36
- #
37
- def omit(test_or_case)
38
- test_or_case.omit = true
39
- end
40
- alias_method :Omit, :omit
41
-
42
-
43
-
44
-
45
- # Load a helper script applicable to this test case. Unlike requiring
46
- # a helper script, the #helper method will eval the file's contents
47
- # directly into the test context (using instance_eval).
48
- #
49
- # @param [String] file
50
- # File to eval into test context.
51
- #
52
- # FIXME: This is at odds with loading helpers automatically. How
53
- # to handle?
54
- def helper(file)
55
- instance_eval(File.read(file), file)
56
- end
57
-
58
- alias_method :Helper, :helper
59
-
60
- #def include(*mods)
61
- # extend *mods
62
- #end
63
-
64
- #def pending(message=nil)
65
- # raise Pending.new(message)
66
- #end
67
-
68
-
69
- # Before All and After All advice are bad form.
70
- #
71
- # # Define a "before all" procedure.
72
- # def prepare(&procedure)
73
- # before(&procedure)
74
- # end
75
- #
76
- # alias_method :Prepare, :prepare
77
- #
78
- # # Define an "after all" procedure.
79
- # def cleanup(&procedure)
80
- # after(&procedure)
81
- # end
82
- #
83
- # alias_method :Cleanup, :cleanup
84
- #
85
-
86
- end
87
-
88
- end