diff options
author | mdejong <mdejong> | 2005-07-09 00:27:25 (GMT) |
---|---|---|
committer | mdejong <mdejong> | 2005-07-09 00:27:25 (GMT) |
commit | eef683116916bd916b5d804a98110b9e7139dcc2 (patch) | |
tree | acabb9156822cf78785eb37708fce262e826f50d /tests/expr.test | |
parent | 199c02aeae93a951a592d2c5f1a9b336a891cc21 (diff) | |
download | tcl-eef683116916bd916b5d804a98110b9e7139dcc2.zip tcl-eef683116916bd916b5d804a98110b9e7139dcc2.tar.gz tcl-eef683116916bd916b5d804a98110b9e7139dcc2.tar.bz2 |
* generic/tclExecute.c (TclExecuteByteCode):
Reimplement long and wide type integer division
and modulus operations so that the smallest
and largest integer values are handled properly.
The divide operation is more efficient since
it no longer does a modulus or negation and
only checks for a remainder when the quotient
will be a negative number. The modulus operation
is now a bit more complex because of a number of
special cases dealing with the smallest and
largest integers.
* tests/expr.test: Add test cases for division
and modulus operations on the smallest and
largest integer values for 32 and 64 bit types.
[Patch 1230205]
Diffstat (limited to 'tests/expr.test')
-rw-r--r-- | tests/expr.test | 970 |
1 files changed, 969 insertions, 1 deletions
diff --git a/tests/expr.test b/tests/expr.test index a7ea152..781eb8e 100644 --- a/tests/expr.test +++ b/tests/expr.test @@ -10,7 +10,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# RCS: @(#) $Id: expr.test,v 1.34 2005/06/29 03:29:02 mdejong Exp $ +# RCS: @(#) $Id: expr.test,v 1.35 2005/07/09 00:27:33 mdejong Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest 2.1 @@ -5495,10 +5495,978 @@ test expr-33.4 {parse smallest wide value} {wideis64bit} { } {-9223372036854775808 -9223372036854775808 -9223372036854775808 -9223372036854775808 1 1} +set min -2147483648 +set max 2147483647 + +test expr-34.1 {expr edge cases} {longis32bit} { + expr {$min / $min} +} {1} + +test expr-34.2 {expr edge cases} {longis32bit} { + expr {$min % $min} +} {0} + +test expr-34.3 {expr edge cases} {longis32bit} { + expr {$min / ($min + 1)} +} {1} + +test expr-34.4 {expr edge cases} {longis32bit} { + expr {$min % ($min + 1)} +} {-1} + +test expr-34.5 {expr edge cases} {longis32bit} { + expr {$min / ($min + 2)} +} {1} + +test expr-34.6 {expr edge cases} {longis32bit} { + expr {$min % ($min + 2)} +} {-2} + +test expr-34.7 {expr edge cases} {longis32bit} { + expr {$min / ($min + 3)} +} {1} + +test expr-34.8 {expr edge cases} {longis32bit} { + expr {$min % ($min + 3)} +} {-3} + +test expr-34.9 {expr edge cases} {longis32bit} { + expr {$min / -3} +} {715827882} + +test expr-34.10 {expr edge cases} {longis32bit} { + expr {$min % -3} +} {-2} + +test expr-34.11 {expr edge cases} {longis32bit} { + expr {$min / -2} +} {1073741824} + +test expr-34.12 {expr edge cases} {longis32bit} { + expr {$min % -2} +} {0} + +test expr-34.13 {expr edge cases} {longis32bit} { + expr {$min / -1} +} {-2147483648} + +test expr-34.14 {expr edge cases} {longis32bit} { + expr {$min % -1} +} {0} + +test expr-34.15 {expr edge cases} {longis32bit} { + expr {$min * -1} +} $min + +test expr-34.16 {expr edge cases} {longis32bit} { + expr {-$min} +} $min + +test expr-34.17 {expr edge cases} {longis32bit} { + expr {$min / 1} +} $min + +test expr-34.18 {expr edge cases} {longis32bit} { + expr {$min % 1} +} {0} + +test expr-34.19 {expr edge cases} {longis32bit} { + expr {$min / 2} +} {-1073741824} + +test expr-34.20 {expr edge cases} {longis32bit} { + expr {$min % 2} +} {0} + +test expr-34.21 {expr edge cases} {longis32bit} { + expr {$min / 3} +} {-715827883} + +test expr-34.22 {expr edge cases} {longis32bit} { + expr {$min % 3} +} {1} + +test expr-34.23 {expr edge cases} {longis32bit} { + expr {$min / ($max - 3)} +} {-2} + +test expr-34.24 {expr edge cases} {longis32bit} { + expr {$min % ($max - 3)} +} {2147483640} + +test expr-34.25 {expr edge cases} {longis32bit} { + expr {$min / ($max - 2)} +} {-2} + +test expr-34.26 {expr edge cases} {longis32bit} { + expr {$min % ($max - 2)} +} {2147483642} + +test expr-34.27 {expr edge cases} {longis32bit} { + expr {$min / ($max - 1)} +} {-2} + +test expr-34.28 {expr edge cases} {longis32bit} { + expr {$min % ($max - 1)} +} {2147483644} + +test expr-34.29 {expr edge cases} {longis32bit} { + expr {$min / $max} +} {-2} + +test expr-34.30 {expr edge cases} {longis32bit} { + expr {$min % $max} +} {2147483646} + +test expr-34.31 {expr edge cases} {longis32bit} { + expr {$max / $max} +} {1} + +test expr-34.32 {expr edge cases} {longis32bit} { + expr {$max % $max} +} {0} + +test expr-34.33 {expr edge cases} {longis32bit} { + expr {$max / ($max - 1)} +} {1} + +test expr-34.34 {expr edge cases} {longis32bit} { + expr {$max % ($max - 1)} +} {1} + +test expr-34.35 {expr edge cases} {longis32bit} { + expr {$max / ($max - 2)} +} {1} + +test expr-34.36 {expr edge cases} {longis32bit} { + expr {$max % ($max - 2)} +} {2} + +test expr-34.37 {expr edge cases} {longis32bit} { + expr {$max / ($max - 3)} +} {1} + +test expr-34.38 {expr edge cases} {longis32bit} { + expr {$max % ($max - 3)} +} {3} + +test expr-34.39 {expr edge cases} {longis32bit} { + expr {$max / 3} +} {715827882} + +test expr-34.40 {expr edge cases} {longis32bit} { + expr {$max % 3} +} {1} + +test expr-34.41 {expr edge cases} {longis32bit} { + expr {$max / 2} +} {1073741823} + +test expr-34.42 {expr edge cases} {longis32bit} { + expr {$max % 2} +} {1} + +test expr-34.43 {expr edge cases} {longis32bit} { + expr {$max / 1} +} $max + +test expr-34.44 {expr edge cases} {longis32bit} { + expr {$max % 1} +} {0} + +test expr-34.45 {expr edge cases} {longis32bit} { + expr {$max / -1} +} "-$max" + +test expr-34.46 {expr edge cases} {longis32bit} { + expr {$max % -1} +} {0} + +test expr-34.47 {expr edge cases} {longis32bit} { + expr {$max / -2} +} {-1073741824} + +test expr-34.48 {expr edge cases} {longis32bit} { + expr {$max % -2} +} {-1} + +test expr-34.49 {expr edge cases} {longis32bit} { + expr {$max / -3} +} {-715827883} + +test expr-34.50 {expr edge cases} {longis32bit} { + expr {$max % -3} +} {-2} + +test expr-34.51 {expr edge cases} {longis32bit} { + expr {$max / ($min + 3)} +} {-2} + +test expr-34.52 {expr edge cases} {longis32bit} { + expr {$max % ($min + 3)} +} {-2147483643} + +test expr-34.53 {expr edge cases} {longis32bit} { + expr {$max / ($min + 2)} +} {-2} + +test expr-34.54 {expr edge cases} {longis32bit} { + expr {$max % ($min + 2)} +} {-2147483645} + +test expr-34.55 {expr edge cases} {longis32bit} { + expr {$max / ($min + 1)} +} {-1} + +test expr-34.56 {expr edge cases} {longis32bit} { + expr {$max % ($min + 1)} +} {0} + +test expr-34.57 {expr edge cases} {longis32bit} { + expr {$max / $min} +} {-1} + +test expr-34.58 {expr edge cases} {longis32bit} { + expr {$max % $min} +} {-1} + +test expr-34.59 {expr edge cases} {longis32bit} { + expr {($min + 1) / ($max - 1)} +} {-2} + +test expr-34.60 {expr edge cases} {longis32bit} { + expr {($min + 1) % ($max - 1)} +} {2147483645} + +test expr-34.61 {expr edge cases} {longis32bit} { + expr {($max - 1) / ($min + 1)} +} {-1} + +test expr-34.62 {expr edge cases} {longis32bit} { + expr {($max - 1) % ($min + 1)} +} {-1} + +test expr-34.63 {expr edge cases} {longis32bit} { + expr {($max - 1) / $min} +} {-1} + +test expr-34.64 {expr edge cases} {longis32bit} { + expr {($max - 1) % $min} +} {-2} + +test expr-34.65 {expr edge cases} {longis32bit} { + expr {($max - 2) / $min} +} {-1} + +test expr-34.66 {expr edge cases} {longis32bit} { + expr {($max - 2) % $min} +} {-3} + +test expr-34.67 {expr edge cases} {longis32bit} { + expr {($max - 3) / $min} +} {-1} + +test expr-34.68 {expr edge cases} {longis32bit} { + expr {($max - 3) % $min} +} {-4} + +test expr-34.69 {expr edge cases} {longis32bit} { + expr {-3 / $min} +} {0} + +test expr-34.70 {expr edge cases} {longis32bit} { + expr {-3 % $min} +} {-3} + +test expr-34.71 {expr edge cases} {longis32bit} { + expr {-2 / $min} +} {0} + +test expr-34.72 {expr edge cases} {longis32bit} { + expr {-2 % $min} +} {-2} + +test expr-34.73 {expr edge cases} {longis32bit} { + expr {-1 / $min} +} {0} + +test expr-34.74 {expr edge cases} {longis32bit} { + expr {-1 % $min} +} {-1} + +test expr-34.75 {expr edge cases} {longis32bit} { + expr {0 / $min} +} {0} + +test expr-34.76 {expr edge cases} {longis32bit} { + expr {0 % $min} +} {0} + +test expr-34.77 {expr edge cases} {longis32bit} { + expr {0 / ($min + 1)} +} {0} + +test expr-34.78 {expr edge cases} {longis32bit} { + expr {0 % ($min + 1)} +} {0} + +test expr-34.79 {expr edge cases} {longis32bit} { + expr {1 / $min} +} {-1} + +test expr-34.80 {expr edge cases} {longis32bit} { + expr {1 % $min} +} {-2147483647} + +test expr-34.81 {expr edge cases} {longis32bit} { + expr {1 / ($min + 1)} +} {-1} + +test expr-34.82 {expr edge cases} {longis32bit} { + expr {1 % ($min + 1)} +} {-2147483646} + +test expr-34.83 {expr edge cases} {longis32bit} { + expr {2 / $min} +} {-1} + +test expr-34.84 {expr edge cases} {longis32bit} { + expr {2 % $min} +} {-2147483646} + +test expr-34.85 {expr edge cases} {longis32bit} { + expr {2 / ($min + 1)} +} {-1} + +test expr-34.86 {expr edge cases} {longis32bit} { + expr {2 % ($min + 1)} +} {-2147483645} + +test expr-34.87 {expr edge cases} {longis32bit} { + expr {3 / $min} +} {-1} + +test expr-34.88 {expr edge cases} {longis32bit} { + expr {3 % $min} +} {-2147483645} + +test expr-34.89 {expr edge cases} {longis32bit} { + expr {3 / ($min + 1)} +} {-1} + +test expr-34.90 {expr edge cases} {longis32bit} { + expr {3 % ($min + 1)} +} {-2147483644} + +# Euclidean property: +# quotient * divisor + remainder = dividend + +test expr-35.1 {expr edge cases} {longis32bit} { + set dividend $max + set divisor 2 + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($divisor * $q) + $r}] +} {1073741823 * 2 + 1 = 2147483647} + +test expr-35.2 {expr edge cases} {longis32bit} { + set dividend [expr {$max - 1}] + set divisor 2 + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {1073741823 * 2 + 0 = 2147483646} + +test expr-35.3 {expr edge cases} {longis32bit} { + set dividend [expr {$max - 2}] + set divisor 2 + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {1073741822 * 2 + 1 = 2147483645} + +test expr-35.4 {expr edge cases} {longis32bit} { + set dividend $max + set divisor 3 + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {715827882 * 3 + 1 = 2147483647} + +test expr-35.5 {expr edge cases} {longis32bit} { + set dividend [expr {$max - 1}] + set divisor 3 + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {715827882 * 3 + 0 = 2147483646} + +test expr-35.6 {expr edge cases} {longis32bit} { + set dividend [expr {$max - 2}] + set divisor 3 + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {715827881 * 3 + 2 = 2147483645} + +test expr-35.7 {expr edge cases} {longis32bit} { + set dividend $min + set divisor 2 + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {-1073741824 * 2 + 0 = -2147483648} + +test expr-35.8 {expr edge cases} {longis32bit} { + set dividend [expr {$min + 1}] + set divisor 2 + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {-1073741824 * 2 + 1 = -2147483647} + +test expr-35.9 {expr edge cases} {longis32bit} { + set dividend [expr {$min + 2}] + set divisor 2 + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {-1073741823 * 2 + 0 = -2147483646} + +test expr-35.10 {expr edge cases} {longis32bit} { + # Two things could happen here. The multiplication + # could overflow a 32 bit type, so that when + # 1 is added it overflows again back to min. + # The multiplication could also use a wide type + # to hold ($min - 1) until 1 is added and + # the number becomes $min again. + set dividend $min + set divisor 3 + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {-715827883 * 3 + 1 = -2147483648} + +test expr-35.11 {expr edge cases} {longis32bit} { + set dividend $min + set divisor -3 + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {715827882 * -3 + -2 = -2147483648} + +test expr-35.12 {expr edge cases} {longis32bit} { + set dividend $min + set divisor $min + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {1 * -2147483648 + 0 = -2147483648} + +test expr-35.13 {expr edge cases} {longis32bit} { + set dividend $min + set divisor [expr {$min + 1}] + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {1 * -2147483647 + -1 = -2147483648} + +test expr-35.14 {expr edge cases} {longis32bit} { + set dividend $min + set divisor [expr {$min + 2}] + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {1 * -2147483646 + -2 = -2147483648} + +# 64bit wide integer checks + +set min -9223372036854775808 +set max 9223372036854775807 + +test expr-36.1 {expr edge cases} {wideis64bit} { + expr {$min / $min} +} {1} + +test expr-36.2 {expr edge cases} {wideis64bit} { + expr {$min % $min} +} {0} + +test expr-36.3 {expr edge cases} {wideis64bit} { + expr {$min / ($min + 1)} +} {1} + +test expr-36.4 {expr edge cases} {wideis64bit} { + expr {$min % ($min + 1)} +} {-1} + +test expr-36.5 {expr edge cases} {wideis64bit} { + expr {$min / ($min + 2)} +} {1} + +test expr-36.6 {expr edge cases} {wideis64bit} { + expr {$min % ($min + 2)} +} {-2} + +test expr-36.7 {expr edge cases} {wideis64bit} { + expr {$min / ($min + 3)} +} {1} + +test expr-36.8 {expr edge cases} {wideis64bit} { + expr {$min % ($min + 3)} +} {-3} + +test expr-36.9 {expr edge cases} {wideis64bit} { + expr {$min / -3} +} {3074457345618258602} + +test expr-36.10 {expr edge cases} {wideis64bit} { + expr {$min % -3} +} {-2} + +test expr-36.11 {expr edge cases} {wideis64bit} { + expr {$min / -2} +} {4611686018427387904} + +test expr-36.12 {expr edge cases} {wideis64bit} { + expr {$min % -2} +} {0} + +test expr-36.13 {expr edge cases} {wideis64bit} { + expr {$min / -1} +} $min + +test expr-36.14 {expr edge cases} {wideis64bit} { + expr {$min % -1} +} {0} + +test expr-36.15 {expr edge cases} {wideis64bit} { + expr {$min * -1} +} $min + +test expr-36.16 {expr edge cases} {wideis64bit} { + expr {-$min} +} $min + +test expr-36.17 {expr edge cases} {wideis64bit} { + expr {$min / 1} +} $min + +test expr-36.18 {expr edge cases} {wideis64bit} { + expr {$min % 1} +} {0} + +test expr-36.19 {expr edge cases} {wideis64bit} { + expr {$min / 2} +} {-4611686018427387904} + +test expr-36.20 {expr edge cases} {wideis64bit} { + expr {$min % 2} +} {0} + +test expr-36.21 {expr edge cases} {wideis64bit} { + expr {$min / 3} +} {-3074457345618258603} + +test expr-36.22 {expr edge cases} {wideis64bit} { + expr {$min % 3} +} {1} + +test expr-36.23 {expr edge cases} {wideis64bit} { + expr {$min / ($max - 3)} +} {-2} + +test expr-36.24 {expr edge cases} {wideis64bit} { + expr {$min % ($max - 3)} +} {9223372036854775800} + +test expr-36.25 {expr edge cases} {wideis64bit} { + expr {$min / ($max - 2)} +} {-2} + +test expr-36.26 {expr edge cases} {wideis64bit} { + expr {$min % ($max - 2)} +} {9223372036854775802} + +test expr-36.27 {expr edge cases} {wideis64bit} { + expr {$min / ($max - 1)} +} {-2} + +test expr-36.28 {expr edge cases} {wideis64bit} { + expr {$min % ($max - 1)} +} {9223372036854775804} + +test expr-36.29 {expr edge cases} {wideis64bit} { + expr {$min / $max} +} {-2} + +test expr-36.30 {expr edge cases} {wideis64bit} { + expr {$min % $max} +} {9223372036854775806} + +test expr-36.31 {expr edge cases} {wideis64bit} { + expr {$max / $max} +} {1} + +test expr-36.32 {expr edge cases} {wideis64bit} { + expr {$max % $max} +} {0} + +test expr-36.33 {expr edge cases} {wideis64bit} { + expr {$max / ($max - 1)} +} {1} + +test expr-36.34 {expr edge cases} {wideis64bit} { + expr {$max % ($max - 1)} +} {1} + +test expr-36.35 {expr edge cases} {wideis64bit} { + expr {$max / ($max - 2)} +} {1} + +test expr-36.36 {expr edge cases} {wideis64bit} { + expr {$max % ($max - 2)} +} {2} + +test expr-36.37 {expr edge cases} {wideis64bit} { + expr {$max / ($max - 3)} +} {1} + +test expr-36.38 {expr edge cases} {wideis64bit} { + expr {$max % ($max - 3)} +} {3} + +test expr-36.39 {expr edge cases} {wideis64bit} { + expr {$max / 3} +} {3074457345618258602} + +test expr-36.40 {expr edge cases} {wideis64bit} { + expr {$max % 3} +} {1} + +test expr-36.41 {expr edge cases} {wideis64bit} { + expr {$max / 2} +} {4611686018427387903} + +test expr-36.42 {expr edge cases} {wideis64bit} { + expr {$max % 2} +} {1} + +test expr-36.43 {expr edge cases} {wideis64bit} { + expr {$max / 1} +} $max + +test expr-36.44 {expr edge cases} {wideis64bit} { + expr {$max % 1} +} {0} + +test expr-36.45 {expr edge cases} {wideis64bit} { + expr {$max / -1} +} "-$max" + +test expr-36.46 {expr edge cases} {wideis64bit} { + expr {$max % -1} +} {0} + +test expr-36.47 {expr edge cases} {wideis64bit} { + expr {$max / -2} +} {-4611686018427387904} + +test expr-36.48 {expr edge cases} {wideis64bit} { + expr {$max % -2} +} {-1} + +test expr-36.49 {expr edge cases} {wideis64bit} { + expr {$max / -3} +} {-3074457345618258603} + +test expr-36.50 {expr edge cases} {wideis64bit} { + expr {$max % -3} +} {-2} + +test expr-36.51 {expr edge cases} {wideis64bit} { + expr {$max / ($min + 3)} +} {-2} + +test expr-36.52 {expr edge cases} {wideis64bit} { + expr {$max % ($min + 3)} +} {-9223372036854775803} + +test expr-36.53 {expr edge cases} {wideis64bit} { + expr {$max / ($min + 2)} +} {-2} + +test expr-36.54 {expr edge cases} {wideis64bit} { + expr {$max % ($min + 2)} +} {-9223372036854775805} + +test expr-36.55 {expr edge cases} {wideis64bit} { + expr {$max / ($min + 1)} +} {-1} + +test expr-36.56 {expr edge cases} {wideis64bit} { + expr {$max % ($min + 1)} +} {0} + +test expr-36.57 {expr edge cases} {wideis64bit} { + expr {$max / $min} +} {-1} + +test expr-36.58 {expr edge cases} {wideis64bit} { + expr {$max % $min} +} {-1} + +test expr-36.59 {expr edge cases} {wideis64bit} { + expr {($min + 1) / ($max - 1)} +} {-2} + +test expr-36.60 {expr edge cases} {wideis64bit} { + expr {($min + 1) % ($max - 1)} +} {9223372036854775805} + +test expr-36.61 {expr edge cases} {wideis64bit} { + expr {($max - 1) / ($min + 1)} +} {-1} + +test expr-36.62 {expr edge cases} {wideis64bit} { + expr {($max - 1) % ($min + 1)} +} {-1} + +test expr-36.63 {expr edge cases} {wideis64bit} { + expr {($max - 1) / $min} +} {-1} + +test expr-36.64 {expr edge cases} {wideis64bit} { + expr {($max - 1) % $min} +} {-2} + +test expr-36.65 {expr edge cases} {wideis64bit} { + expr {($max - 2) / $min} +} {-1} + +test expr-36.66 {expr edge cases} {wideis64bit} { + expr {($max - 2) % $min} +} {-3} + +test expr-36.67 {expr edge cases} {wideis64bit} { + expr {($max - 3) / $min} +} {-1} + +test expr-36.68 {expr edge cases} {wideis64bit} { + expr {($max - 3) % $min} +} {-4} + +test expr-36.69 {expr edge cases} {wideis64bit} { + expr {-3 / $min} +} {0} + +test expr-36.70 {expr edge cases} {wideis64bit} { + expr {-3 % $min} +} {-3} + +test expr-36.71 {expr edge cases} {wideis64bit} { + expr {-2 / $min} +} {0} + +test expr-36.72 {expr edge cases} {wideis64bit} { + expr {-2 % $min} +} {-2} + +test expr-36.73 {expr edge cases} {wideis64bit} { + expr {-1 / $min} +} {0} + +test expr-36.74 {expr edge cases} {wideis64bit} { + expr {-1 % $min} +} {-1} + +test expr-36.75 {expr edge cases} {wideis64bit} { + expr {0 / $min} +} {0} + +test expr-36.76 {expr edge cases} {wideis64bit} { + expr {0 % $min} +} {0} + +test expr-36.77 {expr edge cases} {wideis64bit} { + expr {0 / ($min + 1)} +} {0} + +test expr-36.78 {expr edge cases} {wideis64bit} { + expr {0 % ($min + 1)} +} {0} + +test expr-36.79 {expr edge cases} {wideis64bit} { + expr {1 / $min} +} {-1} + +test expr-36.80 {expr edge cases} {wideis64bit} { + expr {1 % $min} +} {-9223372036854775807} + +test expr-36.81 {expr edge cases} {wideis64bit} { + expr {1 / ($min + 1)} +} {-1} + +test expr-36.82 {expr edge cases} {wideis64bit} { + expr {1 % ($min + 1)} +} {-9223372036854775806} + +test expr-36.83 {expr edge cases} {wideis64bit} { + expr {2 / $min} +} {-1} + +test expr-36.84 {expr edge cases} {wideis64bit} { + expr {2 % $min} +} {-9223372036854775806} + +test expr-36.85 {expr edge cases} {wideis64bit} { + expr {2 / ($min + 1)} +} {-1} + +test expr-36.86 {expr edge cases} {wideis64bit} { + expr {2 % ($min + 1)} +} {-9223372036854775805} + +test expr-36.87 {expr edge cases} {wideis64bit} { + expr {3 / $min} +} {-1} + +test expr-36.88 {expr edge cases} {wideis64bit} { + expr {3 % $min} +} {-9223372036854775805} + +test expr-36.89 {expr edge cases} {wideis64bit} { + expr {3 / ($min + 1)} +} {-1} + +test expr-36.90 {expr edge cases} {wideis64bit} { + expr {3 % ($min + 1)} +} {-9223372036854775804} + + +test expr-37.1 {expr edge cases} {wideis64bit} { + set dividend $max + set divisor 2 + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($divisor * $q) + $r}] +} {4611686018427387903 * 2 + 1 = 9223372036854775807} + +test expr-37.2 {expr edge cases} {wideis64bit} { + set dividend [expr {$max - 1}] + set divisor 2 + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {4611686018427387903 * 2 + 0 = 9223372036854775806} + +test expr-37.3 {expr edge cases} {wideis64bit} { + set dividend [expr {$max - 2}] + set divisor 2 + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {4611686018427387902 * 2 + 1 = 9223372036854775805} + +test expr-37.4 {expr edge cases} {wideis64bit} { + set dividend $max + set divisor 3 + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {3074457345618258602 * 3 + 1 = 9223372036854775807} + +test expr-37.5 {expr edge cases} {wideis64bit} { + set dividend [expr {$max - 1}] + set divisor 3 + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {3074457345618258602 * 3 + 0 = 9223372036854775806} + +test expr-37.6 {expr edge cases} {wideis64bit} { + set dividend [expr {$max - 2}] + set divisor 3 + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {3074457345618258601 * 3 + 2 = 9223372036854775805} + +test expr-37.7 {expr edge cases} {wideis64bit} { + set dividend $min + set divisor 2 + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {-4611686018427387904 * 2 + 0 = -9223372036854775808} + +test expr-37.8 {expr edge cases} {wideis64bit} { + set dividend [expr {$min + 1}] + set divisor 2 + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {-4611686018427387904 * 2 + 1 = -9223372036854775807} + +test expr-37.9 {expr edge cases} {wideis64bit} { + set dividend [expr {$min + 2}] + set divisor 2 + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {-4611686018427387903 * 2 + 0 = -9223372036854775806} + +test expr-37.10 {expr edge cases} {wideis64bit} { + # Multiplication overflows 64 bit type here, + # so when the 1 is added it overflows + # again and we end up back at min. + set dividend $min + set divisor 3 + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {-3074457345618258603 * 3 + 1 = -9223372036854775808} + +test expr-37.11 {expr edge cases} {wideis64bit} { + set dividend $min + set divisor -3 + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {3074457345618258602 * -3 + -2 = -9223372036854775808} + +test expr-37.12 {expr edge cases} {wideis64bit} { + set dividend $min + set divisor $min + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {1 * -9223372036854775808 + 0 = -9223372036854775808} + +test expr-37.13 {expr edge cases} {wideis64bit} { + set dividend $min + set divisor [expr {$min + 1}] + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {1 * -9223372036854775807 + -1 = -9223372036854775808} + +test expr-37.14 {expr edge cases} {wideis64bit} { + set dividend $min + set divisor [expr {$min + 2}] + set q [expr {$dividend / $divisor}] + set r [expr {$dividend % $divisor}] + list $q * $divisor + $r = [expr {($q * $divisor) + $r}] +} {1 * -9223372036854775806 + -2 = -9223372036854775808} + + # cleanup if {[info exists a]} { unset a } +catch {unset min} +catch {unset max} ::tcltest::cleanupTests return |