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
@@ -0,0 +1,28 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ require 'optparse'
4
+
5
+ io = STDOUT
6
+ common = false
7
+ parser = OptionParser.new do |opt|
8
+ opt.on("--common") { common = true }
9
+ opt.on("--error") { exit(1) }
10
+ opt.on("--stderr") { io = STDERR }
11
+ opt.on("--no-output") { io = nil }
12
+ opt.on("--block") do
13
+ sleep
14
+ end
15
+ end
16
+ parser.parse! ARGV
17
+
18
+ if common
19
+ STDOUT.puts "O: FIRST LINE"
20
+ STDERR.puts "E: FIRST LINE"
21
+ STDOUT.puts "O: SECOND LINE"
22
+ STDERR.puts "E: SECOND LINE"
23
+
24
+ elsif io
25
+ io.puts "FIRST LINE"
26
+ io.puts "SECOND LINE"
27
+ end
28
+ exit 0
@@ -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/planning'
4
4
 
@@ -8,6 +8,7 @@ require 'roby/test/tasks/simple_task'
8
8
  class TC_PlanningLoop < Test::Unit::TestCase
9
9
  include Roby::Planning
10
10
  include Roby::Test
11
+ include Roby::Test::Assertions
11
12
 
12
13
  # The planner model
13
14
  attr_reader :planner_model
@@ -19,6 +20,7 @@ class TC_PlanningLoop < Test::Unit::TestCase
19
20
 
20
21
  def setup
21
22
  super
23
+ Roby.app.filter_backtraces = false
22
24
 
23
25
  task_model = @task_model = Class.new(SimpleTask)
24
26
  pattern_id = 0
@@ -33,7 +35,8 @@ class TC_PlanningLoop < Test::Unit::TestCase
33
35
  :planning_owners => nil,
34
36
  :planner_model => planner_model,
35
37
  :planned_model => SimpleTask,
36
- :method_name => :task,
38
+ :planning_method => "task",
39
+ :method_name => 'task',
37
40
  :method_options => {} }
38
41
  end
39
42
 
@@ -44,7 +47,7 @@ class TC_PlanningLoop < Test::Unit::TestCase
44
47
 
45
48
  # Prepare the default plan for all planning loop tests
46
49
  def prepare_plan(loop_options = {})
47
- plan.insert(main_task = Roby::Task.new)
50
+ plan.add_mission(main_task = Roby::Task.new)
48
51
  loop_task_options = planning_task_options.merge(loop_options)
49
52
  loop_planner = PlanningLoop.new(loop_task_options)
50
53
  main_task.planned_by loop_planner
@@ -52,6 +55,11 @@ class TC_PlanningLoop < Test::Unit::TestCase
52
55
  return main_task, loop_planner
53
56
  end
54
57
 
58
+ def wait_for_planning_end(planning_task)
59
+ planning_task.thread.join
60
+ process_events
61
+ end
62
+
55
63
  # Waits for +planning_task+ to finish and returns the planned result
56
64
  def planning_task_result(planning_task)
57
65
  assert(planning_task)
@@ -214,92 +222,126 @@ class TC_PlanningLoop < Test::Unit::TestCase
214
222
 
215
223
  # Test periodic loop tasks with zero lookahead
216
224
  def test_periodic_zero_lookahead
217
- main_task, loop_planner = prepare_plan :period => 0.5, :lookahead => 0
218
- loop_planner.start!
225
+ FlexMock.use(Time) do |time_proxy|
226
+ current_time = Time.now + 5
227
+ time_proxy.should_receive(:now).and_return { current_time }
219
228
 
220
- # Zero lookahead: no children until we call #loop_start!
221
- assert(main_task.children.empty?)
229
+ main_task, loop_planner = prepare_plan :period => 0.5, :lookahead => 0
230
+ loop_planner.start!
222
231
 
223
- # Start a first pattern
224
- loop_planner.loop_start!(:id => 1)
225
- assert_equal(1, loop_planner.patterns.size)
226
- first_planner = loop_planner.last_planning_task
227
- first_task = planning_task_result(first_planner)
228
- assert_equal(1, first_task.arguments[:id])
232
+ # Zero lookahead: no children until we call #loop_start!
233
+ assert(main_task.children.empty?)
229
234
 
