summaryrefslogtreecommitdiffstats
path: root/tcllib/modules/math/math.test
diff options
context:
space:
mode:
Diffstat (limited to 'tcllib/modules/math/math.test')
-rw-r--r--tcllib/modules/math/math.test279
1 files changed, 279 insertions, 0 deletions
diff --git a/tcllib/modules/math/math.test b/tcllib/modules/math/math.test
new file mode 100644
index 0000000..a170cd2
--- /dev/null
+++ b/tcllib/modules/math/math.test
@@ -0,0 +1,279 @@
+# Tests for math library. -*- tcl -*-
+#
+# This file contains a collection of tests for one or more of the Tcl
+# built-in commands. Sourcing this file into Tcl runs the tests and
+# generates output for errors. No output means no errors were found.
+#
+# Copyright (c) 1998-2000 by Ajuba Solutions.
+# All rights reserved.
+#
+# RCS: @(#) $Id: math.test,v 1.22 2009/12/04 17:37:47 andreas_kupries Exp $
+
+# -------------------------------------------------------------------------
+
+source [file join \
+ [file dirname [file dirname [file join [pwd] [info script]]]] \
+ devtools testutilities.tcl]
+
+testsNeedTcl 8.2
+testsNeedTcltest 1.0
+
+testing {
+ useLocal math.tcl math
+}
+
+# -------------------------------------------------------------------------
+#
+# Create and register (in that order!) custom matching procedures
+#
+proc matchTolerant { expected actual } {
+ set match 1
+ foreach a $actual e $expected {
+ if { abs($e-$a)>0.0001*abs($e) &&
+ abs($e-$a)>0.0001*abs($a) } {
+ set match 0
+ break
+ }
+ }
+ return $match
+}
+# tcltest 2.0-ism, we rely here only on 1.0 features
+#customMatch tolerant matchTolerant
+
+
+test math-1.1 {math::min, wrong num args} {
+ catch {math::min} msg
+ set msg
+} [tcltest::wrongNumArgs math::min {val args} 0]
+test math-1.2 {simple math::min} {
+ math::min 1
+} 1
+test math-1.3 {simple math::min} {
+ math::min 2 1
+} 1
+test math-1.4 {math::min} {
+ math::min 2 1 0
+} 0
+test math-1.5 {math::min with negative numbers} {
+ math::min 2 1 0 -10
+} -10
+test math-1.6 {math::min with floating point numbers} {
+ math::min 2 1 0 -10 -10.5
+} -10.5
+
+test math-2.1 {math::max, wrong num args} {
+ catch {math::max} msg
+ set msg
+} [tcltest::wrongNumArgs math::max {val args} 0]
+test math-2.2 {simple math::max} {
+ math::max 1
+} 1
+test math-2.3 {simple math::max} {
+ math::max 2 1
+} 2
+test math-2.4 {math::max} {
+ math::max 0 2 1 0
+} 2
+test math-2.5 {math::max with negative numbers} {
+ math::max 2 1 0 -10
+} 2
+test math-2.6 {math::max with floating point numbers} {
+ math::max 2 1 0 -10 10.5
+} 10.5
+
+test math-3.1 {math::mean, wrong num args} {
+ catch {math::mean} msg
+ set msg
+} [tcltest::wrongNumArgs math::mean {val args} 0]
+test math-3.2 {simple math::mean} {
+ math::mean 1
+} 1.0
+test math-3.3 {simple math::mean} {
+ math::mean 2 1
+} 1.5
+test math-3.4 {math::mean} {
+ math::mean 0 2 1 0
+} 0.75
+test math-3.5 {math::mean with negative numbers} {
+ math::mean 2 1 0 -11
+} -2.0
+test math-3.6 {math::mean with floating point numbers} {
+ matchTolerant 0.7 [math::mean 2 1 0 -10 10.5]
+} 1
+
+test math-4.1 {math::sum, wrong num args} {
+ catch {math::sum} msg
+ set msg
+} [tcltest::wrongNumArgs math::sum {val args} 0]
+test math-4.2 {math::sum} {
+ math::sum 1
+} 1
+test math-4.3 {math::sum} {
+ math::sum 1 2 3
+} 6
+test math-4.4 {math::sum} {
+ matchTolerant 1.6 [math::sum 0.1 0.2 0.3 1]
+} 1
+test math-4.5 {math::sum} {
+ math::sum -1 1
+} 0
+
+test math-5.1 {math::product, wrong num args} {
+ catch {math::product} msg
+ set msg
+} [tcltest::wrongNumArgs math::product {val args} 0]
+test math-5.2 {simple math::product} {
+ math::product 1
+} 1
+test math-5.3 {simple math::product} {
+ math::product 0 1 2 3 4 5 6 7
+} 0
+test math-5.4 {math::product} {
+ math::product 1 2 3 4 5
+} 120
+test math-5.5 {math::product with negative numbers} {
+ math::product 2 -10
+} -20
+test math-5.6 {math::product with floating point numbers} {
+ math::product 2 0.5
+} 1.0
+
+test math-6.1 {math::sigma, wrong num args} {
+ catch {math::sigma} msg
+ set msg
+} [tcltest::wrongNumArgs math::sigma {val1 val2 args} 0]
+test math-6.2 {simple math::sigma} {
+ catch {math::sigma 1} msg
+ set msg
+} [tcltest::wrongNumArgs math::sigma {val1 val2 args} 1]
+test math-6.3 {simple math::sigma} {
+ expr round([ math::sigma 100 120 ])
+} 14
+test math-6.4 {math::sigma} {
+ expr round([ math::sigma 100 110 100 100 ])
+} 5
+test math-6.5 {math::sigma with negative numbers} {
+ math::sigma 100 100 100 -100
+} 100.0
+test math-6.6 {math::sigma with floating point numbers} {
+ math::sigma 100 110 100 100.0
+} 5.0
+
+test math-7.1 {math::cov, wrong num args} {
+ catch {math::cov} msg
+ set msg
+} [tcltest::wrongNumArgs math::cov {val1 val2 args} 0]
+test math-7.2 {simple math::cov} {
+ catch {math::cov 1} msg
+ set msg
+} [tcltest::wrongNumArgs math::cov {val1 val2 args} 1]
+test math-7.3 {simple math::cov} {
+ math::cov 2 1
+} 100.0
+
+test math-7.4 {math::cov} {
+ if {![catch {
+ math::cov 0 2 1 0
+ } msg]} {
+ if { [string equal $msg Infinity] || [string equal $msg Inf] } {
+ set result ok
+ } else {
+ set result "result of cov was [list $msg],\
+ should be Infinity"
+ }
+ } else {
+ if { [string equal [lrange $::errorCode 0 1] {ARITH DOMAIN}] } {
+ set result ok
+ } else {
+ set result "error from cov was [list $::errorCode],\
+ should be {ARITH DOMAIN *}"
+ }
+ }
+ set result
+} ok
+test math-7.5 {math::cov with negative numbers} {
+ math::cov 100 100 100 -100
+} 200.0
+test math-7.6 {math::cov with floating point numbers} {
+ string range [ math::cov 100 110 100 100.0 ] 0 0
+} 4
+test math-7.7 {math::cov with zero mean} {
+ # Throw an error
+ catch {
+ math::cov 1 1 -2
+ } msg
+} 1
+
+test math-8.1 {math::stats, wrong num of args} {
+ catch { math::stats } msg
+ set msg
+} [tcltest::wrongNumArgs math::stats {val1 val2 args} 0]
+test math-8.2 {math::stats, wrong num of args} {
+ catch { math::stats 100 } msg
+ set msg
+} [tcltest::wrongNumArgs math::stats {val1 val2 args} 1]
+test math-8.3 { simple math::stats } {
+ foreach {a b c} [ math::stats 100 100 100 110 ] { break }
+ set a [ expr round($a) ]
+ set b [ expr round($b) ]
+ set c [ expr round($c) ]
+ list $a $b $c
+} {102 5 5}
+
+test math-9.1 { math::integrate, insufficient data points } {
+ catch { math::integrate {1 10 2 20 3 30 4 40} } msg
+ set msg
+} "at least 5 x,y pairs must be given"
+test math-9.2 { simple math::integrate } {
+ math::integrate {1 10 2 20 3 30 4 40 5 50 6 60 7 70 8 80 9 90 10 100}
+} {500.0 0.5}
+
+test math-10.1 { math::random } {
+ set result [expr round(srand(12345) * 1000)]
+ for {set i 0} {$i < 10} {incr i} {
+ lappend result [expr round([::math::random] * 1000)]
+ }
+ set result
+} {97 834 948 36 12 51 766 585 914 784 333}
+test math-10.2 { math::random value } {
+ set result {}
+ expr {srand(12345)}
+ for {set i 0} {$i < 10} {incr i} {
+ lappend result [::math::random 10]
+ }
+ set result
+} {8 9 0 0 0 7 5 9 7 3}
+test math-10.3 { math::random value value } {
+ set result {}
+ expr {srand(12345)}
+ for {set i 0} {$i < 10} {incr i} {
+ lappend result [::math::random 5 15]
+ }
+ set result
+} {13 14 5 5 5 12 10 14 12 8}
+test math-10.4 {math::random} {
+ list [catch {::math::random foo bar baz} msg] $msg
+} [list 1 "wrong # args: should be \"::math::random ?value1? ?value2?\""]
+
+test math-11.1 {math::fibonacci} {
+ set result {}
+ for {set i 0} {$i < 15} {incr i} {
+ lappend result [::math::fibonacci $i]
+ }
+ set result
+} [list 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377]
+
+test math-12.1 {Safe Interpreter} {
+ ::safe::interpCreate safeInterp
+ #interp alias safeInterp puts {} puts
+
+ set result [interp eval safeInterp {
+ package require math
+ set result [math::cov 100 100 100 -100]
+ }]
+
+ interp delete safeInterp
+ set result
+} 200.0
+
+testsuiteCleanup