diff --git a/regress/json.sh b/regress/json.sh new file mode 100755 index 000000000..7a924d1e9 --- /dev/null +++ b/regress/json.sh @@ -0,0 +1,137 @@ +#!/bin/sh + +# Test parsing and printing JSON with display-message -j. + +PATH=/bin:/usr/bin +TERM=screen + +[ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux) +TMUX="$TEST_TMUX -LtestA$$ -f/dev/null" +$TMUX kill-server 2>/dev/null + +fail() +{ + echo "$1" + $TMUX kill-server 2>/dev/null + exit 1 +} + +check() +{ + actual=$($TMUX display-message -plj "$1" 2>&1) || + fail "JSON was rejected: $1: $actual" + [ "$actual" = "$2" ] || + fail "JSON output mismatch: $1: expected $2, got $actual" +} + +check_fail() +{ + if $TMUX display-message -plj "$1" >/dev/null 2>&1; then + fail "invalid JSON was accepted: $1" + fi +} + +$TMUX new-session -d || exit 1 + +check '{}' '{}' +check ' { "z":true, "a":-9223372036854775808, "m":[{}, {"x":false}] } ' \ + '{"a":-9223372036854775808,"m":[{},{"x":false}],"z":true}' +check '{"max":9223372036854775807,"min":-9223372036854775808}' \ + '{"max":9223372036854775807,"min":-9223372036854775808}' +check '{" key":" value","{key":"[value"}' \ + '{" key":" value","{key":"[value"}' +check '{"brace":"{value","bracket":"[value","colon":":value",'\ +'"comma":",value","space":" value"}' \ + '{"brace":"{value","bracket":"[value","colon":":value",'\ +'"comma":",value","space":" value"}' +check '{"esc":"\"\\\/\b\f\n\r\t\u0041"}' \ + '{"esc":"\"\\\/\b\f\n\r\t\u0041"}' +check '{"unicode":"\u0123\uabcd\uABCD"}' \ + '{"unicode":"\u0123\uabcd\uABCD"}' + +actual=$($TMUX display-message -palj '{}' 2>&1) || + fail "display-message -aj rejected JSON: $actual" +[ "$actual" = '{}' ] || + fail "display-message -aj did not ignore -a: got $actual" +actual=$($TMUX display-message -pIlj '{}' 2>&1) || + fail "display-message -Ij rejected JSON: $actual" +[ "$actual" = '{}' ] || + fail "display-message -Ij did not ignore -I: got $actual" + +check_fail '' +check_fail ' ' +check_fail '[]' +check_fail 'true' +check_fail '1' +check_fail '"string"' +check_fail '{}{}' + +check_fail '{' +check_fail '{x:1}' +check_fail '{"":1}' +check_fail '{"x" 1}' +check_fail '{"x",1}' +check_fail '{"x":}' +check_fail '{"x":,}' +check_fail '{"x":1' +check_fail '{"x":1 "y":2}' +check_fail '{"x":1,,"y":2}' +check_fail '{"x":1,}' +check_fail '{"x":1,"x":2}' +check_fail '{"x":{}}{}' +check_fail '{"x":{}} trailing' +check_fail '{"x":{' +check_fail '{"x":{}' + +check_fail '{"x":[' +check_fail '{"x":[}' +check_fail '{"x":[{}' +check_fail '{"x":[{},}' +check_fail '{"x":[{},]}' +check_fail '{"x":[{}{}]}' +check_fail '{"x":[{},,{}]}' +check_fail '{"x":[{"y":}]}' +check_fail '{"x":""}' +check_fail '{"x":null}' +check_fail '{"x":[null]}' +check_fail '{"x":[true]}' +check_fail '{"x":["string"]}' +check_fail '{"x":[[]]}' +check_fail '{"x":1.0}' +check_fail '{"x":1e2}' +check_fail '{"x":+1}' +check_fail '{"x":-}' +check_fail '{"x":0x10}' +check_fail '{"x":01}' +check_fail '{"x":-01}' +check_fail '{"x":[1]}' +check_fail '{"x":9223372036854775808}' +check_fail '{"x":-9223372036854775809}' +check_fail '{"x":tru}' +check_fail '{"x":True}' +check_fail '{"x":falsee}' +check_fail '{"x":"bad\q"}' +check_fail '{"x":"bad\x20"}' +check_fail '{"x":"bad\u123"}' +check_fail '{"x":"bad\u12x4"}' +check_fail '{"x":"unterminated}' +check_fail '{"x":"escaped quote\"}' +check_fail '{"x":"line +break"}' + +# The maximum object nesting depth is 200. +json='{}' +n=1 +while [ "$n" -lt 200 ]; do + json='{"x":'"$json"'}' + n=$((n + 1)) +done +check "$json" "$json" +check_fail '{"x":'"$json"'}' + +if $TMUX display-message -pj >/dev/null 2>&1; then + fail "display-message -j accepted a missing message" +fi + +$TMUX kill-server 2>/dev/null +exit 0