roby 0.7.3 → 0.8.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 (236) hide show
  1. data/History.txt +7 -5
  2. data/Manifest.txt +91 -16
  3. data/README.txt +24 -24
  4. data/Rakefile +92 -64
  5. data/app/config/app.yml +42 -43
  6. data/app/config/init.rb +26 -0
  7. data/benchmark/alloc_misc.rb +123 -0
  8. data/benchmark/discovery_latency.rb +67 -0
  9. data/benchmark/garbage_collection.rb +48 -0
  10. data/benchmark/genom.rb +31 -0
  11. data/benchmark/transactions.rb +62 -0
  12. data/bin/roby +1 -1
  13. data/bin/roby-log +16 -6
  14. data/doc/guide/.gitignore +2 -0
  15. data/doc/guide/config.yaml +34 -0
  16. data/doc/guide/ext/init.rb +14 -0
  17. data/doc/guide/ext/previous_next.rb +40 -0
  18. data/doc/guide/ext/rdoc_links.rb +33 -0
  19. data/doc/guide/index.rdoc +16 -0
  20. data/doc/guide/overview.rdoc +62 -0
  21. data/doc/guide/plan_modifications.rdoc +67 -0
  22. data/doc/guide/src/abstraction/achieve_with.page +8 -0
  23. data/doc/guide/src/abstraction/forwarding.page +8 -0
  24. data/doc/guide/src/abstraction/hierarchy.page +19 -0
  25. data/doc/guide/src/abstraction/index.page +28 -0
  26. data/doc/guide/src/abstraction/task_models.page +13 -0
  27. data/doc/guide/src/basics.template +6 -0
  28. data/doc/guide/src/basics/app.page +139 -0
  29. data/doc/guide/src/basics/code_examples.page +33 -0
  30. data/doc/guide/src/basics/dry.page +69 -0
  31. data/doc/guide/src/basics/errors.page +443 -0
  32. data/doc/guide/src/basics/events.page +179 -0
  33. data/doc/guide/src/basics/hierarchy.page +275 -0
  34. data/doc/guide/src/basics/index.page +11 -0
  35. data/doc/guide/src/basics/log_replay/goForward_1.png +0 -0
  36. data/doc/guide/src/basics/log_replay/goForward_2.png +0 -0
  37. data/doc/guide/src/basics/log_replay/goForward_3.png +0 -0
  38. data/doc/guide/src/basics/log_replay/goForward_4.png +0 -0
  39. data/doc/guide/src/basics/log_replay/goForward_5.png +0 -0
  40. data/doc/guide/src/basics/log_replay/hierarchy_error_1.png +0 -0
  41. data/doc/guide/src/basics/log_replay/hierarchy_error_2.png +0 -0
  42. data/doc/guide/src/basics/log_replay/hierarchy_error_3.png +0 -0
  43. data/doc/guide/src/basics/log_replay/plan_repair_1.png +0 -0
  44. data/doc/guide/src/basics/log_replay/plan_repair_2.png +0 -0
  45. data/doc/guide/src/basics/log_replay/plan_repair_3.png +0 -0
  46. data/doc/guide/src/basics/log_replay/plan_repair_4.png +0 -0
  47. data/doc/guide/src/basics/log_replay/roby_log_main_window.png +0 -0
  48. data/doc/guide/src/basics/log_replay/roby_log_relation_window.png +0 -0
  49. data/doc/guide/src/basics/log_replay/roby_replay_event_representation.png +0 -0
  50. data/doc/guide/src/basics/plan_objects.page +71 -0
  51. data/doc/guide/src/basics/relations_display.page +203 -0
  52. data/doc/guide/src/basics/roby_cycle_overview.png +0 -0
  53. data/doc/guide/src/basics/shell.page +102 -0
  54. data/doc/guide/src/basics/summary.page +32 -0
  55. data/doc/guide/src/basics/tasks.page +357 -0
  56. data/doc/guide/src/basics_shell_header.txt +16 -0
  57. data/doc/guide/src/cycle/cycle-overview.png +0 -0
  58. data/doc/guide/src/cycle/cycle-overview.svg +208 -0
  59. data/doc/guide/src/cycle/error_handling.page +168 -0
  60. data/doc/guide/src/cycle/error_instantaneous_repair.png +0 -0
  61. data/doc/guide/src/cycle/error_instantaneous_repair.svg +1224 -0
  62. data/doc/guide/src/cycle/garbage_collection.page +10 -0
  63. data/doc/guide/src/cycle/index.page +23 -0
  64. data/doc/guide/src/cycle/propagation.page +154 -0
  65. data/doc/guide/src/cycle/propagation_diamond.png +0 -0
  66. data/doc/guide/src/cycle/propagation_diamond.svg +1279 -0
  67. data/doc/guide/src/default.css +319 -0
  68. data/doc/guide/src/default.template +74 -0
  69. data/doc/guide/src/htmldoc.metainfo +20 -0
  70. data/doc/guide/src/htmldoc.virtual +18 -0
  71. data/doc/guide/src/images/bodybg.png +0 -0
  72. data/doc/guide/src/images/contbg.png +0 -0
  73. data/doc/guide/src/images/footerbg.png +0 -0
  74. data/doc/guide/src/images/gradient1.png +0 -0
  75. data/doc/guide/src/images/gradient2.png +0 -0
  76. data/doc/guide/src/index.page +7 -0
  77. data/doc/guide/src/introduction/index.page +29 -0
  78. data/doc/guide/src/introduction/install.page +133 -0
  79. data/doc/{papers.rdoc → guide/src/introduction/publications.page} +5 -2
  80. data/doc/{videos.rdoc → guide/src/introduction/videos.page} +4 -2
  81. data/doc/guide/src/plugins/fault_tolerance.page +44 -0
  82. data/doc/guide/src/plugins/index.page +11 -0
  83. data/doc/guide/src/plugins/subsystems.page +45 -0
  84. data/doc/guide/src/relations/dependency.page +89 -0
  85. data/doc/guide/src/relations/index.page +12 -0
  86. data/doc/misc/update_github +24 -0
  87. data/doc/tutorials/02-GoForward.rdoc +3 -3
  88. data/ext/graph/graph.cc +46 -0
  89. data/lib/roby.rb +57 -22
  90. data/lib/roby/app.rb +132 -112
  91. data/lib/roby/app/plugins/rake.rb +21 -0
  92. data/lib/roby/app/rake.rb +0 -7
  93. data/lib/roby/app/run.rb +1 -1
  94. data/lib/roby/app/scripts/distributed.rb +1 -2
  95. data/lib/roby/app/scripts/generate/bookmarks.rb +1 -1
  96. data/lib/roby/app/scripts/results.rb +2 -1
  97. data/lib/roby/app/scripts/run.rb +6 -2
  98. data/lib/roby/app/scripts/shell.rb +11 -11
  99. data/lib/roby/config.rb +1 -1
  100. data/lib/roby/decision_control.rb +62 -3
  101. data/lib/roby/distributed.rb +4 -0
  102. data/lib/roby/distributed/base.rb +8 -0
  103. data/lib/roby/distributed/communication.rb +12 -8
  104. data/lib/roby/distributed/connection_space.rb +61 -44
  105. data/lib/roby/distributed/distributed_object.rb +1 -1
  106. data/lib/roby/distributed/notifications.rb +22 -30
  107. data/lib/roby/distributed/peer.rb +13 -8
  108. data/lib/roby/distributed/proxy.rb +5 -5
  109. data/lib/roby/distributed/subscription.rb +4 -4
  110. data/lib/roby/distributed/transaction.rb +3 -3
  111. data/lib/roby/event.rb +176 -110
  112. data/lib/roby/exceptions.rb +12 -4
  113. data/lib/roby/execution_engine.rb +1604 -0
  114. data/lib/roby/external_process_task.rb +225 -0
  115. data/lib/roby/graph.rb +0 -6
  116. data/lib/roby/interface.rb +221 -137
  117. data/lib/roby/log/console.rb +5 -3
  118. data/lib/roby/log/data_stream.rb +94 -16
  119. data/lib/roby/log/dot.rb +8 -8
  120. data/lib/roby/log/event_stream.rb +13 -3
  121. data/lib/roby/log/file.rb +43 -18
  122. data/lib/roby/log/gui/basic_display_ui.rb +89 -0
  123. data/lib/roby/log/gui/chronicle_view_ui.rb +90 -0
  124. data/lib/roby/log/gui/data_displays.rb +4 -5
  125. data/lib/roby/log/gui/data_displays_ui.rb +146 -0
  126. data/lib/roby/log/gui/relations.rb +18 -18
  127. data/lib/roby/log/gui/relations_ui.rb +120 -0
  128. data/lib/roby/log/gui/relations_view_ui.rb +144 -0
  129. data/lib/roby/log/gui/replay.rb +41 -13
  130. data/lib/roby/log/gui/replay_controls.rb +3 -0
  131. data/lib/roby/log/gui/replay_controls.ui +133 -110
  132. data/lib/roby/log/gui/replay_controls_ui.rb +249 -0
  133. data/lib/roby/log/hooks.rb +19 -18
  134. data/lib/roby/log/logger.rb +7 -6
  135. data/lib/roby/log/notifications.rb +4 -4
  136. data/lib/roby/log/plan_rebuilder.rb +20 -22
  137. data/lib/roby/log/relations.rb +44 -16
  138. data/lib/roby/log/server.rb +1 -4
  139. data/lib/roby/log/timings.rb +88 -19
  140. data/lib/roby/plan-object.rb +135 -11
  141. data/lib/roby/plan.rb +408 -224
  142. data/lib/roby/planning/loops.rb +32 -25
  143. data/lib/roby/planning/model.rb +157 -51
  144. data/lib/roby/planning/task.rb +47 -20
  145. data/lib/roby/query.rb +128 -92
  146. data/lib/roby/relations.rb +254 -136
  147. data/lib/roby/relations/conflicts.rb +6 -9
  148. data/lib/roby/relations/dependency.rb +358 -0
  149. data/lib/roby/relations/ensured.rb +0 -1
  150. data/lib/roby/relations/error_handling.rb +0 -1
  151. data/lib/roby/relations/events.rb +0 -2
  152. data/lib/roby/relations/executed_by.rb +26 -11
  153. data/lib/roby/relations/planned_by.rb +14 -14
  154. data/lib/roby/robot.rb +46 -0
  155. data/lib/roby/schedulers/basic.rb +34 -0
  156. data/lib/roby/standalone.rb +4 -0
  157. data/lib/roby/standard_errors.rb +21 -15
  158. data/lib/roby/state/events.rb +5 -4
  159. data/lib/roby/support.rb +107 -6
  160. data/lib/roby/task-operations.rb +23 -19
  161. data/lib/roby/task.rb +522 -148
  162. data/lib/roby/task_index.rb +80 -0
  163. data/lib/roby/test/common.rb +283 -44
  164. data/lib/roby/test/distributed.rb +53 -37
  165. data/lib/roby/test/testcase.rb +9 -204
  166. data/lib/roby/test/tools.rb +3 -3
  167. data/lib/roby/transactions.rb +154 -111
  168. data/lib/roby/transactions/proxy.rb +40 -7
  169. data/manifest.xml +20 -0
  170. data/plugins/fault_injection/README.txt +0 -3
  171. data/plugins/fault_injection/Rakefile +2 -8
  172. data/plugins/fault_injection/app.rb +1 -1
  173. data/plugins/fault_injection/fault_injection.rb +3 -3
  174. data/plugins/fault_injection/test/test_fault_injection.rb +19 -25
  175. data/plugins/subsystems/README.txt +0 -3
  176. data/plugins/subsystems/Rakefile +2 -7
  177. data/plugins/subsystems/app.rb +27 -16
  178. data/plugins/subsystems/test/app/config/init.rb +3 -0
  179. data/plugins/subsystems/test/app/planners/main.rb +1 -1
  180. data/plugins/subsystems/test/app/tasks/services.rb +1 -1
  181. data/plugins/subsystems/test/test_subsystems.rb +23 -16
  182. data/test/distributed/test_communication.rb +32 -15
  183. data/test/distributed/test_connection.rb +28 -26
  184. data/test/distributed/test_execution.rb +59 -54
  185. data/test/distributed/test_mixed_plan.rb +34 -34
  186. data/test/distributed/test_plan_notifications.rb +26 -26
  187. data/test/distributed/test_protocol.rb +57 -48
  188. data/test/distributed/test_query.rb +11 -7
  189. data/test/distributed/test_remote_plan.rb +71 -71
  190. data/test/distributed/test_transaction.rb +50 -47
  191. data/test/mockups/external_process +28 -0
  192. data/test/planning/test_loops.rb +163 -119
  193. data/test/planning/test_model.rb +3 -3
  194. data/test/planning/test_task.rb +27 -7
  195. data/test/relations/test_conflicts.rb +3 -3
  196. data/test/relations/test_dependency.rb +324 -0
  197. data/test/relations/test_ensured.rb +2 -2
  198. data/test/relations/test_executed_by.rb +94 -19
  199. data/test/relations/test_planned_by.rb +11 -9
  200. data/test/suite_core.rb +6 -3
  201. data/test/suite_distributed.rb +1 -0
  202. data/test/suite_planning.rb +1 -0
  203. data/test/suite_relations.rb +2 -2
  204. data/test/tasks/test_external_process.rb +126 -0
  205. data/test/{test_thread_task.rb → tasks/test_thread_task.rb} +17 -20
  206. data/test/test_bgl.rb +21 -1
  207. data/test/test_event.rb +229 -155
  208. data/test/test_exceptions.rb +79 -80
  209. data/test/test_execution_engine.rb +987 -0
  210. data/test/test_gui.rb +1 -1
  211. data/test/test_interface.rb +11 -5
  212. data/test/test_log.rb +18 -7
  213. data/test/test_log_server.rb +1 -0
  214. data/test/test_plan.rb +229 -395
  215. data/test/test_query.rb +193 -35
  216. data/test/test_relations.rb +88 -8
  217. data/test/test_state.rb +55 -37
  218. data/test/test_support.rb +1 -1
  219. data/test/test_task.rb +371 -218
  220. data/test/test_testcase.rb +32 -16
  221. data/test/test_transactions.rb +211 -170
  222. data/test/test_transactions_proxy.rb +37 -19
  223. metadata +169 -71
  224. data/.gitignore +0 -29
  225. data/doc/styles/allison.css +0 -314
  226. data/doc/styles/allison.js +0 -316
  227. data/doc/styles/allison.rb +0 -276
  228. data/doc/styles/jamis.rb +0 -593
  229. data/lib/roby/control.rb +0 -746
  230. data/lib/roby/executives/simple.rb +0 -30
  231. data/lib/roby/propagation.rb +0 -562
  232. data/lib/roby/relations/hierarchy.rb +0 -239
  233. data/lib/roby/transactions/updates.rb +0 -139
  234. data/test/relations/test_hierarchy.rb +0 -158
  235. data/test/test_control.rb +0 -399
  236. data/test/test_propagation.rb +0 -210
