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