riot 0.9.1 → 0.9.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -131,6 +131,28 @@ When you want to test that an expression returns an object of an expected type:
131
131
  asserts("its balance") { @user.balance }.kind_of(Currency)
132
132
  end
133
133
 
134
+ #### Example: Assigns
135
+
136
+ Sometimes you want to check and see if an instance variable is defined.
137
+
138
+ context "a new user" do
139
+ setup do
140
+ User.new(:email => "foo@bar.baz", :first_name => nil)
141
+ end
142
+ asserts("has an email address") { topic }.assigns(:email)
143
+ asserts("has a first name") { topic }.assigns(:first_name) # This will fail
144
+ end
145
+
146
+ While other times you also want to make sure the value of the instance variable is what you expect it to be.
147
+
148
+ context "a new user" do
149
+ setup do
150
+ User.new(:email => "foo@bar.baz", :first_name => "John")
151
+ end
152
+ asserts("has an email address") { topic }.assigns(:email, "foo@bar.baz")
153
+ asserts("has a first name") { topic }.assigns(:first_name, "Joe") # This will fail
154
+ end
155
+
134
156
  #### Example: Nested contexts
135
157
 
136
158
  Oh yeah, Riot does those, too. The `setup` from each parent is "loaded" into the context and then the context is executed as normal. Test naming is a composite of the parent contexts' names. Here, we'll do a little Sinatra testing (see below for instructions on how to make it Riot work seamlessly with Sinatra tests).
@@ -39,8 +39,8 @@ module Riot
39
39
  # Exception
40
40
 
41
41
  class Failure < Exception
42
- attr_reader :assertion, :context
43
- def initialize(message, assertion)
42
+ attr_accessor :assertion, :context
43
+ def initialize(message, assertion=nil)
44
44
  super(message)
45
45
  @assertion = assertion
46
46
  end
@@ -1,9 +1,10 @@
1
1
  module Riot
2
2
 
3
3
  class Assertion
4
- attr_reader :raised, :to_s, :description
4
+ attr_reader :raised, :to_s, :description, :situation
5
5
  def initialize(description, situation, &block)
6
6
  @description = @to_s = description
7
+ @situation = situation
7
8
  actualize(situation, &block)
8
9
  end
9
10
 
@@ -24,6 +25,9 @@ module Riot
24
25
  def actualize(situation, &block)
25
26
  @actual = situation.instance_eval(&block)
26
27
  @default_failure = fail("expected true, not #{@actual.inspect}") unless @actual == true
28
+ rescue Failure => e
29
+ @failure = e
30
+ @failure.assertion = self
27
31
  rescue Exception => e
28
32
  @raised = e
29
33
  end
@@ -1,5 +1,9 @@
1
1
  module Riot
2
- class Situation; end
2
+ class Situation
3
+ def fail(message)
4
+ raise Failure.new(message)
5
+ end
6
+ end
3
7
 
4
8
  class Context
5
9
  # The protein
@@ -44,6 +44,24 @@ module Riot
44
44
  def kind_of(expected)
45
45
  actual.kind_of?(expected) || fail("expected kind of #{expected}, not #{actual.inspect}")
46
46
  end
