assert 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- assert (0.2.1)
4
+ assert (0.3.0)
5
5
  ansi (~> 1.3)
6
6
 
7
7
  GEM
@@ -80,12 +80,12 @@ module Assert
80
80
  end
81
81
  end
82
82
 
83
- def should(desc_or_macro, &block)
83
+ def test(desc_or_macro, &block)
84
84
  if desc_or_macro.kind_of?(Macro)
85
85
  instance_eval(&desc_or_macro)
86
86
  else
87
87
  raise ArgumentError, "please provide a test block" unless block_given?
88
- method_name = "test: should #{desc_or_macro}"
88
+ method_name = "test: #{desc_or_macro}"
89
89
 
90
90
  # instead of using the typical 'method_defined?' pattern (which) checks
91
91
  # all parent contexts, we really just need to make sure the method_name
@@ -101,6 +101,18 @@ module Assert
101
101
  end
102
102
  end
103
103
 
104
+ def should(desc_or_macro, &block)
105
+ if !desc_or_macro.kind_of?(Macro)
106
+ desc_or_macro = "should #{desc_or_macro}"
107
+ end
108
+ test(desc_or_macro, &block)
109
+ end
110
+
111
+ def test_eventually(desc, &block)
112
+ test(desc) { skip }
113
+ end
114
+ alias_method :test_skip, :test_eventually
115
+
104
116
  def should_eventually(desc, &block)
105
117
  should(desc) { skip }
106
118
  end
data/lib/assert/test.rb CHANGED
@@ -1,41 +1,51 @@
1
1
  require 'assert/result'
2
2
  require 'assert/result_set'
3
+ require 'assert/options'
4
+
5
+ require 'stringio'
3
6
 
4
7
  module Assert
5
8
  class Test
9
+ include Assert::Options
10
+ options do
11
+ default_capture_out true
12
+ end
6
13
 
7
14
  # a Test is some code/method to run in the scope of a Context. After a
8
15
  # a test runs, it should have some assertions which are its results.
9
16
 
10
17
  attr_reader :name, :code, :context_class
11
- attr_accessor :results
18
+ attr_accessor :results, :output
12
19
 
13
20
  def initialize(name, context_class, code = nil, &block)
14
21
  @context_class = context_class
15
22
  @name = name_from_context(name)
16
23
  @code = (code || block)
17
24
  @results = ResultSet.new
25
+ @output = ""
18
26
  end
19
27
 
20
28
  def run(view=nil)
21
29
  @results.view = view
22
30
  run_scope = @context_class.new(self)
23
- begin
24
- @context_class.setup(run_scope)
25
- if @code.kind_of?(::Proc)
26
- run_scope.instance_eval(&@code)
27
- elsif run_scope.respond_to?(@code.to_s)
28
- run_scope.send(@code.to_s)
29
- end
30
- rescue Result::TestSkipped => err
31
- @results << Result::Skip.new(self.name, err)
32
- rescue Exception => err
33
- @results << Result::Error.new(self.name, err)
34
- ensure
31
+ capture_out(StringIO.new(@output, "w+")) do
35
32
  begin
36
- @context_class.teardown(run_scope)
37
- rescue Exception => teardown_err
38
- @results << Result::Error.new(self.name, teardown_err)
33
+ @context_class.setup(run_scope)
34
+ if @code.kind_of?(::Proc)
35
+ run_scope.instance_eval(&@code)
36
+ elsif run_scope.respond_to?(@code.to_s)
37
+ run_scope.send(@code.to_s)
38
+ end
39
+ rescue Result::TestSkipped => err
40
+ @results << Result::Skip.new(self.name, err)
41
+ rescue Exception => err
42
+ @results << Result::Error.new(self.name, err)
43
+ ensure
44
+ begin
45
+ @context_class.teardown(run_scope)
46
+ rescue Exception => teardown_err
47
+ @results << Result::Error.new(self.name, teardown_err)
48
+ end
39
49
  end
40
50
  end
41
51
  @results.view = nil
