# -*- tcl -*-
# polynomials.test --
#    Test cases for the ::math::polynomials package
#

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

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

testsNeedTcl     8.3
testsNeedTcltest 2.1

support {
    useLocal math.tcl math
}
testing {
    useLocal polynomials.tcl math::polynomials
}

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

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

customMatch numbers matchNumbers

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

test "Polynomial-1.0" "Create polynomial (degree 3)" \
   -match numbers -body {
   set f1 [::math::polynomials::polynomial {1 2 3 4}]
   set result [lindex $f1 1]
} -result {4 3 2 1}

test "Polynomials-1.1" "Create polynomial (degree 3, leading zeros)" \
   -match numbers -body {
   set f1 [::math::polynomials::polynomial {1 2 3 4 0 0 0}]
   set result [lindex $f1 1]
} -result {4 3 2 1}

test "Polynomials-1.2" "Create polynomial (invalid coefficients)" \
   -match glob -body {
   set f1 [::math::polynomials::polynomial {A B C}]
} -result "Coefficients *" -returnCodes 1

test "Polynomials-1.3" "Create polynomial command" \
   -match numbers -body {
   set f1 [::math::polynomials::polynCmd {1 2 3 4 0 0 0}]
   set result {}
   foreach x {0 1 2 3} {
      lappend result [$f1 $x]
   }
   set result
} -result {1 10 49 142}

test "Polynomials-1.4" "Evaluate polynomial" \
   -match numbers -body {
   set f1 [::math::polynomials::polynomial {1 2 3 4 0 0 0}]
   set result {}
   foreach x {0 1 2 3} {
      lappend result [::math::polynomials::evalPolyn $f1 $x]
   }
   set result
} -result {1 10 49 142}

test "Polynomials-1.5" "Evaluate null polynomial" \
   -match numbers -body {
   set f1 [::math::polynomials::polynomial {0 0 0}]
   set result {}
   foreach x {0 1 2 3} {
      lappend result [::math::polynomials::evalPolyn $f1 $x]
   }
   set result
} -result {0 0 0 0}

test "Polynomials-2.1" "Query polynomial properties - degree" \
   -match exact -body {
   set f1 [::math::polynomials::polynomial {1 2 3}]
   set result [::math::polynomials::degreePolyn $f1]
} -result 2

test "Polynomials-2.2" "Query polynomial properties - degree (2 again)" \
   -match exact -body {
   set f1 [::math::polynomials::polynomial {1 2 3 0 0 0}]
   set result [::math::polynomials::degreePolyn $f1]
} -result 2

test "Polynomials-2.3" "Query polynomial properties - degree (null)" \
   -match exact -body {
   set f1 [::math::polynomials::polynomial {0 0 0}]
   set result [::math::polynomials::degreePolyn $f1]
} -result -1

test "Polynomials-2.4" "Query polynomial properties - leading coeff" \
   -match exact -body {
   set f1 [::math::polynomials::polynomial {1 2 3}]
   set idx [::math::polynomials::degreePolyn $f1]
   set coeff [::math::polynomials::coeffPolyn $f1 $idx]
} -result 3

test "Polynomials-2.5" "Query polynomial properties - all coeffs" \
   -match numbers -body {
   set f1 [::math::polynomials::polynomial {1 2 3}]
   set coeffs [::math::polynomials::allCoeffsPolyn $f1]
} -result {1 2 3}

test "Polynomials-3.1" "Derivatives and primitives - derivative" \
   -match numbers -body {
   set f1 [::math::polynomials::polynomial {1 2 3}]
   set f2 [::math::polynomials::derivPolyn $f1]
   set coeffs [::math::polynomials::allCoeffsPolyn $f2]
} -result {2 6}

test "Polynomials-3.2" "Derivatives and primitives - primitive" \
   -match numbers -body {
   set f1 [::math::polynomials::polynomial {1 4 9}]
   set f2 [::math::polynomials::primitivePolyn $f1]
   set coeffs [::math::polynomials::allCoeffsPolyn $f2]
} -result {0 1 2 3}

test "Polynomials-4.1" "Arithmetical operations - add (1)" \
   -match numbers -body {
   set f1 [::math::polynomials::polynomial {1 2 3}]
   set f2 [::math::polynomials::polynomial {1 2}]
   set f3 [::math::polynomials::addPolyn $f1 $f2]
   set coeffs [::math::polynomials::allCoeffsPolyn $f3]
} -result {2 4 3}

test "Polynomials-4.2" "Arithmetical operations - add (2)" \
   -match numbers -body {
   set f1 [::math::polynomials::polynomial {1 2 3}]
   set f2 [::math::polynomials::polynomial {1 2}]
   set f3 [::math::polynomials::addPolyn $f2 $f1]
   set coeffs [::math::polynomials::allCoeffsPolyn $f3]
} -result {2 4 3}

test "Polynomials-4.3" "Arithmetical operations - subtract (1)" \
   -match numbers -body {
   set f1 [::math::polynomials::polynomial {1 2 3}]
   set f2 [::math::polynomials::polynomial {1 2}]
   set f3 [::math::polynomials::subPolyn $f1 $f2]
   set coeffs [::math::polynomials::allCoeffsPolyn $f3]
} -result {0 0 3}

