roby 0.7.3 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
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/test/tasks/simple_task'
4
4
  require 'roby/test/tasks/empty_task'
@@ -1,14 +1,20 @@
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
+ require 'roby/interface'
3
4
  require 'flexmock'
4
5
 
5
6
  class TC_Interface < Test::Unit::TestCase
6
7
  include Roby::Test
7
8
 
9
+ def setup
10
+ super
11
+ Roby.app.filter_backtraces = false
12
+ end
13
+
14
+
8
15
  include Roby::Planning
9
16
  def test_method_missing
10
- control = Roby.control
11
- iface = Interface.new(control)
17
+ iface = Interface.new(engine)
12
18
 
13
19
  task_model = Class.new(Task)
14
20
 
@@ -16,9 +22,9 @@ class TC_Interface < Test::Unit::TestCase
16
22
  planner = Class.new(Planner) do
17
23
  method(:null_task) { result_task = task_model.new }
18
24
  end
19
- control.planners << planner
25
+ Roby.app.planners << planner
20
26
 
21
- control.run :detach => true
27
+ engine.run
22
28
  returned_task = iface.null_task! do |_, planner|
23
29
  planner.start!
24
30
  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 'roby/test/distributed'
4
4
  require 'roby/test/tasks/simple_task'
@@ -17,6 +17,7 @@ class TC_Log < Test::Unit::TestCase
17
17
 
18
18
  def test_start_stop_logger
19
19
  FlexMock.use do |mock|
20
+ mock.should_receive(:close).once
20
21
  Log.add_logger mock
21
22
  assert(Log.logging?)
22
23
  assert_nothing_raised { Log.start_logging }
@@ -29,40 +30,48 @@ class TC_Log < Test::Unit::TestCase
29
30
 
30
31
  def test_misc
31
32
  FlexMock.use do |mock|
33
+ mock.should_receive(:logs_message?).with(:flush).and_return(false)
34
+ mock.should_receive(:logs_message?).with(:event).and_return(true)
32
35
  mock.should_receive(:splat?).and_return(true)
33
36
  mock.should_receive(:event).with(1, 2)
34
37
  mock.should_receive(:flush)
38
+ mock.should_receive(:close).once
35
39
  Log.add_logger mock
36
40
 
37
- assert(Log.has_logger?(:flush))
41
+ assert(!Log.has_logger?(:flush))
38
42
  assert(Log.has_logger?(:event))
39
43
 
40
44
  assert_equal([mock], Log.enum_for(:each_logger, :event).to_a)
41
45
  assert_equal([], Log.enum_for(:each_logger, :bla).to_a)
46
+ Log.remove_logger mock
42
47
  end
43
48
  end
44
49
 
45
50
  def test_message_splat
46
51
  FlexMock.use do |mock|
52
+ mock.should_receive(:logs_message?).and_return(true)
47
53
  mock.should_receive(:splat?).and_return(true).twice
48
54
  mock.should_receive(:splat_event).with(FlexMock.any, 1, 2).once
49
55
  mock.should_receive(:flush).once
56
+ mock.should_receive(:close).once
50
57
  Log.add_logger mock
51
58
 
52
59
  Log.log(:splat_event) { [1, 2] }
53
- Log.flush
60
+ Log.remove_logger mock
54
61
  end
55
62
  end
56
63
 
57
64
  def test_message_nonsplat
58
65
  FlexMock.use do |mock|
66
+ mock.should_receive(:logs_message?).and_return(true)
59
67
  mock.should_receive(:splat?).and_return(false).twice
60
68
  mock.should_receive(:nonsplat_event).with(FlexMock.any, [1, 2]).once
61
69
  mock.should_receive(:flush).once
70
+ mock.should_receive(:close).once
62
71
  Log.add_logger mock
63
72
 
64
73
  Log.log(:nonsplat_event) { [1, 2] }
65
- Log.flush
74
+ Log.remove_logger mock
66
75
  end
67
76
  end
68
77
 
@@ -74,6 +83,7 @@ class TC_Log < Test::Unit::TestCase
74
83
  def test_known_objects_management
75
84
  t1, t2 = SimpleTask.new, SimpleTask.new
76
85
  FlexMock.use do |mock|
86
+ mock.should_receive(:logs_message?).and_return(true)
77
87
  mock.should_receive(:splat?).and_return(true)
78
88
  mock.should_receive(:added_task_child).