@@ -1,4 +1,4 @@
1
- $LOAD_PATH.unshift File.expand_path('..', File.dirname(__FILE__))
1
+ $LOAD_PATH.unshift File.expand_path(File.join('..', 'lib'), File.dirname(__FILE__))
2
2
  require 'roby/test/common'
3
3
  require 'roby/state/pos'
4
4
  require 'flexmock'
@@ -283,7 +283,7 @@ class TC_State < Test::Unit::TestCase
283
283
  def test_pos_delta_event
284
284
  State.pos = Pos::Euler3D.new
285
285
 
286
- plan.discover(d = State.on_delta(:d => 10))
286
+ plan.add(d = State.on_delta(:d => 10))
287
287
  assert_kind_of(PosDeltaEvent, d)
288
288
  d.poll
289
289
  assert_equal(State.pos, d.last_value)
@@ -308,7 +308,7 @@ class TC_State < Test::Unit::TestCase
308
308
  def test_yaw_delta_event
309
309
  State.pos = Pos::Euler3D.new
310
310
 
311
- plan.discover(y = State.on_delta(:yaw => 2))
311
+ plan.add(y = State.on_delta(:yaw => 2))
312
312
  assert_kind_of(YawDeltaEvent, y)
313
313
  y.poll
314
314
  assert_equal(0, y.last_value)
