spec/unit/mutant/parallel_spec.rb in mutant-0.8.24 vs spec/unit/mutant/parallel_spec.rb in mutant-0.9.0

- old
+ new

@@ -1,18 +1,115 @@ # frozen_string_literal: true RSpec.describe Mutant::Parallel do describe '.async' do - subject { described_class.async(config) } + def apply + described_class.async(config) + end - let(:config) { instance_double(Mutant::Parallel::Config, env: env) } - let(:env) { instance_double(Mutant::Actor::Env, new_mailbox: mailbox) } - let(:mailbox) { Mutant::Actor::Mailbox.new } - let(:master) { instance_double(Mutant::Parallel::Master) } + let(:condition_variable) { class_double(ConditionVariable) } + let(:jobs) { 2 } + let(:mutex) { class_double(Mutex) } + let(:processor) { instance_double(Proc) } + let(:sink) { instance_double(described_class::Sink) } + let(:source) { instance_double(described_class::Source) } + let(:thread) { class_double(Thread) } + let(:thread_a) { instance_double(Thread) } + let(:thread_b) { instance_double(Thread) } + let(:worker) { -> {} } - before do - expect(described_class::Master).to receive(:call).with(config).and_return(master) + let(:config) do + Mutant::Parallel::Config.new( + condition_variable: condition_variable, + jobs: jobs, + mutex: mutex, + processor: processor, + sink: sink, + source: source, + thread: thread + ) end - it { should eql(described_class::Driver.new(mailbox.bind(master))) } + let(:var_active_jobs) do + instance_double(Mutant::Variable::IVar, 'active jobs') + end + + let(:var_final) do + instance_double(Mutant::Variable::IVar, 'final') + end + + let(:var_running) do + instance_double(Mutant::Variable::MVar, 'running') + end + + let(:var_sink) do + instance_double(Mutant::Variable::IVar, 'sink') + end + + let(:var_source) do + instance_double(Mutant::Variable::IVar, 'source') + end + + def ivar(value, **attributes) + { + receiver: Mutant::Variable::IVar, + selector: :new, + arguments: [ + condition_variable: condition_variable, + mutex: mutex, + **attributes + ], + reaction: { return: value } + } + end + + def mvar(*arguments) + ivar(*arguments).merge(receiver: Mutant::Variable::MVar) + end + + let(:raw_expectations) do + [ + ivar(var_active_jobs, value: Set.new), + ivar(var_final), + ivar(var_sink, value: sink), + mvar(var_running, value: 2), + ivar(var_source, value: source), + { + receiver: Mutant::Parallel::Worker, + selector: :new, + arguments: [ + processor: processor, + var_active_jobs: var_active_jobs, + var_final: var_final, + var_running: var_running, + var_sink: var_sink, + var_source: var_source + ], + reaction: { return: worker } + }, + { + receiver: thread, + selector: :new, + reaction: { yields: [], return: thread_a } + }, + { + receiver: thread, + selector: :new, + reaction: { yields: [], return: thread_b } + } + ] + end + + it 'returns driver' do + verify_events do + expect(apply).to eql( + described_class::Driver.new( + threads: [thread_a, thread_b], + var_active_jobs: var_active_jobs, + var_final: var_final, + var_sink: var_sink + ) + ) + end + end end end