So we can run tests parallel with cmake, reducing test time and IO overheadmaster
| - name: test | - name: test | ||||
| run: | | run: | | ||||
| ${{ matrix.config_env }} ${{ matrix.runenv }} cmake --build build --target tests | ${{ matrix.config_env }} ${{ matrix.runenv }} cmake --build build --target tests | ||||
| ${{ matrix.config_env }} ${{ matrix.runenv }} ctest --test-dir build -Ttest -j1 --output-on-failure | |||||
| ${{ matrix.config_env }} ${{ matrix.runenv }} ctest --test-dir build -Ttest -j8 --output-on-failure |
| - name: make | - name: make | ||||
| run: cmake --build build | run: cmake --build build | ||||
| - name: make check | - name: make check | ||||
| run: ctest --test-dir build -Ttest -j1 --output-on-failure | |||||
| run: ctest --test-dir build -Ttest -j8 --output-on-failure | |||||
| - name: make package_source | - name: make package_source | ||||
| run: cmake --build build --target package_source | run: cmake --build build --target package_source | ||||
| - name: re-make | - name: re-make | ||||
| run: cd unpack/espeak-ng-* && cmake --build build | run: cd unpack/espeak-ng-* && cmake --build build | ||||
| - name: re-make check | - name: re-make check | ||||
| run: cd unpack/espeak-ng-* && ctest --test-dir build -Ttest -j1 --output-on-failure | |||||
| run: cd unpack/espeak-ng-* && ctest --test-dir build -Ttest -j8 --output-on-failure |
| - name: make | - name: make | ||||
| run: cmake --build build --config ${{ matrix.config }} | run: cmake --build build --config ${{ matrix.config }} | ||||
| - name: make check | - name: make check | ||||
| run: ctest --test-dir build -Ttest -C ${{ matrix.config }} -j1 --output-on-failure | |||||
| run: ctest --test-dir build -Ttest -C ${{ matrix.config }} -j8 --output-on-failure |
| WORKING_DIRECTORY "${PHONEME_SRC_DIR}" | WORKING_DIRECTORY "${PHONEME_SRC_DIR}" | ||||
| COMMENT "Compile phonemes" | COMMENT "Compile phonemes" | ||||
| DEPENDS | DEPENDS | ||||
| "${DATA_DIST_DIR}/intonations" | |||||
| "$<TARGET_FILE:espeak-ng-bin>" | "$<TARGET_FILE:espeak-ng-bin>" | ||||
| ${_phon_deps} | ${_phon_deps} | ||||
| ) | ) |
| #!/bin/sh | #!/bin/sh | ||||
| # Test a command for presence and ability to output the sha1 hash of a file | # Test a command for presence and ability to output the sha1 hash of a file | ||||
| is_hash() { | is_hash() { | ||||
| echo -n "checking for SHA1 hashing command ... " | |||||
| if check_hash sha1sum; then | |||||
| sha1sum=sha1sum | |||||
| elif check_hash sha1; then | |||||
| sha1sum=sha1 | |||||
| elif check_hash shasum; then | |||||
| sha1sum=shasum | |||||
| else | |||||
| echo "no" | |||||
| exit 1 | |||||
| fi | |||||
| echo -n "checking for SHA1 hashing command ... " | |||||
| if check_hash sha1sum; then | |||||
| sha1sum=sha1sum | |||||
| elif check_hash sha1; then | |||||
| sha1sum=sha1 | |||||
| elif check_hash shasum; then | |||||
| sha1sum=shasum | |||||
| else | |||||
| echo "no" | |||||
| exit 1 | |||||
| fi | |||||
| } | } | ||||
| check_hash() { | check_hash() { | ||||
| which $1 && | |||||
| $1 </dev/null 2>/dev/null | | |||||
| awk '{if ($1 != "da39a3ee5e6b4b0d3255bfef95601890afd80709") { exit 1; }}' | |||||
| # Test some common commands to find the correct one for the system being tested on. | |||||
| which $1 && | |||||
| $1 </dev/null 2>/dev/null | | |||||
| awk '{if ($1 != "da39a3ee5e6b4b0d3255bfef95601890afd80709") { exit 1; }}' | |||||
| # Test some common commands to find the correct one for the system being tested on. | |||||
| } | } | ||||
| # test if MBROLA synthesizer is installed | # test if MBROLA synthesizer is installed | ||||
| fi | fi | ||||
| echo "testing ${TEST_LANG} $MESSAGE" | echo "testing ${TEST_LANG} $MESSAGE" | ||||
| ESPEAK_DATA_PATH=`pwd` LD_LIBRARY_PATH=src:${LD_LIBRARY_PATH} \ | |||||
| $VALGRIND src/espeak-ng -xq ${OPTIONS} -v ${TEST_LANG} "${TEST_TEXT}" \ | |||||
| > actual.txt || exit 1 | |||||
| echo "${EXPECTED}" > expected.txt | |||||
| if [ "$MESSAGE" = "Ignore" ] ; then | |||||
| diff expected.txt actual.txt || (echo "... ignoring error" && true) | |||||
| else | |||||
| diff expected.txt actual.txt || exit 1 | |||||
| RESULT=$( | |||||
| ESPEAK_DATA_PATH=`pwd` LD_LIBRARY_PATH=src:${LD_LIBRARY_PATH} \ | |||||
| $VALGRIND src/espeak-ng -xq ${OPTIONS} -v ${TEST_LANG} "${TEST_TEXT}" || exit 1 | |||||
| ) | |||||
| if [ "x$RESULT" != "x$EXPECTED" ] ; then | |||||
| echo "$RESULT != $EXPECTED" | |||||
| if [ "$MESSAGE" = "Ignore" ] ; then | |||||
| echo "... ignoring error" | |||||
| else | |||||
| exit 1 | |||||
| fi | |||||
| fi | fi | ||||
| } | } | ||||
| # Check generated wav file from processed text | # Check generated wav file from processed text | ||||
| test_wav () { | test_wav () { | ||||
| VOICE=$1 | |||||
| EXPECTED=$2 | |||||
| TEST_TEXT=$3 | |||||
| MESSAGE=$4 | |||||
| VOICE=$1 | |||||
| EXPECTED=$2 | |||||
| TEST_TEXT=$3 | |||||
| MESSAGE=$4 | |||||
| echo "testing ${VOICE}${MESSAGE}" | |||||
| echo "testing ${VOICE} ${MESSAGE}" | |||||
| RESULT=$( | |||||
| ESPEAK_DATA_PATH=`pwd` LD_LIBRARY_PATH=src:${LD_LIBRARY_PATH} \ | ESPEAK_DATA_PATH=`pwd` LD_LIBRARY_PATH=src:${LD_LIBRARY_PATH} \ | ||||
| $VALGRIND src/espeak-ng -D --stdout -v ${VOICE} "${TEST_TEXT}" \ | |||||
| > actual.txt || exit 1 | |||||
| < actual.txt $sha1sum | awk '{ print $1 }' > sum.txt | |||||
| echo "${EXPECTED}" > expected.txt | |||||
| $VALGRIND src/espeak-ng -D --stdout -v ${VOICE} "${TEST_TEXT}" | $sha1sum | awk '{ print $1 }' || exit 1 | |||||
| ) | |||||
| if [ "x$RESULT" != "x$EXPECTED" ] ; then | |||||
| echo "$RESULT != $EXPECTED" | |||||
| if [ "$MESSAGE" = "Ignore" ] ; then | if [ "$MESSAGE" = "Ignore" ] ; then | ||||
| diff expected.txt sum.txt || (echo "... ignoring error" && true) | |||||
| echo "... ignoring error" | |||||
| else | else | ||||
| diff expected.txt sum.txt || exit 1 | |||||
| exit 1 | |||||
| fi | fi | ||||
| fi | |||||
| } | } | ||||
| # Check generated wav file from processed text, where $EXPECTED is grep string | # Check generated wav file from processed text, where $EXPECTED is grep string | ||||
| test_wav_grep () { | test_wav_grep () { | ||||
| VOICE=$1 | |||||
| EXPECTED=$2 | |||||
| TEST_TEXT=$3 | |||||
| MESSAGE=$4 | |||||
| echo "testing ${VOICE}${MESSAGE}" | |||||
| ESPEAK_DATA_PATH=`pwd` LD_LIBRARY_PATH=src:${LD_LIBRARY_PATH} \ | |||||
| $VALGRIND src/espeak-ng -D --stdout -v ${VOICE} "${TEST_TEXT}" \ | |||||
| > actual.txt || exit 1 | |||||
| < actual.txt $sha1sum | awk '{ print $1 }' > sum.txt | |||||
| if [ "$MESSAGE" = "Ignore" ] ; then | |||||
| cat sum.txt | grep -E "$EXPECTED" || (echo "... ignoring error" && true) | |||||
| else | |||||
| cat sum.txt | grep -E "$EXPECTED" || { printf "wrong hash: "; cat sum.txt; exit 1; } | |||||
| fi | |||||
| VOICE=$1 | |||||
| EXPECTED=$2 | |||||
| TEST_TEXT=$3 | |||||
| MESSAGE=$4 | |||||
| echo "testing ${VOICE} ${MESSAGE}" | |||||
| $() | |||||
| ESPEAK_DATA_PATH=`pwd` LD_LIBRARY_PATH=src:${LD_LIBRARY_PATH} \ | |||||
| $VALGRIND src/espeak-ng -D --stdout -v ${VOICE} "${TEST_TEXT}" \ | |||||
| > actual.txt || exit 1 | |||||
| < actual.txt $sha1sum | awk '{ print $1 }' > sum.txt | |||||
| if [ "$MESSAGE" = "Ignore" ] ; then | |||||
| cat sum.txt | grep -E "$EXPECTED" || (echo "... ignoring error" && true) | |||||
| else | |||||
| cat sum.txt | grep -E "$EXPECTED" || { printf "wrong hash: "; cat sum.txt; exit 1; } | |||||
| fi | |||||
| } | } | ||||
| # Check generated wav file from list of phonemes | # Check generated wav file from list of phonemes | ||||
| TEST_LANG=$1 | TEST_LANG=$1 | ||||
| EXPECTED=$2 | EXPECTED=$2 | ||||
| TEST_TEXT=$3 | TEST_TEXT=$3 | ||||
| test_wav $TEST_LANG $EXPECTED "[[$TEST_TEXT]]" | |||||
| test_wav $TEST_LANG $EXPECTED "[[$TEST_TEXT]]" | |||||
| } | } | ||||
| test_replace() { | test_replace() { | ||||
| TEST_LANG=$1 | TEST_LANG=$1 | ||||
| TEST_TEXT=$2 | TEST_TEXT=$2 | ||||
| MESSAGE=$3 | |||||
| EXPECTED=$3 | |||||
| MESSAGE=$4 | |||||
| if [ "$MESSAGE" = "" ] ; then | if [ "$MESSAGE" = "" ] ; then | ||||
| MESSAGE=$TEST_TEXT | MESSAGE=$TEST_TEXT | ||||
| fi | fi | ||||
| echo "testing ${TEST_LANG}" | echo "testing ${TEST_LANG}" | ||||
| ESPEAK_DATA_PATH=`pwd` LD_LIBRARY_PATH=src:${LD_LIBRARY_PATH} \ | |||||
| $VALGRIND src/espeak-ng -Xq -v ${TEST_LANG} "${TEST_TEXT}" \ | |||||
| > actual.txt || exit 1 | |||||
| < actual.txt grep -a -E "(Translate|Found:) " | sed -e 's/ \[.*][ ]*$//g' > filtered.txt | |||||
| if [ "$MESSAGE" = "Ignore" ] ; then | |||||
| diff expected.txt filtered.txt || (echo "... ignoring error" && true) | |||||
| else | |||||
| diff expected.txt filtered.txt || exit 1 | |||||
| RESULT=$( | |||||
| ESPEAK_DATA_PATH=`pwd` LD_LIBRARY_PATH=src:${LD_LIBRARY_PATH} \ | |||||
| $VALGRIND src/espeak-ng -Xq -v ${TEST_LANG} "${TEST_TEXT}" | \ | |||||
| grep -a -E "(Translate|Found:) " | sed -e 's/ \[.*][ ]*$//g' || exit 1 | |||||
| ) | |||||
| if [ "x$RESULT" != "x$EXPECTED" ] ; then | |||||
| echo "$RESULT != $EXPECTED" | |||||
| if [ "$MESSAGE" = "Ignore" ] ; then | |||||
| echo "... ignoring error" | |||||
| else | |||||
| exit 1 | |||||
| fi | |||||
| fi | fi | ||||
| } | } | ||||
| ##### bs: Bosnian | ##### bs: Bosnian | ||||
| # Ljubazni fenjerdžija čađavog lica hoće da mi pokaže štos. | # Ljubazni fenjerdžija čađavog lica hoće da mi pokaže štos. | ||||
| cat > expected.txt <<EOF | |||||
| Translate 'ljubazni' | |||||
| test_replace bs "Љубазни фењерџија чађавог лица хоће да ми покаже штос." "Translate 'ljubazni' | |||||
| Translate 'fenjerdžija' | Translate 'fenjerdžija' | ||||
| Translate 'čađavog' | Translate 'čađavog' | ||||
| Translate 'lica' | Translate 'lica' | ||||
| Translate 'da' | Translate 'da' | ||||
| Translate 'mi' | Translate 'mi' | ||||
| Translate 'pokaže' | Translate 'pokaže' | ||||
| Translate 'štos' | |||||
| EOF | |||||
| test_replace bs "Љубазни фењерџија чађавог лица хоће да ми покаже штос." | |||||
| Translate 'štos'" | |||||
| ##### en: English | ##### en: English | ||||
| cat > expected.txt <<EOF | |||||
| Translate 'aeon' | |||||
| test_replace en "Æon mediæval. Œconomy phœnix. Loſt history." "Translate 'aeon' | |||||
| Found: 'mediaeval' | Found: 'mediaeval' | ||||
| Translate 'oeconomy' | Translate 'oeconomy' | ||||
| Found: 'phoenix' | Found: 'phoenix' | ||||
| Found: 'lost' | Found: 'lost' | ||||
| Translate 'history' | |||||
| EOF | |||||
| test_replace en "Æon mediæval. Œconomy phœnix. Loſt history." | |||||
| Translate 'history'" | |||||
| ##### hr: Croatian | ##### hr: Croatian | ||||
| # Ljubazni fenjerdžija čađavog lica hoće da mi pokaže štos. | # Ljubazni fenjerdžija čađavog lica hoće da mi pokaže štos. | ||||
| cat > expected.txt <<EOF | |||||
| Translate 'ljubazni' | |||||
| test_replace hr "Љубазни фењерџија чађавог лица хоће да ми покаже штос." "Translate 'ljubazni' | |||||
| Translate 'fenjerdžija' | Translate 'fenjerdžija' | ||||
| Translate 'čađavog' | Translate 'čađavog' | ||||
| Translate 'lica' | Translate 'lica' | ||||
| Translate 'da' | Translate 'da' | ||||
| Translate 'mi' | Translate 'mi' | ||||
| Translate 'pokaže' | Translate 'pokaže' | ||||
| Translate 'štos' | |||||
| EOF | |||||
| test_replace hr "Љубазни фењерџија чађавог лица хоће да ми покаже штос." | |||||
| Translate 'štos'" | |||||
| ##### ja: Japanese | ##### ja: Japanese | ||||
| # いろはにほへと. ちりぬるを. わかよたれそ. つねならむ. うゐのおくやま. けふこえて. あさきゆめみし. ゑひもせすん. | # いろはにほへと. ちりぬるを. わかよたれそ. つねならむ. うゐのおくやま. けふこえて. あさきゆめみし. ゑひもせすん. | ||||
| cat > expected.txt <<EOF | |||||
| Translate 'いろはにほへと' | |||||
| test_replace ja "イロハニホヘト. チリヌルヲ. ワカヨタレソ. ツネナラム. ウヰノオクヤマ. ケフコエテ. アサキユメミシ. ヱヒモセスン." "Translate 'いろはにほへと' | |||||
| Translate 'ちりぬるを' | Translate 'ちりぬるを' | ||||
| Translate 'わかよたれそ' | Translate 'わかよたれそ' | ||||
| Translate 'つねならむ' | Translate 'つねならむ' | ||||
| Translate 'うゐのおくやま' | Translate 'うゐのおくやま' | ||||
| Translate 'けふこえて' | Translate 'けふこえて' | ||||
| Translate 'あさきゆめみし' | Translate 'あさきゆめみし' | ||||
| Translate 'ゑひもせすん' | |||||
| EOF | |||||
| test_replace ja "イロハニホヘト. チリヌルヲ. ワカヨタレソ. ツネナラム. ウヰノオクヤマ. ケフコエテ. アサキユメミシ. ヱヒモセスン." | |||||
| Translate 'ゑひもせすん'" | |||||
| ##### mk: Macedonian | ##### mk: Macedonian | ||||
| # Ѕидарски пејзаж: шугав билмез со чудење џвака ќофте и кељ на туѓ цех. | # Ѕидарски пејзаж: шугав билмез со чудење џвака ќофте и кељ на туѓ цех. | ||||
| cat > expected.txt <<EOF | |||||
| Translate 'ѕидарски' | |||||
| test_replace mk "Dzidarski pejzaž: šugav bilmez so čudenje džvaka ćofte i kelj na tuđ ceh." "Translate 'ѕидарски' | |||||
| Translate 'пејзаж' | Translate 'пејзаж' | ||||
| Translate 'шугав' | Translate 'шугав' | ||||
| Translate 'билмез' | Translate 'билмез' | ||||
| Translate 'кељ' | Translate 'кељ' | ||||
| Translate 'на' | Translate 'на' | ||||
| Translate 'туѓ' | Translate 'туѓ' | ||||
| Translate 'цех' | |||||
| EOF | |||||
| test_replace mk "Dzidarski pejzaž: šugav bilmez so čudenje džvaka ćofte i kelj na tuđ ceh." | |||||
| Translate 'цех'" | |||||
| ##### sr: Serbian | ##### sr: Serbian | ||||
| # Ljubazni fenjerdžija čađavog lica hoće da mi pokaže štos. | # Ljubazni fenjerdžija čađavog lica hoće da mi pokaže štos. | ||||
| cat > expected.txt <<EOF | |||||
| Translate 'ljubazni' | |||||
| test_replace sr "Љубазни фењерџија чађавог лица хоће да ми покаже штос." "Translate 'ljubazni' | |||||
| Translate 'fenjerdžija' | Translate 'fenjerdžija' | ||||
| Translate 'čađavog' | Translate 'čađavog' | ||||
| Translate 'lica' | Translate 'lica' | ||||
| Translate 'da' | Translate 'da' | ||||
| Translate 'mi' | Translate 'mi' | ||||
| Translate 'pokaže' | Translate 'pokaže' | ||||
| Translate 'štos' | |||||
| EOF | |||||
| test_replace sr "Љубазни фењерџија чађавог лица хоће да ми покаже штос." | |||||
| Translate 'štos'" |
| OPTS=$4 | OPTS=$4 | ||||
| echo "testing ${TEST_NAME}" | echo "testing ${TEST_NAME}" | ||||
| ESPEAK_DATA_PATH=`pwd` LD_LIBRARY_PATH=src:${LD_LIBRARY_PATH} \ | |||||
| $VALGRIND src/espeak-ng --stdout -m "${TEST_TEXT}" ${OPTS} \ | |||||
| > actual.txt || exit 1 | |||||
| < actual.txt $sha1sum | awk '{ print $1 }' > sum.txt | |||||
| echo "${EXPECTED}" > expected.txt | |||||
| diff expected.txt sum.txt || exit 1 | |||||
| RESULT=$( | |||||
| ESPEAK_DATA_PATH=`pwd` LD_LIBRARY_PATH=src:${LD_LIBRARY_PATH} \ | |||||
| $VALGRIND src/espeak-ng --stdout -m "${TEST_TEXT}" ${OPTS} | $sha1sum | awk '{ print $1 }' || exit 1 | |||||
| ) | |||||
| if [ "x$RESULT" != "x$EXPECTED" ] ; then | |||||
| echo "$RESULT != $EXPECTED" | |||||
| exit 1 | |||||
| fi | |||||
| } | } | ||||
| test_ssml() { | test_ssml() { | ||||
| fi | fi | ||||
| echo "testing ${INPUT}" | echo "testing ${INPUT}" | ||||
| cp $(dirname $INPUT)/$(basename ${INPUT%.*}).expected expected.txt | |||||
| ESPEAK_DATA_PATH=`pwd` LD_LIBRARY_PATH=src:${LD_LIBRARY_PATH} \ | |||||
| $VALGRIND src/espeak-ng -m -q $PARAMETERS -f ${INPUT} \ | |||||
| > actual.txt || exit 1 | |||||
| diff expected.txt actual.txt || exit 1 | |||||
| EXPECTED=$(cat $(dirname $INPUT)/$(basename ${INPUT%.*}).expected) | |||||
| RESULT=$( | |||||
| ESPEAK_DATA_PATH=`pwd` LD_LIBRARY_PATH=src:${LD_LIBRARY_PATH} \ | |||||
| $VALGRIND src/espeak-ng -m -q $PARAMETERS -f ${INPUT} || exit 1 | |||||
| ) | |||||
| if [ "x$RESULT" != "x$EXPECTED" ] ; then | |||||
| echo "$RESULT != $EXPECTED" | |||||
| exit 1 | |||||
| fi | |||||
| } | } | ||||
| for i in `dirname $0`/ssml/*.ssml ; do test_ssml $i; done | for i in `dirname $0`/ssml/*.ssml ; do test_ssml $i; done |