summaryrefslogtreecommitdiffstats
path: root/src/compiler/glsl/glcpp/tests/glcpp-test-cr-lf.sh
blob: 6a77a6e6663bd5fd6ea7695f0b67ed9d5faa3ef6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#!/bin/sh

# The build system runs this test from a different working directory, and may
# be in a build directory entirely separate from the source. So if the
# "srcdir" variable is set, we must use it to locate the test files and the
# glcpp-test script.

if [ ! -z "$srcdir" ]; then
   testdir="$srcdir/glsl/glcpp/tests"
   glcpp_test="$srcdir/glsl/glcpp/tests/glcpp-test.sh"
else
   testdir=.
   glcpp_test=./glcpp-test.sh
fi

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 <<EOF
Usage: `basename "$0"` [options...]

Run the entire glcpp-test suite several times, each time with each source
file transformed to use a non-standard line-termination character. Each
entire run with a different line-termination character is considered a
single test.

Valid options include:

	-v|--verbose	Print all output from the various sub-tests
EOF
}

# Parse command-line options
for option; do
    case "${option}" in
	-v|--verbose)
	    VERBOSE=yes;
	    ;;
	*)
	    echo "Unrecognized option: $option" >&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.
rm -rf ./subtest-lf
mkdir subtest-lf
for file in "$testdir"/*.c; do
    base=$(basename "$file")
    cp "$file" subtest-lf
done

${glcpp_test} --testdir=subtest-lf >/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 "$testdir"/*.c; do
    base=$(basename "$file")
    tr "\n" "\r" < "$file" > subtest-cr/"$base"
    cp `pwd`/glsl/glcpp/tests/subtest-lf/"$base".out subtest-cr/"$base".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 "$testdir"/*.c; do
    base=$(basename "$file")
    sed -e 's/$/
/' < "$file" > subtest-cr-lf/"$base"
    cp `pwd`/glsl/glcpp/tests/subtest-lf/"$base".out subtest-cr-lf/"$base".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 "$testdir"/*.c; do
    base=$(basename "$file")
    sed -e 's/$/
/' < "$file" | tr "\n\r" "\r\n" > subtest-lf-cr/"$base"
    cp `pwd`/glsl/glcpp/tests/subtest-lf/"$base".out subtest-lf-cr/"$base".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