# Copyright © 2013, 2021 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_BANNER([Original data file tests]) AT_ARG_OPTION_ARG([moo2-datadir], [AS_HELP_STRING([--moo2-datadir], [location of original MOO2 data files (default: \${datadir}/moo2-data)], [17])], [moo2_datadir=$at_optarg], [moo2_datadir=$datadir/moo2-data]) m4_divert_push([PREPARE_TESTS])dnl # Compute MD5 hash of standard input. test_md5sum () { set x `$MD5 /dev/null` for md5_pos in 2 $#; do AS_VAR_COPY([md5_digest], [$md5_pos]) case $md5_digest in d41d8cd98f00b204e9800998ecf8427e) set x `$MD5 && echo $?` eval "echo \$$md5_pos; return \$$#" esac done return 77 } m4_divert_pop([PREPARE_TESTS]) dnl TEST_REQUIRE_MOO2_DATA(file ...) dnl dnl Copy (or link) one or more MOO2 data files from the MOO2 installation dnl directory into the current test case directory. Installed filenames are dnl matched case-insensitively and copied to the name specified. dnl dnl The test group will be skipped if any requested file does not exist. m4_define([TEST_REQUIRE_MOO2_DATA_CASEWRAP], [@<:@m4_toupper([$1])m4_tolower([$1])@:>@]) m4_define([TEST_REQUIRE_MOO2_DATA], [AT_KEYWORDS([$1])dnl m4_foreach_w([DATAFILE], [$1], [m4_pushdef([PATTERN], [$][1/]m4_dquote(m4_map([$0_CASEWRAP], m4_cdr(m4_bpatsubst(m4_defn([DATAFILE]), [.], [,[[\&]]])))))dnl test -f DATAFILE || for f in m4_join([ ], PATTERN(["$moo2_datadir"]), PATTERN([/usr/share/moo2-data])) do test -f "$f" && { $LN_S "$f" DATAFILE || cp "$f" DATAFILE; } && break done AT_SKIP_IF([test ! -f "$f"]) m4_popdef([PATTERN])])]) dnl TEST_UNPACK_MOO2_DATA(file ...) dnl dnl Wrapper around TEST_REQUIRE_MOO2_DATA that unpacks each file (which should dnl be archives). m4_define([TEST_UNPACK_MOO2_DATA], [TEST_REQUIRE_MOO2_DATA([$1])dnl m4_map_args_w([$1], [AT_CHECK([lbxtool -xf ]], [)], [ ])]) dnl TEST_CHECK_PAM_MD5(file, expected_md5, [header = value] ...) dnl dnl Compute and validate the MD5 hash over the plane data from a PAM image. dnl Additional arguments specify PAM header fields that should be checked. m4_define([TEST_CHECK_PAM_MD5], [AT_CHECK([:; { pam_check_header m4_map_args_sep( [m4_apply([m4_car], m4_split(], [))], [ ], m4_shift2($@)) && echo $pam_TUPLTYPE >$1.tt && test_md5sum >$1.md5; } <$1], [0], [m4_map_args([m4_n], m4_shift2($@))]) dnl AT_CHECK([test_md5sum <&3 >$1.md5]) dnl exec 3<&- dnl For reliable verification of images with transparency, we must have a known dnl constant colour value for transparent pixels. We can use netpbm tools to dnl zero out those pixels. For affected image formats, if we cannot normalize dnl the transparent pixels we have to skip the test if verification would fail. md5_reliable=true read pam_TUPLTYPE <$1.tt AS_CASE([$pam_TUPLTYPE], [GRAYSCALE_ALPHA], [alpha=1], [RGB_ALPHA], [alpha=3], [alpha=0]) AS_IF([test "$alpha" -gt 0], [$PAMCHANNEL "$alpha" <$1 >$1.msk && $PAMARITH -and $1 $1.msk >$1.fix && { pam_read_header && test_md5sum; } <$1.fix >$1.tmp && mv -f $1.tmp $1.md5 || md5_reliable=false AT_CHECK([$md5_reliable || { read x <$1.md5; test x"$x" = x"$2" || exit 77; }]) ]) AT_CHECK([cat $1.md5], [0], [m4_n([$2])])]) # Image with transparency and embedded palette AT_SETUP([logo.lbx.000]) TEST_UNPACK_MOO2_DATA([logo.lbx]) AT_CHECK([lbximg -F pam -df logo.lbx.000]) TEST_CHECK_PAM_MD5([out.000.pam], [e51c564aa638dc62dd1fd79e6f6cc375], [WIDTH = 640], [HEIGHT = 480], [TUPLTYPE = RGB_ALPHA]) AT_CLEANUP # Animation with embedded palette AT_SETUP([logo.lbx.001]) TEST_UNPACK_MOO2_DATA([logo.lbx]) AT_CHECK([lbximg -F pam -df logo.lbx.001]) TEST_CHECK_PAM_MD5([out.000.pam], [13a60ede277eebe8fec69f03c5cb5843], [WIDTH = 640], [HEIGHT = 480], [TUPLTYPE = RGB]) TEST_CHECK_PAM_MD5([out.030.pam], [c687fc35b940d0bfdaea5b6d51aa03c4], [WIDTH = 640], [HEIGHT = 480], [TUPLTYPE = RGB]) TEST_CHECK_PAM_MD5([out.063.pam], [7c694409997fe15272abe71f3fea2759], [WIDTH = 640], [HEIGHT = 480], [TUPLTYPE = RGB]) AT_CLEANUP # Animation with external palette AT_SETUP([mainmenu.lbx.000]) TEST_UNPACK_MOO2_DATA([fonts.lbx mainmenu.lbx]) AT_CHECK([lbximg -F pam -df mainmenu.lbx.000 -p fonts.lbx.006]) TEST_CHECK_PAM_MD5([out.000.pam], [7c3b347e03d42cd7bd1597f9dd58594e], [WIDTH = 640], [HEIGHT = 480], [TUPLTYPE = RGB]) TEST_CHECK_PAM_MD5([out.015.pam], [2a66f4c30ca315cc061606b27cef4adf], [WIDTH = 640], [HEIGHT = 480], [TUPLTYPE = RGB]) TEST_CHECK_PAM_MD5([out.049.pam], [848e33a0addc6e9acdc4fee6cbd56639], [WIDTH = 640], [HEIGHT = 480], [TUPLTYPE = RGB]) AT_CLEANUP # Image with external palette AT_SETUP([mainmenu.lbx.007]) TEST_UNPACK_MOO2_DATA([fonts.lbx mainmenu.lbx]) AT_CHECK([lbximg -F pam -df mainmenu.lbx.007 -p fonts.lbx.006]) TEST_CHECK_PAM_MD5([out.000.pam], [f301ffcc1a2faa3a0aa68514784012ec], [WIDTH = 153], [HEIGHT = 22], [TUPLTYPE = RGB]) AT_CLEANUP # Image with embedded palette AT_SETUP([mainmenu.lbx.021]) TEST_UNPACK_MOO2_DATA([mainmenu.lbx]) AT_CHECK([lbximg -F pam -df mainmenu.lbx.021]) TEST_CHECK_PAM_MD5([out.000.pam], [848e33a0addc6e9acdc4fee6cbd56639], [WIDTH = 640], [HEIGHT = 480], [TUPLTYPE = RGB]) AT_CLEANUP # Animation with transparency, override palette and non-zero chunk size AT_SETUP([monster.lbx.007]) TEST_UNPACK_MOO2_DATA([fonts.lbx monster.lbx]) AT_CHECK( [lbximg -F pam -df monster.lbx.007 -p fonts.lbx.004 -O monster.lbx.014]) TEST_CHECK_PAM_MD5([out.000.pam], [35d32459bfce6b19df14cafd2faf398b], [WIDTH = 59], [HEIGHT = 62], [TUPLTYPE = RGB_ALPHA]) TEST_CHECK_PAM_MD5([out.005.pam], [924fafdc83e0414331e0c627c3f9b3c7], [WIDTH = 59], [HEIGHT = 62], [TUPLTYPE = RGB_ALPHA]) TEST_CHECK_PAM_MD5([out.019.pam], [272ca2d13132a1b0497e47225ee680e2], [WIDTH = 59], [HEIGHT = 62], [TUPLTYPE = RGB_ALPHA]) AT_CLEANUP # Image with transparency, external and override palettes AT_SETUP([ships.lbx.042]) TEST_UNPACK_MOO2_DATA([fonts.lbx ships.lbx]) AT_CHECK([lbximg -F pam -df ships.lbx.042 -p fonts.lbx.012 -O ships.lbx.049]) TEST_CHECK_PAM_MD5([out.000.pam], [4ababc13ae860494d4f512f8ebeca834], [WIDTH = 52], [HEIGHT = 52], [TUPLTYPE = RGB_ALPHA]) AT_CLEANUP # Image with raw frame format AT_SETUP([starbg.lbx.009]) TEST_UNPACK_MOO2_DATA([fonts.lbx starbg.lbx]) AT_CHECK([lbximg -F pam -df starbg.lbx.009 -p fonts.lbx.005]) TEST_CHECK_PAM_MD5([out.000.pam], [3b6ccbe3fc46e13c1fa80edf611d7a62], [WIDTH = 61], [HEIGHT = 56], [TUPLTYPE = RGB]) AT_CLEANUP