
#
# testing ruote
#
# Mon Jul 27 09:17:51 JST 2009
#

require File.join(File.dirname(__FILE__), 'base')

require 'ruote/participant'


class FtForgetTest < Test::Unit::TestCase
  include FunctionalBase

  def test_basic

    pdef = Ruote.process_definition do
      sequence do
        alpha :forget => true
        alpha
      end
    end

    @engine.register_participant :alpha do
      @tracer << "alpha\n"
    end

    #noisy

    wfid = @engine.launch(pdef)

    wait_for(wfid)
    wait_for(wfid)

    assert_equal %w[ alpha alpha ].join("\n"), @tracer.to_s

    #logger.log.each { |e| p e }

    assert_equal 1, logger.log.select { |e| e['action'] == 'ceased' }.size
    assert_equal 1, logger.log.select { |e| e['action'] == 'terminated' }.size
  end

  def test_forgotten_tree

    sp = @engine.register_participant :alpha, Ruote::StorageParticipant

    pdef = Ruote.process_definition do
      sequence do
        alpha :forget => true
      end
    end

    wfid = @engine.launch(pdef)

    wait_for(wfid)

    ps = @engine.process(wfid)

    assert_not_nil ps
    assert_equal 0, ps.errors.size
    assert_equal 1, ps.expressions.size

    fei = ps.expressions.first.fei
    assert_equal fei, ps.root_expression_for(fei).fei

    #puts "not sure..."
    #p ps.original_tree
    #p ps.current_tree
  end

  def test_forget_true_string

    pdef = Ruote.process_definition do
      concurrence :count => 1 do
        alpha :forget => 'true'
        bravo
      end
      charly
    end

    @engine.register_participant '.+' do |wi|
      @tracer << wi.participant_name + "\n"
    end

    wfid = @engine.launch(pdef)

    wait_for(wfid)
    wait_for(wfid)

    #assert_equal "alpha\nbravo\ncharly", @tracer.to_s
    assert_equal %w[ alpha bravo charly ], @tracer.to_a.sort
  end

  def test_forget_and_cursor

    pdef = Ruote.define do
      cursor do
        alpha :forget => true
        bravo
        rewind
      end
    end

    @engine.register_participant 'alpha', Ruote::NullParticipant
      # this participant never replies

    @engine.register_participant 'bravo', Ruote::NoOpParticipant
      # this one simply replies

    #@engine.noisy = true

    wfid = @engine.launch(pdef)

    @engine.wait_for(:bravo)
    @engine.wait_for(:bravo)

    assert_not_nil @engine.process(wfid)
  end

  # As reported by Nando Sola
  #
  # http://groups.google.com/group/openwferu-users/browse_thread/thread/50308e9dce8359e6
  #
  def test_forget_on_forget

    pdef = Ruote.define do
      concurrence do
        listen :to => 'bravo', :upon =>'reply', :wfid => true do
          sequence :forget => true do
            alpha
          end
        end
        bravo
      end
    end

    @engine.register do
      catchall Ruote::NoOpParticipant
    end

    #noisy

    wfid = @engine.launch(pdef)

    @engine.wait_for(wfid)

    assert_equal(
      [],
      @engine.history.all.select { |e| e['action'] == 'error_intercepted' })
  end
end

