File:  [Research Unix] / researchv10no / cmd / worm / scsi / tcl / tests / expr.test
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:21:34 2018 UTC (8 years, 1 month ago) by root
Branches: belllabs, MAIN
CVS tags: researchv10, HEAD
researchv10 Norman

# This file contains contains a collection of tests for the "expr"
# command in Tcl.  If everything is OK then it finishes silently.
# If a problem is detected then it generates a Tcl error with a
# cryptic message.  To trace the error you'll have to read through
# the commands in this file.
#
# $Header: /var/lib/cvsd/repos/research/researchv10no/cmd/worm/scsi/tcl/tests/expr.test,v 1.1.1.1 2018/04/24 17:21:34 root Exp $ (Berkeley)

proc check {a b num} {
    if {$a != $b} {
	error [format {Expr error %s: wanted "%s", got "%s"} $num $b $a]}
}
proc checkstr {a b num} {
    if {[string compare $a $b] != 0} {
	error [format {Expr error %s: wanted "%s", got "%s"} $num $b $a]}
}

# First, test all of the operators individually.

check [expr -4] -4 1.1
check [expr -(1+4)] -5 1.2
check [expr ~3] 0xfffffffc 1.3
check [expr !2] 0 1.3
check [expr !0] 1 1.4
check [expr 4*6] 24 1.5
check [expr 36/12] 3 1.6
check [expr 27/4] 6 1.7
check [expr 27%4] 3 1.8
check [expr 2+2] 4 1.9
check [expr 2-6] -4 1.10
check [expr 1<<3] 8 1.11
check [expr 0xff>>2] 0x3f 1.12
check [expr -1>>2] -1 1.13
check [expr 3>2] 1 1.14
check [expr 2>2] 0 1.15
check [expr 1>2] 0 1.16
check [expr 3<2] 0 1.17
check [expr 2<2] 0 1.18
check [expr 1<2] 1 1.19
check [expr 3>=2] 1 1.20
check [expr 2>=2] 1 1.21
check [expr 1>=2] 0 1.22
check [expr 3<=2] 0 1.23
check [expr 2<=2] 1 1.24
check [expr 1<=2] 1 1.25
check [expr 3==2] 0 1.26
check [expr 2==2] 1 1.27
check [expr 3!=2] 1 1.28
check [expr 2!=2] 0 1.29
check [expr 7&0x13] 3 1.30
check [expr 7^0x13] 0x14 1.31
check [expr 7|0x13] 0x17 1.32
check [expr 0&&1] 0 1.33
check [expr 0&&0] 0 1.34
check [expr 1&&3] 1 1.35
check [expr 0||1] 1 1.36
check [expr 3||0] 1 1.37
check [expr 0||0] 0 1.38
check [expr 3>2?44:66] 44 1.39
check [expr 2>3?44:66] 66 1.40

# Check precedence pairwise.

check [expr -~3] 4 2.1
check [expr -!3] 0 2.2
check [expr -~0] 1 2.3

check [expr 2*4/6] 1 3.1
check [expr 24/6*3] 12 3.2
check [expr 24/6/2] 2 3.3

check [expr -2+4] 2 4.1
check [expr -2-4] -6 4.2

check [expr 2*3+4] 10 5.1
check [expr 8/2+4] 8 5.2
check [expr 8%3+4] 6 5.3
check [expr 2*3-1] 5 5.4
check [expr 8/2-1] 3 5.5
check [expr 8%3-1] 1 5.6

check [expr 6-3-2] 1 6.1

check [expr 7+1>>2] 2 7.1
check [expr 7+1<<2] 32 7.2
check [expr 7>>3-2] 3 7.3
check [expr 7<<3-2] 14 7.4

check [expr 6>>1>4] 0 8.1
check [expr 6>>1<2] 0 8.2
check [expr 6>>1>=3] 1 8.3
check [expr 6>>1<=2] 0 8.4
check [expr 6<<1>5] 1 8.5
check [expr 6<<1<5] 0 8.6
check [expr 5<=6<<1] 1 8.7
check [expr 5>=6<<1] 0 8.8

check [expr 2<3<4] 1 9.1
check [expr 0<4>2] 0 9.2
check [expr 4>2<1] 0 9.3
check [expr 4>3>2] 0 9.4
check [expr 4>3>=2] 0 9.5
check [expr 4>=3>2] 0 9.6
check [expr 4>=3>=2] 0 9.7
check [expr 0<=4>=2] 0 9.8
check [expr 4>=2<=0] 0 9.9
check [expr 2<=3<=4] 1 9.10

check [expr 1==4>3] 1 10.1
check [expr 0!=4>3] 1 10.2
check [expr 1==3<4] 1 10.3
check [expr 0!=3<4] 1 10.4
check [expr 1==4>=3] 1 10.5
check [expr 0!=4>=3] 1 10.6
check [expr 1==3<=4] 1 10.7
check [expr 0!=3<=4] 1 10.8

check [expr 1==3==3] 0 11.1
check [expr 3==3!=2] 1 11.2
check [expr 2!=3==3] 0 11.3
check [expr 2!=1!=1] 0 11.3

check [expr 2&3==2] 0 12.1
check [expr 1&3!=3] 0 12.2

check [expr 7&3^0x10] 0x13 13.1
check [expr 7^0x10&3] 7 13.2

check [expr 7^0x10|3] 0x17 14.1
check [expr 7|0x10^3] 0x17 14.2

check [expr 7|3&&1] 1 15.1
check [expr 1&&3|7] 1 15.2

check [expr 0&&1||1] 1 15.3
check [expr 1||1&&0] 1 15.4

check [expr 1||0?3:4] 3 16.1
check [expr 1?0:4||1] 0 16.2

# Parentheses.

check [expr (2+4)*6] 36 17.1
check [expr (1?0:4)||1] 1 17.2

# Embedded commands and variable names.

set a 16
check [expr {2*$a}] 32 18.1
check [expr {[set a] - 14}] 2 18.2

# Numbers in various bases.

check [expr 0x20] 32 19.1
check [expr 015] 13 19.2

# Various error conditions.

check [catch {expr 2+a} msg] 1 20.1
checkstr $msg {syntax error in expression "2+a"} 20.2
check [catch {expr 2+4*} msg] 1 20.3
check [catch {expr 2+4*(} msg] 1 20.4
check [catch {expr 2+$_non_existent_} msg] 1 20.5
checkstr $msg {couldn't find variable "_non_existent_"} 20.6
set a xx
check [catch {expr {2+$a}} msg] 1 20.7
checkstr $msg {variable "$a" contained non-numeric value "xx"} 20.8
check [catch {expr {2+[set a]}} msg] 1 20.9
checkstr $msg {command "set a" returned non-numeric result "xx"} 20.10
check [catch {expr {2+(4}} msg] 1 20.11
checkstr $msg {unmatched parentheses in expression "2+(4"} 20.12
check [catch {expr 2/0} msg] 1 20.13
checkstr $msg {divide by zero} 20.14
check [catch {expr 2%0} msg] 1 20.15
checkstr $msg {divide by zero} 20.16
check [catch {expr 2#} msg] 1 20.17
checkstr $msg {syntax error in expression "2#"} 20.18
check [catch {expr 2?foo:1} msg] 1 20.19
check [catch {expr 0?foo:1} msg] 1 20.20
check [catch {expr 2?1:foo} msg] 1 20.21
check [catch {expr 0?1:foo} msg] 1 20.22

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.