xref: /openbsd/regress/usr.bin/colrm/colrm.sh (revision 9b7c3dbb)
1#!/bin/sh
2#
3# Copyright (c) 2015 Ingo Schwarze <schwarze@openbsd.org>
4#
5# Permission to use, copy, modify, and distribute this software for any
6# purpose with or without fee is hereby granted, provided that the above
7# copyright notice and this permission notice appear in all copies.
8#
9# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16
17unset LC_ALL
18
19test_colrm()
20{
21	args=$1
22	stdin=$2
23	expected=`echo -n "$3."`
24	export LC_CTYPE=en_US.UTF-8
25	result=`echo -n "$stdin" | colrm $args ; echo -n .`
26	if [ "$result" != "${expected}" ]; then
27		echo "echo -n \"$stdin\" | colrm $args"
28		echo -n "$stdin" | hexdump -C
29		echo "expected: \"$expected\""
30		echo -n "$expected" | hexdump -C
31		echo "result: \"$result\""
32		echo -n "$result" | hexdump -C
33		exit 1;
34	fi
35
36	if [ -n "$4" ]; then
37		expected=`echo -n "$4."`
38	fi
39	export LC_CTYPE=C
40	result=`echo -n "$stdin" | colrm $args ; echo -n .`
41	if [ "$result" != "${expected}" ]; then
42		echo "[C] echo -n \"$stdin\" | colrm $args"
43		echo -n "$stdin" | hexdump -C
44		echo "expected: \"$expected\""
45		echo -n "$expected" | hexdump -C
46		echo "result: \"$result\""
47		echo -n "$result" | hexdump -C
48		exit 1;
49	fi
50}
51
52# single byte characters
53test_colrm "" "abcd" "abcd"
54test_colrm "2" "abcd" "a"
55test_colrm "5" "abcd" "abcd"
56test_colrm "2 3" "abcd" "ad"
57test_colrm "5 6" "abcd" "abcd"
58
59# tab characters
60test_colrm "" "a\tb" "a\tb"
61test_colrm "10" "\tab" "\ta"
62test_colrm "9" "\tab" "\t"
63test_colrm "8" "\tab" "       "
64test_colrm "3 7" "a\tb" "a  b"
65test_colrm "7 9" "abcd\txe" "abcd  e"
66test_colrm "3 6" "abcd\tef" "ab  ef"
67
68# zero width
69test_colrm "2 2" "ax\0314\0200b" "ab" "a\0314\0200b"
70test_colrm "3 3" "ax\0314\0200bx\0314\0200c" "ax\0314\0200x\0314\0200c" \
71		 "ax\0200bx\0314\0200c"
72
73# double width
74test_colrm "2 3" "a\0354\0277\0277b" "ab" "a\0277b"
75test_colrm "2 2" "a\0354\0277\0277b" "a b" "a\0277\0277b"
76test_colrm "3 3" "a\0354\0277\0277b" "a b" "a\0354\0277b"
77test_colrm "4 4" "a\0354\0277\0277b\0354\0277\0277c" \
78		 "a\0354\0277\0277\0354\0277\0277c" \
79		 "a\0354\0277b\0354\0277\0277c"
80
81# backspaces
82test_colrm "3 3" "ab\b_cd\b_e" "ab\b_d\b_e"
83test_colrm "2 2" "ab\b_c" "ac"
84test_colrm "2 2" "ax\0314\0200\bb" "ab" "a\0314\0200\bb"
85test_colrm "3 3" "ax\0314\0200\bbx\0314\0200\bc" \
86		 "ax\0314\0200\bx\0314\0200\bc" \
87		 "ax\0200\bbx\0314\0200\bc"
88test_colrm "2 3" "a\0354\0277\0277\bbcde" "ade" "a\0277\bbcde"
89test_colrm "2 2" "a\0354\0277\0277\bbcde" "acde" "a\0277\0277\bbcde"
90test_colrm "3 3" "a\0354\0277\0277\bbcde" "abde" "a\0354\0277\bbcde"
91test_colrm "4 4" \
92  "a\0354\0277\0277\b\0354\0277\0277b\0354\0277\0277\b\0354\0277\0277c" \
93  "a\0354\0277\0277\b\0354\0277\0277\0354\0277\0277\b\0354\0277\0277c" \
94  "a\0354\0277\0277\0277b\0354\0277\0277\b\0354\0277\0277c"
95test_colrm "2 3" "a\0354\0277\0277\b\bbcde" "ade" "a\0277\bcde"
96test_colrm "2 2" "a\0354\0277\0277\b\bbcde" "acde" "a\0277\0277\b\bbcde"
97test_colrm "3 3" "a\0354\0277\0277\b\bbcde" "abde" "a\0354\0277\bcde"
98test_colrm "4 4" \
99  "a\0354\0277\0277\b\b\0354\0277\0277b\0354\0277\0277\b\b\0354\0277\0277c" \
100  "a\0354\0277\0277\b\b\0354\0277\0277\0354\0277\0277\b\b\0354\0277\0277c" \
101  "a\0354\0277\b\0354\0277b\0354\0277\0277\b\b\0354\0277\0277c"
102test_colrm "" "\bx" "\bx"
103test_colrm "1" "\bx" "\b"
104
105# invalid bytes and non-printable characters
106test_colrm "3 3" "a\0377b\0377c" "a\0377\0377c"
107test_colrm "2 2" "a\0377b" "ab"
108test_colrm "3 3" "a\01b\01c" "a\01\01c"
109test_colrm "2 2" "a\01b" "ab"
110test_colrm "3 3" "a\0315\0270b\0315\0270c" "a\0315\0270\0315\0270c" \
111		 "a\0315b\0315\0270c"
112test_colrm "2 2" "a\0315\0270b" "ab" "a\0270b"
113
114# edge cases
115test_colrm "" "" ""
116test_colrm "2 2" "\n" "\n"
117
118exit 0
119