adhearsion 2.0.0.beta1 → 2.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +2 -4
- data/CHANGELOG.md +34 -4
- data/README.markdown +2 -1
- data/Rakefile +22 -1
- data/adhearsion.gemspec +1 -0
- data/bin/ahn +0 -2
- data/features/cli_daemon.feature +2 -0
- data/features/cli_restart.feature +19 -0
- data/features/cli_start.feature +4 -6
- data/features/cli_stop.feature +3 -0
- data/features/step_definitions/app_generator_steps.rb +2 -0
- data/features/step_definitions/cli_steps.rb +2 -0
- data/features/support/aruba_helper.rb +2 -0
- data/features/support/env.rb +8 -46
- data/features/support/utils.rb +2 -0
- data/lib/adhearsion.rb +4 -6
- data/lib/adhearsion/call.rb +71 -17
- data/lib/adhearsion/call_controller.rb +25 -14
- data/lib/adhearsion/call_controller/dial.rb +34 -15
- data/lib/adhearsion/call_controller/input.rb +186 -144
- data/lib/adhearsion/call_controller/output.rb +10 -6
- data/lib/adhearsion/call_controller/record.rb +11 -13
- data/lib/adhearsion/call_controller/utility.rb +2 -0
- data/lib/adhearsion/calls.rb +4 -2
- data/lib/adhearsion/cli.rb +4 -0
- data/lib/adhearsion/cli_commands.rb +8 -2
- data/lib/adhearsion/configuration.rb +7 -3
- data/lib/adhearsion/console.rb +17 -17
- data/lib/adhearsion/events.rb +10 -4
- data/lib/adhearsion/foundation.rb +9 -0
- data/lib/adhearsion/foundation/custom_daemonizer.rb +3 -1
- data/lib/adhearsion/foundation/exception_handler.rb +2 -0
- data/lib/adhearsion/foundation/libc.rb +2 -0
- data/lib/adhearsion/foundation/object.rb +3 -0
- data/lib/adhearsion/foundation/thread_safety.rb +5 -11
- data/lib/adhearsion/generators.rb +2 -0
- data/lib/adhearsion/generators/app/app_generator.rb +2 -0
- data/lib/adhearsion/generators/app/templates/README.md +9 -0
- data/lib/adhearsion/generators/app/templates/config/adhearsion.rb +38 -16
- data/lib/adhearsion/generators/app/templates/config/environment.rb +2 -0
- data/lib/adhearsion/generators/app/templates/lib/simon_game.rb +5 -3
- data/lib/adhearsion/generators/controller/controller_generator.rb +2 -0
- data/lib/adhearsion/generators/controller/templates/lib/controller.rb +2 -0
- data/lib/adhearsion/generators/controller/templates/spec/controller_spec.rb +2 -0
- data/lib/adhearsion/generators/generator.rb +3 -1
- data/lib/adhearsion/generators/plugin/plugin_generator.rb +2 -0
- data/lib/adhearsion/initializer.rb +31 -17
- data/lib/adhearsion/linux_proc_name.rb +2 -0
- data/lib/adhearsion/logging.rb +5 -3
- data/lib/adhearsion/menu_dsl.rb +2 -0
- data/lib/adhearsion/menu_dsl/calculated_match.rb +2 -0
- data/lib/adhearsion/menu_dsl/calculated_match_collection.rb +2 -0
- data/lib/adhearsion/menu_dsl/fixnum_match_calculator.rb +2 -0
- data/lib/adhearsion/menu_dsl/match_calculator.rb +2 -0
- data/lib/adhearsion/menu_dsl/menu.rb +58 -4
- data/lib/adhearsion/menu_dsl/menu_builder.rb +14 -1
- data/lib/adhearsion/menu_dsl/range_match_calculator.rb +4 -1
- data/lib/adhearsion/menu_dsl/string_match_calculator.rb +2 -0
- data/lib/adhearsion/outbound_call.rb +2 -0
- data/lib/adhearsion/plugin.rb +9 -7
- data/lib/adhearsion/plugin/collection.rb +3 -1
- data/lib/adhearsion/plugin/initializer.rb +3 -1
- data/lib/adhearsion/process.rb +8 -2
- data/lib/adhearsion/punchblock_plugin.rb +3 -1
- data/lib/adhearsion/punchblock_plugin/initializer.rb +34 -11
- data/lib/adhearsion/router.rb +4 -2
- data/lib/adhearsion/router/route.rb +2 -0
- data/lib/adhearsion/script_ahn_loader.rb +2 -0
- data/lib/adhearsion/tasks.rb +2 -0
- data/lib/adhearsion/tasks/configuration.rb +2 -0
- data/lib/adhearsion/tasks/debugging.rb +8 -0
- data/lib/adhearsion/tasks/environment.rb +2 -0
- data/lib/adhearsion/tasks/plugins.rb +2 -0
- data/lib/adhearsion/tasks/testing.rb +2 -0
- data/lib/adhearsion/version.rb +3 -1
- data/pre-commit +2 -0
- data/spec/adhearsion/call_controller/dial_spec.rb +114 -25
- data/spec/adhearsion/call_controller/input_spec.rb +192 -169
- data/spec/adhearsion/call_controller/output_spec.rb +26 -12
- data/spec/adhearsion/call_controller/record_spec.rb +29 -77
- data/spec/adhearsion/call_controller/utility_spec.rb +69 -0
- data/spec/adhearsion/call_controller_spec.rb +90 -15
- data/spec/adhearsion/call_spec.rb +92 -24
- data/spec/adhearsion/calls_spec.rb +9 -7
- data/spec/adhearsion/configuration_spec.rb +58 -56
- data/spec/adhearsion/console_spec.rb +4 -2
- data/spec/adhearsion/events_spec.rb +9 -7
- data/spec/adhearsion/generators_spec.rb +3 -1
- data/spec/adhearsion/initializer_spec.rb +16 -14
- data/spec/adhearsion/logging_spec.rb +11 -9
- data/spec/adhearsion/menu_dsl/calculated_match_collection_spec.rb +6 -4
- data/spec/adhearsion/menu_dsl/calculated_match_spec.rb +6 -4
- data/spec/adhearsion/menu_dsl/fixnum_match_calculator_spec.rb +3 -1
- data/spec/adhearsion/menu_dsl/match_calculator_spec.rb +2 -0
- data/spec/adhearsion/menu_dsl/menu_builder_spec.rb +42 -11
- data/spec/adhearsion/menu_dsl/menu_spec.rb +197 -36
- data/spec/adhearsion/menu_dsl/range_match_calculator_spec.rb +4 -2
- data/spec/adhearsion/menu_dsl/string_match_calculator_spec.rb +5 -3
- data/spec/adhearsion/outbound_call_spec.rb +7 -5
- data/spec/adhearsion/plugin_spec.rb +19 -15
- data/spec/adhearsion/process_spec.rb +12 -7
- data/spec/adhearsion/punchblock_plugin/initializer_spec.rb +35 -15
- data/spec/adhearsion/punchblock_plugin_spec.rb +4 -1
- data/spec/adhearsion/router/route_spec.rb +8 -6
- data/spec/adhearsion/router_spec.rb +12 -10
- data/spec/adhearsion_spec.rb +13 -2
- data/spec/capture_warnings.rb +33 -0
- data/spec/spec_helper.rb +4 -0
- data/spec/support/call_controller_test_helpers.rb +2 -4
- data/spec/support/initializer_stubs.rb +8 -5
- data/spec/support/logging_helpers.rb +2 -0
- data/spec/support/punchblock_mocks.rb +2 -0
- metadata +84 -71
- data/EVENTS +0 -11
- data/lib/adhearsion/call_controller/menu.rb +0 -124
- data/lib/adhearsion/foundation/all.rb +0 -8
- data/spec/adhearsion/call_controller/menu_spec.rb +0 -120
- data/spec/adhearsion/menu_dsl_spec.rb +0 -12
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Adhearsion::Logging do
|
@@ -26,7 +28,7 @@ describe Adhearsion::Logging do
|
|
26
28
|
end
|
27
29
|
|
28
30
|
it 'should create the predefined set of log levels' do
|
29
|
-
::Logging::LEVELS.keys.should == Adhearsion::Logging::LOG_LEVELS.map(&:downcase)
|
31
|
+
::Logging::LEVELS.keys.should be == Adhearsion::Logging::LOG_LEVELS.map(&:downcase)
|
30
32
|
end
|
31
33
|
|
32
34
|
it "should log to the Object logger when given arguments" do
|
@@ -93,9 +95,9 @@ describe Adhearsion::Logging do
|
|
93
95
|
Adhearsion.config.platform.logging['level'] = :warn
|
94
96
|
Adhearsion::Logging.level = :warn
|
95
97
|
Adhearsion::Logging.toggle_trace!
|
96
|
-
Adhearsion::Logging.level.should == 0
|
98
|
+
Adhearsion::Logging.level.should be == 0
|
97
99
|
Adhearsion::Logging.toggle_trace!
|
98
|
-
Adhearsion::Logging.level.should == 3
|
100
|
+
Adhearsion::Logging.level.should be == 3
|
99
101
|
Adhearsion.config.platform.logging['level'] = orig_level
|
100
102
|
end
|
101
103
|
|
@@ -106,18 +108,18 @@ describe Adhearsion::Logging do
|
|
106
108
|
|
107
109
|
it 'changing the logging level should affect all loggers' do
|
108
110
|
loggers = [::Foo.logger, ::Foo::Bar.logger]
|
109
|
-
loggers.map(&:level).should_not == [Adhearsion::Logging::DEBUG] * 2
|
110
|
-
loggers.map(&:level).should == [Adhearsion::Logging::INFO] * 2
|
111
|
+
loggers.map(&:level).should_not be == [Adhearsion::Logging::DEBUG] * 2
|
112
|
+
loggers.map(&:level).should be == [Adhearsion::Logging::INFO] * 2
|
111
113
|
Adhearsion::Logging.logging_level = :warn
|
112
|
-
loggers.map(&:level).should == [Adhearsion::Logging::WARN] * 2
|
114
|
+
loggers.map(&:level).should be == [Adhearsion::Logging::WARN] * 2
|
113
115
|
end
|
114
116
|
|
115
117
|
it 'changing the logging level, using level=, should affect all loggers' do
|
116
118
|
loggers = [Foo.logger, ::Foo::Bar.logger]
|
117
|
-
loggers.map(&:level).should_not == [::Logging::LEVELS["debug"]] * 2
|
118
|
-
loggers.map(&:level).should == [::Logging::LEVELS["info"]] * 2
|
119
|
+
loggers.map(&:level).should_not be == [::Logging::LEVELS["debug"]] * 2
|
120
|
+
loggers.map(&:level).should be == [::Logging::LEVELS["info"]] * 2
|
119
121
|
Adhearsion::Logging.level = :warn
|
120
|
-
loggers.map(&:level).should == [::Logging::LEVELS["warn"]] * 2
|
122
|
+
loggers.map(&:level).should be == [::Logging::LEVELS["warn"]] * 2
|
121
123
|
end
|
122
124
|
|
123
125
|
it 'should change all the Logger instance level' do
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
module Adhearsion
|
@@ -23,10 +25,10 @@ module Adhearsion
|
|
23
25
|
mock_matches_2 = mock_with_potential_matches mock_matches_array_2
|
24
26
|
|
25
27
|
subject << mock_matches_1
|
26
|
-
subject.actual_potential_matches.should == mock_matches_array_1
|
28
|
+
subject.actual_potential_matches.should be == mock_matches_array_1
|
27
29
|
|
28
30
|
subject << mock_matches_2
|
29
|
-
subject.actual_potential_matches.should == mock_matches_array_1 + mock_matches_array_2
|
31
|
+
subject.actual_potential_matches.should be == mock_matches_array_1 + mock_matches_array_2
|
30
32
|
end
|
31
33
|
|
32
34
|
it "the <<() method should collect the exact matches into the actual_exact_matches Array" do
|
@@ -36,10 +38,10 @@ module Adhearsion
|
|
36
38
|
mock_matches_2 = mock_with_exact_matches mock_matches_array_2
|
37
39
|
|
38
40
|
subject << mock_matches_1
|
39
|
-
subject.actual_exact_matches.should == mock_matches_array_1
|
41
|
+
subject.actual_exact_matches.should be == mock_matches_array_1
|
40
42
|
|
41
43
|
subject << mock_matches_2
|
42
|
-
subject.actual_exact_matches.should == mock_matches_array_1 + mock_matches_array_2
|
44
|
+
subject.actual_exact_matches.should be == mock_matches_array_1 + mock_matches_array_2
|
43
45
|
end
|
44
46
|
|
45
47
|
it "if any exact matches exist, the exact_match?() method should return true" do
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
module Adhearsion
|
@@ -34,11 +36,11 @@ module Adhearsion
|
|
34
36
|
end
|
35
37
|
|
36
38
|
it "#exact_matches should return an array of exact matches" do
|
37
|
-
CalculatedMatch.new(:exact_matches => [0,3,5]).exact_matches.should == [0,3,5]
|
39
|
+
CalculatedMatch.new(:exact_matches => [0,3,5]).exact_matches.should be == [0,3,5]
|
38
40
|
end
|
39
41
|
|
40
42
|
it "#potential_matches should return an array of potential matches" do
|
41
|
-
CalculatedMatch.new(:potential_matches => [88,99,77]).potential_matches.should == [88,99,77]
|
43
|
+
CalculatedMatch.new(:potential_matches => [88,99,77]).potential_matches.should be == [88,99,77]
|
42
44
|
end
|
43
45
|
|
44
46
|
it "::failed_match! should return a match that *really* failed" do
|
@@ -49,8 +51,8 @@ module Adhearsion
|
|
49
51
|
failure.type_of_match.should be nil
|
50
52
|
|
51
53
|
failure.match_payload.should be :match_payload_does_not_matter
|
52
|
-
failure.pattern.should == (10..20)
|
53
|
-
failure.query.should == 30
|
54
|
+
failure.pattern.should be == (10..20)
|
55
|
+
failure.query.should be == 30
|
54
56
|
end
|
55
57
|
end
|
56
58
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
module Adhearsion
|
@@ -10,7 +12,7 @@ module Adhearsion
|
|
10
12
|
match = calculator.match 4
|
11
13
|
match.potential_match?.should be true
|
12
14
|
match.exact_match?.should_not be true
|
13
|
-
match.potential_matches.should == [444]
|
15
|
+
match.potential_matches.should be == [444]
|
14
16
|
end
|
15
17
|
|
16
18
|
it "a multi-digit exact match scenario" do
|
@@ -1,10 +1,12 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
module Adhearsion
|
4
6
|
module MenuDSL
|
5
7
|
|
6
8
|
describe MenuBuilder do
|
7
|
-
subject{ MenuDSL::MenuBuilder.new }
|
9
|
+
subject{ MenuDSL::MenuBuilder.new }
|
8
10
|
|
9
11
|
describe "#build" do
|
10
12
|
it "sets the context and instance_eval's the block" do
|
@@ -17,12 +19,13 @@ module Adhearsion
|
|
17
19
|
|
18
20
|
describe "#match" do
|
19
21
|
let(:match_block) { Proc.new() {} }
|
22
|
+
|
20
23
|
it "raises an exception if called without a CallController and no block" do
|
21
24
|
expect { subject.match 1 }.to raise_error(ArgumentError)
|
22
25
|
end
|
23
26
|
|
24
27
|
it "raises an exception if given both a payload and a block" do
|
25
|
-
expect { subject.match(1, Object) {} }.to raise_error(ArgumentError)
|
28
|
+
expect { subject.match(1, Object) {} }.to raise_error(ArgumentError)
|
26
29
|
end
|
27
30
|
|
28
31
|
it "raises an exception if given no patterns" do
|
@@ -38,6 +41,7 @@ module Adhearsion
|
|
38
41
|
flexmock(MenuDSL::MatchCalculator).should_receive(:build_with_pattern).with("1", nil, match_block)
|
39
42
|
subject.match("1", &match_block)
|
40
43
|
end
|
44
|
+
|
41
45
|
it "creates multiple patterns if multiple arguments are passed in" do
|
42
46
|
flexmock(MenuDSL::MatchCalculator).should_receive(:build_with_pattern).with(1, Object)
|
43
47
|
flexmock(MenuDSL::MatchCalculator).should_receive(:build_with_pattern).with(2, Object)
|
@@ -45,13 +49,27 @@ module Adhearsion
|
|
45
49
|
end
|
46
50
|
end#match
|
47
51
|
|
52
|
+
describe "#has_matchers?" do
|
53
|
+
context "with no matchers specified" do
|
54
|
+
its(:has_matchers?) { should be false }
|
55
|
+
end
|
56
|
+
|
57
|
+
context "with at least one matcher specified" do
|
58
|
+
before do
|
59
|
+
subject.match(1) {}
|
60
|
+
end
|
61
|
+
|
62
|
+
its(:has_matchers?) { should be true }
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
48
66
|
describe "#weighted_match_calculators" do
|
49
67
|
let(:expected_pattern) { MenuDSL::MatchCalculator.build_with_pattern("1", Object) }
|
50
|
-
|
68
|
+
|
51
69
|
it "returns the generated patterns" do
|
52
70
|
flexmock(MenuDSL::MatchCalculator).should_receive(:build_with_pattern).with("1", Object).and_return(expected_pattern)
|
53
71
|
subject.match("1", Object)
|
54
|
-
subject.weighted_match_calculators.should == [expected_pattern]
|
72
|
+
subject.weighted_match_calculators.should be == [expected_pattern]
|
55
73
|
end
|
56
74
|
end#weighted_match_calculators
|
57
75
|
|
@@ -59,12 +77,12 @@ module Adhearsion
|
|
59
77
|
let(:callback) { Proc.new() {} }
|
60
78
|
|
61
79
|
it "raises an error if not passed a block" do
|
62
|
-
expect { subject.invalid }.to raise_error(LocalJumpError)
|
80
|
+
expect { subject.invalid }.to raise_error(LocalJumpError)
|
63
81
|
end
|
64
82
|
|
65
83
|
it "sets the invalid callback" do
|
66
84
|
subject.invalid(&callback)
|
67
|
-
subject.menu_callbacks[:invalid].should == callback
|
85
|
+
subject.menu_callbacks[:invalid].should be == callback
|
68
86
|
end
|
69
87
|
end#invalid
|
70
88
|
|
@@ -72,12 +90,12 @@ module Adhearsion
|
|
72
90
|
let(:callback) { Proc.new() {} }
|
73
91
|
|
74
92
|
it "raises an error if not passed a block" do
|
75
|
-
expect { subject.timeout }.to raise_error(LocalJumpError)
|
93
|
+
expect { subject.timeout }.to raise_error(LocalJumpError)
|
76
94
|
end
|
77
95
|
|
78
96
|
it "sets the timeout callback" do
|
79
97
|
subject.timeout(&callback)
|
80
|
-
subject.menu_callbacks[:timeout].should == callback
|
98
|
+
subject.menu_callbacks[:timeout].should be == callback
|
81
99
|
end
|
82
100
|
end#timeout
|
83
101
|
|
@@ -85,15 +103,28 @@ module Adhearsion
|
|
85
103
|
let(:callback) { Proc.new() {} }
|
86
104
|
|
87
105
|
it "raises an error if not passed a block" do
|
88
|
-
expect { subject.failure }.to raise_error(LocalJumpError)
|
106
|
+
expect { subject.failure }.to raise_error(LocalJumpError)
|
89
107
|
end
|
90
108
|
|
91
109
|
it "sets the failure callback" do
|
92
110
|
subject.failure(&callback)
|
93
|
-
subject.menu_callbacks[:failure].should == callback
|
111
|
+
subject.menu_callbacks[:failure].should be == callback
|
94
112
|
end
|
95
113
|
end#failure
|
96
114
|
|
115
|
+
describe "#validator" do
|
116
|
+
let(:callback) { Proc.new() {} }
|
117
|
+
|
118
|
+
it "raises an error if not passed a block" do
|
119
|
+
expect { subject.validator }.to raise_error(LocalJumpError)
|
120
|
+
end
|
121
|
+
|
122
|
+
it "sets the invalid callback" do
|
123
|
+
subject.validator(&callback)
|
124
|
+
subject.menu_callbacks[:validator].should be == callback
|
125
|
+
end
|
126
|
+
end#invalid
|
127
|
+
|
97
128
|
describe "#execute_hook_for" do
|
98
129
|
it "executes the correct hook" do
|
99
130
|
bar = nil
|
@@ -101,7 +132,7 @@ module Adhearsion
|
|
101
132
|
bar = baz
|
102
133
|
end
|
103
134
|
subject.execute_hook_for(:invalid, "1")
|
104
|
-
bar.should == "1"
|
135
|
+
bar.should be == "1"
|
105
136
|
end
|
106
137
|
end#execute_hook_for
|
107
138
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
module Adhearsion
|
@@ -5,38 +7,128 @@ module Adhearsion
|
|
5
7
|
describe Menu do
|
6
8
|
|
7
9
|
let(:options) { Hash.new }
|
8
|
-
subject { Menu.new(options)
|
10
|
+
subject { Menu.new(options) }
|
9
11
|
|
10
12
|
describe "#initialize" do
|
11
|
-
|
12
|
-
its(:tries_count) { should == 0 }
|
13
|
-
|
13
|
+
its(:tries_count) { should be == 0 }
|
14
14
|
|
15
15
|
context 'when no timeout is set' do
|
16
16
|
it "should have the default timeout" do
|
17
|
-
subject.timeout.should == 5
|
17
|
+
subject.timeout.should be == 5
|
18
18
|
end
|
19
19
|
end
|
20
|
+
|
20
21
|
context 'when a timeout is set' do
|
21
22
|
let(:options) {
|
22
23
|
{:timeout => 20}
|
23
24
|
}
|
25
|
+
|
24
26
|
it 'should have the passed timeout' do
|
25
|
-
subject.timeout.should == 20
|
27
|
+
subject.timeout.should be == 20
|
26
28
|
end
|
27
29
|
end
|
28
30
|
|
29
31
|
context 'when no max number of tries is set' do
|
30
32
|
it "should have the default max number of tries" do
|
31
|
-
subject.max_number_of_tries.should == 1
|
33
|
+
subject.max_number_of_tries.should be == 1
|
32
34
|
end
|
33
35
|
end
|
36
|
+
|
34
37
|
context 'when a max number of tries is set' do
|
35
38
|
let(:options) {
|
36
39
|
{:tries => 3}
|
37
40
|
}
|
41
|
+
|
38
42
|
it 'should have the passed max number of tries' do
|
39
|
-
subject.max_number_of_tries.should == 3
|
43
|
+
subject.max_number_of_tries.should be == 3
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'when no terminator is set' do
|
48
|
+
it "should have no terminator" do
|
49
|
+
subject.terminator.should be == ''
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should not validate successfully' do
|
53
|
+
lambda { subject.validate }.should raise_error(Menu::InvalidStructureError)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'when a terminator is set' do
|
58
|
+
let(:options) {
|
59
|
+
{:terminator => 3}
|
60
|
+
}
|
61
|
+
|
62
|
+
it 'should have the passed terminator' do
|
63
|
+
subject.terminator.should be == '3'
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should validate(:basic) successfully' do
|
67
|
+
subject.validate(:basic).should be true
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should not validate successfully' do
|
71
|
+
lambda { subject.validate }.should raise_error(Menu::InvalidStructureError)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'when no limit is set' do
|
76
|
+
it "should have no limit" do
|
77
|
+
subject.limit.should be nil
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'should not validate successfully' do
|
81
|
+
lambda { subject.validate }.should raise_error(Menu::InvalidStructureError)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
context 'when a limit is set' do
|
86
|
+
let(:options) {
|
87
|
+
{:limit => 3}
|
88
|
+
}
|
89
|
+
|
90
|
+
it 'should have the passed limit' do
|
91
|
+
subject.limit.should be == 3
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'should validate(:basic) successfully' do
|
95
|
+
subject.validate(:basic).should be true
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'should not validate successfully' do
|
99
|
+
lambda { subject.validate }.should raise_error(Menu::InvalidStructureError)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
context 'when no interruptibility is set' do
|
104
|
+
it "should be interruptible" do
|
105
|
+
subject.interruptible.should be true
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
context 'when interruptible is set false' do
|
110
|
+
let(:options) {
|
111
|
+
{:interruptible => false}
|
112
|
+
}
|
113
|
+
|
114
|
+
it 'should be interruptible' do
|
115
|
+
subject.interruptible.should be false
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
context 'when matchers are specified' do
|
120
|
+
subject do
|
121
|
+
Menu.new do
|
122
|
+
match(1) { }
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'should validate successfully' do
|
127
|
+
subject.validate.should be true
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'should not validate(:basic) successfully' do
|
131
|
+
lambda { subject.validate :basic }.should raise_error(Menu::InvalidStructureError)
|
40
132
|
end
|
41
133
|
end
|
42
134
|
|
@@ -47,7 +139,7 @@ module Adhearsion
|
|
47
139
|
mock_menu_builder = flexmock(MenuBuilder.new)
|
48
140
|
flexmock(MenuBuilder).should_receive(:new).and_return(mock_menu_builder)
|
49
141
|
mock_menu_builder.should_receive(:match).once.with(1)
|
50
|
-
Menu.new {match 1}
|
142
|
+
Menu.new { match 1 }
|
51
143
|
end
|
52
144
|
end
|
53
145
|
|
@@ -55,38 +147,40 @@ module Adhearsion
|
|
55
147
|
|
56
148
|
describe "#digit_buffer" do
|
57
149
|
its(:digit_buffer) { should be_a Menu::ClearableStringBuffer }
|
58
|
-
its(:digit_buffer) { should == "" }
|
150
|
+
its(:digit_buffer) { should be == "" }
|
59
151
|
end
|
60
152
|
|
61
153
|
describe "#<<" do
|
62
154
|
it "should add a digit to the buffer" do
|
63
155
|
subject << 'a'
|
64
|
-
subject.digit_buffer.should == 'a'
|
156
|
+
subject.digit_buffer.should be == 'a'
|
157
|
+
subject.result.should be == 'a'
|
65
158
|
end
|
66
159
|
end
|
67
160
|
|
68
161
|
describe "#digit_buffer_empty?" do
|
69
162
|
it "returns true if buffer is empty" do
|
70
|
-
subject.digit_buffer_empty?.should == true
|
163
|
+
subject.digit_buffer_empty?.should be == true
|
71
164
|
end
|
165
|
+
|
72
166
|
it "returns false if buffer is not empty" do
|
73
167
|
subject << 1
|
74
|
-
subject.digit_buffer_empty?.should == false
|
168
|
+
subject.digit_buffer_empty?.should be == false
|
75
169
|
end
|
76
170
|
end
|
77
171
|
|
78
172
|
describe "#digit_buffer_string" do
|
79
173
|
it "returns the digit buffer as a string" do
|
80
174
|
subject << 1
|
81
|
-
subject.digit_buffer_string.should == "1"
|
175
|
+
subject.digit_buffer_string.should be == "1"
|
82
176
|
end
|
83
177
|
end
|
84
178
|
|
85
179
|
describe "#should_continue?" do
|
86
180
|
it "returns true if the number of tries is less than the maximum" do
|
87
|
-
subject.max_number_of_tries.should == 1
|
88
|
-
subject.tries_count.should == 0
|
89
|
-
subject.should_continue?.should == true
|
181
|
+
subject.max_number_of_tries.should be == 1
|
182
|
+
subject.tries_count.should be == 0
|
183
|
+
subject.should_continue?.should be == true
|
90
184
|
end
|
91
185
|
end
|
92
186
|
|
@@ -94,8 +188,8 @@ module Adhearsion
|
|
94
188
|
it "increments tries and clears the digit buffer" do
|
95
189
|
subject << 1
|
96
190
|
subject.restart!
|
97
|
-
subject.tries_count.should == 1
|
98
|
-
subject.digit_buffer_empty?.should == true
|
191
|
+
subject.tries_count.should be == 1
|
192
|
+
subject.digit_buffer_empty?.should be == true
|
99
193
|
end
|
100
194
|
end
|
101
195
|
|
@@ -104,7 +198,7 @@ module Adhearsion
|
|
104
198
|
mock_menu_builder = flexmock(MenuBuilder.new)
|
105
199
|
flexmock(MenuBuilder).should_receive(:new).and_return(mock_menu_builder)
|
106
200
|
mock_menu_builder.should_receive(:execute_hook_for).with(:invalid, "")
|
107
|
-
menu_instance = Menu.new
|
201
|
+
menu_instance = Menu.new
|
108
202
|
menu_instance.execute_invalid_hook
|
109
203
|
end
|
110
204
|
end
|
@@ -114,7 +208,7 @@ module Adhearsion
|
|
114
208
|
mock_menu_builder = flexmock(MenuBuilder.new)
|
115
209
|
flexmock(MenuBuilder).should_receive(:new).and_return(mock_menu_builder)
|
116
210
|
mock_menu_builder.should_receive(:execute_hook_for).with(:timeout, "")
|
117
|
-
menu_instance = Menu.new
|
211
|
+
menu_instance = Menu.new
|
118
212
|
menu_instance.execute_timeout_hook
|
119
213
|
end
|
120
214
|
end
|
@@ -124,17 +218,28 @@ module Adhearsion
|
|
124
218
|
mock_menu_builder = flexmock(MenuBuilder.new)
|
125
219
|
flexmock(MenuBuilder).should_receive(:new).and_return(mock_menu_builder)
|
126
220
|
mock_menu_builder.should_receive(:execute_hook_for).with(:failure, "")
|
127
|
-
menu_instance = Menu.new
|
221
|
+
menu_instance = Menu.new
|
128
222
|
menu_instance.execute_failure_hook
|
129
223
|
end
|
130
224
|
end
|
131
225
|
|
226
|
+
describe "#execute_validator_hook" do
|
227
|
+
it "calls the builder's execute_hook_for with :validator" do
|
228
|
+
mock_menu_builder = flexmock(MenuBuilder.new)
|
229
|
+
flexmock(MenuBuilder).should_receive(:new).and_return(mock_menu_builder)
|
230
|
+
mock_menu_builder.should_receive(:execute_hook_for).with(:validator, "")
|
231
|
+
menu_instance = Menu.new
|
232
|
+
menu_instance.execute_validator_hook
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
132
236
|
describe "#continue" do
|
133
237
|
class MockControllerA; end
|
134
238
|
class MockControllerB; end
|
135
239
|
class MockControllerC; end
|
240
|
+
let(:options) { {} }
|
136
241
|
let(:menu_instance) {
|
137
|
-
Menu.new do
|
242
|
+
Menu.new options do
|
138
243
|
match 1, MockControllerA
|
139
244
|
match 21, MockControllerA
|
140
245
|
match 23, MockControllerA
|
@@ -145,46 +250,102 @@ module Adhearsion
|
|
145
250
|
match 6..8, MockControllerA
|
146
251
|
end
|
147
252
|
}
|
253
|
+
|
148
254
|
it "returns a MenuGetAnotherDigitOrTimeout if the digit buffer is empty" do
|
149
255
|
subject.continue.should be_a Menu::MenuGetAnotherDigitOrTimeout
|
256
|
+
menu_instance.status.should be nil
|
150
257
|
end
|
151
258
|
|
152
259
|
it "asks for another digit if it has potential matches" do
|
153
260
|
menu_instance << 2
|
154
|
-
menu_instance.continue.should be_a Menu::MenuGetAnotherDigitOrTimeout
|
261
|
+
menu_instance.continue.should be_a Menu::MenuGetAnotherDigitOrTimeout
|
262
|
+
menu_instance.status.should be == :potential
|
155
263
|
end
|
156
264
|
|
157
265
|
it "returns a MenuResultInvalid if there are no matches" do
|
158
266
|
menu_instance << 9
|
159
267
|
menu_instance.continue.should be_a Menu::MenuResultInvalid
|
160
|
-
|
161
|
-
|
162
|
-
it "returns a MenuGetAnotherDigitOrFinish if it has exact and potential matches" do
|
163
|
-
menu_instance << 3
|
164
|
-
menu_result = menu_instance.continue
|
165
|
-
menu_result.should be_a Menu::MenuGetAnotherDigitOrFinish
|
268
|
+
menu_instance.status.should be == :invalid
|
166
269
|
end
|
167
270
|
|
168
271
|
it "returns the first exact match when it has exact and potentials" do
|
169
272
|
menu_instance << 3
|
170
273
|
menu_result = menu_instance.continue
|
171
274
|
menu_result.should be_a Menu::MenuGetAnotherDigitOrFinish
|
172
|
-
menu_result.match_object.should == MockControllerB
|
173
|
-
menu_result.new_extension.should == "3"
|
275
|
+
menu_result.match_object.should be == MockControllerB
|
276
|
+
menu_result.new_extension.should be == "3"
|
277
|
+
menu_instance.status.should be == :multi_matched
|
174
278
|
end
|
175
279
|
|
176
280
|
it "returns a MenuResultFound if it has exact matches" do
|
177
281
|
menu_instance << 6
|
178
282
|
menu_result = menu_instance.continue
|
179
283
|
menu_result.should be_a Menu::MenuResultFound
|
284
|
+
menu_instance.status.should be == :matched
|
180
285
|
end
|
181
286
|
|
182
287
|
it "returns the first exact match when it has only exact matches" do
|
183
288
|
menu_instance << 6
|
184
289
|
menu_result = menu_instance.continue
|
185
290
|
menu_result.should be_a Menu::MenuResultFound
|
186
|
-
menu_result.match_object.match_payload.should == MockControllerC
|
187
|
-
menu_result.match_object.pattern.to_s.should == "6"
|
291
|
+
menu_result.match_object.match_payload.should be == MockControllerC
|
292
|
+
menu_result.match_object.pattern.to_s.should be == "6"
|
293
|
+
end
|
294
|
+
|
295
|
+
context "with no matchers" do
|
296
|
+
let(:menu_instance) { Menu.new options }
|
297
|
+
|
298
|
+
context "when a terminator digit is set" do
|
299
|
+
let(:options) { { :terminator => '#' } }
|
300
|
+
|
301
|
+
it "buffers until the terminator is issued then returns a MenuTerminated and sets the status to :terminated, removing the terminator from the buffer" do
|
302
|
+
menu_instance << 2
|
303
|
+
menu_instance << 4
|
304
|
+
menu_instance.continue.should be_a Menu::MenuGetAnotherDigitOrTimeout
|
305
|
+
menu_instance.status.should be == :potential
|
306
|
+
menu_instance << '#'
|
307
|
+
menu_instance.continue.should be_a Menu::MenuTerminated
|
308
|
+
menu_instance.continue.should be_a Menu::MenuResultDone
|
309
|
+
menu_instance.status.should be == :terminated
|
310
|
+
menu_instance.result.should be == '24'
|
311
|
+
end
|
312
|
+
end
|
313
|
+
|
314
|
+
context "when a digit limit is set" do
|
315
|
+
let(:options) { { :limit => 3 } }
|
316
|
+
|
317
|
+
it "buffers until the limit is reached, then returns MenuLimitReached and sets the status to :limited" do
|
318
|
+
menu_instance << 2
|
319
|
+
menu_instance << 4
|
320
|
+
menu_instance.continue.should be_a Menu::MenuGetAnotherDigitOrTimeout
|
321
|
+
menu_instance.status.should be == :potential
|
322
|
+
menu_instance << 2
|
323
|
+
menu_instance.continue.should be_a Menu::MenuLimitReached
|
324
|
+
menu_instance.continue.should be_a Menu::MenuResultDone
|
325
|
+
menu_instance.status.should be == :limited
|
326
|
+
menu_instance.result.should be == '242'
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
context "when a validator is defined" do
|
331
|
+
let(:menu_instance) do
|
332
|
+
Menu.new options do
|
333
|
+
validator { |buffer| buffer == "242" }
|
334
|
+
end
|
335
|
+
end
|
336
|
+
|
337
|
+
it "buffers until the validator returns true, then returns MenuValidatorTerminated and sets the status to :validator_terminated" do
|
338
|
+
menu_instance << 2
|
339
|
+
menu_instance << 4
|
340
|
+
menu_instance.continue.should be_a Menu::MenuGetAnotherDigitOrTimeout
|
341
|
+
menu_instance.status.should be == :potential
|
342
|
+
menu_instance << 2
|
343
|
+
menu_instance.continue.should be_a Menu::MenuValidatorTerminated
|
344
|
+
menu_instance.continue.should be_a Menu::MenuResultDone
|
345
|
+
menu_instance.status.should be == :validator_terminated
|
346
|
+
menu_instance.result.should be == '242'
|
347
|
+
end
|
348
|
+
end
|
188
349
|
end
|
189
350
|
|
190
351
|
end#continue
|
@@ -195,13 +356,13 @@ module Adhearsion
|
|
195
356
|
it "adds a string to itself" do
|
196
357
|
subject << 'b'
|
197
358
|
subject << 'c'
|
198
|
-
subject.should == 'bc'
|
359
|
+
subject.should be == 'bc'
|
199
360
|
end
|
200
361
|
|
201
362
|
it "clears itself" do
|
202
363
|
subject << 'a'
|
203
364
|
subject.clear!
|
204
|
-
subject.should == ""
|
365
|
+
subject.should be == ""
|
205
366
|
end
|
206
367
|
end
|
207
368
|
|