adhearsion 2.6.4 → 3.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (242) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +6 -9
  3. data/CHANGELOG.md +22 -7
  4. data/Gemfile +2 -0
  5. data/README.markdown +4 -5
  6. data/Rakefile +1 -2
  7. data/adhearsion.gemspec +19 -8
  8. data/features/cli_create.feature +19 -3
  9. data/features/step_definitions/cli_steps.rb +0 -11
  10. data/features/support/env.rb +3 -4
  11. data/lib/adhearsion.rb +48 -27
  12. data/lib/adhearsion/call.rb +34 -50
  13. data/lib/adhearsion/call_controller.rb +6 -12
  14. data/lib/adhearsion/call_controller/dial.rb +15 -53
  15. data/lib/adhearsion/call_controller/input.rb +39 -162
  16. data/lib/adhearsion/call_controller/input/ask_grammar_builder.rb +44 -0
  17. data/lib/adhearsion/call_controller/input/menu_builder.rb +136 -0
  18. data/lib/adhearsion/call_controller/input/prompt_builder.rb +78 -0
  19. data/lib/adhearsion/call_controller/input/result.rb +46 -0
  20. data/lib/adhearsion/call_controller/output.rb +48 -67
  21. data/lib/adhearsion/call_controller/output/abstract_player.rb +3 -3
  22. data/lib/adhearsion/call_controller/output/async_player.rb +3 -3
  23. data/lib/adhearsion/call_controller/output/player.rb +1 -1
  24. data/lib/adhearsion/call_controller/record.rb +23 -8
  25. data/lib/adhearsion/calls.rb +1 -1
  26. data/lib/adhearsion/cli_commands/ahn_command.rb +2 -65
  27. data/lib/adhearsion/cli_commands/thor_errors.rb +0 -6
  28. data/lib/adhearsion/configuration.rb +91 -39
  29. data/lib/adhearsion/core_ext/blather/stanza.rb +41 -0
  30. data/lib/adhearsion/core_ext/blather/stanza/presence.rb +13 -0
  31. data/lib/adhearsion/error.rb +5 -0
  32. data/lib/adhearsion/event.rb +21 -0
  33. data/lib/adhearsion/event/active_speaker.rb +11 -0
  34. data/lib/adhearsion/event/answered.rb +11 -0
  35. data/lib/adhearsion/event/asterisk.rb +10 -0
  36. data/lib/adhearsion/event/asterisk/ami.rb +34 -0
  37. data/lib/adhearsion/event/complete.rb +75 -0
  38. data/lib/adhearsion/event/dtmf.rb +11 -0
  39. data/lib/adhearsion/event/end.rb +22 -0
  40. data/lib/adhearsion/event/input_timers_started.rb +9 -0
  41. data/lib/adhearsion/event/joined.rb +17 -0
  42. data/lib/adhearsion/event/offer.rb +14 -0
  43. data/lib/adhearsion/event/ringing.rb +11 -0
  44. data/lib/adhearsion/event/started_speaking.rb +13 -0
  45. data/lib/adhearsion/event/stopped_speaking.rb +13 -0
  46. data/lib/adhearsion/event/unjoined.rb +17 -0
  47. data/lib/adhearsion/events.rb +47 -66
  48. data/lib/adhearsion/foundation.rb +0 -1
  49. data/lib/adhearsion/foundation/object.rb +0 -5
  50. data/lib/adhearsion/generators/app/app_generator.rb +4 -1
  51. data/lib/adhearsion/generators/app/templates/Gemfile.erb +2 -10
  52. data/lib/adhearsion/generators/app/templates/adhearsion.erb +9 -9
  53. data/lib/adhearsion/generators/app/templates/config.ru +7 -0
  54. data/lib/adhearsion/generators/app/templates/en.yml +4 -0
  55. data/lib/adhearsion/generators/app/templates/events.erb +2 -2
  56. data/lib/adhearsion/generators/app/templates/hello_world.wav +0 -0
  57. data/lib/adhearsion/generators/app/templates/simon_game.rb +2 -1
  58. data/lib/adhearsion/generators/app/templates/simon_game_spec.rb +2 -2
  59. data/lib/adhearsion/has_headers.rb +34 -0
  60. data/lib/adhearsion/http_server.rb +37 -0
  61. data/lib/adhearsion/initializer.rb +19 -153
  62. data/lib/adhearsion/logging.rb +6 -25
  63. data/lib/adhearsion/outbound_call.rb +5 -5
  64. data/lib/adhearsion/plugin.rb +1 -0
  65. data/lib/adhearsion/protocol_error.rb +26 -0
  66. data/lib/adhearsion/rayo.rb +30 -0
  67. data/lib/adhearsion/rayo/client.rb +62 -0
  68. data/lib/adhearsion/rayo/client/component_registry.rb +33 -0
  69. data/lib/adhearsion/rayo/command.rb +21 -0
  70. data/lib/adhearsion/rayo/command/accept.rb +16 -0
  71. data/lib/adhearsion/rayo/command/answer.rb +16 -0
  72. data/lib/adhearsion/rayo/command/dial.rb +57 -0
  73. data/lib/adhearsion/rayo/command/hangup.rb +16 -0
  74. data/lib/adhearsion/rayo/command/join.rb +43 -0
  75. data/lib/adhearsion/rayo/command/mute.rb +13 -0
  76. data/lib/adhearsion/rayo/command/redirect.rb +23 -0
  77. data/lib/adhearsion/rayo/command/reject.rb +40 -0
  78. data/lib/adhearsion/rayo/command/unjoin.rb +24 -0
  79. data/lib/adhearsion/rayo/command/unmute.rb +13 -0
  80. data/lib/adhearsion/rayo/command_node.rb +47 -0
  81. data/lib/adhearsion/rayo/component.rb +21 -0
  82. data/lib/adhearsion/rayo/component/asterisk.rb +13 -0
  83. data/lib/adhearsion/rayo/component/asterisk/agi.rb +14 -0
  84. data/lib/adhearsion/rayo/component/asterisk/agi/command.rb +46 -0
  85. data/lib/adhearsion/rayo/component/asterisk/ami.rb +14 -0
  86. data/lib/adhearsion/rayo/component/asterisk/ami/action.rb +61 -0
  87. data/lib/adhearsion/rayo/component/component_node.rb +90 -0
  88. data/lib/adhearsion/rayo/component/input.rb +186 -0
  89. data/lib/adhearsion/rayo/component/output.rb +471 -0
  90. data/lib/adhearsion/rayo/component/prompt.rb +53 -0
  91. data/lib/adhearsion/rayo/component/receive_fax.rb +26 -0
  92. data/lib/adhearsion/rayo/component/record.rb +165 -0
  93. data/lib/adhearsion/rayo/component/send_fax.rb +64 -0
  94. data/lib/adhearsion/rayo/component/stop.rb +11 -0
  95. data/lib/adhearsion/rayo/connection.rb +12 -0
  96. data/lib/adhearsion/rayo/connection/asterisk.rb +74 -0
  97. data/lib/adhearsion/rayo/connection/connected.rb +22 -0
  98. data/lib/adhearsion/rayo/connection/generic_connection.rb +22 -0
  99. data/lib/adhearsion/rayo/connection/xmpp.rb +198 -0
  100. data/lib/adhearsion/rayo/disconnected_error.rb +22 -0
  101. data/lib/adhearsion/{punchblock_plugin → rayo}/initializer.rb +19 -19
  102. data/lib/adhearsion/rayo/rayo_node.rb +127 -0
  103. data/lib/adhearsion/rayo/ref.rb +57 -0
  104. data/lib/adhearsion/statistics.rb +1 -1
  105. data/lib/adhearsion/tasks.rb +1 -2
  106. data/lib/adhearsion/tasks/configuration.rb +1 -1
  107. data/lib/adhearsion/tasks/environment.rb +0 -2
  108. data/lib/adhearsion/tasks/i18n.rb +49 -0
  109. data/lib/adhearsion/translator.rb +11 -0
  110. data/lib/adhearsion/translator/asterisk.rb +234 -0
  111. data/lib/adhearsion/translator/asterisk/agi_app.rb +17 -0
  112. data/lib/adhearsion/translator/asterisk/agi_command.rb +45 -0
  113. data/lib/adhearsion/translator/asterisk/ami_error_converter.rb +20 -0
  114. data/lib/adhearsion/translator/asterisk/call.rb +416 -0
  115. data/lib/adhearsion/translator/asterisk/channel.rb +43 -0
  116. data/lib/adhearsion/translator/asterisk/component.rb +88 -0
  117. data/lib/adhearsion/translator/asterisk/component/asterisk.rb +15 -0
  118. data/lib/adhearsion/translator/asterisk/component/asterisk/agi_command.rb +42 -0
  119. data/lib/adhearsion/translator/asterisk/component/asterisk/ami_action.rb +68 -0
  120. data/lib/adhearsion/translator/asterisk/component/composed_prompt.rb +76 -0
  121. data/lib/adhearsion/translator/asterisk/component/dtmf_recognizer.rb +137 -0
  122. data/lib/adhearsion/translator/asterisk/component/input.rb +34 -0
  123. data/lib/adhearsion/translator/asterisk/component/input_component.rb +90 -0
  124. data/lib/adhearsion/translator/asterisk/component/mrcp_native_prompt.rb +71 -0
  125. data/lib/adhearsion/translator/asterisk/component/mrcp_prompt.rb +55 -0
  126. data/lib/adhearsion/translator/asterisk/component/mrcp_recog_prompt.rb +165 -0
  127. data/lib/adhearsion/translator/asterisk/component/output.rb +233 -0
  128. data/lib/adhearsion/translator/asterisk/component/record.rb +101 -0
  129. data/lib/adhearsion/translator/asterisk/component/stop_by_redirect.rb +30 -0
  130. data/lib/adhearsion/translator/asterisk/unimrcp_app.rb +28 -0
  131. data/lib/adhearsion/uri_list.rb +21 -0
  132. data/lib/adhearsion/version.rb +1 -1
  133. data/spec/adhearsion/call_controller/dial_spec.rb +79 -1420
  134. data/spec/adhearsion/call_controller/input_spec.rb +1141 -237
  135. data/spec/adhearsion/call_controller/output/async_player_spec.rb +10 -10
  136. data/spec/adhearsion/call_controller/output/player_spec.rb +8 -8
  137. data/spec/adhearsion/call_controller/output_spec.rb +162 -215
  138. data/spec/adhearsion/call_controller/record_spec.rb +15 -16
  139. data/spec/adhearsion/call_controller_spec.rb +23 -40
  140. data/spec/adhearsion/call_spec.rb +123 -129
  141. data/spec/adhearsion/calls_spec.rb +3 -3
  142. data/spec/adhearsion/configuration_spec.rb +94 -108
  143. data/spec/adhearsion/event/answered_spec.rb +50 -0
  144. data/spec/adhearsion/event/asterisk/Find Results +402 -0
  145. data/spec/adhearsion/event/asterisk/ami_spec.rb +81 -0
  146. data/spec/adhearsion/event/complete_spec.rb +176 -0
  147. data/spec/adhearsion/event/dtmf_spec.rb +35 -0
  148. data/spec/adhearsion/event/end_spec.rb +85 -0
  149. data/spec/adhearsion/event/input_timers_started_spec.rb +19 -0
  150. data/spec/adhearsion/event/joined_spec.rb +53 -0
  151. data/spec/adhearsion/event/offer_spec.rb +106 -0
  152. data/spec/adhearsion/event/ringing_spec.rb +50 -0
  153. data/spec/adhearsion/event/started_speaking_spec.rb +37 -0
  154. data/spec/adhearsion/event/stopped_speaking_spec.rb +37 -0
  155. data/spec/adhearsion/event/unjoined_spec.rb +48 -0
  156. data/spec/adhearsion/event/untitled +0 -0
  157. data/spec/adhearsion/events_spec.rb +19 -45
  158. data/spec/adhearsion/initializer_spec.rb +12 -184
  159. data/spec/adhearsion/logging_spec.rb +5 -20
  160. data/spec/adhearsion/outbound_call_spec.rb +13 -13
  161. data/spec/adhearsion/plugin_spec.rb +3 -4
  162. data/spec/adhearsion/protocol_error_spec.rb +91 -0
  163. data/spec/adhearsion/rayo/client/component_registry_spec.rb +26 -0
  164. data/spec/adhearsion/rayo/client_spec.rb +134 -0
  165. data/spec/adhearsion/rayo/command/accept_spec.rb +63 -0
  166. data/spec/adhearsion/rayo/command/answer_spec.rb +73 -0
  167. data/spec/adhearsion/rayo/command/dial_spec.rb +156 -0
  168. data/spec/adhearsion/rayo/command/hangup_spec.rb +63 -0
  169. data/spec/adhearsion/rayo/command/join_spec.rb +158 -0
  170. data/spec/adhearsion/rayo/command/mute_spec.rb +32 -0
  171. data/spec/adhearsion/rayo/command/redirect_spec.rb +89 -0
  172. data/spec/adhearsion/rayo/command/reject_spec.rb +117 -0
  173. data/spec/adhearsion/rayo/command/unjoin_spec.rb +82 -0
  174. data/spec/adhearsion/rayo/command/unmute_spec.rb +32 -0
  175. data/spec/adhearsion/rayo/command_node_spec.rb +101 -0
  176. data/spec/adhearsion/rayo/component/asterisk/agi/command_spec.rb +111 -0
  177. data/spec/adhearsion/rayo/component/asterisk/ami/action_spec.rb +173 -0
  178. data/spec/adhearsion/rayo/component/component_node_spec.rb +110 -0
  179. data/spec/adhearsion/rayo/component/input_spec.rb +715 -0
  180. data/spec/adhearsion/rayo/component/output_spec.rb +1030 -0
  181. data/spec/adhearsion/rayo/component/prompt_spec.rb +171 -0
  182. data/spec/adhearsion/rayo/component/receive_fax_spec.rb +136 -0
  183. data/spec/adhearsion/rayo/component/record_spec.rb +497 -0
  184. data/spec/adhearsion/rayo/component/send_fax_spec.rb +144 -0
  185. data/spec/adhearsion/rayo/connection/asterisk_spec.rb +118 -0
  186. data/spec/adhearsion/rayo/connection/xmpp_spec.rb +449 -0
  187. data/spec/adhearsion/rayo/initializer_spec.rb +353 -0
  188. data/spec/adhearsion/rayo/ref_spec.rb +168 -0
  189. data/spec/adhearsion/rayo_spec.rb +7 -0
  190. data/spec/adhearsion/router/route_spec.rb +1 -1
  191. data/spec/adhearsion/statistics_spec.rb +2 -5
  192. data/spec/adhearsion/translator/asterisk/call_spec.rb +2047 -0
  193. data/spec/adhearsion/translator/asterisk/component/asterisk/agi_command_spec.rb +256 -0
  194. data/spec/adhearsion/translator/asterisk/component/asterisk/ami_action_spec.rb +151 -0
  195. data/spec/adhearsion/translator/asterisk/component/composed_prompt_spec.rb +257 -0
  196. data/spec/adhearsion/translator/asterisk/component/input_spec.rb +571 -0
  197. data/spec/adhearsion/translator/asterisk/component/mrcp_native_prompt_spec.rb +774 -0
  198. data/spec/adhearsion/translator/asterisk/component/mrcp_prompt_spec.rb +1244 -0
  199. data/spec/adhearsion/translator/asterisk/component/output_spec.rb +1850 -0
  200. data/spec/adhearsion/translator/asterisk/component/record_spec.rb +426 -0
  201. data/spec/adhearsion/translator/asterisk/component/stop_by_redirect_spec.rb +62 -0
  202. data/spec/adhearsion/translator/asterisk/component_spec.rb +83 -0
  203. data/spec/adhearsion/translator/asterisk_spec.rb +685 -0
  204. data/spec/adhearsion/uri_list_spec.rb +88 -0
  205. data/spec/adhearsion_spec.rb +89 -14
  206. data/spec/fixtures/locale/en.yml +13 -0
  207. data/spec/fixtures/locale/it.yml +13 -0
  208. data/spec/spec_helper.rb +18 -5
  209. data/spec/support/call_controller_test_helpers.rb +3 -2
  210. data/spec/support/initializer_stubs.rb +3 -1
  211. data/spec/support/punchblock_examples.rb +65 -0
  212. data/spec/support/punchblock_mocks.rb +12 -0
  213. metadata +412 -70
  214. data/features/cli_daemon.feature +0 -20
  215. data/features/cli_restart.feature +0 -52
  216. data/features/cli_stop.feature +0 -50
  217. data/lib/adhearsion/call_controller/menu_dsl.rb +0 -21
  218. data/lib/adhearsion/call_controller/menu_dsl/array_match_calculator.rb +0 -26
  219. data/lib/adhearsion/call_controller/menu_dsl/calculated_match.rb +0 -43
  220. data/lib/adhearsion/call_controller/menu_dsl/calculated_match_collection.rb +0 -45
  221. data/lib/adhearsion/call_controller/menu_dsl/fixnum_match_calculator.rb +0 -11
  222. data/lib/adhearsion/call_controller/menu_dsl/match_calculator.rb +0 -40
  223. data/lib/adhearsion/call_controller/menu_dsl/menu.rb +0 -207
  224. data/lib/adhearsion/call_controller/menu_dsl/menu_builder.rb +0 -92
  225. data/lib/adhearsion/call_controller/menu_dsl/range_match_calculator.rb +0 -60
  226. data/lib/adhearsion/call_controller/menu_dsl/string_match_calculator.rb +0 -25
  227. data/lib/adhearsion/call_controller/utility.rb +0 -77
  228. data/lib/adhearsion/foundation/custom_daemonizer.rb +0 -52
  229. data/lib/adhearsion/punchblock_plugin.rb +0 -63
  230. data/scripts/cloc-1.64.pl +0 -10483
  231. data/spec/adhearsion/call_controller/menu_dsl/array_match_calculator_spec.rb +0 -76
  232. data/spec/adhearsion/call_controller/menu_dsl/calculated_match_collection_spec.rb +0 -60
  233. data/spec/adhearsion/call_controller/menu_dsl/calculated_match_spec.rb +0 -61
  234. data/spec/adhearsion/call_controller/menu_dsl/fixnum_match_calculator_spec.rb +0 -39
  235. data/spec/adhearsion/call_controller/menu_dsl/match_calculator_spec.rb +0 -17
  236. data/spec/adhearsion/call_controller/menu_dsl/menu_builder_spec.rb +0 -165
  237. data/spec/adhearsion/call_controller/menu_dsl/menu_spec.rb +0 -420
  238. data/spec/adhearsion/call_controller/menu_dsl/range_match_calculator_spec.rb +0 -32
  239. data/spec/adhearsion/call_controller/menu_dsl/string_match_calculator_spec.rb +0 -40
  240. data/spec/adhearsion/call_controller/utility_spec.rb +0 -90
  241. data/spec/adhearsion/punchblock_plugin/initializer_spec.rb +0 -356
  242. data/spec/adhearsion/punchblock_plugin_spec.rb +0 -59
