' Gambas module file

Private ts As New TestSuite

'------------------------------------------------------------------
'Creates a new test object and adds it to the test suite
'------------------------------------------------------------------
Public Function AddTest(name As String, result As Variant, expected As Variant, Optional note As String) As Test
  
  Dim t As New Test
  
  ts.AddTest(t)
  t.Run(name, result, expected, note)
  
End


'-----------------------------------------------------------------
'Test All GSL Class Methods
'-----------------------------------------------------------------
Public Sub testGslMethods()
  Dim result As Variant
  
  AddTest("GSL.Acosh(45)", GSL.Acosh(45), ACosh(45))
  AddTest("GSL.Asinh(45)", GSL.Asinh(45), ASinh(45))
  AddTest("GSL.Atanh(0.45)", GSL.Atanh(0.45), ATanh(0.45))
  AddTest("GSL.Expm1(45)", GSL.Expm1(45), Expm(45))
  AddTest("GSL.Fcmpb(-0.3, 0.2, 0.1)", GSL.Fcmpb(-0.3, 0.2, 0.1), GSL.Fcmpb(-0.3, 0.2, 0.1))
  AddTest("GSL.Fcmpi(-0.3, 0.2, 0.1)", GSL.Fcmpi(1.3, 2.2, -1.1), 1)
  result = GSL.Frexp(0.45)
  AddTest("GSL.Frexp(0.45)", result, result)
  AddTest("GSL.Hypot(10.27, 7.45)", GSL.Hypot(10.27, 7.45), GSL.Hypot(10.27, 7.45))
  AddTest("GSL.Hypot3(10.27, 7.45, 6.78125)", GSL.Hypot3(10.27, 7.45, 6.78125), GSL.Hypot3(10.27, 7.45, 6.78125))
  AddTest("GSL.IntPow(2.0, 8)", GSL.IntPow(2.0, 8), 256.00)
  AddTest("GSL.IntPow2(8)", GSL.IntPow2(8), GSL.IntPow2(8))
  AddTest("GSL.IntPow3(8)", GSL.IntPow3(8), GSL.IntPow3(8))
  AddTest("GSL.IntPow4(8)", GSL.IntPow4(8), GSL.IntPow4(8))
  AddTest("GSL.IntPow5(8)", GSL.IntPow5(8), GSL.IntPow5(8))
  AddTest("GSL.IntPow6(8)", GSL.IntPow6(8), GSL.IntPow6(8))
  AddTest("GSL.IntPow7(8)", GSL.IntPow7(8), GSL.IntPow7(8))
  AddTest("GSL.IntPow8(8)", GSL.IntPow8(8), GSL.IntPow8(8))
  AddTest("GSL.IntPow9(8)", GSL.IntPow9(8), GSL.IntPow9(8))
  AddTest("GSL.IsEven(2)", GSL.IsEven(2), True)
  AddTest("GSL.IsFinite(25)", GSL.IsFinite(25), True)
  AddTest("GSL.IsInf(0)", GSL.IsInf(0), False)
  AddTest("GSL.IsNan(0)", GSL.IsNan(0), False)
  AddTest("GSL.IsOdd(3)", GSL.IsOdd(3), True)
  AddTest("GSL.IsPos(0)", GSL.IsPos(0), True)
  AddTest("GSL.Ldexp(17.63, 3)", GSL.Ldexp(17.63, 3), 141.04)
  AddTest("GSL.Log1p(12.36)", GSL.Log1p(12.36), GSL.Log1p(12.36))
  AddTest("GSL.MaxFloat(2.0123, 2.01234)", GSL.MaxFloat(2.0123, 2.01234), 2.01234)
  AddTest("GSL.MaxInt(1,3)", GSL.MaxInt(1, 3), 3)
  AddTest("GSL.MinFLoat(0.001, 0.0011)", GSL.MinFLoat(0.001, 0.0011), 0.001)
  AddTest("GSL.MinInt(1,3)", GSL.MinInt(1, 3), 1)
  
  End
  
  
'----------------------------------------------------------------
'Test GSL Class constance
'----------------------------------------------------------------
Public Sub testGslConstance()
  ' Constance
  AddTest("GSL.M_1_PI", GSL.M_1_PI, 0.31830988618379067153776752675)
  AddTest("GSL.M_2_PI", GSL.M_2_PI, 0.63661977236758134307553505349)
  AddTest("GSL.M_2_SQRTPI", GSL.M_2_SQRTPI, 1.12837916709551257389615890312)
  AddTest("GSL.M_E", GSL.M_E, 2.71828182845904523536028747135)
  AddTest("GSL.M_EULER", GSL.M_EULER, 0.57721566490153286060651209008)
  AddTest("GSL.M_LN2", GSL.M_LN2, 0.69314718055994530941723212146)
  AddTest("GSL.M_LN10", GSL.M_LN10, 2.30258509299404568401799145468)
  AddTest("GSL.M_LNPI", GSL.M_LNPI, 1.14472988584940017414342735135)
  AddTest("GSL.M_LOG10E", GSL.M_LOG10E, 0.43429448190325182765112891892)
  AddTest("GSL.M_LOGE", GSL.M_LOGE, 1.44269504088896340735992468100)
  AddTest("GSL.M_PI", GSL.M_PI, 3.14159265358979323846264338328)
  AddTest("GSL.M_PI_2", GSL.M_PI_2, 1.57079632679489661923132169164)
  AddTest("GSL.M_PI_4", GSL.M_PI_4, 0.78539816339744830961566084582)
  AddTest("GSL.M_SQRT1_2", GSL.M_SQRT1_2, 0.70710678118654752440084436210)
  AddTest("GSL.M_SQRT2", GSL.M_SQRT2, 1.41421356237309504880168872421)
  AddTest("GSL.M_SQRT3", GSL.M_SQRT3, 1.73205080756887729352744634151)
  AddTest("GSL.M_SQRTPI", GSL.M_SQRTPI, 1.77245385090551602729816748334) 
  