230
- # Check the normal behaviour: a new pattern is to be added only when
231
- # the first pattern has finished AND the period has occured.
232
- assert(first_task.running?)
233
- assert_equal(1, main_task.children.to_a.size)
234
- first_task.success!
235
- assert_equal(1, main_task.children.to_a.size)
236
- sleep(0.6)
237
- process_events
238
- assert_equal(2, main_task.children.to_a.size)
239
- assert(second_planner = loop_planner.last_planning_task)
240
- assert(second_planner.running?)
241
- second_task = planning_task_result(second_planner)
242
- assert(second_task.running?)
243
- assert_equal(1, main_task.children.to_a.size)
244
-
245
- # And queue one other. The second call to #loop_start! should be
246
- # completely ignored because there is already one pending pattern.
247
- loop_planner.loop_start!(:id => 3)
248
- loop_planner.loop_start!(:id => 4)
249
- assert_equal(2, main_task.children.to_a.size)
250
- third_planner = loop_planner.last_planning_task
251
- third_task = planning_task_result(third_planner)
252
- assert_equal(3, third_task.arguments[:id])
235
+ # Start a first pattern
236
+ loop_planner.loop_start!(:id => 1)
237
+ assert_equal(1, loop_planner.patterns.size)
238
+ first_planner = loop_planner.last_planning_task
239
+ first_task = planning_task_result(first_planner)
240
+ assert_equal(1, first_task.arguments[:id])
253
241
 
254
- # Check the dynamic behaviour
255
- # - the 3rd task should start as soon as the 2nd has: the call to
256
- # #loop_start! should have done that for us.
257
- assert(second_task.running?)
258
- assert(third_task.pending?)
259
- second_task.success!
260
- assert(second_task.success?)
261
- assert(third_task.running?)
262
- third_task.success!
263
- assert(third_task.success?)
242
+ # Check the normal behaviour: a new pattern is to be added only when
243
+ # the first pattern has finished AND the period has occured.
244
+ assert(first_task.running?)
245
+ assert_equal([first_task], main_task.children.to_a)
246
+ first_task.success!
247
+ assert_equal([first_task], main_task.children.to_a)
248
+ current_time += 0.6
249
+ process_events
250
+ second_proxy_task = main_task.children.to_a.first
251
+ assert(second_proxy_task != first_task)
252
+ assert_equal(1, main_task.children.to_a.size)
253
+ assert(second_planner = loop_planner.last_planning_task)
254
+ assert(second_planner.running?)
255
+ second_task = planning_task_result(second_planner)
256
+ assert(second_task.running?)
257
+ assert_equal([second_task], main_task.children.to_a)
258
+
259
+ # And queue one other. The second call to #loop_start! should be
260
+ # completely ignored because there is already one pending pattern.
261
+ loop_planner.loop_start!(:id => 3)
262
+ loop_planner.loop_start!(:id => 4)
263
+ assert_equal(2, main_task.children.to_a.size)
264
+ assert(main_task.children.to_a.include?(second_task))
265
+ third_planner = loop_planner.last_planning_task
266
+ third_task = planning_task_result(third_planner)
267
+ assert_equal(3, third_task.arguments[:id])
268
+ assert_equal([second_task, third_task].to_value_set, main_task.children.to_value_set)
269
+
270
+ # Check the dynamic behaviour
271
+ # - the 3rd task should start as soon as the 2nd has: the call to
272
+ # #loop_start! should have done that for us.
273
+ assert(second_task.running?)
274
+ assert(third_task.pending?)
275
+ second_task.success!
276
+ assert(second_task.success?)
277
+ process_events
278
+ assert_equal([third_task], main_task.children.to_a)
279
+ assert(third_task.running?)
280
+ third_task.success!
281
+ assert(third_task.success?)
282
+ end
264
283
  end
265
284
 
266
285
  def test_reinit_periodic
286
+ Roby.app.abort_on_exception = false
267
287
  main_task, loop_planner = prepare_plan :period => 0.5, :lookahead => 3
268
288
 