@@ -327,87 +327,105 @@ class TC_State < Test::Unit::TestCase
327
327
  end
328
328
 
329
329
  def test_time_delta_event
330
- plan.discover(t = State.on_delta(:t => 3600))
331
- assert_kind_of(TimeDeltaEvent, t)
332
-
333
- t.poll
334
- assert(!t.happened?)
335
- sleep(0.5)
336
- t.poll
337
- assert(!t.happened?)
338
-
339
- t.instance_variable_set(:@last_value, Time.now - 3600)
340
- t.poll
341
- assert(1, t.history.size)
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
342
355
  end
343
356
 
344
357
  def test_timepoint_event
345
- plan.discover(ev = State.at(:t => Time.now + 0.5))
346
- ev.poll
347
- assert(!ev.happened?)
348
- sleep(0.5)
349
- ev.poll
350
- assert(ev.happened?)
351
- sleep(0.5)
352
- ev.poll
353
- assert_equal(1, ev.history.size)
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
354
372
  end
355
373
 
356
374
  def test_and_state_events
357
375
  State.pos = Pos::Euler3D.new
358
- plan.discover(ev = State.on_delta(:yaw => 2, :d => 10))
376
+ plan.add_permanent(ev = State.on_delta(:yaw => 2, :d => 10))
359
377
  assert_kind_of(AndGenerator, ev)
360
378
 
361
- Roby.poll_state_events
379
+ engine.process_events
362
380
  assert_equal(0, ev.history.size)
363
381
 
364
382
  State.pos.yaw = 1
365
383
  State.pos.x = 15
366
- Roby.poll_state_events
384
+ engine.process_events
367
385
  assert_equal(0, ev.history.size)
368
386
 
369
387
  State.pos.yaw = 2
370
- Roby.poll_state_events
388
+ engine.process_events
371
389
  assert_equal(1, ev.history.size)
372
390
 
373
391
  State.pos.yaw = 3
374
392
  State.pos.x = 25
375
- Roby.poll_state_events
393
+ engine.process_events
376
394
  assert_equal(1, ev.history.size)
377
395
 
378
396
  State.pos.yaw = 4
379
- Roby.poll_state_events
397
+ engine.process_events
380
398
  assert_equal(2, ev.history.size, ev.waiting.to_a)
381
399
  end
382
400
 
383
401
  def test_or_state_events
384
402
  State.pos = Pos::Euler3D.new
385
- plan.discover(y = State.on_delta(:yaw => 2))
403
+ plan.add_permanent(y = State.on_delta(:yaw => 2))
386
404
 
387
405
  ev = y.or(:d => 10)
388
- Roby.poll_state_events
406
+ engine.process_events
389
407
  assert_equal(0, ev.history.size)
390
408
 
391
409
  State.pos.yaw = 1
392
410
  State.pos.x = 15
393
- Roby.poll_state_events
411
+ engine.process_events
394
412
  assert_equal(1, ev.history.size)
395
413
 
396
414
  State.pos.yaw = 2
397
- Roby.poll_state_events
415
+ engine.process_events
398
416
  assert_equal(1, ev.history.size)
399
417
 
400
418
  State.pos.yaw = 3
401
- Roby.poll_state_events
419
+ engine.process_events
402
420
  assert_equal(2, ev.history.size)
403
421
 
404
422
  ev = ev.or(:t => 3600)
405
- Roby.poll_state_events
423
+ engine.process_events
406
424
  assert_equal(0, ev.history.size)
407
425
 
408
426
  time_event = plan.free_events.find { |t| t.kind_of?(TimeDeltaEvent) }
409
427
  time_event.instance_variable_set(:@last_value, Time.now - 3600)
410
- Roby.poll_state_events
428
+ engine.process_events
411
429
  assert_equal(1, ev.history.size)
412
430
  end
413
431
  end
