# Copyright © 2022-2023 Nick Bowler
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
AT_SETUP([board bitmap functions])
AT_CHECK([boardbit], [0],
[[left(0) left(1) left(2) left(3) left(4)
@.... @@... @@@.. @@@@. @@@@@
@.... @@... @@@.. @@@@. @@@@@
@.... @@... @@@.. @@@@. @@@@@
@.... @@... @@@.. @@@@. @@@@@
@.... @@... @@@.. @@@@. @@@@@
right(0) right(1) right(2) right(3) right(4)
@@@@@ .@@@@ ..@@@ ...@@ ....@
@@@@@ .@@@@ ..@@@ ...@@ ....@
@@@@@ .@@@@ ..@@@ ...@@ ....@
@@@@@ .@@@@ ..@@@ ...@@ ....@
@@@@@ .@@@@ ..@@@ ...@@ ....@
above(0) above(1) above(2) above(3) above(4)
@@@@@ @@@@@ @@@@@ @@@@@ @@@@@
..... @@@@@ @@@@@ @@@@@ @@@@@
..... ..... @@@@@ @@@@@ @@@@@
..... ..... ..... @@@@@ @@@@@
..... ..... ..... ..... @@@@@
below(0) below(1) below(2) below(3) below(4)
@@@@@ ..... ..... ..... .....
@@@@@ @@@@@ ..... ..... .....
@@@@@ @@@@@ @@@@@ ..... .....
@@@@@ @@@@@ @@@@@ @@@@@ .....
@@@@@ @@@@@ @@@@@ @@@@@ @@@@@
]])
AT_CLEANUP
TEST_TAP_SIMPLE([board_rect], [boardrect], [], [board])
AT_SETUP([game_do_move zigzag])
AT_CHECK([boardmove m4_do(
[0010203040],
[4131211101],
[0212223242],
[4333231303],
[0414243444])], [0],
[[.@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@.@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@.@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@.@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@.
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@.
@@@@@
@@@@@
@@@@@
@@@@@
@@@.@
@@@@@
@@@@@
@@@@@
@@@@@
@@.@@
@@@@@
@@@@@
@@@@@
@@@@@
@.@@@
@@@@@
@@@@@
@@@@@
@@@@@
.@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
.@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@.@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@.@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@.@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@.
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@.
@@@@@
@@@@@
@@@@@
@@@@@
@@@.@
@@@@@
@@@@@
@@@@@
@@@@@
@@.@@
@@@@@
@@@@@
@@@@@
@@@@@
@.@@@
@@@@@
@@@@@
@@@@@
@@@@@
.@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
.@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@.@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@.@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@.@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@.
]])
AT_CLEANUP
AT_SETUP([game_do_move vertical])
AT_CHECK([boardmove m4_do(
[020103000402],
[121311141012],
[222123202422],
[323331343032],
[424143404442])], [0],
[[@@@@@
@@@@@
.@@@@
@@@@@
@@@@@
@@@@@
.@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
.@@@@
@@@@@
.@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
.@@@@
@@@@@
@@@@@
.@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@.@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@.@@@
@@@@@
@@@@@
@.@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@.@@@
@.@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@.@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@.@@
@@@@@
@@@@@
@@@@@
@@.@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@.@@
@@@@@
@@.@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@.@@
@@@@@
@@@@@
@@.@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@.@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@.@
@@@@@
@@@@@
@@@.@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@.@
@@@.@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@.@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@.
@@@@@
@@@@@
@@@@@
@@@@.
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@.
@@@@@
@@@@.
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@.
@@@@@
@@@@@
@@@@.
@@@@@
@@@@@
]])
AT_CLEANUP
AT_SETUP([game_do_move horizontal])
AT_CHECK([boardmove m4_do(
[203010400020],
[211131014121],
[223212420222],
[231333034323],
[243414440424])], [0],
[[@@.@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@.@
@@@@@
@@@@@
@@@@@
@@@@@
@.@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@.
@@@@@
@@@@@
@@@@@
@@@@@
.@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@.@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@.@@
@@@@@
@@@@@
@@@@@
@@@@@
@.@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@.@
@@@@@
@@@@@
@@@@@
@@@@@
.@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@.
@@@@@
@@@@@
@@@@@
@@@@@
@@.@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@.@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@.@
@@@@@
@@@@@
@@@@@
@@@@@
@.@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@.
@@@@@
@@@@@
@@@@@
@@@@@
.@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@.@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@.@@
@@@@@
@@@@@
@@@@@
@@@@@
@.@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@.@
@@@@@
@@@@@
@@@@@
@@@@@
.@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@.
@@@@@
@@@@@
@@@@@
@@@@@
@@.@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@.@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@.@
@@@@@
@@@@@
@@@@@
@@@@@
@.@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@@@.
@@@@@
@@@@@
@@@@@
@@@@@
.@@@@
@@@@@
@@@@@
@@@@@
@@@@@
@@.@@
]])
AT_CLEANUP
AT_SETUP([xoshiro256** sanity])
AT_CHECK([rng-test >out
grep -v '^ok' out], [0], [1..200
])
AT_CLEANUP
AT_SETUP([game_check_goal])
AT_DATA([boards.dat],
[[0 0 0 0 0 0
1f8c63f 1f8c63f 1f8c63f 0000 0000 0000
1f8c63f 1f8c63f 1f8c63f ffff 0000 0000
1f8c63f 1f8c63f 1f8c63f 0000 ffff 0000
1f8c63f 1f8c63f 1f8c63f 0000 0000 ffff
00739c0 1f8c63f 1f8c63f ffff 0000 0000
1f8c63f 00739c0 1f8c63f 0000 ffff 0000
1f8c63f 1f8c63f 00739c0 0000 0000 ffff
0000000 0000000 0000000 0001 0020 0400
]])
AT_DATA([expout],
[[00000
00000
739c0
739c0
739c0
00000
00000
00000
10840
]])
AT_CHECK([checkgoal result.dat && cat result.dat], [0], [expout])
AT_CLEANUP
AT_SETUP([game_overlay_goal])
AT_DATA([boards.dat], [dnl
0 0 0 0 0 0
0 0 0 -1 0 0
0 0 0 0 -1 0
0 0 0 0 0 -1
1ffffff 1ffffff 1ffffff 0 0 0
])
AT_DATA([expout], [dnl
0000000 0000000 0000000
00739c0 0000000 0000000
0000000 00739c0 0000000
0000000 0000000 00739c0
1f8c63f 1f8c63f 1f8c63f
])
AT_CHECK([overlaygoal result.dat && cat result.dat],
[0], [expout])
AT_CLEANUP
# Basic check that we get different initial games if we run the program
# multiple times in sequence.
AT_SETUP([game_reset initial seed])
AT_CHECK([initboard >a && initboard >b && initboard >c])
AT_CHECK([diff a b || diff b c || diff a c || exit 42], [42], [ignore-nolog])
AT_CLEANUP