test "Polynomials-4.4" "Arithmetical operations - subtract (2)" \
   -match numbers -body {
   set f1 [::math::polynomials::polynomial {1 2 3}]
   set f2 [::math::polynomials::polynomial {1 2}]
   set f3 [::math::polynomials::subPolyn $f2 $f1]
   set coeffs [::math::polynomials::allCoeffsPolyn $f3]
} -result {0 0 -3}

test "Polynomials-4.5" "Arithmetical operations - multiply (1)" \
   -match numbers -body {
   set f1 [::math::polynomials::polynomial {1 2 3}]
   set f2 [::math::polynomials::polynomial {1 2}]
   set f3 [::math::polynomials::multPolyn $f1 $f2]
   set coeffs [::math::polynomials::allCoeffsPolyn $f3]
} -result {1 4 7 6}

test "Polynomials-4.6" "Arithmetical operations - multiply (2)" \
   -match numbers -body {
   set f1 [::math::polynomials::polynomial {1 2 3}]
   set f2 [::math::polynomials::polynomial {1 2}]
   set f3 [::math::polynomials::multPolyn $f2 $f1]
   set coeffs [::math::polynomials::allCoeffsPolyn $f3]
} -result {1 4 7 6}

test "Polynomials-4.7" "Arithmetical operations - multiply (3)" \
   -match numbers -body {
   set f1 [::math::polynomials::polynomial {1 2 3}]
   set f3 [::math::polynomials::multPolyn $f1 2.0]
   set coeffs [::math::polynomials::allCoeffsPolyn $f3]
} -result {2 4 6}

test "Polynomials-4.8" "Arithmetical operations - multiply (4)" \
   -match numbers -body {
   set f1 [::math::polynomials::polynomial {1 2 3}]
   set f3 [::math::polynomials::multPolyn 2.0 $f1]
   set coeffs [::math::polynomials::allCoeffsPolyn $f3]
} -result {2 4 6}

test "Polynomials-4.9" "Arithmetical operations - divide (1)" \
   -match numbers -body {
   set f1 [::math::polynomials::polynomial {1 2 3}]
   set f2 [::math::polynomials::polynomial {0 1}]
   set f3 [::math::polynomials::divPolyn $f1 $f2]
   set coeffs [::math::polynomials::allCoeffsPolyn $f3]
} -result {2 3}

test "Polynomials-4.10" "Arithmetical operations - divide (2)" \
   -match numbers -body {
   set f1 [::math::polynomials::polynomial {1 2 3}]
   set f3 [::math::polynomials::divPolyn $f1 2.0]
   set coeffs [::math::polynomials::allCoeffsPolyn $f3]
} -result {0.5 1 1.5}

test "Polynomials-4.11" "Arithmetical operations - divide (3)" \
   -match numbers -body {
   set f1 [::math::polynomials::polynomial {1 2 3}]
   set f2 [::math::polynomials::polynomial {0 1}]
   set f3 [::math::polynomials::divPolyn $f2 $f1]
   set coeffs [::math::polynomials::allCoeffsPolyn $f3]
} -result {}

test "Polynomials-4.12" "Arithmetical operations - divide (4)" \
   -match glob -body {
   set f1 [::math::polynomials::polynomial {1 2 3}]
   set f2 [::math::polynomials::polynomial {0}]
   set f3 [::math::polynomials::divPolyn $f1 $f2]
   set coeffs [::math::polynomials::allCoeffsPolyn $f3]
} -result "Denominator*" -returnCodes 1

test "Polynomials-4.13" "Arithmetical operations - remainder (1)" \
   -match numbers -body {
   set f1 [::math::polynomials::polynomial {1 2 3}]
   set f2 [::math::polynomials::polynomial {0 1}]
   set f3 [::math::polynomials::remainderPolyn $f1 $f2]
   set coeffs [::math::polynomials::allCoeffsPolyn $f3]
} -result {1}

test "Polynomials-4.14" "Arithmetical operations - remainder (2)" \
   -match numbers -body {
   set f1 [::math::polynomials::polynomial {1 2 3}]
   set f3 [::math::polynomials::remainderPolyn $f1 2.0]
   set coeffs [::math::polynomials::allCoeffsPolyn $f3]
} -result {}

test "Polynomials-4.15" "Arithmetical operations - remainder (3)" \
   -match numbers -body {
   set f1 [::math::polynomials::polynomial {1 2 3}]
   set f2 [::math::polynomials::polynomial {0 1}]
   set f3 [::math::polynomials::remainderPolyn $f2 $f1]
   set coeffs [::math::polynomials::allCoeffsPolyn $f3]
} -result {0 1}

test "Polynomials-4.16" "Arithmetical operations - remainder (4)" \
   -match glob -body {
   set f1 [::math::polynomials::polynomial {1 2 3}]
   set f2 [::math::polynomials::polynomial {0}]
   set f3 [::math::polynomials::remainderPolyn $f1 $f2]
   set coeffs [::math::polynomials::allCoeffsPolyn $f3]
} -result "Denominator*" -returnCodes 1





# End of test cases
testsuiteCleanup
