diff --git a/TcUnit-Verifier/TcUnit-Verifier_DotNet/TcUnit-Verifier/FB_ExtendedTestInformation.cs b/TcUnit-Verifier/TcUnit-Verifier_DotNet/TcUnit-Verifier/FB_ExtendedTestInformation.cs index 8208b4f..7f9c7b8 100644 --- a/TcUnit-Verifier/TcUnit-Verifier_DotNet/TcUnit-Verifier/FB_ExtendedTestInformation.cs +++ b/TcUnit-Verifier/TcUnit-Verifier_DotNet/TcUnit-Verifier/FB_ExtendedTestInformation.cs @@ -9,6 +9,7 @@ public FB_ExtendedTestInformation(IEnumerable errors, string te { Check_TestSuite_Statistics(); AssertTestClassName(); + AssertTestDuration(); Test_BOOL_AssertFailed(); Test_BOOL_AssertSuccess(); Test_BYTE_TwoFailedAsserts(); @@ -36,6 +37,11 @@ private void AssertTestClassName() AssertMessageCount(className, 5, EnvDTE80.vsBuildErrorLevel.vsBuildErrorLevelLow); } + private void AssertTestDuration() + { + string duration = "Test duration=%f"; + AssertMessageCount(duration, 260, EnvDTE80.vsBuildErrorLevel.vsBuildErrorLevelLow); + } private void Test_BOOL_AssertFailed() { diff --git a/TcUnit-Verifier/TcUnit-Verifier_DotNet/TcUnit-Verifier/FB_TestNumberOfAssertionsCalculation.cs b/TcUnit-Verifier/TcUnit-Verifier_DotNet/TcUnit-Verifier/FB_TestNumberOfAssertionsCalculation.cs index 72a2649..b5b6f5f 100644 --- a/TcUnit-Verifier/TcUnit-Verifier_DotNet/TcUnit-Verifier/FB_TestNumberOfAssertionsCalculation.cs +++ b/TcUnit-Verifier/TcUnit-Verifier_DotNet/TcUnit-Verifier/FB_TestNumberOfAssertionsCalculation.cs @@ -16,27 +16,27 @@ public FB_TestNumberOfAssertionsCalculation(IEnumerable errors, private void TestMixed33SuccessulAnd9FailedAssertions() { - AssertContainsMessage("| Test status=FAIL, number of asserts=42", EnvDTE80.vsBuildErrorLevel.vsBuildErrorLevelLow); + AssertContainsMessage("| Test status=FAIL, number of asserts=42, duration=%f", EnvDTE80.vsBuildErrorLevel.vsBuildErrorLevelLow); } private void TestWith43SuccessfulAssertions() { - AssertContainsMessage("| Test status=PASS, number of asserts=43", EnvDTE80.vsBuildErrorLevel.vsBuildErrorLevelLow); + AssertContainsMessage("| Test status=PASS, number of asserts=43, duration=%f", EnvDTE80.vsBuildErrorLevel.vsBuildErrorLevelLow); } private void TestWith44FailedAssertions() { - AssertContainsMessage("| Test status=FAIL, number of asserts=44", EnvDTE80.vsBuildErrorLevel.vsBuildErrorLevelLow); + AssertContainsMessage("| Test status=FAIL, number of asserts=44, duration=%f", EnvDTE80.vsBuildErrorLevel.vsBuildErrorLevelLow); } private void TestWith45SuccessfulArrayAssertions() { - AssertContainsMessage("| Test status=PASS, number of asserts=45", EnvDTE80.vsBuildErrorLevel.vsBuildErrorLevelLow); + AssertContainsMessage("| Test status=PASS, number of asserts=45, duration=%f", EnvDTE80.vsBuildErrorLevel.vsBuildErrorLevelLow); } private void TestWith46FailedArrayAssertions() { - AssertContainsMessage("| Test status=FAIL, number of asserts=46", EnvDTE80.vsBuildErrorLevel.vsBuildErrorLevelLow); + AssertContainsMessage("| Test status=FAIL, number of asserts=46, duration=%f", EnvDTE80.vsBuildErrorLevel.vsBuildErrorLevelLow); } } diff --git a/TcUnit-Verifier/TcUnit-Verifier_DotNet/TcUnit-Verifier/Program.cs b/TcUnit-Verifier/TcUnit-Verifier_DotNet/TcUnit-Verifier/Program.cs index 8e231bd..a492134 100644 --- a/TcUnit-Verifier/TcUnit-Verifier_DotNet/TcUnit-Verifier/Program.cs +++ b/TcUnit-Verifier/TcUnit-Verifier_DotNet/TcUnit-Verifier/Program.cs @@ -7,6 +7,7 @@ using TCatSysManagerLib; using System.Threading; using EnvDTE80; +using System.Text.RegularExpressions; namespace TcUnit.Verifier { @@ -108,8 +109,12 @@ static void Main(string[] args) bool numberOfTestsLineFound = false; bool numberOfSuccesfulTestsLineFound = false; bool numberOfFailedTestsLineFound = false; + bool durationLineFound = false; bool testsFinishedRunningLastLineFound = false; int numberOfFailedTests = 0; + float duration; + + const string durationStr = "| Duration:"; log.Info("Waiting for TcUnit-Verifier_TwinCAT to finish running tests..."); @@ -139,6 +144,11 @@ static void Main(string[] args) // Grab the number of failed tests so we can validate it during the assertion phase numberOfFailedTests = int.Parse(error.Description.Split().Last()); } + if (error.Description.Contains(durationStr)) + { + int durationIndex = error.Description.IndexOf(durationStr); + durationLineFound = float.TryParse(error.Description.Substring(durationIndex + durationStr.Length), out duration); + } if (error.Description.Contains("| ======================================")) testsFinishedRunningLastLineFound = true; } @@ -148,7 +158,8 @@ static void Main(string[] args) && numberOfTestSuitesLineFound && numberOfTestsLineFound && numberOfSuccesfulTestsLineFound - && numberOfFailedTestsLineFound + && numberOfFailedTestsLineFound + && durationLineFound && testsFinishedRunningLastLineFound ) break; diff --git a/TcUnit-Verifier/TcUnit-Verifier_DotNet/TcUnit-Verifier/TestFunctionBlockAssert.cs b/TcUnit-Verifier/TcUnit-Verifier_DotNet/TcUnit-Verifier/TestFunctionBlockAssert.cs index 570b305..20e0710 100644 --- a/TcUnit-Verifier/TcUnit-Verifier_DotNet/TcUnit-Verifier/TestFunctionBlockAssert.cs +++ b/TcUnit-Verifier/TcUnit-Verifier_DotNet/TcUnit-Verifier/TestFunctionBlockAssert.cs @@ -2,6 +2,7 @@ using log4net; using System.Collections.Generic; using System.Linq; +using System.Text.RegularExpressions; namespace TcUnit.Verifier { @@ -46,12 +47,24 @@ protected string CreateFailedTestMessageNoAssertionMessage(string method, string private bool AreErrorItemsContainingTestMessage(string testMessage, vsBuildErrorLevel errorLevel) { - return _errors.Any(e => (e.Description.Contains(testMessage.ToUpper())) && e.ErrorLevel.Equals(errorLevel)); + // no regex needed, do a fast check + if(!testMessage.Contains("%f")) + return _errors.Any(e => e.Description.Contains(testMessage.ToUpper()) && e.ErrorLevel.Equals(errorLevel)); + + // convert number placeholders (%f) to a regex that matches floating point values + testMessage = @".*?" + Regex.Escape(testMessage).Replace("%f", @"[+-]?(\d+([.]\d*)?([eE][+-]?\d+)?|[.]\d+([eE][+-]?\d+)?)") + @".*?"; + return _errors.Any(e => Regex.Match(e.Description, testMessage, RegexOptions.IgnoreCase).Success && e.ErrorLevel.Equals(errorLevel)); } private int CountErrorItemsContainingTestMessage(string testMessage, vsBuildErrorLevel errorLevel) { - return _errors.Count(s => (s.Description.Contains(testMessage.ToUpper())) && s.ErrorLevel.Equals(errorLevel)); + // no regex needed, do a fast check + if (!testMessage.Contains("%f")) + return _errors.Count(e => e.Description.Contains(testMessage.ToUpper()) && e.ErrorLevel.Equals(errorLevel)); + + // convert number placeholders (%f) to a regex that matches floating point values + testMessage = @".*?" + Regex.Escape(testMessage).Replace("%f", @"[+-]?(\d+([.]\d*)?([eE][+-]?\d+)?|[.]\d+([eE][+-]?\d+)?)") + @".*?"; + return _errors.Count(e => Regex.Match(e.Description, testMessage, RegexOptions.IgnoreCase).Success && e.ErrorLevel.Equals(errorLevel)); } protected void AssertMessageCount(string message, int messageCount, vsBuildErrorLevel errorLevel) diff --git a/TcUnit/TcUnit/DUTs/ST_TestCaseResult.TcDUT b/TcUnit/TcUnit/DUTs/ST_TestCaseResult.TcDUT index 50df1fa..ecabb4f 100644 --- a/TcUnit/TcUnit/DUTs/ST_TestCaseResult.TcDUT +++ b/TcUnit/TcUnit/DUTs/ST_TestCaseResult.TcDUT @@ -10,6 +10,7 @@ STRUCT FailureMessage : Tc2_System.T_MaxString; FailureType : E_AssertionType; NumberOfAsserts : UINT; + Duration : LREAL; // in seconds END_STRUCT END_TYPE]]> diff --git a/TcUnit/TcUnit/DUTs/ST_TestSuiteResult.TcDUT b/TcUnit/TcUnit/DUTs/ST_TestSuiteResult.TcDUT index 4e6c70a..db0168b 100644 --- a/TcUnit/TcUnit/DUTs/ST_TestSuiteResult.TcDUT +++ b/TcUnit/TcUnit/DUTs/ST_TestSuiteResult.TcDUT @@ -7,6 +7,7 @@ STRUCT Identity : UINT(0..GVL_Param_TcUnit.MaxNumberOfTestSuites); // Should be 0..GVL_Param_TcUnit.MaxNumberOfTestSuites-1 but gives unknown compiler error NumberOfTests : UINT(0..GVL_Param_TcUnit.MaxNumberOfTestsForEachTestSuite); NumberOfFailedTests : UINT(0..GVL_Param_TcUnit.MaxNumberOfTestsForEachTestSuite); + Duration : LREAL; // in seconds TestCaseResults : ARRAY[1..GVL_Param_TcUnit.MaxNumberOfTestsForEachTestSuite] OF ST_TestCaseResult; END_STRUCT END_TYPE]]> diff --git a/TcUnit/TcUnit/DUTs/ST_TestSuiteResults.TcDUT b/TcUnit/TcUnit/DUTs/ST_TestSuiteResults.TcDUT index ffdd1c6..cec09d8 100644 --- a/TcUnit/TcUnit/DUTs/ST_TestSuiteResults.TcDUT +++ b/TcUnit/TcUnit/DUTs/ST_TestSuiteResults.TcDUT @@ -8,7 +8,8 @@ STRUCT NumberOfTestCases : UINT; // The total number of test cases (for all test suites) NumberOfSuccessfulTestCases : UINT; // The total number of test cases that had all ASSERTS successful NumberOfFailedTestCases : UINT; // The total number of test cases that had at least one ASSERT failed - + Duration : LREAL; // Duration it took for all test suites to finish, in seconds + (* Test results for each individiual test suite *) TestSuiteResults : ARRAY[1..GVL_Param_TcUnit.MaxNumberOfTestSuites] OF ST_TestSuiteResult; END_STRUCT diff --git a/TcUnit/TcUnit/GVLs/GVL_TcUnit.TcGVL b/TcUnit/TcUnit/GVLs/GVL_TcUnit.TcGVL index a5393bb..b853da2 100644 --- a/TcUnit/TcUnit/GVLs/GVL_TcUnit.TcGVL +++ b/TcUnit/TcUnit/GVLs/GVL_TcUnit.TcGVL @@ -14,6 +14,15 @@ VAR_GLOBAL (* Current name of test being called *) CurrentTestNameBeingCalled : Tc2_System.T_MaxString; + + (* Used to get the current cpu cycle counter to calculate the duration of tests and test suits, respectively *) + GetCpuCounter : Tc2_System.GETCPUCOUNTER; + + (* Stores the CPU cycle count with 100ns precision since the first entry into one of the Run methods (RUN, RUN_IN_SEQUENCE) *) + StartedAt : LWORD; + + (* Duration it took for a complete run, in seconds *) + Duration : LREAL; (* Whether or not the current test being called has finished running *) CurrentTestIsFinished : BOOL; @@ -35,6 +44,11 @@ VAR_GLOBAL (* Buffered ADS message queue for output to the error list *) AdsMessageQueue : FB_AdsLogStringMessageFifoQueue; +END_VAR +VAR_GLOBAL CONSTANT + (* Multiply a value that is given in 100ns units by this value to + convert the value to seconds *) + HundredNanosecondToSecond : LREAL := 1.0 / 10000000.0; END_VAR]]> \ No newline at end of file diff --git a/TcUnit/TcUnit/POUs/FB_AdsTestResultLogger.TcPOU b/TcUnit/TcUnit/POUs/FB_AdsTestResultLogger.TcPOU index d3837df..4766631 100644 --- a/TcUnit/TcUnit/POUs/FB_AdsTestResultLogger.TcPOU +++ b/TcUnit/TcUnit/POUs/FB_AdsTestResultLogger.TcPOU @@ -74,7 +74,11 @@ IF PrintingTestSuiteResultNumber <= GVL_TcUnit.NumberOfInitializedTestSuites AND STR2 := ', number of failed tests='); StringToPrint := Tc2_Standard.CONCAT(STR1 := StringToPrint, STR2 := UINT_TO_STRING(TcUnitTestResults.TestSuiteResults[PrintingTestSuiteResultNumber].NumberOfFailedTests)); - + StringToPrint := Tc2_Standard.CONCAT(STR1 := StringToPrint, + STR2 := ', duration='); + StringToPrint := Tc2_Standard.CONCAT(STR1 := StringToPrint, + STR2 := LREAL_TO_STRING(TcUnitTestResults.TestSuiteResults[PrintingTestSuiteResultNumber].Duration)); + GVL_TcUnit.AdsMessageQueue.WriteLog(MsgCtrlMask := Tc2_System.ADSLOG_MSGTYPE_HINT, MsgFmtStr := StringToPrint, StrArg := ''); @@ -96,7 +100,11 @@ IF PrintingTestSuiteResultNumber <= GVL_TcUnit.NumberOfInitializedTestSuites AND GVL_TcUnit.AdsMessageQueue.WriteLog(MsgCtrlMask := Tc2_System.ADSLOG_MSGTYPE_HINT, MsgFmtStr := '| Test class name=%s', StrArg := TcUnitTestResults.TestSuiteResults[PrintingTestSuiteResultNumber].TestCaseResults[TestsInTestSuiteCounter].TestClassName); - + (* Print test duration *) + GVL_TcUnit.AdsMessageQueue.WriteLog(MsgCtrlMask := Tc2_System.ADSLOG_MSGTYPE_HINT, + MsgFmtStr := '| Test duration=%s', + StrArg := LREAL_TO_STRING(TcUnitTestResults.TestSuiteResults[PrintingTestSuiteResultNumber].TestCaseResults[TestsInTestSuiteCounter].Duration)); + (* Print test result/status (SUCCESS, FAILED, SKIPPED) + number of assertions made *) IF TcUnitTestResults.TestSuiteResults[PrintingTestSuiteResultNumber].TestCaseResults[TestsInTestSuiteCounter].TestIsFailed THEN StringToPrint := Tc2_Standard.CONCAT(STR1 := '| Test status=', STR2 := TEST_STATUS_FAIL); @@ -109,6 +117,9 @@ IF PrintingTestSuiteResultNumber <= GVL_TcUnit.NumberOfInitializedTestSuites AND StringToPrint := Tc2_Standard.CONCAT(STR1 := StringToPrint, STR2 := ', number of asserts='); StringToPrint := Tc2_Standard.CONCAT(STR1 := StringToPrint, STR2 := UINT_TO_STRING(TcUnitTestResults.TestSuiteResults[PrintingTestSuiteResultNumber].TestCaseResults[TestsInTestSuiteCounter].NumberOfAsserts)); + StringToPrint := Tc2_Standard.CONCAT(STR1 := StringToPrint, STR2 := ', duration='); + StringToPrint := Tc2_Standard.CONCAT(STR1 := StringToPrint, STR2 := + LREAL_TO_STRING(TcUnitTestResults.TestSuiteResults[PrintingTestSuiteResultNumber].TestCaseResults[TestsInTestSuiteCounter].Duration)); GVL_TcUnit.AdsMessageQueue.WriteLog(MsgCtrlMask := Tc2_System.ADSLOG_MSGTYPE_HINT, MsgFmtStr := StringToPrint, StrArg := ''); @@ -168,6 +179,9 @@ IF (GVL_TcUnit.NumberOfInitializedTestSuites = 0 OR PrintingTestSuiteResultNumbe GVL_TcUnit.AdsMessageQueue.WriteLog(MsgCtrlMask := Tc2_System.ADSLOG_MSGTYPE_ERROR, MsgFmtStr := '| Failed tests: %s', StrArg := UINT_TO_STRING(TcUnitTestResults.NumberOfFailedTestCases)); + GVL_TcUnit.AdsMessageQueue.WriteLog(MsgCtrlMask := Tc2_System.ADSLOG_MSGTYPE_ERROR, + MsgFmtStr := '| Duration: %s', + StrArg := LREAL_TO_STRING(TcUnitTestResults.Duration)); GVL_TcUnit.AdsMessageQueue.WriteLog(MsgCtrlMask := Tc2_System.ADSLOG_MSGTYPE_ERROR, MsgFmtStr := '%s', StrArg := '| ======================================'); diff --git a/TcUnit/TcUnit/POUs/FB_TcUnitRunner.TcPOU b/TcUnit/TcUnit/POUs/FB_TcUnitRunner.TcPOU index bf8a2d3..57b0107 100644 --- a/TcUnit/TcUnit/POUs/FB_TcUnitRunner.TcPOU +++ b/TcUnit/TcUnit/POUs/FB_TcUnitRunner.TcPOU @@ -8,6 +8,7 @@ FUNCTION_BLOCK FB_TcUnitRunner VAR (* Indication of whether all test suites have reported that they are finished *) AllTestSuitesFinished : BOOL := FALSE; + AllTestSuitesFinishedTrigger : R_TRIG; (* Test result information *) TestResults : FB_TestResults; @@ -49,7 +50,11 @@ VAR NumberOfTestSuitesFinished : UINT := 0; END_VAR]]> - - @@ -36,6 +39,12 @@ END_VAR]]> + + + + + + @@ -104,9 +113,13 @@ END_IF]]> - + - + @@ -134,6 +147,18 @@ METHOD INTERNAL SetSkipped]]> + + + + + + - +END_IF + +AddTest REF= GetTestByName(TrimmedTestName);]]> @@ -3642,10 +3649,16 @@ METHOD PRIVATE FindTestSuiteInstancePath : Tc2_System.T_MaxString]]> + + + + + + - + 0;]]> @@ -3717,6 +3730,26 @@ GetNumberOfSkippedTests := SkippedTestsCount;]]> + + + + + + - + @@ -3807,6 +3841,7 @@ END_FOR]]> METHOD INTERNAL SetTestFinished : BOOL; VAR_INPUT TestName : Tc2_System.T_MaxString; + FinishedAt : LWORD; END_VAR VAR IteratorCounter : UINT; @@ -3817,7 +3852,7 @@ END_VAR]]> NumberOfTestsToAnalyse := GetNumberOfTestsToAnalyse(); FOR IteratorCounter := 1 TO NumberOfTestsToAnalyse BY 1 DO IF Tests[IteratorCounter].GetName() = TestName THEN - Tests[IteratorCounter].SetFinished(); + Tests[IteratorCounter].SetFinished(FinishedAt := FinishedAt); SetTestFinished := TRUE; RETURN; END_IF @@ -3825,5 +3860,11 @@ END_FOR SetTestFinished := FALSE;]]> + + + + + + \ No newline at end of file diff --git a/TcUnit/TcUnit/POUs/FB_xUnitXmlPublisher.TcPOU b/TcUnit/TcUnit/POUs/FB_xUnitXmlPublisher.TcPOU index 80e1f4d..23ff02c 100644 --- a/TcUnit/TcUnit/POUs/FB_xUnitXmlPublisher.TcPOU +++ b/TcUnit/TcUnit/POUs/FB_xUnitXmlPublisher.TcPOU @@ -103,6 +103,7 @@ IF PublishTrigger.Q THEN Xml.NewParameter('disabled', ''); Xml.NewParameter('failures', UINT_TO_STRING(UnitTestResults.NumberOfFailedTestCases)); Xml.NewParameter('tests', UINT_TO_STRING(UnitTestResults.NumberOfSuccessfulTestCases)); + Xml.NewParameter('time', LREAL_TO_STRING(UnitTestResults.Duration)); FOR CurrentSuiteNumber := 1 TO UnitTestResults.NumberOfTestSuites BY 1 DO (* *) @@ -111,12 +112,14 @@ IF PublishTrigger.Q THEN Xml.NewParameter('name', UnitTestResults.TestSuiteResults[CurrentSuiteNumber].name); Xml.NewParameter('tests', UINT_TO_STRING(UnitTestResults.TestSuiteResults[CurrentSuiteNumber].NumberOfTests)); Xml.NewParameter('failures', UINT_TO_STRING(UnitTestResults.TestSuiteResults[CurrentSuiteNumber].NumberOfFailedTests)); - + Xml.NewParameter('time', LREAL_TO_STRING(UnitTestResults.TestSuiteResults[CurrentSuiteNumber].Duration)); + FOR CurrentTestCount := 1 TO UnitTestResults.TestSuiteResults[CurrentSuiteNumber].NumberOfTests BY 1 DO (* *) Xml.NewTag('testcase'); Xml.NewParameter('name', UnitTestResults.TestSuiteResults[CurrentSuiteNumber].TestCaseResults[CurrentTestCount].TestName); Xml.NewParameter('classname', UnitTestResults.TestSuiteResults[CurrentSuiteNumber].TestCaseResults[CurrentTestCount].TestClassName); + Xml.NewParameter('time', LREAL_TO_STRING(UnitTestResults.TestSuiteResults[CurrentSuiteNumber].TestCaseResults[CurrentTestCount].Duration)); IF UnitTestResults.TestSuiteResults[CurrentSuiteNumber].TestCaseResults[CurrentTestCount].TestIsFailed THEN Xml.NewParameter('status', TEST_STATUS_FAIL); diff --git a/TcUnit/TcUnit/POUs/Functions/F_GetCpuCounterAs64bit.TcPOU b/TcUnit/TcUnit/POUs/Functions/F_GetCpuCounterAs64bit.TcPOU new file mode 100644 index 0000000..002f022 --- /dev/null +++ b/TcUnit/TcUnit/POUs/Functions/F_GetCpuCounterAs64bit.TcPOU @@ -0,0 +1,18 @@ + + + + + + + + + \ No newline at end of file diff --git a/TcUnit/TcUnit/POUs/Functions/TEST.TcPOU b/TcUnit/TcUnit/POUs/Functions/TEST.TcPOU index ada271b..ce1fc23 100644 --- a/TcUnit/TcUnit/POUs/Functions/TEST.TcPOU +++ b/TcUnit/TcUnit/POUs/Functions/TEST.TcPOU @@ -8,6 +8,7 @@ VAR_INPUT END_VAR VAR CounterTestSuiteAddress : UINT; + Test : REFERENCE TO FB_Test; END_VAR]]> diff --git a/TcUnit/TcUnit/POUs/Functions/TEST_FINISHED.TcPOU b/TcUnit/TcUnit/POUs/Functions/TEST_FINISHED.TcPOU index 631c4b3..d4c5245 100644 --- a/TcUnit/TcUnit/POUs/Functions/TEST_FINISHED.TcPOU +++ b/TcUnit/TcUnit/POUs/Functions/TEST_FINISHED.TcPOU @@ -1,14 +1,18 @@  - + - *) FOR Counter := 1 TO GVL_TcUnit.NumberOfInitializedTestSuites BY 1 DO IF GVL_TcUnit.TestSuiteAddresses[Counter] = GVL_TcUnit.CurrentTestSuiteBeingCalled THEN - FoundTestName := GVL_TcUnit.TestSuiteAddresses[Counter]^.SetTestFinished(TestName := TestName); + FoundTestName := GVL_TcUnit.TestSuiteAddresses[Counter]^.SetTestFinished(TestName := TestName, FinishedAt := FinishedAt); IF NOT FoundTestName THEN IF FailedLookupCounter < MaxNumberOfNonExistentTestNamesFailedLookups THEN GVL_TcUnit.AdsMessageQueue.WriteLog(MsgCtrlMask := Tc2_System.ADSLOG_MSGTYPE_ERROR, @@ -51,4 +53,4 @@ FOR Counter := 1 TO GVL_TcUnit.NumberOfInitializedTestSuites BY 1 DO END_FOR]]> - \ No newline at end of file + diff --git a/TcUnit/TcUnit/TcUnit.plcproj b/TcUnit/TcUnit/TcUnit.plcproj index c3b39fd..c2a16de 100644 --- a/TcUnit/TcUnit/TcUnit.plcproj +++ b/TcUnit/TcUnit/TcUnit.plcproj @@ -32,7 +32,7 @@ Documentation and examples are available at www.tcunit.org www.tcunit.org Jakob Sagatowski and contributors - 1.2.1.0 + 1.2.2.0 @@ -148,6 +148,9 @@ Documentation and examples are available at www.tcunit.org Code + + Code + Code diff --git a/TcUnit/TcUnit/Version/Global_Version.TcGVL b/TcUnit/TcUnit/Version/Global_Version.TcGVL index 4d7d59f..b9e265d 100644 --- a/TcUnit/TcUnit/Version/Global_Version.TcGVL +++ b/TcUnit/TcUnit/Version/Global_Version.TcGVL @@ -7,7 +7,7 @@ // This function has been automatically generated from the project information. VAR_GLOBAL CONSTANT {attribute 'const_non_replaced'} - stLibVersion_TcUnit : ST_LibVersion := (iMajor := 1, iMinor := 2, iBuild := 1, iRevision := 0, sVersion := '1.2.1.0'); + stLibVersion_TcUnit : ST_LibVersion := (iMajor := 1, iMinor := 2, iBuild := 2, iRevision := 0, sVersion := '1.2.2.0'); END_VAR ]]>