# -*- tcl -*-
# Tests for complex number functions in math library  -*- tcl -*-
#
# This file contains a collection of tests for one or more of the Tcllib
# procedures.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#
# $Id: qcomplex.test,v 1.10 2006/10/09 21:41:41 andreas_kupries Exp $
#
# Copyright (c) 2004 by Arjen Markus
# All rights reserved.
#
# Note:
#    By evaluating the tests in a different namespace than global,
#    we assure that the namespace issue (Bug #...) is checked.
#

# -------------------------------------------------------------------------

source [file join \
	[file dirname [file dirname [file join [pwd] [info script]]]] \
	devtools testutilities.tcl]

testsNeedTcl     8.5
testsNeedTcltest 2.1

support {
    useLocal math.tcl math
}
testing {
    useLocal qcomplex.tcl math::complexnumbers
}

# -------------------------------------------------------------------------

namespace import -force ::math::complexnumbers::*

proc matchNumbers { expected actual } {
   set match 1
   foreach a $actual e $expected {
      if { abs($a-$e) > 1.0e-10 } {
         set match 0
         break
      }
   }
   return $match
}

customMatch numbers matchNumbers

# -------------------------------------------------------------------------

#
# Test cases: arithmetical operations
#
test "Complex-1.1" "Arithmetic - add 1" -match numbers -body {
   set a [complex 1 0]
   set b [complex 0 1]
   set c [+ $a $b]
} -result [complex 1 1]

test "Complex-1.2" "Arithmetic - add 2" -match numbers -body {
   set a [complex 1.1 -1.1]
   set b [complex 1.1  1.1]
   set c [+ $a $b]
} -result [complex 2.2 0]

test "Complex-1.3" "Arithmetic - subtract 1" -match numbers -body {
   set a [complex 1 0]
   set b [complex 0 1]
   set c [- $a $b]
} -result [complex 1 -1]

test "Complex-1.4" "Arithmetic - subtract 2" -match numbers -body {
   set a [complex 1.1 -1.1]
   set b [complex 1.1  1.1]
   set c [- $a $b]
} -result [complex 0 -2.2]

test "Complex-1.5" "Arithmetic - multiply 1" -match numbers -body {
   set a [complex 1 -1]
   set b [complex 0  1]
   set c [* $a $b]
} -result [complex 1 1]

test "Complex-1.6" "Arithmetic - multiply 2" -match numbers -body {
   set a [complex 0  1]
   set b [complex 0  1]
   set c [* $a $b]
} -result [complex -1 0]

test "Complex-1.7" "Arithmetic - divide 1" -match numbers -body {
   set a [complex 1.1 1]
   set b [complex 1.1 1]
   set c [/ $a $b]
} -result [complex 1 0]

test "Complex-1.8" "Arithmetic - divide 2" -match numbers -body {
   set a [complex 1  1]
   set b [complex 0  1]
   set c [/ $a $b]
} -result [complex 1 -1]

test "Complex-1.9" "Arithmetic - conjugate 1" -match numbers -body {
   set a [complex 0  1]
   set c [conj $a]
} -result [complex 0 -1]

test "Complex-1.10" "Arithmetic - conjugate 2" -match numbers -body {
   set a [complex 1  0]
   set c [conj $a]
} -result [complex 1 0]

test "Complex-2.1" "Conversion - real 1" -match numbers -body {
   set a [complex 1  2]
   set c [real $a]
} -result 1

test "Complex-2.2" "Conversion - real 2" -match numbers -body {
   set a [complex 0  2]
   set c [real $a]
} -result 0

test "Complex-2.3" "Conversion - imag 1" -match numbers -body {
   set a [complex 1  2]
   set c [imag $a]
} -result 2

test "Complex-2.4" "Conversion - imag 2" -match numbers -body {
   set a [complex 0  2]
   set c [imag $a]
} -result 2

test "Complex-2.5" "Conversion - mod 1" -match numbers -body {
   set a [complex 0  1]
   set c [mod $a]
} -result 1

test "Complex-2.6" "Conversion - mod 2" -match numbers -body {
   set a [complex 3  4]
   set c [mod $a]
} -result 5

