roby 0.8.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (644) hide show
  1. checksums.yaml +7 -0
  2. data/.deep-cover.rb +3 -0
  3. data/.gitattributes +1 -0
  4. data/.gitignore +24 -0
  5. data/.simplecov +10 -0
  6. data/.travis.yml +17 -0
  7. data/.yardopts +4 -0
  8. data/Gemfile +15 -0
  9. data/README.md +11 -0
  10. data/Rakefile +47 -177
  11. data/benchmark/{alloc_misc.rb → attic/alloc_misc.rb} +2 -2
  12. data/benchmark/{discovery_latency.rb → attic/discovery_latency.rb} +19 -19
  13. data/benchmark/{garbage_collection.rb → attic/garbage_collection.rb} +9 -9
  14. data/benchmark/{genom.rb → attic/genom.rb} +0 -0
  15. data/benchmark/attic/transactions.rb +62 -0
  16. data/benchmark/plan_basic_operations.rb +28 -0
  17. data/benchmark/relations/graph.rb +63 -0
  18. data/benchmark/ruby/identity.rb +18 -0
  19. data/benchmark/ruby/set_intersect_vs_hash_merge.rb +39 -0
  20. data/benchmark/ruby/yield_vs_block.rb +35 -0
  21. data/benchmark/run +5 -0
  22. data/benchmark/synthetic_plan_modifications_with_transactions.rb +79 -0
  23. data/benchmark/transactions.rb +99 -51
  24. data/bin/roby +38 -197
  25. data/bin/roby-display +14 -0
  26. data/bin/roby-log +3 -176
  27. data/doc/guide/{src → attic}/abstraction/achieve_with.page +1 -1
  28. data/doc/guide/{src → attic}/abstraction/forwarding.page +1 -1
  29. data/doc/guide/{src → attic}/abstraction/hierarchy.page +1 -1
  30. data/doc/guide/{src → attic}/abstraction/index.page +1 -1
  31. data/doc/guide/{src → attic}/abstraction/task_models.page +1 -1
  32. data/doc/guide/{overview.rdoc → attic/cycle/api_overview.rdoc} +6 -1
  33. data/doc/guide/{src → attic}/cycle/cycle-overview.png +0 -0
  34. data/doc/guide/{src → attic}/cycle/cycle-overview.svg +0 -0
  35. data/doc/guide/attic/cycle/error_handling.page +98 -0
  36. data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.png +0 -0
  37. data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.svg +0 -0
  38. data/doc/guide/{src/cycle/error_handling.page → attic/cycle/error_sources.page} +46 -89
  39. data/doc/guide/{src → attic}/cycle/garbage_collection.page +1 -1
  40. data/doc/guide/{src → attic}/cycle/index.page +1 -1
  41. data/doc/guide/{src → attic}/cycle/propagation.page +11 -1
  42. data/doc/guide/{src → attic}/cycle/propagation_diamond.png +0 -0
  43. data/doc/guide/{src → attic}/cycle/propagation_diamond.svg +0 -0
  44. data/doc/guide/attic/plans/building_plans.page +89 -0
  45. data/doc/guide/attic/plans/code.page +192 -0
  46. data/doc/guide/{src/basics → attic/plans}/events.page +3 -4
  47. data/doc/guide/attic/plans/index.page +7 -0
  48. data/doc/guide/{plan_modifications.rdoc → attic/plans/plan_modifications.rdoc} +5 -3
  49. data/doc/guide/{src/basics → attic/plans}/plan_objects.page +2 -1
  50. data/doc/guide/attic/plans/querying_plans.page +5 -0
  51. data/doc/guide/{src/basics → attic/plans}/tasks.page +20 -20
  52. data/doc/guide/config.yaml +7 -4
  53. data/doc/guide/ext/extended_menu.rb +29 -0
  54. data/doc/guide/ext/init.rb +6 -0
  55. data/doc/guide/ext/rdoc_links.rb +7 -6
  56. data/doc/guide/src/advanced_concepts/history.page +5 -0
  57. data/doc/guide/src/advanced_concepts/index.page +11 -0
  58. data/doc/guide/src/advanced_concepts/recognizing_patterns.page +83 -0
  59. data/doc/guide/src/advanced_concepts/scheduling.page +87 -0
  60. data/doc/guide/src/advanced_concepts/transactions.page +5 -0
  61. data/doc/guide/src/advanced_concepts/unreachability.page +42 -0
  62. data/doc/guide/src/base.template +96 -0
  63. data/doc/guide/src/basics_shell_header.txt +5 -7
  64. data/doc/guide/src/building/action_coordination.page +96 -0
  65. data/doc/guide/src/building/actions.page +124 -0
  66. data/doc/guide/src/building/file_layout.page +71 -0
  67. data/doc/guide/src/building/index.page +50 -0
  68. data/doc/guide/src/building/patterns.page +86 -0
  69. data/doc/guide/src/building/patterns_forwarding.png +0 -0
  70. data/doc/guide/src/building/patterns_forwarding.svg +277 -0
  71. data/doc/guide/src/building/runtime.page +95 -0
  72. data/doc/guide/src/building/task_models.page +94 -0
  73. data/doc/guide/src/building/tasks.page +284 -0
  74. data/doc/guide/src/concepts/error_handling.page +100 -0
  75. data/doc/guide/src/concepts/exception_propagation.png +0 -0
  76. data/doc/guide/src/concepts/exception_propagation.svg +445 -0
  77. data/doc/guide/src/concepts/execution.page +85 -0
  78. data/doc/guide/src/concepts/execution.png +0 -0
  79. data/doc/guide/src/concepts/execution.svg +573 -0
  80. data/doc/guide/src/concepts/execution_cycle.png +0 -0
  81. data/doc/guide/src/concepts/garbage_collection.page +57 -0
  82. data/doc/guide/src/concepts/index.page +27 -0
  83. data/doc/guide/src/concepts/plans.page +101 -0
  84. data/doc/guide/src/concepts/policy.page +31 -0
  85. data/doc/guide/src/concepts/reactor.page +61 -0
  86. data/doc/guide/src/concepts/simple_plan_example.png +0 -0
  87. data/doc/guide/src/concepts/simple_plan_example.svg +376 -0
  88. data/doc/guide/src/default.template +9 -74
  89. data/doc/guide/src/event_relations/forward.page +71 -0
  90. data/doc/guide/src/event_relations/index.page +12 -0
  91. data/doc/guide/src/event_relations/scheduling_constraints.page +43 -0
  92. data/doc/guide/src/event_relations/signal.page +55 -0
  93. data/doc/guide/src/event_relations/temporal_constraints.page +77 -0
  94. data/doc/guide/src/htmldoc.metainfo +21 -8
  95. data/doc/guide/src/index.page +8 -3
  96. data/doc/guide/src/{introduction/install.page → installation/index.page} +37 -25
  97. data/doc/guide/src/installation/publications.page +14 -0
  98. data/doc/guide/src/{introduction → installation}/videos.page +14 -7
  99. data/doc/guide/src/interacting/index.page +16 -0
  100. data/doc/guide/src/interacting/run.page +33 -0
  101. data/doc/guide/src/interacting/shell.page +95 -0
  102. data/doc/guide/src/plugins/creating_plugins.page +72 -0
  103. data/doc/guide/src/plugins/index.page +27 -5
  104. data/doc/guide/src/plugins/{fault_tolerance.page → standard_plugins/fault_tolerance.page} +2 -2
  105. data/doc/guide/src/plugins/standard_plugins/index.page +11 -0
  106. data/doc/guide/src/plugins/{subsystems.page → standard_plugins/subsystems.page} +2 -2
  107. data/doc/guide/src/style_screen.css +687 -0
  108. data/doc/guide/src/task_relations/dependency.page +107 -0
  109. data/doc/guide/src/task_relations/executed_by.page +77 -0
  110. data/doc/guide/src/task_relations/index.page +12 -0
  111. data/doc/guide/src/task_relations/new_relations.page +119 -0
  112. data/doc/guide/src/task_relations/planned_by.page +46 -0
  113. data/doc/guide/src/tutorial/app.page +117 -0
  114. data/doc/guide/src/{basics → tutorial}/code_examples.page +6 -5
  115. data/doc/guide/src/{basics → tutorial}/dry.page +15 -15
  116. data/doc/guide/src/{basics → tutorial}/errors.page +43 -68
  117. data/doc/guide/src/tutorial/events.page +195 -0
  118. data/doc/guide/src/{basics → tutorial}/hierarchy.page +53 -52
  119. data/doc/guide/src/tutorial/index.page +13 -0
  120. data/doc/guide/src/tutorial/log_replay/goForward_1.png +0 -0
  121. data/doc/guide/src/tutorial/log_replay/goForward_2.png +0 -0
  122. data/doc/guide/src/tutorial/log_replay/goForward_3.png +0 -0
  123. data/doc/guide/src/{basics → tutorial}/log_replay/goForward_4.png +0 -0
  124. data/doc/guide/src/tutorial/log_replay/goForward_5.png +0 -0
  125. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_1.png +0 -0
  126. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_2.png +0 -0
  127. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_3.png +0 -0
  128. data/doc/guide/src/tutorial/log_replay/moveto_code_error.png +0 -0
  129. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_1.png +0 -0
  130. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_2.png +0 -0
  131. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_3.png +0 -0
  132. data/doc/guide/src/tutorial/log_replay/plan_repair_4.png +0 -0
  133. data/doc/guide/src/tutorial/log_replay/roby_log_main_window.png +0 -0
  134. data/doc/guide/src/{basics → tutorial}/log_replay/roby_log_relation_window.png +0 -0
  135. data/doc/guide/src/{basics → tutorial}/log_replay/roby_replay_event_representation.png +0 -0
  136. data/doc/guide/src/tutorial/relations_display.page +153 -0
  137. data/doc/guide/src/{basics → tutorial}/roby_cycle_overview.png +0 -0
  138. data/doc/guide/src/tutorial/shell.page +121 -0
  139. data/doc/guide/src/{basics → tutorial}/summary.page +1 -1
  140. data/doc/guide/src/tutorial/tasks.page +374 -0
  141. data/lib/roby.rb +102 -47
  142. data/lib/roby/actions.rb +17 -0
  143. data/lib/roby/actions/action.rb +80 -0
  144. data/lib/roby/actions/interface.rb +45 -0
  145. data/lib/roby/actions/library.rb +23 -0
  146. data/lib/roby/actions/models/action.rb +224 -0
  147. data/lib/roby/actions/models/coordination_action.rb +58 -0
  148. data/lib/roby/actions/models/interface.rb +22 -0
  149. data/lib/roby/actions/models/interface_base.rb +294 -0
  150. data/lib/roby/actions/models/library.rb +12 -0
  151. data/lib/roby/actions/models/method_action.rb +90 -0
  152. data/lib/roby/actions/task.rb +114 -0
  153. data/lib/roby/and_generator.rb +125 -0
  154. data/lib/roby/app.rb +2795 -829
  155. data/lib/roby/app/autotest_console_reporter.rb +138 -0
  156. data/lib/roby/app/base.rb +21 -0
  157. data/lib/roby/app/cucumber.rb +2 -0
  158. data/lib/roby/app/cucumber/controller.rb +439 -0
  159. data/lib/roby/app/cucumber/helpers.rb +280 -0
  160. data/lib/roby/app/cucumber/world.rb +32 -0
  161. data/lib/roby/app/debug.rb +136 -0
  162. data/lib/roby/app/gen.rb +2 -0
  163. data/lib/roby/app/rake.rb +178 -38
  164. data/lib/roby/app/robot_config.rb +9 -0
  165. data/lib/roby/app/robot_names.rb +115 -0
  166. data/lib/roby/app/run.rb +3 -2
  167. data/lib/roby/app/scripts.rb +72 -0
  168. data/lib/roby/app/scripts/autotest.rb +173 -0
  169. data/lib/roby/app/scripts/display.rb +2 -0
  170. data/lib/roby/app/scripts/restart.rb +52 -0
  171. data/lib/roby/app/scripts/results.rb +17 -8
  172. data/lib/roby/app/scripts/run.rb +155 -24
  173. data/lib/roby/app/scripts/shell.rb +147 -62
  174. data/lib/roby/app/scripts/test.rb +107 -22
  175. data/lib/roby/app/test_reporter.rb +74 -0
  176. data/lib/roby/app/test_server.rb +159 -0
  177. data/lib/roby/app/vagrant.rb +47 -0
  178. data/lib/roby/backports.rb +16 -0
  179. data/lib/roby/cli/display.rb +190 -0
  180. data/lib/roby/cli/exceptions.rb +17 -0
  181. data/lib/roby/cli/gen/actions/class.rb +5 -0
  182. data/lib/roby/cli/gen/actions/test.rb +6 -0
  183. data/lib/roby/cli/gen/app/.yardopts +6 -0
  184. data/lib/roby/cli/gen/app/README.md +28 -0
  185. data/lib/roby/cli/gen/app/Rakefile +15 -0
  186. data/{app → lib/roby/cli/gen/app}/config/app.yml +29 -39
  187. data/lib/roby/cli/gen/app/models/.gitattributes +1 -0
  188. data/{app → lib/roby/cli/gen/app/scripts}/controllers/.gitattributes +0 -0
  189. data/{app/data/.gitattributes → lib/roby/cli/gen/app/test/.gitignore} +0 -0
  190. data/lib/roby/cli/gen/class/class.rb +6 -0
  191. data/lib/roby/cli/gen/class/test.rb +7 -0
  192. data/lib/roby/cli/gen/helpers.rb +203 -0
  193. data/lib/roby/cli/gen/module/module.rb +5 -0
  194. data/lib/roby/cli/gen/module/test.rb +6 -0
  195. data/lib/roby/cli/gen/roby_app/config/init.rb +17 -0
  196. data/lib/roby/cli/gen/roby_app/config/robots/robot.rb +40 -0
  197. data/lib/roby/cli/gen/task/class.rb +44 -0
  198. data/lib/roby/cli/gen/task/test.rb +6 -0
  199. data/lib/roby/cli/gen_main.rb +120 -0
  200. data/lib/roby/cli/log.rb +276 -0
  201. data/lib/roby/cli/log/flamegraph.html +499 -0
  202. data/lib/roby/cli/log/flamegraph_renderer.rb +88 -0
  203. data/lib/roby/cli/main.rb +153 -0
  204. data/lib/roby/coordination.rb +60 -0
  205. data/lib/roby/coordination/action_script.rb +25 -0
  206. data/lib/roby/coordination/action_state_machine.rb +125 -0
  207. data/lib/roby/coordination/actions.rb +106 -0
  208. data/lib/roby/coordination/base.rb +145 -0
  209. data/lib/roby/coordination/calculus.rb +40 -0
  210. data/lib/roby/coordination/child.rb +28 -0
  211. data/lib/roby/coordination/event.rb +29 -0
  212. data/lib/roby/coordination/fault_handler.rb +25 -0
  213. data/lib/roby/coordination/fault_handling_task.rb +13 -0
  214. data/lib/roby/coordination/fault_response_table.rb +110 -0
  215. data/lib/roby/coordination/models/action_script.rb +64 -0
  216. data/lib/roby/coordination/models/action_state_machine.rb +224 -0
  217. data/lib/roby/coordination/models/actions.rb +191 -0
  218. data/lib/roby/coordination/models/arguments.rb +55 -0
  219. data/lib/roby/coordination/models/base.rb +176 -0
  220. data/lib/roby/coordination/models/capture.rb +86 -0
  221. data/lib/roby/coordination/models/child.rb +35 -0
  222. data/lib/roby/coordination/models/event.rb +41 -0
  223. data/lib/roby/coordination/models/exceptions.rb +42 -0
  224. data/lib/roby/coordination/models/fault_handler.rb +219 -0
  225. data/lib/roby/coordination/models/fault_response_table.rb +77 -0
  226. data/lib/roby/coordination/models/root.rb +22 -0
  227. data/lib/roby/coordination/models/script.rb +283 -0
  228. data/lib/roby/coordination/models/task.rb +184 -0
  229. data/lib/roby/coordination/models/task_from_action.rb +50 -0
  230. data/lib/roby/coordination/models/task_from_as_plan.rb +33 -0
  231. data/lib/roby/coordination/models/task_from_instanciation_object.rb +31 -0
  232. data/lib/roby/coordination/models/task_from_variable.rb +27 -0
  233. data/lib/roby/coordination/models/task_with_dependencies.rb +48 -0
  234. data/lib/roby/coordination/models/variable.rb +32 -0
  235. data/lib/roby/coordination/script.rb +200 -0
  236. data/lib/roby/coordination/script_instruction.rb +12 -0
  237. data/lib/roby/coordination/task.rb +45 -0
  238. data/lib/roby/coordination/task_base.rb +69 -0
  239. data/lib/roby/coordination/task_script.rb +293 -0
  240. data/lib/roby/coordination/task_state_machine.rb +308 -0
  241. data/lib/roby/decision_control.rb +33 -21
  242. data/lib/roby/distributed_object.rb +76 -0
  243. data/lib/roby/droby.rb +17 -0
  244. data/lib/roby/droby/droby_id.rb +6 -0
  245. data/lib/roby/droby/enable.rb +153 -0
  246. data/lib/roby/droby/event_logger.rb +189 -0
  247. data/lib/roby/droby/event_logging.rb +57 -0
  248. data/lib/roby/droby/exceptions.rb +14 -0
  249. data/lib/roby/droby/identifiable.rb +22 -0
  250. data/lib/roby/droby/logfile.rb +141 -0
  251. data/lib/roby/droby/logfile/client.rb +176 -0
  252. data/lib/roby/droby/logfile/file_format.md +97 -0
  253. data/lib/roby/droby/logfile/index.rb +117 -0
  254. data/lib/roby/droby/logfile/reader.rb +139 -0
  255. data/lib/roby/droby/logfile/server.rb +199 -0
  256. data/lib/roby/droby/logfile/writer.rb +114 -0
  257. data/lib/roby/droby/marshal.rb +264 -0
  258. data/lib/roby/droby/marshallable.rb +12 -0
  259. data/lib/roby/droby/null_event_logger.rb +25 -0
  260. data/lib/roby/droby/object_manager.rb +205 -0
  261. data/lib/roby/droby/peer_id.rb +6 -0
  262. data/lib/roby/droby/plan_rebuilder.rb +373 -0
  263. data/lib/roby/droby/rebuilt_plan.rb +160 -0
  264. data/lib/roby/droby/remote_droby_id.rb +6 -0
  265. data/lib/roby/droby/timepoints.rb +205 -0
  266. data/lib/roby/droby/timepoints_ctf.metadata.erb +101 -0
  267. data/lib/roby/droby/timepoints_ctf.rb +125 -0
  268. data/lib/roby/droby/v5.rb +14 -0
  269. data/lib/roby/droby/v5/builtin.rb +120 -0
  270. data/lib/roby/droby/v5/droby_class.rb +45 -0
  271. data/lib/roby/droby/v5/droby_constant.rb +81 -0
  272. data/lib/roby/droby/v5/droby_dump.rb +1026 -0
  273. data/lib/roby/droby/v5/droby_id.rb +44 -0
  274. data/lib/roby/droby/v5/droby_model.rb +82 -0
  275. data/lib/roby/droby/v5/peer_id.rb +10 -0
  276. data/lib/roby/droby/v5/remote_droby_id.rb +42 -0
  277. data/lib/roby/event.rb +79 -957
  278. data/lib/roby/event_constraints.rb +835 -0
  279. data/lib/roby/event_generator.rb +1047 -0
  280. data/lib/roby/event_structure/causal_link.rb +6 -0
  281. data/lib/roby/event_structure/forwarding.rb +6 -0
  282. data/lib/roby/event_structure/precedence.rb +7 -0
  283. data/lib/roby/event_structure/signal.rb +8 -0
  284. data/lib/roby/event_structure/temporal_constraints.rb +640 -0
  285. data/lib/roby/exceptions.rb +446 -152
  286. data/lib/roby/executable_plan.rb +549 -0
  287. data/lib/roby/execution_engine.rb +1997 -950
  288. data/lib/roby/filter_generator.rb +26 -0
  289. data/lib/roby/gui/chronicle_view.rb +225 -0
  290. data/lib/roby/gui/chronicle_widget.rb +925 -0
  291. data/lib/roby/gui/dot_id.rb +11 -0
  292. data/lib/roby/gui/exception_view.rb +44 -0
  293. data/lib/roby/gui/log_display.rb +273 -0
  294. data/lib/roby/gui/model_views.rb +2 -0
  295. data/lib/roby/gui/model_views/action_interface.rb +53 -0
  296. data/lib/roby/gui/model_views/task.rb +47 -0
  297. data/lib/roby/gui/model_views/task.rhtml +41 -0
  298. data/lib/roby/gui/object_info_view.rb +89 -0
  299. data/lib/roby/gui/plan_dot_layout.rb +427 -0
  300. data/lib/roby/gui/plan_rebuilder_widget.rb +357 -0
  301. data/lib/roby/gui/qt4_toMSecsSinceEpoch.rb +8 -0
  302. data/lib/roby/gui/relations_view.rb +278 -0
  303. data/lib/roby/gui/relations_view/relations.ui +139 -0
  304. data/lib/roby/gui/relations_view/relations_canvas.rb +1088 -0
  305. data/lib/roby/gui/relations_view/relations_config.rb +292 -0
  306. data/lib/roby/gui/relations_view/relations_view.ui +53 -0
  307. data/lib/roby/gui/scheduler_view.css +24 -0
  308. data/lib/roby/gui/scheduler_view.rb +46 -0
  309. data/lib/roby/gui/scheduler_view.rhtml +53 -0
  310. data/lib/roby/gui/stepping.rb +93 -0
  311. data/lib/roby/gui/stepping.ui +181 -0
  312. data/lib/roby/gui/styles.rb +81 -0
  313. data/lib/roby/gui/task_display_configuration.rb +42 -0
  314. data/lib/roby/gui/task_state_at.rb +38 -0
  315. data/lib/roby/hooks.rb +26 -0
  316. data/lib/roby/interface.rb +136 -469
  317. data/lib/roby/interface/async.rb +20 -0
  318. data/lib/roby/interface/async/action_monitor.rb +188 -0
  319. data/lib/roby/interface/async/interface.rb +498 -0
  320. data/lib/roby/interface/async/job_monitor.rb +213 -0
  321. data/lib/roby/interface/async/log.rb +238 -0
  322. data/lib/roby/interface/async/new_job_listener.rb +79 -0
  323. data/lib/roby/interface/async/ui_connector.rb +183 -0
  324. data/lib/roby/interface/client.rb +553 -0
  325. data/lib/roby/interface/command.rb +24 -0
  326. data/lib/roby/interface/command_argument.rb +16 -0
  327. data/lib/roby/interface/command_library.rb +92 -0
  328. data/lib/roby/interface/droby_channel.rb +174 -0
  329. data/lib/roby/interface/exceptions.rb +22 -0
  330. data/lib/roby/interface/interface.rb +655 -0
  331. data/lib/roby/interface/job.rb +47 -0
  332. data/lib/roby/interface/rest.rb +10 -0
  333. data/lib/roby/interface/rest/api.rb +29 -0
  334. data/lib/roby/interface/rest/helpers.rb +24 -0
  335. data/lib/roby/interface/rest/server.rb +212 -0
  336. data/lib/roby/interface/server.rb +154 -0
  337. data/lib/roby/interface/shell_client.rb +468 -0
  338. data/lib/roby/interface/shell_subcommand.rb +24 -0
  339. data/lib/roby/interface/subcommand_client.rb +35 -0
  340. data/lib/roby/interface/tcp.rb +168 -0
  341. data/lib/roby/models/arguments.rb +112 -0
  342. data/lib/roby/models/plan_object.rb +83 -0
  343. data/lib/roby/models/task.rb +835 -0
  344. data/lib/roby/models/task_event.rb +62 -0
  345. data/lib/roby/models/task_service.rb +78 -0
  346. data/lib/roby/or_generator.rb +88 -0
  347. data/lib/roby/plan.rb +1751 -864
  348. data/lib/roby/plan_object.rb +611 -0
  349. data/lib/roby/plan_service.rb +200 -0
  350. data/lib/roby/promise.rb +332 -0
  351. data/lib/roby/queries.rb +23 -0
  352. data/lib/roby/queries/and_matcher.rb +32 -0
  353. data/lib/roby/queries/any.rb +27 -0
  354. data/lib/roby/queries/code_error_matcher.rb +58 -0
  355. data/lib/roby/queries/event_generator_matcher.rb +9 -0
  356. data/lib/roby/queries/execution_exception_matcher.rb +165 -0
  357. data/lib/roby/queries/index.rb +165 -0
  358. data/lib/roby/queries/localized_error_matcher.rb +149 -0
  359. data/lib/roby/queries/matcher_base.rb +107 -0
  360. data/lib/roby/queries/none.rb +27 -0
  361. data/lib/roby/queries/not_matcher.rb +30 -0
  362. data/lib/roby/queries/op_matcher.rb +8 -0
  363. data/lib/roby/queries/or_matcher.rb +30 -0
  364. data/lib/roby/queries/plan_object_matcher.rb +363 -0
  365. data/lib/roby/queries/query.rb +188 -0
  366. data/lib/roby/queries/task_event_generator_matcher.rb +86 -0
  367. data/lib/roby/queries/task_matcher.rb +344 -0
  368. data/lib/roby/relations.rb +42 -678
  369. data/lib/roby/relations/bidirectional_directed_adjacency_graph.rb +492 -0
  370. data/lib/roby/relations/directed_relation_support.rb +268 -0
  371. data/lib/roby/relations/event_relation_graph.rb +19 -0
  372. data/lib/roby/relations/fork_merge_visitor.rb +154 -0
  373. data/lib/roby/relations/graph.rb +533 -0
  374. data/lib/roby/relations/models/directed_relation_support.rb +11 -0
  375. data/lib/roby/relations/models/graph.rb +75 -0
  376. data/lib/roby/relations/models/task_relation_graph.rb +18 -0
  377. data/lib/roby/relations/space.rb +380 -0
  378. data/lib/roby/relations/task_relation_graph.rb +20 -0
  379. data/lib/roby/robot.rb +85 -38
  380. data/lib/roby/schedulers/basic.rb +155 -25
  381. data/lib/roby/schedulers/null.rb +20 -0
  382. data/lib/roby/schedulers/reporting.rb +31 -0
  383. data/lib/roby/schedulers/state.rb +129 -0
  384. data/lib/roby/schedulers/temporal.rb +91 -0
  385. data/lib/roby/singletons.rb +87 -0
  386. data/lib/roby/standalone.rb +4 -2
  387. data/lib/roby/standard_errors.rb +405 -82
  388. data/lib/roby/state.rb +6 -3
  389. data/lib/roby/state/conf_model.rb +5 -0
  390. data/lib/roby/state/events.rb +181 -95
  391. data/lib/roby/state/goal_model.rb +77 -0
  392. data/lib/roby/state/open_struct.rb +591 -0
  393. data/lib/roby/state/open_struct_model.rb +68 -0
  394. data/lib/roby/state/pos.rb +45 -45
  395. data/lib/roby/state/shapes.rb +11 -11
  396. data/lib/roby/state/state_model.rb +303 -0
  397. data/lib/roby/state/task.rb +43 -0
  398. data/lib/roby/support.rb +88 -148
  399. data/lib/roby/task.rb +1361 -1750
  400. data/lib/roby/task_arguments.rb +428 -0
  401. data/lib/roby/task_event.rb +127 -0
  402. data/lib/roby/task_event_generator.rb +337 -0
  403. data/lib/roby/task_service.rb +6 -0
  404. data/lib/roby/task_structure/conflicts.rb +104 -0
  405. data/lib/roby/task_structure/dependency.rb +932 -0
  406. data/lib/roby/task_structure/error_handling.rb +118 -0
  407. data/lib/roby/task_structure/executed_by.rb +234 -0
  408. data/lib/roby/task_structure/planned_by.rb +90 -0
  409. data/lib/roby/tasks/aggregator.rb +37 -0
  410. data/lib/roby/tasks/external_process.rb +275 -0
  411. data/lib/roby/tasks/group.rb +27 -0
  412. data/lib/roby/tasks/null.rb +19 -0
  413. data/lib/roby/tasks/parallel.rb +43 -0
  414. data/lib/roby/tasks/sequence.rb +88 -0
  415. data/lib/roby/tasks/simple.rb +21 -0
  416. data/lib/roby/{thread_task.rb → tasks/thread.rb} +50 -24
  417. data/lib/roby/tasks/timeout.rb +17 -0
  418. data/lib/roby/tasks/virtual.rb +55 -0
  419. data/lib/roby/template_plan.rb +7 -0
  420. data/lib/roby/test/aruba_minitest.rb +74 -0
  421. data/lib/roby/test/assertion.rb +16 -0
  422. data/lib/roby/test/assertions.rb +490 -0
  423. data/lib/roby/test/common.rb +368 -591
  424. data/lib/roby/test/dsl.rb +149 -0
  425. data/lib/roby/test/error.rb +18 -0
  426. data/lib/roby/test/event_reporter.rb +83 -0
  427. data/lib/roby/test/execution_expectations.rb +1134 -0
  428. data/lib/roby/test/expect_execution.rb +151 -0
  429. data/lib/roby/test/minitest_helpers.rb +166 -0
  430. data/lib/roby/test/roby_app_helpers.rb +200 -0
  431. data/lib/roby/test/run_planners.rb +155 -0
  432. data/lib/roby/test/self.rb +112 -0
  433. data/lib/roby/test/spec.rb +198 -0
  434. data/lib/roby/test/tasks/empty_task.rb +4 -4
  435. data/lib/roby/test/tasks/goto.rb +28 -27
  436. data/lib/roby/test/teardown_plans.rb +100 -0
  437. data/lib/roby/test/testcase.rb +239 -307
  438. data/lib/roby/test/tools.rb +159 -155
  439. data/lib/roby/test/validate_state_machine.rb +75 -0
  440. data/lib/roby/transaction.rb +1125 -0
  441. data/lib/roby/transaction/event_generator_proxy.rb +63 -0
  442. data/lib/roby/transaction/plan_object_proxy.rb +99 -0
  443. data/lib/roby/transaction/plan_service_proxy.rb +43 -0
  444. data/lib/roby/transaction/proxying.rb +120 -0
  445. data/lib/roby/transaction/task_event_generator_proxy.rb +19 -0
  446. data/lib/roby/transaction/task_proxy.rb +135 -0
  447. data/lib/roby/until_generator.rb +30 -0
  448. data/lib/roby/version.rb +5 -0
  449. data/lib/roby/yard.rb +169 -0
  450. data/lib/yard-roby.rb +1 -0
  451. data/manifest.xml +32 -6
  452. data/roby.gemspec +59 -0
  453. metadata +788 -587
  454. data/Manifest.txt +0 -321
  455. data/NOTES +0 -4
  456. data/README.txt +0 -166
  457. data/TODO.txt +0 -146
  458. data/app/README.txt +0 -24
  459. data/app/Rakefile +0 -8
  460. data/app/config/ROBOT.rb +0 -5
  461. data/app/config/init.rb +0 -33
  462. data/app/config/roby.yml +0 -3
  463. data/app/controllers/ROBOT.rb +0 -2
  464. data/app/planners/ROBOT/main.rb +0 -6
  465. data/app/planners/main.rb +0 -5
  466. data/app/scripts/distributed +0 -3
  467. data/app/scripts/generate/bookmarks +0 -3
  468. data/app/scripts/replay +0 -3
  469. data/app/scripts/results +0 -3
  470. data/app/scripts/run +0 -3
  471. data/app/scripts/server +0 -3
  472. data/app/scripts/shell +0 -3
  473. data/app/scripts/test +0 -3
  474. data/app/tasks/.gitattributes +0 -0
  475. data/app/tasks/ROBOT/.gitattributes +0 -0
  476. data/bin/roby-shell +0 -25
  477. data/doc/guide/src/basics/app.page +0 -139
  478. data/doc/guide/src/basics/index.page +0 -11
  479. data/doc/guide/src/basics/log_replay/goForward_1.png +0 -0
  480. data/doc/guide/src/basics/log_replay/goForward_2.png +0 -0
  481. data/doc/guide/src/basics/log_replay/goForward_3.png +0 -0
  482. data/doc/guide/src/basics/log_replay/goForward_5.png +0 -0
  483. data/doc/guide/src/basics/log_replay/plan_repair_4.png +0 -0
  484. data/doc/guide/src/basics/log_replay/roby_log_main_window.png +0 -0
  485. data/doc/guide/src/basics/relations_display.page +0 -203
  486. data/doc/guide/src/basics/shell.page +0 -102
  487. data/doc/guide/src/default.css +0 -319
  488. data/doc/guide/src/introduction/index.page +0 -29
  489. data/doc/guide/src/introduction/publications.page +0 -14
  490. data/doc/guide/src/relations/dependency.page +0 -89
  491. data/doc/guide/src/relations/index.page +0 -12
  492. data/ext/droby/dump.cc +0 -175
  493. data/ext/droby/extconf.rb +0 -3
  494. data/ext/graph/algorithm.cc +0 -746
  495. data/ext/graph/extconf.rb +0 -7
  496. data/ext/graph/graph.cc +0 -575
  497. data/ext/graph/graph.hh +0 -183
  498. data/ext/graph/iterator_sequence.hh +0 -102
  499. data/ext/graph/undirected_dfs.hh +0 -226
  500. data/ext/graph/undirected_graph.hh +0 -421
  501. data/lib/roby/app/scripts/generate/bookmarks.rb +0 -162
  502. data/lib/roby/app/scripts/replay.rb +0 -31
  503. data/lib/roby/app/scripts/server.rb +0 -18
  504. data/lib/roby/basic_object.rb +0 -151
  505. data/lib/roby/config.rb +0 -14
  506. data/lib/roby/distributed.rb +0 -36
  507. data/lib/roby/distributed/base.rb +0 -448
  508. data/lib/roby/distributed/communication.rb +0 -875
  509. data/lib/roby/distributed/connection_space.rb +0 -616
  510. data/lib/roby/distributed/distributed_object.rb +0 -206
  511. data/lib/roby/distributed/drb.rb +0 -62
  512. data/lib/roby/distributed/notifications.rb +0 -531
  513. data/lib/roby/distributed/peer.rb +0 -555
  514. data/lib/roby/distributed/protocol.rb +0 -529
  515. data/lib/roby/distributed/proxy.rb +0 -343
  516. data/lib/roby/distributed/subscription.rb +0 -311
  517. data/lib/roby/distributed/transaction.rb +0 -498
  518. data/lib/roby/external_process_task.rb +0 -225
  519. data/lib/roby/graph.rb +0 -160
  520. data/lib/roby/log.rb +0 -3
  521. data/lib/roby/log/chronicle.rb +0 -303
  522. data/lib/roby/log/console.rb +0 -74
  523. data/lib/roby/log/data_stream.rb +0 -275
  524. data/lib/roby/log/dot.rb +0 -279
  525. data/lib/roby/log/event_stream.rb +0 -161
  526. data/lib/roby/log/file.rb +0 -396
  527. data/lib/roby/log/gui/basic_display.ui +0 -83
  528. data/lib/roby/log/gui/basic_display_ui.rb +0 -89
  529. data/lib/roby/log/gui/chronicle.rb +0 -26
  530. data/lib/roby/log/gui/chronicle_view.rb +0 -40
  531. data/lib/roby/log/gui/chronicle_view.ui +0 -70
  532. data/lib/roby/log/gui/chronicle_view_ui.rb +0 -90
  533. data/lib/roby/log/gui/data_displays.rb +0 -171
  534. data/lib/roby/log/gui/data_displays.ui +0 -155
  535. data/lib/roby/log/gui/data_displays_ui.rb +0 -146
  536. data/lib/roby/log/gui/notifications.rb +0 -26
  537. data/lib/roby/log/gui/relations.rb +0 -269
  538. data/lib/roby/log/gui/relations.ui +0 -123
  539. data/lib/roby/log/gui/relations_ui.rb +0 -120
  540. data/lib/roby/log/gui/relations_view.rb +0 -185
  541. data/lib/roby/log/gui/relations_view.ui +0 -149
  542. data/lib/roby/log/gui/relations_view_ui.rb +0 -144
  543. data/lib/roby/log/gui/replay.rb +0 -366
  544. data/lib/roby/log/gui/replay_controls.rb +0 -206
  545. data/lib/roby/log/gui/replay_controls.ui +0 -282
  546. data/lib/roby/log/gui/replay_controls_ui.rb +0 -249
  547. data/lib/roby/log/gui/runtime.rb +0 -130
  548. data/lib/roby/log/hooks.rb +0 -186
  549. data/lib/roby/log/logger.rb +0 -203
  550. data/lib/roby/log/notifications.rb +0 -244
  551. data/lib/roby/log/plan_rebuilder.rb +0 -468
  552. data/lib/roby/log/relations.rb +0 -1084
  553. data/lib/roby/log/server.rb +0 -547
  554. data/lib/roby/log/sqlite.rb +0 -47
  555. data/lib/roby/log/timings.rb +0 -233
  556. data/lib/roby/plan-object.rb +0 -371
  557. data/lib/roby/planning.rb +0 -13
  558. data/lib/roby/planning/loops.rb +0 -309
  559. data/lib/roby/planning/model.rb +0 -1012
  560. data/lib/roby/planning/task.rb +0 -180
  561. data/lib/roby/query.rb +0 -655
  562. data/lib/roby/relations/conflicts.rb +0 -67
  563. data/lib/roby/relations/dependency.rb +0 -358
  564. data/lib/roby/relations/ensured.rb +0 -19
  565. data/lib/roby/relations/error_handling.rb +0 -22
  566. data/lib/roby/relations/events.rb +0 -7
  567. data/lib/roby/relations/executed_by.rb +0 -208
  568. data/lib/roby/relations/influence.rb +0 -10
  569. data/lib/roby/relations/planned_by.rb +0 -63
  570. data/lib/roby/state/information.rb +0 -55
  571. data/lib/roby/state/state.rb +0 -367
  572. data/lib/roby/task-operations.rb +0 -186
  573. data/lib/roby/task_index.rb +0 -80
  574. data/lib/roby/test/distributed.rb +0 -230
  575. data/lib/roby/test/tasks/simple_task.rb +0 -23
  576. data/lib/roby/transactions.rb +0 -507
  577. data/lib/roby/transactions/proxy.rb +0 -325
  578. data/plugins/fault_injection/History.txt +0 -4
  579. data/plugins/fault_injection/README.txt +0 -34
  580. data/plugins/fault_injection/Rakefile +0 -12
  581. data/plugins/fault_injection/TODO.txt +0 -0
  582. data/plugins/fault_injection/app.rb +0 -52
  583. data/plugins/fault_injection/fault_injection.rb +0 -89
  584. data/plugins/fault_injection/test/test_fault_injection.rb +0 -78
  585. data/plugins/subsystems/README.txt +0 -37
  586. data/plugins/subsystems/Rakefile +0 -13
  587. data/plugins/subsystems/app.rb +0 -182
  588. data/plugins/subsystems/test/app/README +0 -24
  589. data/plugins/subsystems/test/app/Rakefile +0 -8
  590. data/plugins/subsystems/test/app/config/app.yml +0 -71
  591. data/plugins/subsystems/test/app/config/init.rb +0 -12
  592. data/plugins/subsystems/test/app/config/roby.yml +0 -3
  593. data/plugins/subsystems/test/app/planners/main.rb +0 -20
  594. data/plugins/subsystems/test/app/scripts/distributed +0 -3
  595. data/plugins/subsystems/test/app/scripts/replay +0 -3
  596. data/plugins/subsystems/test/app/scripts/results +0 -3
  597. data/plugins/subsystems/test/app/scripts/run +0 -3
  598. data/plugins/subsystems/test/app/scripts/server +0 -3
  599. data/plugins/subsystems/test/app/scripts/shell +0 -3
  600. data/plugins/subsystems/test/app/scripts/test +0 -3
  601. data/plugins/subsystems/test/app/tasks/services.rb +0 -15
  602. data/plugins/subsystems/test/test_subsystems.rb +0 -78
  603. data/test/distributed/test_communication.rb +0 -195
  604. data/test/distributed/test_connection.rb +0 -284
  605. data/test/distributed/test_execution.rb +0 -378
  606. data/test/distributed/test_mixed_plan.rb +0 -341
  607. data/test/distributed/test_plan_notifications.rb +0 -238
  608. data/test/distributed/test_protocol.rb +0 -525
  609. data/test/distributed/test_query.rb +0 -106
  610. data/test/distributed/test_remote_plan.rb +0 -491
  611. data/test/distributed/test_transaction.rb +0 -466
  612. data/test/mockups/external_process +0 -28
  613. data/test/mockups/tasks.rb +0 -27
  614. data/test/planning/test_loops.rb +0 -432
  615. data/test/planning/test_model.rb +0 -427
  616. data/test/planning/test_task.rb +0 -126
  617. data/test/relations/test_conflicts.rb +0 -42
  618. data/test/relations/test_dependency.rb +0 -324
  619. data/test/relations/test_ensured.rb +0 -38
  620. data/test/relations/test_executed_by.rb +0 -224
  621. data/test/relations/test_planned_by.rb +0 -56
  622. data/test/suite_core.rb +0 -29
  623. data/test/suite_distributed.rb +0 -10
  624. data/test/suite_planning.rb +0 -4
  625. data/test/suite_relations.rb +0 -8
  626. data/test/tasks/test_external_process.rb +0 -126
  627. data/test/tasks/test_thread_task.rb +0 -70
  628. data/test/test_bgl.rb +0 -528
  629. data/test/test_event.rb +0 -969
  630. data/test/test_exceptions.rb +0 -591
  631. data/test/test_execution_engine.rb +0 -987
  632. data/test/test_gui.rb +0 -20
  633. data/test/test_interface.rb +0 -43
  634. data/test/test_log.rb +0 -125
  635. data/test/test_log_server.rb +0 -133
  636. data/test/test_plan.rb +0 -418
  637. data/test/test_query.rb +0 -424
  638. data/test/test_relations.rb +0 -260
  639. data/test/test_state.rb +0 -432
  640. data/test/test_support.rb +0 -16
  641. data/test/test_task.rb +0 -1181
  642. data/test/test_testcase.rb +0 -138
  643. data/test/test_transactions.rb +0 -610
  644. data/test/test_transactions_proxy.rb +0 -216
