Skip to content

Commit

Permalink
[meson] Add first regression test to FreeType
Browse files Browse the repository at this point in the history
* tests/README.md: documentation explaining how to
  build and run the tests with the Meson build.

* tests/scripts/download-test-fonts.sh: Simple script
  to download test font files to the 'tests/data/'
  folder.

* meson.build, meson_options.txt, tests/meson.build:
  Add 'tests' option to enable building and running the
  test programs, disabled by default.

* tests/issue-1063/main.c: Simple regression test to
  exhibit issue 1063.

* .gitignore: Ignore the content of the tests/data/
  folder for now.
  • Loading branch information
David Turner committed Jun 16, 2021
1 parent c6fcd61 commit 6f273f6
Show file tree
Hide file tree
Showing 7 changed files with 136 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ include/dlg/
src/dlg/dlg.c
subprojects/*
!subprojects/*.wrap
/tests/data/*
3 changes: 3 additions & 0 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 5 additions & 0 deletions meson_options.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
22 changes: 22 additions & 0 deletions tests/README.md
Original file line number Diff line number Diff line change
@@ -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

32 changes: 32 additions & 0 deletions tests/issue-1063/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#include <stdio.h>

#include <freetype/freetype.h>
#include <ft2build.h>

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;
}
7 changes: 7 additions & 0 deletions tests/meson.build
Original file line number Diff line number Diff line change
@@ -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')

66 changes: 66 additions & 0 deletions tests/scripts/download-test-fonts.sh
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 6f273f6

Please sign in to comment.