require 'rails_helper'

module Tables
  RSpec.describe Swap do
    describe '#each' do
      let(:swaps) do
        acc = []
        described_class.new(initial_solution).each do |solution|
          acc << solution.tables.map(&:dup)
        end
        acc
      end

      context 'when there are two tables with two people each' do
        let(:initial_solution) do
          Distribution.new(min_per_table: 2, max_per_table: 2).tap do |distribution|
            distribution.tables << %i[a b].to_table
            distribution.tables << %i[c d].to_table
          end
        end

        it 'yields all possible swaps between the tables' do
          expect(swaps).to contain_exactly(
            [%i[a d], %i[c b]],
            [%i[b c], %i[d a]],
            [%i[a c], %i[d b]],
            [%i[b d], %i[c a]]
          )
        end
      end

      context 'when there are two tables with three people each' do
        let(:initial_solution) do
          Distribution.new(min_per_table: 3, max_per_table: 3).tap do |distribution|
            distribution.tables << %i[a b c].to_table
            distribution.tables << %i[d e f].to_table
          end
        end

        it 'yields all possible swaps between the tables' do
          expect(swaps).to contain_exactly(
            [%i[b c d], %i[e f a]],
            [%i[b c e], %i[f d a]],
            [%i[b c f], %i[d e a]],
            [%i[c a d], %i[e f b]],
            [%i[c a e], %i[f d b]],
            [%i[c a f], %i[d e b]],
            [%i[a b d], %i[e f c]],
            [%i[a b e], %i[f d c]],
            [%i[a b f], %i[d e c]]
          )
        end
      end

      context 'when there are three tables with two people each' do
        let(:initial_solution) do
          Distribution.new(min_per_table: 2, max_per_table: 2).tap do |distribution|
            distribution.tables << %i[a b].to_table
            distribution.tables << %i[c d].to_table
            distribution.tables << %i[e f].to_table
          end
        end

        it 'yields all possible swaps between the tables' do
          expect(swaps).to contain_exactly(
            [%i[b c], %i[d a], %i[e f]],
            [%i[b d], %i[c a], %i[e f]],
            [%i[a c], %i[d b], %i[e f]],
            [%i[a d], %i[c b], %i[e f]],
            [%i[b e], %i[c d], %i[f a]],
            [%i[b f], %i[c d], %i[e a]],
            [%i[a e], %i[c d], %i[f b]],
            [%i[a f], %i[c d], %i[e b]],
            [%i[a b], %i[d e], %i[f c]],
            [%i[a b], %i[d f], %i[e c]],
            [%i[a b], %i[c e], %i[f d]],
            [%i[a b], %i[c f], %i[e d]]
          )
        end
      end
    end
  end
end