@@ -1,76 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- module Adhearsion
6
- class CallController
7
- module MenuDSL
8
- describe ArrayMatchCalculator do
9
-
10
- let(:match_payload) { :doesnt_matter }
11
-
12
- it "matching arrays with fixnums" do
13
- calculator = ArrayMatchCalculator.new [11,5,14,115], match_payload
14
- match_case = calculator.match '11'
15
- expect(match_case).to be_exact_match
16
- expect(match_case).to be_potential_match
17
- expect(match_case.exact_matches).to eq([11])
18
- expect(match_case.potential_matches).to eq([115])
19
- end
20
-
21
- it "matching arrays with strings with digits and special digits" do
22
- calculator = ArrayMatchCalculator.new %w[*57 4 *54 115 ###], match_payload
23
- match_case = calculator.match '*5'
24
- expect(match_case).not_to be_exact_match
25
- expect(match_case).to be_potential_match
26
- expect(match_case.potential_matches).to eq(%w[*57 *54])
27
-
28
- match_case = calculator.match '*57'
29
- expect(match_case).to be_exact_match
30
- expect(match_case).not_to be_potential_match
31
- expect(match_case.exact_matches).to eq(%w[*57])
32
- end
33
-
34
- it "matching an array with a combination of Fixnums and Strings" do
35
- calculator = ArrayMatchCalculator.new ['11',5,'14',115], match_payload
36
- match_case = calculator.match '11'
37
- expect(match_case).to be_exact_match
38
- expect(match_case).to be_potential_match
39
- expect(match_case.exact_matches).to eq(['11'])
40
- expect(match_case.potential_matches).to eq([115])
41
- end
42
-
43
- it "matching empty array should never match" do
44
- calculator = ArrayMatchCalculator.new [], match_payload
45
- match_case = calculator.match '98'
46
- expect(match_case).not_to be_exact_match
47
- expect(match_case).not_to be_potential_match
48
- expect(match_case.exact_matches).to eq([])
49
- expect(match_case.potential_matches).to eq([])
50
-
51
- match_case = calculator.match '*2'
52
- expect(match_case).not_to be_exact_match
53
- expect(match_case).not_to be_potential_match
54
- expect(match_case.exact_matches).to eq([])
55
- expect(match_case.potential_matches).to eq([])
56
- end
57
-
58
- it "matching array with nil should skip nil field" do
59
- pattern = [1,2,nil,5,10]
60
- calculator = ArrayMatchCalculator.new pattern, match_payload
61
- match_case = calculator.match '1'
62
- expect(match_case).to be_exact_match
63
- expect(match_case).to be_potential_match
64
- expect(match_case.exact_matches).to eq([1])
65
- expect(match_case.potential_matches).to eq([10])
66
-
67
- match_case = calculator.match '99'
68
- expect(match_case).not_to be_exact_match
69
- expect(match_case).not_to be_potential_match
70
-
71
- expect(pattern).to eq([1,2,nil,5,10])
72
- end
73
- end
74
- end
75
- end
76
- end
@@ -1,60 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- module Adhearsion
6
- class CallController
7
- module MenuDSL
8
- describe CalculatedMatchCollection do
9
- def mock_with_potential_matches(potential_matches)
10
- CalculatedMatch.new :potential_matches => potential_matches
11
- end
12
-
13
- def mock_with_exact_matches(exact_matches)
14
- CalculatedMatch.new :exact_matches => exact_matches
15
- end
16
-
17
- def mock_with_potential_and_exact_matches(potential_matches, exact_matches)
18
- CalculatedMatch.new :potential_matches => potential_matches,
19
- :exact_matches => exact_matches
20
- end
21
-
22
- it "the <<() method should collect the potential matches into the actual_potential_matches Array" do
23
- mock_matches_array_1 = [:foo, :bar, :qaz],
24
- mock_matches_array_2 = [10, 20, 30]
25
- mock_matches_1 = mock_with_potential_matches mock_matches_array_1
26
- mock_matches_2 = mock_with_potential_matches mock_matches_array_2
27
-
28
- subject << mock_matches_1
29
- expect(subject.actual_potential_matches).to eq(mock_matches_array_1)
30
-
31
- subject << mock_matches_2
32
- expect(subject.actual_potential_matches).to eq(mock_matches_array_1 + mock_matches_array_2)
33
- end
34
-
35
- it "the <<() method should collect the exact matches into the actual_exact_matches Array" do
36
- mock_matches_array_1 = [:blam, :blargh],
37
- mock_matches_array_2 = [5,4,3,2,1]
38
- mock_matches_1 = mock_with_exact_matches mock_matches_array_1
39
- mock_matches_2 = mock_with_exact_matches mock_matches_array_2
40
-
41
- subject << mock_matches_1
42
- expect(subject.actual_exact_matches).to eq(mock_matches_array_1)
43
-
44
- subject << mock_matches_2
45
- expect(subject.actual_exact_matches).to eq(mock_matches_array_1 + mock_matches_array_2)
46
- end
47
-
48
- it "if any exact matches exist, the exact_match?() method should return true" do
49
- subject << mock_with_exact_matches([1,2,3])
50
- expect(subject.exact_match?).to be true
51
- end
52
-
53
- it "if any potential matches exist, the potential_match?() method should return true" do
54
- subject << mock_with_potential_matches([1,2,3])
55
- expect(subject.potential_match?).to be true
56
- end
57
- end
58
- end
59
- end
60
- end
@@ -1,61 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- module Adhearsion
6
- class CallController
7
- module MenuDSL
8
- describe CalculatedMatch do
9
- it "should make accessible the context name" do
10
- expect(CalculatedMatch.new(:match_payload => :foobar).match_payload).to be :foobar
11
- end
12
-
13
- it "should make accessible the original pattern" do
14
- expect(CalculatedMatch.new(:pattern => :something).pattern).to be :something
15
- end
16
-
17
- it "should make accessible the matched query" do
18
- expect(CalculatedMatch.new(:query => 123).query).to be 123
19
- end
20
-
21
- it "#type_of_match should return :exact, :potential, or nil" do
22
- expect(CalculatedMatch.new(:potential_matches => [1]).type_of_match).to be :potential
23
- expect(CalculatedMatch.new(:exact_matches => [3,3]).type_of_match).to be :exact
24
- expect(CalculatedMatch.new(:exact_matches => [8,3], :potential_matches => [0,9]).type_of_match).to be :exact
25
- end
26
-
27
- it "#exact_match? should return true if the match was exact" do
28
- expect(CalculatedMatch.new(:exact_matches => [0,3,5]).exact_match?).to be true
29
- end
30
-
31
- it "#potential_match? should return true if the match was exact" do
32
- expect(CalculatedMatch.new(:potential_matches => [88,99,77]).potential_match?).to be true
33
- end
34
-
35
- it "#failed_match? should return false if the match was exact" do
36
- expect(CalculatedMatch.new(:potential_matches => [88,99,77]).failed_match?).to be false
37
- end
38
-
39
- it "#exact_matches should return an array of exact matches" do
40
- expect(CalculatedMatch.new(:exact_matches => [0,3,5]).exact_matches).to eq([0,3,5])
41
- end
42
-
43
- it "#potential_matches should return an array of potential matches" do
44
- expect(CalculatedMatch.new(:potential_matches => [88,99,77]).potential_matches).to eq([88,99,77])
45
- end
46
-
47
- it "::failed_match! should return a match that *really* failed" do
48
- failure = CalculatedMatch.failed_match! 10..20, 30, :match_payload_does_not_matter
49
- expect(failure.exact_match?).not_to be true
50
- expect(failure.potential_match?).not_to be true
51
- expect(failure.failed_match?).to be true
52
- expect(failure.type_of_match).to be nil
53
-
54
- expect(failure.match_payload).to be :match_payload_does_not_matter
55
- expect(failure.pattern).to eq(10..20)
56
- expect(failure.query).to eq(30)
57
- end
58
- end
59
- end
60
- end
61
- end
@@ -1,39 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- module Adhearsion
6
- class CallController
7
- module MenuDSL
8
- describe FixnumMatchCalculator do
9
- let(:match_payload) { :main }
10
-
11
- it "a potential match scenario" do
12
- calculator = FixnumMatchCalculator.new(444, match_payload)
13
- match = calculator.match '4'
14
- expect(match).to be_potential_match
15
- expect(match).not_to be_exact_match
16
- expect(match.potential_matches).to eq([444])
17
- end
18
-
19
- it "a multi-digit exact match scenario" do
20
- calculator = FixnumMatchCalculator.new(5555, match_payload)
21
- match = calculator.match '5555'
22
- expect(match).to be_exact_match
23
- end
24
-
25
- it "a single-digit exact match scenario" do
26
- calculator = FixnumMatchCalculator.new(1, match_payload)
27
- match = calculator.match '1'
28
- expect(match).to be_exact_match
29
- end
30
-
31
- it "the context name given to the calculator should be passed on the CalculatedMatch" do
32
- match_payload = :icanhascheezburger
33
- calculator = FixnumMatchCalculator.new(1337, match_payload)
34
- expect(calculator.match('1337').match_payload).to be match_payload
35
- end
36
- end
37
- end
38
- end
39
- end
@@ -1,17 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- module Adhearsion
6
- class CallController
7
- module MenuDSL
8
- describe MatchCalculator do
9
- describe ".build_with_pattern" do
10
- it "should return an appropriate subclass instance based on the pattern's class" do
11
- expect(MatchCalculator.build_with_pattern(1..2, :main)).to be_an_instance_of RangeMatchCalculator
12
- end
13
- end
14
- end
15
- end
16
- end
17
- end
@@ -1,165 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- module Adhearsion
6
- class CallController
7
- module MenuDSL
8
-
9
- describe MenuBuilder do
10
- subject { MenuDSL::MenuBuilder.new }
11
-
12
- describe "#build" do
13
- it "sets the context and instance_eval's the block" do
14
- expect(subject).to receive(:foo).with(:bar)
15
- subject.build do
16
- foo :bar
17
- end
18
- end
19
-
20
- let(:foo) { :bar }
21
-
22
- it "makes the block context available" do
23
- doo = nil
24
- subject.build do
25
- doo = foo
26
- end
27
- expect(doo).to eq(:bar)
28
- end
29
- end#build
30
-
31
- describe "#match" do
32
- let(:match_block) { Proc.new() {} }
33
-
34
- it "raises an exception if called without a CallController and no block" do
35
- expect { subject.match 1 }.to raise_error(ArgumentError)
36
- end
37
-
38
- it "raises an exception if given both a payload and a block" do
39
- expect { subject.match(1, Object) {} }.to raise_error(ArgumentError)
40
- end
41
-
42
- it "raises an exception if given no patterns" do
43
- expect { subject.match() {} }.to raise_error(ArgumentError, "You cannot call this method without patterns.")
44
- end
45
-
46
- it "creates a pattern based on a payload" do
47
- expect(MenuDSL::MatchCalculator).to receive(:build_with_pattern).with("1", Object)
48
- subject.match "1", Object
49
- end
50
-
51
- it "creates a pattern based on a block" do
52
- expect(MenuDSL::MatchCalculator).to receive(:build_with_pattern).with("1", nil, &match_block)
53
- subject.match("1", &match_block)
54
- end
55
-
56
- it "creates multiple patterns if multiple arguments are passed in" do
57
- expect(MenuDSL::MatchCalculator).to receive(:build_with_pattern).with(1, Object)
58
- expect(MenuDSL::MatchCalculator).to receive(:build_with_pattern).with(2, Object)
59
- subject.match(1, 2, Object)
60
- end
61
- end#match
62
-
63
- describe "#has_matchers?" do
64
- context "with no matchers specified" do
65
- describe '#has_matchers?' do
66
- it { expect(subject.has_matchers?).to be false }
67
- end
68
- end
69
-
70
- context "with at least one matcher specified" do
71
- before do
72
- subject.match(1) {}
73
- end
74
-
75
- describe '#has_matchers?' do
76
- it { expect(subject.has_matchers?).to be true }
77
- end
78
- end
79
- end
80
-
81
- describe "#weighted_match_calculators" do
82
- let(:expected_pattern) { MenuDSL::MatchCalculator.build_with_pattern("1", Object) }
83
-
84
- it "returns the generated patterns" do
85
- expect(MenuDSL::MatchCalculator).to receive(:build_with_pattern).with("1", Object).at_least(:once).and_return(expected_pattern)
86
- subject.match("1", Object)
87
- expect(subject.weighted_match_calculators).to eq([expected_pattern])
88
- end
89
- end#weighted_match_calculators
90
-
91
- describe "#invalid" do
92
- let(:callback) { Proc.new() {} }
93
-
94
- it "raises an error if not passed a block" do
95
- expect { subject.invalid }.to raise_error(LocalJumpError)
96
- end
97
-
98
- it "sets the invalid callback" do
99
- subject.invalid(&callback)
100
- expect(subject.menu_callbacks[:invalid]).to eq(callback)
101
- end
102
- end#invalid
103
-
104
- describe "#timeout" do
105
- let(:callback) { Proc.new() {} }
106
-
107
- it "raises an error if not passed a block" do
108
- expect { subject.timeout }.to raise_error(LocalJumpError)
109
- end
110
-
111
- it "sets the timeout callback" do
112
- subject.timeout(&callback)
113
- expect(subject.menu_callbacks[:timeout]).to eq(callback)
114
- end
115
- end#timeout
116
-
117
- describe "#failure" do
118
- let(:callback) { Proc.new() {} }
119
-
120
- it "raises an error if not passed a block" do
121
- expect { subject.failure }.to raise_error(LocalJumpError)
122
- end
123
-
124
- it "sets the failure callback" do
125
- subject.failure(&callback)
126
- expect(subject.menu_callbacks[:failure]).to eq(callback)
127
- end
128
- end#failure
129
-
130
- describe "#validator" do
131
- let(:callback) { Proc.new() {} }
132
-
133
- it "raises an error if not passed a block" do
134
- expect { subject.validator }.to raise_error(LocalJumpError)
135
- end
136
-
137
- it "sets the invalid callback" do
138
- subject.validator(&callback)
139
- expect(subject.menu_callbacks[:validator]).to eq(callback)
140
- end
141
- end#invalid
142
-
143
- describe "#execute_hook_for" do
144
- it "executes the correct hook" do
145
- bar = nil
146
- subject.invalid do |baz|
147
- bar = baz
148
- end
149
- subject.execute_hook_for(:invalid, "1")
150
- expect(bar).to eq("1")
151
- end
152
- end#execute_hook_for
153
-
154
- describe "#calculate_matches_for" do
155
- it "returns a calculated match collection" do
156
- subject.match("1", Object)
157
- expect(subject.calculate_matches_for("1")).to be_a CalculatedMatchCollection
158
- end
159
- end
160
-
161
- end# describe MenuBuilder
162
-
163
- end# module MenuDSL
164
- end
165
- end
@@ -1,420 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- module Adhearsion
6
- class CallController
7
- module MenuDSL
8
- describe Menu do
9
-
10
- let(:options) { Hash.new }
11
- subject { Menu.new(options) }
12
-
13
- describe "#initialize" do
14
- describe '#tries_count' do
15
- subject { super().tries_count }
16
- it { is_expected.to eq(0) }
17
- end
18
-
19
- context 'when no timeout is set' do
20
- it "should have the default timeout" do
21
- expect(subject.timeout).to eq(5)
22
- end
23
- end
24
-
25
- context 'when a timeout is set' do
26
- let(:options) {
27
- {:timeout => 20}
28
- }
29
-
30
- it 'should have the passed timeout' do
31
- expect(subject.timeout).to eq(20)
32
- end
33
- end
34
-
35
- context 'when no max number of tries is set' do
36
- it "should have the default max number of tries" do
37
- expect(subject.max_number_of_tries).to eq(1)
38
- end
39
- end
40
-
41
- context 'when a max number of tries is set' do
42
- let(:options) {
43
- {:tries => 3}
44
- }
45
-
46
- it 'should have the passed max number of tries' do
47
- expect(subject.max_number_of_tries).to eq(3)
48
- end
49
- end
50
-
51
- context 'when no terminator is set' do
52
- it "should have no terminator" do
53
- expect(subject.terminator).to eq('')
54
- end
55
-
56
- it 'should not validate successfully' do
57
- expect { subject.validate }.to raise_error(Menu::InvalidStructureError)
58
- end
59
- end
60
-
61
- context 'when a terminator is set' do
62
- let(:options) {
63
- {:terminator => 3}
64
- }
65
-
66
- it 'should have the passed terminator' do
67
- expect(subject.terminator).to eq('3')
68
- end
69
-
70
- it 'should validate(:basic) successfully' do
71
- expect(subject.validate(:basic)).to be true
72
- end
73
-
74
- it 'should not validate successfully' do
75
- expect { subject.validate }.to raise_error(Menu::InvalidStructureError)
76
- end
77
- end
78
-
79
- context 'when no limit is set' do
80
- it "should have no limit" do
81
- expect(subject.limit).to be nil
82
- end
83
-
84
- it 'should not validate successfully' do
85
- expect { subject.validate }.to raise_error(Menu::InvalidStructureError)
86
- end
87
- end
88
-
89
- context 'when a limit is set' do
90
- let(:options) {
91
- {:limit => 3}
92
- }
93
-
94
- it 'should have the passed limit' do
95
- expect(subject.limit).to eq(3)
96
- end
97
-
98
- it 'should validate(:basic) successfully' do
99
- expect(subject.validate(:basic)).to be true
100
- end
101
-
102
- it 'should not validate successfully' do
103
- expect { subject.validate }.to raise_error(Menu::InvalidStructureError)
104
- end
105
- end
106
-
107
- context 'when no interruptibility is set' do
108
- it "should be interruptible" do
109
- expect(subject.interruptible).to be true
110
- end
111
- end
112
-
113
- context 'when interruptible is set false' do
114
- let(:options) {
115
- {:interruptible => false}
116
- }
117
-
118
- it 'should be interruptible' do
119
- expect(subject.interruptible).to be false
120
- end
121
- end
122
-
123
- context 'when renderer is not specified' do
124
- it 'should have a nil renderer' do
125
- expect(subject.renderer).to be nil
126
- end
127
- end
128
-
129
- context 'when renderer is specified' do
130
- let(:options) {
131
- {:renderer => :native}
132
- }
133
-
134
- it 'should have the specified renderer' do
135
- expect(subject.renderer).to eq(:native)
136
- end
137
- end
138
-
139
- context 'when matchers are specified' do
140
- subject do
141
- Menu.new do
142
- match(1) { }
143
- end
144
- end
145
-
146
- it 'should validate successfully' do
147
- expect(subject.validate).to be true
148
- end
149
-
150
- it 'should not validate(:basic) successfully' do
151
- expect { subject.validate :basic }.to raise_error(Menu::InvalidStructureError)
152
- end
153
- end
154
-
155
- context 'menu builder setup' do
156
- describe '#builder' do
157
- subject { super().builder }
158
- it { is_expected.to be_a MenuBuilder }
159
- end
160
-
161
- it "should evaluate the block on the builder object" do
162
- mock_menu_builder = MenuBuilder.new
163
- expect(MenuBuilder).to receive(:new).and_return(mock_menu_builder)
164
- expect(mock_menu_builder).to receive(:match).once.with(1)
165
- Menu.new { match 1 }
166
- end
167
- end
168
-
169
- end # describe #initialize
170
-
171
- describe "#digit_buffer" do
172
- describe '#digit_buffer' do
173
- subject { super().digit_buffer }
174
- it { is_expected.to be_a Menu::ClearableStringBuffer }
175
- end
176
-
177
- describe '#digit_buffer' do
178
- subject { super().digit_buffer }
179
- it { is_expected.to eq("") }
180
- end
181
- end
182
-
183
- describe "#<<" do
184
- it "should add a digit to the buffer" do
185
- subject << 'a'
186
- expect(subject.digit_buffer).to eq('a')
187
- expect(subject.result).to eq('a')
188
- end
189
- end
190
-
191
- describe "#digit_buffer_empty?" do
192
- it "returns true if buffer is empty" do
193
- expect(subject.digit_buffer_empty?).to eq(true)
194
- end
195
-
196
- it "returns false if buffer is not empty" do
197
- subject << 1
198
- expect(subject.digit_buffer_empty?).to eq(false)
199
- end
200
- end
201
-
202
- describe "#digit_buffer_string" do
203
- it "returns the digit buffer as a string" do
204
- subject << 1
205
- expect(subject.digit_buffer_string).to eq("1")
206
- end
207
- end
208
-
209
- describe "#should_continue?" do
210
- it "returns true if the number of tries is less than the maximum" do
211
- expect(subject.max_number_of_tries).to eq(1)
212
- expect(subject.tries_count).to eq(0)
213
- expect(subject.should_continue?).to eq(true)
214
- end
215
- end
216
-
217
- describe "#restart!" do
218
- it "increments tries and clears the digit buffer" do
219
- subject << 1
220
- subject.restart!
221
- expect(subject.tries_count).to eq(1)
222
- expect(subject.digit_buffer_empty?).to eq(true)
223
- end
224
- end
225
-
226
- describe "#execute_invalid_hook" do
227
- it "calls the builder's execute_hook_for with :invalid" do
228
- mock_menu_builder = MenuBuilder.new
229
- expect(MenuBuilder).to receive(:new).and_return(mock_menu_builder)
230
- expect(mock_menu_builder).to receive(:execute_hook_for).with(:invalid, "")
231
- menu_instance = Menu.new
232
- menu_instance.execute_invalid_hook
233
- end
234
- end
235
-
236
- describe "#execute_timeout_hook" do
237
- it "calls the builder's execute_hook_for with :timeout" do
238
- mock_menu_builder = MenuBuilder.new
239
- expect(MenuBuilder).to receive(:new).and_return(mock_menu_builder)
240
- expect(mock_menu_builder).to receive(:execute_hook_for).with(:timeout, "")
241
- menu_instance = Menu.new
242
- menu_instance.execute_timeout_hook
243
- end
244
- end
245
-
246
- describe "#execute_failure_hook" do
247
- it "calls the builder's execute_hook_for with :failure" do
248
- mock_menu_builder = MenuBuilder.new
249
- expect(MenuBuilder).to receive(:new).and_return(mock_menu_builder)
250
- expect(mock_menu_builder).to receive(:execute_hook_for).with(:failure, "")
251
- menu_instance = Menu.new
252
- menu_instance.execute_failure_hook
253
- end
254
- end
255
-
256
- describe "#execute_validator_hook" do
257
- it "calls the builder's execute_hook_for with :validator" do
258
- mock_menu_builder = MenuBuilder.new
259
- expect(MenuBuilder).to receive(:new).and_return(mock_menu_builder)
260
- expect(mock_menu_builder).to receive(:execute_hook_for).with(:validator, "")
261
- menu_instance = Menu.new
262
- menu_instance.execute_validator_hook
263
- end
264
- end
265
-
266
- describe "#continue" do
267
- class MockControllerA; end
268
- class MockControllerB; end
269
- class MockControllerC; end
270
- let(:options) { {} }
271
- let(:menu_instance) {
272
- Menu.new options do
273
- match 1, MockControllerA
274
- match 21, MockControllerA
275
- match 23, MockControllerA
276
- match 3, MockControllerB
277
- match 3..5, MockControllerC
278
- match 33, MockControllerA
279
- match 6, MockControllerC
280
- match 6..8, MockControllerA
281
- end
282
- }
283
-
284
- it "returns a MenuGetAnotherDigitOrTimeout if the digit buffer is empty" do
285
- expect(subject.continue).to be_a Menu::MenuGetAnotherDigitOrTimeout
286
- expect(menu_instance.status).to be nil
287
- end
288
-
289
- it "asks for another digit if it has potential matches" do
290
- menu_instance << 2
291
- expect(menu_instance.continue).to be_a Menu::MenuGetAnotherDigitOrTimeout
292
- expect(menu_instance.status).to eq(:potential)
293
- end
294
-
295
- it "returns a MenuResultInvalid if there are no matches" do
296
- menu_instance << 9
297
- expect(menu_instance.continue).to be_a Menu::MenuResultInvalid
298
- expect(menu_instance.status).to eq(:invalid)
299
- end
300
-
301
- it "returns the first exact match when it has exact and potentials" do
302
- menu_instance << 3
303
- menu_result = menu_instance.continue
304
- expect(menu_result).to be_a Menu::MenuGetAnotherDigitOrFinish
305
- expect(menu_result.match_object).to eq(MockControllerB)
306
- expect(menu_result.new_extension).to eq("3")
307
- expect(menu_instance.status).to eq(:multi_matched)
308
- end
309
-
310
- it "returns a MenuResultFound if it has exact matches" do
311
- menu_instance << 6
312
- menu_result = menu_instance.continue
313
- expect(menu_result).to be_a Menu::MenuResultFound
314
- expect(menu_instance.status).to eq(:matched)
315
- end
316
-
317
- it "returns the first exact match when it has only exact matches" do
318
- menu_instance << 6
319
- menu_result = menu_instance.continue
320
- expect(menu_result).to be_a Menu::MenuResultFound
321
- expect(menu_result.match_object.match_payload).to eq(MockControllerC)
322
- expect(menu_result.match_object.pattern.to_s).to eq("6")
323
- end
324
-
325
- context "with no matchers" do
326
- let(:menu_instance) { Menu.new options }
327
-
328
- context "when a terminator digit is set" do
329
- let(:options) { { :terminator => '#' } }
330
-
331
- it "buffers until the terminator is issued then returns a MenuTerminated and sets the status to :terminated, removing the terminator from the buffer" do
332
- menu_instance << 2
333
- menu_instance << 4
334
- expect(menu_instance.continue).to be_a Menu::MenuGetAnotherDigitOrTimeout
335
- expect(menu_instance.status).to eq(:potential)
336
- menu_instance << '#'
337
- expect(menu_instance.continue).to be_a Menu::MenuTerminated
338
- expect(menu_instance.continue).to be_a Menu::MenuResultDone
339
- expect(menu_instance.status).to eq(:terminated)
340
- expect(menu_instance.result).to eq('24')
341
- end
342
- end
343
-
344
- context "when a digit limit is set" do
345
- let(:options) { { :limit => 3 } }
346
-
347
- it "buffers until the limit is reached, then returns MenuLimitReached and sets the status to :limited" do
348
- menu_instance << 2
349
- menu_instance << 4
350
- expect(menu_instance.continue).to be_a Menu::MenuGetAnotherDigitOrTimeout
351
- expect(menu_instance.status).to eq(:potential)
352
- menu_instance << 2
353
- expect(menu_instance.continue).to be_a Menu::MenuLimitReached
354
- expect(menu_instance.continue).to be_a Menu::MenuResultDone
355
- expect(menu_instance.status).to eq(:limited)
356
- expect(menu_instance.result).to eq('242')
357
- end
358
- end
359
-
360
- context "when a validator is defined" do
361
- let(:menu_instance) do
362
- Menu.new options do
363
- validator { |buffer| buffer == "242" }
364
- end
365
- end
366
-
367
- it "buffers until the validator returns true, then returns MenuValidatorTerminated and sets the status to :validator_terminated" do
368
- menu_instance << 2
369
- menu_instance << 4
370
- expect(menu_instance.continue).to be_a Menu::MenuGetAnotherDigitOrTimeout
371
- expect(menu_instance.status).to eq(:potential)
372
- menu_instance << 2
373
- expect(menu_instance.continue).to be_a Menu::MenuValidatorTerminated
374
- expect(menu_instance.continue).to be_a Menu::MenuResultDone
375
- expect(menu_instance.status).to eq(:validator_terminated)
376
- expect(menu_instance.result).to eq('242')
377
- end
378
- end
379
-
380
- context "when a digit limit and validator is defined" do
381
- let(:menu_instance) do
382
- Menu.new options.merge(:limit => 3) do
383
- validator { |buffer| buffer == "242" }
384
- end
385
- end
386
-
387
- it "applies the validator before checking the digit limit" do
388
- menu_instance << 2
389
- menu_instance << 4
390
- menu_instance << 2
391
- expect(menu_instance.continue).to be_a Menu::MenuValidatorTerminated
392
- expect(menu_instance.continue).to be_a Menu::MenuResultDone
393
- expect(menu_instance.status).to eq(:validator_terminated)
394
- expect(menu_instance.result).to eq('242')
395
- end
396
- end
397
- end
398
-
399
- end#continue
400
-
401
- describe Menu::ClearableStringBuffer do
402
- subject { Menu::ClearableStringBuffer.new }
403
-
404
- it "adds a string to itself" do
405
- subject << 'b'
406
- subject << 'c'
407
- expect(subject).to eq('bc')
408
- end
409
-
410
- it "clears itself" do
411
- subject << 'a'
412
- subject.clear!
413
- expect(subject).to eq("")
414
- end
415
- end
416
-
417
- end # describe Menu
418
- end
419
- end
420
- end