Sha256: b2582b5069c71813f749f1f8cad9192ebb531dec9f31d34ce8db5ea0e11307e3

Contents?: true

Size: 1.96 KB

Versions: 1

Compression:

Stored size: 1.96 KB

Contents

require "spec_helper"

RSpec.shared_examples "an example actor" do |runs_in_background|
  it "queries an object" do
    @person = Employee.start "Alice"

    expect(await { @person.name }).to eq "Alice"
    expect(await { @person.job_title }).to eq "Sales assistant"

    @time = Time.now
    # `greet_slowly` is a query so will block until a response is received
    expect(await { @person.greet_slowly }).to eq "H E L L O"
    expect(Time.now - @time).to be > 0.1

    @time = Time.now
    # we're not awaiting the result, so this should run in the background (unless we're using inline mode)
    @person.greet_slowly

    expect(Time.now - @time).to be < 0.1 if runs_in_background
    expect(Time.now - @time).to be > 0.1 if !runs_in_background
  end

  it "commands an object" do
    @person = Employee.start "Alice"
    @person.promote
    @job_title = await { @person.job_title }
    expect(@job_title).to eq "Sales manager"
  end
end

RSpec.describe "Actor example: " do
  # standard:disable Lint/ConstantDefinitionInBlock
  class Employee
    include Plumbing::Actor
    async :name, :job_title, :greet_slowly, :promote

    def initialize(name)
      @name = name
      @job_title = "Sales assistant"
    end

    attr_reader :name, :job_title

    def promote
      sleep 0.5
      @job_title = "Sales manager"
    end

    def greet_slowly
      sleep 0.2
      "H E L L O"
    end
  end
  # standard:enable Lint/ConstantDefinitionInBlock

  context "inline mode" do
    around :example do |example|
      Plumbing.configure mode: :inline, &example
    end

    it_behaves_like "an example actor", false
  end

  context "async mode" do
    around :example do |example|
      Plumbing.configure mode: :async do
        Kernel::Async(&example)
      end
    end

    it_behaves_like "an example actor", true
  end

  context "threaded mode" do
    around :example do |example|
      Plumbing.configure mode: :threaded, &example
    end

    it_behaves_like "an example actor", true
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
standard-procedure-plumbing-0.4.0 spec/examples/actor_spec.rb