-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathtest.sh
executable file
·216 lines (193 loc) · 8.16 KB
/
test.sh
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
#!/usr/bin/env bash
function lang_test {
((TEST_NR+=1))
if (( RUN_TEST != 0 && TEST_NR != RUN_TEST )); then
((TESTS_SKIPPED+=1))
return
fi
#input arguments
local CMD="osagetlang $TEST_FILES_DIR/$1"
local EXPECTED_LANG=$2
local EXPECTED_EXIT_CODE=$3
local TEST_DESCRIPTION=$4
#
local TEST_LOG=$TEST_DIR/$TEST_NR.stderr.log
echo "|≣≡=- $(printf '%2s' $TEST_NR), running lang-test: $TEST_DESCRIPTION"
if (( LIST_ONLY == 1 )); then
((TESTS_SKIPPED+=1))
return
fi
echo "---===[ $CMD ]=========---------" > $TEST_LOG
RESULT=$(bash -c "$CMD" 2>>$TEST_LOG)
EXIT_CODE=$?
echo "-=> EXIT_CODE:$EXIT_CODE" >> $TEST_LOG
if (( $EXIT_CODE != $EXPECTED_EXIT_CODE )); then
((TESTS_NOK+=1))
echo "# Test failed, exit code $EXPECTED_EXIT_CODE expected; was $EXIT_CODE (output was '$RESULT')"
return
fi
if (( $EXIT_CODE == 0 )); then
if [[ $RESULT != $EXPECTED_LANG ]]; then
((TESTS_NOK+=1))
echo "# Output '$EXPECTED_LANG' expected, but actually got '$RESULT'"
return
fi
fi
((TESTS_OK+=1))
}
function filter_test {
((TEST_NR+=1))
if (( RUN_TEST != 0 && TEST_NR != RUN_TEST )); then
((TESTS_SKIPPED+=1))
return
fi
#input arguments
#local CMD="$1" #Hmm, command substitution...
local INPUT_FILE="$TEST_FILES_DIR/$2"
if [[ $3 = "-" ]]; then
local EXPECTED_FILE=""
else
local EXPECTED_FILE="$TEST_FILES_DIR/$3"
fi
local EXPECTED_EXIT_CODE="$4"
local TEST_DESCRIPTION="$5"
#
local EXPECTED_FILENAME=$(basename "$EXPECTED_FILE")
local EXPECTED_EXT="${EXPECTED_FILENAME##*.}"
local ACTUAL_FILE="$TEST_DIR/$TEST_NR.actual.$EXPECTED_EXT"
local TEST_LOG=$TEST_DIR/$TEST_NR.stderr.log
local TEST_CMD="cat $INPUT_FILE | $CMD > $ACTUAL_FILE"
#
echo "|≣≡=- $(printf '%2s' $TEST_NR), running filter-test: $TEST_DESCRIPTION"
if (( LIST_ONLY == 1 )); then
((TESTS_SKIPPED+=1))
return
fi
echo "---===[ cat $INPUT_FILE | $1 > $ACTUAL_FILE }=========---------" > $TEST_LOG
bash -c "cat $INPUT_FILE | $1 > $ACTUAL_FILE 2>> $TEST_LOG"
EXIT_CODE=$?
echo "-=> EXIT_CODE:$EXIT_CODE" >> $TEST_LOG
if (( $EXIT_CODE != $EXPECTED_EXIT_CODE )); then
((TESTS_NOK+=1))
echo "# Test failed, exit code $EXPECTED_EXIT_CODE expected; was $EXIT_CODE"
return
fi
if (( $EXIT_CODE == 0 )); then
if [[ $EXPECTED_FILE ]]; then
echo "---===[ diff $EXPECTED_FILE $ACTUAL_FILE ]=========---------" >> $TEST_LOG
diff $EXPECTED_FILE $ACTUAL_FILE >> $TEST_LOG 2>&1
EXIT_CODE=$?
echo "-=> EXIT_CODE:$EXIT_CODE" >> $TEST_LOG
if (( $EXIT_CODE != 0 )); then
((TESTS_NOK+=1))
echo "# diff failed, see $TEST_NR.stderr.log"
if [[ $EXPECTED_EXT != scpt ]]; then #non-binary file
echo "- COMPARE: opendiff $EXPECTED_FILE $ACTUAL_FILE"
fi
return
fi
fi
fi
((TESTS_OK+=1))
}
function clean_up {
if (( TESTS_NOK == 0 )); then
rm -Rf $TEST_DIR
else
echo -n "$TEST_DIR" | pbcopy
echo "CLEANUP YOURSELF: rm -Rf $TEST_DIR # (test dir copied on to clipboard)"
fi
}
#testing pre-requisites
if [[ -z $(which osagetlang) || -z $(which osagitfilter) ]]; then
>&2 echo "Test-subjects 'osagetlang' and/or 'osagitfilter' not found in the PATH."
>&2 echo "Maybe you should run './setup.sh install' first?"
exit 1
fi
#statistics
((TEST_NR=0))
((TESTS_OK=0))
((TESTS_NOK=0))
((TESTS_SKIPPED=0))
#Other
((RUN_TEST=0))
((LIST_ONLY=0))
#
((TEST_ERROR=0))
TEST_DIR="$(mktemp -d -t osagitfilter.test.tmp)"
TEST_FILES_DIR="assets"
trap clean_up EXIT INT HUP TERM
if [[ $1 =~ -?[0-9]+ ]]; then
if (( $1 == -1 )); then
((TEST_ERROR=1))
((RUN_TEST=0))
elif (( $1 == -2 )); then
((TEST_ERROR=2))
((RUN_TEST=0))
elif (( $1 < 0 )); then
((RUN_TEST=${1:1}))
else
((RUN_TEST=${1}))
fi
elif [[ $1 == "-l" || $1 == "--list" ]]; then
((LIST_ONLY=1))
fi
echo "Starting tests... (to run one test: '$(basename $0) TEST_NR'; to show all tests: '$(basename $0) -l' or '$(basename $0) --list'; use -1 to force failure on lang-tests, -2 for filter-tests)"
echo
#--| Determine OSA language tests
lang_test "as.scpt" "AppleScript" 0 "Get language of an AppleScript file"
lang_test "asdbg.scpt" "AppleScript Debugger" 0 "Get language of an AppleScript Debugger file"
lang_test "js.scpt" "JavaScript" 0 "Get language of an JavaScript file"
lang_test "perl.scpt" "Perl" 1 "Get language of non-existing file"
lang_test "" "" 1 "Get language without arguments"
lang_test "no-as.scpt" "" 1 "Get language of a non-AppleScript file"
#--| Instrumentarium to generate a test-error.
if (( TEST_ERROR == 1 )); then
lang_test "as.scpt" "AdobeScript" 0 "They would like that (test-case designed to fail)"
fi
if (( TESTS_NOK != 0 )); then
echo "$ Tests for osagetlang failed, no use to continue further tests"
else
#--| (Wrong) argument tests
filter_test "osagitfilter" "as.scpt" "-" 1 "No arguments"
filter_test "osagitfilter -h" "as.scpt" "-" 0 "Show usage screen (--help)"
CMD_CLEAN="osagitfilter clean --log"
CMD_CLEAN_NO="osagitfilter clean --no-header --log"
CMD_CLEAN_ALL="osagitfilter clean --forbidden - --log"
CMD_CLEAN_APPLE="osagitfilter clean --forbidden 'JavaScript:AppleScript Debugger' --log"
CMD_SMUDGE="osagitfilter smudge --log"
CMD_BOTH="osagitfilter clean --log | osagitfilter smudge --log"
#--| Plain AppleScript tests
filter_test "$CMD_CLEAN" "as.scpt" "as-hdr.applescript" 0 "Clean AppleScript"
filter_test "$CMD_CLEAN_NO" "as.scpt" "as.applescript" 0 "Clean AppleScript (--no-header)"
filter_test "$CMD_CLEAN_APPLE" "as.scpt" "as-hdr.applescript" 0 "Deny non-Apple languages: AppleScript"
filter_test "$CMD_SMUDGE" "as-hdr.applescript" "as.scpt" 0 "Smudge AppleScript"
filter_test "$CMD_SMUDGE" "as.applescript" "as.scpt" 0 "Smudge AppleScript (without header)"
filter_test "$CMD_BOTH" "as.scpt" "as.scpt" 0 "Pass through AppleScript"
filter_test "$CMD_BOTH" "as2.scpt" "as2.scpt" 0 "Pass through AppleScript; file not ending with empty line"
#--| Non-AppleScript files test
#issue 2: doesn't work yet
#filter_test "$CMD_CLEAN" "no-as.scpt" "no-as.scpt" 0 "Clean AppleScript: Non-AppleScript file"
#--| ScriptDebugger tests
filter_test "$CMD_CLEAN" "asdbg.scpt" "asdbg-hdr.applescript" 1 "Default Deny: forbidden Debugging Mode switched on"
filter_test "$CMD_CLEAN_ALL" "asdbg.scpt" "asdbg-hdr.applescript" 0 "Allow Debugging Mode switched on"
filter_test "$CMD_CLEAN_APPLE" "asdbg.scpt" "asdbg-hdr.applescript" 1 "Deny non-Apple languages: AppleScript Debugger"
#--| This can't be tested, because on compile-time, a GUID is inserted in the header. This GUID doesn't seem to be related
#--| to «event asDBDBid»... So no easy validation for this one.
#--| Also, when saving with SD, file-size increases big time, so be aware of this when testing.
#filter_test "$CMD_SMUDGE" "asdbg-hdr.applescript" "asdbg.scpt" 0 "Smudge AppleScript Debugger"
#filter_test "$CMD_BOTH" "asdbg.scpt" "asdbg.scpt" 0 "Pass through AppleScript Debugger"
#--| JavaScript tests
filter_test "$CMD_CLEAN" "js.scpt" "js-hdr.javascript" 0 "Clean JavaScript"
filter_test "$CMD_CLEAN_NO" "js.scpt" "js-hdr.javascript" 0 "Clean JavaScript (--no-header)"
filter_test "$CMD_CLEAN_APPLE" "js.scpt" "js-hdr.javascript" 1 "Deny non-Apple languages: JavaScript"
filter_test "$CMD_SMUDGE" "js-hdr.javascript" "js.scpt" 0 "Smudge JavaScript"
filter_test "$CMD_SMUDGE" "js.javascript" "js.scpt" 1 "Smudge AppleScript (without header)"
filter_test "$CMD_BOTH" "js.scpt" "js.scpt" 0 "Pass through JavaScript"
#--| Instrumentarium to generate a test-error.
if (( TEST_ERROR == 2 )); then
filter_test "$CMD_BOTH" "js.scpt" "as.scpt" 0 "AppleScript != Javascript (test-case designed to fail)"
fi
fi
echo
echo "$TEST_NR tests have ran, $TESTS_OK tested OK, $TESTS_NOK tested NOK and $TESTS_SKIPPED have been skipped."