@@ -1,4 +1,4 @@
1
- $LOAD_PATH.unshift File.expand_path('..', File.dirname(__FILE__))
1
+ $LOAD_PATH.unshift File.expand_path(File.join('..', 'lib'), File.dirname(__FILE__))
2
2
  require 'roby/test/common'
3
3
  require 'flexmock'
4
4
  require 'roby/support'
@@ -1,4 +1,4 @@
1
- $LOAD_PATH.unshift File.expand_path('..', File.dirname(__FILE__))
1
+ $LOAD_PATH.unshift File.expand_path(File.join('..', 'lib'), File.dirname(__FILE__))
2
2
  require 'roby/test/common'
3
3
  require 'roby/test/tasks/simple_task'
4
4
  require 'roby/test/tasks/empty_task'
@@ -6,40 +6,100 @@ require 'flexmock'
6
6
 
7
7
  class TC_Task < Test::Unit::TestCase
8
8
  include Roby::Test
9
+ def setup
10
+ super
11
+ Roby.app.filter_backtraces = false
12
+ end
9
13
 
10
14
  def test_model_tag
11
- my_tag = TaskModelTag.new do
12
- argument :model_tag
13
- end
14
- assert(my_tag.const_defined?(:ClassExtension))
15
- assert(my_tag::ClassExtension.method_defined?(:argument))
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
+
16
27
  task = Class.new(Task) do
17
- include my_tag
28
+ include tag2
18
29
  argument :task_tag
19
30
  end
20
- assert_equal([:task_tag, :model_tag].to_set, task.arguments.to_set)
31
+ assert_equal([:task_tag, :model_tag_2, :model_tag_1].to_set, task.arguments.to_set)
21
32
  end
22
33
 
23
- def test_arguments
24
- model = Class.new(Task) do
25
- arguments :from, :to
26
- end
27
- plan.discover(task = model.new(:from => 'B', :useless => 'bla'))
34
+ def test_arguments_declaration
35
+ model = Class.new(Task) { arguments :from, :to }
28
36
  assert_equal([], Task.arguments.to_a)
29
- assert_equal([:from, :to].to_value_set, task.model.arguments.to_value_set)
30
- assert_equal({:from => 'B', :useless => 'bla'}, task.arguments)
31
- assert_equal({:from => 'B'}, task.meaningful_arguments)
37
+ assert_equal([:from, :to].to_value_set, model.arguments.to_value_set)
38
+ end
32
39
 
33
- assert(task.partially_instanciated?)
34
- task.arguments[:to] = 'A'
35
- assert_equal('A', task.arguments[:to])
36
- assert(!task.partially_instanciated?)
37
- assert_raises(ArgumentError) { task.arguments[:to] = 10 }
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
38
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
39
91
  task.arguments[:bar] = 42
40
92
  assert_nothing_raised { task.arguments[:bar] = 43 }
41
93
  end
42
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
+
43
103
  def test_command_block
44
104
  FlexMock.use do |mock|
45
105
  model = Class.new(SimpleTask) do
@@ -48,7 +108,7 @@ class TC_Task < Test::Unit::TestCase
48
108
  emit :start
49
109
  end
50
110
  end
51
- plan.insert(task = model.new)
111
+ plan.add_mission(task = model.new)
52
112
  mock.should_receive(:start).once.with(task, [42])
53
113
  task.start!(42)
54
114
  end
@@ -70,53 +130,97 @@ class TC_Task < Test::Unit::TestCase
70
130
  end
71
131
  end
72
132
 
73
- plan.insert(task = child_m.new)
133
+ plan.add_mission(task = child_m.new)
74
134
  mock.should_receive(:parent_started).once.with(task, 21)
75
135
  mock.should_receive(:child_started).once.with(task, 42)
76
136
  task.start!(42)
77
137
  end
78
138
  end
79
139
 
80
- Precedence = Roby::EventStructure::Precedence
81
- def assert_direct_precedence(task, relations)
82
- relations.each do |from, to|
83
- from = task.event(from)
84
- to = to.map { |sym| task.event(sym) }
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
85
154
 
86
- assert_equal(to.to_value_set, from.child_objects(Precedence).to_value_set, from.symbol)
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)
87
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)
88
181
  end
89
182
 
90
- def test_instantiate_model_event_relations
91
- # Create a task model with two intermediate events being
92
- # linked by a causal link
93
- task = Class.new(Roby::Test::SimpleTask) do
94
- event :first
95
- event :second
96
- event :third
97
- causal_link :first => :third
98
- causal_link :second => :third
99
- end.new
100
- plan.discover(task)
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
101
192
 
102
- assert_direct_precedence task,
103
- :start => [:first, :second, :updated_data],
104
- :first => [:third],
105
- :second => [:third],
106
- :third => [:success, :aborted],
107
- :aborted => [:failed],
108
- :failed => [:stop],
109
- :success => [:stop]
193
+ task = base.new
194
+ assert_task_relation_set task, relation,
195
+ Hash[:e1 => [:e2, :e3]].merge(additional_links)
110
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)
111
216
  end
112
217
 
113
218
  # Test the behaviour of Task#on, and event propagation inside a task
114
- def test_instance_on
115
- plan.discover(t1 = SimpleTask.new)
219
+ def test_instance_event_handlers
220
+ plan.add(t1 = SimpleTask.new)
116
221
  assert_raises(ArgumentError) { t1.on(:start) }
117
222
 
118
- # Test command handlers
119
- plan.discover(task = SimpleTask.new)
223
+ plan.add(task = SimpleTask.new)
120
224
  FlexMock.use do |mock|
121
225
  task.on(:start) { |event| mock.started(event.context) }
122
226
  task.on(:start) { |event| task.emit(:success, *event.context) }
@@ -130,38 +234,64 @@ class TC_Task < Test::Unit::TestCase
130
234
  assert(task.finished?)
131
235
  event_history = task.history.map { |ev| ev.generator }
132
236
  assert_equal([task.event(:start), task.event(:success), task.event(:stop)], event_history)
237
+ end
133
238
 
134
- # Same test, but with signals
239
+ def test_instance_signals
135
240
  FlexMock.use do |mock|
136
- t1, t2 = prepare_plan :discover => 2, :model => SimpleTask
137
- t1.on(:start, t2)
138
- t2.on(:start) { mock.start }
241
+ t1, t2 = prepare_plan :add => 3, :model => SimpleTask
242
+ t1.signals(:start, t2, :start)
139
243
 
140
- mock.should_receive(:start).once
244
+ t2.on(:start) { mock.start }
245
+ mock.should_receive(:start).once
141
246
  t1.start!
142
247
  end
248
+ end
143
249
 
250
+ def test_instance_signals_deprecated_default_event_name
144
251
  FlexMock.use do |mock|
145
- t1, t2 = prepare_plan :discover => 2, :model => SimpleTask
146
- t2.start!
252
+ t1, t2 = prepare_plan :add => 3, :model => SimpleTask
253
+ deprecated_feature do
254
+ t1.on(:start, t2)
255
+ end
147
256
 
