# 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 `md5sum @]) 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], [exec 3<$1; AT_CHECK([pam_check_header <&3 \ m4_map_args_sep([m4_apply([m4_car], m4_split(], [))], [ ], m4_shift2($@)) status=$? echo $pam_TUPLTYPE >$1.tt exit $?], [0],[m4_map_args([m4_n], m4_shift2($@))]) AT_CHECK([test_md5sum <&3 >$1.md5]) exec 3<&- # For reliable verification of images with transparency, we must have a known # constant colour value for transparent pixels. We can use netpbm tools to # zero out those pixels. For affected image formats, if we cannot normalize # 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