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,432 +0,0 @@
1
- $LOAD_PATH.unshift File.expand_path(File.join('..', 'lib'), File.dirname(__FILE__))
2
- require 'roby/test/common'
3
- require 'roby/state/pos'
4
- require 'flexmock'
5
- require 'roby/state/events'
6
-
7
- class TC_State < Test::Unit::TestCase
8
- include Roby::Test
9
-
10
- def test_openstruct_behavior
11
- s = ExtendedStruct.new
12
- assert( s.respond_to?(:value=) )
13
- assert( ! s.respond_to?(:value) )
14
- s.value = 42
15
- assert( s.respond_to?(:value) )
16
- assert_equal(42, s.value)
17
- end
18
-
19
- def test_update
20
- s = ExtendedStruct.new
21
- s.value.update { |v| v.test = 10 }
22
- assert_equal(10, s.value.test)
23
-
24
- s.value { |v| v.test = 10 }
25
- assert_equal(10, s.value.test)
26
- end
27
-
28
- def test_send
29
- s = ExtendedStruct.new
30
- s.x = 10
31
- assert_equal(10, s.send(:x))
32
- end
33
-
34
- def test_to_hash
35
-
36
- s = ExtendedStruct.new
37
- s.a = 10
38
- s.b.a = 10
39
-
40
- assert_equal({:a => 10, :b => { :a => 10 }}, s.to_hash)
41
- assert_equal({:a => 10, :b => s.b}, s.to_hash(false))
42
- end
43
-
44
- # Somebody defines Kernel#y, one thing I try to manage
45
- module ::Kernel
46
- def y(i)
47
- end
48
- end
49
- def test_does_not_override
50
- s = ExtendedStruct.new
51
- assert_raises(ArgumentError) { s.y }
52
- s.y = 10
53
- assert_equal(10, s.y)
54
- end
55
-
56
- def test_attach
57
- s = ExtendedStruct.new
58
- child = s.child
59
- assert_not_equal(child, s.child)
60
- child = s.child
61
- child.send(:attach)
62
- assert_equal(child, s.child)
63
-
64
- s = ExtendedStruct.new
65
- child = s.child
66
- assert_equal([s, 'child'], child.send(:attach_as))
67
- s.child = 10
68
- # child should NOT attach itself to s
69
- assert_equal(10, s.child)
70
- assert( !child.send(:attach_as) )
71
-
72
- child.test = 20
73
- assert_not_equal(child, s.child)
74
- assert_equal(10, s.child)
75
- end
76
-
77
- def test_delete
78
- r = ExtendedStruct.new
79
- assert_raises(ArgumentError) { r.delete }
80
-
81
- # Check handling of pending children
82
- child = r.child
83
- child.delete
84
- child.value = 10
85
- assert(!r.child?)
86
-
87
- child = r.child
88
- r.delete(:child)
89
- child.value = 10
90
- assert(!r.child?)
91
-
92
- # Check handling of attached children
93
- r.child.value = 10
94
- assert(r.child?)
95
- r.delete(:child)
96
- assert(!r.child?)
97
-
98
- r.child.value = 10
99
- assert(r.child?)
100
- r.child.delete
101
- assert(!r.child?)
102
-
103
- # Check handling of aliases
104
- r.child.value = 10
105
- r.alias(:child, :aliased_child)
106
- assert(r.aliased_child?)
107
- r.delete(:aliased_child)
108
- assert(!r.aliased_child?)
109
-
110
- # Check handling of aliased-to members
111
- r.child.value = 10
112
- r.alias(:child, :aliased_child)
113
- assert(r.aliased_child?)
114
- r.child.delete
115
- assert(!r.aliased_child?)
116
- assert(!r.child?)
117
- end
118
-
119
- def test_empty
120
- r = ExtendedStruct.new
121
- c = r.child
122
- assert(r.empty?)
123
- r.child = 10
124
- assert(!r.empty?)
125
- r.delete(:child)
126
- assert(r.empty?)
127
- end
128
-
129
- def test_child_class
130
- klass = Class.new(ExtendedStruct)
131
- root = ExtendedStruct.new(klass)
132
- assert_equal(klass, root.child.class)
133
- end
134
-
135
- def test_export
136
- s = StateSpace.new
137
- s.pos.x = 42
138
- s.speed.x = 0
139
-
140
- obj = Marshal.load(Marshal.dump(s))
141
- assert(!obj.respond_to?(:pos))
142
- assert(!obj.respond_to?(:speed))
143
-
144
- s.export :pos
145
- obj = Marshal.load(Marshal.dump(s))
146
- assert(obj.respond_to?(:pos))
147
- assert(!obj.respond_to?(:speed))
148
- assert_equal(42, obj.pos.x)
149
-
150
- s.export :speed
151
- obj = Marshal.load(Marshal.dump(s))
152
- assert(obj.respond_to?(:pos))
153
- assert(obj.respond_to?(:speed))
154
- assert_equal(42, obj.pos.x)
155
- assert_equal(0, obj.speed.x)
156
- end
157
-
158
- def test_stable
159
- s = ExtendedStruct.new
160
- s.other.attach
161
-
162
- s.stable!
163
- assert(s.stable?)
164
- assert(!s.other.stable?)
165
- assert_raises(NoMethodError) { s.test }
166
- assert_raises(NoMethodError) { s.test = 10 }
167
- assert(! s.respond_to?(:test=))
168
- assert_nothing_raised { s.other.test }
169
- assert_nothing_raised { s.other.test = 10 }
170
-
171
- s.stable!(true)
172
- assert(s.stable?)
173
- assert_raises(NoMethodError) { s.test }
174
- assert_raises(NoMethodError) { s.test = 10 }
175
- assert(s.other.stable?)
176
- assert_raises(NoMethodError) { s.other.another_test }
177
- assert_nothing_raised { s.other.test }
178
- assert_raises(NoMethodError) { s.other.test = 10 }
179
-
180
- s.stable!(false, false)
181
- assert(!s.stable?)
182
- assert_nothing_raised { s.test }
183
- assert_nothing_raised { s.test = 10 }
184
- assert(s.other.stable?)
185
- assert_raises(NoMethodError) { s.other.another_test }
186
- assert_nothing_raised { s.other.test }
187
- assert_raises(NoMethodError) { s.other.test = 10 }
188
-
189
- s.stable!(true, false)
190
- assert(!s.stable?)
191
- assert(!s.other.stable?)
192
- assert_nothing_raised { s.test }
193
- assert_nothing_raised { s.test = 10 }
194
- assert_nothing_raised { s.other.test }
195
- assert_nothing_raised { s.other.test = 10 }
196
- end
197
-
198
- def test_filter
199
- s = ExtendedStruct.new
200
- s.filter(:test) { |v| Integer === v }
201
- assert_raises(ArgumentError) { s.test = "10" }
202
- assert_nothing_raised { s.test = 10 }
203
- end
204
-
205
- def test_alias
206
- s = ExtendedStruct.new
207
- s.value = 42
208
- s.alias(:value, :test)
209
- assert( s.respond_to?(:test) )
210
- assert_equal(42, s.value)
211
- assert_equal(42, s.test)
212
- s.value = Time.now
213
- assert_equal(s.test, s.value)
214
-
215
- # Test alias detach
216
- s.test = 10
217
- s.value = 42
218
- assert_equal(10, s.test)
219
- end
220
-
221
- def test_change_notification
222
- s = ExtendedStruct.new
223
- FlexMock.use do |mock|
224
- s.on(:value) { |v| mock.updated(v) }
225
- mock.should_receive(:updated).with(42).once
226
- s.value = 42
227
-
228
- s.on(:substruct) { |v| mock.updated_substruct(v.value) }
229
- mock.should_receive(:updated_substruct).with(24).once.ordered
230
- mock.should_receive(:updated_substruct).with(42).once.ordered
231
- s.substruct.value = 24
232
- s.substruct.value = 42
233
- end
234
- end
235
-
236
- def test_predicate
237
- s = ExtendedStruct.new
238
- s.a = false
239
- s.b = 1
240
- assert(!s.foobar?)
241
- assert(!s.a?)
242
- assert(s.b?)
243
- end
244
-
245
- def test_marshalling
246
- s = ExtendedStruct.new
247
- s.value = 42
248
- s.substruct.value = 24
249
- s.invalid = Proc.new {}
250
-
251
- s.on(:substruct) {}
252
- s.filter(:value) { |v| Numeric === v }
253
-
254
- str = nil
255
- assert_nothing_raised { str = Marshal.dump(s) }
256
- assert_nothing_raised { s = Marshal.load(str) }
257
- assert_equal(42, s.value)
258
- assert_equal(24, s.substruct.value)
259
- assert(!s.respond_to?(:invalid))
260
- end
261
-
262
- def test_forbidden_names
263
- s = ExtendedStruct.new
264
- assert_raises(NoMethodError) { s.each_blah }
265
- assert_nothing_raised { s.blato }
266
- assert_raises(NoMethodError) { s.enum_blah }
267
- assert_raises(NoMethodError) { s.to_blah }
268
- end
269
-
270
- def test_pos_euler3d
271
- p = Pos::Euler3D.new(30)
272
- assert_equal(30, p.x)
273
- assert_equal(0, p.y)
274
- assert_equal(0, p.z)
275
-
276
- assert_equal(10, p.distance(30, 10))
277
- assert_equal(0, p.distance(p))
278
- assert_equal(0, Pos::Vector3D.new(30, 10, 50).distance2d(30, 10))
279
-
280
- assert_equal(Pos::Vector3D.new(-30), -p)
281
- end
282
-
283
- def test_pos_delta_event
284
- State.pos = Pos::Euler3D.new
285
-
286
- plan.add(d = State.on_delta(:d => 10))
287
- assert_kind_of(PosDeltaEvent, d)
288
- d.poll
289
- assert_equal(State.pos, d.last_value)
290
- assert(!d.happened?)
291
-
292
- State.pos.x = 5
293
- d.poll
294
- assert(!d.happened?)
295
-
296
- State.pos.x = 10
297
- d.poll
298
- assert(1, d.history.size)
299
-
300
- d.poll
301
- assert(1, d.history.size)
302
-
303
- State.pos.x = 0
304
- d.poll
305
- assert(2, d.history.size)
306
- end
307
-
308
- def test_yaw_delta_event
309
- State.pos = Pos::Euler3D.new
310
-
311
- plan.add(y = State.on_delta(:yaw => 2))
312
- assert_kind_of(YawDeltaEvent, y)
313
- y.poll
314
- assert_equal(0, y.last_value)
315
-
316
- assert(!y.happened?)
317
- State.pos.yaw = 20
318
- y.poll
319
- assert(y.happened?)
320
-
321
- y.poll
322
- assert(1, y.history.size)
323
-
324
- State.pos.yaw = 0
325
- y.poll
326
- assert(2, y.history.size)
327
- end
328
-
329
- def test_time_delta_event
330
- FlexMock.use(Time) do |time_proxy|
331
- current_time = Time.now + 5
332
- time_proxy.should_receive(:now).and_return { current_time }
333
-
334
- plan.add(t = State.on_delta(:t => 1))
335
- assert_kind_of(TimeDeltaEvent, t)
336
-
337
- t.poll
338
- assert(!t.happened?)
339
- current_time += 0.5
340
- t.poll
341
- assert(!t.happened?)
342
-
343
- current_time += 0.5
344
- t.poll
345
- assert(1, t.history.size)
346
-
347
- current_time += 0.5
348
- t.poll
349
- assert(1, t.history.size)
350
-
351
- current_time += 0.5
352
- t.poll
353
- assert(2, t.history.size)
354
- end
355
- end
356
-
357
- def test_timepoint_event
358
- FlexMock.use(Time) do |time_proxy|
359
- current_time = Time.now + 5
360
- time_proxy.should_receive(:now).and_return { current_time }
361
-
362
- plan.add(ev = State.at(:t => current_time + 1))
363
- ev.poll
364
- assert(!ev.happened?)
365
- current_time += 1
366
- ev.poll
367
- assert(ev.happened?)
368
- current_time += 1
369
- ev.poll
370
- assert_equal(1, ev.history.size)
371
- end
372
- end
373
-
374
- def test_and_state_events
375
- State.pos = Pos::Euler3D.new
376
- plan.add_permanent(ev = State.on_delta(:yaw => 2, :d => 10))
377
- assert_kind_of(AndGenerator, ev)
378
-
379
- engine.process_events
380
- assert_equal(0, ev.history.size)
381
-
382
- State.pos.yaw = 1
383
- State.pos.x = 15
384
- engine.process_events
385
- assert_equal(0, ev.history.size)
386
-
387
- State.pos.yaw = 2
388
- engine.process_events
389
- assert_equal(1, ev.history.size)
390
-
391
- State.pos.yaw = 3
392
- State.pos.x = 25
393
- engine.process_events
394
- assert_equal(1, ev.history.size)
395
-
396
- State.pos.yaw = 4
397
- engine.process_events
398
- assert_equal(2, ev.history.size, ev.waiting.to_a)
399
- end
400
-
401
- def test_or_state_events
402
- State.pos = Pos::Euler3D.new
403
- plan.add_permanent(y = State.on_delta(:yaw => 2))
404
-
405
- ev = y.or(:d => 10)
406
- engine.process_events
407
- assert_equal(0, ev.history.size)
408
-
409
- State.pos.yaw = 1
410
- State.pos.x = 15
411
- engine.process_events
412
- assert_equal(1, ev.history.size)
413
-
414
- State.pos.yaw = 2
415
- engine.process_events
416
- assert_equal(1, ev.history.size)
417
-
418
- State.pos.yaw = 3
419
- engine.process_events
420
- assert_equal(2, ev.history.size)
421
-
422
- ev = ev.or(:t => 3600)
423
- engine.process_events
424
- assert_equal(0, ev.history.size)
425
-
426
- time_event = plan.free_events.find { |t| t.kind_of?(TimeDeltaEvent) }
427
- time_event.instance_variable_set(:@last_value, Time.now - 3600)
428
- engine.process_events
429
- assert_equal(1, ev.history.size)
430
- end
431
- end
432
-
@@ -1,16 +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/support'
5
-
6
- class TC_Utils < Test::Unit::TestCase
7
- include Roby
8
- include Roby::Test
9
-
10
- def test_define_under
11
- mod = Module.new
12
- new_mod = mod.define_under(:Foo) { Module.new }
13
- assert_equal(new_mod, mod.define_under(:Foo) { flunk("block called in #define_under") })
14
- end
15
- end
16
-
@@ -1,1181 +0,0 @@
1
- $LOAD_PATH.unshift File.expand_path(File.join('..', 'lib'), File.dirname(__FILE__))
2
- require 'roby/test/common'
3
- require 'roby/test/tasks/simple_task'
4
- require 'roby/test/tasks/empty_task'
5
- require 'flexmock'
6
-
7
- class TC_Task < Test::Unit::TestCase
8
- include Roby::Test
9
- def setup
10
- super
11
- Roby.app.filter_backtraces = false
12
- end
13
-
14
- def test_model_tag
15
- tag1 = TaskModelTag.new { argument :model_tag_1 }
16
- assert(tag1.const_defined?(:ClassExtension))
17
- assert(tag1::ClassExtension.method_defined?(:argument))
18
-
19
- tag2 = TaskModelTag.new do
20
- include tag1
21
- argument :model_tag_2
22
- end
23
- assert(tag2 < tag1)
24
- assert(tag2.const_defined?(:ClassExtension))
25
- assert(tag2::ClassExtension.method_defined?(:argument))
26
-
27
- task = Class.new(Task) do
28
- include tag2
29
- argument :task_tag
30
- end
31
- assert_equal([:task_tag, :model_tag_2, :model_tag_1].to_set, task.arguments.to_set)
32
- end
33
-
34
- def test_arguments_declaration
35
- model = Class.new(Task) { arguments :from, :to }
36
- assert_equal([], Task.arguments.to_a)
37
- assert_equal([:from, :to].to_value_set, model.arguments.to_value_set)
38
- end
39
-
40
- def test_arguments_initialization
41
- model = Class.new(Task) { arguments :arg, :to }
42
- plan.add(task = model.new(:arg => 'B'))
43
- assert_equal({:arg => 'B'}, task.arguments)
44
- assert_equal('B', task.arg)
45
- assert_equal(nil, task.to)
46
- end
47
-
48
- def test_arguments_initialization_uses_assignation_operator
49
- model = Class.new(Task) do
50
- arguments :arg, :to
51
-
52
- def arg=(value)
53
- arguments[:assigned] = true
54
- arguments[:arg] = value
55
- end
56
- end
57
-
58
- plan.add(task = model.new(:arg => 'B'))
59
- assert_equal({:arg => 'B', :assigned => true}, task.arguments)
60
- end
61
-
62
- def test_arguments_assignation
63
- model = Class.new(Task) { arguments :arg }
64
- plan.add(task = model.new)
65
- task.arguments[:arg] = 'A'
66
- assert_equal('A', task.arg)
67
- assert_equal({ :arg => 'A' }, task.arguments)
68
- end
69
-
70
- def test_arguments_assignation_operator
71
- model = Class.new(Task) { arguments :arg }
72
- plan.add(task = model.new)
73
- task.arg = 'B'
74
- assert_equal('B', task.arg)
75
- assert_equal({ :arg => 'B' }, task.arguments)
76
- end
77
-
78
- def test_meaningful_arguments
79
- model = Class.new(Task) { arguments :arg }
80
- plan.add(task = model.new(:arg => 'B', :useless => 'bla'))
81
- assert_equal({:arg => 'B', :useless => 'bla'}, task.arguments)
82
- assert_equal({:arg => 'B'}, task.meaningful_arguments)
83
- end
84
-
85
- def test_arguments_cannot_override
86
- model = Class.new(Task) { arguments :arg }
87
- plan.add(task = model.new(:arg => 'B', :useless => 'bla'))
88
- assert_raises(ArgumentError) { task.arg = 10 }
89
-
90
- # But we can override non-meaningful arguments
91
- task.arguments[:bar] = 42
92
- assert_nothing_raised { task.arguments[:bar] = 43 }
93
- end
94
-
95
- def test_arguments_partially_instanciated
96
- model = Class.new(Task) { arguments :arg0, :arg1 }
97
- plan.add(task = model.new(:arg0 => 'B', :useless => 'bla'))
98
- assert(task.partially_instanciated?)
99
- task.arg1 = 'C'
100
- assert(!task.partially_instanciated?)
101
- end
102
-
103
- def test_command_block
104
- FlexMock.use do |mock|
105
- model = Class.new(SimpleTask) do
106
- event :start do |context|
107
- mock.start(self, context)
108
- emit :start
109
- end
110
- end
111
- plan.add_mission(task = model.new)
112
- mock.should_receive(:start).once.with(task, [42])
113
- task.start!(42)
114
- end
115
- end
116
-
117
- def test_command_inheritance
118
- FlexMock.use do |mock|
119
- parent_m = Class.new(SimpleTask) do
120
- event :start do |context|
121
- mock.parent_started(self, context)
122
- emit :start
123
- end
124
- end
125
-
126
- child_m = Class.new(parent_m) do
127
- event :start do |context|
128
- mock.child_started(self, context.first)
129
- super(context.first / 2)
130
- end
131
- end
132
-
133
- plan.add_mission(task = child_m.new)
134
- mock.should_receive(:parent_started).once.with(task, 21)
135
- mock.should_receive(:child_started).once.with(task, 42)
136
- task.start!(42)
137
- end
138
- end
139
-
140
- def assert_task_relation_set(task, relation, expected)
141
- plan.add(task)
142
- task.each_event do |from|
143
- task.each_event do |to|
144
- next if from == to
145
- exp = expected[from.symbol]
146
- if exp == to.symbol || (exp.respond_to?(:include?) && exp.include?(to.symbol))
147
- assert from.child_object?(to, relation), "expected relation #{from} => #{to} in #{relation} is missing"
148
- else
149
- assert !from.child_object?(to, relation), "unexpected relation #{from} => #{to} found in #{relation}"
150
- end
151
- end
152
- end
153
- end
154
-
155
- def do_test_instantiate_model_relations(method, relation, additional_links = Hash.new)
156
- klass = Class.new(Roby::Test::SimpleTask) do
157
- 4.times { |i| event "e#{i + 1}", :command => true }
158
- send(method, :e1 => [:e2, :e3], :e4 => :stop)
159
- end
160
-
161
- plan.add(task = klass.new)
162
- expected_links = Hash[:e1 => [:e2, :e3], :e4 => :stop]
163
-
164
- assert_task_relation_set task, relation, expected_links.merge(additional_links)
165
- end
166
- def test_instantiate_model_signals
167
- do_test_instantiate_model_relations(:signal, EventStructure::Signal)
168
- end
169
- def test_instantiate_deprecated_model_on
170
- deprecated_feature do
171
- do_test_instantiate_model_relations(:on, EventStructure::Signal)
172
- end
173
- end
174
- def test_instantiate_model_forward
175
- do_test_instantiate_model_relations(:forward, EventStructure::Forwarding,
176
- :success => :stop, :aborted => :failed, :failed => :stop)
177
- end
178
- def test_instantiate_model_causal_links
179
- do_test_instantiate_model_relations(:causal_link, EventStructure::CausalLink,
180
- :success => :stop, :aborted => :failed, :failed => :stop)
181
- end
182
-
183
-
184
- def do_test_inherit_model_relations(method, relation, additional_links = Hash.new)
185
- base = Class.new(Roby::Test::SimpleTask) do
186
- 4.times { |i| event "e#{i + 1}", :command => true }
187
- send(method, :e1 => [:e2, :e3])
188
- end
189
- subclass = Class.new(base) do
190
- send(method, :e4 => :stop)
191
- end
192
-
193
- task = base.new
194
- assert_task_relation_set task, relation,
195
- Hash[:e1 => [:e2, :e3]].merge(additional_links)
196
-
197
- task = subclass.new
198
- assert_task_relation_set task, relation,
199
- Hash[:e1 => [:e2, :e3], :e4 => :stop].merge(additional_links)
200
- end
201
- def test_inherit_model_signals
202
- do_test_inherit_model_relations(:signal, EventStructure::Signal)
203
- end
204
- def test_inherit_deprecated_model_on
205
- deprecated_feature do
206
- do_test_inherit_model_relations(:on, EventStructure::Signal)
207
- end
208
- end
209
- def test_inherit_model_forward
210
- do_test_inherit_model_relations(:forward, EventStructure::Forwarding,
211
- :success => :stop, :aborted => :failed, :failed => :stop)
212
- end
213
- def test_inherit_model_causal_links
214
- do_test_inherit_model_relations(:causal_link, EventStructure::CausalLink,
215
- :success => :stop, :aborted => :failed, :failed => :stop)
216
- end
217
-
218
- # Test the behaviour of Task#on, and event propagation inside a task
219
- def test_instance_event_handlers
220
- plan.add(t1 = SimpleTask.new)
221
- assert_raises(ArgumentError) { t1.on(:start) }
222
-
223
- plan.add(task = SimpleTask.new)
224
- FlexMock.use do |mock|
225
- task.on(:start) { |event| mock.started(event.context) }
226
- task.on(:start) { |event| task.emit(:success, *event.context) }
227
- task.on(:success) { |event| mock.success(event.context) }
228
- task.on(:stop) { |event| mock.stopped(event.context) }
229
- mock.should_receive(:started).once.with([42]).ordered
230
- mock.should_receive(:success).once.with([42]).ordered
231
- mock.should_receive(:stopped).once.with([42]).ordered
232
- task.start!(42)
233
- end
234
- assert(task.finished?)
235
- event_history = task.history.map { |ev| ev.generator }
236
- assert_equal([task.event(:start), task.event(:success), task.event(:stop)], event_history)
237
- end
238
-
239
- def test_instance_signals
240
- FlexMock.use do |mock|
241
- t1, t2 = prepare_plan :add => 3, :model => SimpleTask
242
- t1.signals(:start, t2, :start)
243
-
244
- t2.on(:start) { mock.start }
245
- mock.should_receive(:start).once
246
- t1.start!
247
- end
248
- end
249
-
250
- def test_instance_signals_deprecated_default_event_name
251
- FlexMock.use do |mock|
252
- t1, t2 = prepare_plan :add => 3, :model => SimpleTask
253
- deprecated_feature do
254
- t1.on(:start, t2)
255
- end
256
-
257
- t2.on(:start) { mock.start }
258
- mock.should_receive(:start).once
259
- t1.start!
260
- end
261
- end
262
-
263
- def test_instance_signals_deprecated_on_usage
264
- FlexMock.use do |mock|
265
- t1, t2 = prepare_plan :add => 3, :model => SimpleTask
266
- deprecated_feature do
267
- t1.on(:start, t2, :start)
268
- end
269
-
270
- t2.on(:start) { mock.start }
271
- mock.should_receive(:start).once
272
- t1.start!
273
- end
274
- end
275
-
276
- def test_instance_signals_plain_events
277
- t = prepare_plan :missions => 1, :model => SimpleTask
278
- e = EventGenerator.new(true)
279
- t.signals(:start, e)
280
- t.start!
281
- assert(e.happened?)
282
- end
283
-
284
- def test_instance_signals_plain_events_deprecated_on_usage
285
- t = prepare_plan :missions => 1, :model => SimpleTask
286
- e = EventGenerator.new(true)
287
- deprecated_feature do
288
- t.on(:start, e)
289
- end
290
- t.start!
291
- assert(e.happened?)
292
- end
293
-
294
- def test_model_forwardings
295
- model = Class.new(SimpleTask) do
296
- forward :start => :failed
297
- end
298
- assert_equal({ :start => [:failed, :stop].to_value_set }, model.forwarding_sets)
299
- assert_equal({}, SimpleTask.signal_sets)
300
-
301
- assert_equal([:failed, :stop].to_value_set, model.forwardings(:start))
302
- assert_equal([:stop].to_value_set, model.forwardings(:failed))
303
- assert_equal([:stop].to_value_set, model.enum_for(:each_forwarding, :failed).to_value_set)
304
-
305
- plan.add(task = model.new)
306
- task.start!
307
-
308
- # Make sure the model-level relation is not applied to parent models
309
- plan.add(task = SimpleTask.new)
310
- task.start!
311
- assert(!task.failed?)
312
- end
313
-
314
- def test_model_event_handlers
315
- model = Class.new(SimpleTask)
316
- assert_raises(ArgumentError) { model.on(:start) { || } }
317
- assert_raises(ArgumentError) { model.on(:start) { |a, b| } }
318
-
319
- FlexMock.use do |mock|
320
- model.on :start do
321
- mock.start_called(self)
322
- end
323
- plan.add(task = model.new)
324
- mock.should_receive(:start_called).with(task).once
325
- task.start!
326
-
327
- # Make sure the model-level handler is not applied to parent models
328
- plan.add(task = SimpleTask.new)
329
- task.start!
330
- assert(!task.failed?)
331
- end
332
- end
333
-
334
- def test_instance_forward_to
335
- FlexMock.use do |mock|
336
- t1, t2 = prepare_plan :missions => 2, :model => SimpleTask
337
- t1.forward_to(:start, t2, :start)
338
- t2.on(:start) { mock.start }
339
-
340
- mock.should_receive(:start).once
341
- t1.start!
342
- end
343
- end
344
-
345
- def test_instance_forward_to_plain_events
346
- FlexMock.use do |mock|
347
- t1 = prepare_plan :missions => 1, :model => SimpleTask
348
- ev = EventGenerator.new do
349
- mock.called
350
- ev.emit
351
- end
352
- ev.on { mock.emitted }
353
- t1.forward_to(:start, ev)
354
-
355
- mock.should_receive(:called).never
356
- mock.should_receive(:emitted).once
357
- t1.start!
358
- end
359
- end
360
-
361
- def test_terminal_option
362
- klass = Class.new(Task) do
363
- event :terminal, :terminal => true
364
- end
365
- assert klass.event_model(:terminal).terminal?
366
- plan.add(task = klass.new)
367
- assert task.event(:terminal).terminal?
368
- assert task.event(:terminal).child_object?(task.event(:stop), EventStructure::Forwarding)
369
- end
370
-
371
- def test_terminal_direct_forward_in_model
372
- klass = Class.new(Task) do
373
- event :terminal
374
- forward :terminal => :stop
375
- end
376
- assert klass.event_model(:terminal).terminal?
377
- plan.add(task = klass.new)
378
- assert task.event(:terminal).terminal?
379
- end
380
-
381
- def test_terminal_indirect_forward_in_model
382
- klass = Class.new(Task) do
383
- event :terminal
384
- event :intermediate
385
-
386
- forward :intermediate => :failed
387
- forward :terminal => :intermediate
388
- end
389
- assert klass.event_model(:terminal).terminal?
390
- plan.add(task = klass.new)
391
- assert task.event(:terminal).terminal?
392
- end
393
-
394
- def test_terminal_direct_signal_in_model
395
- klass = Class.new(SimpleTask) do
396
- event :terminal
397
- signal :terminal => :stop
398
- end
399
- assert klass.event_model(:terminal).terminal?
400
- plan.add(task = klass.new)
401
- assert task.event(:terminal).terminal?
402
- end
403
-
404
- def test_terminal_indirect_signal_in_model
405
- klass = Class.new(Task) do
406
- event :terminal
407
- event :intermediate, :command => true
408
-
409
- signal :terminal => :intermediate
410
- forward :intermediate => :failed
411
- end
412
- assert klass.event_model(:terminal).terminal?
413
- plan.add(task = klass.new)
414
- assert task.event(:terminal).terminal?
415
- end
416
-
417
- def test_should_not_establish_signal_from_terminal_to_non_terminal
418
- klass = Class.new(Task) do
419
- event :terminal, :terminal => true
420
- event :intermediate
421
- end
422
- assert_raises(ArgumentError) { klass.forward :terminal => :intermediate }
423
- klass.new
424
- end
425
-
426
- def test_should_not_establish_signal_from_terminal_to_non_terminal
427
- klass = Class.new(Task) do
428
- event :terminal, :terminal => true
429
- event :intermediate, :command => true
430
- end
431
- assert_raises(ArgumentError) { klass.signal :terminal => :intermediate }
432
- klass.new
433
- end
434
-
435
- # Tests Task::event
436
- def test_event_declaration
437
- klass = Class.new(Task) do
438
- def ev_not_controlable; end
439
- def ev_method(event = :ev_method); :ev_method if event == :ev_redirected end
440
-
441
- event :ev_contingent
442
- event :ev_controlable do |*events|
443
- :ev_controlable
444
- end
445
-
446
- event :ev_not_controlable
447
- event :ev_redirected, :command => lambda { |task, event, *args| task.ev_method(event) }
448
- end
449
-
450
- klass.event :ev_terminal, :terminal => true, :command => true
451
-
452
- plan.add(task = klass.new)
453
- assert_respond_to(task, :start!)
454
- assert_respond_to(task, :start?)
455
-
456
- # Test modifications to the class hierarchy
457
- my_event = nil
458
- assert_nothing_raised { my_event = klass.const_get(:EvContingent) }
459
- assert_raise(NameError) { klass.superclass.const_get(:EvContingent) }
460
- assert_equal( TaskEvent, my_event.superclass )
461
- assert_equal( :ev_contingent, my_event.symbol )
462
- assert( klass.has_event?(:ev_contingent) )
463
-
464
- assert_nothing_raised { my_event = klass.const_get(:EvTerminal) }
465
- assert_equal( :ev_terminal, my_event.symbol )
466
-
467
- # Check properties on EvContingent
468
- assert( !klass::EvContingent.respond_to?(:call) )
469
- assert( !klass::EvContingent.controlable? )
470
- assert( !klass::EvContingent.terminal? )
471
-
472
- # Check properties on EvControlable
473
- assert( klass::EvControlable.controlable? )
474
- assert( klass::EvControlable.respond_to?(:call) )
475
- event = klass::EvControlable.new(task, task.event(:ev_controlable), 0, nil)
476
- assert_equal(:ev_controlable, klass::EvControlable.call(task, :ev_controlable))
477
-
478
- # Check Event.terminal? if :terminal => true
479
- assert( klass::EvTerminal.terminal? )
480
-
481
- # Check :controlable => [proc] behaviour
482
- assert( klass::EvRedirected.controlable? )
483
-
484
- # Check that :command => false disables controlable?
485
- assert( :ev_not_controlable, !klass::EvNotControlable.controlable? )
486
-
487
- # Check validation of options[:command]
488
- assert_raise(ArgumentError) { klass.event :try_event, :command => "bla" }
489
-
490
- plan.add(task = EmptyTask.new)
491
- start_event = task.event(:start)
492
-
493
- assert_equal(start_event, task.event(:start))
494
- assert_equal([], start_event.handlers)
495
- # Note that the start => stop forwarding is added because 'start' is
496
- # detected as terminal in the EmptyTask model
497
- assert_equal([task.event(:stop), task.event(:success)].to_set, start_event.enum_for(:each_forwarding).to_set)
498
- start_model = task.event_model(:start)
499
- assert_equal(start_model, start_event.event_model)
500
- assert_equal([:stop, :success].to_set, task.enum_for(:each_forwarding, :start).to_set)
501
- end
502
- def test_status
503
- task = Class.new(Roby::Task) do
504
- event :start do
505
- end
506
- event :failed, :terminal => true do
507
- end
508
- event :stop do
509
- failed!
510
- end
511
- end.new
512
- plan.add(task)
513
-
514
- assert(task.pending?)
515
- assert(!task.starting?)
516
- assert(!task.running?)
517
- assert(!task.success?)
518
- assert(!task.failed?)
519
- assert(!task.finishing?)
520
- assert(!task.finished?)
521
-
522
- task.start!
523
- assert(!task.pending?)
524
- assert(task.starting?)
525
- assert(!task.running?)
526
- assert(!task.success?)
527
- assert(!task.failed?)
528
- assert(!task.finishing?)
529
- assert(!task.finished?)
530
-
531
- task.emit(:start)
532
- assert(!task.pending?)
533
- assert(!task.starting?)
534
- assert(task.running?)
535
- assert(!task.success?)
536
- assert(!task.failed?)
537
- assert(!task.finishing?)
538
- assert(!task.finished?)
539
-
540
- task.stop!
541
- assert(!task.pending?)
542
- assert(!task.starting?)
543
- assert(task.running?)
544
- assert(!task.success?)
545
- assert(!task.failed?)
546
- assert(task.finishing?)
547
- assert(!task.finished?)
548
-
549
- task.emit(:failed)
550
- assert(!task.pending?)
551
- assert(!task.starting?)
552
- assert(!task.running?)
553
- assert(!task.success?)
554
- assert(task.failed?)
555
- assert(!task.finishing?)
556
- assert(task.finished?)
557
- end
558
-
559
- def test_context_propagation
560
- FlexMock.use do |mock|
561
- model = Class.new(SimpleTask) do
562
- event :start do |context|
563
- mock.starting(context)
564
- event(:start).emit(*context)
565
- end
566
- on(:start) do |event|
567
- mock.started(event.context)
568
- end
569
-
570
-
571
- event :pass_through, :command => true
572
- on(:pass_through) do |event|
573
- mock.pass_through(event.context)
574
- end
575
-
576
- on(:stop) { |event| mock.stopped(event.context) }
577
- end
578
- plan.add_mission(task = model.new)
579
-
580
- mock.should_receive(:starting).with([42]).once
581
- mock.should_receive(:started).with([42]).once
582
- mock.should_receive(:pass_through).with([10]).once
583
- mock.should_receive(:stopped).with([21]).once
584
- task.start!(42)
585
- task.pass_through!(10)
586
- task.emit(:stop, 21)
587
- assert(task.finished?)
588
- end
589
- end
590
-
591
- def test_inheritance_overloading
592
- base = Class.new(Roby::Task) do
593
- extend Test::Unit::Assertions
594
- event :ctrl, :command => true
595
- event :stop
596
- assert(!find_event_model(:stop).controlable?)
597
- end
598
-
599
- Class.new(base) do
600
- extend Test::Unit::Assertions
601
-
602
- assert_nothing_raised { event :start, :command => true }
603
- assert_raises(ArgumentError) { event :ctrl, :command => false }
604
- assert_raises(ArgumentError) { event :failed, :terminal => false }
605
- assert_raises(ArgumentError) { event :failed }
606
-
607
- assert_nothing_raised { event(:stop) { |context| } }
608
- assert(find_event_model(:stop).controlable?)
609
- end
610
-
611
- Class.new(base) do
612
- assert_nothing_raised { event(:start) { |context| } }
613
- end
614
- end
615
-
616
- def test_singleton
617
- model = Class.new(Task) do
618
- def initialize
619
- singleton_class.event(:start, :command => true)
620
- singleton_class.event(:stop)
621
- super
622
- end
623
- event :inter
624
- end
625
-
626
- ev_models = Hash[*model.enum_for(:each_event).to_a.flatten]
627
- assert_equal([:start, :success, :aborted, :updated_data, :stop, :failed, :inter].to_set, ev_models.keys.to_set)
628
-
629
- plan.add(task = model.new)
630
- ev_models = Hash[*task.model.enum_for(:each_event).to_a.flatten]
631
- assert_equal([:start, :success, :aborted, :updated_data, :stop, :failed, :inter].to_set, ev_models.keys.to_set)
632
- assert( ev_models[:start].symbol )
633
- assert( ev_models[:start].name || ev_models[:start].name.length > 0 )
634
- end
635
-
636
- def test_check_running
637
- model = Class.new(SimpleTask) do
638
- event(:inter, :command => true)
639
- end
640
- plan.add(task = model.new)
641
-
642
- assert_raises(CommandFailed) { task.inter! }
643
- assert_raises(EmissionFailed) { task.emit(:inter) }
644
- assert(!task.event(:inter).pending)
645
- task.start!
646
- assert_raise(CommandFailed) { task.start! }
647
- assert_nothing_raised { task.inter! }
648
- task.stop!
649
-
650
- assert_raises(EmissionFailed) { task.emit(:inter) }
651
- assert_raises(CommandFailed) { task.inter! }
652
- assert(!task.event(:inter).pending)
653
-
654
- model = Class.new(SimpleTask) do
655
- event :start do |context|
656
- emit :inter
657
- emit :start
658
- end
659
-
660
- event :inter do |context|
661
- emit :inter
662
- end
663
- end
664
- plan.add(task = model.new)
665
- assert_nothing_raised { task.start! }
666
- end
667
-
668
- def test_finished
669
- model = Class.new(Roby::Task) do
670
- event :start, :command => true
671
- event :failed, :command => true, :terminal => true
672
- event :success, :command => true, :terminal => true
673
- event :stop, :command => true
674
- end
675
-
676
- plan.add(task = model.new)
677
- task.start!
678
- task.emit(:stop)
679
- assert(!task.success?)
680
- assert(!task.failed?)
681
- assert(task.finished?)
682
- assert_equal(task.event(:stop).last, task.terminal_event)
683
-
684
- plan.add(task = model.new)
685
- task.start!
686
- task.emit(:success)
687
- assert(task.success?)
688
- assert(!task.failed?)
689
- assert(task.finished?)
690
- assert_equal(task.event(:success).last, task.terminal_event)
691
-
692
- plan.add(task = model.new)
693
- task.start!
694
- task.emit(:failed)
695
- assert(!task.success?)
696
- assert(task.failed?)
697
- assert(task.finished?)
698
- assert_equal(task.event(:failed).last, task.terminal_event)
699
- end
700
-
701
- def assert_exception_message(klass, msg)
702
- yield
703
- flunk 'no exception raised'
704
- rescue klass => e
705
- unless msg === e.message
706
- flunk "exception message '#{e.message}' does not match the expected pattern #{msg}"
707
- end
708
- rescue Exception => e
709
- flunk "expected an exception of class #{klass} but got #{e.full_message}"
710
- end
711
-
712
- def test_executable
713
- model = Class.new(SimpleTask) do
714
- event(:inter, :command => true)
715
- end
716
- task = model.new
717
-
718
- assert(!task.executable?)
719
- assert_raises(EventNotExecutable) { task.start! }
720
- assert_raises(EventNotExecutable) { task.event(:start).call }
721
-
722
- plan.add(task)
723
- assert(task.executable?)
724
- assert_nothing_raised { task.event(:start).call(nil) }
725
-
726
- # The task is running, cannot change the executable flag
727
- assert_raises(ModelViolation) { task.executable = false }
728
-
729
- task = SimpleTask.new
730
- plan.add_mission(task)
731
- assert(task.executable?)
732
- task.executable = false
733
- assert(!task.executable?)
734
- task.executable = nil
735
- assert(task.executable?)
736
-
737
- task = SimpleTask.new
738
- plan.add_permanent(task)
739
- assert(task.executable?)
740
- task.executable = false
741
- assert(!task.executable?)
742
- task.executable = nil
743
- assert(task.executable?)
744
- end
745
-
746
- class ParameterizedTask < Roby::Task
747
- arguments :arg
748
- end
749
-
750
- class AbstractTask < Roby::Task
751
- abstract
752
- end
753
-
754
- class NotExecutablePlan < Roby::Plan
755
- def executable?
756
- false
757
- end
758
- end
759
-
760
- def exception_propagator(task, relation)
761
- first_task = SimpleTask.new
762
- second_task = task
763
- first_task.send(relation, :start, second_task, :start)
764
- first_task.start!
765
- end
766
-
767
- def check_direct_start(substring, check_signaling)
768
- error = yield
769
- assert_exception_message(EventNotExecutable, substring) { error.start! }
770
- error = yield
771
- assert_exception_message(EventNotExecutable, substring) {error.event(:start).call(nil)}
772
- error = yield
773
- assert_exception_message(EventNotExecutable, substring) {error.event(:start).emit(nil)}
774
-
775
- if check_signaling then
776
- error = yield
777
- assert_exception_message(EventNotExecutable, substring) do
778
- exception_propagator(error, :signals)
779
- end
780
- error = yield
781
- assert_exception_message(EventNotExecutable, substring) do
782
- exception_propagator(error, :forward_to)
783
- end
784
- end
785
- end
786
-
787
- def test_exception_refinement
788
- # test for partially instanciation
789
- check_direct_start(/partially instanciated/,true) do
790
- plan.add(task = ParameterizedTask.new)
791
- task
792
- end
793
-
794
- #test for a task that is in no plan
795
- check_direct_start(/no plan/,false) do
796
- SimpleTask.new
797
- end
798
-
799
- #test for an abstract task
800
- check_direct_start(/abstract/,true) do
801
- plan.add(task = AbstractTask.new)
802
- task
803
- end
804
-
805
- #test for a not executable plan
806
- erroneous_plan = NotExecutablePlan.new
807
- check_direct_start(/plan is not executable/,false) do
808
- erroneous_plan.add(task = SimpleTask.new)
809
- task
810
- end
811
- erroneous_plan.clear
812
-
813
- #test for a not executable task
814
- check_direct_start(/is not executable/,true) do
815
- plan.add(task = SimpleTask.new)
816
- task.executable = false
817
- task
818
- end
819
- end
820
-
821
-
822
-
823
- def test_task_success_failure
824
- FlexMock.use do |mock|
825
- plan.add_mission(t = EmptyTask.new)
826
- [:start, :success, :stop].each do |name|
827
- t.on(name) { mock.send(name) }
828
- mock.should_receive(name).once.ordered
829
- end
830
- t.start!
831
- end
832
- end
833
-
834
- def aggregator_test(a, *tasks)
835
- plan.add_mission(a)
836
- FlexMock.use do |mock|
837
- [:start, :success, :stop].each do |name|
838
- a.on(name) { mock.send(name) }
839
- mock.should_receive(name).once.ordered
840
- end
841
- a.start!
842
- assert( tasks.all? { |t| t.finished? })
843
- end
844
- end
845
-
846
- def test_task_parallel_aggregator
847
- t1, t2 = EmptyTask.new, EmptyTask.new
848
- plan.add([t1, t2])
849
- aggregator_test((t1 | t2), t1, t2)
850
- t1, t2 = EmptyTask.new, EmptyTask.new
851
- plan.add([t1, t2])
852
- aggregator_test( (t1 | t2).to_task, t1, t2 )
853
- end
854
-
855
- def task_tuple(count)
856
- tasks = (1..count).map do
857
- t = EmptyTask.new
858
- t.executable = true
859
- t
860
- end
861
- yield(tasks)
862
- end
863
-
864
- def test_sequence
865
- task_tuple(2) { |t1, t2| aggregator_test( (t1 + t2), t1, t2 ) }
866
- task_tuple(2) do |t1, t2|
867
- s = t1 + t2
868
- aggregator_test( s.to_task, t1, t2 )
869
- assert(! t1.event(:stop).related_object?(s.event(:stop)))
870
- end
871
-
872
- task_tuple(3) do |t1, t2, t3|
873
- s = t2 + t3
874
- s.unshift t1
875
- aggregator_test(s, t1, t2, t3)
876
- end
877
-
878
- task_tuple(3) do |t1, t2, t3|
879
- s = t2 + t3
880
- s.unshift t1
881
- aggregator_test(s.to_task, t1, t2, t3)
882
- end
883
- end
884
- def test_sequence_to_task
885
- model = Class.new(SimpleTask)
886
- t1, t2 = prepare_plan :tasks => 2, :model => SimpleTask
887
-
888
- seq = (t1 + t2)
889
- assert(seq.child_object?(t1, TaskStructure::Hierarchy))
890
- assert(seq.child_object?(t2, TaskStructure::Hierarchy))
891
-
892
- task = seq.to_task(model)
893
-
894
- plan.add_mission(task)
895
-
896
- assert(!seq.child_object?(t1, TaskStructure::Hierarchy))
897
- assert(!seq.child_object?(t2, TaskStructure::Hierarchy))
898
-
899
- task.start!
900
- assert(t1.running?)
901
- t1.success!
902
- assert(t2.running?)
903
- t2.success!
904
- assert(task.success?)
905
- end
906
-
907
- def test_compatible_state
908
- t1, t2 = prepare_plan :add => 2, :model => SimpleTask
909
-
910
- assert(t1.compatible_state?(t2))
911
- t1.start!; assert(! t1.compatible_state?(t2) && !t2.compatible_state?(t1))
912
- t1.stop!; assert(t1.compatible_state?(t2) && t2.compatible_state?(t1))
913
-
914
- plan.add(t1 = SimpleTask.new)
915
- t1.start!
916
- t2.start!; assert(t1.compatible_state?(t2) && t2.compatible_state?(t1))
917
- t1.stop!; assert(t1.compatible_state?(t2) && !t2.compatible_state?(t1))
918
- end
919
-
920
- def test_fullfills
921
- abstract_task_model = TaskModelTag.new do
922
- argument :abstract
923
- end
924
- task_model = Class.new(Task) do
925
- include abstract_task_model
926
- argument :index, :universe
927
- end
928
-
929
- t1, t2 = task_model.new, task_model.new
930
- plan.add([t1, t2])
931
- assert(t1.fullfills?(t1.model))
932
- assert(t1.fullfills?(t2))
933
- assert(t1.fullfills?(abstract_task_model))
934
-
935
- plan.add(t2 = task_model.new(:index => 2))
936
- assert(!t1.fullfills?(t2))
937
-
938
- plan.add(t3 = task_model.new(:universe => 42))
939
- assert(t3.fullfills?(t1))
940
- assert(!t1.fullfills?(t3))
941
- plan.add(t3 = task_model.new(:universe => 42, :index => 21))
942
- assert(t3.fullfills?(task_model, :universe => 42))
943
-
944
- plan.add(t3 = Class.new(Task).new)
945
- assert(!t1.fullfills?(t3))
946
-
947
- plan.add(t3 = Class.new(task_model).new)
948
- assert(!t1.fullfills?(t3))
949
- assert(t3.fullfills?(t1))
950
- end
951
-
952
- def test_related_tasks
953
- t1, t2, t3 = (1..3).map { SimpleTask.new }.
954
- each { |t| plan.add(t) }
955
- t1.depends_on t2
956
- t1.event(:start).signals t3.event(:start)
957
- assert_equal([t3].to_value_set, t1.event(:start).related_tasks)
958
- assert_equal([t2].to_value_set, t1.related_objects)
959
- assert_equal([t2, t3].to_value_set, t1.related_tasks)
960
- end
961
-
962
- def test_related_events
963
- t1, t2, t3 = (1..3).map { SimpleTask.new }.
964
- each { |t| plan.add(t) }
965
- t1.depends_on t2
966
- t1.event(:start).signals t3.event(:start)
967
- assert_equal([t3.event(:start)].to_value_set, t1.related_events)
968
- end
969
-
970
- def test_if_unreachable
971
- model = Class.new(SimpleTask) do
972
- event :ready
973
- end
974
-
975
- # Test that the stop event will make the handler called on a running task
976
- FlexMock.use do |mock|
977
- plan.add(task = model.new)
978
- ev = task.event(:success)
979
- ev.if_unreachable(false) { mock.success_called }
980
- ev.if_unreachable(true) { mock.success_cancel_called }
981
- mock.should_receive(:success_called).once
982
- mock.should_receive(:success_cancel_called).never
983
- ev = task.event(:ready)
984
- ev.if_unreachable(false) { mock.ready_called }
985
- ev.if_unreachable(true) { mock.ready_cancel_called }
986
- mock.should_receive(:ready_called).once
987
- mock.should_receive(:ready_cancel_called).once
988
-
989
- task.start!
990
- task.success!
991
- end
992
- engine.garbage_collect
993
-
994
- # Test that it works on pending tasks too
995
- FlexMock.use do |mock|
996
- plan.add(task = model.new)
997
- ev = task.event(:success)
998
- ev.if_unreachable(false) { mock.success_called }
999
- ev.if_unreachable(true) { mock.success_cancel_called }
1000
- mock.should_receive(:success_called).once
1001
- mock.should_receive(:success_cancel_called).once
1002
-
1003
- ev = task.event(:ready)
1004
- ev.if_unreachable(false) { mock.ready_called }
1005
- ev.if_unreachable(true) { mock.ready_cancel_called }
1006
- mock.should_receive(:ready_called).once
1007
- mock.should_receive(:ready_cancel_called).once
1008
-
1009
- engine.garbage_collect
1010
- end
1011
-
1012
- end
1013
-
1014
- def test_achieve_with
1015
- slave = SimpleTask.new
1016
- master = Class.new(Task) do
1017
- terminates
1018
- event :start do
1019
- event(:start).achieve_with slave
1020
- end
1021
- end.new
1022
- plan.add([master, slave])
1023
-
1024
- master.start!
1025
- assert(master.starting?)
1026
- assert(master.depends_on?(slave))
1027
- slave.start!
1028
- slave.success!
1029
- assert(master.started?)
1030
-
1031
- slave = SimpleTask.new
1032
- master = Class.new(Task) do
1033
- event :start do
1034
- event(:start).achieve_with slave.event(:start)
1035
- end
1036
- end.new
1037
- plan.add([master, slave])
1038
-
1039
- master.start!
1040
- assert(master.starting?)
1041
- assert_raises(UnreachableEvent) { plan.remove_object(slave) }
1042
- end
1043
-
1044
- def test_task_group
1045
- t1, t2 = SimpleTask.new, SimpleTask.new
1046
- plan.add(g = Group.new(t1, t2))
1047
-
1048
- g.start!
1049
- assert(t1.running?)
1050
- assert(t2.running?)
1051
-
1052
- t1.success!
1053
- assert(g.running?)
1054
- t2.success!
1055
- assert(g.success?)
1056
- end
1057
-
1058
- def test_task_poll
1059
- engine.run
1060
-
1061
- FlexMock.use do |mock|
1062
- t = Class.new(SimpleTask) do
1063
- poll do
1064
- mock.polled(self)
1065
- end
1066
- end.new
1067
- mock.should_receive(:polled).at_least.once.with(t)
1068
-
1069
- engine.execute do
1070
- plan.add_permanent(t)
1071
- t.start!
1072
- end
1073
- engine.wait_one_cycle
1074
- engine.execute do
1075
- assert(t.running?, t.terminal_event.to_s)
1076
- t.stop!
1077
- end
1078
- end
1079
-
1080
- FlexMock.use do |mock|
1081
- mock.should_receive(:polled).at_least.once
1082
- t = Class.new(SimpleTask) do
1083
- poll do
1084
- mock.polled(self)
1085
- raise ArgumentError
1086
- end
1087
- end.new
1088
-
1089
- engine.execute do
1090
- plan.add_permanent(t)
1091
- t.start!
1092
- end
1093
- engine.wait_one_cycle
1094
- assert(t.failed?)
1095
- end
1096
- end
1097
-
1098
- def test_event_task_sources
1099
- task = Class.new(SimpleTask) do
1100
- event :specialized_failure, :command => true
1101
- forward :specialized_failure => :failed
1102
- end.new
1103
- plan.add(task)
1104
-
1105
- task.start!
1106
- assert_equal([task.event(:start).last], task.event(:start).last.task_sources.to_a)
1107
-
1108
- ev = EventGenerator.new(true)
1109
- ev.forward_to task.event(:specialized_failure)
1110
- ev.call
1111
- assert_equal([task.event(:specialized_failure).last], task.event(:stop).last.task_sources.to_a)
1112
- end
1113
-
1114
- def test_virtual_task
1115
- start, success = EventGenerator.new(true), EventGenerator.new
1116
- assert_raises(ArgumentError) { VirtualTask.create(success, start) }
1117
-
1118
- assert_kind_of(VirtualTask, task = VirtualTask.create(start, success))
1119
- plan.add(task)
1120
- assert_equal(start, task.start_event)
1121
- assert_equal(success, task.success_event)
1122
- FlexMock.use do |mock|
1123
- start.on { mock.start_event }
1124
- task.event(:start).on { mock.start_task }
1125
- mock.should_receive(:start_event).once.ordered
1126
- mock.should_receive(:start_task).once.ordered
1127
- task.start!
1128
-
1129
- success.emit
1130
- assert(task.success?)
1131
- end
1132
-
1133
- start, success = EventGenerator.new(true), EventGenerator.new
1134
- plan.add(task = VirtualTask.create(start, success))
1135
- task.start!
1136
- plan.remove_object(success)
1137
- assert(task.failed?)
1138
-
1139
- start, success = EventGenerator.new(true), EventGenerator.new
1140
- plan.add(success)
1141
- plan.add(task = VirtualTask.create(start, success))
1142
- assert_nothing_raised { success.emit }
1143
- end
1144
-
1145
- def test_dup
1146
- plan.add(task = Roby::Test::SimpleTask.new)
1147
- task.start!
1148
-
1149
- new = task.dup
1150
- assert_not_same(new.event(:stop), task.event(:stop))
1151
- assert_same(new, new.event(:stop).task)
1152
- assert(plan.include?(new))
1153
- assert_kind_of(Roby::TaskArguments, new.arguments)
1154
- assert_equal(task.arguments.to_hash, new.arguments.to_hash)
1155
- assert_same(plan, new.plan)
1156
- assert(new.event(:failed).child_object?(new.event(:stop), Roby::EventStructure::Forwarding))
1157
-
1158
- task.stop!
1159
- assert(!task.running?)
1160
- assert(new.running?)
1161
-
1162
- new.event(:stop).call
1163
- assert(new.finished?, new.history)
1164
- end
1165
-
1166
- def test_failed_to_start
1167
- plan.add(task = Roby::Test::SimpleTask.new)
1168
- begin
1169
- task.event(:start).emit_failed
1170
- rescue Exception
1171
- end
1172
- assert task.failed_to_start?
1173
- assert task.failed?
1174
- assert !task.pending?
1175
- assert !task.running?
1176
- assert [], plan.find_tasks.pending.to_a
1177
- assert [], plan.find_tasks.running.to_a
1178
- assert [task], plan.find_tasks.failed.to_a
1179
- end
1180
- end
1181
-