Thibault Jouan 639bdc1c73 Implement basic condition DSL framework for tests:
Instead of interrupting task evaluation when condition is not met,
allow the whole task to be evaluated (including condition and
evaluation) so that the interpreter will get all tasks actions (whether
condition is met or not) and be able to query the condition.

* Modify Interpreter#process_task: test if task condition is met before
  applying the actions;
* Implement condition handling in Task and Task::DSL;
* Implement Condition and Condition::DSL (useless as they are, but
  needed to implement later test keywords as part of the condition DSL.
2013-08-18 00:29:14 +00:00

92 lines
2.2 KiB
Ruby

require 'spec_helper'
module Producer::Core
describe Task do
let(:name) { :some_task }
let(:action) { double('action') }
let(:condition) { double('condition') }
subject(:task) { Task.new(name, [action], condition) }
describe '.evaluate' do
let(:env) { double('env') }
let(:block) { proc { :some_value } }
it 'delegates to DSL.evaluate' do
expect(Task::DSL)
.to receive(:evaluate).with(name, env) do |&b|
expect(b.call).to eq :some_value
end
Task.evaluate(name, env, &block)
end
it 'returns the evaluated task' do
task = double('task')
allow(Task::DSL).to receive(:evaluate) { task }
expect(Task.evaluate(name, env, &block)).to be task
end
end
describe '#initialize' do
it 'assigns the name' do
expect(task.instance_eval { @name }).to eq name
end
it 'assigns the actions' do
expect(task.instance_eval { @actions }).to eq [action]
end
it 'assigns the condition' do
expect(task.instance_eval { @condition }).to eq condition
end
context 'when only the name is given as argument' do
subject(:task) { Task.new(name) }
it 'assigns no action' do
expect(task.actions).to be_empty
end
it 'assigns a truthy condition' do
expect(task.condition).to be_true
end
end
end
describe '#name' do
it 'returns its name' do
expect(task.name).to eq name
end
end
describe '#actions' do
it 'returns the assigned actions' do
expect(task.actions).to eq [action]
end
end
describe '#condition' do
it 'returns the assigned condition' do
expect(task.condition).to be condition
end
end
describe '#condition_met?' do
context 'when condition is truthy' do
let(:condition) { Condition.new(true) }
it 'returns true' do
expect(task.condition_met?).to be true
end
end
context 'when condition is falsy' do
let(:condition) { Condition.new(false) }
it 'returns false' do
expect(task.condition_met?).to be false
end
end
end
end
end