148
- t1.on(:start, t2, :stop)
149
- t2.on(:start) { mock.start }
150
- t2.on(:stop) { mock.stop }
257
+ t2.on(:start) { mock.start }
258
+ mock.should_receive(:start).once
259
+ t1.start!
260
+ end
261
+ end
151
262
 
152
- mock.should_receive(:start).never
153
- mock.should_receive(:stop).once
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
154
272
  t1.start!
155
273
  end
274
+ end
156
275
 
276
+ def test_instance_signals_plain_events
157
277
  t = prepare_plan :missions => 1, :model => SimpleTask
158
278
  e = EventGenerator.new(true)
159
- t.on(:start, e)
279
+ t.signals(:start, e)
160
280
  t.start!
161
281
  assert(e.happened?)
162
282
  end
163
283
 
164
- def test_model_event_handling
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
165
295
  model = Class.new(SimpleTask) do
166
296
  forward :start => :failed
167
297
  end
@@ -169,10 +299,20 @@ class TC_Task < Test::Unit::TestCase
169
299
  assert_equal({}, SimpleTask.signal_sets)
170
300
 
171
301
  assert_equal([:failed, :stop].to_value_set, model.forwardings(:start))
172
- assert_equal([:stop].to_value_set, model.forwardings(:failed))
173
- assert_equal(model.forwardings(:failed), model.enum_for(:each_forwarding, :failed).to_value_set)
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!
174
307
 
175
- # Event handlers must accept exactly one argument
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)
176
316
  assert_raises(ArgumentError) { model.on(:start) { || } }
177
317
  assert_raises(ArgumentError) { model.on(:start) { |a, b| } }
178
318
 
@@ -180,42 +320,29 @@ class TC_Task < Test::Unit::TestCase
180
320
  model.on :start do
181
321
  mock.start_called(self)
182
322
  end
183
- plan.discover(task = model.new)
323
+ plan.add(task = model.new)
184
324
  mock.should_receive(:start_called).with(task).once
185
325
  task.start!
186
- assert(task.failed?)
187
- end
188
326
 
189
- # Make sure the model-level signal is not applied to parent models
190
- plan.discover(task = SimpleTask.new)
191
- task.start!
192
- assert(!task.failed?)
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
193
332
  end
194
333
 
195
- def test_forward
334
+ def test_instance_forward_to
196
335
  FlexMock.use do |mock|
197
336
  t1, t2 = prepare_plan :missions => 2, :model => SimpleTask
198
- t1.forward(:start, t2)
337
+ t1.forward_to(:start, t2, :start)
199
338
  t2.on(:start) { mock.start }
200
339
 
201
340
  mock.should_receive(:start).once
202
341
  t1.start!
203
342
  end
343
+ end
204
344
 
205
- FlexMock.use do |mock|
206
- t1, t2 = prepare_plan :missions => 2, :model => SimpleTask
207
- t2.start!
208
-
209
- t1.forward(:start, t2, :stop)
210
- t2.on(:start) { mock.start }
211
- t2.on(:stop) { mock.stop }
212
-
213
- mock.should_receive(:start).never
214
- mock.should_receive(:stop).once
215
- t1.start!
216
- end
217
-
218
-
345
+ def test_instance_forward_to_plain_events
219
346
  FlexMock.use do |mock|
220
347
  t1 = prepare_plan :missions => 1, :model => SimpleTask
221
348
  ev = EventGenerator.new do
@@ -223,7 +350,7 @@ class TC_Task < Test::Unit::TestCase
223
350
  ev.emit
224
351
  end
225
352
  ev.on { mock.emitted }
226
- t1.forward(:start, ev)
353
+ t1.forward_to(:start, ev)
227
354
 
228
355
  mock.should_receive(:called).never
229
356
  mock.should_receive(:emitted).once
@@ -231,68 +358,78 @@ class TC_Task < Test::Unit::TestCase
231
358
  end
232
359
  end
233
360
 
234
- def test_terminal
361
+ def test_terminal_option
235
362
  klass = Class.new(Task) do
236
- event(:terminal_model, :terminal => true)
237
- event(:terminal_model_signal)
238
- forward :terminal_model_signal => :terminal_model
239
-
240
- event(:success_model, :terminal => true)
241
- event(:success_model_signal)
242
- forward :success_model_signal => :success
243
- forward :success_model_signal => :success_model
244
-
245
- event(:failure_model, :terminal => true)
246
- event(:failure_model_signal)
247
- forward :failure_model_signal => :failed
248
- forward :failure_model_signal => :failure_model
249
-
250
- event(:ev)
251
- event :controlable_terminal, :terminal => true, :command => true
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
252
388
  end
253
- assert(klass.event_model(:stop).terminal?)
254
- assert(klass.event_model(:success).terminal?)
255
- assert(klass.event_model(:failed).terminal?)
256
- assert(klass.event_model(:terminal_model).terminal?)
257
- assert(klass.event_model(:terminal_model_signal).terminal?)
258
-
259
- plan.discover(task = klass.new)
260
- assert(task.event(:stop).terminal?)
261
- assert(!task.event(:stop).success?)
262
- assert(!task.event(:stop).failure?)
263
- assert(task.event(:success).terminal?)
264
- assert(task.event(:success).success?)
265
- assert(!task.event(:success).failure?)
266
- assert(task.event(:failed).terminal?)
267
- assert(!task.event(:failed).success?)
268
- assert(task.event(:failed).failure?)
269
-
270
- ev = task.event(:ev)
271
- assert(!ev.terminal?)
272
- assert(!ev.success?)
273
- assert(!ev.failure?)
274
- ev.forward task.event(:terminal_model_signal)
275
- assert(ev.terminal?)
276
- assert(!ev.success?)
277
- assert(!ev.failure?)
278
- ev.forward task.event(:success_model_signal)
279
- assert(ev.terminal?)
280
- assert(ev.success?)
281
- assert(!ev.failure?)
282
- ev.remove_forwarding task.event(:success_model_signal)
283
- ev.forward task.event(:failure_model_signal)
284
- assert(ev.terminal?)
285
- assert(!ev.success?)
286
- assert(ev.failure?)
287
-
288
- ev.remove_forwarding task.event(:failure_model_signal)
289
- ev.remove_forwarding task.event(:terminal_model_signal)
290
- assert(!ev.terminal?)
291
- ev.forward task.event(:failure_model_signal), :delay => 0.2
292
- assert(!ev.terminal?)
293
- ev.remove_forwarding task.event(:failure_model_signal)
294
- ev.signal task.event(:controlable_terminal), :delay => 0.2
295
- assert(!ev.terminal?)
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
296
433
  end
297
434
 
298
435
  # Tests Task::event