79
89
  with(FlexMock.any, on_marshalled_task(t1), [TaskStructure::Hierarchy].droby_dump(nil),
@@ -83,7 +93,7 @@ class TC_Log < Test::Unit::TestCase
83
93
  task_set.map { |obj| obj.remote_siblings[Roby::Distributed.droby_dump(nil)] }.to_set == [t1.remote_id, t2.remote_id].to_set
84
94
  end
85
95
 
86
- mock.should_receive(:discovered_tasks).
96
+ mock.should_receive(:added_tasks).
87
97
  with(FlexMock.any, FlexMock.any, match_discovered_set).
88
98
  once
89
99
  mock.should_receive(:removed_task_child).
@@ -92,12 +102,13 @@ class TC_Log < Test::Unit::TestCase
92
102
  mock.should_receive(:finalized_task).
93
103
  with(FlexMock.any, FlexMock.any, t1.remote_id).
94
104
  once
105
+ mock.should_receive(:close).once
95
106
 
96
107
  Log.add_logger mock
97
108
  begin
98
- t1.realized_by t2
109
+ t1.depends_on t2
99
110
  assert(Log.known_objects.empty?)
100
- plan.discover(t1)
111
+ plan.add(t1)
101
112
  assert_equal([t1, t2].to_value_set, Log.known_objects)
102
113
  t1.remove_child t2
103
114
  assert_equal([t1, t2].to_value_set, Log.known_objects)
@@ -1,3 +1,4 @@
1
+ $LOAD_PATH.unshift File.expand_path(File.join('..', 'lib'), File.dirname(__FILE__))
1
2
  require 'roby/test/distributed'
2
3
  require 'roby/log/server'
3
4
 
@@ -1,7 +1,5 @@
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
- require 'roby/log'
4
- require 'roby/state/information'
5
3
  require 'roby/test/tasks/simple_task'
6
4
 
7
5
  require 'flexmock'
@@ -9,169 +7,225 @@ require 'flexmock'
9
7
 
10
8
  module TC_PlanStatic
11
9
  include Roby
10
+ include Roby::Test
12
11
 
13
- def test_add_remove
14
- t1 = Task.new
15
-
16
- plan.discover(t1)
17
- assert(plan.include?(t1))
18
- assert(!plan.mission?(t1))
19
- assert(!plan.permanent?(t1))
20
-
21
- plan.remove_task(t1)
22
- assert(!plan.include?(t1))
23
- assert(!plan.mission?(t1))
24
- assert(!plan.permanent?(t1))
25
-
26
- plan.insert(t1 = Task.new)
27
- assert(plan.include?(t1))
28
- assert(plan.mission?(t1))
29
- assert(t1.mission?)
30
- assert(!plan.permanent?(t1))
31
-
32
- plan.discard(t1)
33
- assert(plan.include?(t1))
34
- assert(!plan.mission?(t1))
35
- assert(!t1.mission?)
36
- assert(!plan.permanent?(t1))
37
- plan.remove_task(t1)
38
-
39
- plan.discover(t1 = Task.new)
40
- assert(plan.include?(t1))
41
- assert(!plan.mission?(t1))
42
- plan.insert(t1)
43
- assert(plan.mission?(t1))
44
- assert(t1.mission?)
45
- plan.remove_task(t1)
46
-
47
- plan.permanent(t1 = Task.new)
48
- assert(plan.include?(t1))
49
- assert(!plan.mission?(t1))
50
- assert(!t1.mission?)
51
- assert(plan.permanent?(t1))
52
- plan.auto(t1)
53
- assert(plan.include?(t1))
54
- assert(!plan.mission?(t1))
55
- assert(!t1.mission?)
56
- assert(!plan.permanent?(t1))
57
-
58
- plan.permanent(t1)
59
- plan.remove_task(t1)
60
- assert(!plan.include?(t1))
61
- assert(!plan.mission?(t1))
62
- assert(!t1.mission?)
63
- assert(!plan.permanent?(t1))
64
- end
65
-
66
- def test_plan_remove_object
67
- t1, t2 = prepare_plan :tasks => 2
68
- plan.discover(e = EventGenerator.new(true))
69
-
70
- t1.realized_by(t2)
71
- t1.on(:start, e)
72
-
73
- plan.remove_object(e)
74
- assert(!plan.free_events.include?(e))
75
- assert(t1.event(:start).leaf?(EventStructure::Signal))
76
- assert(!e.plan)
77
- assert_raises(ArgumentError) { e.plan = plan }
78
-
79
- plan.remove_object(t2)
80
- assert(!plan.include?(e))
81
- assert(!t1.realized_by?(t2))
82
- assert(!t2.plan)
83
- assert_raises(ArgumentError) { t2.plan = plan }
12
+ def assert_task_state(task, state)
13
+ assert_planobject_state(task, state)
14
+ if state == :removed
15
+ assert(!plan.mission?(task))
16
+ assert(!task.mission?)
17
+ else
18
+ if state == :mission
19
+ assert(plan.mission?(task))
20
+ assert(task.mission?)
21
+ elsif state == :permanent
22
+ assert(!plan.mission?(task))
23
+ assert(!task.mission?)
24
+ elsif state == :normal
25
+ assert(!plan.mission?(task))
26
+ assert(!task.mission?)
27
+ end
28
+ end
29
+ end
30
+ def assert_planobject_state(obj, state)
31
+ if state == :removed
32
+ assert(!plan.include?(obj))
33
+ assert(!plan.permanent?(obj))
34
+ assert_equal(nil, obj.plan)
35
+ else
36
+ assert_equal(plan, obj.plan)
37
+ assert(plan.include?(obj))
38
+ if state == :permanent
39
+ assert(plan.permanent?(obj))
40
+ else
41
+ assert(!plan.permanent?(obj))
42
+ end
43
+ end
84
44
  end
85
45
 
86
- def test_discover
87
- t1, t2, t3, t4 = prepare_plan :tasks => 4, :model => Roby::Test::SimpleTask
88
- t1.realized_by t2
89
- or_ev = OrGenerator.new
90
- t2.event(:start).on or_ev
91
- or_ev.on t3.event(:stop)
92
- t2.planned_by t4
93
-
94
- result = plan.discover(t1)
95
- assert_equal(plan, result)
96
- assert( plan.include?(t1) )
97
- assert( plan.include?(t2) )
98
- assert( plan.free_events.include?(or_ev))
99
- assert( !plan.include?(t3) ) # t3 not related because of task structure
100
- assert( plan.include?(t4) )
46
+ def test_add_task
47
+ plan.add(t = Task.new)
48
+ assert_task_state(t, :normal)
101
49
 
102
- # Discover t3 to help plan cleanup
103
- plan.discover(t3)
50
+ other_plan = Plan.new
51
+ assert_raises(ModelViolation) { other_plan.add(t) }
52
+ end
53
+ def test_add_task_deprecated_discover
54
+ t = Task.new
55
+ deprecated_feature { plan.discover(t) }
56
+ assert_task_state(t, :normal)
57
+ end
58
+ def test_remove_task
59
+ plan.remove_object(t)
60
+ assert_task_state(t, :removed)
61
+ end
104
62
 
105
- # Discover an AndGenerator and not its sources. The sources
106
- # must be discovered automatically
107
- a, b = (1..2).map { EventGenerator.new(true) }
108
- and_event = a & b
109
- plan.discover(and_event)
110
- assert_equal(plan, a.plan)
63
+ def test_add_mission
64
+ plan.add_mission(t = Task.new)
65
+ assert_task_state(t, :mission)
66
+ end
67
+ def test_add_mission_deprecated_insert
68
+ plan.insert(t = Task.new)
69
+ assert_task_state(t, :mission)
70
+ end
71
+ def test_unmark_mission
72
+ plan.add_mission(t = Task.new)
73
+ plan.unmark_mission(t)
74
+ assert_task_state(t, :normal)
75
+ end
76
+ def test_removed_mission
77
+ plan.add_mission(t = Task.new)
78
+ plan.remove_object(t)
79
+ assert_task_state(t, :removed)
111
80
  end
112
81
 
113
- def test_insert
114
- t1, t2, t3, t4 = prepare_plan :tasks => 4, :model => Roby::Test::SimpleTask
115
- t1.realized_by t2
116
- t2.on(:start, t3, :stop)
117
- t2.planned_by t4
82
+ def test_add_mission_deprecated_insert
83
+ t = Task.new
84
+ deprecated_feature { plan.insert(t) }
85
+ assert_task_state(t, :mission)
86
+ end
87
+ def test_unmark_mission_deprecated_discard
88
+ plan.add_mission(t = Task.new)
89
+ deprecated_feature { plan.discard(t) }
90
+ assert_task_state(t, :normal)
91
+ end
92
+ def test_unmark_mission_deprecated_remove_mission
93
+ plan.add_mission(t = Task.new)
94
+ deprecated_feature { plan.remove_mission(t) }
95
+ assert_task_state(t, :normal)
96
+ end
118
97
 
119
- result = plan.insert(t1)
120
- assert_equal(plan, result)
121
- assert( plan.include?(t1) )
122
- assert( plan.include?(t2) )
123
- assert( !plan.include?(t3) ) # t3 not related because of task structure
124
- assert( plan.include?(t4) )
98
+ def test_add_permanent
99
+ plan.add_permanent(t = Task.new)
100
+ assert_task_state(t, :permanent)
101
+ end
102
+ def test_unmark_permanent
103
+ plan.add_permanent(t = Task.new)
104
+ plan.unmark_permanent(t)
105
+ assert_task_state(t, :normal)
106
+ end
107
+ def test_remove_permanent
108
+ plan.add_permanent(t = Task.new)
109
+ plan.remove_object(t)
110
+ assert_task_state(t, :removed)
111
+ end
125
112
 
126
- assert( plan.mission?(t1) )
127
- assert( !plan.mission?(t2) )
113
+ def test_add_permanent_deprecated_permanent
114
+ t = Task.new
115
+ deprecated_feature { plan.permanent(t) }
116
+ assert_task_state(t, :permanent)
117
+ end
118
+ def test_unmark_permanent_deprecated_auto
119
+ plan.add_permanent(t = Task.new)
120
+ deprecated_feature { plan.auto(t) }
121
+ assert_task_state(t, :normal)
122
+ end
128
123
 
129
- # Discover t3 to help plan cleanup
130
- plan.discover(t3)
124
+ def test_add_event
125
+ plan.add(ev = EventGenerator.new)
126
+ assert_planobject_state(ev, :normal)
127
+ end
128
+ def test_remove_event
129
+ plan.add(ev = EventGenerator.new)
130
+ plan.remove_object(ev)
131
+ assert_planobject_state(ev, :removed)
132
+ end
133
+ def test_add_permanent_event
134
+ plan.add_permanent(ev = EventGenerator.new)
135
+ assert_planobject_state(ev, :permanent)
136
+ end
137
+ def test_unmark_permanent_event
138
+ plan.add_permanent(ev = EventGenerator.new)
139
+ plan.unmark_permanent(ev)
140
+ assert_planobject_state(ev, :normal)
141
+ end
142
+ def test_permanent_event_deprecated_permanent
143
+ ev = EventGenerator.new
144
+ deprecated_feature { plan.permanent(ev) }
145
+ assert_planobject_state(ev, :permanent)
146
+ end
147
+ def test_unmark_permanent_event_deprecated_auto
148
+ plan.add_permanent(ev = EventGenerator.new)
149
+ deprecated_feature { plan.unmark_permanent(ev) }
150
+ assert_planobject_state(ev, :normal)
131
151
  end
132
152
 
153
+ # TODO: test that #remove_object removes the object from its relations
154
+ # TODO: test that #add adds related objects
155
+
156
+ #def test_discover
157
+ # t1, t2, t3, t4 = prepare_plan :tasks => 4, :model => Roby::Test::SimpleTask
158
+ # t1.depends_on t2
159
+ # or_ev = OrGenerator.new
160
+ # t2.event(:start).signals or_ev
161
+ # or_ev.signals t3.event(:stop)
162
+ # t2.planned_by t4
163
+
164
+ # result = plan.discover(t1)
165
+ # assert_equal(plan, result)
166
+ # assert( plan.include?(t1) )
167
+ # assert( plan.include?(t2) )
168
+ # assert( plan.free_events.include?(or_ev))
169
+ # assert( !plan.include?(t3) ) # t3 not related because of task structure
170
+ # assert( plan.include?(t4) )
171
+
172
+ # # Discover t3 to help plan cleanup
173
+ # plan.discover(t3)
174
+
175
+ # # Discover an AndGenerator and not its sources. The sources
176
+ # # must be discovered automatically
177
+ # a, b = (1..2).map { EventGenerator.new(true) }
178
+ # and_event = a & b
179
+ # plan.discover(and_event)
180
+ # assert_equal(plan, a.plan)
181
+ #end
182
+
133
183
  def test_useful_task_components
134
184
  t1, t2, t3, t4 = prepare_plan :tasks => 4, :model => Roby::Test::SimpleTask
135
- t1.realized_by t2
136
- t2.on(:start, t3, :stop)
185
+ t1.depends_on t2
186
+ t2.signals(:start, t3, :stop)
137
187
  t2.planned_by t4
138
188
 
139
- plan.insert(t1)
189
+ plan.add_mission(t1)
140
190
 
141
191
  assert_equal([t1, t2, t4].to_value_set, plan.locally_useful_tasks)
142
- plan.insert(t3)
192
+ plan.add_mission(t3)
143
193
  assert_equal([t1, t2, t3, t4].to_value_set, plan.locally_useful_tasks)
144
- plan.discard(t1)
194
+ plan.unmark_mission(t1)
145
195
  assert_equal([t3].to_value_set, plan.locally_useful_tasks)
146
196
  assert_equal([t1, t2, t4].to_value_set, plan.unneeded_tasks)
147
197
  end
148
198
 
149
199
  def test_replace_task
150
200
  (p, c1), (c11, c12, c2, c3) = prepare_plan :missions => 2, :tasks => 4, :model => Roby::Test::SimpleTask
151
- p.realized_by c1
152
- c1.realized_by c11
153
- c1.realized_by c12
154
- p.realized_by c2
155
- c1.on(:stop, c2, :start)
156
- c1.forward :start, c1, :stop
157
- c11.forward :success, c1
201
+ p.depends_on c1, :model => [Roby::Test::SimpleTask, {}]
202
+ c1.depends_on c11
203
+ c1.depends_on c12
204
+ p.depends_on c2
205
+ c1.signals(:stop, c2, :start)
206
+ c1.forward_to :start, c1, :stop
207
+ c11.forward_to :success, c1, :success
158
208
 
159
209
  # Replace c1 by c3 and check that the hooks are properly called
160
210
  FlexMock.use do |mock|
161
211
  p.singleton_class.class_eval do
162
212
  define_method('removed_child_object') do |child, relations|
163
- mock.removed_hook(p, child, relations)
213
+ mock.removed_hook(self, child, relations)
164
214
  end
165
215
  end
166
216
  c1.singleton_class.class_eval do
167
217
  define_method('removed_parent_object') do |parent, relations|
168
- mock.removed_hook(c1, parent, relations)
218
+ mock.removed_hook(self, parent, relations)
169
219
  end
170
220
  end
171
221
 
172
222
  mock.should_receive(:removed_hook).with(p, c1, [TaskStructure::Hierarchy]).once
173
223
  mock.should_receive(:removed_hook).with(c1, p, [TaskStructure::Hierarchy]).once
174
- assert_nothing_raised { plan.replace_task(c1, c3) }
224
+ mock.should_receive(:removed_hook).with(p, c2, [TaskStructure::Hierarchy])
225
+ mock.should_receive(:removed_hook).with(c2, p, [TaskStructure::Hierarchy])
226
+ mock.should_receive(:removed_hook).with(p, c3, [TaskStructure::Hierarchy])
227
+ mock.should_receive(:removed_hook).with(c3, p, [TaskStructure::Hierarchy])
228
+ plan.replace_task(c1, c3)
175
229
  end
176
230
 
177
231
  # Check that the external task and event structures have been
@@ -196,8 +250,10 @@ module TC_PlanStatic
196
250
  assert( plan.include?(c1) )
197
251
 
198
252
  # Check that #replace_task keeps the permanent flag too
199
- p, t = prepare_plan :permanent => 1, :tasks => 1, :model => Roby::Test::SimpleTask
200
- plan.permanent(p)
253
+ (root, p), t = prepare_plan :permanent => 2, :tasks => 1, :model => Roby::Test::SimpleTask
254
+ root.depends_on p, :model => Roby::Test::SimpleTask
255
+
256
+ plan.add_permanent(p)
201
257
  plan.replace_task(p, t)
202
258
  assert(!plan.permanent?(p))
203
259
  assert(plan.permanent?(t))
@@ -205,30 +261,34 @@ module TC_PlanStatic
205
261
 
206
262
  def test_replace
207
263
  (p, c1), (c11, c12, c2, c3) = prepare_plan :missions => 2, :tasks => 4, :model => Roby::Test::SimpleTask
208
- p.realized_by c1
209
- c1.realized_by c11
210
- c1.realized_by c12
211
- p.realized_by c2
212
- c1.on(:stop, c2, :start)
213
- c1.forward :start, c1, :stop
214
- c11.forward :success, c1
264
+ p.depends_on c1, :model => Roby::Test::SimpleTask
265
+ c1.depends_on c11
266
+ c1.depends_on c12
267
+ p.depends_on c2
268
+ c1.signals(:stop, c2, :start)
269
+ c1.forward_to :start, c1, :stop
270
+ c11.forward_to :success, c1, :success
215
271
 
216
272
  # Replace c1 by c3 and check that the hooks are properly called
217
273
  FlexMock.use do |mock|
218
274
  p.singleton_class.class_eval do
219
275
  define_method('removed_child_object') do |child, relations|
220
- mock.removed_hook(p, child, relations)
276
+ mock.removed_hook(self, child, relations)
221
277
  end
222
278
  end
223
279
  c1.singleton_class.class_eval do
224
280
  define_method('removed_parent_object') do |parent, relations|
225
- mock.removed_hook(c1, parent, relations)
281
+ mock.removed_hook(self, parent, relations)
226
282
  end
227
283
  end
228
284
 
229
285
  mock.should_receive(:removed_hook).with(p, c1, [TaskStructure::Hierarchy]).once
230
286
  mock.should_receive(:removed_hook).with(c1, p, [TaskStructure::Hierarchy]).once
231
- assert_nothing_raised { plan.replace(c1, c3) }
287
+ mock.should_receive(:removed_hook).with(p, c2, [TaskStructure::Hierarchy])
288
+ mock.should_receive(:removed_hook).with(c2, p, [TaskStructure::Hierarchy])
289
+ mock.should_receive(:removed_hook).with(p, c3, [TaskStructure::Hierarchy])
290
+ mock.should_receive(:removed_hook).with(c3, p, [TaskStructure::Hierarchy])
291
+ plan.replace(c1, c3)
232
292
  end
233
293
 
234
294
  # Check that the external task and event structures have been
@@ -255,34 +315,34 @@ module TC_PlanStatic
255
315
 
256
316
  def test_remove_task
257
317
  t1, t2, t3 = (1..3).map { Roby::Task.new }
258
- t1.realized_by t2
259
- t1.on(:stop, t3, :start)
318
+ t1.depends_on t2
319
+ t1.signals(:stop, t3, :start)
260
320
 
261
- plan.insert(t1)
262
- plan.insert(t3)
321
+ plan.add_mission(t1)
322
+ plan.add_mission(t3)
263
323
 
264
324
  assert(!t1.leaf?)
265
- plan.remove_task(t2)
325
+ plan.remove_object(t2)
266
326
  assert(t1.leaf?)
267
327
  assert(!plan.include?(t2))
268
328
 
269
329
  assert(!t1.event(:stop).leaf?(EventStructure::Signal))
270
- plan.remove_task(t3)
330
+ plan.remove_object(t3)
271
331
  assert(t1.event(:stop).leaf?(EventStructure::Signal))
272
332
  assert(!plan.include?(t3))
273
333
  end
274
334
 
275
335
  def test_free_events
276
336
  t1, t2, t3 = (1..3).map { Roby::Task.new }
277
- plan.insert(t1)
278
- t1.realized_by t2
337
+ plan.add_mission(t1)
338
+ t1.depends_on t2
279
339
  assert_equal(plan, t2.plan)
280
340
  assert_equal(plan, t1.event(:start).plan)
281
341
 
282
342
  or_generator = (t1.event(:stop) | t2.event(:stop))
283
343
  assert_equal(plan, or_generator.plan)
284
344
  assert(plan.free_events.include?(or_generator))
285
- or_generator.on t3.event(:start)
345
+ or_generator.signals t3.event(:start)
286
346
  assert_equal(plan, t3.plan)
287
347
 
288
348
  and_generator = (t1.event(:stop) & t2.event(:stop))
@@ -292,17 +352,17 @@ module TC_PlanStatic
292
352
 
293
353
  def test_plan_synchronization
294
354
  t1, t2 = prepare_plan :tasks => 2
295
- plan.insert(t1)
355
+ plan.add_mission(t1)
296
356
  assert_equal(plan, t1.plan)
297
357
  assert_equal(nil, t2.plan)
298
- t1.realized_by t2
358
+ t1.depends_on t2
299
359
  assert_equal(plan, t1.plan)
300
360
  assert_equal(plan, t2.plan)
301
361
  assert(plan.include?(t2))
302
362
 
303
363
  e = EventGenerator.new(true)
304
364
  assert_equal(nil, e.plan)
305
- t1.on(:start, e)
365
+ t1.signals(:start, e, :start)
306
366
  assert_equal(plan, e.plan)
307
367
  assert(plan.free_events.include?(e))
308
368
 
@@ -317,268 +377,42 @@ module TC_PlanStatic
317
377
  include adding_child_failure
318
378
  end
319
379
  t1, t2 = model.new, model.new
320
- plan.insert(t1)
380
+ plan.add_mission(t1)
321
381
  assert_equal(plan, t1.plan)
322
382
  assert_equal(nil, t2.plan)
323
- assert_raises(RuntimeError) { t1.realized_by t2 }
383
+ assert_raises(RuntimeError) { t1.depends_on t2 }
324
384
  assert_equal(plan, t1.plan)
325
385
  assert_equal(plan, t2.plan)
326
386
  assert(plan.include?(t2))
327
387
  end
328
- end
329
-
330
- class TC_Plan < Test::Unit::TestCase
331
- include TC_PlanStatic
332
- include Roby::Test
333
-
334
- def clear_finalized
335
- Roby::Log.flush
336
- @finalized_tasks_recorder.clear
337
- end
338
- def finalized_tasks; @finalized_tasks_recorder.tasks end
339
- def finalized_events; @finalized_tasks_recorder.events end
340
- class FinalizedTaskRecorder
341
- attribute(:tasks) { Array.new }
342
- attribute(:events) { Array.new }
343
- def finalized_task(time, plan, task)
344
- tasks << task
345
- end
346
- def finalized_event(time, plan, event)
347
- events << event unless event.respond_to?(:task)
348
- end
349
- def clear
350
- tasks.clear
351
- events.clear
352
- end
353
- def splat?; true end
354
- end
355
-
356
- def setup
357
- super
358
- Roby::Log.add_logger(@finalized_tasks_recorder = FinalizedTaskRecorder.new)
359
- end
360
- def teardown
361
- Roby::Log.remove_logger @finalized_tasks_recorder
362
- super
363
- end
364
-
365
- def assert_finalizes(plan, unneeded, finalized = nil)
366
- finalized ||= unneeded
367
- finalized = finalized.map { |obj| obj.remote_id }
368
- clear_finalized
369
-
370
- yield if block_given?
371
-
372
- assert_equal(unneeded.to_set, plan.unneeded_tasks.to_set)
373
- plan.garbage_collect
374
- process_events
375
- plan.garbage_collect
376
-
377
- # !!! We are actually relying on the logging queue for this to work.
378
- # make sure it is empty before testing anything
379
- Roby::Log.flush
380
-
381
- assert_equal(finalized.to_set, (finalized_tasks.to_set | finalized_events.to_set))
382
- assert(! finalized.any? { |t| plan.include?(t) })
383
- end
384
-
385
- def test_garbage_collect_tasks
386
- klass = Class.new(Task) do
387
- attr_accessor :delays
388
-
389
- event(:start, :command => true)
390
- event(:stop) do |context|
391
- if delays
392
- return
393
- else
394
- emit(:stop)
395
- end
396
- end
397
- end
398
-
399
- t1, t2, t3, t4, t5, t6, t7, t8, p1 = (1..9).map { |i| klass.new(:id => i) }
400
- t1.realized_by t3
401
- t2.realized_by t3
402
- t3.realized_by t4
403
- t5.realized_by t4
404
- t5.planned_by p1
405
- p1.realized_by t6
406
-
407
- t7.realized_by t8
408
-
409
- [t1, t2, t5].each { |t| plan.insert(t) }
410
- plan.permanent(t7)
411
-
412
- assert_finalizes(plan, [])
413
- assert_finalizes(plan, [t1]) { plan.discard(t1) }
414
- assert_finalizes(plan, [t2, t3]) do
415
- t2.start!(nil)
416
- plan.discard(t2)
417
- end
418
- assert_finalizes(plan, [t5, t4, p1, t6], []) do
419
- t5.delays = true
420
- t5.start!(nil)
421
- plan.discard(t5)
422
- end
423
- assert(t5.event(:stop).pending?)
424
- assert_finalizes(plan, [t5, t4, p1, t6]) do
425
- t5.event(:stop).emit(nil)
426
- end
427
- end
428
-
429
- def test_force_garbage_collect_tasks
430
- t1 = Class.new(Task) do
431
- event(:stop) { |context| }
432
- end.new
433
- t2 = Task.new
434
- t1.realized_by t2
435
-
436
- plan.insert(t1)
437
- t1.start!
438
- assert_finalizes(plan, []) do
439
- plan.garbage_collect([t1])
440
- end
441
- assert(t1.event(:stop).pending?)
442
-
443
- assert_finalizes(plan, [t1, t2], [t1, t2]) do
444
- # This stops the mission, which will be automatically discarded
445
- t1.event(:stop).emit(nil)
446
- end
447
- end
448
-
449
- def test_gc_ignores_incoming_events
450
- Roby::Plan.logger.level = Logger::WARN
451
- a, b = prepare_plan :discover => 2, :model => SimpleTask
452
- a.on(:stop, b, :start)
453
- a.start!
454
-
455
- process_events
456
- process_events
457
- assert(!a.plan)
458
- assert(!b.plan)
459
- assert(!b.event(:start).happened?)
460
- end
461
-
462
- # Test a setup where there is both pending tasks and running tasks. This
463
- # checks that #stop! is called on all the involved tasks. This tracks
464
- # problems related to bindings in the implementation of #garbage_collect:
465
- # the killed task bound to the Control.once block must remain the same.
466
- def test_gc_stopping
467
- Roby::Plan.logger.level = Logger::WARN
468
- running_task = nil
469
- FlexMock.use do |mock|
470
- task_model = Class.new(Task) do
471
- event :start, :command => true
472
- event :stop do
473
- mock.stop(self)
474
- end
475
- end
476
-
477
- running_tasks = (1..5).map do
478
- task_model.new
479
- end
480
-
481
- plan.discover(running_tasks)
482
- t1, t2 = Roby::Task.new, Roby::Task.new
483
- t1.realized_by t2
484
- plan.discover(t1)
485
-
486
- running_tasks.each do |t|
487
- t.start!
488
- mock.should_receive(:stop).with(t).once
489
- end
490
-
491
- plan.garbage_collect
492
- process_events
493
-
494
- assert(!plan.include?(t1))
495
- assert(!plan.include?(t2))
496
- running_tasks.each do |t|
497
- assert(t.finishing?)
498
- t.emit(:stop)
499
- end
500
-
501
- plan.garbage_collect
502
- running_tasks.each do |t|
503
- assert(!plan.include?(t))
504
- end
505
- end
506
-
507
- ensure
508
- running_task.emit(:stop) if running_task && !running_task.finished?
509
- end
510
-
511
- def test_garbage_collect_events
512
- t = SimpleTask.new
513
- e1 = EventGenerator.new(true)
514
-
515
- plan.insert(t)
516
- plan.discover(e1)
517
- assert_equal([e1], plan.unneeded_events.to_a)
518
- t.event(:start).on e1
519
- assert_equal([], plan.unneeded_events.to_a)
520
-
521
- e2 = EventGenerator.new(true)
522
- plan.discover(e2)
523
- assert_equal([e2], plan.unneeded_events.to_a)
524
- e1.forward e2
525
- assert_equal([], plan.unneeded_events.to_a)
526
-
527
- plan.remove_object(t)
528
- assert_equal([e1, e2].to_value_set, plan.unneeded_events)
529
- end
530
388
 
531
389
  # Checks that a garbage collected object (event or task) cannot be added back into the plan
532
390
  def test_garbage_collection_final
533
391
  t = SimpleTask.new
534
392
  e = EventGenerator.new(true)
535
- plan.discover [t, e]
536
- plan.garbage_collect
537
- assert_raises(ArgumentError) { plan.discover(t) }
538
- assert_raises(ArgumentError) { plan.discover(e) }
393
+ plan.real_plan.add [t, e]
394
+ engine.garbage_collect
395
+ assert_raises(ArgumentError) { plan.add(t) }
396
+ assert_raises(ArgumentError) { plan.add(e) }
539
397
  end
540
398
 
541
- def test_garbage_collect_weak
542
- Roby.control.run :detach => true
543
-
544
- Roby.execute do
545
- planning, planned, influencing = prepare_plan :discover => 3, :model => SimpleTask
546
-
547
- planned.planned_by planning
548
- influencing.realized_by planned
549
- planning.influenced_by influencing
550
-
551
- planned.start!
552
- planning.start!
553
- influencing.start!
554
- end
399
+ def test_proxy_operator
400
+ t = SimpleTask.new
401
+ assert_same t, plan[t, false]
555
402
 
556
- Roby.wait_one_cycle
557
- Roby.wait_one_cycle
558
- Roby.wait_one_cycle
403
+ assert plan.include?(t)
404
+ assert_same t, plan[t, true]
559
405
 
560
- assert(plan.known_tasks.empty?)
406
+ plan.remove_object(t)
407
+ assert_raises(ArgumentError) { plan[t] }
561
408
  end
409
+ end
562
410
 
563
- def test_mission_failed
564
- model = Class.new(SimpleTask) do
565
- event :specialized_failure, :command => true
566
- forward :specialized_failure => :failed
567
- end
568
-
569
- task = prepare_plan :missions => 1, :model => model
570
- task.start!
571
- task.specialized_failure!
572
-
573
- error = Roby.check_failed_missions(plan).first.exception
574
- assert_kind_of(Roby::MissionFailedError, error)
575
- assert_equal(task.event(:specialized_failure).last, error.failure_point)
576
- assert_nothing_raised do
577
- Roby.format_exception error
578
- end
411
+ class TC_Plan < Test::Unit::TestCase
412
+ include TC_PlanStatic
579
413
 
580
- # Makes teardown happy
581
- plan.remove_object(task)
414
+ def test_transaction_stack
415
+ assert_equal [plan], plan.transaction_stack
582
416
  end
583
417
  end
584
418