[25] | 1 | # Commands covered: ::tcl::mathop::... |
---|
| 2 | # |
---|
| 3 | # This file contains a collection of tests for one or more of the Tcl built-in |
---|
| 4 | # commands. Sourcing this file into Tcl runs the tests and generates output |
---|
| 5 | # for errors. No output means no errors were found. |
---|
| 6 | # |
---|
| 7 | # Copyright (c) 2006 Donal K. Fellows |
---|
| 8 | # Copyright (c) 2006 Peter Spjuth |
---|
| 9 | # |
---|
| 10 | # See the file "license.terms" for information on usage and redistribution of |
---|
| 11 | # this file, and for a DISCLAIMER OF ALL WARRANTIES. |
---|
| 12 | # |
---|
| 13 | # RCS: @(#) $Id: mathop.test,v 1.11 2007/12/13 15:26:06 dgp Exp $ |
---|
| 14 | |
---|
| 15 | if {[lsearch [namespace children] ::tcltest] == -1} { |
---|
| 16 | package require tcltest 2.1 |
---|
| 17 | namespace import -force ::tcltest::* |
---|
| 18 | } |
---|
| 19 | |
---|
| 20 | # A namespace to test that operators are exported and that they |
---|
| 21 | # work when imported |
---|
| 22 | namespace eval ::testmathop2 { |
---|
| 23 | namespace import ::tcl::mathop::* |
---|
| 24 | } |
---|
| 25 | |
---|
| 26 | # Helper to test math ops. |
---|
| 27 | # Test different invokation variants and see that they do the same thing. |
---|
| 28 | # Byte compiled / non byte compiled version |
---|
| 29 | # Shared / unshared arguments |
---|
| 30 | # Original / imported |
---|
| 31 | proc TestOp {op args} { |
---|
| 32 | set results {} |
---|
| 33 | |
---|
| 34 | # Non byte compiled version, shared args |
---|
| 35 | if {[catch {::tcl::mathop::$op {*}$args} res]} { |
---|
| 36 | append res " $::errorCode" |
---|
| 37 | } |
---|
| 38 | lappend results $res |
---|
| 39 | |
---|
| 40 | # Non byte compiled version, unshared args |
---|
| 41 | set cmd ::tcl::mathop::\$op |
---|
| 42 | foreach arg $args { |
---|
| 43 | append cmd " \[format %s [list $arg]\]" |
---|
| 44 | } |
---|
| 45 | if {[catch $cmd res]} { |
---|
| 46 | append res " $::errorCode" |
---|
| 47 | } |
---|
| 48 | lappend results $res |
---|
| 49 | |
---|
| 50 | # Non byte compiled imported |
---|
| 51 | if {[catch {::testmathop2::$op {*}$args} res]} { |
---|
| 52 | append res " $::errorCode" |
---|
| 53 | } |
---|
| 54 | lappend results [string map {testmathop2 tcl::mathop} $res] |
---|
| 55 | |
---|
| 56 | # BC version |
---|
| 57 | set argList1 {} |
---|
| 58 | set argList2 {} |
---|
| 59 | set argList3 {} |
---|
| 60 | for {set t 0} {$t < [llength $args]} {incr t} { |
---|
| 61 | lappend argList1 a$t |
---|
| 62 | lappend argList2 \$a$t |
---|
| 63 | lappend argList3 "\[format %s \$a$t\]" |
---|
| 64 | } |
---|
| 65 | # Shared args |
---|
| 66 | proc _TestOp $argList1 "::tcl::mathop::$op [join $argList2]" |
---|
| 67 | # Unshared args |
---|
| 68 | proc _TestOp2 $argList1 "::tcl::mathop::$op [join $argList3]" |
---|
| 69 | # Imported |
---|
| 70 | proc _TestOp3 $argList1 "::testmathop2::$op [join $argList2]" |
---|
| 71 | |
---|
| 72 | set ::tcl_traceCompile 0 ;# Set to 2 to help with debug |
---|
| 73 | if {[catch {_TestOp {*}$args} res]} { |
---|
| 74 | append res " $::errorCode" |
---|
| 75 | } |
---|
| 76 | set ::tcl_traceCompile 0 |
---|
| 77 | lappend results $res |
---|
| 78 | |
---|
| 79 | if {[catch {_TestOp2 {*}$args} res]} { |
---|
| 80 | append res " $::errorCode" |
---|
| 81 | } |
---|
| 82 | lappend results $res |
---|
| 83 | |
---|
| 84 | if {[catch {_TestOp3 {*}$args} res]} { |
---|
| 85 | append res " $::errorCode" |
---|
| 86 | } |
---|
| 87 | lappend results [string map {testmathop2 tcl::mathop} $res] |
---|
| 88 | |
---|
| 89 | # Check that they do the same |
---|
| 90 | set len [llength $results] |
---|
| 91 | for {set i 0} {$i < ($len - 1)} {incr i} { |
---|
| 92 | set res1 [lindex $results $i] |
---|
| 93 | set res2 [lindex $results $i+1] |
---|
| 94 | if {$res1 ne $res2} { |
---|
| 95 | return "$i:($res1 != $res2)" |
---|
| 96 | } |
---|
| 97 | } |
---|
| 98 | return [lindex $results 0] |
---|
| 99 | } |
---|
| 100 | |
---|
| 101 | # start of tests |
---|
| 102 | |
---|
| 103 | namespace eval ::testmathop { |
---|
| 104 | namespace path ::tcl::mathop |
---|
| 105 | variable op ;# stop surprises! |
---|
| 106 | |
---|
| 107 | test mathop-1.1 {compiled +} { + } 0 |
---|
| 108 | test mathop-1.2 {compiled +} { + 1 } 1 |
---|
| 109 | test mathop-1.3 {compiled +} { + 1 2 } 3 |
---|
| 110 | test mathop-1.4 {compiled +} { + 1 2 3 } 6 |
---|
| 111 | test mathop-1.5 {compiled +} { + 1.0 2 3 } 6.0 |
---|
| 112 | test mathop-1.6 {compiled +} { + 1 2 3.0 } 6.0 |
---|
| 113 | test mathop-1.7 {compiled +} { + 100000000000 2 3 } 100000000005 |
---|
| 114 | test mathop-1.8 {compiled +} { + 1 2 300000000000 } 300000000003 |
---|
| 115 | test mathop-1.9 {compiled +} { + 1000000000000000000000 2 3 } 1000000000000000000005 |
---|
| 116 | test mathop-1.10 {compiled +} { + 1 2 3000000000000000000000 } 3000000000000000000003 |
---|
| 117 | test mathop-1.11 {compiled +: errors} -returnCodes error -body { |
---|
| 118 | + x 0 |
---|
| 119 | } -result {can't use non-numeric string as operand of "+"} |
---|
| 120 | test mathop-1.12 {compiled +: errors} -returnCodes error -body { |
---|
| 121 | + nan 0 |
---|
| 122 | } -result {can't use non-numeric floating-point value as operand of "+"} |
---|
| 123 | test mathop-1.13 {compiled +: errors} -returnCodes error -body { |
---|
| 124 | + 0 x |
---|
| 125 | } -result {can't use non-numeric string as operand of "+"} |
---|
| 126 | test mathop-1.14 {compiled +: errors} -returnCodes error -body { |
---|
| 127 | + 0 nan |
---|
| 128 | } -result {can't use non-numeric floating-point value as operand of "+"} |
---|
| 129 | test mathop-1.15 {compiled +: errors} -returnCodes error -body { |
---|
| 130 | + 0o8 0 |
---|
| 131 | } -result {can't use invalid octal number as operand of "+"} |
---|
| 132 | test mathop-1.16 {compiled +: errors} -returnCodes error -body { |
---|
| 133 | + 0 0o8 |
---|
| 134 | } -result {can't use invalid octal number as operand of "+"} |
---|
| 135 | test mathop-1.17 {compiled +: errors} -returnCodes error -body { |
---|
| 136 | + 0 [error expectedError] |
---|
| 137 | } -result expectedError |
---|
| 138 | test mathop-1.18 {compiled +: argument processing order} -body { |
---|
| 139 | # Bytecode compilation known hard for 3+ arguments |
---|
| 140 | list [catch { |
---|
| 141 | + [set x 0] [incr x] NaN [incr x] [error expected] [incr x] |
---|
| 142 | } msg] $msg $x |
---|
| 143 | } -result {1 expected 2} |
---|
| 144 | set op + |
---|
| 145 | test mathop-1.19 {interpreted +} { $op } 0 |
---|
| 146 | test mathop-1.20 {interpreted +} { $op 1 } 1 |
---|
| 147 | test mathop-1.21 {interpreted +} { $op 1 2 } 3 |
---|
| 148 | test mathop-1.22 {interpreted +} { $op 1 2 3 } 6 |
---|
| 149 | test mathop-1.23 {interpreted +} { $op 1.0 2 3 } 6.0 |
---|
| 150 | test mathop-1.24 {interpreted +} { $op 1 2 3.0 } 6.0 |
---|
| 151 | test mathop-1.25 {interpreted +} { $op 100000000000 2 3 } 100000000005 |
---|
| 152 | test mathop-1.26 {interpreted +} { $op 1 2 300000000000 } 300000000003 |
---|
| 153 | test mathop-1.27 {interpreted +} { $op 1000000000000000000000 2 3 } 1000000000000000000005 |
---|
| 154 | test mathop-1.28 {interpreted +} { $op 1 2 3000000000000000000000 } 3000000000000000000003 |
---|
| 155 | test mathop-1.29 {interpreted +: errors} -returnCodes error -body { |
---|
| 156 | $op x 0 |
---|
| 157 | } -result {can't use non-numeric string as operand of "+"} |
---|
| 158 | test mathop-1.30 {interpreted +: errors} -returnCodes error -body { |
---|
| 159 | $op nan 0 |
---|
| 160 | } -result {can't use non-numeric floating-point value as operand of "+"} |
---|
| 161 | test mathop-1.31 {interpreted +: errors} -returnCodes error -body { |
---|
| 162 | $op 0 x |
---|
| 163 | } -result {can't use non-numeric string as operand of "+"} |
---|
| 164 | test mathop-1.32 {interpreted +: errors} -returnCodes error -body { |
---|
| 165 | $op 0 nan |
---|
| 166 | } -result {can't use non-numeric floating-point value as operand of "+"} |
---|
| 167 | test mathop-1.33 {interpreted +: errors} -returnCodes error -body { |
---|
| 168 | $op 0o8 0 |
---|
| 169 | } -result {can't use invalid octal number as operand of "+"} |
---|
| 170 | test mathop-1.34 {interpreted +: errors} -returnCodes error -body { |
---|
| 171 | $op 0 0o8 |
---|
| 172 | } -result {can't use invalid octal number as operand of "+"} |
---|
| 173 | test mathop-1.35 {interpreted +: errors} -returnCodes error -body { |
---|
| 174 | $op 0 [error expectedError] |
---|
| 175 | } -result expectedError |
---|
| 176 | test mathop-1.36 {interpreted +: argument processing order} -body { |
---|
| 177 | list [catch { |
---|
| 178 | $op [set x 0] [incr x] NaN [incr x] [error expected] [incr x] |
---|
| 179 | } msg] $msg $x |
---|
| 180 | } -result {1 expected 2} |
---|
| 181 | |
---|
| 182 | test mathop-2.1 {compiled *} { * } 1 |
---|
| 183 | test mathop-2.2 {compiled *} { * 2 } 2 |
---|
| 184 | test mathop-2.3 {compiled *} { * 2 3 } 6 |
---|
| 185 | test mathop-2.4 {compiled *} { * 2 3 4 } 24 |
---|
| 186 | test mathop-2.5 {compiled *} { * 1.0 2 3 } 6.0 |
---|
| 187 | test mathop-2.6 {compiled *} { * 1 2 3.0 } 6.0 |
---|
| 188 | test mathop-2.7 {compiled *} { * 100000000000 2 3 } 600000000000 |
---|
| 189 | test mathop-2.8 {compiled *} { * 1 2 300000000000 } 600000000000 |
---|
| 190 | test mathop-2.9 {compiled *} { * 1000000000000000000000 2 3 } 6000000000000000000000 |
---|
| 191 | test mathop-2.10 {compiled *} { * 1 2 3000000000000000000000 } 6000000000000000000000 |
---|
| 192 | test mathop-2.11 {compiled *: errors} -returnCodes error -body { |
---|
| 193 | * x 0 |
---|
| 194 | } -result {can't use non-numeric string as operand of "*"} |
---|
| 195 | test mathop-2.12 {compiled *: errors} -returnCodes error -body { |
---|
| 196 | * nan 0 |
---|
| 197 | } -result {can't use non-numeric floating-point value as operand of "*"} |
---|
| 198 | test mathop-2.13 {compiled *: errors} -returnCodes error -body { |
---|
| 199 | * 0 x |
---|
| 200 | } -result {can't use non-numeric string as operand of "*"} |
---|
| 201 | test mathop-2.14 {compiled *: errors} -returnCodes error -body { |
---|
| 202 | * 0 nan |
---|
| 203 | } -result {can't use non-numeric floating-point value as operand of "*"} |
---|
| 204 | test mathop-2.15 {compiled *: errors} -returnCodes error -body { |
---|
| 205 | * 0o8 0 |
---|
| 206 | } -result {can't use invalid octal number as operand of "*"} |
---|
| 207 | test mathop-2.16 {compiled *: errors} -returnCodes error -body { |
---|
| 208 | * 0 0o8 |
---|
| 209 | } -result {can't use invalid octal number as operand of "*"} |
---|
| 210 | test mathop-2.17 {compiled *: errors} -returnCodes error -body { |
---|
| 211 | * 0 [error expectedError] |
---|
| 212 | } -result expectedError |
---|
| 213 | test mathop-2.18 {compiled *: argument processing order} -body { |
---|
| 214 | # Bytecode compilation known hard for 3+ arguments |
---|
| 215 | list [catch { |
---|
| 216 | * [set x 0] [incr x] NaN [incr x] [error expected] [incr x] |
---|
| 217 | } msg] $msg $x |
---|
| 218 | } -result {1 expected 2} |
---|
| 219 | set op * |
---|
| 220 | test mathop-2.19 {interpreted *} { $op } 1 |
---|
| 221 | test mathop-2.20 {interpreted *} { $op 2 } 2 |
---|
| 222 | test mathop-2.21 {interpreted *} { $op 2 3 } 6 |
---|
| 223 | test mathop-2.22 {interpreted *} { $op 2 3 4 } 24 |
---|
| 224 | test mathop-2.23 {interpreted *} { $op 1.0 2 3 } 6.0 |
---|
| 225 | test mathop-2.24 {interpreted *} { $op 1 2 3.0 } 6.0 |
---|
| 226 | test mathop-2.25 {interpreted *} { $op 100000000000 2 3 } 600000000000 |
---|
| 227 | test mathop-2.26 {interpreted *} { $op 1 2 300000000000 } 600000000000 |
---|
| 228 | test mathop-2.27 {interpreted *} { $op 1000000000000000000000 2 3 } 6000000000000000000000 |
---|
| 229 | test mathop-2.28 {interpreted *} { $op 1 2 3000000000000000000000 } 6000000000000000000000 |
---|
| 230 | test mathop-2.29 {interpreted *: errors} -returnCodes error -body { |
---|
| 231 | $op x 0 |
---|
| 232 | } -result {can't use non-numeric string as operand of "*"} |
---|
| 233 | test mathop-2.30 {interpreted *: errors} -returnCodes error -body { |
---|
| 234 | $op nan 0 |
---|
| 235 | } -result {can't use non-numeric floating-point value as operand of "*"} |
---|
| 236 | test mathop-2.31 {interpreted *: errors} -returnCodes error -body { |
---|
| 237 | $op 0 x |
---|
| 238 | } -result {can't use non-numeric string as operand of "*"} |
---|
| 239 | test mathop-2.32 {interpreted *: errors} -returnCodes error -body { |
---|
| 240 | $op 0 nan |
---|
| 241 | } -result {can't use non-numeric floating-point value as operand of "*"} |
---|
| 242 | test mathop-2.33 {interpreted *: errors} -returnCodes error -body { |
---|
| 243 | $op 0o8 0 |
---|
| 244 | } -result {can't use invalid octal number as operand of "*"} |
---|
| 245 | test mathop-2.34 {interpreted *: errors} -returnCodes error -body { |
---|
| 246 | $op 0 0o8 |
---|
| 247 | } -result {can't use invalid octal number as operand of "*"} |
---|
| 248 | test mathop-2.35 {interpreted *: errors} -returnCodes error -body { |
---|
| 249 | $op 0 [error expectedError] |
---|
| 250 | } -result expectedError |
---|
| 251 | test mathop-2.36 {interpreted *: argument processing order} -body { |
---|
| 252 | list [catch { |
---|
| 253 | $op [set x 0] [incr x] NaN [incr x] [error expected] [incr x] |
---|
| 254 | } msg] $msg $x |
---|
| 255 | } -result {1 expected 2} |
---|
| 256 | |
---|
| 257 | test mathop-3.1 {compiled !} {! 0} 1 |
---|
| 258 | test mathop-3.2 {compiled !} {! 1} 0 |
---|
| 259 | test mathop-3.3 {compiled !} {! false} 1 |
---|
| 260 | test mathop-3.4 {compiled !} {! true} 0 |
---|
| 261 | test mathop-3.5 {compiled !} {! 0.0} 1 |
---|
| 262 | test mathop-3.6 {compiled !} {! 10000000000} 0 |
---|
| 263 | test mathop-3.7 {compiled !} {! 10000000000000000000000000} 0 |
---|
| 264 | test mathop-3.8 {compiled !: errors} -body { |
---|
| 265 | ! foobar |
---|
| 266 | } -returnCodes error -result {can't use non-numeric string as operand of "!"} |
---|
| 267 | test mathop-3.9 {compiled !: errors} -body { |
---|
| 268 | ! 0 0 |
---|
| 269 | } -returnCodes error -result "wrong # args: should be \"! boolean\"" |
---|
| 270 | test mathop-3.10 {compiled !: errors} -body { |
---|
| 271 | ! |
---|
| 272 | } -returnCodes error -result "wrong # args: should be \"! boolean\"" |
---|
| 273 | set op ! |
---|
| 274 | test mathop-3.11 {interpreted !} {$op 0} 1 |
---|
| 275 | test mathop-3.12 {interpreted !} {$op 1} 0 |
---|
| 276 | test mathop-3.13 {interpreted !} {$op false} 1 |
---|
| 277 | test mathop-3.14 {interpreted !} {$op true} 0 |
---|
| 278 | test mathop-3.15 {interpreted !} {$op 0.0} 1 |
---|
| 279 | test mathop-3.16 {interpreted !} {$op 10000000000} 0 |
---|
| 280 | test mathop-3.17 {interpreted !} {$op 10000000000000000000000000} 0 |
---|
| 281 | test mathop-3.18 {interpreted !: errors} -body { |
---|
| 282 | $op foobar |
---|
| 283 | } -returnCodes error -result {can't use non-numeric string as operand of "!"} |
---|
| 284 | test mathop-3.19 {interpreted !: errors} -body { |
---|
| 285 | $op 0 0 |
---|
| 286 | } -returnCodes error -result "wrong # args: should be \"! boolean\"" |
---|
| 287 | test mathop-3.20 {interpreted !: errors} -body { |
---|
| 288 | $op |
---|
| 289 | } -returnCodes error -result "wrong # args: should be \"! boolean\"" |
---|
| 290 | test mathop-3.21 {compiled !: error} -returnCodes error -body { |
---|
| 291 | ! NaN |
---|
| 292 | } -result {can't use non-numeric floating-point value as operand of "!"} |
---|
| 293 | test mathop-3.22 {interpreted !: error} -returnCodes error -body { |
---|
| 294 | $op NaN |
---|
| 295 | } -result {can't use non-numeric floating-point value as operand of "!"} |
---|
| 296 | |
---|
| 297 | test mathop-4.1 {compiled ~} {~ 0} -1 |
---|
| 298 | test mathop-4.2 {compiled ~} {~ 1} -2 |
---|
| 299 | test mathop-4.3 {compiled ~} {~ 31} -32 |
---|
| 300 | test mathop-4.4 {compiled ~} {~ -127} 126 |
---|
| 301 | test mathop-4.5 {compiled ~} {~ -0} -1 |
---|
| 302 | test mathop-4.6 {compiled ~} {~ 10000000000} -10000000001 |
---|
| 303 | test mathop-4.7 {compiled ~} {~ 10000000000000000000000000} -10000000000000000000000001 |
---|
| 304 | test mathop-4.8 {compiled ~: errors} -body { |
---|
| 305 | ~ foobar |
---|
| 306 | } -returnCodes error -result {can't use non-numeric string as operand of "~"} |
---|
| 307 | test mathop-4.9 {compiled ~: errors} -body { |
---|
| 308 | ~ 0 0 |
---|
| 309 | } -returnCodes error -result "wrong # args: should be \"~ integer\"" |
---|
| 310 | test mathop-4.10 {compiled ~: errors} -body { |
---|
| 311 | ~ |
---|
| 312 | } -returnCodes error -result "wrong # args: should be \"~ integer\"" |
---|
| 313 | test mathop-4.11 {compiled ~: errors} -returnCodes error -body { |
---|
| 314 | ~ 0.0 |
---|
| 315 | } -result {can't use floating-point value as operand of "~"} |
---|
| 316 | test mathop-4.12 {compiled ~: errors} -returnCodes error -body { |
---|
| 317 | ~ NaN |
---|
| 318 | } -result {can't use non-numeric floating-point value as operand of "~"} |
---|
| 319 | set op ~ |
---|
| 320 | test mathop-4.13 {interpreted ~} {$op 0} -1 |
---|
| 321 | test mathop-4.14 {interpreted ~} {$op 1} -2 |
---|
| 322 | test mathop-4.15 {interpreted ~} {$op 31} -32 |
---|
| 323 | test mathop-4.16 {interpreted ~} {$op -127} 126 |
---|
| 324 | test mathop-4.17 {interpreted ~} {$op -0} -1 |
---|
| 325 | test mathop-4.18 {interpreted ~} {$op 10000000000} -10000000001 |
---|
| 326 | test mathop-4.19 {interpreted ~} {$op 10000000000000000000000000} -10000000000000000000000001 |
---|
| 327 | test mathop-4.20 {interpreted ~: errors} -body { |
---|
| 328 | $op foobar |
---|
| 329 | } -returnCodes error -result {can't use non-numeric string as operand of "~"} |
---|
| 330 | test mathop-4.21 {interpreted ~: errors} -body { |
---|
| 331 | $op 0 0 |
---|
| 332 | } -returnCodes error -result "wrong # args: should be \"~ integer\"" |
---|
| 333 | test mathop-4.22 {interpreted ~: errors} -body { |
---|
| 334 | $op |
---|
| 335 | } -returnCodes error -result "wrong # args: should be \"~ integer\"" |
---|
| 336 | test mathop-4.23 {interpreted ~: errors} -returnCodes error -body { |
---|
| 337 | $op 0.0 |
---|
| 338 | } -result {can't use floating-point value as operand of "~"} |
---|
| 339 | test mathop-4.24 {interpreted ~: errors} -returnCodes error -body { |
---|
| 340 | $op NaN |
---|
| 341 | } -result {can't use non-numeric floating-point value as operand of "~"} |
---|
| 342 | |
---|
| 343 | test mathop-5.1 {compiled eq} {eq {} a} 0 |
---|
| 344 | test mathop-5.2 {compiled eq} {eq a a} 1 |
---|
| 345 | test mathop-5.3 {compiled eq} {eq a {}} 0 |
---|
| 346 | test mathop-5.4 {compiled eq} {eq a b} 0 |
---|
| 347 | test mathop-5.5 {compiled eq} { eq } 1 |
---|
| 348 | test mathop-5.6 {compiled eq} {eq a} 1 |
---|
| 349 | test mathop-5.7 {compiled eq} {eq a a a} 1 |
---|
| 350 | test mathop-5.8 {compiled eq} {eq a a b} 0 |
---|
| 351 | test mathop-5.9 {compiled eq} -body { |
---|
| 352 | eq a b [error foobar] |
---|
| 353 | } -returnCodes error -result foobar |
---|
| 354 | test mathop-5.10 {compiled eq} {eq NaN Na NaN} 0 |
---|
| 355 | set op eq |
---|
| 356 | test mathop-5.11 {interpreted eq} {$op {} a} 0 |
---|
| 357 | test mathop-5.12 {interpreted eq} {$op a a} 1 |
---|
| 358 | test mathop-5.13 {interpreted eq} {$op a {}} 0 |
---|
| 359 | test mathop-5.14 {interpreted eq} {$op a b} 0 |
---|
| 360 | test mathop-5.15 {interpreted eq} { $op } 1 |
---|
| 361 | test mathop-5.16 {interpreted eq} {$op a} 1 |
---|
| 362 | test mathop-5.17 {interpreted eq} {$op a a a} 1 |
---|
| 363 | test mathop-5.18 {interpreted eq} {$op a a b} 0 |
---|
| 364 | test mathop-5.19 {interpreted eq} -body { |
---|
| 365 | $op a b [error foobar] |
---|
| 366 | } -returnCodes error -result foobar |
---|
| 367 | test mathop-5.20 {interpreted eq} {$op NaN Na NaN} 0 |
---|
| 368 | |
---|
| 369 | variable big1 12135435435354435435342423948763867876 |
---|
| 370 | variable big2 2746237174783836746262564892918327847 |
---|
| 371 | variable wide1 12345678912345 |
---|
| 372 | variable wide2 87321847232215 |
---|
| 373 | variable small1 87345 |
---|
| 374 | variable small2 16753 |
---|
| 375 | |
---|
| 376 | test mathop-6.1 {compiled &} { & } -1 |
---|
| 377 | test mathop-6.2 {compiled &} { & 1 } 1 |
---|
| 378 | test mathop-6.3 {compiled &} { & 1 2 } 0 |
---|
| 379 | test mathop-6.4 {compiled &} { & 3 7 6 } 2 |
---|
| 380 | test mathop-6.5 {compiled &} -returnCodes error -body { |
---|
| 381 | & 1.0 2 3 |
---|
| 382 | } -result {can't use floating-point value as operand of "&"} |
---|
| 383 | test mathop-6.6 {compiled &} -returnCodes error -body { |
---|
| 384 | & 1 2 3.0 |
---|
| 385 | } -result {can't use floating-point value as operand of "&"} |
---|
| 386 | test mathop-6.7 {compiled &} { & 100000000002 18 -126 } 2 |
---|
| 387 | test mathop-6.8 {compiled &} { & 0xff 0o377 333333333333 } 85 |
---|
| 388 | test mathop-6.9 {compiled &} { & 1000000000000000000002 18 -126 } 2 |
---|
| 389 | test mathop-6.10 {compiled &} { & 0xff 0o377 3333333333333333333333 } 85 |
---|
| 390 | test mathop-6.11 {compiled &: errors} -returnCodes error -body { |
---|
| 391 | & x 0 |
---|
| 392 | } -result {can't use non-numeric string as operand of "&"} |
---|
| 393 | test mathop-6.12 {compiled &: errors} -returnCodes error -body { |
---|
| 394 | & nan 0 |
---|
| 395 | } -result {can't use non-numeric floating-point value as operand of "&"} |
---|
| 396 | test mathop-6.13 {compiled &: errors} -returnCodes error -body { |
---|
| 397 | & 0 x |
---|
| 398 | } -result {can't use non-numeric string as operand of "&"} |
---|
| 399 | test mathop-6.14 {compiled &: errors} -returnCodes error -body { |
---|
| 400 | & 0 nan |
---|
| 401 | } -result {can't use non-numeric floating-point value as operand of "&"} |
---|
| 402 | test mathop-6.15 {compiled &: errors} -returnCodes error -body { |
---|
| 403 | & 0o8 0 |
---|
| 404 | } -result {can't use invalid octal number as operand of "&"} |
---|
| 405 | test mathop-6.16 {compiled &: errors} -returnCodes error -body { |
---|
| 406 | & 0 0o8 |
---|
| 407 | } -result {can't use invalid octal number as operand of "&"} |
---|
| 408 | test mathop-6.17 {compiled &: errors} -returnCodes error -body { |
---|
| 409 | & 0 [error expectedError] |
---|
| 410 | } -result expectedError |
---|
| 411 | test mathop-6.18 {compiled &: argument processing order} -body { |
---|
| 412 | # Bytecode compilation known hard for 3+ arguments |
---|
| 413 | list [catch { |
---|
| 414 | & [set x 0] [incr x] NaN [incr x] [error expected] [incr x] |
---|
| 415 | } msg] $msg $x |
---|
| 416 | } -result {1 expected 2} |
---|
| 417 | set op & |
---|
| 418 | test mathop-6.19 {interpreted &} { $op } -1 |
---|
| 419 | test mathop-6.20 {interpreted &} { $op 1 } 1 |
---|
| 420 | test mathop-6.21 {interpreted &} { $op 1 2 } 0 |
---|
| 421 | test mathop-6.22 {interpreted &} { $op 3 7 6 } 2 |
---|
| 422 | test mathop-6.23 {interpreted &} -returnCodes error -body { |
---|
| 423 | $op 1.0 2 3 |
---|
| 424 | } -result {can't use floating-point value as operand of "&"} |
---|
| 425 | test mathop-6.24 {interpreted &} -returnCodes error -body { |
---|
| 426 | $op 1 2 3.0 |
---|
| 427 | } -result {can't use floating-point value as operand of "&"} |
---|
| 428 | test mathop-6.25 {interpreted &} { $op 100000000002 18 -126 } 2 |
---|
| 429 | test mathop-6.26 {interpreted &} { $op 0xff 0o377 333333333333 } 85 |
---|
| 430 | test mathop-6.27 {interpreted &} { $op 1000000000000000000002 18 -126 } 2 |
---|
| 431 | test mathop-6.28 {interpreted &} { $op 0xff 0o377 3333333333333333333333 } 85 |
---|
| 432 | test mathop-6.29 {interpreted &: errors} -returnCodes error -body { |
---|
| 433 | $op x 0 |
---|
| 434 | } -result {can't use non-numeric string as operand of "&"} |
---|
| 435 | test mathop-6.30 {interpreted &: errors} -returnCodes error -body { |
---|
| 436 | $op nan 0 |
---|
| 437 | } -result {can't use non-numeric floating-point value as operand of "&"} |
---|
| 438 | test mathop-6.31 {interpreted &: errors} -returnCodes error -body { |
---|
| 439 | $op 0 x |
---|
| 440 | } -result {can't use non-numeric string as operand of "&"} |
---|
| 441 | test mathop-6.32 {interpreted &: errors} -returnCodes error -body { |
---|
| 442 | $op 0 nan |
---|
| 443 | } -result {can't use non-numeric floating-point value as operand of "&"} |
---|
| 444 | test mathop-6.33 {interpreted &: errors} -returnCodes error -body { |
---|
| 445 | $op 0o8 0 |
---|
| 446 | } -result {can't use invalid octal number as operand of "&"} |
---|
| 447 | test mathop-6.34 {interpreted &: errors} -returnCodes error -body { |
---|
| 448 | $op 0 0o8 |
---|
| 449 | } -result {can't use invalid octal number as operand of "&"} |
---|
| 450 | test mathop-6.35 {interpreted &: errors} -returnCodes error -body { |
---|
| 451 | $op 0 [error expectedError] |
---|
| 452 | } -result expectedError |
---|
| 453 | test mathop-6.36 {interpreted &: argument processing order} -body { |
---|
| 454 | list [catch { |
---|
| 455 | $op [set x 0] [incr x] NaN [incr x] [error expected] [incr x] |
---|
| 456 | } msg] $msg $x |
---|
| 457 | } -result {1 expected 2} |
---|
| 458 | test mathop-6.37 {& and bignums} { |
---|
| 459 | list [& $big1 $big2] [$op $big1 $big2] |
---|
| 460 | } {712439449294653815890598856501796 712439449294653815890598856501796} |
---|
| 461 | test mathop-6.38 {& and bignums} { |
---|
| 462 | list [& $big1 $wide2] [$op $big1 $wide2] |
---|
| 463 | } {78521450111684 78521450111684} |
---|
| 464 | test mathop-6.39 {& and bignums} { |
---|
| 465 | list [& $big1 $small2] [$op $big1 $small2] |
---|
| 466 | } {96 96} |
---|
| 467 | test mathop-6.40 {& and bignums} { |
---|
| 468 | list [& $wide1 $big2] [$op $wide1 $big2] |
---|
| 469 | } {2371422390785 2371422390785} |
---|
| 470 | test mathop-6.41 {& and bignums} { |
---|
| 471 | list [& $wide1 $wide2] [$op $wide1 $wide2] |
---|
| 472 | } {12275881497169 12275881497169} |
---|
| 473 | test mathop-6.42 {& and bignums} { |
---|
| 474 | list [& $wide1 $small2] [$op $wide1 $small2] |
---|
| 475 | } {16721 16721} |
---|
| 476 | test mathop-6.43 {& and bignums} { |
---|
| 477 | list [& $small1 $big2] [$op $small1 $big2] |
---|
| 478 | } {33 33} |
---|
| 479 | test mathop-6.44 {& and bignums} { |
---|
| 480 | list [& $small1 $wide2] [$op $small1 $wide2] |
---|
| 481 | } {87057 87057} |
---|
| 482 | test mathop-6.45 {& and bignums} { |
---|
| 483 | list [& $small1 $small2] [$op $small1 $small2] |
---|
| 484 | } {16689 16689} |
---|
| 485 | |
---|
| 486 | test mathop-7.1 {compiled |} { | } 0 |
---|
| 487 | test mathop-7.2 {compiled |} { | 1 } 1 |
---|
| 488 | test mathop-7.3 {compiled |} { | 1 2 } 3 |
---|
| 489 | test mathop-7.4 {compiled |} { | 3 7 6 } 7 |
---|
| 490 | test mathop-7.5 {compiled |} -returnCodes error -body { |
---|
| 491 | | 1.0 2 3 |
---|
| 492 | } -result {can't use floating-point value as operand of "|"} |
---|
| 493 | test mathop-7.6 {compiled |} -returnCodes error -body { |
---|
| 494 | | 1 2 3.0 |
---|
| 495 | } -result {can't use floating-point value as operand of "|"} |
---|
| 496 | test mathop-7.7 {compiled |} { | 100000000002 18 -126 } -110 |
---|
| 497 | test mathop-7.8 {compiled |} { | 0xff 0o377 333333333333 } 333333333503 |
---|
| 498 | test mathop-7.9 {compiled |} { | 1000000000000000000002 18 -126 } -110 |
---|
| 499 | test mathop-7.10 {compiled |} { | 0xff 0o377 3333333333333333333333 } 3333333333333333333503 |
---|
| 500 | test mathop-7.11 {compiled |: errors} -returnCodes error -body { |
---|
| 501 | | x 0 |
---|
| 502 | } -result {can't use non-numeric string as operand of "|"} |
---|
| 503 | test mathop-7.12 {compiled |: errors} -returnCodes error -body { |
---|
| 504 | | nan 0 |
---|
| 505 | } -result {can't use non-numeric floating-point value as operand of "|"} |
---|
| 506 | test mathop-7.13 {compiled |: errors} -returnCodes error -body { |
---|
| 507 | | 0 x |
---|
| 508 | } -result {can't use non-numeric string as operand of "|"} |
---|
| 509 | test mathop-7.14 {compiled |: errors} -returnCodes error -body { |
---|
| 510 | | 0 nan |
---|
| 511 | } -result {can't use non-numeric floating-point value as operand of "|"} |
---|
| 512 | test mathop-7.15 {compiled |: errors} -returnCodes error -body { |
---|
| 513 | | 0o8 0 |
---|
| 514 | } -result {can't use invalid octal number as operand of "|"} |
---|
| 515 | test mathop-7.16 {compiled |: errors} -returnCodes error -body { |
---|
| 516 | | 0 0o8 |
---|
| 517 | } -result {can't use invalid octal number as operand of "|"} |
---|
| 518 | test mathop-7.17 {compiled |: errors} -returnCodes error -body { |
---|
| 519 | | 0 [error expectedError] |
---|
| 520 | } -result expectedError |
---|
| 521 | test mathop-7.18 {compiled |: argument processing order} -body { |
---|
| 522 | # Bytecode compilation known hard for 3+ arguments |
---|
| 523 | list [catch { |
---|
| 524 | | [set x 0] [incr x] NaN [incr x] [error expected] [incr x] |
---|
| 525 | } msg] $msg $x |
---|
| 526 | } -result {1 expected 2} |
---|
| 527 | set op | |
---|
| 528 | test mathop-7.19 {interpreted |} { $op } 0 |
---|
| 529 | test mathop-7.20 {interpreted |} { $op 1 } 1 |
---|
| 530 | test mathop-7.21 {interpreted |} { $op 1 2 } 3 |
---|
| 531 | test mathop-7.22 {interpreted |} { $op 3 7 6 } 7 |
---|
| 532 | test mathop-7.23 {interpreted |} -returnCodes error -body { |
---|
| 533 | $op 1.0 2 3 |
---|
| 534 | } -result {can't use floating-point value as operand of "|"} |
---|
| 535 | test mathop-7.24 {interpreted |} -returnCodes error -body { |
---|
| 536 | $op 1 2 3.0 |
---|
| 537 | } -result {can't use floating-point value as operand of "|"} |
---|
| 538 | test mathop-7.25 {interpreted |} { $op 100000000002 18 -126 } -110 |
---|
| 539 | test mathop-7.26 {interpreted |} { $op 0xff 0o377 333333333333 } 333333333503 |
---|
| 540 | test mathop-7.27 {interpreted |} { $op 1000000000000000000002 18 -126 } -110 |
---|
| 541 | test mathop-7.28 {interpreted |} { $op 0xff 0o377 3333333333333333333333 } 3333333333333333333503 |
---|
| 542 | test mathop-7.29 {interpreted |: errors} -returnCodes error -body { |
---|
| 543 | $op x 0 |
---|
| 544 | } -result {can't use non-numeric string as operand of "|"} |
---|
| 545 | test mathop-7.30 {interpreted |: errors} -returnCodes error -body { |
---|
| 546 | $op nan 0 |
---|
| 547 | } -result {can't use non-numeric floating-point value as operand of "|"} |
---|
| 548 | test mathop-7.31 {interpreted |: errors} -returnCodes error -body { |
---|
| 549 | $op 0 x |
---|
| 550 | } -result {can't use non-numeric string as operand of "|"} |
---|
| 551 | test mathop-7.32 {interpreted |: errors} -returnCodes error -body { |
---|
| 552 | $op 0 nan |
---|
| 553 | } -result {can't use non-numeric floating-point value as operand of "|"} |
---|
| 554 | test mathop-7.33 {interpreted |: errors} -returnCodes error -body { |
---|
| 555 | $op 0o8 0 |
---|
| 556 | } -result {can't use invalid octal number as operand of "|"} |
---|
| 557 | test mathop-7.34 {interpreted |: errors} -returnCodes error -body { |
---|
| 558 | $op 0 0o8 |
---|
| 559 | } -result {can't use invalid octal number as operand of "|"} |
---|
| 560 | test mathop-7.35 {interpreted |: errors} -returnCodes error -body { |
---|
| 561 | $op 0 [error expectedError] |
---|
| 562 | } -result expectedError |
---|
| 563 | test mathop-7.36 {interpreted |: argument processing order} -body { |
---|
| 564 | list [catch { |
---|
| 565 | $op [set x 0] [incr x] NaN [incr x] [error expected] [incr x] |
---|
| 566 | } msg] $msg $x |
---|
| 567 | } -result {1 expected 2} |
---|
| 568 | test mathop-7.37 {| and bignums} { |
---|
| 569 | list [| $big1 $big2] [$op $big1 $big2] |
---|
| 570 | } {14880960170688977527789098242825693927 14880960170688977527789098242825693927} |
---|
| 571 | test mathop-7.38 {| and bignums} { |
---|
| 572 | list [| $big1 $wide2] [$op $big1 $wide2] |
---|
| 573 | } {12135435435354435435342432749160988407 12135435435354435435342432749160988407} |
---|
| 574 | test mathop-7.39 {| and bignums} { |
---|
| 575 | list [| $big1 $small2] [$op $big1 $small2] |
---|
| 576 | } {12135435435354435435342423948763884533 12135435435354435435342423948763884533} |
---|
| 577 | test mathop-7.40 {| and bignums} { |
---|
| 578 | list [| $wide1 $big2] [$op $wide1 $big2] |
---|
| 579 | } {2746237174783836746262574867174849407 2746237174783836746262574867174849407} |
---|
| 580 | test mathop-7.41 {| and bignums} { |
---|
| 581 | list [| $wide1 $wide2] [$op $wide1 $wide2] |
---|
| 582 | } {87391644647391 87391644647391} |
---|
| 583 | test mathop-7.42 {| and bignums} { |
---|
| 584 | list [| $wide1 $small2] [$op $wide1 $small2] |
---|
| 585 | } {12345678912377 12345678912377} |
---|
| 586 | test mathop-7.43 {| and bignums} { |
---|
| 587 | list [| $small1 $big2] [$op $small1 $big2] |
---|
| 588 | } {2746237174783836746262564892918415159 2746237174783836746262564892918415159} |
---|
| 589 | test mathop-7.44 {| and bignums} { |
---|
| 590 | list [| $small1 $wide2] [$op $small1 $wide2] |
---|
| 591 | } {87321847232503 87321847232503} |
---|
| 592 | test mathop-7.45 {| and bignums} { |
---|
| 593 | list [| $small1 $small2] [$op $small1 $small2] |
---|
| 594 | } {87409 87409} |
---|
| 595 | |
---|
| 596 | test mathop-8.1 {compiled ^} { ^ } 0 |
---|
| 597 | test mathop-8.2 {compiled ^} { ^ 1 } 1 |
---|
| 598 | test mathop-8.3 {compiled ^} { ^ 1 2 } 3 |
---|
| 599 | test mathop-8.4 {compiled ^} { ^ 3 7 6 } 2 |
---|
| 600 | test mathop-8.5 {compiled ^} -returnCodes error -body { |
---|
| 601 | ^ 1.0 2 3 |
---|
| 602 | } -result {can't use floating-point value as operand of "^"} |
---|
| 603 | test mathop-8.6 {compiled ^} -returnCodes error -body { |
---|
| 604 | ^ 1 2 3.0 |
---|
| 605 | } -result {can't use floating-point value as operand of "^"} |
---|
| 606 | test mathop-8.7 {compiled ^} { ^ 100000000002 18 -126 } -100000000110 |
---|
| 607 | test mathop-8.8 {compiled ^} { ^ 0xff 0o377 333333333333 } 333333333333 |
---|
| 608 | test mathop-8.9 {compiled ^} { ^ 1000000000000000000002 18 -126 } -1000000000000000000110 |
---|
| 609 | test mathop-8.10 {compiled ^} { ^ 0xff 0o377 3333333333333333333333 } 3333333333333333333333 |
---|
| 610 | test mathop-8.11 {compiled ^: errors} -returnCodes error -body { |
---|
| 611 | ^ x 0 |
---|
| 612 | } -result {can't use non-numeric string as operand of "^"} |
---|
| 613 | test mathop-8.12 {compiled ^: errors} -returnCodes error -body { |
---|
| 614 | ^ nan 0 |
---|
| 615 | } -result {can't use non-numeric floating-point value as operand of "^"} |
---|
| 616 | test mathop-8.13 {compiled ^: errors} -returnCodes error -body { |
---|
| 617 | ^ 0 x |
---|
| 618 | } -result {can't use non-numeric string as operand of "^"} |
---|
| 619 | test mathop-8.14 {compiled ^: errors} -returnCodes error -body { |
---|
| 620 | ^ 0 nan |
---|
| 621 | } -result {can't use non-numeric floating-point value as operand of "^"} |
---|
| 622 | test mathop-8.15 {compiled ^: errors} -returnCodes error -body { |
---|
| 623 | ^ 0o8 0 |
---|
| 624 | } -result {can't use invalid octal number as operand of "^"} |
---|
| 625 | test mathop-8.16 {compiled ^: errors} -returnCodes error -body { |
---|
| 626 | ^ 0 0o8 |
---|
| 627 | } -result {can't use invalid octal number as operand of "^"} |
---|
| 628 | test mathop-8.17 {compiled ^: errors} -returnCodes error -body { |
---|
| 629 | ^ 0 [error expectedError] |
---|
| 630 | } -result expectedError |
---|
| 631 | test mathop-8.18 {compiled ^: argument processing order} -body { |
---|
| 632 | # Bytecode compilation known hard for 3+ arguments |
---|
| 633 | list [catch { |
---|
| 634 | ^ [set x 0] [incr x] NaN [incr x] [error expected] [incr x] |
---|
| 635 | } msg] $msg $x |
---|
| 636 | } -result {1 expected 2} |
---|
| 637 | set op ^ |
---|
| 638 | test mathop-8.19 {interpreted ^} { $op } 0 |
---|
| 639 | test mathop-8.20 {interpreted ^} { $op 1 } 1 |
---|
| 640 | test mathop-8.21 {interpreted ^} { $op 1 2 } 3 |
---|
| 641 | test mathop-8.22 {interpreted ^} { $op 3 7 6 } 2 |
---|
| 642 | test mathop-8.23 {interpreted ^} -returnCodes error -body { |
---|
| 643 | $op 1.0 2 3 |
---|
| 644 | } -result {can't use floating-point value as operand of "^"} |
---|
| 645 | test mathop-8.24 {interpreted ^} -returnCodes error -body { |
---|
| 646 | $op 1 2 3.0 |
---|
| 647 | } -result {can't use floating-point value as operand of "^"} |
---|
| 648 | test mathop-8.25 {interpreted ^} { $op 100000000002 18 -126 } -100000000110 |
---|
| 649 | test mathop-8.26 {interpreted ^} { $op 0xff 0o377 333333333333 } 333333333333 |
---|
| 650 | test mathop-8.27 {interpreted ^} { $op 1000000000000000000002 18 -126 } -1000000000000000000110 |
---|
| 651 | test mathop-8.28 {interpreted ^} { $op 0xff 0o377 3333333333333333333333 } 3333333333333333333333 |
---|
| 652 | test mathop-8.29 {interpreted ^: errors} -returnCodes error -body { |
---|
| 653 | $op x 0 |
---|
| 654 | } -result {can't use non-numeric string as operand of "^"} |
---|
| 655 | test mathop-8.30 {interpreted ^: errors} -returnCodes error -body { |
---|
| 656 | $op nan 0 |
---|
| 657 | } -result {can't use non-numeric floating-point value as operand of "^"} |
---|
| 658 | test mathop-8.31 {interpreted ^: errors} -returnCodes error -body { |
---|
| 659 | $op 0 x |
---|
| 660 | } -result {can't use non-numeric string as operand of "^"} |
---|
| 661 | test mathop-8.32 {interpreted ^: errors} -returnCodes error -body { |
---|
| 662 | $op 0 nan |
---|
| 663 | } -result {can't use non-numeric floating-point value as operand of "^"} |
---|
| 664 | test mathop-8.33 {interpreted ^: errors} -returnCodes error -body { |
---|
| 665 | $op 0o8 0 |
---|
| 666 | } -result {can't use invalid octal number as operand of "^"} |
---|
| 667 | test mathop-8.34 {interpreted ^: errors} -returnCodes error -body { |
---|
| 668 | $op 0 0o8 |
---|
| 669 | } -result {can't use invalid octal number as operand of "^"} |
---|
| 670 | test mathop-8.35 {interpreted ^: errors} -returnCodes error -body { |
---|
| 671 | $op 0 [error expectedError] |
---|
| 672 | } -result expectedError |
---|
| 673 | test mathop-8.36 {interpreted ^: argument processing order} -body { |
---|
| 674 | list [catch { |
---|
| 675 | $op [set x 0] [incr x] NaN [incr x] [error expected] [incr x] |
---|
| 676 | } msg] $msg $x |
---|
| 677 | } -result {1 expected 2} |
---|
| 678 | test mathop-8.37 {^ and bignums} { |
---|
| 679 | list [^ $big1 $big2] [$op $big1 $big2] |
---|
| 680 | } {14880247731239682873973207643969192131 14880247731239682873973207643969192131} |
---|
| 681 | test mathop-8.38 {^ and bignums} { |
---|
| 682 | list [^ $big1 $wide2] [$op $big1 $wide2] |
---|
| 683 | } {12135435435354435435342354227710876723 12135435435354435435342354227710876723} |
---|
| 684 | test mathop-8.39 {^ and bignums} { |
---|
| 685 | list [^ $big1 $small2] [$op $big1 $small2] |
---|
| 686 | } {12135435435354435435342423948763884437 12135435435354435435342423948763884437} |
---|
| 687 | test mathop-8.40 {^ and bignums} { |
---|
| 688 | list [^ $wide1 $big2] [$op $wide1 $big2] |
---|
| 689 | } {2746237174783836746262572495752458622 2746237174783836746262572495752458622} |
---|
| 690 | test mathop-8.41 {^ and bignums} { |
---|
| 691 | list [^ $wide1 $wide2] [$op $wide1 $wide2] |
---|
| 692 | } {75115763150222 75115763150222} |
---|
| 693 | test mathop-8.42 {^ and bignums} { |
---|
| 694 | list [^ $wide1 $small2] [$op $wide1 $small2] |
---|
| 695 | } {12345678895656 12345678895656} |
---|
| 696 | test mathop-8.43 {^ and bignums} { |
---|
| 697 | list [^ $small1 $big2] [$op $small1 $big2] |
---|
| 698 | } {2746237174783836746262564892918415126 2746237174783836746262564892918415126} |
---|
| 699 | test mathop-8.44 {^ and bignums} { |
---|
| 700 | list [^ $small1 $wide2] [$op $small1 $wide2] |
---|
| 701 | } {87321847145446 87321847145446} |
---|
| 702 | test mathop-8.45 {^ and bignums} { |
---|
| 703 | list [^ $small1 $small2] [$op $small1 $small2] |
---|
| 704 | } {70720 70720} |
---|
| 705 | |
---|
| 706 | # TODO: % ** << >> - / == != < <= > >= ne in ni |
---|
| 707 | |
---|
| 708 | test mathop-13.100 {compiled -: argument processing order} -body { |
---|
| 709 | # Bytecode compilation known hard for 3+ arguments |
---|
| 710 | list [catch { |
---|
| 711 | - [set x 0] [incr x] NaN [incr x] [error expected] [incr x] |
---|
| 712 | } msg] $msg $x |
---|
| 713 | } -result {1 expected 2} |
---|
| 714 | |
---|
| 715 | test mathop-14.100 {compiled /: argument processing order} -body { |
---|
| 716 | # Bytecode compilation known hard for 3+ arguments |
---|
| 717 | list [catch { |
---|
| 718 | / [set x 0] [incr x] NaN [incr x] [error expected] [incr x] |
---|
| 719 | } msg] $msg $x |
---|
| 720 | } -result {1 expected 2} |
---|
| 721 | } |
---|
| 722 | |
---|
| 723 | test mathop-20.1 { zero args, return unit } { |
---|
| 724 | set res {} |
---|
| 725 | foreach op {+ * & ^ | ** < <= > >= == eq} { |
---|
| 726 | lappend res [TestOp $op] |
---|
| 727 | } |
---|
| 728 | set res |
---|
| 729 | } {0 1 -1 0 0 1 1 1 1 1 1 1} |
---|
| 730 | test mathop-20.2 { zero args, not allowed } { |
---|
| 731 | set exp {} |
---|
| 732 | foreach op {~ ! << >> % != ne in ni - /} { |
---|
| 733 | set res [TestOp $op] |
---|
| 734 | if {[string match "wrong # args* NONE" $res]} { |
---|
| 735 | lappend exp 0 |
---|
| 736 | } else { |
---|
| 737 | lappend exp $res |
---|
| 738 | } |
---|
| 739 | } |
---|
| 740 | set exp |
---|
| 741 | } {0 0 0 0 0 0 0 0 0 0 0} |
---|
| 742 | test mathop-20.3 { one arg } { |
---|
| 743 | set res {} |
---|
| 744 | foreach val {7 8.3} { |
---|
| 745 | foreach op {+ ** - * / < <= > >= == eq !} { |
---|
| 746 | lappend res [TestOp $op $val] |
---|
| 747 | } |
---|
| 748 | } |
---|
| 749 | set res |
---|
| 750 | } [list 7 7 -7 7 [expr {1.0/7.0}] 1 1 1 1 1 1 0 \ |
---|
| 751 | 8.3 8.3 -8.3 8.3 [expr {1.0/8.3}] 1 1 1 1 1 1 0] |
---|
| 752 | test mathop-20.4 { one arg, integer only ops } { |
---|
| 753 | set res {} |
---|
| 754 | foreach val {23} { |
---|
| 755 | foreach op {& | ^ ~} { |
---|
| 756 | lappend res [TestOp $op $val] |
---|
| 757 | } |
---|
| 758 | } |
---|
| 759 | set res |
---|
| 760 | } [list 23 23 23 -24] |
---|
| 761 | test mathop-20.5 { one arg, not allowed } { |
---|
| 762 | set exp {} |
---|
| 763 | foreach op {% != ne in ni << >>} { |
---|
| 764 | set res [TestOp $op 1] |
---|
| 765 | if {[string match "wrong # args* NONE" $res]} { |
---|
| 766 | lappend exp 0 |
---|
| 767 | } else { |
---|
| 768 | lappend exp $res |
---|
| 769 | } |
---|
| 770 | } |
---|
| 771 | set exp |
---|
| 772 | } {0 0 0 0 0 0 0} |
---|
| 773 | test mathop-20.6 { one arg, error } { |
---|
| 774 | set res {} |
---|
| 775 | set exp {} |
---|
| 776 | foreach vals {x {1 x} {1 1 x} {1 x 1}} { |
---|
| 777 | # skipping - for now, knownbug... |
---|
| 778 | foreach op {+ * / & | ^ **} { |
---|
| 779 | lappend res [TestOp $op {*}$vals] |
---|
| 780 | lappend exp "can't use non-numeric string as operand of \"$op\" NONE" |
---|
| 781 | } |
---|
| 782 | } |
---|
| 783 | expr {$res eq $exp ? 0 : $res} |
---|
| 784 | } 0 |
---|
| 785 | test mathop-20.7 { multi arg } { |
---|
| 786 | set res {} |
---|
| 787 | foreach vals {{1 2} {3 4 5} {4 3 2 1}} { |
---|
| 788 | foreach op {+ - * /} { |
---|
| 789 | lappend res [TestOp $op {*}$vals] |
---|
| 790 | } |
---|
| 791 | } |
---|
| 792 | set res |
---|
| 793 | } [list 3 -1 2 0 12 -6 60 0 10 -2 24 0] |
---|
| 794 | test mathop-20.8 { multi arg, double } { |
---|
| 795 | set res {} |
---|
| 796 | foreach vals {{1.0 2} {3.0 4 5} {4 3.0 2 1} |
---|
| 797 | {1.0 -1.0 1e-18} {1.0 1.0 1e-18}} { |
---|
| 798 | foreach op {+ - * /} { |
---|
| 799 | lappend res [TestOp $op {*}$vals] |
---|
| 800 | } |
---|
| 801 | } |
---|
| 802 | set res |
---|
| 803 | } [list 3.0 -1.0 2.0 0.5 12.0 -6.0 60.0 0.15 10.0 -2.0 24.0 [expr {2.0/3}] 1e-18 2.0 -1e-18 [expr {-1.0/1e-18}] 2.0 -1e-18 1e-18 [expr {1.0/1e-18}]] |
---|
| 804 | |
---|
| 805 | test mathop-21.1 { unary ops, bitnot } { |
---|
| 806 | set res {} |
---|
| 807 | lappend res [TestOp ~ 7] |
---|
| 808 | lappend res [TestOp ~ -5] |
---|
| 809 | lappend res [TestOp ~ 354657483923456] |
---|
| 810 | lappend res [TestOp ~ 123456789123456789123456789] |
---|
| 811 | set res |
---|
| 812 | } [list -8 4 -354657483923457 -123456789123456789123456790] |
---|
| 813 | test mathop-21.2 { unary ops, logical not } { |
---|
| 814 | set res {} |
---|
| 815 | lappend res [TestOp ! 0] |
---|
| 816 | lappend res [TestOp ! 1] |
---|
| 817 | lappend res [TestOp ! true] |
---|
| 818 | lappend res [TestOp ! false] |
---|
| 819 | lappend res [TestOp ! 37] |
---|
| 820 | lappend res [TestOp ! 8.5] |
---|
| 821 | set res |
---|
| 822 | } [list 1 0 0 1 0 0] |
---|
| 823 | test mathop-21.3 { unary ops, negation } { |
---|
| 824 | set res {} |
---|
| 825 | lappend res [TestOp - 7.2] |
---|
| 826 | lappend res [TestOp - -5] |
---|
| 827 | lappend res [TestOp - -2147483648] ;# -2**31 |
---|
| 828 | lappend res [TestOp - -9223372036854775808] ;# -2**63 |
---|
| 829 | lappend res [TestOp - 354657483923456] ;# wide |
---|
| 830 | lappend res [TestOp - 123456789123456789123456789] ;# big |
---|
| 831 | set res |
---|
| 832 | } [list -7.2 5 2147483648 9223372036854775808 -354657483923456 \ |
---|
| 833 | -123456789123456789123456789] |
---|
| 834 | test mathop-21.4 { unary ops, inversion } { |
---|
| 835 | set res {} |
---|
| 836 | lappend res [TestOp / 1] |
---|
| 837 | lappend res [TestOp / 5] |
---|
| 838 | lappend res [TestOp / 5.6] |
---|
| 839 | lappend res [TestOp / -8] |
---|
| 840 | lappend res [TestOp / 354657483923456] ;# wide |
---|
| 841 | lappend res [TestOp / 123456789123456789123456789] ;# big |
---|
| 842 | set res |
---|
| 843 | } [list 1.0 0.2 0.17857142857142858 -0.125 \ |
---|
| 844 | 2.8196218755553604e-15 8.10000006561e-27] |
---|
| 845 | test mathop-21.5 { unary ops, bad values } { |
---|
| 846 | set res {} |
---|
| 847 | set exp {} |
---|
| 848 | lappend res [TestOp / x] |
---|
| 849 | lappend exp "can't use non-numeric string as operand of \"/\" NONE" |
---|
| 850 | lappend res [TestOp - x] |
---|
| 851 | lappend exp "can't use non-numeric string as operand of \"-\" NONE" |
---|
| 852 | lappend res [TestOp ~ x] |
---|
| 853 | lappend exp "can't use non-numeric string as operand of \"~\" NONE" |
---|
| 854 | lappend res [TestOp ! x] |
---|
| 855 | lappend exp "can't use non-numeric string as operand of \"!\" NONE" |
---|
| 856 | lappend res [TestOp ~ 5.0] |
---|
| 857 | lappend exp "can't use floating-point value as operand of \"~\" NONE" |
---|
| 858 | expr {$res eq $exp ? 0 : $res} |
---|
| 859 | } 0 |
---|
| 860 | test mathop-21.6 { unary ops, too many } { |
---|
| 861 | set exp {} |
---|
| 862 | foreach op {~ !} { |
---|
| 863 | set res [TestOp $op 7 8] |
---|
| 864 | if {[string match "wrong # args* NONE" $res]} { |
---|
| 865 | lappend exp 0 |
---|
| 866 | } else { |
---|
| 867 | lappend exp $res |
---|
| 868 | } |
---|
| 869 | } |
---|
| 870 | set exp |
---|
| 871 | } {0 0} |
---|
| 872 | |
---|
| 873 | test mathop-22.1 { bitwise ops } { |
---|
| 874 | set res {} |
---|
| 875 | foreach vals {5 {1 6} {1 2 3} {1 2 3 4}} { |
---|
| 876 | foreach op {& | ^} { |
---|
| 877 | lappend res [TestOp $op {*}$vals] |
---|
| 878 | } |
---|
| 879 | } |
---|
| 880 | set res |
---|
| 881 | } [list 5 5 5 0 7 7 0 3 0 0 7 4] |
---|
| 882 | test mathop-22.2 { bitwise ops on bignums } { |
---|
| 883 | set dig 50 |
---|
| 884 | set a 0x[string repeat 5 $dig] |
---|
| 885 | set b 0x[string repeat 7 $dig] |
---|
| 886 | set c 0x[string repeat 9 $dig] |
---|
| 887 | set bn [expr {~$b}] |
---|
| 888 | set cn [expr {~$c}] |
---|
| 889 | |
---|
| 890 | set res {} |
---|
| 891 | foreach vals [list [list $a $b] [list $a $c] [list $b $c] \ |
---|
| 892 | [list $a $bn] [list $bn $c] [list $bn $cn]] { |
---|
| 893 | foreach op {& | ^} { |
---|
| 894 | lappend res [TestOp $op {*}$vals] |
---|
| 895 | } |
---|
| 896 | } |
---|
| 897 | set exp {} |
---|
| 898 | foreach d {5 7 2 1 D C 1 F E 0 -D -D 8 -9 -1 -0 -E E} { |
---|
| 899 | if {[string match "-*" $d]} { |
---|
| 900 | set d [format %X [expr 15-0x[string range $d 1 end]]] |
---|
| 901 | set val [expr -0x[string repeat $d $dig]-1] |
---|
| 902 | } else { |
---|
| 903 | set val [expr 0x[string repeat $d $dig]] |
---|
| 904 | } |
---|
| 905 | lappend exp $val |
---|
| 906 | } |
---|
| 907 | expr {$exp eq $res ? 1 : "($res != $exp"} |
---|
| 908 | } 1 |
---|
| 909 | test mathop-22.3 { bitwise ops } { |
---|
| 910 | set big1 12135435435354435435342423948763867876 |
---|
| 911 | set big2 2746237174783836746262564892918327847 |
---|
| 912 | set wide1 12345678912345 |
---|
| 913 | set wide2 87321847232215 |
---|
| 914 | set small1 87345 |
---|
| 915 | set small2 16753 |
---|
| 916 | |
---|
| 917 | set res {} |
---|
| 918 | foreach op {& | ^} { |
---|
| 919 | lappend res [TestOp $op $big1 $big2] |
---|
| 920 | lappend res [TestOp $op $big1 $wide2] |
---|
| 921 | lappend res [TestOp $op $big1 $small2] |
---|
| 922 | lappend res [TestOp $op $wide1 $big2] |
---|
| 923 | lappend res [TestOp $op $wide1 $wide2] |
---|
| 924 | lappend res [TestOp $op $wide1 $small2] |
---|
| 925 | lappend res [TestOp $op $small1 $big2] |
---|
| 926 | lappend res [TestOp $op $small1 $wide2] |
---|
| 927 | lappend res [TestOp $op $small1 $small2] |
---|
| 928 | } |
---|
| 929 | set res |
---|
| 930 | } [list \ |
---|
| 931 | 712439449294653815890598856501796 \ |
---|
| 932 | 78521450111684 \ |
---|
| 933 | 96 \ |
---|
| 934 | 2371422390785 \ |
---|
| 935 | 12275881497169 \ |
---|
| 936 | 16721 \ |
---|
| 937 | 33 \ |
---|
| 938 | 87057 \ |
---|
| 939 | 16689 \ |
---|
| 940 | 14880960170688977527789098242825693927 \ |
---|
| 941 | 12135435435354435435342432749160988407 \ |
---|
| 942 | 12135435435354435435342423948763884533 \ |
---|
| 943 | 2746237174783836746262574867174849407 \ |
---|
| 944 | 87391644647391 \ |
---|
| 945 | 12345678912377 \ |
---|
| 946 | 2746237174783836746262564892918415159 \ |
---|
| 947 | 87321847232503 \ |
---|
| 948 | 87409 \ |
---|
| 949 | 14880247731239682873973207643969192131 \ |
---|
| 950 | 12135435435354435435342354227710876723 \ |
---|
| 951 | 12135435435354435435342423948763884437 \ |
---|
| 952 | 2746237174783836746262572495752458622 \ |
---|
| 953 | 75115763150222 \ |
---|
| 954 | 12345678895656 \ |
---|
| 955 | 2746237174783836746262564892918415126 \ |
---|
| 956 | 87321847145446 \ |
---|
| 957 | 70720 \ |
---|
| 958 | ] |
---|
| 959 | test mathop-22.4 { unary ops, bad values } { |
---|
| 960 | set res {} |
---|
| 961 | set exp {} |
---|
| 962 | foreach op {& | ^} { |
---|
| 963 | lappend res [TestOp $op x 5] |
---|
| 964 | lappend exp "can't use non-numeric string as operand of \"$op\" NONE" |
---|
| 965 | lappend res [TestOp $op 5 x] |
---|
| 966 | lappend exp "can't use non-numeric string as operand of \"$op\" NONE" |
---|
| 967 | } |
---|
| 968 | expr {$res eq $exp ? 0 : $res} |
---|
| 969 | } 0 |
---|
| 970 | |
---|
| 971 | test mathop-23.1 { comparison ops, numerical } { |
---|
| 972 | set res {} |
---|
| 973 | set todo {5 {1 6} {1 2 2 3} {4 3 2 1} {5.0 5.0} {6 3 3 1} {5.0 5}} |
---|
| 974 | lappend todo [list 2342476234762482734623842342 234827463876473 3434] |
---|
| 975 | lappend todo [list 2653 453735910264536 453735910264537 2384762472634982746239847637] |
---|
| 976 | lappend todo [list 2653 2384762472634982746239847637] |
---|
| 977 | lappend todo [list 2653 -2384762472634982746239847637] |
---|
| 978 | lappend todo [list 3789253678212653 -2384762472634982746239847637] |
---|
| 979 | lappend todo [list 5.0 6 7.0 8 1e13 1945628567352654 1.1e20 \ |
---|
| 980 | 6734253647589123456784564378 2.3e50] |
---|
| 981 | set a 7 |
---|
| 982 | lappend todo [list $a $a] ;# Same object |
---|
| 983 | foreach vals $todo { |
---|
| 984 | foreach op {< <= > >= == eq} { |
---|
| 985 | lappend res [TestOp $op {*}$vals] |
---|
| 986 | } |
---|
| 987 | } |
---|
| 988 | set res |
---|
| 989 | } [list 1 1 1 1 1 1 \ |
---|
| 990 | 1 1 0 0 0 0 \ |
---|
| 991 | 0 1 0 0 0 0 \ |
---|
| 992 | 0 0 1 1 0 0 \ |
---|
| 993 | 0 1 0 1 1 1 \ |
---|
| 994 | 0 0 0 1 0 0 \ |
---|
| 995 | 0 1 0 1 1 0 \ |
---|
| 996 | 0 0 1 1 0 0 \ |
---|
| 997 | 1 1 0 0 0 0 \ |
---|
| 998 | 1 1 0 0 0 0 \ |
---|
| 999 | 0 0 1 1 0 0 \ |
---|
| 1000 | 0 0 1 1 0 0 \ |
---|
| 1001 | 1 1 0 0 0 0 \ |
---|
| 1002 | 0 1 0 1 1 1 \ |
---|
| 1003 | ] |
---|
| 1004 | test mathop-23.2 { comparison ops, string } { |
---|
| 1005 | set res {} |
---|
| 1006 | set todo {a {a b} {5 b b c} {d c b a} {xy xy} {gy ef ef ab}} |
---|
| 1007 | set a x |
---|
| 1008 | lappend todo [list $a $a] |
---|
| 1009 | foreach vals $todo { |
---|
| 1010 | foreach op {< <= > >= == eq} { |
---|
| 1011 | lappend res [TestOp $op {*}$vals] |
---|
| 1012 | } |
---|
| 1013 | } |
---|
| 1014 | set res |
---|
| 1015 | } [list 1 1 1 1 1 1 \ |
---|
| 1016 | 1 1 0 0 0 0 \ |
---|
| 1017 | 0 1 0 0 0 0 \ |
---|
| 1018 | 0 0 1 1 0 0 \ |
---|
| 1019 | 0 1 0 1 1 1 \ |
---|
| 1020 | 0 0 0 1 0 0 \ |
---|
| 1021 | 0 1 0 1 1 1 \ |
---|
| 1022 | ] |
---|
| 1023 | test mathop-23.3 { comparison ops, nonequal} { |
---|
| 1024 | set res {} |
---|
| 1025 | foreach vals {{a b} {17.0 0x11} {foo foo} {10 10}} { |
---|
| 1026 | foreach op {!= ne} { |
---|
| 1027 | lappend res [TestOp $op {*}$vals] |
---|
| 1028 | } |
---|
| 1029 | } |
---|
| 1030 | set res |
---|
| 1031 | } [list 1 1 0 1 0 0 0 0 ] |
---|
| 1032 | |
---|
| 1033 | test mathop-24.1 { binary ops } { |
---|
| 1034 | set res {} |
---|
| 1035 | foreach vals {{3 5} {17 7} {199 5} {293234675763434238476239486 17} \ |
---|
| 1036 | {5 1} {0 7}} { |
---|
| 1037 | foreach op {% << >> in ni} { |
---|
| 1038 | lappend res [TestOp $op {*}$vals] |
---|
| 1039 | } |
---|
| 1040 | } |
---|
| 1041 | set res |
---|
| 1042 | } [list 3 96 0 0 1 3 2176 0 0 1 4 6368 6 0 1 \ |
---|
| 1043 | 14 38434855421664852505557661908992 2237203031642412097749 0 1 \ |
---|
| 1044 | 0 10 2 0 1 0 0 0 0 1] |
---|
| 1045 | test mathop-24.2 { binary ops, modulo } { |
---|
| 1046 | # Test different combinations to get all code paths |
---|
| 1047 | set res {} |
---|
| 1048 | |
---|
| 1049 | set bigbig 14372423674564535234543545248972634923869 |
---|
| 1050 | set big 12135435435354435435342423948763867876 |
---|
| 1051 | set wide 12345678912345 |
---|
| 1052 | set negwide -12345678912345 |
---|
| 1053 | set small 5 |
---|
| 1054 | set neg -5 |
---|
| 1055 | |
---|
| 1056 | lappend res [TestOp % $bigbig $big] |
---|
| 1057 | lappend res [TestOp % $wide $big] |
---|
| 1058 | lappend res [TestOp % $negwide $big] |
---|
| 1059 | lappend res [TestOp % $small $big] |
---|
| 1060 | lappend res [TestOp % $neg $big] |
---|
| 1061 | lappend res [TestOp % $small $wide] |
---|
| 1062 | lappend res [TestOp % $neg $wide] |
---|
| 1063 | lappend res [TestOp % $wide $small] |
---|
| 1064 | set res |
---|
| 1065 | } [list 4068119104883679098115293636215358685 \ |
---|
| 1066 | 12345678912345 \ |
---|
| 1067 | 12135435435354435435342411603084955531 \ |
---|
| 1068 | 5 \ |
---|
| 1069 | 12135435435354435435342423948763867871 \ |
---|
| 1070 | 5 \ |
---|
| 1071 | 12345678912340 \ |
---|
| 1072 | 0 \ |
---|
| 1073 | ] |
---|
| 1074 | test mathop-24.3 { binary ops, bad values } { |
---|
| 1075 | set res {} |
---|
| 1076 | set exp {} |
---|
| 1077 | foreach op {% << >>} { |
---|
| 1078 | lappend res [TestOp $op x 1] |
---|
| 1079 | lappend exp "can't use non-numeric string as operand of \"$op\" NONE" |
---|
| 1080 | lappend res [TestOp $op 1 x] |
---|
| 1081 | lappend exp "can't use non-numeric string as operand of \"$op\" NONE" |
---|
| 1082 | } |
---|
| 1083 | foreach op {% << >>} { |
---|
| 1084 | lappend res [TestOp $op 5.0 1] |
---|
| 1085 | lappend exp "can't use floating-point value as operand of \"$op\" NONE" |
---|
| 1086 | lappend res [TestOp $op 1 5.0] |
---|
| 1087 | lappend exp "can't use floating-point value as operand of \"$op\" NONE" |
---|
| 1088 | } |
---|
| 1089 | foreach op {in ni} { |
---|
| 1090 | lappend res [TestOp $op 5 "a b \{ c"] |
---|
| 1091 | lappend exp "unmatched open brace in list NONE" |
---|
| 1092 | } |
---|
| 1093 | lappend res [TestOp % 5 0] |
---|
| 1094 | lappend exp "divide by zero ARITH DIVZERO {divide by zero}" |
---|
| 1095 | lappend res [TestOp % 9838923468297346238478737647637375 0] |
---|
| 1096 | lappend exp "divide by zero ARITH DIVZERO {divide by zero}" |
---|
| 1097 | lappend res [TestOp / 5 0] |
---|
| 1098 | lappend exp "divide by zero ARITH DIVZERO {divide by zero}" |
---|
| 1099 | lappend res [TestOp / 9838923468297346238478737647637375 0] |
---|
| 1100 | lappend exp "divide by zero ARITH DIVZERO {divide by zero}" |
---|
| 1101 | expr {$res eq $exp ? 0 : $res} |
---|
| 1102 | } 0 |
---|
| 1103 | test mathop-24.4 { binary ops, negative shift } { |
---|
| 1104 | set res {} |
---|
| 1105 | |
---|
| 1106 | set big -12135435435354435435342423948763867876 |
---|
| 1107 | set wide -12345678912345 |
---|
| 1108 | set small -1 |
---|
| 1109 | |
---|
| 1110 | lappend res [TestOp << 10 $big] |
---|
| 1111 | lappend res [TestOp << 10 $wide] |
---|
| 1112 | lappend res [TestOp << 10 $small] |
---|
| 1113 | lappend res [TestOp >> 10 $big] |
---|
| 1114 | lappend res [TestOp >> 10 $wide] |
---|
| 1115 | lappend res [TestOp >> 10 $small] |
---|
| 1116 | |
---|
| 1117 | set exp [lrepeat 6 "negative shift argument NONE"] |
---|
| 1118 | expr {$res eq $exp ? 0 : $res} |
---|
| 1119 | } 0 |
---|
| 1120 | test mathop-24.5 { binary ops, large shift } { |
---|
| 1121 | set res {} |
---|
| 1122 | set exp {} |
---|
| 1123 | |
---|
| 1124 | set big 12135435435354435435342423948763867876 |
---|
| 1125 | set wide 12345678912345 |
---|
| 1126 | set small 1 |
---|
| 1127 | |
---|
| 1128 | lappend res [TestOp << 1 2147483648] |
---|
| 1129 | lappend exp "integer value too large to represent NONE" |
---|
| 1130 | lappend res [TestOp << 1 4294967296] |
---|
| 1131 | lappend exp "integer value too large to represent NONE" |
---|
| 1132 | lappend res [TestOp << $small $wide] |
---|
| 1133 | lappend exp "integer value too large to represent NONE" |
---|
| 1134 | lappend res [TestOp << $small $big] |
---|
| 1135 | lappend exp "integer value too large to represent NONE" |
---|
| 1136 | lappend res [TestOp >> $big $wide] |
---|
| 1137 | lappend exp 0 |
---|
| 1138 | lappend res [TestOp >> $big $big] |
---|
| 1139 | lappend exp 0 |
---|
| 1140 | lappend res [TestOp >> $small 70] |
---|
| 1141 | lappend exp 0 |
---|
| 1142 | lappend res [TestOp >> $wide 70] |
---|
| 1143 | lappend exp 0 |
---|
| 1144 | lappend res [TestOp >> -$big $wide] |
---|
| 1145 | lappend exp -1 |
---|
| 1146 | lappend res [TestOp >> -$wide $wide] |
---|
| 1147 | lappend exp -1 |
---|
| 1148 | lappend res [TestOp >> -$small $wide] |
---|
| 1149 | lappend exp -1 |
---|
| 1150 | lappend res [TestOp >> -$small 70] |
---|
| 1151 | lappend exp -1 |
---|
| 1152 | lappend res [TestOp >> -$wide 70] |
---|
| 1153 | lappend exp -1 |
---|
| 1154 | |
---|
| 1155 | expr {$res eq $exp ? 0 : $res} |
---|
| 1156 | } 0 |
---|
| 1157 | test mathop-24.6 { binary ops, shift } { |
---|
| 1158 | # Test different combinations to get all code paths |
---|
| 1159 | set res {} |
---|
| 1160 | |
---|
| 1161 | set bigbig 14372423674564535234543545248972634923869 |
---|
| 1162 | set big 12135435435354435435342423948763867876 |
---|
| 1163 | set wide 12345678912345 |
---|
| 1164 | set negwide -12345678912345 |
---|
| 1165 | set small 5 |
---|
| 1166 | set neg -5 |
---|
| 1167 | |
---|
| 1168 | lappend res [TestOp << $wide $small] |
---|
| 1169 | lappend res [TestOp >> $wide $small] |
---|
| 1170 | set res |
---|
| 1171 | } [list 395061725195040 \ |
---|
| 1172 | 385802466010 \ |
---|
| 1173 | ] |
---|
| 1174 | test mathop-24.7 { binary ops, list search } { |
---|
| 1175 | set res {} |
---|
| 1176 | |
---|
| 1177 | foreach op {in ni} { |
---|
| 1178 | lappend res [TestOp $op 5 {7 5 8}] |
---|
| 1179 | lappend res [TestOp $op hej {foo bar hej}] |
---|
| 1180 | lappend res [TestOp $op 5 {7 0x5 8}] |
---|
| 1181 | } |
---|
| 1182 | set res |
---|
| 1183 | } [list 1 1 0 0 0 1] |
---|
| 1184 | test mathop-24.8 { binary ops, too many } { |
---|
| 1185 | set exp {} |
---|
| 1186 | foreach op {<< >> % != ne in ni ~ !} { |
---|
| 1187 | set res [TestOp $op 7 8 9] |
---|
| 1188 | if {[string match "wrong # args* NONE" $res]} { |
---|
| 1189 | lappend exp 0 |
---|
| 1190 | } else { |
---|
| 1191 | lappend exp $res |
---|
| 1192 | } |
---|
| 1193 | } |
---|
| 1194 | set exp |
---|
| 1195 | } {0 0 0 0 0 0 0 0 0} |
---|
| 1196 | |
---|
| 1197 | test mathop-25.1 { exp operator } {TestOp ** } 1 |
---|
| 1198 | test mathop-25.2 { exp operator } {TestOp ** 0 } 0 |
---|
| 1199 | test mathop-25.3 { exp operator } {TestOp ** 0 5} 0 |
---|
| 1200 | test mathop-25.4 { exp operator } {TestOp ** 7.5 } 7.5 |
---|
| 1201 | test mathop-25.5 { exp operator } {TestOp ** 1 5} 1 |
---|
| 1202 | test mathop-25.6 { exp operator } {TestOp ** 5 1} 5 |
---|
| 1203 | test mathop-25.7 { exp operator } {TestOp ** 4 3 2 1} 262144 |
---|
| 1204 | test mathop-25.8 { exp operator } {TestOp ** 5.5 4} 915.0625 |
---|
| 1205 | test mathop-25.9 { exp operator } {TestOp ** 6 3.5} 529.0897844411664 |
---|
| 1206 | test mathop-25.10 { exp operator } {TestOp ** 3.5 0} 1.0 |
---|
| 1207 | test mathop-25.11 { exp operator } {TestOp ** 378 0} 1 |
---|
| 1208 | test mathop-25.12 { exp operator } {TestOp ** 7.8 1} 7.8 |
---|
| 1209 | test mathop-25.13 { exp operator } {TestOp ** 748 1} 748 |
---|
| 1210 | test mathop-25.14 { exp operator } {TestOp ** 6.3 -1} 0.15873015873015872 |
---|
| 1211 | test mathop-25.15 { exp operator } {TestOp ** 683 -1} 0 |
---|
| 1212 | test mathop-25.16 { exp operator } {TestOp ** 1 -1} 1 |
---|
| 1213 | test mathop-25.17 { exp operator } {TestOp ** -1 -1} -1 |
---|
| 1214 | test mathop-25.18 { exp operator } {TestOp ** -1 -2} 1 |
---|
| 1215 | test mathop-25.19 { exp operator } {TestOp ** -1 3} -1 |
---|
| 1216 | test mathop-25.20 { exp operator } {TestOp ** -1 4} 1 |
---|
| 1217 | test mathop-25.21 { exp operator } {TestOp ** 2 63} 9223372036854775808 |
---|
| 1218 | test mathop-25.22 { exp operator } {TestOp ** 83756485763458746358734658473567847567473 2} 7015148907444467657897585474493757781161998914521537835809623408157343003287605729 |
---|
| 1219 | test mathop-25.23 { exp operator errors } { |
---|
| 1220 | set res {} |
---|
| 1221 | set exp {} |
---|
| 1222 | |
---|
| 1223 | set huge [string repeat 145782 1000] |
---|
| 1224 | set big 12135435435354435435342423948763867876 |
---|
| 1225 | set wide 12345678912345 |
---|
| 1226 | set small 2 |
---|
| 1227 | |
---|
| 1228 | lappend res [TestOp ** 0 -5] |
---|
| 1229 | lappend exp "exponentiation of zero by negative power ARITH DOMAIN {exponentiation of zero by negative power}" |
---|
| 1230 | lappend res [TestOp ** 0.0 -5.0] |
---|
| 1231 | lappend exp "exponentiation of zero by negative power ARITH DOMAIN {exponentiation of zero by negative power}" |
---|
| 1232 | lappend res [TestOp ** $small $wide] |
---|
| 1233 | lappend exp "exponent too large NONE" |
---|
| 1234 | lappend res [TestOp ** 2 $big] |
---|
| 1235 | lappend exp "exponent too large NONE" |
---|
| 1236 | lappend res [TestOp ** $huge 2.1] |
---|
| 1237 | lappend exp "Inf" |
---|
| 1238 | lappend res [TestOp ** 2 foo] |
---|
| 1239 | lappend exp "can't use non-numeric string as operand of \"**\" NONE" |
---|
| 1240 | lappend res [TestOp ** foo 2] |
---|
| 1241 | lappend exp "can't use non-numeric string as operand of \"**\" NONE" |
---|
| 1242 | |
---|
| 1243 | expr {$res eq $exp ? 0 : $res} |
---|
| 1244 | } 0 |
---|
| 1245 | |
---|
| 1246 | test mathop-26.1 { misc ops, size combinations } { |
---|
| 1247 | set big1 12135435435354435435342423948763867876 |
---|
| 1248 | set big2 2746237174783836746262564892918327847 |
---|
| 1249 | set wide1 87321847232215 |
---|
| 1250 | set wide2 12345678912345 |
---|
| 1251 | set small1 87345 |
---|
| 1252 | set small2 16753 |
---|
| 1253 | |
---|
| 1254 | set res {} |
---|
| 1255 | foreach op {+ * - /} { |
---|
| 1256 | lappend res [TestOp $op $big1 $big2] |
---|
| 1257 | lappend res [TestOp $op $big1 $wide2] |
---|
| 1258 | lappend res [TestOp $op $big1 $small2] |
---|
| 1259 | lappend res [TestOp $op $wide1 $big2] |
---|
| 1260 | lappend res [TestOp $op $wide1 $wide2] |
---|
| 1261 | lappend res [TestOp $op $wide1 $small2] |
---|
| 1262 | lappend res [TestOp $op $small1 $big2] |
---|
| 1263 | lappend res [TestOp $op $small1 $wide2] |
---|
| 1264 | lappend res [TestOp $op $small1 $small2] |
---|
| 1265 | } |
---|
| 1266 | set res |
---|
| 1267 | } [list \ |
---|
| 1268 | 14881672610138272181604988841682195723 \ |
---|
| 1269 | 12135435435354435435342436294442780221 \ |
---|
| 1270 | 12135435435354435435342423948763884629 \ |
---|
| 1271 | 2746237174783836746262652214765560062 \ |
---|
| 1272 | 99667526144560 \ |
---|
| 1273 | 87321847248968 \ |
---|
| 1274 | 2746237174783836746262564892918415192 \ |
---|
| 1275 | 12345678999690 \ |
---|
| 1276 | 104098 \ |
---|
| 1277 | 33326783924759424684447891401270222910405366244661685890993770489959542972 \ |
---|
| 1278 | 149820189346379518024969783068410988366610965329220 \ |
---|
| 1279 | 203304949848492856848291628413641078526628 \ |
---|
| 1280 | 239806503039903915972546163440347114360602909991105 \ |
---|
| 1281 | 1078047487961768329845194175 \ |
---|
| 1282 | 1462902906681297895 \ |
---|
| 1283 | 239870086031494220602303730571951345796215 \ |
---|
| 1284 | 1078333324598774025 \ |
---|
| 1285 | 1463290785 \ |
---|
| 1286 | 9389198260570598689079859055845540029 \ |
---|
| 1287 | 12135435435354435435342411603084955531 \ |
---|
| 1288 | 12135435435354435435342423948763851123 \ |
---|
| 1289 | -2746237174783836746262477571071095632 \ |
---|
| 1290 | 74976168319870 \ |
---|
| 1291 | 87321847215462 \ |
---|
| 1292 | -2746237174783836746262564892918240502 \ |
---|
| 1293 | -12345678825000 \ |
---|
| 1294 | 70592 \ |
---|
| 1295 | 4 \ |
---|
| 1296 | 982970278225822587257201 \ |
---|
| 1297 | 724373869477373332259441529801460 \ |
---|
| 1298 | 0 \ |
---|
| 1299 | 7 \ |
---|
| 1300 | 5212311062 \ |
---|
| 1301 | 0 \ |
---|
| 1302 | 0 \ |
---|
| 1303 | 5 \ |
---|
| 1304 | ] |
---|
| 1305 | test mathop-26.2 { misc ops, corner cases } { |
---|
| 1306 | set res {} |
---|
| 1307 | lappend res [TestOp - 0 -2147483648] ;# -2**31 |
---|
| 1308 | lappend res [TestOp - 0 -9223372036854775808] ;# -2**63 |
---|
| 1309 | lappend res [TestOp / -9223372036854775808 -1] |
---|
| 1310 | lappend res [TestOp * 2147483648 2] |
---|
| 1311 | lappend res [TestOp * 9223372036854775808 2] |
---|
| 1312 | set res |
---|
| 1313 | } [list 2147483648 9223372036854775808 9223372036854775808 4294967296 18446744073709551616] |
---|
| 1314 | |
---|
| 1315 | if 0 { |
---|
| 1316 | # Compare ops to expr bytecodes |
---|
| 1317 | namespace import ::tcl::mathop::* |
---|
| 1318 | proc _X {a b c} { |
---|
| 1319 | set x [+ $a [- $b $c]] |
---|
| 1320 | set y [expr {$a + ($b - $c)}] |
---|
| 1321 | set z [< $a $b $c] |
---|
| 1322 | } |
---|
| 1323 | set ::tcl_traceCompile 2 |
---|
| 1324 | _X 3 4 5 |
---|
| 1325 | set ::tcl_traceCompile 0 |
---|
| 1326 | } |
---|
| 1327 | |
---|
| 1328 | # cleanup |
---|
| 1329 | namespace delete ::testmathop |
---|
| 1330 | namespace delete ::testmathop2 |
---|
| 1331 | ::tcltest::cleanupTests |
---|
| 1332 | return |
---|
| 1333 | |
---|
| 1334 | # Local Variables: |
---|
| 1335 | # mode: tcl |
---|
| 1336 | # End: |
---|