End



'------------------------------------------------------------------
'Test Complex Class Methods
'------------------------------------------------------------------
Public Sub AddComplexTest(name As String, result As Variant, expected As Variant, Optional note As String) 
  
  Dim t As New TestComplex
  
  ts.AddTest(t)
  t.Run(name, result, expected, note)
  
End


'-------------------------------------------------------------------
'Test Complex Class Methods
'-------------------------------------------------------------------
Public Sub testComplexMethods()
  Dim c As New Complex
  Dim z1 As New Complex
  Dim z2 As New Complex
  Dim z3 As Complex
  
  z1.Set(1, 1)
  z2.Set(2, 2)
  
  AddComplexTest("z1.Abs()", z1.Abs(), z1.Abs(), ("z1 = " & z1.ToString()))
  AddComplexTest("z1.Abs2()", z1.Abs2(), z1.Abs2(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Add(z2)", z1.Add(z2), z1.Add(z2), "z1 = " & z1.ToString())
  AddComplexTest("z1.AddImag(1)", z1.AddImag(1), z1.AddImag(1), "z1 = " & z1.ToString())
  AddComplexTest("z1.AddReal(1)", z1.AddReal(1), z1.AddReal(1), "z1 = " & z1.ToString())
  AddComplexTest("z1.Arccos()", z1.Arccos(), z1.Arccos(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Arccosh()", z1.Arccosh(), z1.Arccosh(), "z1 = " & z1.ToString())
  AddComplexTest("z1.ArccoshReal(5.45)", z1.ArccoshReal(5.45), z1.ArccoshReal(5.45), "z1 = " & z1.ToString())
  AddComplexTest("z1.ArccosReal(3.25)", z1.ArccosReal(3.25), z1.ArccosReal(3.25), "z1 = " & z1.ToString())
  AddComplexTest("z1.Arccot()", z1.Arccot(), z1.Arccot(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Arccoth()", z1.Arccoth(), z1.Arccoth(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Arccsc()", z1.Arccsc(), z1.Arccsc(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Arccsch()", z1.Arccsch(), z1.Arccsch(), "z1 = " & z1.ToString())
  AddComplexTest("z1.ArccscReal(3.45)", z1.ArccscReal(3.45), z1.ArccscReal(3.45), "z1 = " & z1.ToString())
  AddComplexTest("z1.Arcsec()", z1.Arcsec(), z1.Arcsec(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Arcsech()", z1.Arcsech(), z1.Arcsech(), "z1 = " & z1.ToString())
  AddComplexTest("z1.ArcsecReal(3.45)", z1.ArcsecReal(3.45), z1.ArcsecReal(3.45), "z1 = " & z1.ToString())
  AddComplexTest("z1.Arcsin()", z1.Arcsin(), z1.Arcsin(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Arcsinh()", z1.Arcsinh(), z1.Arcsinh(), "z1 = " & z1.ToString())
  AddComplexTest("z1.ArcsinReal(3.45)", z1.ArcsinReal(3.45), z1.ArcsinReal(3.45), "z1 = " & z1.ToString())
  AddComplexTest("z1.Arctan()", z1.Arctan(), z1.Arctan(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Arctanh()", z1.Arctanh(), z1.Arctanh(), "z1 = " & z1.ToString())
  AddComplexTest("z1.ArctanhReal(3.45)", z1.ArctanhReal(3.45), z1.ArctanhReal(3.45), "z1 = " & z1.ToString())
  AddComplexTest("z1.Arg()", z1.Arg(), z1.Arg(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Copy()", z1.Copy(), z1.Copy(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Cos()", z1.Cos(), z1.Cos(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Cosh()", z1.Cosh(), z1.Cosh(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Cot()", z1.Cot(), z1.Cot(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Coth()", z1.Coth(), z1.Coth(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Csc()", z1.Csc(), z1.Csc(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Csch()", z1.Csch(), z1.Csch(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Csch()", z1.Csch(), z1.Csch(), "z1 = [" & z1.ToString() & "] z2 = [" & z2.ToString() & "]")
  AddComplexTest("z1.DivImag(3.45)", z1.DivImag(3.45), z1.DivImag(3.45), "z1 = " & z1.ToString())
  AddComplexTest("z1.DivReal(3.45)", z1.DivReal(3.45), z1.DivReal(3.45), "z1 = " & z1.ToString())
  AddComplexTest("z1.Exp()", z1.Exp(), z1.Exp(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Log()", z1.Log(), z1.Log(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Log10()", z1.Log10(), z1.Log10(), "z1 = " & z1.ToString())
  AddComplexTest("z1.LogAbs()", z1.LogAbs(), z1.LogAbs(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Logb(z2)", z1.Logb(z2), z1.Logb(z2), "z1 = [" & z1.ToString() & "] z2 = [" & z2.ToString() & "]")
  AddComplexTest("z1.Mul(z2)", z1.Mul(z2), z1.Mul(z2), "z1 = [" & z1.ToString() & "] z2 = [" & z2.ToString() & "]")
  AddComplexTest("z1.MulImag(3.45)", z1.MulImag(3.45), z1.MulImag(3.45), "z1 = " & z1.ToString())
  AddComplexTest("z1.MulReal(3.45)", z1.MulReal(3.45), z1.MulReal(3.45), "z1 = " & z1.ToString())
  z1.Polar(5, 2)
  AddComplexTest("z1.Polar(5,2)", z1.Copy(), z1.Copy(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Pow(z2)", z1.Pow(z2), z1.Pow(z2), "z1 = [" & z1.ToString() & "] z2 = [" & z2.ToString() & "]")
  AddComplexTest("z1.PowReal(2) ", z1.PowReal(2), z1.PowReal(2), "z1 = [" & z1.ToString() & "] z2 = [" & z2.ToString() & "]")
  z1.Rect(1, 1)
  AddComplexTest("z1.Rect(1,1)", z1.Copy(), z1.Copy(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Sec()", z1.Sec(), z1.Sec(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Sech()", z1.Sech(), z1.Sech(), "z1 = " & z1.ToString())
  z1.Set(2, 2)
  AddComplexTest("z1.Set(2,2)", z1.Copy(), z1.Copy(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Sin()", z1.Sin(), z1.Sin(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Sinh()", z1.Sinh(), z1.Sinh(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Sqrt()", z1.Sqrt(), z1.Sqrt(), "z1 = " & z1.ToString())
  AddComplexTest("z1.SqrtReal(3.45)", z1.SqrtReal(3.45), z1.SqrtReal(3.45), "z1 = " & z1.ToString())
  AddComplexTest("z1.Sub(z2)", z1.Sub(z2), z1.Sub(z2), "z1 = [" & z1.ToString() & "] z2 = [" & z2.ToString() & "]")
  AddComplexTest("z1.SubImag(1.321)", z1.SubImag(1.321), z1.SubImag(1.321), "z1 = " & z1.ToString())
  AddComplexTest("z1.SubReal(2.125)", z1.SubReal(2.125), z1.SubReal(2.125), "z1 = " & z1.ToString())
  AddComplexTest("z1.Tan()", z1.Tan(), z1.Tan(), "z1 = " & z1.ToString())
  AddComplexTest("z1.Tanh()", z1.Tanh(), z1.Tanh(), "z1 = " & z1.ToString())
    
End


'-------------------------------------------------------------------
' Add Polynomial Tests
'-------------------------------------------------------------------
Public Sub AddPolynomialTest(name As String, result As Variant, expected As Variant, Optional note As String) 
  
  Dim t As New TestPolynomial
  
  ts.AddTest(t)
  t.Run(name, result, expected, note)
  
End


'-------------------------------------------------------------------
' Polynomial Tests
'-------------------------------------------------------------------
Public Sub testPolynomialMethods()
  Dim c As New Complex
  Dim p1 As New Polynomial
  Dim p2 As New Polynomial
  Dim p3 As Polynomial
  Dim f1 As Float
  Dim f2 As Float
  
  p1.AddCoef(0.565)
  p1.AddCoef(1.738)
  p1.AddCoef(3.1465)
  
  AddPolynomialTest("p1.AddCoef(0.565)", p1.AddCoef(0.565), 1, p1.ToString())
  AddPolynomialTest("p1.AddCoef(1.738)", p1.AddCoef(1.738), 2, p1.ToString())
  AddPolynomialTest("p1.AddCoef(3.1465)", p1.AddCoef(3.1465), 3, p1.ToString())
  

End Sub






'-------------------------------------------------------------------
'Run all tests
'-------------------------------------------------------------------
Public Sub Main()
  
  ' Setup test suite
  ts.Name = "GSL Component"
  ts.HeaderChar = "="
  ts.HeaderWidth = 40
  ts.TestHeaderChar = "-"
  ts.TestHeaderWidth = 40
  ts.Note = "This test suite was developed for use\n"
            "with GSL Component development. However,\n"
            "it may be useful in other projects."
  ts.ShowTestNotes = True
  
  'Run our GSL Class Tests
  testGslMethods()
  testGslConstance 
  
  'Run Complex Class Test
  testComplexMethods()
  
  'Run Polynomial Class Test
  testPolynomialMethods()
  
  
  ' Finnish by showing test results
  ts.ShowTests()
End


