You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

128 lines
3.4 KiB

require 'spec_helper'
require 'squib/args/box'
describe Squib::Args::Box do
subject(:box) { Squib::Args::Box.new }
let(:expected_defaults) { { x: [0], y: [0], width: [:deck], height: [:deck] } }
it 'intitially has no params set' do
expect(box).not_to respond_to(:x, :y, :width, :height)
end
it 'extracts the defaults from Box on an empty hash' do
box.load!({})
expect(box).to have_attributes(expected_defaults)
end
it 'extracts what is specified and fills in defaults from Box' do
box.load!(x: 4, width: 40)
expect(box).to have_attributes(x: [4], width: [40], y: [0], height: [:deck])
end
it 'extracts the defaults from Box on an empty hash' do
box.load!({ foo: :bar })
expect(box).to have_attributes(expected_defaults)
expect(box).not_to respond_to(:foo)
end
context 'single expansion' do
let(:args) { { x: [1, 2], y: 3 } }
before(:each) { box.load!(args, expand_by: 2) }
it 'expands box' do
expect(box).to have_attributes({
x: [1, 2],
y: [3, 3],
height: [:deck, :deck],
width: [:deck, :deck]
})
end
it 'gives access to each card too' do
expect(box[0]).to have_attributes({
x: 1,
y: 3,
height: :deck,
width: :deck
})
end
end
context 'layouts' do
let(:layout) do
{ 'attack' => { 'x' => 50 },
'defend' => { 'x' => 60 } }
end
it 'are used when not specified' do
args = { layout: ['attack', 'defend'] }
box.load!(args, expand_by: 2, layout: layout)
expect(box).to have_attributes(
x: [50, 60], # set by layout
y: [0, 0], # Box default
)
end
it 'handle single expansion' do
args = { layout: 'attack' }
box.load!(args, expand_by: 2, layout: layout)
expect(box).to have_attributes(
x: [50, 50], # set by layout
y: [0, 0], # Box default
)
end
it 'handles symbols' do
args = { layout: :attack }
box.load!(args, expand_by: 2, layout: layout)
expect(box).to have_attributes(
x: [50, 50], # set by layout
y: [0, 0], # Box default
)
end
it 'warns on non-existent layouts' do
args = { layout: :heal }
expect(Squib.logger).to receive(:warn).with('Layout "heal" does not exist in layout file - using default instead').at_least(:once)
box.load!(args, expand_by: 2, layout: layout)
expect(box).to have_attributes(
x: [0, 0], # Box default
y: [0, 0], # Box default
)
end
end
context 'unit conversion' do
it 'converts units on all args' do
args = { x: ['1in', '2in'], y: 300, width: '1in', height: '1in' }
box.load!(args, expand_by: 2)
expect(box).to have_attributes(
x: [300, 600],
y: [300, 300],
width: [300, 300],
height: [300, 300],
)
end
end
context 'validation' do
let(:deck) { OpenStruct.new(width: 123, height: 456, size: 1) }
it 'replaces with deck width and height' do
args = { width: :deck, height: :deck }
box = Squib::Args::Box.new
box.extract! args, deck
expect(box).to have_attributes(width: [123], height: [456])
end
it 'has radius override x_radius and y_radius' do
args = { x_radius: 1, y_radius: 2, radius: 3 }
box.extract! args, deck
expect(box).to have_attributes(x_radius: [3], y_radius: [3])
end
end
end