xspec 0.0.2 → 0.1.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.
@@ -180,6 +180,8 @@ module XSpec
180
180
  false
181
181
  end
182
182
 
183
+ private
184
+
183
185
  def full_name(unit_of_work)
184
186
  (unit_of_work.parents + [unit_of_work]).map(&:name).compact.join(' ')
185
187
  end
@@ -0,0 +1,39 @@
1
+ # # Schedulers
2
+
3
+ # Schedulers are responsible for collecting all units of work to be run and
4
+ # scheduling them.
5
+ module XSpec
6
+ module Scheduler
7
+ # The serial scheduler, unsurprisingly, runs all units of works serially in
8
+ # a loop. It is about as simple a scheduler as you can imagine. Parents
9
+ # are responsible for actually executing the work.
10
+ class Serial
11
+ def initialize(opts = {})
12
+ @clock = opts.fetch(:clock, ->{ Time.now.to_f })
13
+ end
14
+
15
+ def run(context, notifier)
16
+ notifier.run_start
17
+
18
+ context.nested_units_of_work.each do |x|
19
+ notifier.evaluate_start(x)
20
+
21
+ start_time = clock.()
22
+ errors = x.immediate_parent.execute(x)
23
+ finish_time = clock.()
24
+
25
+ result = ExecutedUnitOfWork.new(x, errors, finish_time - start_time)
26
+ notifier.evaluate_finish(result)
27
+ end
28
+
29
+ notifier.run_finish
30
+ end
31
+
32
+ protected
33
+
34
+ attr_reader :clock
35
+ end
36
+
37
+ DEFAULT = Serial.new
38
+ end
39
+ end
@@ -1,11 +1,11 @@
1
1
  require 'spec_helper'
2
2
 
3
- require 'xspec/assertion_contexts'
3
+ require 'xspec/evaluators'
4
4
 
5
5
  it 'integrates with rspec' do
