1 # Copyright © 2013, 2021 Nick Bowler
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation, either version 3 of the License, or
6 # (at your option) any later version.
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
13 # You should have received a copy of the GNU General Public License
14 # along with this program. If not, see <https://www.gnu.org/licenses/>.
16 AT_BANNER([Original data file tests])
18 AT_ARG_OPTION_ARG([moo2-datadir],
19 [AS_HELP_STRING([--moo2-datadir],
20 [location of original MOO2 data files
21 (default: \${datadir}/moo2-data)], [17])],
22 [moo2_datadir=$at_optarg], [moo2_datadir=$datadir/moo2-data])
24 m4_divert_push([PREPARE_TESTS])dnl
25 # Compute MD5 hash of standard input.
27 set x `$MD5 </dev/null 2>/dev/null`
28 for md5_pos in 2 $#; do
29 AS_VAR_COPY([md5_digest], [$md5_pos])
31 d41d8cd98f00b204e9800998ecf8427e)
32 set x `$MD5 && echo $?`
33 eval "echo \$$md5_pos; return \$$#"
38 m4_divert_pop([PREPARE_TESTS])
40 dnl TEST_REQUIRE_MOO2_DATA(file ...)
42 dnl Copy (or link) one or more MOO2 data files from the MOO2 installation
43 dnl directory into the current test case directory. Installed filenames are
44 dnl matched case-insensitively and copied to the name specified.
46 dnl The test group will be skipped if any requested file does not exist.
47 m4_define([TEST_REQUIRE_MOO2_DATA_CASEWRAP],
48 [@<:@m4_toupper([$1])m4_tolower([$1])@:>@])
49 m4_define([TEST_REQUIRE_MOO2_DATA], [AT_KEYWORDS([$1])dnl
50 m4_foreach_w([DATAFILE], [$1],
51 [m4_pushdef([PATTERN],
52 [$][1/]m4_dquote(m4_map([$0_CASEWRAP],
53 m4_cdr(m4_bpatsubst(m4_defn([DATAFILE]), [.], [,[[\&]]])))))dnl
54 test -f DATAFILE || for f in m4_join([ ],
55 PATTERN(["$moo2_datadir"]),
56 PATTERN([/usr/share/moo2-data]))
58 test -f "$f" && { $LN_S "$f" DATAFILE || cp "$f" DATAFILE; } && break
60 AT_SKIP_IF([test ! -f "$f"])
61 m4_popdef([PATTERN])])])
63 dnl TEST_UNPACK_MOO2_DATA(file ...)
65 dnl Wrapper around TEST_REQUIRE_MOO2_DATA that unpacks each file (which should
67 m4_define([TEST_UNPACK_MOO2_DATA],
68 [TEST_REQUIRE_MOO2_DATA([$1])dnl
69 m4_map_args_w([$1], [AT_CHECK([lbxtool -xf ]], [)], [
72 dnl TEST_CHECK_PAM_MD5(file, expected_md5, [header = value] ...)
74 dnl Compute and validate the MD5 hash over the plane data from a PAM image.
75 dnl Additional arguments specify PAM header fields that should be checked.
76 m4_define([TEST_CHECK_PAM_MD5],
77 [exec 3<$1; AT_CHECK([pam_check_header <&3 \
78 m4_map_args_sep([m4_apply([m4_car], m4_split(], [))], [ ], m4_shift2($@))
80 echo $pam_TUPLTYPE >$1.tt
81 exit $?], [0],[m4_map_args([m4_n], m4_shift2($@))])
82 AT_CHECK([test_md5sum <&3 >$1.md5])
85 # For reliable verification of images with transparency, we must have a known
86 # constant colour value for transparent pixels. We can use netpbm tools to
87 # zero out those pixels. For affected image formats, if we cannot normalize
88 # the transparent pixels we have to skip the test if verification would fail.
91 read pam_TUPLTYPE <$1.tt
92 AS_CASE([$pam_TUPLTYPE],
93 [GRAYSCALE_ALPHA], [alpha=1],
94 [RGB_ALPHA], [alpha=3],
96 AS_IF([test "$alpha" -gt 0],
97 [$PAMCHANNEL "$alpha" <$1 >$1.msk &&
98 $PAMARITH -and $1 $1.msk >$1.fix &&
99 { pam_read_header && test_md5sum; } <$1.fix >$1.tmp &&
100 mv -f $1.tmp $1.md5 ||
102 AT_CHECK([$md5_reliable || { read x <$1.md5; test x"$x" = x"$2" || exit 77; }])
104 AT_CHECK([cat $1.md5], [0], [m4_n([$2])])])
106 # Image with transparency and embedded palette
107 AT_SETUP([logo.lbx.000])
109 TEST_UNPACK_MOO2_DATA([logo.lbx])
110 AT_CHECK([lbximg -F pam -df logo.lbx.000])
111 TEST_CHECK_PAM_MD5([out.000.pam],
112 [e51c564aa638dc62dd1fd79e6f6cc375],
113 [WIDTH = 640], [HEIGHT = 480], [TUPLTYPE = RGB_ALPHA])
117 # Animation with embedded palette
118 AT_SETUP([logo.lbx.001])
120 TEST_UNPACK_MOO2_DATA([logo.lbx])
121 AT_CHECK([lbximg -F pam -df logo.lbx.001])
122 TEST_CHECK_PAM_MD5([out.000.pam],
123 [13a60ede277eebe8fec69f03c5cb5843],
124 [WIDTH = 640], [HEIGHT = 480], [TUPLTYPE = RGB])
125 TEST_CHECK_PAM_MD5([out.030.pam],
126 [c687fc35b940d0bfdaea5b6d51aa03c4],
127 [WIDTH = 640], [HEIGHT = 480], [TUPLTYPE = RGB])
128 TEST_CHECK_PAM_MD5([out.063.pam],
129 [7c694409997fe15272abe71f3fea2759],
130 [WIDTH = 640], [HEIGHT = 480], [TUPLTYPE = RGB])
134 # Animation with external palette
135 AT_SETUP([mainmenu.lbx.000])
137 TEST_UNPACK_MOO2_DATA([fonts.lbx mainmenu.lbx])
138 AT_CHECK([lbximg -F pam -df mainmenu.lbx.000 -p fonts.lbx.006])
139 TEST_CHECK_PAM_MD5([out.000.pam],
140 [7c3b347e03d42cd7bd1597f9dd58594e],
141 [WIDTH = 640], [HEIGHT = 480], [TUPLTYPE = RGB])
142 TEST_CHECK_PAM_MD5([out.015.pam],
143 [2a66f4c30ca315cc061606b27cef4adf],
144 [WIDTH = 640], [HEIGHT = 480], [TUPLTYPE = RGB])
145 TEST_CHECK_PAM_MD5([out.049.pam],
146 [848e33a0addc6e9acdc4fee6cbd56639],
147 [WIDTH = 640], [HEIGHT = 480], [TUPLTYPE = RGB])
151 # Image with external palette
152 AT_SETUP([mainmenu.lbx.007])
154 TEST_UNPACK_MOO2_DATA([fonts.lbx mainmenu.lbx])
155 AT_CHECK([lbximg -F pam -df mainmenu.lbx.007 -p fonts.lbx.006])
156 TEST_CHECK_PAM_MD5([out.000.pam],
157 [f301ffcc1a2faa3a0aa68514784012ec],
158 [WIDTH = 153], [HEIGHT = 22], [TUPLTYPE = RGB])
162 # Image with embedded palette
163 AT_SETUP([mainmenu.lbx.021])
165 TEST_UNPACK_MOO2_DATA([mainmenu.lbx])
166 AT_CHECK([lbximg -F pam -df mainmenu.lbx.021])
167 TEST_CHECK_PAM_MD5([out.000.pam],
168 [848e33a0addc6e9acdc4fee6cbd56639],
169 [WIDTH = 640], [HEIGHT = 480], [TUPLTYPE = RGB])
173 # Animation with transparency, override palette and non-zero chunk size
174 AT_SETUP([monster.lbx.007])
176 TEST_UNPACK_MOO2_DATA([fonts.lbx monster.lbx])
178 [lbximg -F pam -df monster.lbx.007 -p fonts.lbx.004 -O monster.lbx.014])
179 TEST_CHECK_PAM_MD5([out.000.pam],
180 [35d32459bfce6b19df14cafd2faf398b],
181 [WIDTH = 59], [HEIGHT = 62], [TUPLTYPE = RGB_ALPHA])
182 TEST_CHECK_PAM_MD5([out.005.pam],
183 [924fafdc83e0414331e0c627c3f9b3c7],
184 [WIDTH = 59], [HEIGHT = 62], [TUPLTYPE = RGB_ALPHA])
185 TEST_CHECK_PAM_MD5([out.019.pam],
186 [272ca2d13132a1b0497e47225ee680e2],
187 [WIDTH = 59], [HEIGHT = 62], [TUPLTYPE = RGB_ALPHA])
191 # Image with transparency, external and override palettes
192 AT_SETUP([ships.lbx.042])
194 TEST_UNPACK_MOO2_DATA([fonts.lbx ships.lbx])
195 AT_CHECK([lbximg -F pam -df ships.lbx.042 -p fonts.lbx.012 -O ships.lbx.049])
196 TEST_CHECK_PAM_MD5([out.000.pam], [4ababc13ae860494d4f512f8ebeca834],
197 [WIDTH = 52], [HEIGHT = 52], [TUPLTYPE = RGB_ALPHA])
201 # Image with raw frame format
202 AT_SETUP([starbg.lbx.009])
204 TEST_UNPACK_MOO2_DATA([fonts.lbx starbg.lbx])
205 AT_CHECK([lbximg -F pam -df starbg.lbx.009 -p fonts.lbx.005])
206 TEST_CHECK_PAM_MD5([out.000.pam],
207 [3b6ccbe3fc46e13c1fa80edf611d7a62],
208 [WIDTH = 61], [HEIGHT = 56], [TUPLTYPE = RGB])