thumblemonks-protest 0.0.2 → 0.0.3

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.
@@ -1,10 +1,17 @@
1
1
  module Protest
2
2
  class Failure < Exception; end
3
+ class Error < Exception
4
+ def initialize(message, e)
5
+ super(message)
6
+ set_backtrace(e.backtrace)
7
+ end
8
+ end
3
9
 
4
10
  class Assertion
5
11
  def initialize(description, &block)
6
12
  @description = description
7
- @boolean_expectation = true
13
+ @evaluated_expectation = true
14
+ @expects_raise = false
8
15
  expectation(true, &block)
9
16
  end
10
17
 
@@ -13,7 +20,7 @@ module Protest
13
20
  end
14
21
 
15
22
  def not(&block)
16
- @boolean_expectation = false
23
+ @evaluated_expectation = false
17
24
  expectation(@expectation, &block)
18
25
  end
19
26
 
@@ -21,9 +28,19 @@ module Protest
21
28
  expectation(expectation, &block)
22
29
  end
23
30
 
24
- def run(context)
25
- actual = context.instance_eval(&@block)
26
- assert(@expectation == actual, "#{context} asserted #{self}, but received [#{actual}] instead")
31
+ def raises(expectation, &block)
32
+ @expects_raise = true
33
+ expectation(expectation, &block)
34
+ end
35
+
36
+ def run(binding_scope)
37
+ begin
38
+ actual = binding_scope.instance_eval(&@block)
39
+ rescue Exception => e
40
+ errored("#{binding_scope} asserted #{self}, but errored with: #{e.to_s}", e) unless @expects_raise
41
+ actual = e.class
42
+ end
43
+ assert(@expectation == actual, "#{binding_scope} asserted #{self}, but received [#{actual}] instead")
27
44
  end
28
45
  private
29
46
  def expectation(expectation, &block)
@@ -32,8 +49,10 @@ module Protest
32
49
  self
33
50
  end
34
51
 
35
- def assert(expression, msg)
36
- @boolean_expectation == expression || raise(Failure, msg)
52
+ def errored(message, e); raise Error.new(message, e); end
53
+
54
+ def assert(evaluation, message)
55
+ @evaluated_expectation == evaluation || raise(Failure, message)
37
56
  end
38
57
  end # Assertion
39
58
  end # Protest
@@ -1,10 +1,10 @@
1
1
  module Protest
2
2
  class Context
3
- attr_reader :assertions
3
+ attr_reader :assertions, :errors
4
4
  def initialize(description, parent=nil)
5
5
  @description = description
6
6
  @assertions = []
7
- @failures = []
7
+ @errors = []
8
8
  @parent = parent
9
9
  @setup = nil
10
10
  end
@@ -32,11 +32,12 @@ module Protest
32
32
  assertion.run(self)
33
33
  writer.print '.'
34
34
  rescue Protest::Failure => e
35
- writer.print 'F'
36
- @failures << e
35
+ writer.print 'F'; @errors << e
36
+ rescue Protest::Error => e
37
+ writer.print 'E'; @errors << e
37
38
  end
38
39
  end
39
- @failures
40
+ @errors
40
41
  end
41
42
 
42
43
  def bootstrap(binder)
@@ -4,6 +4,13 @@ module Protest
4
4
  asserts(description, &block).not
5
5
  end
6
6
  end # ContextMacros
7
+
8
+ module AssertionMacros
9
+ def nil(&block)
10
+ equals(nil, &block)
11
+ end
12
+ end # ContextMacros
7
13
  end # Protest
8
14
 
9
- Protest::Context.instance_eval { include Protest::ContextMacros }
15
+ Protest::Context.instance_eval { include Protest::ContextMacros }
16
+ Protest::Assertion.instance_eval { include Protest::AssertionMacros }
data/lib/protest.rb CHANGED
@@ -26,7 +26,7 @@ module Protest
26
26
  writer.puts "\n\n"