6
6
  opts = {
7
- assertion_context: XSpec::AssertionContext.stack {
8
- include XSpec::AssertionContext::RSpecExpectations
7
+ evaluator: XSpec::Evaluator.stack {
8
+ include XSpec::Evaluator::RSpecExpectations
9
9
  }
10
10
  }
11
11
 
data/spec/spec_helper.rb CHANGED
@@ -9,8 +9,6 @@ extend XSpec.dsl(
9
9
  XSpec::Notifier::FailuresAtEnd.new
10
10
  )
11
11
 
12
- autorun!
13
-
14
12
  def assert_errors_from_run(context, expected_error_messages)
15
13
  context.run!
16
14
 
@@ -1,8 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'simple assertion context' do
4
- let(:subject) { Class.new { include XSpec::AssertionContext.stack {
5
- include XSpec::AssertionContext::Simple
4
+ let(:subject) { Class.new { include XSpec::Evaluator.stack {
5
+ include XSpec::Evaluator::Simple
6
6
  }}.new }
7
7
 
8
8
  describe 'assert' do
@@ -14,7 +14,7 @@ describe 'simple assertion context' do
14
14
  begin
15
15
  subject.assert(false)
16
16
  fail "Assertion did not fail"
17
- rescue XSpec::AssertionContext::Simple::AssertionFailed => e
17
+ rescue XSpec::Evaluator::Simple::AssertionFailed => e
18
18
  assert_equal "assertion failed", e.message
19
19
  end
20
20
  end
@@ -23,7 +23,7 @@ describe 'simple assertion context' do
23
23
  begin
24
24
  subject.assert(false, "nope")
25
25
  fail "Assertion did not fail"
26
- rescue XSpec::AssertionContext::Simple::AssertionFailed => e
26
+ rescue XSpec::Evaluator::Simple::AssertionFailed => e
27
27
  assert_equal "nope", e.message
28
28
  end
29
29
  end
@@ -38,7 +38,7 @@ describe 'simple assertion context' do
38
38
  begin
39
39
  subject.assert_equal("a", "b")
40
40
  fail "Assertion did not fail"
41
- rescue XSpec::AssertionContext::Simple::AssertionFailed => e
41
+ rescue XSpec::Evaluator::Simple::AssertionFailed => e
42
42
  assert_include 'want: "a"', e.message
43
43
  assert_include 'got: "b"', e.message
44
44
  end
@@ -50,7 +50,7 @@ describe 'simple assertion context' do
50
50
  begin
51
51
  subject.fail
52
52
  assert false, "fail did not fail"
53
- rescue XSpec::AssertionContext::Simple::AssertionFailed => e
53
+ rescue XSpec::Evaluator::Simple::AssertionFailed => e
54
54
  assert_equal "failed", e.message
55
55
  end
56
56
  end
@@ -59,7 +59,7 @@ describe 'simple assertion context' do
59
59
  begin
60
60
  subject.fail ":("
61
61
  assert false, "fail did not fail"
62
- rescue XSpec::AssertionContext::Simple::AssertionFailed => e
62
+ rescue XSpec::Evaluator::Simple::AssertionFailed => e
63
63
  assert_equal ":(", e.message
64
64
  end
65
65
  end
@@ -6,127 +6,135 @@ class LoadedClass
6
6
  end
7
7
 
8
8
  describe 'doubles assertion context' do
9
- let(:subject) { Class.new { include XSpec::AssertionContext.stack {
10
- include XSpec::AssertionContext::Doubles
9
+ let(:subject) { Class.new { include XSpec::Evaluator.stack {
10
+ include XSpec::Evaluator::Doubles
11
11
  }}.new }
12
12
 
13
13
  it 'converts double exceptions to failures' do
14
14
  result = subject.call(XSpec::UnitOfWork.new(nil, ->{
15
- raise XSpec::AssertionContext::Doubles::DoubleFailure, "nope"
15
+ raise XSpec::Evaluator::Doubles::DoubleFailure, "nope"
16
16
  }))
17
17
  assert_equal "nope", result[0].message
18
18
  end
19
19
 
20
20
  describe 'doubles of unloaded classes' do
21
- it 'allows any method to be expected' do
22
- assert_equal nil, subject.instance_eval {
21
+ it 'allows a stub to be used multiple times' do
22
+ assert_equal 1, subject.instance_eval {
23
23
  double = instance_double('Bogus')
24
- expect(double).foo
25
- double.foo
24
+ stub(double).foo("a") { 1 }
25
+ double.foo("a")
26
+ double.foo("a")
26
27
  }
27
28
  end
28
29
 
29
- it 'allows any return value to be specified' do
30
+ it 'allows any return value to be stubbed' do
30
31
  assert_equal 1, subject.instance_eval {
31
32
  double = instance_double('Bogus')
32
- expect(double).foo("a") { 2 }
33
- expect(double).foo("b") { 3 }
33
+ stub(double).foo("a") { 2 }
34
+ stub(double).foo("b") { 3 }
34
35
  double.foo("b") - double.foo("a")
35
36
  }
36
37
  end
37
38
 
38
39
  it 'requires matching method name' do
39
- begin
40
- subject.instance_eval {
41
- double = instance_double('Bogus')
42
- expect(double).foo("a")
43
- double.bar("a")
44
- }
45
- fail "no error raised"
46
- rescue XSpec::AssertionContext::Doubles::DoubleFailure => e
47
- assert_include "Unexpectedly received", e.message
48
- assert_include 'bar("a")', e.message
49
- end
40
+ assert_equal nil, subject.instance_eval {
41
+ double = instance_double('Bogus')
42
+ stub(double).foo("a") { 1 }
43
+ double.bar("a")
44
+ }
50
45
  end
51
46
 
52
47
  it 'requires exact arguments' do
53
- begin
54
- subject.instance_eval {
55
- double = instance_double('Bogus')
56
- expect(double).foo("a")
57
- double.foo("b")
58
- }
59
- fail "no error raised"
60
- rescue XSpec::AssertionContext::Doubles::DoubleFailure => e
61
- assert_include "Unexpectedly received", e.message
62
- assert_include 'foo("b")', e.message
63
- end
48
+ assert_equal nil, subject.instance_eval {
49
+ double = instance_double('Bogus')
50
+ stub(double).foo("a") { 1 }
51
+ double.foo("b")
52
+ }
64
53
  end
65
54
  end
66
55
 
67
- describe 'assert_exhausted' do
68
- it 'passes if all expectations have been called' do
56
+ describe 'verify' do
57
+ it 'can verify a method was called with no setup' do
69
58
  assert subject.instance_eval {
70
59
  double = instance_double('Bogus')
71
- expect(double).foo
72
60
  double.foo
73
- assert_exhausted double
61
+ verify(double).foo
74
62
  true
75
63
  }
76
64
  end
77
65
 
78
- it 'raises when not all expectations have been called' do
66
+ it 'can verify a method that was stubbed' do
67
+ assert subject.instance_eval {
68
+ double = instance_double('Bogus')
69
+ stub(double).foo { 1 }
70
+ double.foo
71
+ verify(double).foo
72
+ true
73
+ }
74
+ end
75
+
76
+ it 'raises if method was not called' do
79
77
  begin
80
78
  subject.instance_eval {
81
79
  double = instance_double('Bogus')
82
- expect(double).foo(1, "abc")
83
- assert_exhausted double
80
+ double.bar
81
+ verify(double).foo("b")
84
82
  }
85
83
  fail "no error raised"
86
- rescue XSpec::AssertionContext::Doubles::DoubleFailure => e
87
- assert_include "did not receive", e.message
88
- assert_include 'foo(1, "abc")', e.message
84
+ rescue XSpec::Evaluator::Doubles::DoubleFailure => e
85
+ assert_include "Did not receive", e.message
86
+ assert_include 'foo("b")', e.message
89
87
  end
90
88
  end
91
89
 
92
- it 'does not raise on uncalled allows' do
93
- assert subject.instance_eval {
94
- double = instance_double('Bogus')
95
- allow(double).foo
96
- assert_exhausted double
97
- true
98
- }
99
- end
100
-
101
- it 'gives precendence to expect' do
102
- assert_equal 1, subject.instance_eval {
103
- double = instance_double('Bogus')
104
- allow(double).foo
105
- expect(double).foo { 1 }
106
- ret = double.foo
107
- assert_exhausted double
108
- ret
109
- }
90
+ it 'raises if method was not called with right arguments' do
91
+ begin
92
+ subject.instance_eval {
93
+ double = instance_double('Bogus')
94
+ double.foo("a")
95
+ double.foo("b")
96
+ verify(double).foo("c")
97
+ }
98
+ fail "no error raised"
99
+ rescue XSpec::Evaluator::Doubles::DoubleFailure => e
100
+ assert_include "Did not receive", e.message
101
+ assert_include 'foo("b")', e.message
102
+ assert_include "Did receive", e.message
103
+ assert_include 'foo("a")', e.message
104
+ assert_include 'foo("b")', e.message
105
+ end
110
106
  end
111
107
  end
112
108
 
113
109
  describe 'instance_double' do
114
110
  describe 'when doubled class is loaded' do
115
- it 'allows instance methods to be expected' do
111
+ it 'allows instance methods to be stubbed' do
116
112
  assert subject.instance_eval {
117
113
  double = instance_double('LoadedClass')
118
- expect(double).instance_method { 123 }
114
+ stub(double).instance_method { 123 }
119
115
  }
120
116
  end
121
117
 
122
- it 'does not allow non-existing methods to be expected' do
118
+ it 'does not allow non-existing methods to be stubbed' do
119
+ begin
120
+ assert subject.instance_eval {
121
+ double = instance_double('LoadedClass')
122
+ stub(double).bogus_method { 123 }
123
+ }
124
+ fail "no error raised"
125
+ rescue XSpec::Evaluator::Doubles::DoubleFailure => e
126
+ assert_include "LoadedClass#bogus_method", e.message
127
+ end
128
+ end
129
+
130
+ it 'does not allow non-existing methods to be verified' do
123
131
  begin
124
132
  assert subject.instance_eval {
125
133
  double = instance_double('LoadedClass')
126
- expect(double).bogus_method { 123 }
134
+ verify(double).bogus_method { 123 }
127
135
  }
128
136
  fail "no error raised"
129
- rescue XSpec::AssertionContext::Doubles::DoubleFailure => e
137
+ rescue XSpec::Evaluator::Doubles::DoubleFailure => e
130
138
  assert_include "LoadedClass#bogus_method", e.message
131
139
  end
132
140
  end
@@ -135,21 +143,33 @@ describe 'doubles assertion context' do
135
143
 
136
144
  describe 'class_double' do
137
145
  describe 'when doubled class is loaded' do
138
- it 'allows instance methods to be expected' do
146
+ it 'allows instance methods to be stubbed' do
139
147
  assert subject.instance_eval {
140
148
  double = class_double('LoadedClass')
141
- expect(double).class_method { 123 }
149
+ stub(double).class_method { 123 }
142
150
  }
143
151
  end
144
152
 
145
- it 'does not allow non-existing methods to be expected' do
153
+ it 'does not allow non-existing methods to be stubbed' do
146
154
  begin
147
155
  assert subject.instance_eval {
148
156
  double = class_double('LoadedClass')
149
- expect(double).bogus_method { 123 }
157
+ stub(double).bogus_method { 123 }
150
158
  }
151
159
  fail "no error raised"
152
- rescue XSpec::AssertionContext::Doubles::DoubleFailure => e
160
+ rescue XSpec::Evaluator::Doubles::DoubleFailure => e
161
+ assert_include "LoadedClass.bogus_method", e.message
162
+ end
163
+ end
164
+
165
+ it 'does not allow non-existing methods to be verified' do
166
+ begin
167
+ assert subject.instance_eval {
168
+ double = class_double('LoadedClass')
169
+ verify(double).bogus_method
170
+ }
171
+ fail "no error raised"
172
+ rescue XSpec::Evaluator::Doubles::DoubleFailure => e
153
173
  assert_include "LoadedClass.bogus_method", e.message
154
174
  end
155
175
  end
@@ -158,8 +178,8 @@ describe 'doubles assertion context' do
158
178
  end
159
179
 
160
180
  describe 'strict doubles assertion context' do
161
- let(:subject) { Class.new { include XSpec::AssertionContext.stack {
162
- include XSpec::AssertionContext::Doubles.with(:strict)
181
+ let(:subject) { Class.new { include XSpec::Evaluator.stack {
182
+ include XSpec::Evaluator::Doubles.with(:strict)
163
183
  }}.new }
164
184
 
165
185
  it 'allows doubling of loaded classes' do
@@ -170,50 +190,8 @@ describe 'strict doubles assertion context' do
170
190
  begin
171
191
  subject.instance_double("Bogus")
172
192
  fail "no error raised"
173
- rescue XSpec::AssertionContext::Doubles::DoubleFailure => e
193
+ rescue XSpec::Evaluator::Doubles::DoubleFailure => e
174
194
  assert_include "Bogus", e.message
175
195
  end
176
196
  end
177
197
  end
178
-
179
- describe 'auto-verifying doubles assertion context' do
180
- let(:subject) { Class.new { include XSpec::AssertionContext.stack {
181
- include XSpec::AssertionContext::Doubles.with(:auto_verify)
182
- }}.new }
183
-
184
- it 'verifies all used instance doubles on successful result' do
185
- result = subject.call(XSpec::UnitOfWork.new(nil, ->{
186
- double = instance_double('Bogus')
187
- expect(double).foo
188
- }))
189
-
190
- assert_equal 1, result.length
191
- assert_include "did not receive", result[0].message
192
- assert_include "foo()", result[0].message
193
- end
194
-
195
- it 'verifies all used class doubles on successful result' do
196
- result = subject.call(XSpec::UnitOfWork.new(nil, ->{
197
- double = class_double('Bogus')
198
- expect(double).foo
199
- }))
200
-
201
- assert_equal 1, result.length
202
- assert_include "did not receive", result[0].message
203
- assert_include "foo()", result[0].message
204
- end
205
-
206
- it 'does not verify doubles if errors occurred' do
207
- result = subject.call(XSpec::UnitOfWork.new(nil, ->{
208
- double = instance_double('Bogus')
209
- expect(double).foo
210
- fail "nope"
211
- }))
212
- assert_equal 1, result.length
213
- assert_include "nope", result[0].message
214
- end
215
-
216
- it 'returns successful result if all doubles are valid' do
217
- assert_equal [], subject.call(XSpec::UnitOfWork.new(nil, ->{}))
218
- end
219
- end
data/xspec.gemspec CHANGED
@@ -11,7 +11,7 @@ Gem::Specification.new do |gem|
11
11
  gem.homepage = "http://github.com/xaviershay/xspec"
12
12
 
13
13
  gem.executables = []
14
- gem.required_ruby_version = '>= 1.9.0'
14
+ gem.required_ruby_version = '>= 2.1.0'
15
15
  gem.files = Dir.glob("{spec,lib}/**/*.rb") + %w(
16
16
  README.md
17
17
  xspec.gemspec
@@ -22,6 +22,6 @@ Gem::Specification.new do |gem|
22
22
  gem.bindir = "bin"
23
23
  gem.executables << "xspec"
24
24
  gem.license = "Apache 2.0"
25
- gem.version = "0.0.2"
25
+ gem.version = "0.1.0"
26
26
  gem.has_rdoc = false
27
27
  end