test "Complex-2.7" "Conversion - arg 1" -match numbers -body {
   set a [complex 0  1]
   set c [arg $a]
} -result [expr {2.0*atan(1.0)}]

test "Complex-2.8" "Conversion - arg 2" -match numbers -body {
   set a [complex 1  1]
   set c [arg $a]
} -result [expr {atan(1.0)}]

test "Complex-2.9" "Conversion - tostring" -body {
   set c    "[tostring [complex 1 0]] "
   append c "[tostring [complex 0 1]] "
   append c "[tostring [complex 1 1]] "
   append c "[tostring [complex 1 -1]] "
   append c "[tostring [complex 0 -1]] "
   append c "[tostring [complex 2 -3]] "
} -result "1 i 1+i 1-i -i 2-3i "

test "Complex-3.1" "Elementary - exp 1" -match numbers -body {
   set a [complex 1  0]
   set c [exp $a]
} -result [complex [expr {exp(1.0)}] 0.0]

test "Complex-3.2" "Elementary - exp 2" -match numbers -body {
   set a [complex 0  1]
   set c [exp $a]
} -result [complex [expr {cos(1.0)}] [expr {sin(1.0)}]]

test "Complex-3.3" "Elementary - sin 1" -match numbers -body {
   set a [complex 1  0]
   set c [sin $a]
} -result [complex [expr {sin(1.0)}] 0.0]

test "Complex-3.4" "Elementary - sin 2" -match numbers -body {
   set a  [complex 0 1]
   set c  [sin $a]
   #
   # Calculate from the (complex) definition
   #
   set d1 [exp [complex -1 0]]
   set d2 [exp [complex  1 0]]
   set e  [/ [- $d1 $d2] [complex 0 2]]
   set diff [- $c $e]
} -result [complex 0 0]

test "Complex-3.5" "Elementary - cos 1" -match numbers -body {
   set a [complex 1  0]
   set c [cos $a]
} -result [complex [expr {cos(1.0)}] 0.0]

test "Complex-3.6" "Elementary - cos 2" -match numbers -body {
   set a  [complex 0 1]
   set c  [cos $a]
   set d1 [exp [complex -1 0]]
   set d2 [exp [complex  1 0]]
   set e  [/ [+ $d1 $d2] [complex 2 0]]
   set diff [- $c $e]
} -result [complex 0 0]

test "Complex-3.7" "Elementary - tan 1" -match numbers -body {
   set a  [complex 1 0]
   set c  [tan $a]
} -result [complex [expr {tan(1.0)}] 0]

test "Complex-3.8" "Elementary - tan 2" -match numbers -body {
   set a  [complex 0 1]
   set c  [tan $a]
   set d1 [sin $a]
   set d2 [cos $a]
   set e  [/ $d1 $d2]
   set diff [- $c $e]
} -result [complex 0 0]

test "Complex-3.9" "Elementary - log 1" -match numbers -body {
   set a  [complex 1 0]
   set c  [log $a]
} -result [complex 0 0]

test "Complex-3.10" "Elementary - log 2" -match numbers -body {
   set a  [complex 0 1]
   set c  [log $a]
} -result [complex 0 [expr {2.0*atan(1.0)}]]

test "Complex-3.11" "Elementary - sqrt 1" -match numbers -body {
   set a  [complex -1 0]
   set c  [sqrt $a]
} -result [complex 0 1]

test "Complex-3.12" "Elementary - sqrt 2" -match numbers -body {
   set a  [complex  0 4]
   set c  [sqrt $a]
} -result [complex [expr {sqrt(2)}] [expr {sqrt(2)}]]

test "Complex-3.13" "Elementary - pow 1" -match numbers -body {
   set a  [complex -1   0]
   set b  [complex  0.5 0]
   set c  [pow $a $b]
} -result [complex 0 1]

test "Complex-3.14" "Elementary - pow 2" -match numbers -body {
   set a  [complex  [expr {exp(1.0)}] 0]
   set b  [complex  0 [expr {4.0*atan(1.0)}]]
   set c  [pow $a $b]
} -result [complex -1 0]

testsuiteCleanup
