lemon 0.5
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.
- data/COPYING +621 -0
- data/COPYING.LESSER +166 -0
- data/HISTORY +13 -0
- data/MANIFEST +37 -0
- data/README.rdoc +108 -0
- data/Syckfile +68 -0
- data/bin/lemon +3 -0
- data/lib/lemon.rb +1 -0
- data/lib/lemon/command.rb +125 -0
- data/lib/lemon/coverage.rb +118 -0
- data/lib/lemon/kernel.rb +20 -0
- data/lib/lemon/reporter.rb +58 -0
- data/lib/lemon/reporters.rb +3 -0
- data/lib/lemon/reporters/dotprogress.rb +62 -0
- data/lib/lemon/reporters/verbose.rb +59 -0
- data/lib/lemon/runner.rb +117 -0
- data/lib/lemon/test/case.rb +109 -0
- data/lib/lemon/test/concern.rb +43 -0
- data/lib/lemon/test/suite.rb +126 -0
- data/lib/lemon/test/unit.rb +56 -0
- data/meta/author +1 -0
- data/meta/contact +1 -0
- data/meta/copyright +1 -0
- data/meta/description +2 -0
- data/meta/homepage +1 -0
- data/meta/license +1 -0
- data/meta/name +1 -0
- data/meta/repository +1 -0
- data/meta/suite +1 -0
- data/meta/summary +1 -0
- data/meta/title +1 -0
- data/meta/version +1 -0
- data/test/cases/coverage_case.rb +26 -0
- data/test/cases/testcase_case.rb +58 -0
- metadata +96 -0
@@ -0,0 +1,43 @@
|
|
1
|
+
module Lemon::Test
|
2
|
+
|
3
|
+
# Test Concerns are used to organize unit tests
|
4
|
+
# in groups, so as to address specific quality
|
5
|
+
# assurance objectives.
|
6
|
+
class Concern
|
7
|
+
|
8
|
+
# The test case to which this concern belongs.
|
9
|
+
attr :testcase
|
10
|
+
|
11
|
+
# The description of this concern. Make this
|
12
|
+
# as detailed as you wish.
|
13
|
+
attr :description
|
14
|
+
|
15
|
+
# Unit tests that belong to this concern.
|
16
|
+
attr :testunits
|
17
|
+
|
18
|
+
# New concern.
|
19
|
+
def initialize(testcase, description)
|
20
|
+
@testcase = testcase
|
21
|
+
@description = description.join("\n")
|
22
|
+
@testunits = []
|
23
|
+
end
|
24
|
+
|
25
|
+
# Assign a unit test to this concern.
|
26
|
+
def assign(testunit)
|
27
|
+
raise ArgumentError unless Unit === testunit
|
28
|
+
@testunits << testunit
|
29
|
+
end
|
30
|
+
|
31
|
+
# Iterate through each test unit.
|
32
|
+
def each(&block)
|
33
|
+
@testunits.each(&block)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Returns the description with newlines removed.
|
37
|
+
def to_s
|
38
|
+
description.gsub(/\n/, ' ')
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
module Lemon
|
2
|
+
module Test
|
3
|
+
|
4
|
+
require 'lemon/test/case'
|
5
|
+
|
6
|
+
# Test Suites encapsulate a set of test cases.
|
7
|
+
#
|
8
|
+
class Suite
|
9
|
+
|
10
|
+
# Test cases in this suite.
|
11
|
+
attr :testcases
|
12
|
+
|
13
|
+
# List of concern procedures that apply suite-wide.
|
14
|
+
attr :when_clauses
|
15
|
+
|
16
|
+
# List of pre-test procedures that apply suite-wide.
|
17
|
+
attr :before_clauses
|
18
|
+
|
19
|
+
# List of post-test procedures that apply suite-wide.
|
20
|
+
attr :after_clauses
|
21
|
+
|
22
|
+
# List of concern procedures that apply suite-wide.
|
23
|
+
attr :when_clauses
|
24
|
+
|
25
|
+
#
|
26
|
+
def initialize(*tests)
|
27
|
+
@testcases = []
|
28
|
+
@before_clauses = {}
|
29
|
+
@after_clauses = {}
|
30
|
+
@when_clauses = {}
|
31
|
+
|
32
|
+
# directories glob *.rb files
|
33
|
+
tests = tests.flatten.map do |file|
|
34
|
+
if File.directory?(file)
|
35
|
+
Dir[File.join(file, '**', '*.rb')]
|
36
|
+
else
|
37
|
+
file
|
38
|
+
end
|
39
|
+
end.flatten.uniq
|
40
|
+
|
41
|
+
@test_files = tests
|
42
|
+
|
43
|
+
tests.each do |file|
|
44
|
+
#file = File.expand_path(file)
|
45
|
+
instance_eval(File.read(file), file)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Load a helper. This method must be used when loading local
|
50
|
+
# suite support. The usual #require or #load can only be used
|
51
|
+
# for extenal support libraries (such as a test mock framework).
|
52
|
+
# This is so because suite code is not evaluated at the toplevel.
|
53
|
+
def helper(file)
|
54
|
+
instance_eval(File.read(file), file)
|
55
|
+
end
|
56
|
+
|
57
|
+
#
|
58
|
+
#def load(file)
|
59
|
+
# instance_eval(File.read(file), file)
|
60
|
+
#end
|
61
|
+
|
62
|
+
# Includes at the suite level are routed to the toplevel.
|
63
|
+
def include(*mods)
|
64
|
+
TOPLEVEL_BINDING.eval('self').instance_eval do
|
65
|
+
include(*mods)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# Define a test case belonging to this suite.
|
70
|
+
def Case(target_class, &block)
|
71
|
+
testcases << Case.new(self, target_class, &block)
|
72
|
+
end
|
73
|
+
|
74
|
+
#
|
75
|
+
alias_method :TestCase, :Case
|
76
|
+
|
77
|
+
#
|
78
|
+
alias_method :testcase, :Case
|
79
|
+
|
80
|
+
# Define a pre-test procedure to apply suite-wide.
|
81
|
+
def Before(match=nil, &block)
|
82
|
+
@before_clauses[match] = block #<< Advice.new(match, &block)
|
83
|
+
end
|
84
|
+
|
85
|
+
alias_method :before, :Before
|
86
|
+
|
87
|
+
# Define a post-test procedure to apply suite-wide.
|
88
|
+
def After(match=nil, &block)
|
89
|
+
@after_clauses[match] = block #<< Advice.new(match, &block)
|
90
|
+
end
|
91
|
+
|
92
|
+
alias_method :after, :After
|
93
|
+
|
94
|
+
# Define a concern procedure to apply suite-wide.
|
95
|
+
def When(match=nil, &block)
|
96
|
+
@when_clauses[match] = block #<< Advice.new(match, &block)
|
97
|
+
end
|
98
|
+
|
99
|
+
# Iterate through this suite's test cases.
|
100
|
+
def each(&block)
|
101
|
+
@testcases.each(&block)
|
102
|
+
end
|
103
|
+
|
104
|
+
# FIXME: This is a BIG FAT HACK! For the life of me I cannot find
|
105
|
+
# a way to resolve module constants included in the test cases.
|
106
|
+
# Becuase of closure, the constant lookup goes through here, and not
|
107
|
+
# the Case singleton class. So to work around wemust note each test
|
108
|
+
# before it is run, and reroute the missing constants.
|
109
|
+
#
|
110
|
+
# This sucks and it is not thread safe. If anyone know how to fix,
|
111
|
+
# please let me know. See Unit#call for the other end of this hack.
|
112
|
+
|
113
|
+
def self.const_missing(name)
|
114
|
+
(class << @@test_stack.last.testcase; self; end).const_get(name)
|
115
|
+
end
|
116
|
+
|
117
|
+
# Get current running test. Used for the BIG FAT HACK.
|
118
|
+
def test_stack
|
119
|
+
@@test_stack ||= []
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module Lemon::Test
|
2
|
+
|
3
|
+
#
|
4
|
+
class Unit
|
5
|
+
|
6
|
+
# The test case to which this unit test belongs.
|
7
|
+
attr :testcase
|
8
|
+
|
9
|
+
# The concern which this test helps ensure.
|
10
|
+
attr :concern
|
11
|
+
|
12
|
+
# A test unit +target+ is a method.
|
13
|
+
attr :target
|
14
|
+
|
15
|
+
# The aspect of the concern this test fulfills.
|
16
|
+
attr :aspect
|
17
|
+
|
18
|
+
# Test procedure, in which test assertions should be made.
|
19
|
+
attr :procedure
|
20
|
+
|
21
|
+
# New unit test.
|
22
|
+
def initialize(concern, target, aspect=nil, &procedure)
|
23
|
+
concern.assign(self)
|
24
|
+
|
25
|
+
@concern = concern
|
26
|
+
@testcase = concern.testcase
|
27
|
+
|
28
|
+
@target = target
|
29
|
+
@aspect = aspect
|
30
|
+
@procedure = procedure
|
31
|
+
end
|
32
|
+
|
33
|
+
# This method has the other end of the BIG FAT HACK. See Suite#const_missing.
|
34
|
+
def call
|
35
|
+
suite.test_stack << self # hack
|
36
|
+
procedure.call
|
37
|
+
ensure
|
38
|
+
suite.test_stack.pop
|
39
|
+
end
|
40
|
+
|
41
|
+
# The suite to which this unit test belongs.
|
42
|
+
def suite
|
43
|
+
testcase.suite
|
44
|
+
end
|
45
|
+
|
46
|
+
#
|
47
|
+
def to_s
|
48
|
+
"#{testcase}##{target} #{aspect}"
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
|
data/meta/author
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Thomas Sawyer
|
data/meta/contact
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
proutils@librelist.com
|
data/meta/copyright
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Copyright 2009 Thomas Sawyer
|
data/meta/description
ADDED
data/meta/homepage
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
http://proutils.github.com/lemon
|
data/meta/license
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
LGPL
|
data/meta/name
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
lemon
|
data/meta/repository
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
git://github.com/proutils/lemon.git
|
data/meta/suite
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
proutils
|
data/meta/summary
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Pucker-tight Unit Testing
|
data/meta/title
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Lemon
|
data/meta/version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.5
|
@@ -0,0 +1,26 @@
|
|
1
|
+
#
|
2
|
+
|
3
|
+
testcase Lemon::Coverage do
|
4
|
+
|
5
|
+
#Before /returns/ do |unit|
|
6
|
+
# puts "returns something"
|
7
|
+
#end
|
8
|
+
|
9
|
+
unit :coverage => 'returns a chart of coverage' do
|
10
|
+
#X.new.a.assert.is_a?(String)
|
11
|
+
end
|
12
|
+
|
13
|
+
unit :cover => 'returns a pre-checked chart of potential coverage' do
|
14
|
+
#X.new.a.assert =~ /^[a-z]*$/
|
15
|
+
end
|
16
|
+
|
17
|
+
unit :system => 'returns a list of classes/modules currently in the Ruby proccess' do
|
18
|
+
#1.assert == 4
|
19
|
+
end
|
20
|
+
|
21
|
+
#unit :snapshot => 'can be broken' do
|
22
|
+
# #1.assert == 4
|
23
|
+
#end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# Some fixture code for testing #include.
|
2
|
+
module M
|
3
|
+
def m1; "m1"; end
|
4
|
+
module N
|
5
|
+
def self.n1; "n1"; end
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
Case(Lemon::Test::Case) do
|
10
|
+
|
11
|
+
Concern "Modules included in a test case are accessible by the unit tests."
|
12
|
+
|
13
|
+
include M
|
14
|
+
#N = M::N
|
15
|
+
|
16
|
+
Unit :include => "allows access to module methods" do
|
17
|
+
m1.assert == "m1"
|
18
|
+
end
|
19
|
+
|
20
|
+
Unit :include => "allows access to nested modules" do
|
21
|
+
N::n1.assert == "n1"
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
Concern "Unit tests are augmented by before and after procedures."
|
26
|
+
|
27
|
+
Before /pre-test/ do |unit|
|
28
|
+
@check_before = :before
|
29
|
+
end
|
30
|
+
|
31
|
+
After /pre-test/ do |unit|
|
32
|
+
@check_after = :after
|
33
|
+
end
|
34
|
+
|
35
|
+
Unit :Before => "sets up a pre-test procedure" do
|
36
|
+
@check_before.assert == :before
|
37
|
+
end
|
38
|
+
|
39
|
+
Unit :After => "sets up a post-test procedure" do
|
40
|
+
@check_after.assert == :after
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
#Concern "Unit tests are augmented by when procedures.",
|
45
|
+
# "(NOTE: we have to repeat this concern in order to test it.)"
|
46
|
+
|
47
|
+
When /augmented\ by\ when\ procedures/ do
|
48
|
+
@check_concern = :concern
|
49
|
+
end
|
50
|
+
|
51
|
+
Concern "Unit tests are augmented by when procedures."
|
52
|
+
|
53
|
+
Unit :Concern => "sets up a concern procedure" do
|
54
|
+
@check_concern.assert == :concern
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
metadata
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: lemon
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: "0.5"
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Thomas Sawyer
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-12-31 00:00:00 -05:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: |-
|
17
|
+
Lemon is a unit testing framework that tightly correlates
|
18
|
+
class to test case and method to test unit.
|
19
|
+
email: proutils@librelist.com
|
20
|
+
executables:
|
21
|
+
- lemon
|
22
|
+
extensions: []
|
23
|
+
|
24
|
+
extra_rdoc_files:
|
25
|
+
- MANIFEST
|
26
|
+
- README.rdoc
|
27
|
+
- HISTORY
|
28
|
+
- COPYING.LESSER
|
29
|
+
- Syckfile
|
30
|
+
- COPYING
|
31
|
+
files:
|
32
|
+
- COPYING
|
33
|
+
- COPYING.LESSER
|
34
|
+
- HISTORY
|
35
|
+
- README.rdoc
|
36
|
+
- bin/lemon
|
37
|
+
- lib/lemon.rb
|
38
|
+
- lib/lemon/command.rb
|
39
|
+
- lib/lemon/coverage.rb
|
40
|
+
- lib/lemon/kernel.rb
|
41
|
+
- lib/lemon/reporter.rb
|
42
|
+
- lib/lemon/reporters.rb
|
43
|
+
- lib/lemon/reporters/dotprogress.rb
|
44
|
+
- lib/lemon/reporters/verbose.rb
|
45
|
+
- lib/lemon/runner.rb
|
46
|
+
- lib/lemon/test/case.rb
|
47
|
+
- lib/lemon/test/concern.rb
|
48
|
+
- lib/lemon/test/suite.rb
|
49
|
+
- lib/lemon/test/unit.rb
|
50
|
+
- meta/author
|
51
|
+
- meta/contact
|
52
|
+
- meta/copyright
|
53
|
+
- meta/description
|
54
|
+
- meta/homepage
|
55
|
+
- meta/license
|
56
|
+
- meta/name
|
57
|
+
- meta/repository
|
58
|
+
- meta/suite
|
59
|
+
- meta/summary
|
60
|
+
- meta/title
|
61
|
+
- meta/version
|
62
|
+
- test/cases/coverage_case.rb
|
63
|
+
- test/cases/testcase_case.rb
|
64
|
+
- MANIFEST
|
65
|
+
- Syckfile
|
66
|
+
has_rdoc: true
|
67
|
+
homepage: http://proutils.github.com/lemon
|
68
|
+
licenses: []
|
69
|
+
|
70
|
+
post_install_message:
|
71
|
+
rdoc_options:
|
72
|
+
- --title
|
73
|
+
- Lemon API
|
74
|
+
require_paths:
|
75
|
+
- lib
|
76
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: "0"
|
81
|
+
version:
|
82
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: "0"
|
87
|
+
version:
|
88
|
+
requirements: []
|
89
|
+
|
90
|
+
rubyforge_project: lemon
|
91
|
+
rubygems_version: 1.3.5
|
92
|
+
signing_key:
|
93
|
+
specification_version: 3
|
94
|
+
summary: Pucker-tight Unit Testing
|
95
|
+
test_files:
|
96
|
+
- test/cases/testcase_case.rb
|