spnet 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +6 -3
- data/lib/spnet.rb +23 -5
- data/lib/spnet/core/block.rb +46 -0
- data/lib/spnet/core/in_port.rb +41 -0
- data/lib/spnet/core/limiter.rb +30 -0
- data/lib/spnet/core/link.rb +70 -0
- data/lib/spnet/core/network.rb +54 -0
- data/lib/spnet/core/out_port.rb +41 -0
- data/lib/spnet/limiters/enum_limiter.rb +24 -0
- data/lib/spnet/limiters/lower_limiter.rb +31 -0
- data/lib/spnet/limiters/no_limiter.rb +11 -0
- data/lib/spnet/limiters/range_limiter.rb +24 -0
- data/lib/spnet/limiters/upper_limiter.rb +31 -0
- data/lib/spnet/ports/command_in_port.rb +16 -8
- data/lib/spnet/ports/command_out_port.rb +17 -11
- data/lib/spnet/ports/param_in_port.rb +42 -0
- data/lib/spnet/ports/param_out_port.rb +32 -0
- data/lib/spnet/ports/signal_in_port.rb +20 -15
- data/lib/spnet/ports/signal_out_port.rb +12 -7
- data/lib/spnet/storage/block_state.rb +41 -0
- data/lib/spnet/storage/link_state.rb +38 -0
- data/lib/spnet/storage/network_state.rb +44 -0
- data/lib/spnet/storage/port_locater.rb +21 -0
- data/lib/spnet/version.rb +2 -1
- data/spec/core/block_spec.rb +80 -0
- data/spec/core/in_port_spec.rb +46 -0
- data/spec/core/limiter_spec.rb +7 -0
- data/spec/core/link_spec.rb +103 -0
- data/spec/core/network_spec.rb +40 -0
- data/spec/core/out_port_spec.rb +46 -0
- data/spec/limiters/enum_limiter_spec.rb +28 -0
- data/spec/limiters/lower_limiter_spec.rb +48 -0
- data/spec/limiters/no_limiter_spec.rb +12 -0
- data/spec/limiters/range_limiter_spec.rb +121 -0
- data/spec/limiters/upper_limiter_spec.rb +47 -0
- data/spec/ports/command_out_port_spec.rb +8 -15
- data/spec/ports/{value_in_port_spec.rb → param_in_port_spec.rb} +2 -2
- data/spec/ports/param_out_port_spec.rb +34 -0
- data/spec/ports/signal_in_port_spec.rb +2 -1
- data/spec/ports/signal_out_port_spec.rb +6 -37
- data/spec/spec_helper.rb +43 -0
- data/spec/storage/block_state_spec.rb +40 -0
- data/spec/storage/link_state_spec.rb +28 -0
- data/spec/storage/network_state_spec.rb +42 -0
- data/spec/storage/port_locater_spec.rb +11 -0
- data/spnet.gemspec +0 -1
- metadata +55 -35
- data/lib/spnet/block.rb +0 -40
- data/lib/spnet/in_port.rb +0 -29
- data/lib/spnet/out_port.rb +0 -64
- data/lib/spnet/ports/value_in_port.rb +0 -27
- data/lib/spnet/ports/value_out_port.rb +0 -28
- data/spec/block_spec.rb +0 -38
- data/spec/in_port_spec.rb +0 -29
- data/spec/out_port_spec.rb +0 -46
- data/spec/ports/value_out_port_spec.rb +0 -41
@@ -0,0 +1,46 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe SPNet::InPort do
|
4
|
+
describe '.new' do
|
5
|
+
it 'link should be nil' do
|
6
|
+
port = InPort.new :matching_class => OutPort
|
7
|
+
port.link.should be_nil
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '#set_link' do
|
12
|
+
it 'should set link to given link' do
|
13
|
+
in_port = InPort.new(:matching_class => OutPort)
|
14
|
+
out_port = OutPort.new(:matching_class => InPort)
|
15
|
+
link = Link.new :from => out_port, :to => in_port
|
16
|
+
in_port.set_link link
|
17
|
+
in_port.link.should eq(link)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#clear_link' do
|
22
|
+
it 'should set link to nil' do
|
23
|
+
in_port = InPort.new(:matching_class => OutPort)
|
24
|
+
out_port = OutPort.new(:matching_class => InPort)
|
25
|
+
link = Link.new :from => out_port, :to => in_port
|
26
|
+
in_port.set_link link
|
27
|
+
in_port.link.should eq(link)
|
28
|
+
in_port.clear_link
|
29
|
+
in_port.link.should be_nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#linked?' do
|
34
|
+
it 'should return false if port is not linked' do
|
35
|
+
in_port = InPort.new(:matching_class => OutPort)
|
36
|
+
in_port.linked?.should be_false
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should return true if port is linked' do
|
40
|
+
in_port = InPort.new(:matching_class => OutPort)
|
41
|
+
out_port = OutPort.new(:matching_class => InPort)
|
42
|
+
Link.new(:from => out_port, :to => in_port).activate
|
43
|
+
in_port.linked?.should be_true
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe SPNet::Link do
|
4
|
+
context '.new' do
|
5
|
+
it 'should contain the :to and :from given' do
|
6
|
+
out_port = SignalOutPort.new
|
7
|
+
in_port = SignalInPort.new
|
8
|
+
link = Link.new(:from => out_port,:to => in_port)
|
9
|
+
|
10
|
+
link.to.should eq(in_port)
|
11
|
+
link.from.should eq(out_port)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should raise ArgumentError if to port does not match from port' do
|
15
|
+
out_port = ParamOutPort.new
|
16
|
+
in_port = SignalInPort.new
|
17
|
+
lambda { Link.new(:from => out_port, :in => in_port) }.should raise_error(ArgumentError)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should not set to and from link to eachother' do
|
21
|
+
out_port = SignalOutPort.new
|
22
|
+
in_port = SignalInPort.new
|
23
|
+
link = Link.new(:from => out_port,:to => in_port)
|
24
|
+
link.to.link.should be_nil
|
25
|
+
link.from.link.should be_nil
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context '#activate' do
|
30
|
+
it 'should set.link to and from.link to self' do
|
31
|
+
out_port = SignalOutPort.new
|
32
|
+
in_port = SignalInPort.new
|
33
|
+
link = Link.new(:from => out_port,:to => in_port)
|
34
|
+
link.activate
|
35
|
+
link.to.link.should eq(link)
|
36
|
+
link.from.link.should eq(link)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context '#activate' do
|
41
|
+
it 'should set.link to and from.link to nil' do
|
42
|
+
out_port = SignalOutPort.new
|
43
|
+
in_port = SignalInPort.new
|
44
|
+
link = Link.new(:from => out_port,:to => in_port)
|
45
|
+
link.activate
|
46
|
+
link.deactivate
|
47
|
+
link.to.link.should eq(nil)
|
48
|
+
link.from.link.should eq(nil)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context '#active?' do
|
53
|
+
it 'should return true if activate has been called and deactivate has never been called' do
|
54
|
+
out_port = SignalOutPort.new
|
55
|
+
in_port = SignalInPort.new
|
56
|
+
link = Link.new(:from => out_port,:to => in_port)
|
57
|
+
link.activate
|
58
|
+
link.active?.should be_true
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'should return false if activate has never been called' do
|
62
|
+
out_port = SignalOutPort.new
|
63
|
+
in_port = SignalInPort.new
|
64
|
+
link = Link.new(:from => out_port,:to => in_port)
|
65
|
+
link.active?.should be_false
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should return false if activate been called but deactivate was called later' do
|
69
|
+
out_port = SignalOutPort.new
|
70
|
+
in_port = SignalInPort.new
|
71
|
+
link = Link.new(:from => out_port,:to => in_port)
|
72
|
+
link.activate
|
73
|
+
link.deactivate
|
74
|
+
link.active?.should be_false
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context '#export_state' do
|
79
|
+
before :all do
|
80
|
+
blocks = {
|
81
|
+
"A" => TestBlock.new(:sample_rate => 2),
|
82
|
+
"B" => TestBlock.new(:sample_rate => 2),
|
83
|
+
}
|
84
|
+
link = Link.new(:from => blocks["A"].out_ports["OUT"], :to => blocks["B"].in_ports["IN"])
|
85
|
+
link.activate
|
86
|
+
@state = link.export_state blocks
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'should make a LinkState object' do
|
90
|
+
@state.should be_a(LinkState)
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'should be from "A.OUT"' do
|
94
|
+
@state.from.block_name.should eq("A")
|
95
|
+
@state.from.port_name.should eq("OUT")
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'should be to "B.IN"' do
|
99
|
+
@state.to.block_name.should eq("B")
|
100
|
+
@state.to.port_name.should eq("IN")
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe SPNet::Network do
|
4
|
+
context '.new' do
|
5
|
+
before :all do
|
6
|
+
@sample_rate = 1.0
|
7
|
+
end
|
8
|
+
|
9
|
+
context 'no name, blocks, or links given' do
|
10
|
+
before :all do
|
11
|
+
@network = Network.new :sample_rate => @sample_rate
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should have empty name' do
|
15
|
+
@network.name.should be_empty
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should have no blocks' do
|
19
|
+
@network.blocks.should be_empty
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should have no links' do
|
23
|
+
@network.links.should be_empty
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should activate links' do
|
28
|
+
a = TestBlock.new(:sample_rate => @sample_rate)
|
29
|
+
b = TestBlock.new(:sample_rate => @sample_rate)
|
30
|
+
link = Link.new(:from => a.out_ports["OUT"], :to => b.in_ports["IN"])
|
31
|
+
network = Network.new(
|
32
|
+
:sample_rate => @sample_rate,
|
33
|
+
:blocks => { "A" => a, "B" => b },
|
34
|
+
:links => [ link ],
|
35
|
+
)
|
36
|
+
link.active?.should be_true
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe SPNet::OutPort do
|
4
|
+
describe '.new' do
|
5
|
+
it 'link should be nil' do
|
6
|
+
port = OutPort.new :matching_class => InPort
|
7
|
+
port.link.should be_nil
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '#set_link' do
|
12
|
+
it 'should set link to given link' do
|
13
|
+
in_port = InPort.new(:matching_class => OutPort)
|
14
|
+
out_port = OutPort.new(:matching_class => InPort)
|
15
|
+
link = Link.new :from => out_port, :to => in_port
|
16
|
+
out_port.set_link link
|
17
|
+
out_port.link.should eq(link)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#clear_link' do
|
22
|
+
it 'should set link to nil' do
|
23
|
+
in_port = InPort.new(:matching_class => OutPort)
|
24
|
+
out_port = OutPort.new(:matching_class => InPort)
|
25
|
+
link = Link.new :from => out_port, :to => in_port
|
26
|
+
out_port.set_link link
|
27
|
+
out_port.link.should eq(link)
|
28
|
+
out_port.clear_link
|
29
|
+
out_port.link.should be_nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#linked?' do
|
34
|
+
it 'should return false if port is not linked' do
|
35
|
+
out_port = OutPort.new(:matching_class => InPort)
|
36
|
+
out_port.linked?.should be_false
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should return true if port is linked' do
|
40
|
+
in_port = InPort.new(:matching_class => OutPort)
|
41
|
+
out_port = OutPort.new(:matching_class => InPort)
|
42
|
+
Link.new(:from => out_port, :to => in_port).activate
|
43
|
+
out_port.linked?.should be_true
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe SPNet::EnumLimiter do
|
4
|
+
describe '.new' do
|
5
|
+
it 'should raise ArgumentError if non-Enumerable is given' do
|
6
|
+
lambda { EnumLimiter.new(5) }.should raise_error(ArgumentError)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
describe '.apply_limit' do
|
11
|
+
it 'should return the given value if it is contained in @values' do
|
12
|
+
values = [1,3,5,7]
|
13
|
+
limiter = EnumLimiter.new values
|
14
|
+
values.each do |value|
|
15
|
+
limiter.apply_limit(value, 0).should eq(value)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should return the given current_value if the given value is not contained in @values' do
|
20
|
+
values = [1,3,5,7]
|
21
|
+
non_values = [2,4,6,8]
|
22
|
+
limiter = EnumLimiter.new values
|
23
|
+
non_values.each do |value|
|
24
|
+
limiter.apply_limit(value, 0).should eq(0)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe SPNet::LowerLimiter do
|
4
|
+
describe '.apply_limit' do
|
5
|
+
context 'non-inclusive' do
|
6
|
+
before :all do
|
7
|
+
@lower = 1
|
8
|
+
@limiter = LowerLimiter.new(@lower, false)
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should return the given value it it is above lower limit' do
|
12
|
+
ok_values = [@lower + Float::EPSILON, @lower * 2.0]
|
13
|
+
limited_values = ok_values.map { |value| @limiter.apply_limit value }
|
14
|
+
limited_values.should eq(ok_values)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should return the lower limit + Float::EPSILON if the given value is at or below the lower limit' do
|
18
|
+
bad_values = [@lower, @lower - Float::EPSILON, @lower / 2.0]
|
19
|
+
limited_values = bad_values.map { |value| @limiter.apply_limit value }
|
20
|
+
limited_values.each do |value|
|
21
|
+
value.should eq(@lower + Float::EPSILON)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'inclusive lower limit, non-inclusive upper limit' do
|
27
|
+
before :all do
|
28
|
+
@lower = 1
|
29
|
+
@limiter = LowerLimiter.new(@lower, true)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should return the given value it it is at or above the lower limit' do
|
33
|
+
ok_values = [@lower, @lower + Float::EPSILON, @lower * 2.0]
|
34
|
+
limited_values = ok_values.map { |value| @limiter.apply_limit value }
|
35
|
+
limited_values.should eq(ok_values)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should return the lower limit if the given value is below the lower limit' do
|
39
|
+
bad_values = [@lower - Float::EPSILON, @lower / 2.0]
|
40
|
+
limited_values = bad_values.map { |value| @limiter.apply_limit value }
|
41
|
+
limited_values.each do |value|
|
42
|
+
value.should eq(@lower)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe SPNet::NoLimiter do
|
4
|
+
describe '.new' do
|
5
|
+
it 'should always return the given value' do
|
6
|
+
limiter = NoLimiter.new
|
7
|
+
[-1, 1, Float::MAX, Float::MIN, "horse"].each do |value|
|
8
|
+
value.should eq(limiter.apply_limit(value))
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe SPNet::RangeLimiter do
|
4
|
+
describe '.apply_limit' do
|
5
|
+
context 'non-inclusive lower limit, non-inclusive upper limit' do
|
6
|
+
before :all do
|
7
|
+
@lower, @upper = 1, 3
|
8
|
+
@limiter = RangeLimiter.new(@lower, false, @upper, false)
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should return the given value it it is above lower limit and below upper limit' do
|
12
|
+
ok_values = [@lower + Float::EPSILON, (@lower + @upper) / 2.0, @upper - Float::EPSILON]
|
13
|
+
limited_values = ok_values.map { |value| @limiter.apply_limit value }
|
14
|
+
limited_values.should eq(ok_values)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should return the lower limit + Float::EPSILON if the given value is at or below the lower limit' do
|
18
|
+
bad_values = [@lower, @lower - Float::EPSILON, @lower - 1]
|
19
|
+
limited_values = bad_values.map { |value| @limiter.apply_limit value }
|
20
|
+
limited_values.each do |value|
|
21
|
+
value.should eq(@lower + Float::EPSILON)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should return the upper limit - Float::EPSILON if the given value is at or above the upper limit' do
|
26
|
+
bad_values = [@upper, @upper + Float::EPSILON, @upper + 1]
|
27
|
+
limited_values = bad_values.map { |value| @limiter.apply_limit value }
|
28
|
+
limited_values.each do |value|
|
29
|
+
value.should eq(@upper - Float::EPSILON)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'inclusive lower limit, non-inclusive upper limit' do
|
35
|
+
before :all do
|
36
|
+
@lower, @upper = 1, 3
|
37
|
+
@limiter = RangeLimiter.new(@lower, true, @upper, false)
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should return the given value it it is at or above the lower limit and below the upper limit' do
|
41
|
+
ok_values = [@lower, (@lower + @upper) / 2.0, @upper - Float::EPSILON]
|
42
|
+
limited_values = ok_values.map { |value| @limiter.apply_limit value }
|
43
|
+
limited_values.should eq(ok_values)
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'should return the lower limit if the given value is below the lower limit' do
|
47
|
+
bad_values = [@lower - Float::EPSILON, @lower - 1]
|
48
|
+
limited_values = bad_values.map { |value| @limiter.apply_limit value }
|
49
|
+
limited_values.each do |value|
|
50
|
+
value.should eq(@lower)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should return the upper limit - Float::EPSILON if the given value is at or above the upper limit' do
|
55
|
+
bad_values = [@upper, @upper + 1]
|
56
|
+
limited_values = bad_values.map { |value| @limiter.apply_limit value }
|
57
|
+
limited_values.each do |value|
|
58
|
+
value.should eq(@upper - Float::EPSILON)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context 'non-inclusive lower limit, inclusive upper limit' do
|
64
|
+
before :all do
|
65
|
+
@lower, @upper = 1, 3
|
66
|
+
@limiter = RangeLimiter.new(@lower, false, @upper, true)
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'should return the given value it it is above the lower limit and at or below the upper limit' do
|
70
|
+
ok_values = [@lower + Float::EPSILON, (@lower + @upper) / 2.0, @upper]
|
71
|
+
limited_values = ok_values.map { |value| @limiter.apply_limit value }
|
72
|
+
limited_values.should eq(ok_values)
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'should return the lower limit + Float::EPSILON if the given value is at or below the lower limit' do
|
76
|
+
bad_values = [@lower, @lower - Float::EPSILON, @lower - 1]
|
77
|
+
limited_values = bad_values.map { |value| @limiter.apply_limit value }
|
78
|
+
limited_values.each do |value|
|
79
|
+
value.should eq(@lower + Float::EPSILON)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'should return the upper limit if the given value is above the upper limit' do
|
84
|
+
bad_values = [@upper + Float::EPSILON, @upper + 1]
|
85
|
+
limited_values = bad_values.map { |value| @limiter.apply_limit value }
|
86
|
+
limited_values.each do |value|
|
87
|
+
value.should eq(@upper)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context 'inclusive lower limit, inclusive upper limit' do
|
93
|
+
before :all do
|
94
|
+
@lower, @upper = 1, 3
|
95
|
+
@limiter = RangeLimiter.new(@lower, true, @upper, true)
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'should return the given value it it is at or above the lower limit and at or below the upper limit' do
|
99
|
+
ok_values = [@lower, (@lower + @upper) / 2.0, @upper]
|
100
|
+
limited_values = ok_values.map { |value| @limiter.apply_limit value }
|
101
|
+
limited_values.should eq(ok_values)
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'should return the lower limit if the given value is below the lower limit' do
|
105
|
+
bad_values = [@lower - Float::EPSILON, @lower - 1]
|
106
|
+
limited_values = bad_values.map { |value| @limiter.apply_limit value }
|
107
|
+
limited_values.each do |value|
|
108
|
+
value.should eq(@lower)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'should return the upper limit if the given value is above the upper limit' do
|
113
|
+
bad_values = [@upper + Float::EPSILON, @upper + 1]
|
114
|
+
limited_values = bad_values.map { |value| @limiter.apply_limit value }
|
115
|
+
limited_values.each do |value|
|
116
|
+
value.should eq(@upper)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|