47
+
48
+ # Asserts that an instance variable is defined for the result of the assertion. Value of instance
49
+ # variable is expected to not be nil
50
+ # setup { User.new(:email => "foo@bar.baz") }
51
+ # asserts("foo") { topic }.assigns(:email)
52
+ #
53
+ # If a value is provided in addition to the variable name, the actual value of the instance variable
54
+ # must equal the expected value
55
+ # setup { User.new(:emmail => "foo@bar.baz") }
56
+ # asserts("foo") { topic }.assigns(:email, "foo@bar.baz")
57
+ def assigns(variable, expected_value=nil)
58
+ actual_value = actual.instance_variable_get("@#{variable}")
59
+ return fail("expected @#{variable} to be assigned a value") if actual_value.nil?
60
+ unless expected_value.nil? || expected_value == actual_value
61
+ return fail(%Q[expected @#{variable} to be equal to '#{expected_value}', not '#{actual_value}'])
62
+ end
63
+ true
64
+ end
47
65
  end # AssertionMacros
48
66
  end # Riot
49
67
 
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "riot"
3
- s.version = "0.9.1"
4
- s.date = "2009-10-03"
3
+ s.version = "0.9.2"
4
+ s.date = "2009-10-05"
5
5
  s.summary = "An extremely fast, expressive, and context-driven unit-testing framework"
6
6
  s.email = %w[gus@gusg.us]
7
7
  s.homepage = "http://github.com/thumblemonks/protest"
@@ -29,5 +29,6 @@ Gem::Specification.new do |s|
29
29
  test/assertion_test.rb
30
30
  test/benchmark/simple_context_and_assertions.rb
31
31
  test/context_test.rb
32
+ test/teststrap.rb
32
33
  ]
33
34
  end
@@ -1,39 +1,49 @@
1
- require 'riot'
1
+ require 'teststrap'
2
2
 
3
- fake_context = Object.new # It works ... so, why not?
3
+ fake_situation = Riot::Situation.new
4
4
 
5
5
  context "basic assertion:" do
6
6
  should "have a description" do
7
- Riot::Assertion.new("i will pass", fake_context).to_s
7
+ Riot::Assertion.new("i will pass", fake_situation).to_s
8
8
  end.equals("i will pass")
9
9
 
10
10
  asserts "pass? is true when assertion passed" do
11
- Riot::Assertion.new("i will pass", fake_context) { true }.passed?
11
+ Riot::Assertion.new("i will pass", fake_situation) { true }.passed?
12
12
  end
13
13
 
14
14
  asserts "failure? is true when assertion does not pass" do
15
- Riot::Assertion.new("i will pass", fake_context) { false }.failed?
15
+ Riot::Assertion.new("i will pass", fake_situation) { false }.failed?
16
16
  end
17
17
 
18
18
  asserts "error? is true when an unexpected Exception is raised" do
19
- Riot::Assertion.new("error", fake_context) { raise Exception, "blah" }.errored?
19
+ Riot::Assertion.new("error", fake_situation) { raise Exception, "blah" }.errored?
20
20
  end
21
- end
21
+
22
+ context "that fails while executing test" do
23
+ setup do
24
+ Riot::Assertion.new("error", fake_situation) { fail("I'm a bum") }
25
+ end
26
+
27
+ should("be considered a failing assertion") { topic.failed? }
28
+ should("use failed message in description") { topic.result.message }.matches(/I'm a bum/)
29
+ should("assign assertion to failure") { topic.result }.assigns(:assertion)
30
+ end # that fails while executing test
31
+ end # basic assertion
22
32
 
23
33
  context "equals assertion:" do
24
34
  asserts "result equals expectation" do
25
- Riot::Assertion.new("i will pass", fake_context) { "foo bar" }.equals("foo bar")
35
+ Riot::Assertion.new("i will pass", fake_situation) { "foo bar" }.equals("foo bar")
26
36
  end
27
37
 
28
38
  should "raise a Failure if results don't equal each other" do
29
- Riot::Assertion.new("failure", fake_context) { "bar" }.equals("foo")
39
+ Riot::Assertion.new("failure", fake_situation) { "bar" }.equals("foo")
30
40
  end.kind_of(Riot::Failure)
31
41
  end # equals assertion
32
42
 
33
43
  context "nil assertion:" do
34
- asserts("result is nil") { Riot::Assertion.new("foo", fake_context) { nil }.nil }
44
+ asserts("result is nil") { Riot::Assertion.new("foo", fake_situation) { nil }.nil }
35
45
  should "raise a Failure if not nil" do
36
- Riot::Assertion.new("foo", fake_context) { "a" }.nil
46
+ Riot::Assertion.new("foo", fake_situation) { "a" }.nil
37
47
  end.kind_of(Riot::Failure)
38
48
  end # nil assertion
39
49
 
@@ -41,25 +51,25 @@ context "raises assertion:" do
41
51
  should("raise an Exception") { raise Exception }.raises(Exception)
42
52
 
43
53
  should "pass if provided message equals expectation" do
44
- Riot::Assertion.new("foo", fake_context) do
54
+ Riot::Assertion.new("foo", fake_situation) do
45
55
  raise Exception, "I'm a nerd"
46
56
  end.raises(Exception, "I'm a nerd")
47
57
  end.equals(true)
48
58
 
49
59
  should "fail if provided message does not equal expectation" do
50
- Riot::Assertion.new("foo", fake_context) do
60
+ Riot::Assertion.new("foo", fake_situation) do
51
61
  raise(Exception, "I'm a nerd")
52
62
  end.raises(Exception, "But I'm not")
53
63
  end.kind_of(Riot::Failure)
54
64
 
55
65
  should "pass if provided message matches expectation" do
56
- Riot::Assertion.new("foo", fake_context) do
66
+ Riot::Assertion.new("foo", fake_situation) do
57
67
  raise(Exception, "I'm a nerd")
58
68
  end.raises(Exception, %r[nerd])
59
69
  end.equals(true)
60
70
 
61
71
  should "fail if provided message does not match expectation" do
62
- Riot::Assertion.new("foo", fake_context) do
72
+ Riot::Assertion.new("foo", fake_situation) do
63
73
  raise(Exception, "I'm a nerd")
64
74
  end.raises(Exception, %r[foo])
65
75
  end.kind_of(Riot::Failure)
@@ -67,24 +77,62 @@ end # raises assertion
67
77
 
68
78
  context "matching assertion:" do
69
79
  asserts "result matches expression" do
70
- Riot::Assertion.new("foo", fake_context) { "a" }.matches(%r[.])
80
+ Riot::Assertion.new("foo", fake_situation) { "a" }.matches(%r[.])
71
81
  end.equals(0)
72
82
 
73
83
  should "raise a Failure if result does not match" do
74
- Riot::Assertion.new("foo", fake_context) { "" }.matches(%r[.])
84
+ Riot::Assertion.new("foo", fake_situation) { "" }.matches(%r[.])
75
85
  end.kind_of(Riot::Failure)
76
86
 
77
87
  should "return the result of a matching operation" do
78
- Riot::Assertion.new("foo", fake_context) { "a" }.matches("a")
88
+ Riot::Assertion.new("foo", fake_situation) { "a" }.matches("a")
79
89
  end.equals(0)
80
90
  end # maching assertion
81
91
 
82
92
  context "kind_of assertion:" do
83
93
  asserts "specific result is a kind of String" do
84
- Riot::Assertion.new("foo", fake_context) { "a" }.kind_of(String)
94
+ Riot::Assertion.new("foo", fake_situation) { "a" }.kind_of(String)
85
95
  end
86
96
 
87
97
  should "raise a Failure if not a kind of String" do
88
- Riot::Assertion.new("foo", fake_context) { 0 }.kind_of(String)
98
+ Riot::Assertion.new("foo", fake_situation) { 0 }.kind_of(String)
89
99
  end.kind_of(Riot::Failure)
90
100
  end # kind_of assertion
101
+
102
+ context "assigns assertion:" do
103
+ setup do
104
+ situation = Riot::Situation.new
105
+ situation.instance_eval { @foo = "bar"; @bar = nil}
106
+ situation
107
+ end
108
+
109
+ asserts("an instance variable was assigned") do
110
+ test_object = topic
111
+ Riot::Assertion.new("duh", fake_situation) { test_object }.assigns(:foo)
112
+ end
113
+
114
+ asserts("an instance variable was never assigned") do
115
+ test_object = topic
116
+ Riot::Assertion.new("foo", fake_situation) { test_object }.assigns(:baz)
117
+ end.kind_of(Riot::Failure)
118
+
119
+ asserts "an instance variable was defined with nil value" do
120
+ test_object = topic
121
+ Riot::Assertion.new("foo", fake_situation) { test_object }.assigns(:bar).message
122
+ end.equals("expected @bar to be assigned a value")
123
+
124
+ asserts("an instance variable was assigned a specific value") do
125
+ test_object = topic
126
+ Riot::Assertion.new("duh", fake_situation) { test_object }.assigns(:foo, "bar")
127
+ end
128
+
129
+ asserts("failure when instance never assigned even when a value is expected") do
130
+ test_object = topic
131
+ Riot::Assertion.new("duh", fake_situation) { test_object }.assigns(:bar, "bar").message
132
+ end.equals("expected @bar to be assigned a value")
133
+
134
+ asserts("failure when expected value is not assigned to variable with a value") do
135
+ test_object = topic
136
+ Riot::Assertion.new("duh", fake_situation) { test_object }.assigns(:foo, "baz").message
137
+ end.equals("expected @foo to be equal to 'baz', not 'bar'")
138
+ end # assigns assertion
@@ -1,4 +1,4 @@
1
- require 'riot'
1
+ require 'teststrap'
2
2
  require 'stringio'
3
3
 
4
4
  context "any context" do
@@ -0,0 +1,3 @@
1
+ require 'riot'
2
+
3
+ at_exit { Riot.report }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: riot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.9.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Knowlden
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-10-03 00:00:00 -05:00
12
+ date: 2009-10-05 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -65,3 +65,4 @@ test_files:
65
65
  - test/assertion_test.rb
66
66
  - test/benchmark/simple_context_and_assertions.rb
67
67
  - test/context_test.rb
68
+ - test/teststrap.rb