27
27
  failures.each_with_index { |failure, idx|
28
28
  message = ["##{idx + 1} - #{failure.to_s}"]
29
- # message += failure.backtrace
29
+ message += failure.backtrace
30
30
  writer.puts message.join("\n") + "\n\n"
31
31
  } unless failures.empty?
32
32
  assertions = @contexts.inject(0) { |acc, context| acc + context.assertions.length }
data/protest.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "protest"
3
- s.version = "0.0.2"
3
+ s.version = "0.0.3"
4
4
  s.date = "2009-06-28"
5
5
  s.summary = "An extremely fast, expressive, and context-driven unit-testing framework"
6
6
  s.email = %w[gus@gusg.us]
@@ -7,35 +7,25 @@ context "any assertion" do
7
7
  end # any assertion
8
8
 
9
9
  context "passing assertion" do
10
- asserts("true is expected") do
11
- Protest::Assertion.new("i will pass") { true }.run(Object.new)
12
- end
10
+ asserts("true is expected") { Protest::Assertion.new("i will pass") { true }.run(Object.new) }
11
+ asserts("false on denial") { Protest::Assertion.new("i will fail").not { false }.run(Object.new) }
12
+ asserts("actual result is nil") { Protest::Assertion.new("i will fail").nil { nil }.run(Object.new) }
13
13
 
14
14
  asserts("provided block was executed and returned true") do
15
15
  Protest::Assertion.new("i will pass").equals("foo bar") { "foo bar" }.run(Object.new)
16
16
  end
17
17
 
18
- asserts("false on denial") do
19
- Protest::Assertion.new("i will fail").not { false }.run(Object.new)
20
- end
21
-
22
18
  asserts("expectation does not equal actual result") do
23
19
  Protest::Assertion.new("i will fail").not.equals("foo") { "bar" }.run(Object.new)
24
20
  end
25
21
  end # passing assertion
26
22
 
27
- context "failing assertion" do
28
- setup do
29
- @expected_message = "test context asserted failure: expected [true], but received [false] instead"
30
- assertion = Protest::Assertion.new("failure") { false }
31
- begin
32
- assertion.run(Protest::Context.new("test context"))
33
- rescue Protest::Failure => e
34
- @result = e
35
- end
23
+ context "failing assertions:" do
24
+ asserts("a Failure error is thrown").raises(Protest::Failure) do
25
+ Protest::Assertion.new("failure") { false }.run(Object.new)
36
26
  end
37
-
38
- asserts("failure message").equals(@expected_message) do
39
- @result.to_s
27
+
28
+ asserts("an Error error is thrown").raises(Protest::Error) do
29
+ Protest::Assertion.new("error") { raise Exception, "blah" }.run(Object.new)
40
30
  end
41
- end # failing assertion
31
+ end # failing assertions
data/test/context_test.rb CHANGED
@@ -2,10 +2,28 @@ require 'protest'
2
2
  require 'stringio'
3
3
 
4
4
  context "any context" do
5
- denies("two contexts with same name are the same").equals(Protest::Context.new("a")) do
6
- Protest::Context.new("a")
5
+ setup do
6
+ @context = Protest::Context.new("a")
7
7
  end
8
- end
8
+
9
+ denies("two contexts with same name are the same").equals(@context) { Protest::Context.new("a") }
10
+
11
+ context "that doesn't have passing tests" do
12
+ setup do
13
+ @context.asserts("b") { false }
14
+ @context.asserts("c") { raise Exception, "blah" }
15
+ @context.run(StringIO.new)
16
+ end
17
+
18
+ asserts("that failures are captured").equals(1) do
19
+ @context.errors.select{|e| e.kind_of?(Protest::Failure)}.length
20
+ end
21
+
22
+ asserts("that unexpected errors are captured").equals(1) do
23
+ @context.errors.select{|e| e.kind_of?(Protest::Error)}.length
24
+ end
25
+ end # that doesn't have passing tests
26
+ end # any context
9
27
 
10
28
  #
11
29
  # Test Context
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thumblemonks-protest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Knowlden