@@ -312,8 +449,9 @@ class TC_Task < Test::Unit::TestCase
312
449
 
313
450
  klass.event :ev_terminal, :terminal => true, :command => true
314
451
 
315
- plan.discover(task = klass.new)
452
+ plan.add(task = klass.new)
316
453
  assert_respond_to(task, :start!)
454
+ assert_respond_to(task, :start?)
317
455
 
318
456
  # Test modifications to the class hierarchy
319
457
  my_event = nil
@@ -349,7 +487,7 @@ class TC_Task < Test::Unit::TestCase
349
487
  # Check validation of options[:command]
350
488
  assert_raise(ArgumentError) { klass.event :try_event, :command => "bla" }
351
489
 
352
- plan.discover(task = EmptyTask.new)
490
+ plan.add(task = EmptyTask.new)
353
491
  start_event = task.event(:start)
354
492
 
355
493
  assert_equal(start_event, task.event(:start))
@@ -371,7 +509,7 @@ class TC_Task < Test::Unit::TestCase
371
509
  failed!
372
510
  end
373
511
  end.new
374
- plan.discover(task)
512
+ plan.add(task)
375
513
 
376
514
  assert(task.pending?)
377
515
  assert(!task.starting?)
@@ -437,7 +575,7 @@ class TC_Task < Test::Unit::TestCase
437
575
 
438
576
  on(:stop) { |event| mock.stopped(event.context) }
439
577
  end
440
- plan.insert(task = model.new)
578
+ plan.add_mission(task = model.new)
441
579
 
442
580
  mock.should_receive(:starting).with([42]).once
443
581
  mock.should_receive(:started).with([42]).once
@@ -488,7 +626,7 @@ class TC_Task < Test::Unit::TestCase
488
626
  ev_models = Hash[*model.enum_for(:each_event).to_a.flatten]
489
627
  assert_equal([:start, :success, :aborted, :updated_data, :stop, :failed, :inter].to_set, ev_models.keys.to_set)
490
628
 
491
- plan.discover(task = model.new)
629
+ plan.add(task = model.new)
492
630
  ev_models = Hash[*task.model.enum_for(:each_event).to_a.flatten]
493
631
  assert_equal([:start, :success, :aborted, :updated_data, :stop, :failed, :inter].to_set, ev_models.keys.to_set)
494
632
  assert( ev_models[:start].symbol )
@@ -499,7 +637,7 @@ class TC_Task < Test::Unit::TestCase
499
637
  model = Class.new(SimpleTask) do
500
638
  event(:inter, :command => true)
501
639
  end
502
- plan.discover(task = model.new)
640
+ plan.add(task = model.new)
503
641
 
504
642
  assert_raises(CommandFailed) { task.inter! }
505
643
  assert_raises(EmissionFailed) { task.emit(:inter) }
@@ -523,7 +661,7 @@ class TC_Task < Test::Unit::TestCase
523
661
  emit :inter
524
662
  end
525
663
  end
526
- plan.discover(task = model.new)
664
+ plan.add(task = model.new)
527
665
  assert_nothing_raised { task.start! }
528
666
  end
529
667
 
@@ -535,7 +673,7 @@ class TC_Task < Test::Unit::TestCase
535
673
  event :stop, :command => true
536
674
  end
537
675
 
538
- plan.discover(task = model.new)
676
+ plan.add(task = model.new)
539
677
  task.start!
540
678
  task.emit(:stop)
541
679
  assert(!task.success?)
@@ -543,7 +681,7 @@ class TC_Task < Test::Unit::TestCase
543
681
  assert(task.finished?)
544
682
  assert_equal(task.event(:stop).last, task.terminal_event)
545
683
 
546
- plan.discover(task = model.new)
684
+ plan.add(task = model.new)
547
685
  task.start!
548
686
  task.emit(:success)
549
687
  assert(task.success?)
@@ -551,7 +689,7 @@ class TC_Task < Test::Unit::TestCase
551
689
  assert(task.finished?)
552
690
  assert_equal(task.event(:success).last, task.terminal_event)
553
691
 
554
- plan.discover(task = model.new)
692
+ plan.add(task = model.new)
555
693
  task.start!
556
694
  task.emit(:failed)
557
695
  assert(!task.success?)
@@ -565,7 +703,7 @@ class TC_Task < Test::Unit::TestCase
565
703
  flunk 'no exception raised'
566
704
  rescue klass => e
567
705
  unless msg === e.message
568
- flunk "exception message '#{e.message}' does not match the expected pattern"
706
+ flunk "exception message '#{e.message}' does not match the expected pattern #{msg}"
569
707
  end
570
708
  rescue Exception => e
571
709
  flunk "expected an exception of class #{klass} but got #{e.full_message}"
@@ -581,9 +719,7 @@ class TC_Task < Test::Unit::TestCase
581
719
  assert_raises(EventNotExecutable) { task.start! }
582
720
  assert_raises(EventNotExecutable) { task.event(:start).call }
583
721
 
584
-
585
-
586
- plan.discover(task)
722
+ plan.add(task)
587
723
  assert(task.executable?)
588
724
  assert_nothing_raised { task.event(:start).call(nil) }
589
725
 
@@ -591,7 +727,7 @@ class TC_Task < Test::Unit::TestCase
591
727
  assert_raises(ModelViolation) { task.executable = false }
592
728
 
593
729
  task = SimpleTask.new
594
- plan.insert(task)
730
+ plan.add_mission(task)
595
731
  assert(task.executable?)
596
732
  task.executable = false
597
733
  assert(!task.executable?)
@@ -599,7 +735,7 @@ class TC_Task < Test::Unit::TestCase
599
735
  assert(task.executable?)
600
736
 
601
737
  task = SimpleTask.new
602
- plan.permanent(task)
738
+ plan.add_permanent(task)
603
739
  assert(task.executable?)
604
740
  task.executable = false
605
741
  assert(!task.executable?)
@@ -639,11 +775,11 @@ class TC_Task < Test::Unit::TestCase
639
775
  if check_signaling then
640
776
  error = yield
641
777
  assert_exception_message(EventNotExecutable, substring) do
642
- exception_propagator(error, :on)
778
+ exception_propagator(error, :signals)
643
779
  end
644
780
  error = yield
645
781
  assert_exception_message(EventNotExecutable, substring) do
646
- exception_propagator(error, :forward)
782
+ exception_propagator(error, :forward_to)
647
783
  end
648
784
  end
649
785
  end
@@ -651,7 +787,7 @@ class TC_Task < Test::Unit::TestCase
651
787
  def test_exception_refinement
652
788
  # test for partially instanciation
653
789
  check_direct_start(/partially instanciated/,true) do
654
- plan.discover(task = ParameterizedTask.new)
790
+ plan.add(task = ParameterizedTask.new)
655
791
  task