@@ -1,969 +0,0 @@
1
- $LOAD_PATH.unshift File.expand_path(File.join('..', 'lib'), File.dirname(__FILE__))
2
- require 'roby/test/common'
3
- require 'flexmock'
4
- require 'roby/test/tasks/simple_task'
5
-
6
- require 'roby'
7
- class TC_Event < Test::Unit::TestCase
8
- include Roby::Test
9
- def setup
10
- super
11
- Roby.app.filter_backtraces = false
12
- end
13
-
14
- def test_no_plan
15
- event = EventGenerator.new { }
16
- assert(!event.executable?)
17
- assert_raises(Roby::EventNotExecutable) { event.emit }
18
- assert_raises(Roby::EventNotExecutable) { event.call }
19
-
20
- plan.add(event)
21
- assert(event.executable?)
22
- end
23
-
24
- def test_controlable_events
25
- event = EventGenerator.new(true)
26
- assert(event.controlable?)
27
-
28
- # Check command & emission behavior for controlable events
29
- FlexMock.use do |mock|
30
- plan.add(event = EventGenerator.new { |context| mock.call_handler(context); event.emit(*context) })
31
- event.on { |event| mock.event_handler(event.context) }
32
-
33
- assert(event.controlable?)
34
- mock.should_receive(:call_handler).once.with([42])
35
- mock.should_receive(:event_handler).once.with([42])
36
- event.call(42)
37
- end
38
- end
39
-
40
- def test_contingent_events
41
- # Check emission behavior for non-controlable events
42
- FlexMock.use do |mock|
43
- event = EventGenerator.new
44
- plan.add(event)
45
- event.on { |event| mock.event(event.context) }
46
- mock.should_receive(:event).once.with([42])
47
- event.emit(42)
48
- end
49
- end
50
-
51
- def test_explicit_executable_flag
52
- plan.add(event = EventGenerator.new(true))
53
- assert(event.executable?)
54
- event.executable = false
55
- assert_raises(EventNotExecutable) { event.call(nil) }
56
- assert_raises(EventNotExecutable) { event.emit(nil) }
57
-
58
- event.executable = true
59
- assert_nothing_raised { event.call(nil) }
60
- assert_nothing_raised { event.emit(nil) }
61
-
62
- plan.add(other = EventGenerator.new(true))
63
- other.executable = false
64
- event.signals other
65
- assert_raises(EventNotExecutable) { event.call(nil) }
66
-
67
- event.remove_signal(other)
68
- assert_nothing_raised { event.emit(nil) }
69
- event.forward_to other
70
- assert_raises(EventNotExecutable) { event.call(nil) }
71
-
72
- event.remove_forwarding(other)
73
- assert_nothing_raised { event.emit(nil) }
74
- event.on { other.emit(nil) }
75
- assert_original_error(EventNotExecutable, EventHandlerError) { event.call(nil) }
76
- end
77
-
78
- def test_emit_failed_raises
79
- plan.add(event = EventGenerator.new)
80
- assert_original_error(NilClass, EmissionFailed) { event.emit_failed }
81
- assert_original_error(NilClass, EmissionFailed) { event.emit_failed("test") }
82
-
83
- klass = Class.new(EmissionFailed)
84
- assert_raises(klass) { event.emit_failed(klass) }
85
- assert_raises(klass) { event.emit_failed(klass, "test") }
86
- begin; event.emit_failed(klass, "test")
87
- rescue klass => e
88
- assert( e.message =~ /: test$/ )
89
- end
90
-
91
- exception = klass.new(nil, event)
92
- assert_raises(klass) { event.emit_failed(exception, "test") }
93
- begin; event.emit_failed(exception, "test")
94
- rescue klass => e
95
- assert_equal(event, e.failed_generator)
96
- assert( e.message =~ /: test$/ )
97
- end
98
- end
99
-
100
- def test_emit_failed_removes_pending
101
- event = EventGenerator.new { }
102
- plan.add(event)
103
- event.call
104
- assert(event.pending?)
105
- assert_raises(EmissionFailed) { event.emit_failed }
106
- assert(!event.pending?)
107
- end
108
-
109
- def test_propagation_id
110
- e1, e2, e3 = (1..3).map { EventGenerator.new(true) }.
111
- each { |e| plan.add(e) }
112
- e1.signals e2
113
- e1.emit(nil)
114
- assert_equal(e1.last.propagation_id, e2.last.propagation_id)
115
-
116
- e2.emit(nil)
117
- assert(e1.last.propagation_id < e2.last.propagation_id)
118
-
119
- e3.emit(nil)
120
- assert(e1.last.propagation_id < e3.last.propagation_id)
121
- assert(e2.last.propagation_id < e3.last.propagation_id)
122
- end
123
-
124
-
125
- def test_signals_without_delay
126
- e1, e2 = EventGenerator.new(true), Roby::EventGenerator.new(true)
127
- plan.add([e1, e2])
128
-
129
- e1.signals e2
130
-
131
- assert( e1.child_object?( e2, EventStructure::Signal ))
132
- assert( e2.parent_object?( e1, EventStructure::Signal ))
133
-
134
- e1.call(nil)
135
- assert(e2.happened?)
136
- end
137
-
138
- def test_forward_to_without_delay
139
- e1, e2 = EventGenerator.new, Roby::EventGenerator.new
140
- plan.add([e1, e2])
141
-
142
- e1.forward_to e2
143
-
144
- assert( e1.child_object?( e2, EventStructure::Forwarding ))
145
- assert( e2.parent_object?( e1, EventStructure::Forwarding ))
146
-
147
- e1.emit(nil)
148
- assert(e2.happened?)
149
- end
150
-
151
- # b.emit_on(a) is replaced by a.forward_to(b)
152
- def test_deprecated_emit_on
153
- e1, e2 = EventGenerator.new, Roby::EventGenerator.new
154
- plan.add([e1, e2])
155
-
156
- deprecated_feature do
157
- e2.emit_on e1
158
- end
159
-
160
- assert( e1.child_object?( e2, EventStructure::Forwarding ))
161
- assert( e2.parent_object?( e1, EventStructure::Forwarding ))
162
-
163
- e1.emit(nil)
164
- assert(e2.happened?)
165
- end
166
-
167
- # forward has been renamed into #forward_to
168
- def test_deprecated_forward
169
- e1, e2 = EventGenerator.new, Roby::EventGenerator.new
170
- plan.add([e1, e2])
171
-
172
- deprecated_feature do
173
- e1.forward e2
174
- end
175
-
176
- assert( e1.child_object?( e2, EventStructure::Forwarding ))
177
- assert( e2.parent_object?( e1, EventStructure::Forwarding ))
178
-
179
- e1.emit(nil)
180
- assert(e2.happened?)
181
- end
182
-
183
- def test_deprecated_on
184
- e1, e2 = EventGenerator.new(true), Roby::EventGenerator.new(true)
185
- plan.add([e1, e2])
186
-
187
- deprecated_feature do
188
- e1.on e2
189
- end
190
-
191
- assert( e1.child_object?( e2, EventStructure::Signal ))
192
- assert( e2.parent_object?( e1, EventStructure::Signal ))
193
-
194
- e1.call(nil)
195
- assert(e2.happened?)
196
- end
197
-
198
- def test_handlers
199
- e1, e2 = EventGenerator.new(true), Roby::EventGenerator.new(true)
200
- plan.add([e1, e2])
201
- e1.on { e2.call(nil) }
202
-
203
- FlexMock.use do |mock|
204
- e1.on { mock.e1 }
205
- e2.on { mock.e2 }
206
- e1.on { mock.happened?(e1.happened?) }
207
- mock.should_receive(:happened?).once.with(true)
208
- mock.should_receive(:e1).once.ordered
209
- mock.should_receive(:e2).once.ordered
210
- e1.call(nil)
211
- end
212
- end
213
-
214
- def common_test_source_setup(forwarding)
215
- src = EventGenerator.new(true)
216
- e = EventGenerator.new(true)
217
- target = EventGenerator.new(true)
218
- plan.add([src, e, target])
219
- src.signals e
220
- yield(e, target)
221
- src.call
222
- if forwarding
223
- assert_equal([e.last], target.last.sources.to_a)
224
- else
225
- assert_equal([], target.last.sources.to_a)
226
- end
227
- end
228
- def test_forward_source
229
- common_test_source_setup(true) { |e, target| e.forward_to target }
230
- end
231
- def test_forward_in_handler_source
232
- common_test_source_setup(true) { |e, target| e.on { target.emit } }
233
- end
234
- def test_forward_in_command_source
235
- common_test_source_setup(false) { |e, target| e.command = lambda { |_| target.emit; e.emit } }
236
- end
237
- def test_signal_source
238
- common_test_source_setup(false) { |e, target| e.signals target }
239
- end
240
- def test_signal_in_handler_source
241
- common_test_source_setup(false) { |e, target| e.on { target.call } }
242
- end
243
- def test_signal_in_command_source
244
- common_test_source_setup(false) { |e, target| e.command = lambda { |_| target.call; e.emit } }
245
- end
246
-
247
- def test_simple_signal_handler_ordering
248
- e1, e2, e3 = (1..3).map { EventGenerator.new(true) }.
249
- each { |e| plan.add(e) }
250
- e1.signals(e2)
251
- e1.on { e2.remove_signal(e3) }
252
- e2.signals(e3)
253
-
254
- e1.call(nil)
255
- assert( e2.happened? )
256
- assert( !e3.happened? )
257
- end
258
-
259
- def test_event_hooks
260
- FlexMock.use do |mock|
261
- hooks = [:calling, :called, :fired]
262
- mod = Module.new do
263
- hooks.each do |name|
264
- define_method(name) do |context|
265
- mock.send(name, self)
266
- end
267
- end
268
- end
269
-
270
- generator = Class.new(EventGenerator) do
271
- include mod
272
- end.new(true)
273
- plan.add(generator)
274
-
275
- hooks.each do |name|
276
- mock.should_receive(name).once.with(generator).ordered
277
- end
278
- generator.call(nil)
279
- end
280
- end
281
-
282
- def test_postpone
283
- wait_for = EventGenerator.new(true)
284
- event = EventGenerator.new(true)
285
- plan.add([wait_for, event])
286
- event.singleton_class.class_eval do
287
- define_method(:calling) do |context|
288
- super if defined? super
289
- unless wait_for.happened?
290
- postpone(wait_for, "bla") {}
291
- end
292
- end
293
- end
294
-
295
- event.call(nil)
296
- assert(! event.happened?)
297
- assert(! event.pending?)
298
- assert(wait_for.child_object?(event, EventStructure::Signal))
299
- wait_for.call(nil)
300
- assert(event.happened?)
301
-
302
- # Test propagation when the block given to postpone signals the event
303
- # we are waiting for
304
- FlexMock.use do |mock|
305
- wait_for = EventGenerator.new(true)
306
- event = EventGenerator.new(true)
307
- plan.add([wait_for, event])
308
- event.singleton_class.class_eval do
309
- define_method(:calling) do |context|
310
- super if defined? super
311
- if !wait_for.happened?
312
- postpone(wait_for, "bla") do
313
- wait_for.call(nil)
314
- end
315
- end
316
- end
317
- end
318
-
319
- wait_for.on { mock.wait_for }
320
- event.on { mock.event }
321
-
322
- mock.should_receive(:wait_for).once.ordered
323
- mock.should_receive(:event).once.ordered
324
- event.call(nil)
325
- end
326
- end
327
-
328
- def test_can_signal
329
- a, b = EventGenerator.new(true), EventGenerator.new
330
- plan.add([a, b])
331
- assert_raises(EventNotControlable) { a.signals b }
332
- assert_nothing_raised { a.forward_to b }
333
-
334
- a, b = EventGenerator.new(true), EventGenerator.new(true)
335
- plan.add([a, b])
336
- a.signals b
337
- def b.controlable?; false end
338
-
339
- assert_raise(EmissionFailed) { a.call(nil) }
340
- end
341
-
342
- def test_and_generator
343
- and_event = AndGenerator.new
344
- FlexMock.use do |mock|
345
- and_event.on { mock.called }
346
- mock.should_receive(:called).once
347
-
348
- events = 5.enum_for(:times).map { EventGenerator.new(true) }
349
- plan.add(events)
350
- events.each { |ev| and_event << ev }
351
-
352
- events.each do |ev|
353
- ev.call(nil)
354
- if ev != events[-1]
355
- assert(!and_event.happened?)
356
- end
357
- end
358
-
359
- assert(and_event.happened?)
360
-
361
- # Call the events again. The and generator should not emit.
362
- # This is checked by the flexmock object
363
- events.each do |ev|
364
- ev.call(nil)
365
- end
366
- end
367
-
368
- # Check the behavior of the & operator
369
- e1, e2, e3, e4 = (1..4).map { EventGenerator.new(true) }.
370
- each { |e| plan.add(e) }
371
- and_event = e1 & e2
372
- and_and = and_event & e3
373
- assert_equal([e1, e2].to_set, and_event.waiting.to_set)
374
- and_and = e4 & and_event
375
- assert_equal([e1, e2].to_set, and_event.waiting.to_set)
376
-
377
- # Check dynamic behaviour
378
- a, b, c, d = (1..4).map { EventGenerator.new(true) }.
379
- each { |e| plan.add(e) }
380
- and1 = a & b
381
- and2 = and1 & c
382
- and2.signals d
383
- assert_equal([and1], a.enum_for(:each_signal).to_a)
384
- assert_equal([and1], b.enum_for(:each_signal).to_a)
385
- assert_equal([and2], and1.enum_for(:each_signal).to_a)
386
- assert_equal([and2], c.enum_for(:each_signal).to_a)
387
- assert_equal([d], and2.enum_for(:each_signal).to_a)
388
-
389
- a.call(nil)
390
- assert_equal([b], and1.waiting)
391
- assert(! and1.happened?)
392
-
393
- c.call(nil)
394
- assert_equal([and1], and2.waiting)
395
- assert(! and2.happened?)
396
-
397
- b.call(nil)
398
- assert(and1.happened?)
399
- assert(and2.happened?)
400
- assert_equal([], and1.waiting)
401
- assert_equal([], and2.waiting)
402
-
403
- assert(d.happened?)
404
- end
405
-
406
- def test_and_empty
407
- plan.add(and_event = AndGenerator.new)
408
-
409
- assert(and_event.empty?)
410
- and_event << EventGenerator.new(true)
411
- assert(!and_event.empty?)
412
-
413
- end
414
-
415
- def test_and_unreachability
416
- a, b = (1..2).map { EventGenerator.new(true) }.
417
- each { |e| plan.add(e) }
418
-
419
- # Test unreachability
420
- ## it is unreachable once emitted, but if_unreachable(true) blocks
421
- ## must no be called
422
- and_event = (a & b)
423
- FlexMock.use do |mock|
424
- and_event.if_unreachable(true) do
425
- mock.unreachable
426
- end
427
- mock.should_receive(:unreachable).never
428
- a.call
429
- assert( !and_event.unreachable? )
430
- b.call
431
- assert( !and_event.unreachable? )
432
- end
433
-
434
- ## must be unreachable once one of the nonemitted source events are
435
- and_event = (a & b)
436
- a.call
437
- a.unreachable!
438
- assert(!and_event.unreachable?)
439
- b.unreachable!
440
- assert(and_event.unreachable?)
441
- end
442
-
443
- def test_and_reset
444
- a, b = (1..2).map { EventGenerator.new(true) }.
445
- each { |e| plan.add(e) }
446
- and_event = (a & b)
447
- a.emit(nil)
448
-
449
- and_event.reset
450
- b.emit(nil)
451
- assert(!and_event.happened?)
452
- a.emit(nil)
453
- assert(and_event.happened?)
454
-
455
- and_event.reset
456
- a.emit(nil)
457
- b.emit(nil)
458
- assert_equal(2, and_event.history.size)
459
-
460
- and_event.on { and_event.reset }
461
- and_event.reset
462
- a.emit(nil)
463
- b.emit(nil)
464
- assert_equal(3, and_event.history.size)
465
- a.emit(nil)
466
- b.emit(nil)
467
- assert_equal(4, and_event.history.size)
468
- end
469
-
470
- def setup_aggregation(mock)
471
- e1, e2, m1, m2, m3 = 5.enum_for(:times).map { EventGenerator.new(true) }
472
- plan.add([e1, e2, m1, m2, m3])
473
- e1.signals e2
474
- m1.signals m2
475
- m2.signals m3
476
-
477
- (e1 & e2 & m2).on { mock.and }
478
- (e2 | m1).on { mock.or }
479
- ((e2 & m1) | m2).on { mock.and_or }
480
-
481
- ((e2 | m1) & m2).on { mock.or_and }
482
- [e1, e2, m1, m2, m3]
483
- end
484
-
485
- def test_aggregator
486
- FlexMock.use do |mock|
487
- e1, e2, m1, *_ = setup_aggregation(mock)
488
- e2.signals m1
489
- mock.should_receive(:or).once
490
- mock.should_receive(:and).once
491
- mock.should_receive(:and_or).once
492
- mock.should_receive(:or_and).once
493
- e1.call(nil)
494
- end
495
-
496
- FlexMock.use do |mock|
497
- e1, *_ = setup_aggregation(mock)
498
- mock.should_receive(:or).once
499
- mock.should_receive(:and).never
500
- mock.should_receive(:and_or).never
501
- mock.should_receive(:or_and).never
502
- e1.call(nil)
503
- end
504
-
505
- FlexMock.use do |mock|
506
- _, _, m1 = setup_aggregation(mock)
507
- mock.should_receive(:or).once
508
- mock.should_receive(:and).never
509
- mock.should_receive(:and_or).once
510
- mock.should_receive(:or_and).once
511
- m1.call(nil)
512
- end
513
- end
514
-
515
- def test_or_generator
516
- a, b, c = (1..3).map { EventGenerator.new(true) }.
517
- each { |e| plan.add(e) }
518
-
519
- or_event = OrGenerator.new
520
- assert(or_event.empty?)
521
- or_event << a << b
522
- assert(!or_event.empty?)
523
-
524
- or_event = (a | b)
525
- or_event.signals c
526
- assert( a.enum_for(:each_causal_link).find { |ev| ev == or_event } )
527
- assert( or_event.enum_for(:each_causal_link).find { |ev| ev == c } )
528
- a.call(nil)
529
- assert(c.happened?)
530
- assert( or_event.happened? )
531
- end
532
-
533
- def test_or_emission
534
- plan.add(or_event = OrGenerator.new)
535
- events = (1..4).map { EventGenerator.new(true) }.
536
- each { |e| or_event << e }
537
-
538
- FlexMock.use do |mock|
539
- or_event.on { mock.called }
540
- mock.should_receive(:called).once
541
- events.each_with_index do |ev, i|
542
- ev.call(nil)
543
- assert(ev.happened?)
544
- end
545
- end
546
- end
547
-
548
- def test_or_reset
549
- plan.add(or_event = OrGenerator.new)
550
- events = (1..4).map { EventGenerator.new(true) }.
551
- each { |e| or_event << e }
552
-
553
- FlexMock.use do |mock|
554
- events.each_with_index do |ev, i|
555
- ev.call
556
- assert_equal(i + 1, or_event.history.size)
557
- or_event.reset
558
- end
559
- end
560
- end
561
-
562
- def test_or_unreachability
563
- # Test unreachability properties
564
- a, b = (1..3).map { EventGenerator.new(true) }.
565
- each { |e| plan.add(e) }
566
- or_event = (a | b)
567
-
568
- ## must be unreachable once emitted, but if_unreachable(true) blocks
569
- ## must not be called
570
- FlexMock.use do |mock|
571
- or_event.if_unreachable(true) do
572
- mock.unreachable
573
- end
574
- mock.should_receive(:unreachable).never
575
-
576
- assert( !or_event.unreachable? )
577
- a.call
578
- assert( !or_event.unreachable? )
579
- end
580
-
581
- ## must be unreachable if all its source events are
582
- or_event = (a | b)
583
- a.unreachable!
584
- assert(!or_event.unreachable?)
585
- b.unreachable!
586
- assert(or_event.unreachable?)
587
- end
588
-
589
-
590
- def test_until
591
- source, sink, filter, limit = 4.enum_for(:times).map { EventGenerator.new(true) }
592
- plan.add [source, sink, filter, limit]
593
-
594
- source.signals(filter)
595
- filter.until(limit).signals(sink)
596
-
597
- FlexMock.use do |mock|
598
- sink.on { mock.passed }
599
- mock.should_receive(:passed).once
600
-
601
- source.call(nil)
602
- limit.call(nil)
603
- source.call(nil)
604
- end
605
- end
606
-
607
- def test_event_creation
608
- # Test for validation of the return value of #event
609
- generator = Class.new(EventGenerator) do
610
- def new(context); [] end
611
- end.new(true)
612
- plan.add(generator)
613
-
614
- assert_raises(EmissionFailed) { generator.emit(nil) }
615
-
616
- generator = Class.new(EventGenerator) do
617
- def new(context);
618
- event_klass = Struct.new :propagation_id, :context, :generator, :sources
619
- event_klass.new(plan.engine.propagation_id, context, self)
620
- end
621
- end.new(true)
622
- plan.add(generator)
623
- assert_nothing_raised { generator.call(nil) }
624
- end
625
-
626
- def test_context_propagation
627
- FlexMock.use do |mock|
628
- e1 = EventGenerator.new { |context| mock.e1_cmd(context); e1.emit(*context) }
629
- e2 = EventGenerator.new { |context| mock.e2_cmd(context); e2.emit(*context) }
630
- e1.signals e2
631
- e1.on { |event| mock.e1(event.context) }
632
- e2.on { |event| mock.e2(event.context) }
633
- plan.add([e1, e2])
634
-
635
- mock.should_receive(:e1_cmd).with([mock]).once
636
- mock.should_receive(:e2_cmd).with([mock]).once
637
- mock.should_receive(:e1).with([mock]).once
638
- mock.should_receive(:e2).with([mock]).once
639
- e1.call(mock)
640
- end
641
-
642
- FlexMock.use do |mock|
643
- pass_through = EventGenerator.new(true)
644
- e2 = EventGenerator.new { |context| mock.e2_cmd(context); e2.emit(*context) }
645
- pass_through.signals e2
646
- pass_through.on { |event| mock.e1(event.context) }
647
- e2.on { |event| mock.e2(event.context) }
648
- plan.add([pass_through, e2])
649
-
650
- mock.should_receive(:e2_cmd).with([mock]).once
651
- mock.should_receive(:e1).with([mock]).once
652
- mock.should_receive(:e2).with([mock]).once
653
- pass_through.call(mock)
654
- end
655
-
656
- FlexMock.use do |mock|
657
- e1 = EventGenerator.new { |context| mock.e1_cmd(context); e1.emit(*context) }
658
- e2 = EventGenerator.new { |context| mock.e2_cmd(context); e2.emit(*context) }
659
- e1.signals e2
660
- e1.on { |event| mock.e1(event.context) }
661
- e2.on { |event| mock.e2(event.context) }
662
- plan.add([e1, e2])
663
-
664
- mock.should_receive(:e1_cmd).with(nil).once
665
- mock.should_receive(:e2_cmd).with(nil).once
666
- mock.should_receive(:e1).with(nil).once
667
- mock.should_receive(:e2).with(nil).once
668
- e1.call
669
- end
670
- end
671
-
672
- def test_preconditions
673
- plan.add(e1 = EventGenerator.new(true))
674
- e1.precondition("context must be non-nil") do |generator, context|
675
- context
676
- end
677
-
678
- assert_raises(EventPreconditionFailed) { e1.call(nil) }
679
- assert_nothing_raised { e1.call(true) }
680
- end
681
-
682
- def test_cancel
683
- e1 = Class.new(EventGenerator) do
684
- def calling(context)
685
- cancel("testing cancel method")
686
- end
687
- end.new(true)
688
- plan.add(e1)
689
- assert_raises(EventCanceled) { e1.call(nil) }
690
- end
691
-
692
- def test_related_events
693
- e1, e2 = (1..2).map { EventGenerator.new(true) }.
694
- each { |ev| plan.add(ev) }
695
-
696
- assert_equal([].to_value_set, e1.related_events)
697
- e1.signals e2
698
- assert_equal([e2].to_value_set, e1.related_events)
699
- assert_equal([e1].to_value_set, e2.related_events)
700
- end
701
-
702
- def test_related_tasks
703
- e1, e2 = (1..2).map { EventGenerator.new(true) }.
704
- each { |ev| plan.add(ev) }
705
- t1 = SimpleTask.new
706
-
707
- assert_equal([].to_value_set, e1.related_tasks)
708
- e1.signals t1.event(:start)
709
- assert_equal([t1].to_value_set, e1.related_tasks)
710
- end
711
-
712
- def test_command
713
- FlexMock.use do |mock|
714
- ev = EventGenerator.new do |context|
715
- ev.emit(*context)
716
- mock.called(*context)
717
- end
718
- plan.add(ev)
719
-
720
- mock.should_receive(:called).with(42).once
721
- ev.call(42)
722
-
723
- assert(ev.happened?)
724
- assert_equal(1, ev.history.size, ev.history)
725
- assert(!ev.pending?)
726
- end
727
- end
728
-
729
- def test_set_command
730
- FlexMock.use do |mock|
731
- ev = EventGenerator.new
732
- plan.add(ev)
733
- assert(!ev.controlable?)
734
-
735
- ev.command = lambda { mock.first }
736
- mock.should_receive(:first).once.ordered
737
- assert(ev.controlable?)
738
- ev.call(nil)
739
-
740
- ev.command = lambda { mock.second }
741
- mock.should_receive(:second).once.ordered
742
- assert(ev.controlable?)
743
- ev.call(nil)
744
-
745
- ev.command = nil
746
- assert(!ev.controlable?)
747
- end
748
- end
749
-
750
- def test_once
751
- plan.add(ev = EventGenerator.new(true))
752
- FlexMock.use do |mock|
753
- ev.once { mock.called_once }
754
- mock.should_receive(:called_once).once
755
-
756
- ev.call
757
- ev.call
758
- end
759
- end
760
-
761
- def test_signal_once
762
- ev1, ev2 = EventGenerator.new(true), EventGenerator.new(true)
763
- plan.add([ev1, ev2])
764
-
765
- FlexMock.use do |mock|
766
- ev1.signals_once(ev2)
767
- ev2.on { mock.called }
768
-
769
- mock.should_receive(:called).once
770
-
771
- ev1.call
772
- ev1.call
773
- end
774
- end
775
-
776
- def test_forward_once
777
- ev1, ev2 = EventGenerator.new(true), EventGenerator.new(true)
778
- plan.add([ev1, ev2])
779
-
780
- FlexMock.use do |mock|
781
- ev1.forward_to_once(ev2)
782
- ev2.on { mock.called }
783
-
784
- mock.should_receive(:called).once
785
-
786
- ev1.call
787
- ev1.call
788
- end
789
- end
790
-
791
- def test_filter
792
- ev1, ev_block, ev_value, ev_nil = (1..4).map { EventGenerator.new(true) }.
793
- each { |e| plan.add(e) }
794
-
795
- FlexMock.use do |mock|
796
- ev1.filter { |v| mock.filtering(v); v*2 }.signals ev_block
797
- ev_block.on { |ev| mock.block_filter(ev.context) }
798
-
799
- ev1.filter(42).signals ev_value
800
- ev_value.on { |ev| mock.value_filter(ev.context) }
801
-
802
- ev1.filter.signals ev_nil
803
- ev_nil.on { |ev| mock.nil_filter(ev.context) }
804
-
805
- mock.should_receive(:filtering).with(21).once
806
- mock.should_receive(:block_filter).with([ 42 ]).once
807
- mock.should_receive(:value_filter).with([42]).once
808
- mock.should_receive(:nil_filter).with(nil).once
809
- ev1.call(21)
810
- end
811
- end
812
-
813
- def test_gather_events
814
- e1, e2 = (1..2).map { EventGenerator.new(true) }.
815
- each { |e| plan.add(e) }
816
-
817
- collection = []
818
-
819
- EventGenerator.gather_events(collection, [e2])
820
- e1.call
821
- assert_equal([], collection.map { |ev| ev.generator })
822
- e2.emit(nil)
823
- assert_equal([e2], collection.map { |ev| ev.generator })
824
-
825
- collection.clear
826
- EventGenerator.gather_events(collection, [e1])
827
- e1.call
828
- assert_equal([e1], collection.map { |ev| ev.generator })
829
- e2.emit(nil)
830
- assert_equal([e1, e2], collection.map { |ev| ev.generator })
831
-
832
- # Check that the triggering events are cleared when the events are
833
- # removed from the plan
834
- collection.clear
835
- plan.remove_object(e1)
836
- assert(!EventGenerator.event_gathering.has_key?(e1))
837
-
838
- EventGenerator.remove_event_gathering(collection)
839
- end
840
-
841
- def test_achieve_with
842
- slave = EventGenerator.new
843
- master = EventGenerator.new do
844
- master.achieve_with slave
845
- end
846
- plan.add([master, slave])
847
-
848
- master.call
849
- assert(!master.happened?)
850
- slave.emit
851
- assert(master.happened?)
852
-
853
- # Test what happens if the slave fails
854
- slave = EventGenerator.new
855
- master = EventGenerator.new do
856
- master.achieve_with slave
857
- end
858
- plan.add([master, slave])
859
-
860
- master.call
861
- assert(!master.happened?)
862
- assert_raises(UnreachableEvent) { plan.remove_object(slave) }
863
-
864
- # Now test the filtering case (when a block is given)
865
- slave = EventGenerator.new
866
- master = EventGenerator.new do
867
- master.achieve_with(slave) { [21, 42] }
868
- end
869
- plan.add([master, slave])
870
-
871
- master.call
872
- slave.emit
873
- assert(master.happened?)
874
- assert_equal(nil, slave.history[0].context)
875
- assert_equal([[21, 42]], master.history[0].context)
876
- end
877
-
878
- def test_if_unreachable
879
- FlexMock.use do |mock|
880
- plan.add(ev = EventGenerator.new(true))
881
- ev.if_unreachable(false) { mock.called }
882
- ev.if_unreachable(true) { mock.canceled_called }
883
- ev.call
884
-
885
- mock.should_receive(:called).once
886
- mock.should_receive(:canceled_called).never
887
- engine.garbage_collect
888
- end
889
- end
890
-
891
- def test_when_unreachable
892
- plan.add(ev = EventGenerator.new(true))
893
- ev.when_unreachable.on { |ev| mock.unreachable_fired }
894
- ev.call
895
- engine.garbage_collect
896
- assert(ev.happened?)
897
- end
898
-
899
- def test_or_if_unreachable
900
- plan.add(e1 = EventGenerator.new(true))
901
- plan.add(e2 = EventGenerator.new(true))
902
- a = e1 | e2
903
- FlexMock.use do |mock|
904
- a.if_unreachable(false) { mock.called }
905
- mock.should_receive(:called).never
906
- plan.remove_object(e1)
907
- end
908
-
909
- FlexMock.use do |mock|
910
- a.if_unreachable(false) { mock.called }
911
- mock.should_receive(:called).once
912
- plan.remove_object(e2)
913
- end
914
- end
915
-
916
- def test_and_if_unreachable
917
- FlexMock.use do |mock|
918
- plan.add(e1 = EventGenerator.new(true))
919
- plan.add(e2 = EventGenerator.new(true))
920
- a = e1 & e2
921
-
922
- a.if_unreachable(false) { mock.called }
923
- e1.call
924
-
925
- mock.should_receive(:called).once
926
- plan.remove_object(e2)
927
- end
928
-
929
- FlexMock.use do |mock|
930
- plan.add(e1 = EventGenerator.new(true))
931
- plan.add(e2 = EventGenerator.new(true))
932
- a = e1 & e2
933
-
934
- a.if_unreachable(false) { mock.called }
935
- e1.call
936
-
937
- mock.should_receive(:called).never
938
- plan.remove_object(e1)
939
- end
940
- end
941
-
942
- def test_dup
943
- plan.add(e = EventGenerator.new(true))
944
-
945
- e.call
946
- new = e.dup
947
- e.call
948
- assert_equal(2, e.history.size)
949
- assert_equal(1, new.history.size)
950
- end
951
-
952
- def test_event_after
953
- FlexMock.use(Time) do |time_proxy|
954
- current_time = Time.now + 5
955
- time_proxy.should_receive(:now).and_return { current_time }
956
-
957
- plan.add(e = EventGenerator.new(true))
958
- e.call
959
- current_time += 0.5
960
- plan.add(delayed = e.last.after(1))
961
- delayed.poll
962
- assert(!delayed.happened?)
963
- current_time += 0.5
964
- delayed.poll
965
- assert(delayed.happened?)
966
- end
967
- end
968
- end
969
-