327 lines
4.8 KiB
Bash
Executable File
327 lines
4.8 KiB
Bash
Executable File
#!/bin/bash
|
|
# Test csvm2csv
|
|
#
|
|
# Copyright (C) 2014-2023 Ryan Specialty, LLC.
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
##
|
|
|
|
cd "$( dirname "$0" )"
|
|
|
|
|
|
# just to ensure that we run all the tests
|
|
declare -i testsum=0
|
|
|
|
|
|
# Run test case with input and expected values
|
|
run-test()
|
|
{
|
|
local -r input="${1?Missing input}"
|
|
local -r expected="${2?Missing expected}"
|
|
|
|
((testsum++))
|
|
|
|
# SUT invocation
|
|
declare -r given=$( ../csvm2csv < <( cat <<< "$input" ) )
|
|
|
|
test $? -eq 0 || return 1
|
|
|
|
# expected output
|
|
diff <( cat <<< "$expected" ) <( cat <<< "$given" ) || {
|
|
echo "test $testsum failure" >&2
|
|
return 1
|
|
}
|
|
}
|
|
|
|
|
|
|
|
test-comment()
|
|
{
|
|
local -r input='# comment before header should be removed
|
|
header, line
|
|
# this is also a comment
|
|
1, 2
|
|
# which should be ignored
|
|
3, 4'
|
|
|
|
local -r expected='header,line
|
|
1,2
|
|
3,4'
|
|
|
|
run-test "$input" "$expected"
|
|
}
|
|
|
|
|
|
test-range()
|
|
{
|
|
declare -r input='header, line
|
|
1--3, 2
|
|
3--5, 4--6'
|
|
|
|
declare -r expected='header,line
|
|
1,2
|
|
2,2
|
|
3,2
|
|
3,4
|
|
3,5
|
|
3,6
|
|
4,4
|
|
4,5
|
|
4,6
|
|
5,4
|
|
5,5
|
|
5,6'
|
|
|
|
run-test "$input" "$expected"
|
|
}
|
|
|
|
|
|
test-delim()
|
|
{
|
|
declare -r input='header, line
|
|
1;4, 2
|
|
4;3, 6;9'
|
|
|
|
declare -r expected='header,line
|
|
1,2
|
|
3,6
|
|
3,9
|
|
4,2
|
|
4,6
|
|
4,9'
|
|
|
|
run-test "$input" "$expected"
|
|
}
|
|
|
|
|
|
test-var()
|
|
{
|
|
declare -r input='header, line
|
|
:foo=1
|
|
:bar_baz-quux=2
|
|
$foo,1
|
|
$bar_baz-quux,$foo'
|
|
|
|
declare -r expected='header,line
|
|
1,1
|
|
2,1'
|
|
|
|
run-test "$input" "$expected"
|
|
}
|
|
|
|
# same as above but with whitespace
|
|
test-whitespace-including-tabs-ok()
|
|
{
|
|
declare -r input='header, line
|
|
:foo=1
|
|
:bar_baz-quux=2
|
|
$foo, 1
|
|
$bar_baz-quux, $foo'
|
|
|
|
declare -r expected='header,line
|
|
1,1
|
|
2,1'
|
|
|
|
run-test "$input" "$expected"
|
|
}
|
|
|
|
|
|
test-range-delim()
|
|
{
|
|
declare -r input='header, line
|
|
1--3;5--6, 2'
|
|
|
|
declare -r expected='header,line
|
|
1,2
|
|
2,2
|
|
3,2
|
|
5,2
|
|
6,2'
|
|
|
|
run-test "$input" "$expected"
|
|
}
|
|
|
|
|
|
test-var-in-range-delim()
|
|
{
|
|
declare -r input='header, line
|
|
:foo=1
|
|
:bar=3
|
|
$foo--$bar, $foo;$bar'
|
|
|
|
declare -r expected='header,line
|
|
1,1
|
|
1,3
|
|
2,1
|
|
2,3
|
|
3,1
|
|
3,3'
|
|
|
|
run-test "$input" "$expected"
|
|
}
|
|
|
|
|
|
test-var-with-range-delim()
|
|
{
|
|
declare -r input='header, line
|
|
:foo=1--2;4
|
|
:bar=5
|
|
$foo;$bar, 1'
|
|
|
|
declare -r expected='header,line
|
|
1,1
|
|
2,1
|
|
4,1
|
|
5,1'
|
|
|
|
run-test "$input" "$expected"
|
|
}
|
|
|
|
|
|
test-var-with-var()
|
|
{
|
|
declare -r input='header, line
|
|
:foo=2
|
|
:bar=4
|
|
:range=$foo--$bar
|
|
:baz=$range;$foo
|
|
$baz, 5'
|
|
|
|
# note that the output is sorted
|
|
declare -r expected='header,line
|
|
2,5
|
|
2,5
|
|
3,5
|
|
4,5'
|
|
|
|
run-test "$input" "$expected"
|
|
}
|
|
|
|
|
|
# :foo=0 should be considered to be defined
|
|
test-var-zero-ref()
|
|
{
|
|
declare -r input='header, line
|
|
:foo=0
|
|
$foo'
|
|
|
|
declare -r expected='header,line
|
|
0'
|
|
|
|
run-test "$input" "$expected"
|
|
}
|
|
|
|
|
|
test-directive-stripped()
|
|
{
|
|
declare -r input='!DIRECTIVE
|
|
header, line'
|
|
|
|
declare -r expected='header,line'
|
|
|
|
run-test "$input" "$expected"
|
|
}
|
|
|
|
|
|
test-no-sort()
|
|
{
|
|
declare -r input='!NOSORT
|
|
header, line
|
|
1,1
|
|
0,0'
|
|
|
|
declare -r expected='header,line
|
|
1,1
|
|
0,0'
|
|
|
|
run-test "$input" "$expected"
|
|
}
|
|
|
|
|
|
# all directives should be put on a single line
|
|
test-fail-multi-directive()
|
|
{
|
|
declare -r input='!DIRECTIVE1
|
|
!DIRECTIVE2
|
|
header, line'
|
|
|
|
((testsum++))
|
|
|
|
local result
|
|
! result=$( ../csvm2csv 2>&1 <<< "$input" ) || return 1
|
|
|
|
[[ "$result" =~ !DIRECTIVE2 ]]
|
|
}
|
|
|
|
|
|
test-fail-unknown-var-ref()
|
|
{
|
|
((testsum++))
|
|
|
|
local result
|
|
! result=$( ../csvm2csv 2>&1 <<< '$undefined' ) || return 1
|
|
|
|
[[ "$result" =~ unknown.*\$undefined ]]
|
|
}
|
|
|
|
|
|
test-fail-non-numeric-range()
|
|
{
|
|
((testsum++))
|
|
|
|
local result
|
|
! result=$( ../csvm2csv 2>&1 <<< 'A--Z' ) || return 1
|
|
|
|
[[ "$result" =~ invalid\ range.*A--Z ]]
|
|
}
|
|
|
|
|
|
test-fail-invalid-var-dfn()
|
|
{
|
|
((testsum++))
|
|
|
|
local result
|
|
! result=$( ../csvm2csv 2>&1 <<< ':BAD@#=var' ) || return 1
|
|
|
|
[[ "$result" =~ invalid\ variable\ definition.*:BAD@#=var ]]
|
|
}
|
|
|
|
|
|
test-comment \
|
|
&& test-range \
|
|
&& test-delim \
|
|
&& test-var \
|
|
&& test-range-delim \
|
|
&& test-var-in-range-delim \
|
|
&& test-var-with-range-delim \
|
|
&& test-var-with-var \
|
|
&& test-var-zero-ref \
|
|
&& test-directive-stripped \
|
|
&& test-no-sort \
|
|
&& test-whitespace-including-tabs-ok \
|
|
&& test-fail-multi-directive \
|
|
&& test-fail-unknown-var-ref \
|
|
&& test-fail-non-numeric-range \
|
|
&& test-fail-invalid-var-dfn \
|
|
|| {
|
|
echo 'csvm2csv test failed' >&2
|
|
exit 1
|
|
}
|
|
|
|
# safety check
|
|
test "$testsum" -eq 16 || {
|
|
echo 'error: did not run all csvm2csv tests!' >&2
|
|
exit 1
|
|
}
|