rx-rspec 0.1.3 → 0.2.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.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +10 -2
- data/lib/rx-rspec.rb +3 -1
- data/lib/rx-rspec/exactly.rb +41 -0
- data/lib/rx-rspec/first.rb +43 -0
- data/lib/rx-rspec/{matchers.rb → include.rb} +0 -37
- data/rx-rspec.gemspec +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 17fca61b862bdad691dada39e00c9783ea63b64e
|
|
4
|
+
data.tar.gz: b3aafdb9e48e4a880e42612b9c1692b05155db64
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c135aab0a3ef97412faede7313f34d6c3bb4ba6fad7e404226ad8e2f70811373d166e74ce521c286459e03b6c8f3479d034b294a27b34da7fb7cdbb0eb7fccef
|
|
7
|
+
data.tar.gz: c0d4d32b06750f2359fda10308039c03836fda0116e14c6442ddddaec1a8449265f3b9668046960b92775adffa7cced8d73734bd677128217258dd342c39f4fa
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
|
@@ -28,7 +28,15 @@ require 'rx'
|
|
|
28
28
|
require 'rx-rspec'
|
|
29
29
|
|
|
30
30
|
describe 'awesome' do
|
|
31
|
-
subject { Rx::Observable.
|
|
32
|
-
it { should emit_exactly(
|
|
31
|
+
subject { Rx::Observable.of(1, 2, 3) }
|
|
32
|
+
it { should emit_exactly(1, 2, 3) }
|
|
33
33
|
end
|
|
34
34
|
```
|
|
35
|
+
|
|
36
|
+
## Matchers
|
|
37
|
+
|
|
38
|
+
rx-spec include the following matchers:
|
|
39
|
+
|
|
40
|
+
- **emit_exactly()** metches against all items produced by the observable and requires the observable to be completed.
|
|
41
|
+
- **emit_first()** matches against the first elements of the observable, but does not require it to complete
|
|
42
|
+
- **emit_include()** consumes elements until the expected elements have occurred
|
data/lib/rx-rspec.rb
CHANGED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require 'rspec'
|
|
2
|
+
|
|
3
|
+
# TODO:
|
|
4
|
+
# - should have specific timeout message 'x seconds waiting for y'
|
|
5
|
+
|
|
6
|
+
RSpec::Matchers.define :emit_exactly do |*expected|
|
|
7
|
+
events = []
|
|
8
|
+
errors = []
|
|
9
|
+
match do |actual|
|
|
10
|
+
Thread.new do
|
|
11
|
+
spinlock = expected.size
|
|
12
|
+
actual.subscribe(
|
|
13
|
+
lambda do |event|
|
|
14
|
+
events << event
|
|
15
|
+
spinlock -= 1
|
|
16
|
+
end,
|
|
17
|
+
lambda do |err|
|
|
18
|
+
errors << err
|
|
19
|
+
spinlock = 0
|
|
20
|
+
end,
|
|
21
|
+
lambda { spinlock = 0 }
|
|
22
|
+
)
|
|
23
|
+
for n in 1..10
|
|
24
|
+
break if spinlock == 0
|
|
25
|
+
sleep(0.05)
|
|
26
|
+
end
|
|
27
|
+
raise 'timeout' if spinlock > 0
|
|
28
|
+
end.join
|
|
29
|
+
|
|
30
|
+
return false unless errors.empty?
|
|
31
|
+
values_match? expected, events
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
failure_message do
|
|
35
|
+
if errors.empty?
|
|
36
|
+
"expected #{events} to match #{expected}"
|
|
37
|
+
else
|
|
38
|
+
"expected #{expected} but received error #{errors[0].inspect}"
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
require 'rspec'
|
|
2
|
+
|
|
3
|
+
# TODO:
|
|
4
|
+
# - should have specific timeout message 'x seconds waiting for y'
|
|
5
|
+
|
|
6
|
+
RSpec::Matchers.define :emit_first do |*expected|
|
|
7
|
+
events = []
|
|
8
|
+
errors = []
|
|
9
|
+
completed = []
|
|
10
|
+
|
|
11
|
+
match do |actual|
|
|
12
|
+
raise 'Please supply at least one expectation' if expected.size == 0
|
|
13
|
+
expect_clone = expected.dup
|
|
14
|
+
Thread.new do
|
|
15
|
+
deadline = Time.now + 0.5
|
|
16
|
+
actual.take_while do |event|
|
|
17
|
+
events << event
|
|
18
|
+
values_match?(expect_clone.shift, event) && expect_clone.size > 0
|
|
19
|
+
end.subscribe(
|
|
20
|
+
lambda { |event| },
|
|
21
|
+
lambda { |err| errors << err },
|
|
22
|
+
lambda { completed << :complete }
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
until Time.now > deadline
|
|
26
|
+
break if expect_clone.empty?
|
|
27
|
+
break unless completed.empty? && errors.empty?
|
|
28
|
+
sleep(0.05)
|
|
29
|
+
end
|
|
30
|
+
raise 'timeout' if Time.now > deadline
|
|
31
|
+
end.join
|
|
32
|
+
|
|
33
|
+
expect_clone.empty?
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
failure_message do
|
|
37
|
+
if errors.empty?
|
|
38
|
+
"expected #{events} to emit at least #{expected}"
|
|
39
|
+
else
|
|
40
|
+
"expected #{expected} but received error #{errors[0].inspect}"
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -42,40 +42,3 @@ RSpec::Matchers.define :emit_include do |*expected|
|
|
|
42
42
|
end
|
|
43
43
|
end
|
|
44
44
|
end
|
|
45
|
-
|
|
46
|
-
RSpec::Matchers.define :emit_exactly do |*expected|
|
|
47
|
-
events = []
|
|
48
|
-
errors = []
|
|
49
|
-
match do |actual|
|
|
50
|
-
Thread.new do
|
|
51
|
-
spinlock = expected.size
|
|
52
|
-
actual.subscribe(
|
|
53
|
-
lambda do |event|
|
|
54
|
-
events << event
|
|
55
|
-
spinlock -= 1
|
|
56
|
-
end,
|
|
57
|
-
lambda do |err|
|
|
58
|
-
errors << err
|
|
59
|
-
spinlock = 0
|
|
60
|
-
end,
|
|
61
|
-
lambda { spinlock = 0 }
|
|
62
|
-
)
|
|
63
|
-
for n in 1..10
|
|
64
|
-
break if spinlock == 0
|
|
65
|
-
sleep(0.05)
|
|
66
|
-
end
|
|
67
|
-
raise 'timeout' if spinlock > 0
|
|
68
|
-
end.join
|
|
69
|
-
|
|
70
|
-
return false unless errors.empty?
|
|
71
|
-
values_match? expected, events
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
failure_message do
|
|
75
|
-
if errors.empty?
|
|
76
|
-
"expected #{events} to match #{expected}"
|
|
77
|
-
else
|
|
78
|
-
"expected #{expected} but received error #{errors[0].inspect}"
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
end
|
data/rx-rspec.gemspec
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Gem::Specification.new do |spec|
|
|
2
2
|
spec.name = 'rx-rspec'
|
|
3
|
-
spec.version = '0.
|
|
3
|
+
spec.version = '0.2.0'
|
|
4
4
|
spec.summary = 'rspec testing support for RxRuby'
|
|
5
5
|
spec.description = 'Writing specs for reactive streams is tricky both because of their asynchronous nature and because their next/error/completed semantics. The goal of rx-rspec is to provide powerful matchers that lets you express your expectations in a traditional rspec-like synchronous manner.'
|
|
6
6
|
spec.authors = ['Anders Qvist']
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rx-rspec
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Anders Qvist
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2017-01-
|
|
11
|
+
date: 2017-01-16 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rx
|
|
@@ -110,7 +110,9 @@ files:
|
|
|
110
110
|
- LICENSE.md
|
|
111
111
|
- README.md
|
|
112
112
|
- lib/rx-rspec.rb
|
|
113
|
-
- lib/rx-rspec/
|
|
113
|
+
- lib/rx-rspec/exactly.rb
|
|
114
|
+
- lib/rx-rspec/first.rb
|
|
115
|
+
- lib/rx-rspec/include.rb
|
|
114
116
|
- rx-rspec.gemspec
|
|
115
117
|
homepage: http://github.org/bittrance/rx-rspec
|
|
116
118
|
licenses:
|