' Gambas class file ''' The TestSuite class represents a suite of different tests to be run. The TestSuite contains ''' a part-whole hierarchy of objects that implement the ITest interface -- ''' including TestCase objects and other TestSuite objects. Executing the Run method for the ''' TestSuite will execute all test cases that it contains. The TestSuite class also provides ''' methods for add all test cases contained in a TestModule object into the suite. Inherits ITest Property Read Tests As ITest[] Private $Tests As ITest[] Public Sub _new() $Tests = New ITest[] End Sub '' Runs all tests contained within the collection and collects the result in the Track parameter. Public Sub Run() Dim oTest As ITestCase Dim CurrentTestModule, LastTestModule As Class Dim CurrentAction As String Assert $Tests For Each oTest In $Tests CurrentTestModule = oTest.TestModule If LastTestModule Then If LastTestModule <> CurrentTestModule Then CurrentAction = LastTestModule.Name & ":TearDownTestModule" StopTestModule(LastTestModule) CurrentAction = CurrentTestModule.Name & ":SetupTestModule" StartTestModule(CurrentTestModule) Endif Else 'Assert.Note("-------------------- " & CurrentTestModule.Name) CurrentAction = CurrentTestModule.Name & ":SetupTestModule" StartTestModule(CurrentTestModule) Endif With Track .TestModuleName = oTest.TestModule.Name .TestName = oTest.Name End With oTest.Run() LastTestModule = CurrentTestModule Next If LastTestModule Then CurrentAction = LastTestModule.Name & ":TearDownTestModule" StopTestModule(LastTestModule) Endif Catch 'Bail out Print "Bail out! " & "Unittest Stopped with error \"" & Error.Text & "\" caused by " & CurrentAction & "." Print "# ------- No success! -------" Quit End Sub Private Sub StartTestModule(TestModule As Class) If TestModule.Symbols.Exist("Setup") Then Object.Call(TestModule, "Setup") Endif ' Tracks tests in a TestModule, reset if TestModule changes Track.TestModuleTestsCount = 0 End Private Sub StopTestModule(TestModule As Class) Dim Plan As Integer If TestModule.Symbols.Exist("TearDown") Then Object.Call(TestModule, "TearDown") Endif If TestModule.Symbols.Exist("Plan") Then Plan = Eval(TestModule.Name & ".Plan") Endif If Plan > 0 Then Track.Plan += Plan Else Track.Plan += Track.TestModuleTestsCount Endif End '' Add a object implementing ITest (either a TestCase or TestSuite) to the suite. Private Sub AddTest(oTest As ITest) Assert $Tests $Tests.Add(oTest) End Sub '' Add a TestCase to the suite. Private Sub AddTestCase(oTestCase As ITestCase) Assert $Tests $Tests.Add(oTestCase, Object.Class(oTestCase).Name) End Sub '' Create a new test case and add it to the suite. Private Function AddNewTestCase(sName As String, TestModule As Class) Dim test As TestCase Assert sName <> Null Assert TestModule test = New TestCase(sName, TestModule) Assert $Tests $Tests.Add(test) End Private Function GetTestsFromTestModule(TestModule As Class) As String[] Dim sSymbol As String Dim NoTestSymbols As String[] = ["Setup", "SetupEach", "Teardown", "TeardownEach", "Plan", "ThisIsAnUnitTestSelfTest"] Dim asTests As New String[] Assert TestModule For Each sSymbol In TestModule.Symbols If Not NoTestSymbols.Exist(sSymbol, gb.IgnoreCase) Then asTests.Add(sSymbol) Endif Next Return asTests End '' Create all test cases that are contained in the specified TestModule and add them to the suite. Public Function AddAllTestCases(TestModule As Class, Optional NameProcedure As String) Dim asTests As String[] Dim i As Integer Assert TestModule asTests = GetTestsFromTestModule(TestModule) asTests.Sort ' Tests must not be empty 'Assert asTests.Count > 0 Error "Failed: No tests in " & TestModule.Name If asTests.Count = 0 Then Assert.BailOut("Error: No tests in " & TestModule.Name) Endif For i = 0 To asTests.Count - 1 If NameProcedure = Null Then AddNewTestCase(CStr(asTests[i]), TestModule) Else ' just one TestMethod was called, change plan, if plan exists in TestModule If TestModule.Symbols.Exist("Plan", gb.IgnoreCase) Then Object.SetProperty(TestModule, "Plan", 1) Endif If asTests[i] = NameProcedure Then AddNewTestCase(CStr(asTests[i]), TestModule) Endif Endif Next End Private Function Tests_Read() As ITest[] Return $Tests End