diff options
author | Jérémy Zurcher <jeremy@asynk.ch> | 2023-10-03 22:44:09 +0200 |
---|---|---|
committer | Jérémy Zurcher <jeremy@asynk.ch> | 2023-10-03 22:44:09 +0200 |
commit | dcc1cc51c4ac9eb80431999fef79f0d46728073b (patch) | |
tree | 4cbe48268310ca65ec294a8687c532da6863b951 /spec | |
parent | 1e45085b7730bdb9b0b0ed76e6613a9fac5136cd (diff) | |
download | colonial-twilight-dcc1cc51c4ac9eb80431999fef79f0d46728073b.zip colonial-twilight-dcc1cc51c4ac9eb80431999fef79f0d46728073b.tar.gz |
add fln_bot_rules & specs
Diffstat (limited to 'spec')
-rw-r--r-- | spec/fln_bot_rules_spec.rb | 282 |
1 files changed, 282 insertions, 0 deletions
diff --git a/spec/fln_bot_rules_spec.rb b/spec/fln_bot_rules_spec.rb new file mode 100644 index 0000000..2330ac1 --- /dev/null +++ b/spec/fln_bot_rules_spec.rb @@ -0,0 +1,282 @@ +# frozen_string_literal: true + +require './lib/colonial_twilight/fln_bot_rules' +require './lib/colonial_twilight/game' + +class FLNRulesImpl + include ColonialTwilight::FLNBotRules + def initialize + @debug = 0 + @board = nil + end + attr_writer :board + + def limited_op_only? + true + end + + def d6 + 5 + end + + # def first_eligible? + # true + # end + # + # def will_be_next_first_eligible? + # true + # end +end + +describe ColonialTwilight::FLNBotRules do + + rules = FLNRulesImpl.new + before do + @board = ColonialTwilight::Board.new + @board.load :short + rules.board = @board + end + + describe 'Pass' do + it 'pass? no' do + expect(rules.pass?).to be false + end + + it 'pass? no resources' do + @board.shift_track :fln_resources, -15 + expect(rules.pass?).to be true + end + end + + describe 'Terror' do + it 'terror1? no' do + expect(rules.terror1?).to be false + end + + it 'terror1? all bases are protected' do + @board.by_name('Souk Ahras').add :fln_underground + @board.by_name('Tizi Ouzou').add :fln_underground + @board.by_name('Bougie').add :fln_underground + @board.by_name('Orleansville').add :fln_underground + expect(rules.terror1?).to be true + end + + # it 'terror2? true' do + # expect(rules.terror2?).to be false + # end + end + + describe 'Rally' do + + it 'rally1? false' do + expect(rules.rally1?).to be false + end + + it 'rally1? may rally_1' do + space = @board.by_name('Barika') + space.add :fln_active, 2 + expect(rules.rally1?).to be true + end + + it 'rally1? may rally_2' do + space = @board.by_name('Barika') + space.add :fln_active, 3 + expect(rules.rally1?).to be true + end + + it 'rally2? enough fln at bases' do + expect(rules.rally2?).to be true + end + + it 'rally2? false' do + @board.by_name('Bougie').add :fln_active, 1 + expect(rules.rally2?).to be false + end + + it 'may_add_base_in?' do + expect(@board.spaces.select(&rules.method(:may_add_base_in?)).size).to eq(0) + end + + it 'may_add_base_in?' do + @board.by_name('Batna').add :fln_active, 3 + expect(@board.spaces.select(&rules.method(:may_add_base_in?))[0].name).to eq('Batna') + end + + it 'may_add_base_in?' do + space = @board.by_name('Batna') + space.add :fln_active, 6 + space.add :fln_base, 1 + expect(@board.spaces.select(&rules.method(:may_add_base_in?)).size).to eq(0) + end + + it 'rally_1_in? not enough fln cubes' do + space = @board.by_name('Barika') + expect(rules.rally_1_in?(space)).to be false + end + + it 'rally_1_in? enough fln cubes' do + space = @board.by_name('Barika') + space.add :fln_active, 2 + expect(rules.rally_1_in?(space)).to be true + end + + it 'rally_2_in? not enough fln cubes' do + space = @board.by_name('Barika') + expect(rules.rally_2_in?(space)).to be false + end + + it 'rally_2_in? enough fln cubes' do + space = @board.by_name('Barika') + space.add :fln_active, 3 + expect(rules.rally_2_in?(space)).to be true + end + + it 'rally_3_in? no base' do + space = @board.by_name('Batna') + expect(rules.rally_3_in?(space)).to be false + end + + it 'rally_3_in? base and 0 pop and 0 fln underground' do + space = @board.by_name('Batna') + space.add :fln_base, 1 + expect(rules.rally_3_in?(space)).to be true + end + + it 'rally_3_in? base and 0 pop but fln underground' do + space = @board.by_name('Batna') + space.add :fln_base, 1 + space.add :fln_underground, 1 + expect(rules.rally_3_in?(space)).to be false + end + + it 'rally_3_in? base and not enough fln underground' do + space = @board.by_name('Bougie') + expect(rules.rally_3_in?(space)).to be true + end + + it 'rally_3_in? base but not enough fln underground' do + space = @board.by_name('Bougie') + space.add :fln_underground, 1 + expect(rules.rally_3_in?(space)).to be false + end + + it 'rally_3_priority Algeria' do + a = @board.by_name('Ain Oussera') + b = @board.by_name('Morocco') + b.add :fln_base, -2 + b.add :fln_underground, -4 + expect(rules.rally_3_priority([a, b]).name).to eq('Ain Oussera') + end + + it 'rally_3_priority with GOV cubes' do + a = @board.by_name('Mecheria') + b = @board.by_name('Saida') + expect(rules.rally_3_priority([a, b]).name).to eq('Mecheria') + end + + it 'rally_3_priority pop 1+' do + a = @board.by_name('Ain Oussera') + b = @board.by_name('Sidi Aissa') + expect(rules.rally_3_priority([a, b]).name).to eq('Ain Oussera') + end + + it 'rally_3_priority least fln_underground' do + a = @board.by_name('Tebessa') + a.add :fln_underground, 1 + b = @board.by_name('Barika') + expect(rules.rally_3_priority([a, b]).name).to eq('Barika') + end + + it 'rally_5_in? city' do + space = @board.by_name('Oran') + expect(rules.rally_5_in?(space)).to be false + end + + it 'rally_5_in? support but fln underground' do + space = @board.by_name('Barika') + space.shift :support + expect(rules.rally_5_in?(space)).to be false + end + + it 'rally_5_in? support and fln underground' do + space = @board.by_name('Barika') + space.shift :support + space.add :fln_underground, -1 + expect(rules.rally_5_in?(space)).to be false + end + + it 'rally_6_in? 2+ pop but no fln control' do + space = @board.by_name('Medea') + expect(rules.rally_6_in?(space)).to be false + end + + it 'rally_6_in? 2+ pop and fln' do + space = @board.by_name('Medea') + space.add :fln_active, 3 + expect(rules.rally_6_in?(space)).to be true + end + + it 'rally_8_in? no fln cubes' do + space = @board.by_name('Tiaret') + expect(rules.rally_8_in?(space)).to be false + end + + it 'rally_8_in? fln cubes but base' do + space = @board.by_name('Bougie') + expect(rules.rally_8_in?(space)).to be false + end + + it 'rally_8_in? fln cubes and 0 base' do + space = @board.by_name('Barika') + expect(rules.rally_8_in?(space)).to be true + end + end + + describe '8.1.2 Procedure Guidelines' do + it 'place_in' do + expect(rules.place_in(@board.spaces).city?).to be true + end + + it 'place_in support' do + space = @board.by_name('Mostaganem') + space.add :fln_active, 3 + expect(rules.place_in(@board.spaces).city?).to be true + end + + it 'place_in support and fln_active' do + space = @board.by_name('Mostaganem') + space.shift :support + space.add :fln_active, 3 + expect(rules.place_in(@board.spaces).name).to be 'Mostaganem' + end + + it 'place_from none' do + expect(rules.place_from(@board.spaces).nil?).to be true + end + + it 'place_from most active' do + @board.by_name('Oran').add :fln_active, 1 + @board.by_name('Batna').add :fln_active, 3 + @board.by_name('Negrine').add :fln_active, 2 + expect(rules.place_from(@board.spaces).name).to be 'Batna' + end + + it 'remove_from all' do + space = @board.by_name('Bougie') + space.add :fln_active, 2 + h = rules.remove_from(space, 6) + expect(h[:fln_underground]).to be 1 + expect(h[:fln_active]).to be 2 + expect(h[:fln_bases]).to be 1 + end + + it 'remove_from a few' do + space = @board.by_name('Bougie') + space.add :fln_active, 1 + h = rules.remove_from(space, 2) + expect(h[:fln_underground]).to be 1 + expect(h[:fln_active]).to be 1 + expect(h[:fln_bases]).to be 0 + end + end +end |