From f4ddd026c6f155a1050b142f2e88225305ecdd90 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Wed, 2 Jul 2014 17:14:51 -0700 Subject: [PATCH] glsl/glcpp: Add test script for testing various line-termination characters The GLSL specification has a very broad definition of what is a newline. Namely, it can be the carriage-return character, '\r', the newline character, '\n', or any combination of the two, (though in combination, the two are treated as a single newline). Here, we add a new test-runner, glcpp-test-cr-lf, that, for each possible line-termination combination, runs through the existing test suite with all source files modified to use those line-termination characters. Instead of using the .expected files for this, this script assumes that the regular test suite has been run already and expects the output to match the .out files. This avoids getting 4 test failures for any one bug, and instead will hopefully only report bugs actually related to the line-termination characters. The new testing is not yet integrated into "make check". For that, some munging of the testdir option will be necessary, (to support "make check" with out-of-tree builds). For now, the scripts can just be run directly by hand. Reviewed-by: Ian Romanick --- src/glsl/glcpp/tests/glcpp-test | 30 ++++--- src/glsl/glcpp/tests/glcpp-test-cr-lf | 118 ++++++++++++++++++++++++++ 2 files changed, 137 insertions(+), 11 deletions(-) create mode 100755 src/glsl/glcpp/tests/glcpp-test-cr-lf diff --git a/src/glsl/glcpp/tests/glcpp-test b/src/glsl/glcpp/tests/glcpp-test index 2d2687fc68d..9bf7bdb7c45 100755 --- a/src/glsl/glcpp/tests/glcpp-test +++ b/src/glsl/glcpp/tests/glcpp-test @@ -19,6 +19,7 @@ Run the test suite for mesa's GLSL pre-processor. Valid options include: + --testdir= Use tests in the given (default is ".") --valgrind Run the test suite a second time under valgrind EOF } @@ -32,17 +33,24 @@ test_specific_args () # Parse command-line options for option; do - if [ "${option}" = '--help' ] ; then - usage - exit 0 - elif [ "${option}" = '--valgrind' ] ; then - do_valgrind=yes - else - echo "Unrecognized option: $option" >&2 - echo >&2 - usage - exit 1 - fi + case "${option}" in + "--help") + usage + exit 0 + ;; + "--valgrind") + do_valgrind=yes + ;; + "--testdir="*) + testdir="${option#--testdir=}" + ;; + *) + echo "Unrecognized option: $option" >&2 + echo >&2 + usage + exit 1 + ;; + esac done total=0 diff --git a/src/glsl/glcpp/tests/glcpp-test-cr-lf b/src/glsl/glcpp/tests/glcpp-test-cr-lf new file mode 100755 index 00000000000..708fce55aac --- /dev/null +++ b/src/glsl/glcpp/tests/glcpp-test-cr-lf @@ -0,0 +1,118 @@ +#!/bin/sh + +total=0 +pass=0 + +# This supports a pipe that doesn't destroy the exit status of first command +# +# http://unix.stackexchange.com/questions/14270/get-exit-status-of-process-thats-piped-to-another +stdintoexitstatus() { + read exitstatus + return $exitstatus +} + +run_test () +{ + cmd="$1" + + total=$((total+1)) + + if [ "$VERBOSE" = "yes" ]; then + if $cmd; then + echo "PASS" + pass=$((pass+1)) + else + echo "FAIL" + fi + else + # This is "$cmd | tail -2" but with the exit status of "$cmd" not "tail -2" + if (((($cmd; echo $? >&3) | tail -2 | head -1 >&4) 3>&1) | stdintoexitstatus) 4>&1; then + echo "PASS" + pass=$((pass+1)) + else + echo "FAIL" + fi + fi +} + +usage () +{ + cat <&2 + echo >&2 + usage + exit 1 + ;; + esac +done + +# All tests depend on the .out files being present. So first do a +# normal run of the test suite, (silently) just to create the .out +# files as a side effect. +./glcpp-test >/dev/null 2>&1 + +echo "===== Testing with \\\\r line terminators (old Mac format) =====" + +# Prepare test files with '\r' instead of '\n' +rm -rf ./subtest-cr +mkdir subtest-cr +for file in *.c; do + tr "\n" "\r" < "$file" > subtest-cr/"$file" + cp "$file".out subtest-cr/"$file".expected +done + +run_test "./glcpp-test --testdir=subtest-cr" + +echo "===== Testing with \\\\r\\\\n line terminators (DOS format) =====" + +# Prepare test files with '\r\n' instead of '\n' +rm -rf ./subtest-cr-lf +mkdir subtest-cr-lf +for file in *.c; do + sed -e 's/$/\r/' < "$file" > subtest-cr-lf/"$file" + cp "$file".out subtest-cr-lf/"$file".expected +done + +run_test "./glcpp-test --testdir=subtest-cr-lf" + +echo "===== Testing with \\\\n\\\\r (bizarre, but allowed by GLSL spec.) =====" + +# Prepare test files with '\n\r' instead of '\n' +rm -rf ./subtest-lf-cr +mkdir subtest-lf-cr +for file in *.c; do + tr "\n" "\r" < "$file" | sed -e 's/\r/\n\r/g' > subtest-lf-cr/"$file" + cp "$file".out subtest-lf-cr/"$file".expected +done + +run_test "./glcpp-test --testdir=subtest-lf-cr" + +echo "" +echo "$pass/$total tests returned correct results" +echo "" + +if [ "$pass" = "$total" ]; then + exit 0 +else + exit 1 +fi -- 2.30.2