269
- FlexMock.use do |mock|
270
- mock.should_receive(:started).twice
271
- task_model.on(:start) { mock.started }
272
-
273
- loop_planner.start!
274
- planners = loop_planner.patterns.reverse.map { |t, _| t }
275
- tasks = planners.map { |p| planning_task_result(p) }
276
-
277
- loop_planner.loop_start!
278
- assert(tasks[0].running?)
279
-
280
- loop_planner.reinit!
281
- process_events
282
- sleep(0.1)
283
- process_events
284
-
285
- # reinit should keep the first pattern because it is running, but
286
- # the other ones should be new (and the second pattern should be
287
- # being planned)
288
- assert(loop_planner.event(:reinit).happened?)
289
- assert_equal(3, loop_planner.patterns.size)
290
-
291
- new_planners = loop_planner.patterns.reverse.map { |t, _| t }
292
- new_tasks = new_planners.map { |p| planning_task_result(p) }
293
-
294
- new_tasks.each do |t|
295
- assert(!tasks.include?(t))
289
+ FlexMock.use(Time) do |time_proxy|
290
+ current_time = Time.now + 5
291
+ time_proxy.should_receive(:now).and_return { current_time }
292
+ FlexMock.use do |mock|
293
+ mock.should_receive(:started).twice
294
+ task_model.on(:start) { mock.started }
295
+
296
+ loop_planner.start!
297
+ planners = loop_planner.patterns.reverse.map { |t, _| t }
298
+ tasks = planners.map { |p| planning_task_result(p) }
299
+ assert_equal 3, tasks.size
300
+ assert_equal tasks.to_value_set, main_task.children.to_value_set
301
+
302
+ loop_planner.loop_start!
303
+ assert(tasks[0].running?)
304
+ # First task is started, one pattern should be planning for the
305
+ # sake of the lookahead
306
+ assert_equal 1, (main_task.children.to_value_set - tasks.to_value_set).size
307
+ assert_equal 4, loop_planner.patterns.size
308
+
309
+ current_planning_task = loop_planner.patterns.first.first
310
+ original_patterns = loop_planner.patterns.dup
311
+
312
+ # reinit should remove all children and recreate the structure
313
+ # for three patterns
314
+ loop_planner.reinit!
315
+ process_events
316
+ assert(!loop_planner.event(:reinit).happened?)
317
+ assert(tasks[0].running?)
318
+ process_events
319
+ assert(!tasks[0].running?)
320
+ # if we're lucky, the planning task is not finished yet and
321
+ # therefore the loop planner should not have emitted :reinit yet
322
+ # either
323
+ if current_planning_task.running?
324
+ wait_for_planning_end current_planning_task
325
+ assert(loop_planner.reinit_event.last.time >= current_planning_task.stop_event.last.time)
326
+ end
327
+ # Wait for the planning task to finish if it is not yet finished
328
+ assert_equal 3, (loop_planner.patterns - original_patterns).size
329
+ assert_equal 3, loop_planner.patterns.size
330
+ assert_equal 3, main_task.children.to_a.size
331
+ assert_equal 3, (main_task.children.to_value_set - tasks.to_value_set).size
332
+
333
+ new_planners = loop_planner.patterns.reverse.map { |t, _| t }
334
+ new_tasks = new_planners.map { |p| planning_task_result(p) }
335
+
336
+ new_tasks.each do |t|
337
+ assert(!tasks.include?(t))
338
+ end
339
+ # ... but the first pattern should be GCed right now, and the next
340
+ # pattern started
341
+ process_events
342
+ assert(new_tasks[0].running?)
296
343
  end
297
- # assert_equal([1, 5, 6, 7], new_tasks.map { |t| t.arguments[:id] })
298
- # ... but the first pattern should be GCed right now, and the next
299
- # pattern started
300
- process_events
301
- assert(new_tasks[0].running?)
302
- end
344
+ end
303
345
  end
304
346
 
305
347
  #def test_planning_loop_reinit_zero_lookahead
@@ -311,7 +353,7 @@ class TC_PlanningLoop < Test::Unit::TestCase
311
353
  # end
312
354
  # end
313
355
 
314
- # plan.insert(main_task = Roby::Task.new)
356
+ # plan.add_mission(main_task = Roby::Task.new)
315
357
  # loop_planner = PlanningLoop.new :period => nil, :lookahead => 0,
