citron 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![Build Status](https://secure.travis-ci.org/rubyworks/citron.png)](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
|