diff options
author | Jérémy Zurcher <jeremy@asynk.ch> | 2023-12-05 11:29:20 +0100 |
---|---|---|
committer | Jérémy Zurcher <jeremy@asynk.ch> | 2023-12-05 11:29:20 +0100 |
commit | 499cc01cd966e96fe6371a36e0cffcb073806079 (patch) | |
tree | c5ed4dab2351e6e981da62dfb423492e4efbb34f /spec/fln_bot_spec.rb | |
parent | 5b489f8e17a8b5178e9c4b55eee22f0f72d33073 (diff) | |
download | colonial-twilight-499cc01cd966e96fe6371a36e0cffcb073806079.zip colonial-twilight-499cc01cd966e96fe6371a36e0cffcb073806079.tar.gz |
FLNBot : rewrite
Diffstat (limited to 'spec/fln_bot_spec.rb')
-rw-r--r-- | spec/fln_bot_spec.rb | 317 |
1 files changed, 317 insertions, 0 deletions
diff --git a/spec/fln_bot_spec.rb b/spec/fln_bot_spec.rb new file mode 100644 index 0000000..ae5a05d --- /dev/null +++ b/spec/fln_bot_spec.rb @@ -0,0 +1,317 @@ +# frozen_string_literal: true + +require './lib/colonial_twilight/fln_bot' +require './spec/mock_board' + +class ColonialTwilight::FLNBot + attr_writer :debug + + def setup(op_limited: true) + @possible_actions = %i[pass op op_limited] unless op_limited + @possible_actions = %i[pass op_limited] if op_limited + end +end + +describe ColonialTwilight::FLNBot do + before do + @game = Game.new + @game.board.fln_resources = 1 + @game.board.available_fln_underground = 1 + @bot = ColonialTwilight::FLNBot.new(@game, :FLN) + @bot.setup + end + + describe 'Pass' do + it 'cost' do + expect(@bot.pass).to be true + expect(@game.action.cost).to eq(-1) + end + + it 'steps' do + expect(@bot.pass).to be true + expect(@game.action.steps.size).to eq(1) + end + + it 'kind' do + expect(@bot.pass).to be true + expect(@game.action.steps[0][:kind]).to eq(:pass) + end + end + + describe 'Extort' do + it 'nowhere' do + expect(@bot.extort).to be false + end + + it 'success' do + @game.set(pop: 1, fln_underground: 1) + expect(@bot.extort).to be true + end + + it 'not if special activity already done' do + @bot.turn.special_activity_in(:subvert, @game.board.spaces[0], 1) + @game.set(pop: 1, fln_underground: 1) + expect(@bot.extort).to be false + end + end + + describe 'Terror' do + it 'nowhere' do + expect(@bot.terror).to be false + end + + it 'terror 1' do + @game.set(pop: 1, fln_underground: 1, support: true) + expect(@bot.terror).to be true + end + + it 'terror 2' do + @game.set(pop: 1, fln_underground: 1, neutral: true, gov_bases: 1) + expect(@bot.terror).to be true + end + + it 'terror 1 + extort' do + @game.board.fln_resources = 0 + @game.set(pop: 1, fln_underground: 2, support: true) + expect(@bot.terror).to be true + end + + it 'terror 1 + extort not possible' do + @game.board.fln_resources = 0 + @game.set(pop: 1, fln_underground: 1, support: true) + expect(@bot.terror).to be false + end + end + + describe 'Attack' do + def check_transfer(step, what, dst, num) + expect(step[:kind]).to be :transfer + expect(step[:what]).to be what + expect(step[:dst]).to be dst + expect(step[:num]).to eq num + end + + def check_activate(step, num) + expect(step[:kind]).to be :activate + expect(step[:num]).to eq num + end + + it 'algerian_police ambush' do + @game.set(algerian_police: 1, fln_active: 5, fln_underground: 1) + expect(@bot.attack).to be true + expect(@game.action.type).to be :ambush + check_activate(@game.action.steps[0], 1) + check_transfer(@game.action.steps[1], :algerian_police, :casualties, 1) + check_transfer(@game.action.steps[2], :fln_active, :available, 1) + end + + it 'ambush twice then attack' do + @game.board.fln_resources = 3 + @game.set(french_troops: 1, french_police: 1, algerian_police: 1, fln_active: 3, fln_underground: 3) + @game.set(gov_bases: 1, algerian_police: 1, fln_active: 4, fln_underground: 2) + @game.set(algerian_police: 1, fln_active: 1, fln_underground: 5) + expect(@bot.attack).to be true + act = @game.actions[0] + expect(act.type).to be :ambush + check_activate(act.steps[0], 1) + check_transfer(act.steps[1], :french_police, :casualties, 1) + check_transfer(act.steps[2], :fln_active, :available, 1) + act = @game.actions[1] + expect(act.type).to be :ambush + check_activate(act.steps[0], 1) + check_transfer(act.steps[1], :algerian_police, :casualties, 1) + check_transfer(act.steps[2], :fln_active, :available, 1) + act = @game.actions[2] + expect(act.type).to be :attack + check_activate(act.steps[0], 5) + check_transfer(act.steps[1], :algerian_police, :casualties, 1) + check_transfer(act.steps[2], :fln_active, :available, 1) + end + + it 'roll to attack' do + @game.board.fln_resources = 3 + @game.set(algerian_police: 3, fln_active: 2, fln_underground: 1) + @game.set(algerian_police: 3, fln_active: 2, fln_underground: 1) + @game.set(algerian_police: 1, fln_active: 2, fln_underground: 2) + expect(@bot.attack).to be true + act = @game.actions[2] + expect(act.type).to be :attack + check_activate(@game.action.steps[0], 2) + check_activate(act.steps[0], 2) + check_transfer(act.steps[1], :algerian_police, :casualties, 1) + check_transfer(act.steps[2], :fln_active, :available, 1) + end + + it 'attrition' do + @game.board.fln_resources = 3 + @game.set(algerian_police: 30, fln_active: 2, fln_underground: 1) + @game.set(algerian_police: 30, fln_active: 2, fln_underground: 1) + @game.set(algerian_police: 3, fln_active: 2, fln_underground: 2) + expect(@bot.attack).to be true + act = @game.actions[2] + expect(act.type).to be :attack + check_activate(@game.action.steps[0], 2) + check_activate(act.steps[0], 2) + check_transfer(act.steps[1], :algerian_police, :casualties, 2) + check_transfer(act.steps[2], :fln_active, :available, 1) + check_transfer(act.steps[3], :fln_active, :casualties, 1) + end + + it 'attack + extort' do + @game.board.fln_resources = 0 + @game.set(algerian_police: 3, fln_active: 2, fln_underground: 1) + @game.set(name: 'country', pop: 1, fln_underground: 1, independent: true) + expect(@bot.attack).to be true + end + end + + describe 'Subvert' do + it 'nowhere' do + expect(@bot.subvert).to be false + end + + it 'subvert 1' do + @game.set(fln_underground: 1, algerian_police: 1) + expect(@bot.subvert).to be true + expect(@game.actions.size).to be 1 + expect(@game.action.steps.size).to be 1 + end + + it 'subvert 2' do + @game.set(fln_underground: 1, algerian_police: 1, french_troops: 1) + expect(@bot.subvert).to be true + expect(@game.actions.size).to be 1 + expect(@game.action.steps.size).to be 2 + end + + it 'subvert 1 + remove anywhere' do + @game.set(fln_underground: 1, algerian_police: 1) + @game.set(fln_underground: 1, algerian_troops: 1, french_troops: 1) + expect(@bot.subvert).to be true + expect(@game.actions.size).to be 2 + end + + it 'OP + 2 x remove anywhere' do + expect(@bot.pass).to be true + @game.set(name: 'a', fln_underground: 1, algerian_troops: 1, french_troops: 1) + @game.set(name: 'b', fln_underground: 1, algerian_troops: 1, french_troops: 1) + expect(@bot.subvert).to be true + expect(@game.actions.size).to be 3 + end + end + + describe 'Rally' do + it 'nowhere' do + expect(@bot.rally).to be false + end + + it 'rally 1' do + @game.set(fln_active: 1, fln_underground: 2) + expect(@bot.rally).to be true + expect(@game.action.steps.size).to be 3 + end + + it 'rally 2' do + @bot.setup(op_limited: false) + @game.set(fln_active: 2, fln_underground: 2, french_troops: 1) + expect(@bot.rally).to be true + expect(@game.action.steps.size).to be 2 + end + + it 'rally 3' do + @game.set(fln_bases: 1) + @game.set(fln_bases: 2) + expect(@bot.rally).to be true + expect(@game.action.steps.size).to be 1 + end + + it 'rally 4' do + @game.board.france_track = 2 + expect(@bot.rally).to be true + end + + it 'rally 5' do + @game.set(support: true) + @game.set(support: true) + expect(@bot.rally).to be true + expect(@game.action.steps.size).to be 1 + end + + it 'rally 6 + agitate' do + @game.board.fln_resources = 20 + @game.set(pop: 2, terror: 2) + @game.set(pop: 2, terror: 3) + expect(@bot.rally).to be true + expect(@game.action.cost).to be 3 + expect(@game.actions.size).to be 2 + end + + it 'rally 6 + only reduce terror' do + @game.board.fln_resources = 9 + @game.set(pop: 2, terror: 8) + expect(@bot.rally).to be true + expect(@bot.turn.cost).to be 6 + expect(@game.action.cost).to be 5 + expect(@game.actions.size).to be 2 + end + + it 'rally 6 + extort + agitate' do + @game.board.fln_resources = 1 + @game.set(pop: 2, terror: 1) + @game.set(name: 'country', pop: 1, fln_underground: 1, independent: true) + @game.set(name: 'country', pop: 1, fln_underground: 1, independent: true) + expect(@bot.rally).to be true + expect(@game.actions.size).to be 4 + end + + it 'rally 6 + cannot extort => rally 7' do + @game.board.fln_resources = 1 + @game.set(pop: 2, terror: 1) + expect(@bot.rally).to be true + expect(@game.actions.size).to be 1 + end + + it 'rally 7 + limited agitate' do + @game.keep = true + @game.board.fln_resources = 9 + @game.set(fln_active: 1, terror: 10) + expect(@bot.rally).to be true + expect(@game.actions.size).to be 2 + expect(@game.actions[1].cost).to be 5 + end + + it 'rally 7 + extort + agitate' do + @game.keep = true + @game.board.fln_resources = 1 + @game.set(pop: 1, french_police: 3, fln_active: 1, fln_bases: 1, terror: 10) + @game.set(name: 'country', pop: 1, fln_underground: 1, independent: true) + @game.set(name: 'country', pop: 1, fln_underground: 1, independent: true) + @game.set(name: 'country', pop: 1, fln_underground: 1, independent: true) + expect(@bot.rally).to be true + expect(@game.actions.size).to be 5 + expect(@game.actions[4].type).to eq :agitate + expect(@game.actions[4].cost).to be 3 + end + + it 'agitate unselected' do + @game.keep = true + @game.board.fln_resources = 3 + @game.set(fln_active: 0, fln_bases: 1, terror: 1) + expect(@bot.rally).to be true + expect(@game.actions.size).to be 2 + expect(@game.actions[1].type).to eq :agitate + expect(@game.actions[1].cost).to be 2 + end + + it '2 rally 7 + rally 8' do + @bot.setup(op_limited: false) + @game.board.fln_resources = 3 + @game.set(fln_active: 1, oppose: 1) + @game.set(fln_active: 1, oppose: 1) + @game.set(fln_active: 1, oppose: 1) + @game.set(fln_active: 1, oppose: 1) + expect(@bot.rally).to be true + expect(@game.actions.size).to be 3 + end + end +end |