316
358
  # :planner_model => planner_model, :planned_model => Roby::Task,
317
359
  # :method_name => :task, :method_options => {}
@@ -342,47 +384,49 @@ class TC_PlanningLoop < Test::Unit::TestCase
342
384
  # end
343
385
  #end
344
386
 
345
- #def test_make_loop
346
- # planner_model = Class.new(Planning::Planner) do
347
- # include Test::Unit::Assertions
348
-
349
- # @result_task = nil
350
- # attr_reader :result_task
351
- # method(:task) { @result_task = SimpleTask.new(:id => arguments[:task_id])}
352
- # method(:looping_tasks) do
353
- # t1 = make_loop(:period => 0, :child_argument => 2) do
354
- # # arguments of 'my_looping_task' shall be forwarded
355
- # raise unless arguments[:parent_argument] == 1
356
- # raise unless arguments[:child_argument] == 2
357
- # task(:task_id => 'first_loop')
358
- # end
359
- # t2 = make_loop do
360
- # task(:task_id => 'second_loop')
361
- # end
362
- # # Make sure the two loops are different
363
- # assert(t1.method_options[:id] != t2.method_options[:id])
364
- # [t1, t2]
365
- # end
366
- # end
387
+ def test_make_loop
388
+ planner_model = Class.new(Planning::Planner) do
389
+ include Test::Unit::Assertions
390
+
391
+ @result_task = nil
392
+ attr_reader :result_task
393
+ method(:task) { @result_task = SimpleTask.new(:id => arguments[:task_id])}
394
+ method(:looping_tasks) do
395
+ t1 = make_loop(:period => 0, :child_argument => 2) do
396
+ # arguments of 'my_looping_task' shall be forwarded
397
+ raise unless arguments[:parent_argument] == 1
398
+ raise unless arguments[:child_argument] == 2
399
+ task(:task_id => 'first_loop')
400
+ end
401
+ t2 = make_loop do
402
+ task(:task_id => 'second_loop')
403
+ end
404
+ # Make sure the two loops are different
405
+ assert(t1.method_options[:id] != t2.method_options[:id])
406
+ [t1, t2]
407
+ end
408
+ end
367
409
 
368
- # planner = planner_model.new(plan)
369
- # t1, t2 = planner.looping_tasks(:parent_argument => 1)
370
- # plan.insert(t1)
371
- # plan.insert(t2)
410
+ planner = planner_model.new(plan)
411
+ t1, t2 = planner.looping_tasks(:parent_argument => 1)
412
+ assert(t1.fully_instanciated?, t1.arguments.keys - t1.class.arguments.to_a)
413
+ assert(t2.fully_instanciated?)
414
+ plan.add_mission(t1)
415
+ plan.add_mission(t2)
372
416
 
373
- # t1.start!
374
- # planned_task = planning_task_result(t1.last_planning_task)
375
- # assert_equal('first_loop', planned_task.arguments[:id])
417
+ t1.start!
418
+ planned_task = planning_task_result(t1.last_planning_task)
419
+ assert_equal('first_loop', planned_task.arguments[:id])
376
420
 
377
- # t2.start!
378
- # planned_task = planning_task_result(t2.last_planning_task)
379
- # assert_equal('second_loop', planned_task.arguments[:id])
421
+ t2.start!
422
+ planned_task = planning_task_result(t2.last_planning_task)
423
+ assert_equal('second_loop', planned_task.arguments[:id])
380
424
 
381
- # t3 = planner.make_loop(:period => 0, :parent_argument => 1, :child_argument => 2) do
382
- # task(:task_id => 'third_loop')
383
- # end
384
- # plan.insert(t3)
385
- # t3.start!
386
- # assert_equal('third_loop', planning_task_result(t3.last_planning_task).arguments[:id])
387
- #end
425
+ t3 = planner.make_loop(:period => 0, :parent_argument => 1, :child_argument => 2) do
426
+ task(:task_id => 'third_loop')
427
+ end
428
+ plan.add_mission(t3)
429
+ t3.start!
430
+ assert_equal('third_loop', planning_task_result(t3.last_planning_task).arguments[:id])
431
+ end
388
432
  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/planning'
4
4
 
