diff --git a/lib/roby/actions/models/action.rb b/lib/roby/actions/models/action.rb index 999d28908..647ae6166 100644 --- a/lib/roby/actions/models/action.rb +++ b/lib/roby/actions/models/action.rb @@ -198,7 +198,11 @@ def run(action_interface, arguments = Hash.new) if !arguments.empty? raise ArgumentError, "#{name} expects no arguments, but #{arguments.size} are given" end - result = action_interface.send(name).as_plan + result = action_interface.send(name) + if(!result.class.has_ancestor?(returned_type)) + raise ArgumentError, "#{name} is expected to return #{returned_type} but returned #{result.class}" + end + result = result.as_plan else default_arguments = self.arguments.inject(Hash.new) do |h, arg| h[arg.name] = arg.default @@ -210,7 +214,11 @@ def run(action_interface, arguments = Hash.new) raise ArgumentError, "required argument #{arg.name} not given to #{name}" end end - result = action_interface.send(name, arguments).as_plan + result = action_interface.send(name, arguments) + if(!result.class.has_ancestor?(returned_type)) + raise ArgumentError, "#{name} is expected to return #{returned_type} but returned #{result.class}" + end + result = result.as_plan end # Make the planning task inherit the model/argument flags if planning_task = result.planning_task diff --git a/lib/roby/relations/dependency.rb b/lib/roby/relations/dependency.rb index dfc15b500..db227b4ff 100644 --- a/lib/roby/relations/dependency.rb +++ b/lib/roby/relations/dependency.rb @@ -921,7 +921,7 @@ def pretty_print(pp) # :nodoc: if mode == :failed_event pp.text "triggered the failure predicate '#{relation[:failure]}': " elsif mode == :unreachable_success - pp.text "cannot reach the success condition '#{relation[:success]}': " + pp.text "child terminated, success condition can no longer be reached '#{relation[:success]}': " end explanation.pretty_print(pp)