diff --git a/.gitignore b/.gitignore index 6e9fd98ea..e4f1510bf 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ include/dlg/ src/dlg/dlg.c subprojects/* !subprojects/*.wrap +/tests/data/* diff --git a/meson.build b/meson.build index c5529a655..152024de0 100644 --- a/meson.build +++ b/meson.build @@ -369,6 +369,9 @@ pkgconfig.generate(ft2_lib, version: ft2_pkgconfig_version, ) +if get_option('tests').enabled() + subdir('tests') +endif # NOTE: Unlike the old `make refdoc` command, this generates the # documentation under `$BUILD/docs/` since Meson doesn't support modifying diff --git a/meson_options.txt b/meson_options.txt index f0fc50a38..8747f52df 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -35,6 +35,11 @@ option('harfbuzz', + ' If available, many glyphs not directly addressable' + ' by a font\'s character map will be hinted also.') +option('tests', + type: 'feature', + value: 'disabled', + description: 'Enable FreeType unit and regression tests.') + option('brotli', type: 'feature', value: 'auto', diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 000000000..f6f861182 --- /dev/null +++ b/tests/README.md @@ -0,0 +1,22 @@ +# Unit and regression tests for the FreeType library + +## Quick Start + +### Download test fonts + +Run the `tests/scripts/download-fonts.sh` script, which will +download test fonts to the `tests/data/` directory first. + +### Build the test programs + +The tests are only built with the Meson build system, and +are disabled by default, enable the 'tests' option to compile +them, as in: + + meson setup out -Dtests=enabled + meson compile -C out + +### Run the test programs + + meson test -C out + diff --git a/tests/issue-1063/main.c b/tests/issue-1063/main.c new file mode 100644 index 000000000..eac02642a --- /dev/null +++ b/tests/issue-1063/main.c @@ -0,0 +1,32 @@ +#include + +#include +#include + +int +main( void ) +{ + FT_Library library; + FT_Face face; + + /* Assumes this is run from out/ build directory though 'meson test -C out' */ + const char* filepath = "../tests/data/As.I.Lay.Dying.ttf"; + + FT_Init_FreeType( &library ); + FT_New_Face( library, filepath, 0, &face ); + if ( !face ) + { + fprintf( stderr, "Could not open file: %s\n", filepath ); + return 1; + } + + for ( FT_ULong i = 59; i < 171; i++ ) + { + FT_UInt gid = FT_Get_Char_Index( face, i ); + FT_Error code = FT_Load_Glyph( face, gid, FT_LOAD_DEFAULT ); + if ( code ) + printf( "unknown %d for char %lu, gid %u\n", code, i, gid ); + } + + return 0; +} diff --git a/tests/meson.build b/tests/meson.build new file mode 100644 index 000000000..8c5d0345f --- /dev/null +++ b/tests/meson.build @@ -0,0 +1,7 @@ +test_issue_1063 = executable('issue-1063', + files([ 'issue-1063/main.c' ]), + dependencies: freetype_dep, +) + +test('issue-1063', test_issue_1063, suite: 'regression') + diff --git a/tests/scripts/download-test-fonts.sh b/tests/scripts/download-test-fonts.sh new file mode 100755 index 000000000..1158f10c5 --- /dev/null +++ b/tests/scripts/download-test-fonts.sh @@ -0,0 +1,66 @@ +#!/usr/bin/bash +# Download test fonts used by the FreeType regression test programs. +# These will be copied to $FREETYPE/tests/data/ +# Each font file contains an 8-hexchar prefix corresponding to its md5sum + +set -e + +export LANG=C +export LC_ALL=C + +PROGDIR=$(dirname "$0") +PROGNAME=$(basename "$0") + +# Download a file from a given URL +# +# $1: URL +# $2: Destination directory +# $3: If not empty, destination file name. Default is to take +# the URL's basename. +# +download_file () { + local URL=$1 + local DST_DIR=$2 + local DST_FILE=$3 + if [[ -z "$DST_FILE" ]]; then + DST_FILE=$(basename "$URL") + fi + echo "URL: $URL" + wget -q -O "$DST_DIR/$DST_FILE" "$URL" +} + +# $1: URL +# $2: Destination directory +# $3+: Optional file list, otherwise the full archive is extracted to $2 +download_and_extract_zip () { + local URL=$1 + local DST_DIR=$2 + shift + shift + TEMP_DST_DIR=$(mktemp -d) + TEMP_DST_NAME="a.zip" + download_file "$URL" "$TEMP_DST_DIR" "$TEMP_DST_NAME" + unzip -qo "$TEMP_DST_DIR/$TEMP_DST_NAME" -d "$DST_DIR" "$@" + rm -rf "$TEMP_DST_DIR" +} + +# $1: File path +# $2: Expected md5sum +md5sum_check () { + local FILE=$1 + local EXPECTED=$2 + local HASH=$(md5sum "$FILE" | cut -d" " -f1) + if [[ "$EXPECTED" != "$HASH" ]]; then + echo "$FILE: Invalid md5sum $HASH expected $EXPECTED" + return 1 + fi +} + +INSTALL_DIR=$(cd $PROGDIR/.. && pwd)/data + +mkdir -p "$INSTALL_DIR" + +# See https://gitlab.freedesktop.org/freetype/freetype/-/issues/1063 +download_and_extract_zip "https://github.com/python-pillow/Pillow/files/6622147/As.I.Lay.Dying.zip" "$INSTALL_DIR" +mv "$INSTALL_DIR/As I Lay Dying.ttf" "$INSTALL_DIR/As.I.Lay.Dying.ttf" +md5sum_check "$INSTALL_DIR/As.I.Lay.Dying.ttf" e153d60e66199660f7cfe99ef4705ad7