# frozen_string_literal: true require './position' RSpec.describe Position do let(:even_pair) { [4, 6] } # 4+6 = 10 → even let(:odd_pair) { [3, 4] } # 3+4 = 7 → odd describe 'initialisation' do context 'with two arguments' do it 'stores the coordinates when the sum is even' do pos = Position.new(*even_pair) expect(pos.x_pos).to eq even_pair[0] expect(pos.y_pos).to eq even_pair[1] end it 'raises ArgumentError when the sum is odd' do expect { Position.new(*odd_pair) } .to raise_error(ArgumentError, /must sum to an even number/) end end context 'with three arguments' do it 'raises NotImplementedError' do expect { Position.new(1, 2, 3) } .to raise_error(NotImplementedError, /positioning not implimented/) end end context 'with an unsupported number of arguments' do it 'raises ArgumentError when no arguments are supplied' do expect { Position.new } .to raise_error(ArgumentError, /requires two or three integer args/) end it 'raises ArgumentError when too many arguments are supplied' do expect { Position.new(1, 2, 3, 4) } .to raise_error(ArgumentError, /requires two or three integer args/) end end end describe '#two_d_cartesian' do it 'returns the original (x, y) pair' do pos = Position.new(*even_pair) expect(pos.two_d_cartesian).to eq even_pair end end describe '#two_d_hexagonal' do it 'returns an array of nil values for a, b, c' do pos = Position.new(*even_pair) expect(pos.two_d_hexagonal).to eq [nil, nil, nil] end end describe '#to_s' do it 'puts out the coordinates' do expect(Position.new(*even_pair).to_s).to eq '(4, 6)' end end describe '#==' do it 'returns false when the positions differ' do expect(Position.new(*even_pair) == Position.new(6, 8)).to eq false end it 'returns true when the positions are the same' do expect(Position.new(*even_pair) == Position.new(4, 6)).to eq true end end end