]> git.draconx.ca Git - liblbx.git/blobdiff - tests/moo2data.at
Port all test cases to Autotest.
[liblbx.git] / tests / moo2data.at
diff --git a/tests/moo2data.at b/tests/moo2data.at
new file mode 100644 (file)
index 0000000..240787c
--- /dev/null
@@ -0,0 +1,207 @@
+# 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 <https://www.gnu.org/licenses/>.
+
+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 </dev/null`
+  case $2 in
+  d41d8cd98f00b204e9800998ecf8427e) set x `md5sum && echo $?` ;;
+  *) return 77 ;;
+  esac
+  echo $2
+  eval "return \$$#"
+}
+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],
+[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