citron 0.3.0 → 0.4.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.
- data/.ruby +8 -4
- data/COPYING.md +4 -5
- data/{HISTORY.md → History.md} +10 -0
- data/{LICENSE.txt → License.txt} +4 -3
- data/README.md +29 -12
- data/lib/citron.rb +3 -4
- data/lib/citron/test_case.rb +144 -199
- data/lib/citron/test_proc.rb +29 -29
- data/lib/citron/world.rb +1 -1
- data/test/case_unit.rb +1 -1
- metadata +19 -21
- data/lib/citron/test_setup.rb +0 -73
- data/lib/citron/test_teardown.rb +0 -60
data/.ruby
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
---
|
2
2
|
source:
|
3
3
|
- PROFILE
|
4
|
+
- Profile
|
4
5
|
authors:
|
5
6
|
- name: Thomas Sawyer
|
6
7
|
email: transfire@gmail.com
|
@@ -33,15 +34,18 @@ repositories:
|
|
33
34
|
resources:
|
34
35
|
home: http://rubyworks.github.com/citron
|
35
36
|
code: http://github.com/rubyworks/citron
|
37
|
+
bugs: http://github.com/rubyworks/citron/issues
|
38
|
+
chat: irc://chat.us.freenode.net/rubyworks
|
39
|
+
mail: http://groups.google.com/groups/rubyworks-mailinglist
|
36
40
|
extra: {}
|
37
41
|
load_path:
|
38
42
|
- lib
|
39
43
|
revision: 0
|
40
44
|
name: citron
|
41
45
|
title: Citron
|
42
|
-
version: 0.
|
43
|
-
summary: Classic Unit
|
44
|
-
description: Citron is a unit testing framework with a
|
45
|
-
|
46
|
+
version: 0.4.0
|
47
|
+
summary: Classic Unit Testing
|
48
|
+
description: Citron is a classical unit testing framework with a developer freindly
|
49
|
+
DSL, runs on top of RubyTest and is BRASS compliant.
|
46
50
|
organization: RubyWorks
|
47
51
|
date: '2012-02-25'
|
data/COPYING.md
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
# COPYRIGHT
|
2
2
|
|
3
|
-
|
4
3
|
## NOTICES
|
5
4
|
|
6
5
|
### Citron
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
Citron - Classic Unit Testing
|
8
|
+
2011 (c) Rubyworks (BSD-2-Clause license)
|
9
|
+
All rights expressly reserved.
|
10
|
+
http://rubyworks.github.com/citron
|
12
11
|
|
13
12
|
## LICENSES
|
14
13
|
|
data/{HISTORY.md → History.md}
RENAMED
@@ -1,5 +1,15 @@
|
|
1
1
|
# Release History
|
2
2
|
|
3
|
+
## 0.4.0 / 2012-02-28
|
4
|
+
|
5
|
+
Reimplmented with a class-based model. This design is the traditional XUnit
|
6
|
+
OOP design, so it is more fitting Citron's design goals.
|
7
|
+
|
8
|
+
Changes:
|
9
|
+
|
10
|
+
* Reimplement with class-based model.
|
11
|
+
|
12
|
+
|
3
13
|
## 0.3.0 / 2012-02-25
|
4
14
|
|
5
15
|
This release cleans up the code, deprecates the complex Before and After
|
data/{LICENSE.txt → License.txt}
RENAMED
@@ -1,6 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
Citron - Classic Unit Testing
|
2
|
+
Copyright (c) 2011 Rubyworks (BSD-2-Clause license)
|
3
|
+
All rights are expressly reserved.
|
4
|
+
http://rubyworks.github.com/citron
|
4
5
|
|
5
6
|
Redistribution and use in source and binary forms, with or without
|
6
7
|
modification, are permitted provided that the following conditions are met:
|
data/README.md
CHANGED
@@ -1,20 +1,36 @@
|
|
1
1
|
# Citron
|
2
2
|
|
3
3
|
[Website](http://rubyworks.github.com/citron) /
|
4
|
-
[Development](http://github.com/rubyworks/citron) /
|
5
4
|
[Report Issue](http://github.com/rubyworks/citron/issues) /
|
5
|
+
[IRC Channel](irc://chat.us.freenode.net/rubyworks) /
|
6
|
+
[Mailing List](http://groups.google.com/groups/rubyworks-mailinglist) /
|
7
|
+
[Development](http://github.com/rubyworks/citron)
|
8
|
+
|
9
|
+
[](http://travis-ci.org/rubyworks/citron)
|
6
10
|
|
7
11
|
|
8
12
|
## Description
|
9
13
|
|
10
|
-
Citron is a
|
11
|
-
domain language for creating
|
14
|
+
Citron is a classical unit testing framework. It defines a simple
|
15
|
+
domain language for creating traditionally modeled unit tests.
|
16
|
+
|
17
|
+
|
18
|
+
## Installation
|
19
|
+
|
20
|
+
Using Rubygems simply install `citron`:
|
21
|
+
|
22
|
+
$ gem install citron
|
12
23
|
|
24
|
+
Citron depends on `ansi` for terminal colorization and `rubytest`,
|
25
|
+
so those will be installed as well if they are not already.
|
13
26
|
|
14
|
-
## Example
|
15
27
|
|
16
|
-
|
28
|
+
## Instruction
|
17
29
|
|
30
|
+
Citon tests are written as a collection of testcase and test blocks.
|
31
|
+
Here is a fun example. We'll call the test file `test/test_beatit.rb`:
|
32
|
+
|
33
|
+
```ruby
|
18
34
|
TestCase "Show them how to Beat It" do
|
19
35
|
|
20
36
|
setup do
|
@@ -42,14 +58,15 @@ Here's a fun example.
|
|
42
58
|
raise NotImplementedError
|
43
59
|
end
|
44
60
|
|
45
|
-
# omit
|
46
|
-
test "just beat it" do
|
47
|
-
e = NotImplementedError.new
|
48
|
-
e.set_assertion(true)
|
49
|
-
raise e
|
50
|
-
end
|
51
|
-
|
52
61
|
end
|
62
|
+
```
|
63
|
+
|
64
|
+
Citron doesn't dictate the assertions system you use. In the above example, we are using
|
65
|
+
the [A.E.](http://rubyworks.github.com/ae) assertion framework. You can use any [BRASS](http://rubyworks.github.com)
|
66
|
+
compliant system you prefer.
|
67
|
+
|
68
|
+
Citron is built on top of [RubyTest](http://rubyworks.github.com/rubytest).
|
69
|
+
Jump over to its website to learn how to run tests and setup test run profiles.
|
53
70
|
|
54
71
|
|
55
72
|
## Copyrights
|
data/lib/citron.rb
CHANGED
@@ -2,8 +2,6 @@ $TEST_SUITE ||= []
|
|
2
2
|
|
3
3
|
module Citron
|
4
4
|
require 'citron/world'
|
5
|
-
require 'citron/test_setup'
|
6
|
-
require 'citron/test_teardown'
|
7
5
|
require 'citron/test_proc'
|
8
6
|
require 'citron/test_case'
|
9
7
|
|
@@ -11,8 +9,9 @@ module Citron
|
|
11
9
|
#
|
12
10
|
# Define a general test case.
|
13
11
|
#
|
14
|
-
def test_case(label, &block)
|
15
|
-
|
12
|
+
def test_case(label, *tags, &block)
|
13
|
+
testcase = Citron::TestCase.context(label, *tags, &block)
|
14
|
+
$TEST_SUITE << testcase.new
|
16
15
|
end
|
17
16
|
|
18
17
|
alias :TestCase :test_case
|
data/lib/citron/test_case.rb
CHANGED
@@ -3,202 +3,99 @@ module Citron
|
|
3
3
|
# Test Case encapsulates a collection of
|
4
4
|
# unit tests organized into groups of contexts.
|
5
5
|
#
|
6
|
-
class TestCase
|
6
|
+
class TestCase < World
|
7
7
|
|
8
|
-
|
9
|
-
attr :context
|
8
|
+
class << self
|
10
9
|
|
11
|
-
|
12
|
-
|
10
|
+
# Brief description of the test case.
|
11
|
+
attr :label
|
13
12
|
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
# Symbol list of tags. Trailing element may be Hash
|
14
|
+
# of `symbol => object`.
|
15
|
+
attr :tags
|
17
16
|
|
18
|
-
|
19
|
-
|
17
|
+
# List of tests and sub-cases.
|
18
|
+
attr :tests
|
20
19
|
|
21
|
-
|
22
|
-
|
20
|
+
# Code unit that is subject of test case.
|
21
|
+
attr :unit
|
23
22
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
23
|
+
# Initialize new TestCase.
|
24
|
+
#
|
25
|
+
def __set__(settings={}, &block)
|
26
|
+
@label = settings[:label]
|
27
|
+
@tags = settings[:tags]
|
28
|
+
@skip = settings[:skip]
|
29
29
|
|
30
|
-
|
31
|
-
attr :scope
|
30
|
+
@unit = calc_unit(@label)
|
32
31
|
|
33
|
-
|
32
|
+
@tests = []
|
34
33
|
|
35
|
-
|
36
|
-
#
|
37
|
-
def initialize(settings={}, &block)
|
38
|
-
@context = settings[:context]
|
39
|
-
@label = settings[:label]
|
40
|
-
@tags = settings[:tags]
|
41
|
-
#@setup = settings[:setup]
|
42
|
-
@skip = settings[:skip]
|
43
|
-
|
44
|
-
@unit = calc_unit
|
45
|
-
|
46
|
-
if context
|
47
|
-
@setup = context.setup.copy(self) if context.setup
|
48
|
-
@teardown = context.teardown.copy(self) if context.teardown
|
34
|
+
class_eval(&block)
|
49
35
|
end
|
50
36
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
#
|
59
|
-
def calc_unit
|
60
|
-
case @label
|
61
|
-
when Module, Class
|
62
|
-
@label
|
63
|
-
when /^(\.|\#|\:\:)\w+/
|
64
|
-
if @context && Module === @context.unit
|
65
|
-
[@context.unit, @label].join('')
|
66
|
-
else
|
37
|
+
#
|
38
|
+
#
|
39
|
+
#
|
40
|
+
def calc_unit(label)
|
41
|
+
case label
|
42
|
+
when Module, Class
|
67
43
|
@label
|
44
|
+
when /^(\.|\#|\:\:)\w+/
|
45
|
+
if Module === superclass.unit
|
46
|
+
[superclass.unit, @label].join('')
|
47
|
+
else
|
48
|
+
@label
|
49
|
+
end
|
68
50
|
end
|
69
51
|
end
|
70
|
-
end
|
71
|
-
|
72
|
-
public
|
73
|
-
|
74
|
-
#
|
75
|
-
# Assign the setup procedure
|
76
|
-
#
|
77
|
-
# @param [TestSetup] test_setup
|
78
|
-
#
|
79
|
-
def setup=(test_setup)
|
80
|
-
@setup = test_setup
|
81
|
-
end
|
82
|
-
|
83
|
-
#
|
84
|
-
# Assign the teardown procedure.
|
85
|
-
#
|
86
|
-
# @param [TestTeardown] test_teardown
|
87
|
-
#
|
88
|
-
def teardown=(test_teardown)
|
89
|
-
@teardown = test_teardown
|
90
|
-
end
|
91
|
-
|
92
|
-
#
|
93
|
-
# Add new test or sub-case.
|
94
|
-
#
|
95
|
-
# @param [TestCase,TestProc] test_obejct
|
96
|
-
# Test sub-case or procedure to add to this case.
|
97
|
-
#
|
98
|
-
def <<(test_object)
|
99
|
-
@tests << test_object
|
100
|
-
end
|
101
|
-
|
102
|
-
#
|
103
|
-
# Iterate over each test and sub-case.
|
104
|
-
#
|
105
|
-
# @param [Proc] block
|
106
|
-
# Iteration procedure.
|
107
|
-
#
|
108
|
-
def each(&block)
|
109
|
-
tests.each(&block)
|
110
|
-
end
|
111
52
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
#
|
122
|
-
def size
|
123
|
-
tests.size
|
124
|
-
end
|
125
|
-
|
126
|
-
#
|
127
|
-
# Subclasses of TestCase can override this to describe
|
128
|
-
# the type of test case they define.
|
129
|
-
#
|
130
|
-
# @return [String]
|
131
|
-
#
|
132
|
-
#def type
|
133
|
-
# 'TestCase'
|
134
|
-
#end
|
135
|
-
|
136
|
-
#
|
137
|
-
# Test case label.
|
138
|
-
#
|
139
|
-
# @return [String]
|
140
|
-
#
|
141
|
-
def to_s
|
142
|
-
label.to_s
|
143
|
-
end
|
144
|
-
|
145
|
-
#
|
146
|
-
# Is test case to be skipped?
|
147
|
-
#
|
148
|
-
# @return [Boolean,String]
|
149
|
-
# If +false+ or +nil+ if not skipped, otherwise
|
150
|
-
# +true+ or a string explain why to skip.
|
151
|
-
#
|
152
|
-
def skip?
|
153
|
-
@skip
|
154
|
-
end
|
155
|
-
|
156
|
-
#
|
157
|
-
# Set test case to be skipped.
|
158
|
-
#
|
159
|
-
# @param [Boolean,String] reason
|
160
|
-
# Set to +false+ or +nil+ if not skipped, otherwise
|
161
|
-
# +true+ or a string explain why to skip.
|
162
|
-
#
|
163
|
-
def skip=(reason)
|
164
|
-
@skip = reason
|
165
|
-
end
|
166
|
-
|
167
|
-
def test_scope
|
168
|
-
@test_scope ||= TestProc::Scope.new(scope)
|
169
|
-
end
|
53
|
+
#
|
54
|
+
# Subclasses of TestCase can override this to describe
|
55
|
+
# the type of test case they define.
|
56
|
+
#
|
57
|
+
# @return [String]
|
58
|
+
#
|
59
|
+
#def type
|
60
|
+
# 'TestCase'
|
61
|
+
#end
|
170
62
|
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
teardown.call(test_scope) if teardown
|
182
|
-
end
|
63
|
+
#
|
64
|
+
# Add new test or sub-case.
|
65
|
+
#
|
66
|
+
# @param [Class<TestCase>,TestProc] test_obejct
|
67
|
+
# Test sub-case or procedure to add to this case.
|
68
|
+
#
|
69
|
+
def <<(test_object)
|
70
|
+
@tests ||= []
|
71
|
+
@tests << test_object
|
72
|
+
end
|
183
73
|
|
184
|
-
|
185
|
-
|
186
|
-
|
74
|
+
#
|
75
|
+
#def call
|
76
|
+
# yield
|
77
|
+
#end
|
187
78
|
|
188
79
|
#
|
189
|
-
#
|
80
|
+
# Is test case to be skipped?
|
190
81
|
#
|
191
|
-
# @
|
192
|
-
#
|
82
|
+
# @return [Boolean,String]
|
83
|
+
# If +false+ or +nil+ if not skipped, otherwise
|
84
|
+
# +true+ or a string explain why to skip.
|
193
85
|
#
|
194
|
-
def
|
195
|
-
@
|
196
|
-
|
197
|
-
@_skip = false
|
86
|
+
def skip?
|
87
|
+
@skip
|
88
|
+
end
|
198
89
|
|
199
|
-
|
200
|
-
|
201
|
-
|
90
|
+
#
|
91
|
+
# Set test case to be skipped.
|
92
|
+
#
|
93
|
+
# @param [Boolean,String] reason
|
94
|
+
# Set to +false+ or +nil+ if not skipped, otherwise
|
95
|
+
# +true+ or a string explain why to skip.
|
96
|
+
#
|
97
|
+
def skip=(reason)
|
98
|
+
@skip = reason
|
202
99
|
end
|
203
100
|
|
204
101
|
#
|
@@ -212,19 +109,17 @@ module Citron
|
|
212
109
|
# These can be used as a means of filtering tests.
|
213
110
|
#
|
214
111
|
def Context(label, *tags, &block)
|
215
|
-
|
216
|
-
|
217
|
-
#:setup => @_setup,
|
112
|
+
context = Class.new(self)
|
113
|
+
context.__set__(
|
218
114
|
:skip => @_skip,
|
219
115
|
:label => label,
|
220
|
-
:tags => tags
|
221
|
-
|
222
|
-
|
223
|
-
testcase = TestCase.new(settings, &block)
|
116
|
+
:tags => tags,
|
117
|
+
&block
|
118
|
+
)
|
224
119
|
|
225
|
-
|
120
|
+
self << context
|
226
121
|
|
227
|
-
|
122
|
+
context
|
228
123
|
end
|
229
124
|
|
230
125
|
alias :context :Context
|
@@ -243,8 +138,7 @@ module Citron
|
|
243
138
|
file, line, _ = *caller[0].split(':')
|
244
139
|
|
245
140
|
settings = {
|
246
|
-
:context =>
|
247
|
-
#:setup => @_setup,
|
141
|
+
:context => self,
|
248
142
|
:skip => @_skip,
|
249
143
|
:label => label,
|
250
144
|
:tags => tags,
|
@@ -254,9 +148,12 @@ module Citron
|
|
254
148
|
|
255
149
|
if procedure.arity == 0 || (RUBY_VERSION < '1.9' && procedure.arity == -1)
|
256
150
|
test = TestProc.new(settings, &procedure)
|
257
|
-
|
151
|
+
|
152
|
+
self << test
|
153
|
+
|
258
154
|
@_test = nil
|
259
|
-
|
155
|
+
|
156
|
+
return test
|
260
157
|
else
|
261
158
|
@_test = [settings, procedure]
|
262
159
|
end
|
@@ -276,7 +173,7 @@ module Citron
|
|
276
173
|
procedure.call(*args)
|
277
174
|
end
|
278
175
|
|
279
|
-
|
176
|
+
self << test
|
280
177
|
|
281
178
|
return test
|
282
179
|
end
|
@@ -291,12 +188,9 @@ module Citron
|
|
291
188
|
# A brief description of what the setup procedure sets-up.
|
292
189
|
#
|
293
190
|
def Setup(label=nil, &proc)
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
else
|
298
|
-
@_case.setup
|
299
|
-
end
|
191
|
+
define_method(:setup, &proc)
|
192
|
+
# if the setup is reset, then so should the teardown
|
193
|
+
define_method(:teardown){}
|
300
194
|
end
|
301
195
|
|
302
196
|
alias :setup :Setup
|
@@ -305,11 +199,7 @@ module Citron
|
|
305
199
|
# Teardown procedure is used to clean-up after each unit test.
|
306
200
|
#
|
307
201
|
def Teardown(&proc)
|
308
|
-
|
309
|
-
@_case.teardown = TestTeardown.new(@_case, &proc)
|
310
|
-
else
|
311
|
-
@_case.teardown
|
312
|
-
end
|
202
|
+
define_method(:teardown, &proc)
|
313
203
|
end
|
314
204
|
|
315
205
|
alias :teardown :Teardown
|
@@ -348,6 +238,61 @@ module Citron
|
|
348
238
|
|
349
239
|
alias :skip :Skip
|
350
240
|
|
241
|
+
alias :inspect :to_s
|
242
|
+
|
243
|
+
#
|
244
|
+
# Test case label.
|
245
|
+
#
|
246
|
+
# @return [String]
|
247
|
+
#
|
248
|
+
def to_s
|
249
|
+
label.to_s
|
250
|
+
end
|
251
|
+
|
252
|
+
end
|
253
|
+
|
254
|
+
#
|
255
|
+
# Iterate over each test and sub-case.
|
256
|
+
#
|
257
|
+
def each
|
258
|
+
self.class.tests.each do |test_object|
|
259
|
+
case test_object
|
260
|
+
when Class #TestCase
|
261
|
+
yield(test_object.new)
|
262
|
+
when TestProc
|
263
|
+
yield(test_object.for(self))
|
264
|
+
end
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
268
|
+
#
|
269
|
+
# Number of tests and sub-cases.
|
270
|
+
#
|
271
|
+
# @return [Fixnum] size
|
272
|
+
#
|
273
|
+
def size
|
274
|
+
self.class.tests.size
|
275
|
+
end
|
276
|
+
|
277
|
+
#
|
278
|
+
# Test case label.
|
279
|
+
#
|
280
|
+
# @return [String]
|
281
|
+
#
|
282
|
+
def to_s
|
283
|
+
self.class.label.to_s
|
284
|
+
end
|
285
|
+
|
286
|
+
#
|
287
|
+
# Dummy method for setup.
|
288
|
+
#
|
289
|
+
def setup
|
290
|
+
end
|
291
|
+
|
292
|
+
#
|
293
|
+
# Dummy method for teardown.
|
294
|
+
#
|
295
|
+
def teardown
|
351
296
|
end
|
352
297
|
|
353
298
|
end
|
data/lib/citron/test_proc.rb
CHANGED
@@ -8,7 +8,6 @@ module Citron
|
|
8
8
|
#
|
9
9
|
def initialize(options={}, &procedure)
|
10
10
|
@context = options[:context]
|
11
|
-
#@setup = options[:setup]
|
12
11
|
@label = options[:label]
|
13
12
|
@tags = options[:tags]
|
14
13
|
@skip = options[:skip]
|
@@ -97,18 +96,20 @@ module Citron
|
|
97
96
|
#
|
98
97
|
# @return [TestSetup] setup
|
99
98
|
#
|
100
|
-
def setup
|
101
|
-
|
102
|
-
end
|
99
|
+
#def setup
|
100
|
+
# @context.setup
|
101
|
+
#end
|
103
102
|
|
104
|
-
#
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
103
|
+
# TODO: possible to support topic?
|
104
|
+
|
105
|
+
##
|
106
|
+
## Ruby Test looks for `#topic` as the desciption of a test's setup.
|
107
|
+
##
|
108
|
+
## @return [String] Description of the setup.
|
109
|
+
##
|
110
|
+
#def topic
|
111
|
+
# setup.to_s
|
112
|
+
#end
|
112
113
|
|
113
114
|
#
|
114
115
|
# Location of test definition.
|
@@ -142,33 +143,32 @@ module Citron
|
|
142
143
|
# Run this test in context.
|
143
144
|
#
|
144
145
|
def call
|
145
|
-
|
146
|
+
@scope.setup
|
147
|
+
@scope.instance_eval(&procedure)
|
148
|
+
@scope.teardown
|
146
149
|
end
|
147
150
|
|
148
151
|
#
|
149
|
-
#
|
150
|
-
#
|
151
|
-
# @return [Proc]
|
152
|
+
# Return copy with `@scope` set.
|
152
153
|
#
|
153
|
-
def
|
154
|
-
|
154
|
+
def for(scope)
|
155
|
+
@scope = scope
|
156
|
+
self.dup
|
155
157
|
end
|
156
158
|
|
159
|
+
##
|
160
|
+
## Convert `#call` to Proc.
|
161
|
+
##
|
162
|
+
## @return [Proc]
|
163
|
+
##
|
164
|
+
#def to_proc
|
165
|
+
# lambda{ call } # procedure ?
|
166
|
+
#end
|
167
|
+
|
157
168
|
#
|
158
169
|
#def set_proc(&proc)
|
159
170
|
# @procedure = proc
|
160
171
|
#end
|
161
|
-
|
162
|
-
class Scope < World
|
163
|
-
|
164
|
-
def initialize(parent)
|
165
|
-
#include context
|
166
|
-
@_parent = parent
|
167
|
-
extend parent
|
168
|
-
end
|
169
|
-
|
170
|
-
end
|
171
|
-
|
172
172
|
end
|
173
173
|
|
174
174
|
end
|
data/lib/citron/world.rb
CHANGED
data/test/case_unit.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: citron
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-02-
|
12
|
+
date: 2012-02-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rubytest
|
16
|
-
requirement: &
|
16
|
+
requirement: &18271840 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *18271840
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: ae
|
27
|
-
requirement: &
|
27
|
+
requirement: &18271300 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *18271300
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: detroit
|
38
|
-
requirement: &
|
38
|
+
requirement: &18270800 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *18270800
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: reap
|
49
|
-
requirement: &
|
49
|
+
requirement: &18270280 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *18270280
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: qed
|
60
|
-
requirement: &
|
60
|
+
requirement: &18269780 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,24 +65,22 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
69
|
-
description: Citron is a unit testing framework with a
|
70
|
-
|
68
|
+
version_requirements: *18269780
|
69
|
+
description: Citron is a classical unit testing framework with a developer freindly
|
70
|
+
DSL, runs on top of RubyTest and is BRASS compliant.
|
71
71
|
email:
|
72
72
|
- transfire@gmail.com
|
73
73
|
executables: []
|
74
74
|
extensions: []
|
75
75
|
extra_rdoc_files:
|
76
|
-
-
|
76
|
+
- License.txt
|
77
77
|
- COPYING.md
|
78
|
-
- HISTORY.md
|
79
78
|
- README.md
|
79
|
+
- History.md
|
80
80
|
files:
|
81
81
|
- .ruby
|
82
82
|
- lib/citron/test_case.rb
|
83
83
|
- lib/citron/test_proc.rb
|
84
|
-
- lib/citron/test_setup.rb
|
85
|
-
- lib/citron/test_teardown.rb
|
86
84
|
- lib/citron/world.rb
|
87
85
|
- lib/citron.rb
|
88
86
|
- test/case_basic.rb
|
@@ -91,9 +89,9 @@ files:
|
|
91
89
|
- test/case_setup.rb
|
92
90
|
- test/case_unit.rb
|
93
91
|
- COPYING.md
|
94
|
-
- LICENSE.txt
|
95
|
-
- HISTORY.md
|
96
92
|
- README.md
|
93
|
+
- History.md
|
94
|
+
- License.txt
|
97
95
|
homepage: http://rubyworks.github.com/citron
|
98
96
|
licenses:
|
99
97
|
- BSD-2-Clause
|
@@ -118,5 +116,5 @@ rubyforge_project:
|
|
118
116
|
rubygems_version: 1.8.11
|
119
117
|
signing_key:
|
120
118
|
specification_version: 3
|
121
|
-
summary: Classic Unit
|
119
|
+
summary: Classic Unit Testing
|
122
120
|
test_files: []
|
data/lib/citron/test_setup.rb
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
module Citron
|
2
|
-
|
3
|
-
# Ecapsulate a test case's setup code.
|
4
|
-
#
|
5
|
-
class TestSetup
|
6
|
-
|
7
|
-
#
|
8
|
-
# The test case to which this advice belong.
|
9
|
-
#
|
10
|
-
attr :context
|
11
|
-
|
12
|
-
#
|
13
|
-
# The setup procedures.
|
14
|
-
#
|
15
|
-
attr :procedures
|
16
|
-
|
17
|
-
#
|
18
|
-
# A brief description of the setup.
|
19
|
-
#
|
20
|
-
attr :label
|
21
|
-
|
22
|
-
#
|
23
|
-
# Initialize new Setup instance.
|
24
|
-
#
|
25
|
-
def initialize(context, label, &proc)
|
26
|
-
@context = context
|
27
|
-
@label = label.to_s
|
28
|
-
@procedures = []
|
29
|
-
|
30
|
-
@procedures << proc if proc
|
31
|
-
end
|
32
|
-
|
33
|
-
#
|
34
|
-
# Copy the setup for a new context.
|
35
|
-
#
|
36
|
-
def copy(context)
|
37
|
-
c = self.class.new(context, label)
|
38
|
-
c.procedures = procedures
|
39
|
-
c
|
40
|
-
end
|
41
|
-
|
42
|
-
#
|
43
|
-
# Run setup procedure in test scope.
|
44
|
-
#
|
45
|
-
def call(scope)
|
46
|
-
procedures.each do |proc|
|
47
|
-
scope.instance_eval(&proc)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
#
|
52
|
-
# Returns the description with newlines removed.
|
53
|
-
#
|
54
|
-
def to_s
|
55
|
-
label.gsub(/\n/, ' ')
|
56
|
-
end
|
57
|
-
|
58
|
-
#
|
59
|
-
# Add a setup procedure.
|
60
|
-
#
|
61
|
-
def add(&proc)
|
62
|
-
@procedures << proc
|
63
|
-
end
|
64
|
-
|
65
|
-
protected
|
66
|
-
|
67
|
-
def procedures=(procedures)
|
68
|
-
@procedures = procedures
|
69
|
-
end
|
70
|
-
|
71
|
-
end
|
72
|
-
|
73
|
-
end
|
data/lib/citron/test_teardown.rb
DELETED
@@ -1,60 +0,0 @@
|
|
1
|
-
module Citron
|
2
|
-
|
3
|
-
# Ecapsulate a test case's teardown code.
|
4
|
-
#
|
5
|
-
class TestTeardown
|
6
|
-
|
7
|
-
#
|
8
|
-
# The test case to which this advice belong.
|
9
|
-
#
|
10
|
-
attr :context
|
11
|
-
|
12
|
-
#
|
13
|
-
# The setup procedures.
|
14
|
-
#
|
15
|
-
attr :procedures
|
16
|
-
|
17
|
-
#
|
18
|
-
# Initialize new Setup instance.
|
19
|
-
#
|
20
|
-
def initialize(context, &proc)
|
21
|
-
@context = context
|
22
|
-
@procedures = []
|
23
|
-
|
24
|
-
@procedures << proc if proc
|
25
|
-
end
|
26
|
-
|
27
|
-
#
|
28
|
-
# Copy the teardown for a new context.
|
29
|
-
#
|
30
|
-
def copy(context)
|
31
|
-
c = self.class.new(context)
|
32
|
-
c.procedures = procedures
|
33
|
-
c
|
34
|
-
end
|
35
|
-
|
36
|
-
#
|
37
|
-
# Run teardown procedure in test scope.
|
38
|
-
#
|
39
|
-
def call(scope)
|
40
|
-
procedures.each do |proc|
|
41
|
-
scope.instance_eval(&proc)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
#
|
46
|
-
# Add a teardown procedure.
|
47
|
-
#
|
48
|
-
def add(&proc)
|
49
|
-
procedures << proc
|
50
|
-
end
|
51
|
-
|
52
|
-
protected
|
53
|
-
|
54
|
-
def procedures=(procedures)
|
55
|
-
@procedures = procedures
|
56
|
-
end
|
57
|
-
|
58
|
-
end
|
59
|
-
|
60
|
-
end
|