@@ -69,6 +79,17 @@ module Assert
69
79
 
70
80
  protected
71
81
 
82
+ def capture_out(io, &block)
83
+ if self.class.options.capture_out && io
84
+ orig_stdout = $stdout.clone
85
+ $stdout = io
86
+ block.call
87
+ $stdout = orig_stdout
88
+ else
89
+ block.call
90
+ end
91
+ end
92
+
72
93
  def name_from_context(name)
73
94
  [ @context_class.description,
74
95
  name.gsub(/^test:\s+should/, "should")
@@ -1,3 +1,3 @@
1
1
  module Assert
2
- VERSION = "0.2.1"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -45,9 +45,15 @@ module Assert::View
45
45
  end
46
46
 
47
47
  def detailed_results
48
- details = self.suite.ordered_results.reverse.collect do |result|
49
- result_io_msg(result.to_s, result.to_sym) if show_result_details?(result)
50
- end.compact
48
+ details = self.suite.ordered_tests.reverse.collect do |test|
49
+ test.results.collect do |result|
50
+ if show_result_details?(result)
51
+ [ result_io_msg(result.to_s, result.to_sym),
52
+ output_io_msg(test.output.to_s)
53
+ ].join("\n")
54
+ end
55
+ end
56
+ end.flatten.compact
51
57
  "\n\n" + details.join("\n\n") if !details.empty?
52
58
  end
53
59
 
@@ -93,6 +99,15 @@ module Assert::View
93
99
  io_msg(msg, :term_styles => term_styles)
94
100
  end
95
101
 
102
+ def output_io_msg(output)
103
+ if output && !output.empty?
104
+ [ "--- stdout ---",
105
+ io_msg(output),
106
+ "--------------"
107
+ ].collect{|i| i.strip}.join("\n")
108
+ end
109
+ end
110
+
96
111
  def io_msg(msg, opts={})
97
112
  val = super
98
113
  if !(style = term_style(*opts[:term_styles])).empty?
@@ -15,7 +15,9 @@ class Assert::Context
15
15
 
16
16
  should have_instance_methods :setup_once, :before_once, :setup, :before, :setups
17
17
  should have_instance_methods :teardown_once, :after_once, :teardown, :after, :teardowns
18
- should have_instance_methods :description, :desc, :subject, :should, :should_eventually, :should_skip
18
+ should have_instance_methods :description, :desc, :subject
19
+ should have_instance_methods :test, :test_eventually, :test_skip
20
+ should have_instance_methods :should, :should_eventually, :should_skip
19
21
  end
20
22
 
21
23
 
@@ -236,6 +238,50 @@ class Assert::Context
236
238
 
237
239
 
238
240
 
241
+ class TestMethTest < ClassMethodsTest
242
+ desc "test method"
243
+ setup do
244
+ should_desc = "be true"
245
+ should_block = @should_block = ::Proc.new{ assert(true) }
246
+ @context_class = Factory.context_class do
247
+ test(should_desc, &should_block)
248
+ end
249
+ @method_name = "test: #{should_desc}"
250
+ @context = @context_class.new(Factory.test("something", @context_class))
251
+ end
252
+ subject{ @context }
253
+
254
+ should "define a test method named after the should desc" do
255
+ assert_respond_to @method_name, subject
256
+ assert_equal subject.instance_eval(&@should_block), subject.send(@method_name)
257
+ end
258
+
259
+ end
260
+
261
+ class TestEventuallyTest < ClassMethodsTest
262
+ desc "test_eventually method"
263
+ setup do
264
+ should_desc = @should_desc = "be true"
265
+ should_block = @should_block = ::Proc.new{ assert(true) }
266
+ @context_class = Factory.context_class do
267
+ test_eventually(should_desc, &should_block)
268
+ end
269
+ @method_name = "test: #{@should_desc}"
270
+ @context = @context_class.new(Factory.test("something", @context_class))
271
+ end
272
+ subject{ @context }
273
+
274
+ should "define a test method named after the should desc that raises a test skipped" do
275
+ assert_respond_to @method_name, subject
276
+ assert_raises(Assert::Result::TestSkipped) do
277
+ subject.send(@method_name)
278
+ end
279
+ end
280
+
281
+ end
282
+
283
+
284
+
239
285
  class ShouldTest < ClassMethodsTest
240
286
  desc "should method"
241
287
  setup do
data/test/test_test.rb CHANGED
@@ -20,7 +20,7 @@ class Assert::Test
20
20
  subject{ @test }
21
21
 
22
22
  should have_readers :name, :code, :context_class
23
- should have_accessor :results
23
+ should have_accessor :results, :output
24
24
  should have_instance_methods :run, :result_count
25
25
  should have_instance_methods *Assert::Result.types.keys.collect{|k| "#{k}_results".to_sym }
26
26
 
@@ -183,4 +183,59 @@ class Assert::Test
183
183
 
184
184
  end
185
185
 
186
+ class CaptureOutTest < BasicTest
187
+ desc "when capturing std out"
188
+ setup {
189
+ @test = Factory.test("stdout") {
190
+ puts "std out from the test"
191
+ assert true
192
+ }
193
+ @orig_capture = @test.class.options.capture_out
194
+ @test.class.options.capture_out(true)
195
+ @test.run
196
+ }
197
+ teardown {
198
+ @test.class.options.capture_out(@orig_capture)
199
+ }
200
+
201
+ should "capture any io from the test" do
202
+ assert_equal "std out from the test\n", @test.output
203
+ end
204
+
205
+ end
206
+
207
+
208
+
209
+ class FullOutputCaptureTest < BasicTest
210
+ desc "when collecting std out across setup, teardown, and meth calls"
211
+ setup do
212
+ @test = Factory.test("fullstdouttest") {
213
+ puts "std out from the test"
214
+ assert a_method_an_assert_calls.inspect
215
+ }
216
+ @test.context_class.setup { puts "std out from the setup" }
217
+ @test.context_class.teardown { puts "std out from the teardown" }
218
+ @test.context_class.send(:define_method, "a_method_an_assert_calls") do
219
+ puts "std out from a method an assert called"
220
+ true
221
+ end
222
+
223
+ @orig_capture = @test.class.options.capture_out
224
+ @test.class.options.capture_out(true)
225
+ @test.run
226
+ end
227
+ teardown {
228
+ @test.class.options.capture_out(@orig_capture)
229
+ }
230
+
231
+ should "collect it on itself in the output accessor" do
232
+ assert_equal([
233
+ "std out from the setup",
234
+ "std out from the test",
235
+ "std out from a method an assert called",
236
+ "std out from the teardown\n"
237
+ ].join("\n"), @test.output)
238
+ end
239
+ end
240
+
186
241
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: assert
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 2
9
- - 1
10
- version: 0.2.1
8
+ - 3
9
+ - 0
10
+ version: 0.3.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Kelly Redding
@@ -16,12 +16,11 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2011-08-22 00:00:00 Z
19
+ date: 2011-08-23 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- name: bundler
23
- type: :development
24
22
  prerelease: false
23
+ type: :development
25
24
  requirement: &id001 !ruby/object:Gem::Requirement
26
25
  none: false
27
26
  requirements:
@@ -32,11 +31,11 @@ dependencies:
32
31
  - 1
33
32
  - 0
34
33
  version: "1.0"
34
+ name: bundler
35
35
  version_requirements: *id001
36
36
  - !ruby/object:Gem::Dependency
37
- name: ansi
38
- type: :runtime
39
37
  prerelease: false
38
+ type: :runtime
40
39
  requirement: &id002 !ruby/object:Gem::Requirement
41
40
  none: false
42
41
  requirements:
@@ -47,6 +46,7 @@ dependencies:
47
46
  - 1
48
47
  - 3
49
48
  version: "1.3"
49
+ name: ansi
50
50
  version_requirements: *id002
51
51
  description: Test::Unit style testing framework, just better than Test::Unit.
52
52
  email: