test "$(locale charmap 2>/dev/null | sed 's/gb/GB/')" = GB18030 ||
skip_ 'GB18030 charset support not detected'
-for delim in ',' ':' "$(env printf '\xa2\xe3')" "$(env printf '\xff')"; do
+delim_gb18030=$(env printf '\xa2\xe3')
+delim_ff=$(env printf '\xff')
+
+# Exercise ASCII, multibyte, and invalid single-byte delimiters.
+# Note 0xFF is invalid in GB18030, but we support all single byte delimiters.
+for delim in ',' ':' "$delim_gb18030" "$delim_ff"; do
num_out=$(printf "1${delim}2${delim}3\n" \
| cut -d "$delim" -f2,3 --output-delimiter=_)
test "$num_out" = "2_3" || fail=1
done
+# A valid 2-byte GB18030 character.
+printf '%sx\n' "$delim_gb18030" | cut -c1 > out || fail=1
+printf '%s\n' "$delim_gb18030" > exp || framework_failure_
+compare exp out || fail=1
+
+printf '%sx\n' "$delim_gb18030" | cut -c2 > out || fail=1
+printf 'x\n' > exp || framework_failure_
+compare exp out || fail=1
+
+printf '%sx\n' "$delim_gb18030" | cut -b1 -n > out || fail=1
+printf '\n' > exp || framework_failure_
+compare exp out || fail=1
+
+printf '%sx\n' "$delim_gb18030" | cut -b2 -n > out || fail=1
+printf '%s\n' "$delim_gb18030" > exp || framework_failure_
+compare exp out || fail=1
+
+printf '1%s2%s3\n' "$delim_gb18030" "$delim_gb18030" \
+ | cut -d "$delim_gb18030" -f1,3 > out || fail=1
+printf '1%s3\n' "$delim_gb18030" > exp || framework_failure_
+compare exp out || fail=1
+
+printf '1%s2%s3\n' "$delim_gb18030" "$delim_gb18030" \
+ | cut --complement -d "$delim_gb18030" -f1 > out || fail=1
+printf '2%s3\n' "$delim_gb18030" > exp || framework_failure_
+compare exp out || fail=1
+
+printf '1%s2' "$delim_gb18030" \
+ | cut -d "$delim_gb18030" -f2 > out || fail=1
+printf '2\n' > exp || framework_failure_
+compare exp out || fail=1
+
+printf '1%s2\0' "$delim_gb18030" \
+ | cut -z -d "$delim_gb18030" -f2 > out || fail=1
+printf '2\0' > exp || framework_failure_
+compare exp out || fail=1
+
+printf '%s%s3\n' "$delim_gb18030" "$delim_gb18030" \
+ | cut -d "$delim_gb18030" -f1-3 --output-delimiter=':' > out || fail=1
+printf '::3\n' > exp || framework_failure_
+compare exp out || fail=1
+
Exit $fail