summaryrefslogtreecommitdiffstats
path: root/spec
diff options
context:
space:
mode:
authorJérémy Zurcher <jeremy@asynk.ch>2023-10-03 22:44:09 +0200
committerJérémy Zurcher <jeremy@asynk.ch>2023-10-03 22:44:09 +0200
commitdcc1cc51c4ac9eb80431999fef79f0d46728073b (patch)
tree4cbe48268310ca65ec294a8687c532da6863b951 /spec
parent1e45085b7730bdb9b0b0ed76e6613a9fac5136cd (diff)
downloadcolonial-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.rb282
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