656
792
  end
657
793
 
@@ -662,21 +798,21 @@ class TC_Task < Test::Unit::TestCase
662
798
 
663
799
  #test for an abstract task
664
800
  check_direct_start(/abstract/,true) do
665
- plan.discover(task = AbstractTask.new)
801
+ plan.add(task = AbstractTask.new)
666
802
  task
667
803
  end
668
804
 
669
805
  #test for a not executable plan
670
806
  erroneous_plan = NotExecutablePlan.new
671
807
  check_direct_start(/plan is not executable/,false) do
672
- erroneous_plan.discover(task = SimpleTask.new)
808
+ erroneous_plan.add(task = SimpleTask.new)
673
809
  task
674
810
  end
675
- erroneous_plan.garbage_collect
811
+ erroneous_plan.clear
676
812
 
677
813
  #test for a not executable task
678
814
  check_direct_start(/is not executable/,true) do
679
- plan.discover(task = SimpleTask.new)
815
+ plan.add(task = SimpleTask.new)
680
816
  task.executable = false
681
817
  task
682
818
  end
@@ -686,7 +822,7 @@ class TC_Task < Test::Unit::TestCase
686
822
 
687
823
  def test_task_success_failure
688
824
  FlexMock.use do |mock|
689
- plan.insert(t = EmptyTask.new)
825
+ plan.add_mission(t = EmptyTask.new)
690
826
  [:start, :success, :stop].each do |name|
691
827
  t.on(name) { mock.send(name) }
692
828
  mock.should_receive(name).once.ordered
@@ -696,7 +832,7 @@ class TC_Task < Test::Unit::TestCase
696
832
  end
697
833
 
698
834
  def aggregator_test(a, *tasks)
699
- plan.insert(a)
835
+ plan.add_mission(a)
700
836
  FlexMock.use do |mock|
701
837
  [:start, :success, :stop].each do |name|
702
838
  a.on(name) { mock.send(name) }
@@ -709,10 +845,10 @@ class TC_Task < Test::Unit::TestCase
709
845
 
710
846
  def test_task_parallel_aggregator
711
847
  t1, t2 = EmptyTask.new, EmptyTask.new
712
- plan.discover([t1, t2])
848
+ plan.add([t1, t2])
713
849
  aggregator_test((t1 | t2), t1, t2)
714
850
  t1, t2 = EmptyTask.new, EmptyTask.new
715
- plan.discover([t1, t2])
851
+ plan.add([t1, t2])
716
852
  aggregator_test( (t1 | t2).to_task, t1, t2 )
717
853
  end
718
854
 
@@ -755,7 +891,7 @@ class TC_Task < Test::Unit::TestCase
755
891
 
756
892
  task = seq.to_task(model)
757
893
 
758
- plan.insert(task)
894
+ plan.add_mission(task)
759
895
 
760
896
  assert(!seq.child_object?(t1, TaskStructure::Hierarchy))
761
897
  assert(!seq.child_object?(t2, TaskStructure::Hierarchy))
@@ -769,13 +905,13 @@ class TC_Task < Test::Unit::TestCase
769
905
  end
770
906
 
771
907
  def test_compatible_state
772
- t1, t2 = prepare_plan :discover => 2, :model => SimpleTask
908
+ t1, t2 = prepare_plan :add => 2, :model => SimpleTask
773
909
 
774
910
  assert(t1.compatible_state?(t2))
775
911
  t1.start!; assert(! t1.compatible_state?(t2) && !t2.compatible_state?(t1))
776
912
  t1.stop!; assert(t1.compatible_state?(t2) && t2.compatible_state?(t1))
777
913
 
778
- plan.discover(t1 = SimpleTask.new)
914
+ plan.add(t1 = SimpleTask.new)
779
915
  t1.start!
780
916
  t2.start!; assert(t1.compatible_state?(t2) && t2.compatible_state?(t1))
781
917
  t1.stop!; assert(t1.compatible_state?(t2) && !t2.compatible_state?(t1))
@@ -791,31 +927,33 @@ class TC_Task < Test::Unit::TestCase
791
927
  end
792
928
 
793
929
  t1, t2 = task_model.new, task_model.new
794
- plan.discover([t1, t2])
930
+ plan.add([t1, t2])
795
931
  assert(t1.fullfills?(t1.model))
796
932
  assert(t1.fullfills?(t2))
797
933
  assert(t1.fullfills?(abstract_task_model))
798
934
 
799
- plan.discover(t2 = task_model.new(:index => 2))
935
+ plan.add(t2 = task_model.new(:index => 2))
800
936
  assert(!t1.fullfills?(t2))
801
937
 
802
- plan.discover(t3 = task_model.new(:universe => 42))
938
+ plan.add(t3 = task_model.new(:universe => 42))
803
939
  assert(t3.fullfills?(t1))
804
940
  assert(!t1.fullfills?(t3))
941
+ plan.add(t3 = task_model.new(:universe => 42, :index => 21))
942
+ assert(t3.fullfills?(task_model, :universe => 42))
805
943
 
806
- plan.discover(t3 = Class.new(Task).new)
944
+ plan.add(t3 = Class.new(Task).new)
807
945
  assert(!t1.fullfills?(t3))
808
946
 
809
- plan.discover(t3 = Class.new(task_model).new)
947
+ plan.add(t3 = Class.new(task_model).new)
810
948
  assert(!t1.fullfills?(t3))
811
949
  assert(t3.fullfills?(t1))
812
950
  end
813
951
 
814
952
  def test_related_tasks
815
953
  t1, t2, t3 = (1..3).map { SimpleTask.new }.
816
- each { |t| plan.discover(t) }
817
- t1.realized_by t2
818
- t1.event(:start).on t3.event(:start)
954
+ each { |t| plan.add(t) }
955
+ t1.depends_on t2
956
+ t1.event(:start).signals t3.event(:start)
819
957
  assert_equal([t3].to_value_set, t1.event(:start).related_tasks)
820
958
  assert_equal([t2].to_value_set, t1.related_objects)
821
959
  assert_equal([t2, t3].to_value_set, t1.related_tasks)
@@ -823,9 +961,9 @@ class TC_Task < Test::Unit::TestCase
823
961
 
824
962
  def test_related_events
825
963
  t1, t2, t3 = (1..3).map { SimpleTask.new }.
826
- each { |t| plan.discover(t) }
827
- t1.realized_by t2
828
- t1.event(:start).on t3.event(:start)
964
+ each { |t| plan.add(t) }
965
+ t1.depends_on t2
966
+ t1.event(:start).signals t3.event(:start)
829
967
  assert_equal([t3.event(:start)].to_value_set, t1.related_events)
830
968
  end
831
969
 
@@ -836,7 +974,7 @@ class TC_Task < Test::Unit::TestCase
836
974
 
837
975
  # Test that the stop event will make the handler called on a running task
