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