Sha256: f485c0e7407013523598cb64cd419ff1845bddd180dca15e9ef647e03d66f709

Contents?: true

Size: 1.98 KB

Versions: 2

Compression:

Stored size: 1.98 KB

Contents

require 'mutant/actor'

# A fake actor used from specs
module FakeActor
  class Expectation
    include Concord::Public.new(:name, :message)
  end

  class MessageSequence
    include Adamantium::Flat, Concord.new(:messages)

    def self.new
      super([])
    end

    def add(name, *message_arguments)
      messages << Expectation.new(name, Mutant::Actor::Message.new(*message_arguments))
      self
    end

    def sending(expectation)
      raise "Unexpected send: #{expectation.inspect}" if messages.empty?
      expected = messages.shift
      unless expectation.eql?(expected)
        raise "Got:\n#{expectation.inspect}\nExpected:\n#{expected.inspect}"
      end
      self
    end

    def receiving(name)
      raise "No message to read for #{name.inspect}" if messages.empty?
      expected = messages.shift
      raise "Unexpected message #{expected.inspect} for #{name.inspect}" unless expected.name.eql?(name)
      expected.message
    end

    def consumed?
      messages.empty?
    end
  end

  class Env
    include Concord.new(:messages, :mailbox_names)

    def spawn
      mailbox = mailbox(next_name)
      yield mailbox if block_given?
      mailbox.sender
    end

    def mailbox(name)
      Mailbox.new(name, @messages)
    end

    def new_mailbox
      mailbox(:current)
    end

  private

    def next_name
      @mailbox_names.shift.tap do |name|
        name or fail 'Tried to spawn actor when no name available'
      end
    end
  end # Env

  class Mailbox
    include Concord.new(:name, :messages)

    def receiver
      Receiver.new(name, messages)
    end

    def sender
      Sender.new(name, messages)
    end

    def bind(sender)
      Mutant::Actor::Binding.new(self, sender)
    end
  end

  class Sender
    include Concord.new(:name, :messages)

    def call(message)
      messages.sending(Expectation.new(name, message))
    end
  end # Sender

  class Receiver
    include Concord::Public.new(:name, :messages)

    def call
      messages.receiving(name)
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
mutant-0.7.3 spec/support/fake_actor.rb
mutant-0.7.2 spec/support/fake_actor.rb