@@ -115,7 +115,7 @@ class TC_Planner < Test::Unit::TestCase
115
115
  planner = model.new(plan)
116
116
  assert_raises(NotFound) { planner.empty_set }
117
117
 
118
- plan.insert(task = task_model.new)
118
+ plan.add_mission(task = task_model.new)
119
119
  found_task = nil
120
120
  assert_nothing_raised { found_task = planner.empty_set }
121
121
  assert_equal(found_task, task)
@@ -126,7 +126,7 @@ class TC_Planner < Test::Unit::TestCase
126
126
  planner = planner_model.new(plan)
127
127
  result = planner.send(method, options)
128
128
  result.each do |task|
129
- planner.plan.insert(task)
129
+ planner.plan.add_mission(task)
130
130
  end
131
131
  assert_equal(size, planner.plan.size, planner.plan.known_tasks.to_a.inspect)
132
132
 
@@ -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/planning'
4
4
 
@@ -11,7 +11,7 @@ class TC_PlanningTask < Test::Unit::TestCase
11
11
 
12
12
  def planning_task_result(planning_task)
13
13
  assert(planning_task)
14
- plan.permanent(planning_task)
14
+ plan.add_permanent(planning_task)
15
15
  planning_task.start! if planning_task.pending?
16
16
  planning_task.thread.join
17
17
  process_events
@@ -33,7 +33,7 @@ class TC_PlanningTask < Test::Unit::TestCase
33
33
  planning_task = PlanningTask.new(:planner_model => planner, :method_name => :task,
34
34
  :method_options => { :bla => 42 },
35
35
  :blo => 84)
36
- plan.insert(planned_task = Task.new)
36
+ plan.add_mission(planned_task = Task.new)
37
37
  planned_task.planned_by planning_task
38
38
 
39
39
  planning_task.start!(42)
@@ -67,7 +67,7 @@ class TC_PlanningTask < Test::Unit::TestCase
67
67
  end
68
68
 
69
69
  planning_task = PlanningTask.new(:planner_model => planner, :method_name => :interruptible)
70
- plan.permanent(planning_task)
70
+ plan.add_permanent(planning_task)
71
71
  planning_task.start!
72
72
  loop { sleep 0.1 ; break if started }
73
73
  planning_task.stop!
@@ -85,13 +85,13 @@ class TC_PlanningTask < Test::Unit::TestCase
85
85
  planner = Class.new(Planning::Planner) do
86
86
  method(:test_task) do
87
87
  result_task = SimpleTask.new(:id => arguments[:task_id])
88
- result_task.realized_by replan_task(:task_id => arguments[:task_id] + 1)
89
- plan.permanent(result_task)
88
+ result_task.depends_on replan_task(:task_id => arguments[:task_id] + 1)
89
+ plan.add_permanent(result_task)
90
90
  result_task
91
91
  end
92
92
  end.new(plan)
93
93
 
94
- plan.permanent(task = planner.test_task(:task_id => 100))
94
+ plan.add_permanent(task = planner.test_task(:task_id => 100))
95
95
  assert_kind_of(SimpleTask, task)
96
96
  assert_equal(100, task.arguments[:id])
97
97
 
@@ -103,4 +103,24 @@ class TC_PlanningTask < Test::Unit::TestCase
103
103
  assert_kind_of(SimpleTask, new_task, planning_task)
104
104
  assert_equal(101, new_task.arguments[:id])
105
105
  end
106
+
107
+ def test_method_object
108
+ planner_model = Class.new(Planning::Planner)
109
+
110
+ FlexMock.use do |mock|
111
+ mock.should_receive(:method_called).with(:context => nil, :arg => 10).once
112
+
113
+ body = lambda do
114
+ mock.method_called(arguments)
115
+ Roby::Task.new(:id => 'result_of_lambda')
116
+ end
117
+ m = FreeMethod.new 'test_object', {:id => 10}, body
118
+ planning_task = PlanningTask.new(:planner_model => planner_model, :planning_method => m, :arg => 10)
119
+ plan.add_permanent(planning_task)
120
+ planning_task.start!
121
+ new_task = planning_task_result(planning_task)
122
+ assert_equal 'result_of_lambda', new_task.arguments[:id]
123
+ end
124
+ end
106
125
  end
126
+