838
976
  FlexMock.use do |mock|
839
- plan.discover(task = model.new)
977
+ plan.add(task = model.new)
840
978
  ev = task.event(:success)
841
979
  ev.if_unreachable(false) { mock.success_called }
842
980
  ev.if_unreachable(true) { mock.success_cancel_called }
@@ -851,11 +989,11 @@ class TC_Task < Test::Unit::TestCase
851
989
  task.start!
852
990
  task.success!
853
991
  end
854
- plan.garbage_collect
992
+ engine.garbage_collect
855
993
 
856
994
  # Test that it works on pending tasks too
857
995
  FlexMock.use do |mock|
858
- plan.discover(task = model.new)
996
+ plan.add(task = model.new)
859
997
  ev = task.event(:success)
860
998
  ev.if_unreachable(false) { mock.success_called }
861
999
  ev.if_unreachable(true) { mock.success_cancel_called }
@@ -868,7 +1006,7 @@ class TC_Task < Test::Unit::TestCase
868
1006
  mock.should_receive(:ready_called).once
869
1007
  mock.should_receive(:ready_cancel_called).once
870
1008
 
871
- plan.garbage_collect
1009
+ engine.garbage_collect
872
1010
  end
873
1011
 
874
1012
  end
@@ -881,11 +1019,11 @@ class TC_Task < Test::Unit::TestCase
881
1019
  event(:start).achieve_with slave
882
1020
  end
883
1021
  end.new
884
- plan.discover([master, slave])
1022
+ plan.add([master, slave])
885
1023
 
886
1024
  master.start!
887
1025
  assert(master.starting?)
888
- assert(master.realized_by?(slave))
1026
+ assert(master.depends_on?(slave))
889
1027
  slave.start!
890
1028
  slave.success!
891
1029
  assert(master.started?)
@@ -896,7 +1034,7 @@ class TC_Task < Test::Unit::TestCase
896
1034
  event(:start).achieve_with slave.event(:start)
897
1035
  end
898
1036
  end.new
899
- plan.discover([master, slave])
1037
+ plan.add([master, slave])
900
1038
 
901
1039
  master.start!
902
1040
  assert(master.starting?)
@@ -905,7 +1043,7 @@ class TC_Task < Test::Unit::TestCase
905
1043
 
906
1044
  def test_task_group
907
1045
  t1, t2 = SimpleTask.new, SimpleTask.new
908
- plan.discover(g = Group.new(t1, t2))
1046
+ plan.add(g = Group.new(t1, t2))
909
1047
 
910
1048
  g.start!
911
1049
  assert(t1.running?)
@@ -918,7 +1056,7 @@ class TC_Task < Test::Unit::TestCase
918
1056
  end
919
1057
 
920
1058
  def test_task_poll
921
- Roby.control.run :cycle => 0.1, :detach => true
1059
+ engine.run
922
1060
 
923
1061
  FlexMock.use do |mock|
924
1062
  t = Class.new(SimpleTask) do
@@ -928,12 +1066,12 @@ class TC_Task < Test::Unit::TestCase
928
1066
  end.new
929
1067
  mock.should_receive(:polled).at_least.once.with(t)
930
1068
 
931
- Roby.execute do
932
- plan.permanent(t)
1069
+ engine.execute do
1070
+ plan.add_permanent(t)
933
1071
  t.start!
934
1072
  end
935
- sleep(1)
936
- Roby.execute do
1073
+ engine.wait_one_cycle
1074
+ engine.execute do
937
1075
  assert(t.running?, t.terminal_event.to_s)
938
1076
  t.stop!
939
1077
  end
@@ -948,11 +1086,11 @@ class TC_Task < Test::Unit::TestCase
948
1086
  end
949
1087
  end.new
950
1088
 
951
- Roby.execute do
952
- plan.permanent(t)
1089
+ engine.execute do
1090
+ plan.add_permanent(t)
953
1091
  t.start!
954
1092
  end
955
- sleep(1)
1093
+ engine.wait_one_cycle
956
1094
  assert(t.failed?)
957
1095
  end
958
1096
  end
@@ -962,15 +1100,15 @@ class TC_Task < Test::Unit::TestCase
962
1100
  event :specialized_failure, :command => true
963
1101
  forward :specialized_failure => :failed
964
1102
  end.new
965
- plan.discover(task)
1103
+ plan.add(task)
966
1104
 
967
1105
  task.start!
968
1106
  assert_equal([task.event(:start).last], task.event(:start).last.task_sources.to_a)
969
1107
 
970
1108
  ev = EventGenerator.new(true)
971
- ev.forward task.event(:specialized_failure)
1109
+ ev.forward_to task.event(:specialized_failure)
972
1110
  ev.call
973
- assert_equal([task.event(:specialized_failure).last], task.event(:failed).last.task_sources.to_a)
1111
+ assert_equal([task.event(:specialized_failure).last], task.event(:stop).last.task_sources.to_a)
974
1112
  end
975
1113
 
976
1114
  def test_virtual_task
@@ -978,7 +1116,7 @@ class TC_Task < Test::Unit::TestCase
978
1116
  assert_raises(ArgumentError) { VirtualTask.create(success, start) }
979
1117
 
980
1118
  assert_kind_of(VirtualTask, task = VirtualTask.create(start, success))
981
- plan.discover(task)
1119
+ plan.add(task)
982
1120
  assert_equal(start, task.start_event)
983
1121
  assert_equal(success, task.success_event)
984
1122
  FlexMock.use do |mock|
@@ -993,19 +1131,19 @@ class TC_Task < Test::Unit::TestCase
993
1131
  end
994
1132
 
995
1133
  start, success = EventGenerator.new(true), EventGenerator.new
996
- plan.discover(task = VirtualTask.create(start, success))
1134
+ plan.add(task = VirtualTask.create(start, success))
997
1135
  task.start!
998
1136
  plan.remove_object(success)
999
1137
  assert(task.failed?)
1000
1138
 
1001
1139
  start, success = EventGenerator.new(true), EventGenerator.new
1002
- plan.discover(success)
1003
- plan.discover(task = VirtualTask.create(start, success))
1140
+ plan.add(success)
1141
+ plan.add(task = VirtualTask.create(start, success))
1004
1142
  assert_nothing_raised { success.emit }
1005
1143
  end
1006
1144
 
1007
1145
  def test_dup
1008
- plan.discover(task = Roby::Test::SimpleTask.new)
1146
+ plan.add(task = Roby::Test::SimpleTask.new)
1009
1147
  task.start!
1010
1148
 
1011
1149
  new = task.dup
@@ -1024,5 +1162,20 @@ class TC_Task < Test::Unit::TestCase
1024
1162
  new.event(:stop).call
1025
1163
  assert(new.finished?, new.history)
1026
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
1027
1180
  end
1028
1181