=== modified file 'build.gradle'
--- build.gradle	2022-09-28 14:01:21 +0000
+++ build.gradle	2022-09-30 17:53:26 +0000
@@ -102,6 +102,8 @@
 **     IAS 20220816 Added MariaDB udfs.sql to the p2j.jar
 **     OM  20220812 Upgraded mariadb JDBC driver from 2.7.3 to 3.0.7 GA.
 **     TW  20220928 Changed junixsocket dependency to official repository, and upped its version to latest.
+**     VVT 2022xxxx JUnit5 dependencies updated to support both existing tests and custom test engine.
+**                  See #6237.
 */
 
 /*
@@ -581,7 +583,20 @@
        aspectjCompile group: 'org.aspectj', name: 'aspectjweaver', version: aspectjVersion
     }
 
-    fwdAllTest group: 'org.junit.platform', name: 'junit-platform-console-standalone', version: '1.7.1'
+    // Adding JUnit5 jar both to client and server, so it will be also deployed to converted projects
+    fwdClientServer group: 'org.junit.platform',
+                    name: 'junit-platform-engine',
+                    version: '1.9.0'
+
+    fwdAllTest group: 'org.junit.platform',
+                    name: 'junit-platform-suite-engine',
+                    version: '1.9.0'
+    fwdAllTest group: 'org.junit.platform',
+                    name: 'junit-platform-console',
+                    version: '1.9.0'
+    fwdAllTest group: 'org.junit.platform',
+                    name: 'junit-platform-engine',
+                    version: '1.9.0'
 }
 
 // inject ant-optional dependencies to ant, this is needed for the antlr ant target

=== modified file 'rules/annotations/annotations.xml'
--- rules/annotations/annotations.xml	2022-09-14 15:07:57 +0000
+++ rules/annotations/annotations.xml	2022-09-30 11:50:03 +0000
@@ -263,8 +263,8 @@
 **                           element.
 **     VVT 20220913          OEUnit support: annotations/unit_test_support added. See #6237.
 **     VVT 20220913          Prevent unsupported legacy annotations from going to Java code. See #6237.
-**     VVT 20220914          Changes in revs. 14243,14241,14239 temporarily reverted until JUnit runtime
-**                           support is added to client projects.
+**     VVT 2022xxxx          Two more rulesets processed: unit_test_support and legacy_annotations_post.
+**                           See #6237.
 */
  -->
  
@@ -678,8 +678,8 @@
    <rule-set name="annotations/method_defs" />
    <rule-set name="annotations/procedures" />
    <rule-set name="annotations/legacy_services" />
-   <!-- <rule-set name="annotations/unit_test_support" /> -->
-   <!-- <rule-set name="annotations/legacy_annotations_post" /> -->
+   <rule-set name="annotations/unit_test_support" />
+   <rule-set name="annotations/legacy_annotations_post" />
    <rule-set name="annotations/case_statements" />
    <rule-set name="annotations/input_output" />
    <rule-set name="annotations/assignment_style_stmt_rewriting" />

=== modified file 'rules/annotations/legacy_services.rules'
--- rules/annotations/legacy_services.rules	2022-09-14 15:07:57 +0000
+++ rules/annotations/legacy_services.rules	2022-09-30 11:51:48 +0000
@@ -21,8 +21,7 @@
 ** 005 VVT 20220913 OEUnit support: code removing all annotations removed. See #6237.
 **     VVT 20220913 Prevent unsupported legacy annotations from going to Java code. See #6237.
 **                  Use new create_java_annotation() function to create Java annotation nodes.
-**     VVT 20220914 Changes in revs. 14243,14241,14239 temporarily reverted until JUnit runtime
-**                  support is added to client projects.
+**     VVT 2022xxxx Changes in revs. 14243,14241,14239 restored. See #6237.
 */
  -->
  
@@ -212,9 +211,8 @@
             <while>iter.hasNext()
                <action>prest = iter.next()</action>
                
-               <action>ref = createProgressAst(prog.annotation, "@", pref)</action>
-               <action>ref.putAnnotation("javaname", "LegacyServiceParameter")</action>
-               <action>ref.putAnnotation("name", "LegacyServiceParameter")</action>
+               
+               <action>ref = execLib("create_java_annotation", pref, "LegacyServiceParameter", -1)</action>
                
                <rule>execLib("assign_field_int", ref, "ordinal", prest.ordinal())</rule>
                
@@ -308,7 +306,8 @@
             <rule>keep
                <action>hasSrvs = true</action>
                
-               <action on="false">ref.remove()</action>
+               <!-- Do NOT remove unsupported annotations here, they will be removed in legacy_annotations_post.rules -->
+               <!-- <action on="false">ref.remove()</action> -->
             </rule>
          </while>
       </function>
@@ -343,9 +342,7 @@
          
          <action>hasSrvs = true</action>
          
-         <action>ref = createProgressAst(prog.annotation, "@", copy, 1)</action>
-         <action>ref.putAnnotation("javaname", "LegacyService")</action>
-         <action>ref.putAnnotation("name", "LegacyService")</action>
+         <action>ref = execLib("create_java_annotation", copy, "LegacyService", 1)</action>
          
          <action>execLib("assign_field", ref, "type", "SOAP")</action>
          <action>execLib("assign_field", ref, "namespace", soapOp.getNamespace())</action>
@@ -401,9 +398,7 @@
             <action>soapOp = iter.next()</action>
             <action>hasSrvs = true</action>
 
-            <action>ref = createProgressAst(prog.annotation, "@", copy, 1)</action>
-            <action>ref.putAnnotation("javaname", "LegacyService")</action>
-            <action>ref.putAnnotation("name", "LegacyService")</action>
+            <action>ref = execLib("create_java_annotation", copy, "LegacyService", 1)</action>
             
             <action>execLib("assign_field", ref, "type", "SOAP")</action>
             <action>execLib("assign_field", ref, "namespace", soapOp.getNamespace())</action>
@@ -419,9 +414,7 @@
       <rule>this.type == prog.class_def and srv.isWebHandler(oname)
          <action>hasSrvs = true</action>
          
-         <action>ref = createProgressAst(prog.annotation, "@", copy, 1)</action>
-         <action>ref.putAnnotation("javaname", "LegacyService")</action>
-         <action>ref.putAnnotation("name", "LegacyService")</action>
+         <action>ref = execLib("create_java_annotation", copy, "LegacyService", 1)</action>
          
          <rule>execLib("assign_field", ref, "name", srv.getSection(oname))</rule>
          <rule>execLib("assign_field", ref, "type", "WEBHANDLER")</rule>
@@ -432,9 +425,7 @@
          <while>iter.hasNext()
             <action>path = iter.next()</action>
 
-            <action>ref = createProgressAst(prog.annotation, "@", pref)</action>
-            <action>ref.putAnnotation("javaname", "LegacyWebPath")</action>
-            <action>ref.putAnnotation("name", "LegacyWebPath")</action>
+            <action>ref = execLib("create_java_annotation", pref, "LegacyWebPath", -1)</action>
 
             <action>execLib("assign_field", ref, "path", path.path())</action>
             <action>execLib("assign_field_int", ref, "order", path.order())</action>

=== modified file 'rules/annotations/unit_test_support.rules'
--- rules/annotations/unit_test_support.rules	2022-09-13 16:57:43 +0000
+++ rules/annotations/unit_test_support.rules	2022-09-30 11:57:33 +0000
@@ -9,6 +9,8 @@
 ** _#_ _I_ __Date__  ___________________________Description____________________________
 ** 001 VVT 20220913  Initial version
 **     VVT 20220913  Prevent unsupported legacy annotations from going to Java code. See #6237.
+**     VVT 2022xxxx Custom test engine annotations are now used instead of that
+**                  from the Jupiter test engine. See #6237.
 */
  -->
 <!--
@@ -65,30 +67,62 @@
 -->
 <rule-set>
    <worker class="com.goldencode.p2j.uast.ProgressPatternWorker" namespace="prog" />
+   <worker class="com.goldencode.p2j.uast.UastHintsWorker"       namespace="hints" />
    <walk-rules>
       <rule>this.type == prog.annotation
             and parent.type == prog.method_def
+            
+         <!-- Get required unit test legacy type configuration (hints) -->
+         <variable name="unitTestType" type="java.lang.String" />
+         <action>unitTestType = hints.getUnitTestType()</action>
+         <rule>unitTestType == null
+            <action>compileError(223, "No unit test legacy type is configured")</action>
+         </rule>
+         
+         <variable name="isABLUnit" type="java.lang.Boolean" />
+         <action>isABLUnit = unitTestType.equals("ABLUnit")</action>
+
+         <variable name="methodNode" type="com.goldencode.ast.Aast" />
+         <action>methodNode = parent.firstChild</action>
+
+         <!-- FIXME: Add similar support for procedures -->
 
          <!-- Get initial annotation name -->
          <variable name="annoName" type="java.lang.String" />
          <action>annoName = this.getAnnotation("javaname")</action>
 
+         <action>printfln("method %s is ABL unit test type %s annoName @%s", methodNode.getAnnotation("name"), isABLUnit, annoName)</action>
+
          <variable name="newName" type="java.lang.String" />
          <action>newName = null</action>
 
-         <!-- Replace OEUnit annotation names (made after JUnit 4) by JUnit 5 names -->
-         <rule>annoName.equals("Test")
-            <action>newName = "org.junit.jupiter.api.Test"</action>
-            <rule on="false">annoName.equals("Before")
-               <action>newName = "org.junit.jupiter.api.BeforeEach"</action>
-               <rule on="false">annoName.equals("After")
-                  <action>newName = "org.junit.jupiter.api.AfterEach"</action>
-                  <rule on="false">annoName.equals("BeforeClass")
-                     <action>newName = "org.junit.jupiter.api.BeforeAll"</action>
-                     <rule on="false">annoName.equals("AfterClass")
-                        <action>newName = "org.junit.jupiter.api.AfterAll"</action>
-                        <rule on="false">annoName.equals("Ignore")
-                           <action>newName = "org.junit.jupiter.api.Disabled"</action>
+         <!-- Replace OEUnit/ABLUnit annotation names by corresponding JUnit5 names -->
+         <rule>annoName.equalsIgnoreCase("Test")
+            <action>newName = "com.goldencode.p2j.testengine.api.Test"</action>
+
+            <!-- Note: the meaning of @Before and @After is opposite in ABLUnit and OEUnit -->
+            <rule on="false">annoName.equalsIgnoreCase("Before")
+               <rule>isABLUnit
+                  <action>newName = "com.goldencode.p2j.testengine.api.BeforeAll"</action>
+                  <action on="false">newName = "com.goldencode.p2j.testengine.api.BeforeEach"</action>
+               </rule>
+               <rule on="false">annoName.equalsIgnoreCase("After")
+                  <rule>isABLUnit
+                     <action>newName = "com.goldencode.p2j.testengine.api.AfterAll"</action>
+                     <action on="false">newName = "com.goldencode.p2j.testengine.api.AfterEach"</action>
+                  </rule>
+                  <rule on="false">annoName.equalsIgnoreCase("BeforeClass")
+                     <action>newName = "com.goldencode.p2j.testengine.api.BeforeAll"</action>
+                     <rule on="false">annoName.equalsIgnoreCase("AfterClass")
+                        <action>newName = "com.goldencode.p2j.testengine.api.AfterAll"</action>
+                        <rule on="false">annoName.equalsIgnoreCase("Ignore")
+                           <action>newName = "com.goldencode.p2j.testengine.api.Disabled"</action>
+                        </rule>
+                        <rule on="false">annoName.equalsIgnoreCase("Setup")
+                           <action>newName = "com.goldencode.p2j.testengine.api.BeforeEach"</action>
+                           <rule on="false">annoName.equalsIgnoreCase("TearDown")
+                              <action>newName = "com.goldencode.p2j.testengine.api.AfterEach"</action>
+                           </rule>
                         </rule>
                      </rule>
                   </rule>
@@ -97,9 +131,11 @@
          </rule>
 
          <rule>newName != null
-           <!-- Write it back and mark "our" annotations as preserved -->
-           <action>copy.putAnnotation("javaname", newName)</action>
-           <action>copy.putAnnotation("fwd", true)</action>
+            <action>printfln("newName %s", newName)</action>
+            <!-- Write it back... -->
+            <action>copy.putAnnotation("javaname", newName)</action>
+            <!-- ...and mark "our" annotations as preserved -->
+            <action>copy.putAnnotation("fwd", true)</action>
          </rule>
       </rule>
       

=== modified file 'rules/convert/core_conversion.xml'
--- rules/convert/core_conversion.xml	2022-09-14 15:07:57 +0000
+++ rules/convert/core_conversion.xml	2022-09-30 11:59:12 +0000
@@ -71,6 +71,7 @@
 ** 026 VVT 20220913          OEUnit support: convert/unit_test_support added. See #6237.
 **     VVT 20220914          Changes in revs. 14243,14241,14239 temporarily reverted until JUnit runtime
 **                           support is added to client projects.
+**     VVT 2022xxxx          Changes in revs. 14243,14241,14239 restored. See #6237.
 */
  -->
  
@@ -184,7 +185,7 @@
         Progress source constructs into the equivalent Java constructs
         rooted in the Java AST -->
    <rule-set honor-hidden="true" input="tree" load-condition="runtime-query">
-      <!-- <rule-set name="convert/unit_test_support" /> -->
+      <rule-set name="convert/unit_test_support" />
       <rule-set name="convert/variable_definitions" />
       <!-- the order of the following rules is important - method_definitions' ascent-rules will
            emit the signature's parameter annotations -->

=== modified file 'rules/convert/unit_test_support.rules'
--- rules/convert/unit_test_support.rules	2022-09-13 16:57:43 +0000
+++ rules/convert/unit_test_support.rules	2022-09-30 12:00:04 +0000
@@ -9,6 +9,8 @@
 ** _#_ _I_ __Date__  ___________________________Description____________________________
 ** 001 VVT 20220913  Initial version
 **     VVT 20220913  Prevent unsupported legacy annotations from going to Java code. See #6237.
+**     VVT 2022xxxx  Custom test engine annotations are now used instead of that
+**                   from the Jupiter test engine. See #6237.
 */
  -->
 <!--
@@ -75,21 +77,21 @@
          <variable name="annoName" type="java.lang.String" />
          <action>annoName = this.getAnnotation("javaname")</action>
          <rule>
-            annoName.equals("org.junit.jupiter.api.Test") or
-            annoName.equals("org.junit.jupiter.api.BeforeEach") or
-            annoName.equals("org.junit.jupiter.api.AfterEach")  or
-            annoName.equals("org.junit.jupiter.api.BeforeAll")  or
-            annoName.equals("org.junit.jupiter.api.AfterAll")   or
-            annoName.equals("org.junit.jupiter.api.Disabled")
+            annoName.equals("com.goldencode.p2j.testengine.api.Test") or
+            annoName.equals("com.goldencode.p2j.testengine.api.BeforeEach") or
+            annoName.equals("com.goldencode.p2j.testengine.api.AfterEach")  or
+            annoName.equals("com.goldencode.p2j.testengine.api.BeforeAll")  or
+            annoName.equals("com.goldencode.p2j.testengine.api.AfterAll")   or
+            annoName.equals("com.goldencode.p2j.testengine.api.Disabled")
             <!-- Replace fully-qualified name by simple name -->
-            <action>copy.putAnnotation("javaname", annoName.substring(22))</action>
+            <action>copy.putAnnotation("javaname", annoName.substring(34))</action>
             <action>hasJUnit5Annotations = true</action>
          </rule>
       </rule>
    </walk-rules>
    <post-rules>
       <rule>hasJUnit5Annotations == true
-         <action>help.createImport("org.junit.jupiter.api.*")</action>
+         <action>help.createImport("com.goldencode.p2j.testengine.api.*")</action>
          <action>hasJUnit5Annotations = false</action>
       </rule>
    </post-rules>

=== modified file 'src/com/goldencode/p2j/cfg/Configuration.java'
--- src/com/goldencode/p2j/cfg/Configuration.java	2022-04-22 22:17:35 +0000
+++ src/com/goldencode/p2j/cfg/Configuration.java	2022-09-30 11:47:48 +0000
@@ -75,6 +75,7 @@
 **     CA  20220412          Added file-set support (either -Z command-line option or p2j.cfg.xml 
 **                           configuration).
 **     OM  20220421          Restored the ability to load the configuration file relative to P2J_HOME folder.
+**     VVT 2022xxxx          Constant added: default legacy unit test framework type. See #6237. 
 */
 
 /*
@@ -268,6 +269,9 @@
    /** Default configuration filename */
    public static final String DEF_CFG_FILE = "p2j.cfg.xml";
    
+   /** Default legacy unit test type */
+   public static final String DEF_UNIT_TEST_TYPE = "ABLUnit";
+   
    /** Singleton instance. */
    private static volatile Configuration instance;
    

=== added directory 'src/com/goldencode/p2j/testengine'
=== added file 'src/com/goldencode/p2j/testengine/FWDClassTestDescriptor.java'
--- src/com/goldencode/p2j/testengine/FWDClassTestDescriptor.java	1970-01-01 00:00:00 +0000
+++ src/com/goldencode/p2j/testengine/FWDClassTestDescriptor.java	2022-09-30 14:33:27 +0000
@@ -0,0 +1,268 @@
+/*
+** Module   : FWDClassTestDescriptor.java
+** Abstract : Test descriptor for a Java class.
+**
+** Copyright (c) 2022, Golden Code Development Corporation.
+**
+** -#- -I- --Date-- ----------------Description----------------------
+** 001 VVT 2022xxxx Created initial version.
+*/
+/*
+** This program is free software: you can redistribute it and/or modify
+** it under the terms of the GNU Affero General Public License as
+** published by the Free Software Foundation, either version 3 of the
+** License, or (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Affero General Public License for more details.
+**
+** You may find a copy of the GNU Affero GPL version 3 at the following
+** location: https://www.gnu.org/licenses/agpl-3.0.en.html
+** 
+** Additional terms under GNU Affero GPL version 3 section 7:
+** 
+**   Under Section 7 of the GNU Affero GPL version 3, the following additional
+**   terms apply to the works covered under the License.  These additional terms
+**   are non-permissive additional terms allowed under Section 7 of the GNU
+**   Affero GPL version 3 and may not be removed by you.
+** 
+**   0. Attribution Requirement.
+** 
+**     You must preserve all legal notices or author attributions in the covered
+**     work or Appropriate Legal Notices displayed by works containing the covered
+**     work.  You may not remove from the covered work any author or developer
+**     credit already included within the covered work.
+** 
+**   1. No License To Use Trademarks.
+** 
+**     This license does not grant any license or rights to use the trademarks
+**     Golden Code, FWD, any Golden Code or FWD logo, or any other trademarks
+**     of Golden Code Development Corporation. You are not authorized to use the
+**     name Golden Code, FWD, or the names of any author or contributor, for
+**     publicity purposes without written authorization.
+** 
+**   2. No Misrepresentation of Affiliation.
+** 
+**     You may not represent yourself as Golden Code Development Corporation or FWD.
+** 
+**     You may not represent yourself for publicity purposes as associated with
+**     Golden Code Development Corporation, FWD, or any author or contributor to
+**     the covered work, without written authorization.
+** 
+**   3. No Misrepresentation of Source or Origin.
+** 
+**     You may not represent the covered work as solely your work.  All modified
+**     versions of the covered work must be marked in a reasonable way to make it
+**     clear that the modified work is not originating from Golden Code Development
+**     Corporation or FWD.  All modified versions must contain the notices of
+**     attribution required in this license.
+*/
+package com.goldencode.p2j.testengine;
+
+import java.lang.annotation.*;
+import java.lang.reflect.*;
+import java.util.*;
+
+import org.junit.platform.commons.support.*;
+import org.junit.platform.commons.util.*;
+import org.junit.platform.engine.*;
+import org.junit.platform.engine.support.descriptor.*;
+import org.junit.platform.engine.support.hierarchical.*;
+
+import com.goldencode.p2j.testengine.api.*;
+
+/**
+ * Test descriptor for a Java class.
+ */
+public class FWDClassTestDescriptor
+extends AbstractTestDescriptor
+implements Node<FWDEngineExecutionContext>
+{
+
+   /**
+    * The Java class, referenced by child descriptors.
+    */
+   final Class<?> clazz;
+
+   /**
+    * The methods marked as {@link AfterAll}.
+    */
+   private final List<Method> afterAll;
+
+   /**
+    * The methods marked as {@link BeforeAll}.
+    */
+   private final List<Method> beforeAll;
+
+   /**
+    * Test a Java class candidate for existent tests methods. If found, create a new class
+    * test descriptor.
+    * 
+    * @param clazz
+    *        the class under test 
+    * @param parentDescriptor
+    *        the parent descriptor
+    * @param explicitMethods
+    *        the explicit method list or {@code null} to scan the class for all test methods
+    *        
+    * @return  the class test descriptor or {@code null} if this class has no test methods.
+    */
+   public static FWDClassTestDescriptor testAndCreate(final Class<?> clazz,
+            final TestDescriptor parentDescriptor, List<Method> explicitMethods)
+   {
+      // FIXME: find out if the test for abstract classes is really necessary.
+      // For example, Eclipse does not run abstract classes as JUnit test
+      if (Modifier.isAbstract(clazz.getModifiers()))
+      {
+         return null;
+      }
+
+      final List<Method> test = explicitMethods != null ? explicitMethods
+               : collectAnnotatedMethods(clazz, Test.class);
+      
+      if (test.isEmpty())
+      {
+         return null;
+      }
+
+      return new FWDClassTestDescriptor(clazz, parentDescriptor, test,
+               collectAnnotatedMethods(clazz, BeforeEach.class),
+               collectAnnotatedMethods(clazz, AfterEach.class),
+               collectAnnotatedMethods(clazz, BeforeAll.class),
+               collectAnnotatedMethods(clazz, AfterAll.class));
+   }
+
+   /**
+    * Collect all methods annotated with the given class, but not annotated as disabled.
+    * 
+    * @param clazz
+    *        the class to scan for methods
+    * @param annoClass
+    *        the annotation class to match
+    * @return
+    *        the list of methods found; never {@code null}
+    */
+   private static List<Method> collectAnnotatedMethods(final Class<?> clazz,
+            final Class<? extends Annotation> annoClass)
+   {
+      return ReflectionUtils.findMethods(clazz, m -> AnnotationUtils.isAnnotated(m, annoClass)
+               && !AnnotationUtils.isAnnotated(m, Disabled.class));
+   }
+
+   /**
+    * Private constructor.
+    * 
+    * @param clazz
+    *        the Java class
+    * @param parent
+    *        the parent descriptor
+    * @param test
+    *        class methods marked as tests  
+    * @param beforeEach
+    *        class methods marked to execute before each test  
+    * @param afterEach
+    *        class methods marked to execute after each test  
+    * @param beforeAll
+    *        class methods marked to execute before all tests  
+    * @param afterAll
+    *        class methods marked to execute aftger all tests  
+    */
+   private FWDClassTestDescriptor(final Class<?> clazz, final TestDescriptor parent,
+            List<Method> test, List<Method> beforeEach, List<Method> afterEach,
+            List<Method> beforeAll, List<Method> afterAll)
+   {
+      super(parent.getUniqueId().append("class", clazz.getName()), clazz.getSimpleName(),
+               ClassSource.from(clazz));
+
+      setParent(parent);
+
+      this.clazz = clazz;
+      this.beforeAll = beforeAll;
+      this.afterAll = afterAll;
+      test.stream().map(m -> new FWDMethodTestDescriptor(this, clazz, m, beforeEach, afterEach))
+               .forEach(this::addChild);
+   }
+
+   /**
+    * Execute the <em>after</em> behavior of this node.
+    *
+    * <p>This method will be called once <em>after</em> {@linkplain #execute
+    * execution} of this node.
+    *
+    * <p>The default implementation does nothing.
+    *
+    * @param context the context to execute in
+    */
+   @Override
+   public void after(final FWDEngineExecutionContext context) throws Exception
+   {
+      for (Method m : afterAll)
+      {
+         // System.err.println("executing after class method " + m);
+         ReflectionSupport.invokeMethod(m, null);
+      }
+   }
+
+   /**
+    * Execute the <em>before</em> behavior of this node.
+    *
+    * <p>This method will be called once <em>before</em> {@linkplain #execute
+    * execution} of this node.
+    *
+    * <p>The default implementation returns the supplied {@code context} unmodified.
+    *
+    * @param context the context to execute in
+    * @return the new context to be used for children of this node; never
+    * {@code null}
+    */
+   @Override
+   public FWDEngineExecutionContext before(FWDEngineExecutionContext context) throws Exception
+   {
+      for (Method m : beforeAll)
+      {
+         // System.err.println("executing before class method " + m);
+         ReflectionSupport.invokeMethod(m, null);
+      }
+
+      return context;
+   }
+
+   /**
+    * Execute the <em>behavior</em> of this node.
+    *
+    * <p>Containers typically do not implement this method since the
+    * {@link HierarchicalTestEngine} handles execution of their children.
+    *
+    * <p>The supplied {@code dynamicTestExecutor} may be used to submit
+    * additional dynamic tests for immediate execution.
+    *
+    * <p>The default implementation returns the supplied {@code context} unmodified.
+    *
+    * @param context the context to execute in
+    * @param dynamicTestExecutor the executor to submit dynamic tests to
+    * @return the new context to be used for children of this node and for the
+    * <em>after</em> behavior of the parent of this node, if any
+    */
+   @Override
+   public FWDEngineExecutionContext execute(FWDEngineExecutionContext context,
+            DynamicTestExecutor dynamicTestExecutor) throws Exception
+   {
+      return context;
+   }
+
+   /**
+    * Determine the {@link org.junit.platform.engine.TestDescriptor.Type} of this descriptor.
+    *
+    * @return the descriptor type; never {@code null}.
+    * @see #isContainer()
+    * @see #isTest()
+    */
+   @Override
+   public Type getType()
+   {
+      return Type.CONTAINER;
+   }
+
+}

=== added file 'src/com/goldencode/p2j/testengine/FWDEngineDescriptor.java'
--- src/com/goldencode/p2j/testengine/FWDEngineDescriptor.java	1970-01-01 00:00:00 +0000
+++ src/com/goldencode/p2j/testengine/FWDEngineDescriptor.java	2022-09-30 11:31:56 +0000
@@ -0,0 +1,101 @@
+/*
+** Module   : FWDEngineDescriptor.java
+** Abstract : Test engine descriptor.
+**
+** Copyright (c) 2022, Golden Code Development Corporation.
+**
+** -#- -I- --Date-- ----------------Description----------------------
+** 001 VVT 2022xxxx Created initial version.
+*/
+/*
+** This program is free software: you can redistribute it and/or modify
+** it under the terms of the GNU Affero General Public License as
+** published by the Free Software Foundation, either version 3 of the
+** License, or (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Affero General Public License for more details.
+**
+** You may find a copy of the GNU Affero GPL version 3 at the following
+** location: https://www.gnu.org/licenses/agpl-3.0.en.html
+** 
+** Additional terms under GNU Affero GPL version 3 section 7:
+** 
+**   Under Section 7 of the GNU Affero GPL version 3, the following additional
+**   terms apply to the works covered under the License.  These additional terms
+**   are non-permissive additional terms allowed under Section 7 of the GNU
+**   Affero GPL version 3 and may not be removed by you.
+** 
+**   0. Attribution Requirement.
+** 
+**     You must preserve all legal notices or author attributions in the covered
+**     work or Appropriate Legal Notices displayed by works containing the covered
+**     work.  You may not remove from the covered work any author or developer
+**     credit already included within the covered work.
+** 
+**   1. No License To Use Trademarks.
+** 
+**     This license does not grant any license or rights to use the trademarks
+**     Golden Code, FWD, any Golden Code or FWD logo, or any other trademarks
+**     of Golden Code Development Corporation. You are not authorized to use the
+**     name Golden Code, FWD, or the names of any author or contributor, for
+**     publicity purposes without written authorization.
+** 
+**   2. No Misrepresentation of Affiliation.
+** 
+**     You may not represent yourself as Golden Code Development Corporation or FWD.
+** 
+**     You may not represent yourself for publicity purposes as associated with
+**     Golden Code Development Corporation, FWD, or any author or contributor to
+**     the covered work, without written authorization.
+** 
+**   3. No Misrepresentation of Source or Origin.
+** 
+**     You may not represent the covered work as solely your work.  All modified
+**     versions of the covered work must be marked in a reasonable way to make it
+**     clear that the modified work is not originating from Golden Code Development
+**     Corporation or FWD.  All modified versions must contain the notices of
+**     attribution required in this license.
+*/
+package com.goldencode.p2j.testengine;
+
+import org.junit.platform.engine.*;
+import org.junit.platform.engine.support.descriptor.*;
+import org.junit.platform.engine.support.hierarchical.*;
+import org.junit.platform.engine.support.hierarchical.Node.*;
+
+/**
+ * Test engine descriptor. Provides this engine unique ID and same thread execution mode. 
+ */
+public class FWDEngineDescriptor
+extends EngineDescriptor
+implements Node<FWDEngineExecutionContext>
+{
+
+   /**
+    * The constructor.
+    * 
+    * @param uniqueId the {@code UniqueId} for the described {@code TestEngine};
+    * never {@code null}
+    */
+   public FWDEngineDescriptor(final UniqueId uniqueId)
+   {
+      super(uniqueId, "FWD Test");
+   }
+
+   /**
+    * Get the preferred of {@linkplain ExecutionMode execution mode} for
+    * parallel execution of this node.
+    *
+    * @return the preferred execution mode of this node; never {@code null}
+    * @see ExecutionMode
+    */
+   @Override
+   public ExecutionMode getExecutionMode() {
+      // No concurrent execution is planned yet
+      return ExecutionMode.SAME_THREAD;
+   }
+
+}

=== added file 'src/com/goldencode/p2j/testengine/FWDEngineExecutionContext.java'
--- src/com/goldencode/p2j/testengine/FWDEngineExecutionContext.java	1970-01-01 00:00:00 +0000
+++ src/com/goldencode/p2j/testengine/FWDEngineExecutionContext.java	2022-09-30 11:30:15 +0000
@@ -0,0 +1,73 @@
+/*
+** Module   : FWDEngineExecutionContext.java
+** Abstract : Test engine execution context.
+**
+** Copyright (c) 2022, Golden Code Development Corporation.
+**
+** -#- -I- --Date-- ----------------Description----------------------
+** 001 VVT 2022xxxx Created initial version.
+*/
+/*
+** This program is free software: you can redistribute it and/or modify
+** it under the terms of the GNU Affero General Public License as
+** published by the Free Software Foundation, either version 3 of the
+** License, or (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Affero General Public License for more details.
+**
+** You may find a copy of the GNU Affero GPL version 3 at the following
+** location: https://www.gnu.org/licenses/agpl-3.0.en.html
+** 
+** Additional terms under GNU Affero GPL version 3 section 7:
+** 
+**   Under Section 7 of the GNU Affero GPL version 3, the following additional
+**   terms apply to the works covered under the License.  These additional terms
+**   are non-permissive additional terms allowed under Section 7 of the GNU
+**   Affero GPL version 3 and may not be removed by you.
+** 
+**   0. Attribution Requirement.
+** 
+**     You must preserve all legal notices or author attributions in the covered
+**     work or Appropriate Legal Notices displayed by works containing the covered
+**     work.  You may not remove from the covered work any author or developer
+**     credit already included within the covered work.
+** 
+**   1. No License To Use Trademarks.
+** 
+**     This license does not grant any license or rights to use the trademarks
+**     Golden Code, FWD, any Golden Code or FWD logo, or any other trademarks
+**     of Golden Code Development Corporation. You are not authorized to use the
+**     name Golden Code, FWD, or the names of any author or contributor, for
+**     publicity purposes without written authorization.
+** 
+**   2. No Misrepresentation of Affiliation.
+** 
+**     You may not represent yourself as Golden Code Development Corporation or FWD.
+** 
+**     You may not represent yourself for publicity purposes as associated with
+**     Golden Code Development Corporation, FWD, or any author or contributor to
+**     the covered work, without written authorization.
+** 
+**   3. No Misrepresentation of Source or Origin.
+** 
+**     You may not represent the covered work as solely your work.  All modified
+**     versions of the covered work must be marked in a reasonable way to make it
+**     clear that the modified work is not originating from Golden Code Development
+**     Corporation or FWD.  All modified versions must contain the notices of
+**     attribution required in this license.
+*/
+package com.goldencode.p2j.testengine;
+
+import org.junit.platform.engine.support.hierarchical.*;
+
+/**
+ * Test engine execution context.
+ */
+public class FWDEngineExecutionContext
+implements EngineExecutionContext
+{
+   // for now empty
+}

=== added file 'src/com/goldencode/p2j/testengine/FWDMethodTestDescriptor.java'
--- src/com/goldencode/p2j/testengine/FWDMethodTestDescriptor.java	1970-01-01 00:00:00 +0000
+++ src/com/goldencode/p2j/testengine/FWDMethodTestDescriptor.java	2022-09-30 14:33:57 +0000
@@ -0,0 +1,255 @@
+/*
+** Module   : FWDMethodTestDescriptor.java
+** Abstract : Test descriptor for a Java method.
+**
+** Copyright (c) 2022, Golden Code Development Corporation.
+**
+** -#- -I- --Date-- ----------------Description----------------------
+** 001 VVT 2022xxxx Created initial version.
+*/
+/*
+** This program is free software: you can redistribute it and/or modify
+** it under the terms of the GNU Affero General Public License as
+** published by the Free Software Foundation, either version 3 of the
+** License, or (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Affero General Public License for more details.
+**
+** You may find a copy of the GNU Affero GPL version 3 at the following
+** location: https://www.gnu.org/licenses/agpl-3.0.en.html
+** 
+** Additional terms under GNU Affero GPL version 3 section 7:
+** 
+**   Under Section 7 of the GNU Affero GPL version 3, the following additional
+**   terms apply to the works covered under the License.  These additional terms
+**   are non-permissive additional terms allowed under Section 7 of the GNU
+**   Affero GPL version 3 and may not be removed by you.
+** 
+**   0. Attribution Requirement.
+** 
+**     You must preserve all legal notices or author attributions in the covered
+**     work or Appropriate Legal Notices displayed by works containing the covered
+**     work.  You may not remove from the covered work any author or developer
+**     credit already included within the covered work.
+** 
+**   1. No License To Use Trademarks.
+** 
+**     This license does not grant any license or rights to use the trademarks
+**     Golden Code, FWD, any Golden Code or FWD logo, or any other trademarks
+**     of Golden Code Development Corporation. You are not authorized to use the
+**     name Golden Code, FWD, or the names of any author or contributor, for
+**     publicity purposes without written authorization.
+** 
+**   2. No Misrepresentation of Affiliation.
+** 
+**     You may not represent yourself as Golden Code Development Corporation or FWD.
+** 
+**     You may not represent yourself for publicity purposes as associated with
+**     Golden Code Development Corporation, FWD, or any author or contributor to
+**     the covered work, without written authorization.
+** 
+**   3. No Misrepresentation of Source or Origin.
+** 
+**     You may not represent the covered work as solely your work.  All modified
+**     versions of the covered work must be marked in a reasonable way to make it
+**     clear that the modified work is not originating from Golden Code Development
+**     Corporation or FWD.  All modified versions must contain the notices of
+**     attribution required in this license.
+*/
+package com.goldencode.p2j.testengine;
+
+import java.lang.reflect.*;
+
+import org.junit.platform.commons.support.*;
+import org.junit.platform.engine.support.descriptor.*;
+import org.junit.platform.engine.support.hierarchical.*;
+
+/**
+ * Test descriptor for a Java method.
+ */
+public class FWDMethodTestDescriptor
+extends AbstractTestDescriptor
+implements Node<FWDEngineExecutionContext>
+{
+   /**
+    * The Java class to create instances of.
+    * 
+    */
+   final Class<?> clazz;
+
+   /**
+    * Methods to execute after the main method, if any 
+    */
+   private final Iterable<Method> after;
+
+   /**
+    * Methods to execute before the main method, if any 
+    */
+   private final Iterable<Method> before;
+
+   /**
+    * Main method to execute
+    */
+   private final Method method;
+
+   /**
+    * The test class instance. Is created before each test life cycle begins,
+    * and dropped after test life cycle ends.
+    */
+   private Object testInstance;
+
+   /**
+    * Constructor.
+    * @param parent 
+    *        the parent descriptor
+    * @param clazz
+    *        the Java class to create instances
+    * @param execute
+    *        the method to execute
+    * @param beforeMethods
+    *        methods to execute before the execute method
+    * @param afterMethods
+    *        methods to execute after the execute method
+    */
+   FWDMethodTestDescriptor(final FWDClassTestDescriptor parent,
+            final Class<?> clazz,
+            final Method execute,
+            final Iterable<Method> beforeMethods,
+            final Iterable<Method> afterMethods)
+   {
+      super(parent.getUniqueId().append("method", execute.getName()), execute.getName(),
+               new FWDMethodTestSource());
+
+      this.clazz = clazz;
+      this.method = execute;
+      this.before = beforeMethods;
+      this.after = afterMethods;
+
+      setParent(parent);
+   }
+
+   /**
+    * Execute the <em>after</em> behavior of this node.
+    *
+    * <p>This method will be called once <em>after</em> {@linkplain #execute
+    * execution} of this node.
+    *
+    * @param context
+    *        the context to execute in
+    * 
+    */
+   @Override
+   public void after(final FWDEngineExecutionContext context) throws Exception
+   {
+      for (final Method m : after)
+      {
+         ReflectionSupport.invokeMethod(m, testInstance);
+      }
+   }
+
+   /**
+    * Execute the <em>before</em> behavior of this node.
+    *
+    * <p>This method will be called once <em>before</em> {@linkplain #execute
+    * execution} of this node.
+    *
+    * @param context
+    *        the context to execute in
+    * @return the new context to be used for children of this node; never
+    * {@code null}
+    */
+   @Override
+   public FWDEngineExecutionContext before(FWDEngineExecutionContext context) throws Exception
+   {
+      for (final Method m : before)
+      {
+         ReflectionSupport.invokeMethod(m, testInstance);
+      }
+
+      return context;
+   }
+
+   /**
+    * Clean up the supplied {@code context} after execution.
+    * 
+    * Reset the test class instance.
+    *
+    * @param context
+    *        the context to execute in
+   
+    * @see #prepare
+    */
+   @Override
+   public void cleanUp(final FWDEngineExecutionContext context) throws Exception
+   {
+      testInstance = null;
+   }
+
+   /**
+    * Execute the <em>behavior</em> of this node.
+    *
+    * <p>Containers typically do not implement this method since the
+    * {@link HierarchicalTestEngine} handles execution of their children.
+    *
+    * <p>The supplied {@code dynamicTestExecutor} may be used to submit
+    * additional dynamic tests for immediate execution.
+    *
+    * @param context
+    *         the context to execute in
+    * @param dynamicTestExecutor
+    *        the executor to submit dynamic tests to
+    *        
+    * @return the new context to be used for children of this node and for the
+    * <em>after</em> behavior of the parent of this node, if any
+    */
+   @Override
+   public FWDEngineExecutionContext execute(final FWDEngineExecutionContext context,
+            DynamicTestExecutor dynamicTestExecutor) throws Exception
+   {
+      // System.err.println("executing method " + method + " on " + testInstance);
+      ReflectionSupport.invokeMethod(method, testInstance);
+
+      return context;
+   }
+
+   /**
+    * Determine the {@link org.junit.platform.engine.TestDescriptor.Type} of this descriptor.
+    *
+    * @return the descriptor type; never {@code null}.
+    * @see #isContainer()
+    * @see #isTest()
+    */
+   @Override
+   public Type getType()
+   {
+      return Type.TEST;
+   }
+
+   /**
+    * Prepare the supplied {@code context} prior to execution.
+    * 
+    * Create test class instance.
+    *
+    * @see #cleanUp
+    */
+   @Override
+   public FWDEngineExecutionContext prepare(FWDEngineExecutionContext context) throws Exception
+   {
+      testInstance = ReflectionSupport.newInstance(clazz);
+
+      return context;
+   }
+
+   /**
+    * Get the method.
+    * 
+    * @return the method, never {@code null}
+    */
+   final Method getMethod()
+   {
+      return method;
+   }
+}

=== added file 'src/com/goldencode/p2j/testengine/FWDMethodTestSource.java'
--- src/com/goldencode/p2j/testengine/FWDMethodTestSource.java	1970-01-01 00:00:00 +0000
+++ src/com/goldencode/p2j/testengine/FWDMethodTestSource.java	2022-09-30 11:29:12 +0000
@@ -0,0 +1,77 @@
+/*
+** Module   : FWDMethodTestSource.java
+** Abstract : Test method source data.
+**
+** Copyright (c) 2022, Golden Code Development Corporation.
+**
+** -#- -I- --Date-- ----------------Description----------------------
+** 001 VVT 2022xxxx Created initial version.
+*/
+/*
+** This program is free software: you can redistribute it and/or modify
+** it under the terms of the GNU Affero General Public License as
+** published by the Free Software Foundation, either version 3 of the
+** License, or (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Affero General Public License for more details.
+**
+** You may find a copy of the GNU Affero GPL version 3 at the following
+** location: https://www.gnu.org/licenses/agpl-3.0.en.html
+** 
+** Additional terms under GNU Affero GPL version 3 section 7:
+** 
+**   Under Section 7 of the GNU Affero GPL version 3, the following additional
+**   terms apply to the works covered under the License.  These additional terms
+**   are non-permissive additional terms allowed under Section 7 of the GNU
+**   Affero GPL version 3 and may not be removed by you.
+** 
+**   0. Attribution Requirement.
+** 
+**     You must preserve all legal notices or author attributions in the covered
+**     work or Appropriate Legal Notices displayed by works containing the covered
+**     work.  You may not remove from the covered work any author or developer
+**     credit already included within the covered work.
+** 
+**   1. No License To Use Trademarks.
+** 
+**     This license does not grant any license or rights to use the trademarks
+**     Golden Code, FWD, any Golden Code or FWD logo, or any other trademarks
+**     of Golden Code Development Corporation. You are not authorized to use the
+**     name Golden Code, FWD, or the names of any author or contributor, for
+**     publicity purposes without written authorization.
+** 
+**   2. No Misrepresentation of Affiliation.
+** 
+**     You may not represent yourself as Golden Code Development Corporation or FWD.
+** 
+**     You may not represent yourself for publicity purposes as associated with
+**     Golden Code Development Corporation, FWD, or any author or contributor to
+**     the covered work, without written authorization.
+** 
+**   3. No Misrepresentation of Source or Origin.
+** 
+**     You may not represent the covered work as solely your work.  All modified
+**     versions of the covered work must be marked in a reasonable way to make it
+**     clear that the modified work is not originating from Golden Code Development
+**     Corporation or FWD.  All modified versions must contain the notices of
+**     attribution required in this license.
+*/
+package com.goldencode.p2j.testengine;
+
+import org.junit.platform.engine.*;
+
+/**
+ * Test method source data. Currently empty.
+ * 
+ * FIXME: probably, will need either to use the
+ * {@link org.junit.platform.engine.support.descriptor.MethodSource}
+ * or inherit from it.
+ */
+public class FWDMethodTestSource
+implements TestSource
+{
+   private static final long serialVersionUID = 1L;
+}

=== added file 'src/com/goldencode/p2j/testengine/FWDTestEngine.java'
--- src/com/goldencode/p2j/testengine/FWDTestEngine.java	1970-01-01 00:00:00 +0000
+++ src/com/goldencode/p2j/testengine/FWDTestEngine.java	2022-09-30 14:17:51 +0000
@@ -0,0 +1,197 @@
+/*
+** Module   : FWDTestEngine.java
+** Abstract : Test engine.
+**
+** Copyright (c) 2022, Golden Code Development Corporation.
+**
+** -#- -I- --Date-- ----------------Description----------------------
+** 001 VVT 2022xxxx Created initial version.
+*/
+/*
+** This program is free software: you can redistribute it and/or modify
+** it under the terms of the GNU Affero General Public License as
+** published by the Free Software Foundation, either version 3 of the
+** License, or (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Affero General Public License for more details.
+**
+** You may find a copy of the GNU Affero GPL version 3 at the following
+** location: https://www.gnu.org/licenses/agpl-3.0.en.html
+** 
+** Additional terms under GNU Affero GPL version 3 section 7:
+** 
+**   Under Section 7 of the GNU Affero GPL version 3, the following additional
+**   terms apply to the works covered under the License.  These additional terms
+**   are non-permissive additional terms allowed under Section 7 of the GNU
+**   Affero GPL version 3 and may not be removed by you.
+** 
+**   0. Attribution Requirement.
+** 
+**     You must preserve all legal notices or author attributions in the covered
+**     work or Appropriate Legal Notices displayed by works containing the covered
+**     work.  You may not remove from the covered work any author or developer
+**     credit already included within the covered work.
+** 
+**   1. No License To Use Trademarks.
+** 
+**     This license does not grant any license or rights to use the trademarks
+**     Golden Code, FWD, any Golden Code or FWD logo, or any other trademarks
+**     of Golden Code Development Corporation. You are not authorized to use the
+**     name Golden Code, FWD, or the names of any author or contributor, for
+**     publicity purposes without written authorization.
+** 
+**   2. No Misrepresentation of Affiliation.
+** 
+**     You may not represent yourself as Golden Code Development Corporation or FWD.
+** 
+**     You may not represent yourself for publicity purposes as associated with
+**     Golden Code Development Corporation, FWD, or any author or contributor to
+**     the covered work, without written authorization.
+** 
+**   3. No Misrepresentation of Source or Origin.
+** 
+**     You may not represent the covered work as solely your work.  All modified
+**     versions of the covered work must be marked in a reasonable way to make it
+**     clear that the modified work is not originating from Golden Code Development
+**     Corporation or FWD.  All modified versions must contain the notices of
+**     attribution required in this license.
+*/
+package com.goldencode.p2j.testengine;
+
+import java.lang.reflect.*;
+import java.util.*;
+
+import org.junit.platform.commons.support.*;
+import org.junit.platform.engine.*;
+import org.junit.platform.engine.discovery.*;
+import org.junit.platform.engine.support.hierarchical.*;
+
+import com.goldencode.p2j.testengine.api.*;
+
+/**
+ * Test engine.
+ *
+ */
+public class FWDTestEngine
+extends HierarchicalTestEngine<FWDEngineExecutionContext>
+implements Node<FWDEngineExecutionContext>
+{
+
+   /**
+    * Scan a class for test methods, declared in the class.
+    * 
+    * @param engineDescriptor
+    *        the engine descriptor to register found test descriptors in
+    * @param javaClass
+    *        the Java class to scan
+    * @param explicitMethods
+    *        optional list of explicit test methods to execute, can be {@code null}
+    */
+   private final static void addOptionally(final TestDescriptor engineDescriptor,
+            final Class<?> javaClass, final List<Method> explicitMethods)
+   {
+      final FWDClassTestDescriptor instance = FWDClassTestDescriptor.testAndCreate(javaClass,
+               engineDescriptor, explicitMethods);
+      if (instance != null)
+      {
+         engineDescriptor.addChild(instance);
+      }
+   }
+
+   /**
+    * Scan a class for all test methods, including whose defined in the class and referenced classes,
+    * if the class is marked as test suite.
+    * 
+    * @param engineDescriptor
+    *        the engine descriptor to register found test descriptors in
+    * @param javaClass
+    *        the Java class to scan
+    */
+   private static void scanClass(final TestDescriptor engineDescriptor, final Class<?> javaClass)
+   {
+      addOptionally(engineDescriptor, javaClass, null);
+      // Add suites
+      if (AnnotationSupport.isAnnotated(javaClass, Suite.class))
+      {
+         for (final Class<?> referencedClass : javaClass.getAnnotation(SelectClasses.class).value())
+         {
+            addOptionally(engineDescriptor, referencedClass, null);
+         }
+
+         // TODO: implement all other suite selectors if ever required...
+      }
+   }
+
+   /**
+    * Discover tests according to the supplied {@link EngineDiscoveryRequest}.
+    *
+    * <p>The supplied {@link UniqueId} must be used as the unique ID of the
+    * returned root {@link TestDescriptor}. In addition, the {@code UniqueId}
+    * must be used to create unique IDs for children of the root's descriptor
+    * by calling {@link UniqueId#append}.
+    *
+    * @param discoveryRequest the discovery request; never {@code null}
+    * @param uniqueId the unique ID to be used for this test engine's
+    * {@code TestDescriptor}; never {@code null}
+    * @return the root {@code TestDescriptor} of this engine, typically an
+    * instance of {@code EngineDescriptor}
+    * @see org.junit.platform.engine.support.descriptor.EngineDescriptor
+    */
+   @Override
+   public TestDescriptor discover(final EngineDiscoveryRequest discoveryRequest, final UniqueId uniqueId)
+   {
+      final TestDescriptor engineDescriptor = new FWDEngineDescriptor(uniqueId);
+
+      discoveryRequest.getSelectorsByType(MethodSelector.class).forEach(selector -> {
+         addOptionally(engineDescriptor, selector.getJavaClass(), Collections.singletonList(selector.getJavaMethod()));
+      });
+
+      discoveryRequest.getSelectorsByType(ClassSelector.class).forEach(selector -> {
+         scanClass(engineDescriptor, selector.getJavaClass());
+      });
+
+      discoveryRequest.getSelectorsByType(PackageSelector.class).forEach(selector -> {
+         final List<Class<?>> classes = ReflectionSupport.findAllClassesInPackage(
+                  selector.getPackageName(), (Class<?> c) -> true, name -> true);
+         for(Class<?> javaClass : classes)
+         {
+            scanClass(engineDescriptor, javaClass);
+         }
+      });
+
+      return engineDescriptor;
+   }
+
+   /**
+    * Get the ID that uniquely identifies this test engine.
+    *
+    * <p>Each test engine must provide a unique ID. For example, JUnit Vintage
+    * and JUnit Jupiter use {@code "junit-vintage"} and {@code "junit-jupiter"},
+    * respectively. When in doubt, you may use the fully qualified name of your
+    * custom {@code TestEngine} implementation class.
+    */
+   @Override
+   public String getId()
+   {
+      // Note: "junit-fwd" would be more natural, but the "junit-" prefix
+      // is reserved by JUnit5
+      return "fwd-junit";
+   }
+
+   /**
+    * Create the initial execution context for executing the supplied
+    * {@linkplain ExecutionRequest request}.
+    *
+    * @param request the request about to be executed
+    * @return the initial context that will be passed to nodes in the hierarchy
+    */
+   @Override
+   protected FWDEngineExecutionContext createExecutionContext(ExecutionRequest request)
+   {
+      return new FWDEngineExecutionContext();
+   }
+
+}

=== added directory 'src/com/goldencode/p2j/testengine/api'
=== added file 'src/com/goldencode/p2j/testengine/api/AfterAll.java'
--- src/com/goldencode/p2j/testengine/api/AfterAll.java	1970-01-01 00:00:00 +0000
+++ src/com/goldencode/p2j/testengine/api/AfterAll.java	2022-09-30 12:24:40 +0000
@@ -0,0 +1,74 @@
+/*
+** Module   : AfterAll.java
+** Abstract : Mark methods, which should be run after all @Test methods in the class.
+**
+** Copyright (c) 2022, Golden Code Development Corporation.
+**
+** -#- -I- --Date-- ----------------Description----------------------
+** 001 VVT 2022xxxx Created initial version.
+*/
+/*
+** This program is free software: you can redistribute it and/or modify
+** it under the terms of the GNU Affero General Public License as
+** published by the Free Software Foundation, either version 3 of the
+** License, or (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Affero General Public License for more details.
+**
+** You may find a copy of the GNU Affero GPL version 3 at the following
+** location: https://www.gnu.org/licenses/agpl-3.0.en.html
+** 
+** Additional terms under GNU Affero GPL version 3 section 7:
+** 
+**   Under Section 7 of the GNU Affero GPL version 3, the following additional
+**   terms apply to the works covered under the License.  These additional terms
+**   are non-permissive additional terms allowed under Section 7 of the GNU
+**   Affero GPL version 3 and may not be removed by you.
+** 
+**   0. Attribution Requirement.
+** 
+**     You must preserve all legal notices or author attributions in the covered
+**     work or Appropriate Legal Notices displayed by works containing the covered
+**     work.  You may not remove from the covered work any author or developer
+**     credit already included within the covered work.
+** 
+**   1. No License To Use Trademarks.
+** 
+**     This license does not grant any license or rights to use the trademarks
+**     Golden Code, FWD, any Golden Code or FWD logo, or any other trademarks
+**     of Golden Code Development Corporation. You are not authorized to use the
+**     name Golden Code, FWD, or the names of any author or contributor, for
+**     publicity purposes without written authorization.
+** 
+**   2. No Misrepresentation of Affiliation.
+** 
+**     You may not represent yourself as Golden Code Development Corporation or FWD.
+** 
+**     You may not represent yourself for publicity purposes as associated with
+**     Golden Code Development Corporation, FWD, or any author or contributor to
+**     the covered work, without written authorization.
+** 
+**   3. No Misrepresentation of Source or Origin.
+** 
+**     You may not represent the covered work as solely your work.  All modified
+**     versions of the covered work must be marked in a reasonable way to make it
+**     clear that the modified work is not originating from Golden Code Development
+**     Corporation or FWD.  All modified versions must contain the notices of
+**     attribution required in this license.
+*/
+package com.goldencode.p2j.testengine.api;
+
+import java.lang.annotation.*;
+
+/**
+ * {@link AfterAll} is used to mark methods, which should be run after all {@link Test} methods in the class.
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface AfterAll
+{
+   // no-op
+}

=== added file 'src/com/goldencode/p2j/testengine/api/AfterEach.java'
--- src/com/goldencode/p2j/testengine/api/AfterEach.java	1970-01-01 00:00:00 +0000
+++ src/com/goldencode/p2j/testengine/api/AfterEach.java	2022-09-30 12:24:46 +0000
@@ -0,0 +1,74 @@
+/*
+** Module   : AfterEach.java
+** Abstract : Mark methods, which should be run after each @Test method.
+**
+** Copyright (c) 2022, Golden Code Development Corporation.
+**
+** -#- -I- --Date-- ----------------Description----------------------
+** 001 VVT 2022xxxx Created initial version.
+*/
+/*
+** This program is free software: you can redistribute it and/or modify
+** it under the terms of the GNU Affero General Public License as
+** published by the Free Software Foundation, either version 3 of the
+** License, or (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Affero General Public License for more details.
+**
+** You may find a copy of the GNU Affero GPL version 3 at the following
+** location: https://www.gnu.org/licenses/agpl-3.0.en.html
+** 
+** Additional terms under GNU Affero GPL version 3 section 7:
+** 
+**   Under Section 7 of the GNU Affero GPL version 3, the following additional
+**   terms apply to the works covered under the License.  These additional terms
+**   are non-permissive additional terms allowed under Section 7 of the GNU
+**   Affero GPL version 3 and may not be removed by you.
+** 
+**   0. Attribution Requirement.
+** 
+**     You must preserve all legal notices or author attributions in the covered
+**     work or Appropriate Legal Notices displayed by works containing the covered
+**     work.  You may not remove from the covered work any author or developer
+**     credit already included within the covered work.
+** 
+**   1. No License To Use Trademarks.
+** 
+**     This license does not grant any license or rights to use the trademarks
+**     Golden Code, FWD, any Golden Code or FWD logo, or any other trademarks
+**     of Golden Code Development Corporation. You are not authorized to use the
+**     name Golden Code, FWD, or the names of any author or contributor, for
+**     publicity purposes without written authorization.
+** 
+**   2. No Misrepresentation of Affiliation.
+** 
+**     You may not represent yourself as Golden Code Development Corporation or FWD.
+** 
+**     You may not represent yourself for publicity purposes as associated with
+**     Golden Code Development Corporation, FWD, or any author or contributor to
+**     the covered work, without written authorization.
+** 
+**   3. No Misrepresentation of Source or Origin.
+** 
+**     You may not represent the covered work as solely your work.  All modified
+**     versions of the covered work must be marked in a reasonable way to make it
+**     clear that the modified work is not originating from Golden Code Development
+**     Corporation or FWD.  All modified versions must contain the notices of
+**     attribution required in this license.
+*/
+package com.goldencode.p2j.testengine.api;
+
+import java.lang.annotation.*;
+
+/**
+ * {@link AfterEach} is used to mark methods, which should be run after each {@link Test} method.
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface AfterEach
+{
+   // no-op
+}

=== added file 'src/com/goldencode/p2j/testengine/api/BeforeAll.java'
--- src/com/goldencode/p2j/testengine/api/BeforeAll.java	1970-01-01 00:00:00 +0000
+++ src/com/goldencode/p2j/testengine/api/BeforeAll.java	2022-09-30 12:24:50 +0000
@@ -0,0 +1,75 @@
+/*
+** Module   : BeforeAll.java
+** Abstract : Mark methods, which should be run before all @Test methods in the class.
+**
+** Copyright (c) 2022, Golden Code Development Corporation.
+**
+** -#- -I- --Date-- ----------------Description----------------------
+** 001 VVT 2022xxxx Created initial version.
+*/
+/*
+** This program is free software: you can redistribute it and/or modify
+** it under the terms of the GNU Affero General Public License as
+** published by the Free Software Foundation, either version 3 of the
+** License, or (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Affero General Public License for more details.
+**
+** You may find a copy of the GNU Affero GPL version 3 at the following
+** location: https://www.gnu.org/licenses/agpl-3.0.en.html
+** 
+** Additional terms under GNU Affero GPL version 3 section 7:
+** 
+**   Under Section 7 of the GNU Affero GPL version 3, the following additional
+**   terms apply to the works covered under the License.  These additional terms
+**   are non-permissive additional terms allowed under Section 7 of the GNU
+**   Affero GPL version 3 and may not be removed by you.
+** 
+**   0. Attribution Requirement.
+** 
+**     You must preserve all legal notices or author attributions in the covered
+**     work or Appropriate Legal Notices displayed by works containing the covered
+**     work.  You may not remove from the covered work any author or developer
+**     credit already included within the covered work.
+** 
+**   1. No License To Use Trademarks.
+** 
+**     This license does not grant any license or rights to use the trademarks
+**     Golden Code, FWD, any Golden Code or FWD logo, or any other trademarks
+**     of Golden Code Development Corporation. You are not authorized to use the
+**     name Golden Code, FWD, or the names of any author or contributor, for
+**     publicity purposes without written authorization.
+** 
+**   2. No Misrepresentation of Affiliation.
+** 
+**     You may not represent yourself as Golden Code Development Corporation or FWD.
+** 
+**     You may not represent yourself for publicity purposes as associated with
+**     Golden Code Development Corporation, FWD, or any author or contributor to
+**     the covered work, without written authorization.
+** 
+**   3. No Misrepresentation of Source or Origin.
+** 
+**     You may not represent the covered work as solely your work.  All modified
+**     versions of the covered work must be marked in a reasonable way to make it
+**     clear that the modified work is not originating from Golden Code Development
+**     Corporation or FWD.  All modified versions must contain the notices of
+**     attribution required in this license.
+*/
+package com.goldencode.p2j.testengine.api;
+
+import java.lang.annotation.*;
+
+/**
+ * {@link BeforeAll} is used to mark methods, which should be run before all {@link Test} methods
+ * in the class.
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface BeforeAll
+{
+   // no-op
+}

=== added file 'src/com/goldencode/p2j/testengine/api/BeforeEach.java'
--- src/com/goldencode/p2j/testengine/api/BeforeEach.java	1970-01-01 00:00:00 +0000
+++ src/com/goldencode/p2j/testengine/api/BeforeEach.java	2022-09-30 12:25:01 +0000
@@ -0,0 +1,74 @@
+/*
+** Module   : BeforeEach.java
+** Abstract : Mark methods, which should be run before each @Test method.
+**
+** Copyright (c) 2022, Golden Code Development Corporation.
+**
+** -#- -I- --Date-- ----------------Description----------------------
+** 001 VVT 2022xxxx Created initial version.
+*/
+/*
+** This program is free software: you can redistribute it and/or modify
+** it under the terms of the GNU Affero General Public License as
+** published by the Free Software Foundation, either version 3 of the
+** License, or (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Affero General Public License for more details.
+**
+** You may find a copy of the GNU Affero GPL version 3 at the following
+** location: https://www.gnu.org/licenses/agpl-3.0.en.html
+** 
+** Additional terms under GNU Affero GPL version 3 section 7:
+** 
+**   Under Section 7 of the GNU Affero GPL version 3, the following additional
+**   terms apply to the works covered under the License.  These additional terms
+**   are non-permissive additional terms allowed under Section 7 of the GNU
+**   Affero GPL version 3 and may not be removed by you.
+** 
+**   0. Attribution Requirement.
+** 
+**     You must preserve all legal notices or author attributions in the covered
+**     work or Appropriate Legal Notices displayed by works containing the covered
+**     work.  You may not remove from the covered work any author or developer
+**     credit already included within the covered work.
+** 
+**   1. No License To Use Trademarks.
+** 
+**     This license does not grant any license or rights to use the trademarks
+**     Golden Code, FWD, any Golden Code or FWD logo, or any other trademarks
+**     of Golden Code Development Corporation. You are not authorized to use the
+**     name Golden Code, FWD, or the names of any author or contributor, for
+**     publicity purposes without written authorization.
+** 
+**   2. No Misrepresentation of Affiliation.
+** 
+**     You may not represent yourself as Golden Code Development Corporation or FWD.
+** 
+**     You may not represent yourself for publicity purposes as associated with
+**     Golden Code Development Corporation, FWD, or any author or contributor to
+**     the covered work, without written authorization.
+** 
+**   3. No Misrepresentation of Source or Origin.
+** 
+**     You may not represent the covered work as solely your work.  All modified
+**     versions of the covered work must be marked in a reasonable way to make it
+**     clear that the modified work is not originating from Golden Code Development
+**     Corporation or FWD.  All modified versions must contain the notices of
+**     attribution required in this license.
+*/
+package com.goldencode.p2j.testengine.api;
+
+import java.lang.annotation.*;
+
+/**
+ * {@link BeforeEach} is used to mark methods, which should be run before each {@link Test} method.
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface BeforeEach
+{
+   // no-op
+}

=== added file 'src/com/goldencode/p2j/testengine/api/Test.java'
--- src/com/goldencode/p2j/testengine/api/Test.java	1970-01-01 00:00:00 +0000
+++ src/com/goldencode/p2j/testengine/api/Test.java	2022-09-30 11:15:12 +0000
@@ -0,0 +1,74 @@
+/*
+** Module   : Test.java
+** Abstract : Mark methods, which should be run as tests.
+**
+** Copyright (c) 2022, Golden Code Development Corporation.
+**
+** -#- -I- --Date-- ----------------Description----------------------
+** 001 VVT 2022xxxx Created initial version.
+*/
+/*
+** This program is free software: you can redistribute it and/or modify
+** it under the terms of the GNU Affero General Public License as
+** published by the Free Software Foundation, either version 3 of the
+** License, or (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU Affero General Public License for more details.
+**
+** You may find a copy of the GNU Affero GPL version 3 at the following
+** location: https://www.gnu.org/licenses/agpl-3.0.en.html
+** 
+** Additional terms under GNU Affero GPL version 3 section 7:
+** 
+**   Under Section 7 of the GNU Affero GPL version 3, the following additional
+**   terms apply to the works covered under the License.  These additional terms
+**   are non-permissive additional terms allowed under Section 7 of the GNU
+**   Affero GPL version 3 and may not be removed by you.
+** 
+**   0. Attribution Requirement.
+** 
+**     You must preserve all legal notices or author attributions in the covered
+**     work or Appropriate Legal Notices displayed by works containing the covered
+**     work.  You may not remove from the covered work any author or developer
+**     credit already included within the covered work.
+** 
+**   1. No License To Use Trademarks.
+** 
+**     This license does not grant any license or rights to use the trademarks
+**     Golden Code, FWD, any Golden Code or FWD logo, or any other trademarks
+**     of Golden Code Development Corporation. You are not authorized to use the
+**     name Golden Code, FWD, or the names of any author or contributor, for
+**     publicity purposes without written authorization.
+** 
+**   2. No Misrepresentation of Affiliation.
+** 
+**     You may not represent yourself as Golden Code Development Corporation or FWD.
+** 
+**     You may not represent yourself for publicity purposes as associated with
+**     Golden Code Development Corporation, FWD, or any author or contributor to
+**     the covered work, without written authorization.
+** 
+**   3. No Misrepresentation of Source or Origin.
+** 
+**     You may not represent the covered work as solely your work.  All modified
+**     versions of the covered work must be marked in a reasonable way to make it
+**     clear that the modified work is not originating from Golden Code Development
+**     Corporation or FWD.  All modified versions must contain the notices of
+**     attribution required in this license.
+*/
+package com.goldencode.p2j.testengine.api;
+
+import java.lang.annotation.*;
+
+/**
+ * {@link Test} is used to mark methods, which should be run as tests.
+ */
+@Target({ ElementType.ANNOTATION_TYPE, ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Test
+{
+   // no-op
+}

=== modified file 'test/com/goldencode/p2j/comauto/TestComObject.java'
--- test/com/goldencode/p2j/comauto/TestComObject.java	2021-11-26 20:14:59 +0000
+++ test/com/goldencode/p2j/comauto/TestComObject.java	2022-09-30 12:02:26 +0000
@@ -2,11 +2,12 @@
 ** Module   : TestComObject.java
 ** Abstract : Testing of OCX call input parameter conversion.
 **
-** Copyright (c) 2021, Golden Code Development Corporation.
+** Copyright (c) 2021-2022, Golden Code Development Corporation.
 **
 ** -#- -I- --Date-- ---------------------------------Description---------------------------------
 ** 001 VVT 20211125 Created initial version.
 **     VVT 20211126 A test for conversion decimal -> Object updated.
+**     VVT 2022xxxx Refactored to make tests pure JUnit5. See #6237.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -62,12 +63,11 @@
 */
 package com.goldencode.p2j.comauto;
 
-import static org.junit.Assert.*;
-import static org.junit.jupiter.api.Assertions.assertEquals;
 import static com.goldencode.p2j.comauto.ComObject.convertInputParameter;
+import static org.junit.jupiter.api.Assertions.*;
 
 import java.time.*;
-import org.junit.*;
+import org.junit.jupiter.api.*;
 
 import com.goldencode.p2j.util.*;
 

=== modified file 'test/com/goldencode/p2j/testing/AbstractFWDTest.java'
--- test/com/goldencode/p2j/testing/AbstractFWDTest.java	2021-11-23 20:02:38 +0000
+++ test/com/goldencode/p2j/testing/AbstractFWDTest.java	2022-09-30 12:02:37 +0000
@@ -12,6 +12,7 @@
 **                  Class members sorted.
 **     VVT 20210413 Javadoc fixed
 **     VVT 20211123 Missing Javadocs and annotations added.
+**     VVT 2022xxxx Refactored to make tests pure JUnit5. See #6237.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -67,9 +68,9 @@
 */
 package com.goldencode.p2j.testing;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 
-import org.junit.function.*;
+import org.junit.jupiter.api.function.*;
 
 import com.goldencode.p2j.*;
 import com.goldencode.p2j.util.*;
@@ -93,10 +94,9 @@
        *        the argument for the code
        * @throws ErrorConditionException
        */
-      void run(final T arg)
-      throws ErrorConditionException;
+      void run(final T arg) throws ErrorConditionException;
    }
-   
+
    /**
     * A helper method to check that code throws the OE error 14312.
     * 
@@ -106,8 +106,7 @@
     *        the format to pass to the code
     *        
     */
-   public final static void assertMustThrowError14312(final ErrorCode code,
-            final String format)
+   public final static void assertMustThrowError14312(final ErrorCode code, final String format)
    {
       assertMustThrowError(code, 14312, "Too many 'S' characters in format \"%s\"", format,
                format);
@@ -123,8 +122,7 @@
     *        the format to pass to the code
     *        
     */
-   public final static void assertMustThrowError154(final ErrorCode code,
-            final String format)
+   public final static void assertMustThrowError154(final ErrorCode code, final String format)
    {
       assertMustThrowError(code, 154, "Date format %s is incomplete", format, format);
    }
@@ -138,8 +136,7 @@
     *        the format to pass to the code
     *        
     */
-   public final static void assertMustThrowError164(final ErrorCode code,
-            final String format)
+   public final static void assertMustThrowError164(final ErrorCode code, final String format)
    {
       assertMustThrowError(code, 164, "Character format %s is incomplete", format, format);
    }
@@ -155,8 +152,8 @@
     * @param offendingCharIndex
     *        the index of the offending character
     */
-   public final static void assertMustThrowError22(final ErrorCode code,
-            final String format, final int offendingCharIndex)
+   public final static void assertMustThrowError22(final ErrorCode code, final String format,
+            final int offendingCharIndex)
    {
       assertMustThrowError(code, 22, "Character number %d of format %s is invalid", format,
                offendingCharIndex, format);
@@ -174,8 +171,8 @@
     *        the value to format
     *        
     */
-   public final static void assertMustThrowError74(final ErrorCode code,
-            final String format, final String value)
+   public final static void assertMustThrowError74(final ErrorCode code, final String format,
+            final String value)
    {
       assertMustThrowError(code, 74, "Value %s cannot be displayed using %s", format, value,
                format);
@@ -189,8 +186,7 @@
     * @param format
     *        the format to pass to the code
     */
-   protected final static void assertMustThrowError148(final ErrorCode code,
-            final String format)
+   protected final static void assertMustThrowError148(final ErrorCode code, final String format)
    {
       assertMustThrowError(code, 148, "Numeric format %s provides for no digits", format, format);
    }
@@ -261,11 +257,11 @@
     * @param args
     *        other arguments if the message format expects them
     */
-   private final static void assertMustThrowErrorConditional(final ThrowingRunnable code,
+   private final static void assertMustThrowErrorConditional(final Executable code,
             final int errorCodeExpected, final String expectedMessageFormat, Object... args)
    {
-      final ErrorConditionException exc = assertThrows("Must throw",
-               ErrorConditionException.class, code);
+      final ErrorConditionException exc = assertThrows(ErrorConditionException.class, code,
+               "Must throw");
       final Throwable cause = exc.getCause();
       assertTrue(cause instanceof NumberedException);
       NumberedException numbered = (NumberedException) cause;

=== modified file 'test/com/goldencode/p2j/testing/FormatTestSuite.java'
--- test/com/goldencode/p2j/testing/FormatTestSuite.java	2021-04-28 15:57:14 +0000
+++ test/com/goldencode/p2j/testing/FormatTestSuite.java	2022-09-30 12:02:49 +0000
@@ -10,6 +10,7 @@
 **     VVT 20210413 The set of the tests updated.
 **     VVT 20210426 The set of the tests updated after test classes were renamed.
 **     VVT 20210428 The set of the tests updated after test classes were renamed.
+**     VVT 2022xxxx Refactored to make tests pure JUnit5. See #6237.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -65,8 +66,7 @@
 */
 package com.goldencode.p2j.testing;
 
-import org.junit.runner.*;
-import org.junit.runners.*;
+import org.junit.platform.suite.api.*;
 
 import com.goldencode.p2j.ui.client.format.*;
 import com.goldencode.p2j.util.*;
@@ -74,22 +74,13 @@
 /**
  * Test suite for parsing 4gl formats.
  */
-@RunWith(Suite.class)
-@Suite.SuiteClasses({
-   TestLogicalSplitformat.class,
-   TestCharacterToStringFormatted.class,
-   TestCharacterFormatParser.class,
-   TestCharacterFormatter.class,
-   TestCharacterPreprocessFormatString.class,
-   TestCharacterValueOf.class,
-   TestDateFormatting.class,
-   TestDateFormatParse.class,
-   TestDatetimeFormatting.class,
-   TestDatetimeFormatParsing.class,
-   TestNumberTypeParseFormat.class,
-   TestRowid.class,
-   TestStringFormatParse.class
-})
+@Suite
+@SelectClasses(value = { TestLogicalSplitformat.class, TestCharacterToStringFormatted.class,
+         TestCharacterFormatParser.class, TestCharacterFormatter.class,
+         TestCharacterPreprocessFormatString.class, TestCharacterValueOf.class,
+         TestDateFormatting.class, TestDateFormatParse.class, TestDatetimeFormatting.class,
+         TestDatetimeFormatParsing.class, TestNumberTypeParseFormat.class, TestRowid.class,
+         TestStringFormatParse.class })
 public class FormatTestSuite
 {
    // empty

=== modified file 'test/com/goldencode/p2j/ui/client/format/TestDatetimeFormatParsing.java'
--- test/com/goldencode/p2j/ui/client/format/TestDatetimeFormatParsing.java	2021-11-25 18:47:40 +0000
+++ test/com/goldencode/p2j/ui/client/format/TestDatetimeFormatParsing.java	2022-09-30 12:03:04 +0000
@@ -9,6 +9,7 @@
 **     VVT 20210428 Javadocs fixed.
 **     VVT 20211123 Missing Javadocs and annotations added.
 **     VVT 20211125 Typo in javadocs fixed.
+**     VVT 2022xxxx Refactored to make tests pure JUnit5. See #6237.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -64,11 +65,11 @@
 */
 package com.goldencode.p2j.ui.client.format;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 
 import java.lang.reflect.*;
 
-import org.junit.*;
+import org.junit.jupiter.api.*;
 
 import com.goldencode.p2j.util.*;
 

=== modified file 'test/com/goldencode/p2j/ui/client/format/TestStringFormatParse.java'
--- test/com/goldencode/p2j/ui/client/format/TestStringFormatParse.java	2021-04-08 18:56:52 +0000
+++ test/com/goldencode/p2j/ui/client/format/TestStringFormatParse.java	2022-09-30 12:03:15 +0000
@@ -10,6 +10,7 @@
 **     VVT 20210408 Re-usable inherited tests added. Test methods got better names. See #4880.
 **                  Obsolete comments removed for already fixed problems.
 **                  Class members sorted.
+**     VVT 2022xxxx Refactored to make tests pure JUnit5. See #6237.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -65,9 +66,9 @@
 */
 package com.goldencode.p2j.ui.client.format;
 
-import static org.junit.Assert.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.junit.*;
+import org.junit.jupiter.api.*;
 
 import com.goldencode.p2j.util.*;
 

=== modified file 'test/com/goldencode/p2j/util/AbstractCharacterFormatTest.java'
--- test/com/goldencode/p2j/util/AbstractCharacterFormatTest.java	2021-04-28 15:57:14 +0000
+++ test/com/goldencode/p2j/util/AbstractCharacterFormatTest.java	2022-09-30 12:03:26 +0000
@@ -8,6 +8,7 @@
 ** 001 VVT 20210408 Created initial version.
 **     VVT 20210426 Test methods sorted.
 **     VVT 20210428 Unused imports removed.
+**     VVT 2022xxxx Refactored to make tests pure JUnit5. See #6237.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -63,7 +64,7 @@
 */
 package com.goldencode.p2j.util;
 
-import org.junit.*;
+import org.junit.jupiter.api.*;
 
 /**
  * This class provides common methods and data for all character parsing/formatting tests.

=== modified file 'test/com/goldencode/p2j/util/AbstractDateFormatTest.java'
--- test/com/goldencode/p2j/util/AbstractDateFormatTest.java	2021-09-17 15:14:10 +0000
+++ test/com/goldencode/p2j/util/AbstractDateFormatTest.java	2022-09-30 12:03:35 +0000
@@ -8,6 +8,7 @@
 ** 001 VVT 20210413 Created initial version.
 **     VVT 20210426 Code style fixed.
 **     VVT 20210917 Javadoc fixed. 
+**     VVT 2022xxxx Refactored to make tests pure JUnit5. See #6237.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -65,7 +66,7 @@
 
 import java.util.*;
 
-import org.junit.*;
+import org.junit.jupiter.api.*;
 
 import com.goldencode.p2j.ui.client.format.*;
 

=== modified file 'test/com/goldencode/p2j/util/AbstractDatetimeFormatTest.java'
--- test/com/goldencode/p2j/util/AbstractDatetimeFormatTest.java	2021-11-23 20:02:38 +0000
+++ test/com/goldencode/p2j/util/AbstractDatetimeFormatTest.java	2022-09-30 12:03:43 +0000
@@ -9,6 +9,7 @@
 **     VVT 20210427 This class moved to more appropriate package.
 **     VVT 20210428 Unused makeDatatimeFormat() method removed.
 **     VVT 20211123 Missing Javadocs and annotations added.
+**     VVT 2022xxxx Refactored to make tests pure JUnit5. See #6237.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -64,7 +65,7 @@
 */
 package com.goldencode.p2j.util;
 
-import org.junit.*;
+import org.junit.jupiter.api.*;
 
 /**
  * Datetime-related tests helper class

=== modified file 'test/com/goldencode/p2j/util/AbstractLogicalFormatParseTest.java'
--- test/com/goldencode/p2j/util/AbstractLogicalFormatParseTest.java	2021-04-28 15:57:14 +0000
+++ test/com/goldencode/p2j/util/AbstractLogicalFormatParseTest.java	2022-09-30 12:03:55 +0000
@@ -6,6 +6,7 @@
 **
 ** -#- -I- --Date-- ---------------------------------Description---------------------------------
 ** 001 VVT 20210428 Created initial version.
+**     VVT 2022xxxx Refactored to make tests pure JUnit5. See #6237.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -61,7 +62,7 @@
 */
 package com.goldencode.p2j.util;
 
-import org.junit.*;
+import org.junit.jupiter.api.*;
 
 /**
  * Common methods and data for all OE logical values parsing/formatting tests.

=== modified file 'test/com/goldencode/p2j/util/AbstractNumberFormatParseTest.java'
--- test/com/goldencode/p2j/util/AbstractNumberFormatParseTest.java	2021-11-23 20:02:38 +0000
+++ test/com/goldencode/p2j/util/AbstractNumberFormatParseTest.java	2022-09-30 12:04:06 +0000
@@ -12,6 +12,7 @@
 **                  Methods were given mode matching names.
 **     VVT 20210428 Imports statements fixed.
 **     VVT 20211123 Missing Javadocs and annotations added.
+**     VVT 2022xxxx Refactored to make tests pure JUnit5. See #6237.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -69,7 +70,7 @@
 
 import java.math.*;
 
-import org.junit.*;
+import org.junit.jupiter.api.*;
 
 /**
  * Common fields and methods for testing 4gl number formats.

=== modified file 'test/com/goldencode/p2j/util/AbstractNumberFormatterTest.java'
--- test/com/goldencode/p2j/util/AbstractNumberFormatterTest.java	2021-11-23 20:02:38 +0000
+++ test/com/goldencode/p2j/util/AbstractNumberFormatterTest.java	2022-09-30 12:04:15 +0000
@@ -9,6 +9,7 @@
 **     VVT 20210427 checkInvalidValue() API changed; a new test leftOverflowError() added.
 **     VVT 20210428 Import statements fixed.
 **     VVT 20211123 Missing Javadocs and annotations added.
+**     VVT 2022xxxx Refactored to make tests pure JUnit5. See #6237.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -64,11 +65,11 @@
 */
 package com.goldencode.p2j.util;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.math.*;
 
-import org.junit.*;
+import org.junit.jupiter.api.*;
 
 /**
  * Common fields and methods for testing formatting with 4gl number formats.

=== modified file 'test/com/goldencode/p2j/util/TestCharacterFormatParser.java'
--- test/com/goldencode/p2j/util/TestCharacterFormatParser.java	2021-09-17 15:14:10 +0000
+++ test/com/goldencode/p2j/util/TestCharacterFormatParser.java	2022-09-30 12:05:04 +0000
@@ -9,6 +9,7 @@
 **     VVT 20210426 The splitGroup() method fixed.
 **     VVT 20210427 API changed: the format is not passed to constructor anymore.
 **     VVT 20210917 Javadoc fixed. 
+**     VVT 2022xxxx Refactored to make tests pure JUnit5. See #6237.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -66,7 +67,7 @@
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
-import org.junit.*;
+import org.junit.jupiter.api.*;
 
 /**
  * Tests for {@link CharacterFormatParser#parse(String)}

=== modified file 'test/com/goldencode/p2j/util/TestCharacterPreprocessFormatString.java'
--- test/com/goldencode/p2j/util/TestCharacterPreprocessFormatString.java	2021-11-23 20:02:38 +0000
+++ test/com/goldencode/p2j/util/TestCharacterPreprocessFormatString.java	2022-09-30 12:05:13 +0000
@@ -12,6 +12,7 @@
 **                  Class members sorted.
 **     VVT 20210426 The broken() method removed.
 **     VVT 20211123 Missing Javadocs and annotations added.
+**     VVT 2022xxxx Refactored to make tests pure JUnit5. See #6237.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -67,10 +68,9 @@
 */
 package com.goldencode.p2j.util;
 
-import static org.junit.Assert.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.*;
 
-import org.junit.*;
+import org.junit.jupiter.api.*;
 
 /**
  * Tests for {@link character#preprocessFormatString(String)}.

=== modified file 'test/com/goldencode/p2j/util/TestCharacterToStringFormatted.java'
--- test/com/goldencode/p2j/util/TestCharacterToStringFormatted.java	2021-04-28 15:57:14 +0000
+++ test/com/goldencode/p2j/util/TestCharacterToStringFormatted.java	2022-09-30 12:05:21 +0000
@@ -13,6 +13,7 @@
 **                  Class members sorted.
 **     VVT 20210426 The generic testFormat() is used instead of plain asserts.
 **     VVT 20210428 Import statements fixed.
+**     VVT 2022xxxx Refactored to make tests pure JUnit5. See #6237.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -68,9 +69,9 @@
 */
 package com.goldencode.p2j.util;
 
-import static org.junit.Assert.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.junit.*;
+import org.junit.jupiter.api.*;
 
 /**
  * Tests for {@link character#toString(String)}.

=== modified file 'test/com/goldencode/p2j/util/TestCharacterValueOf.java'
--- test/com/goldencode/p2j/util/TestCharacterValueOf.java	2021-11-23 20:02:38 +0000
+++ test/com/goldencode/p2j/util/TestCharacterValueOf.java	2022-09-30 12:05:28 +0000
@@ -12,6 +12,7 @@
 **                  Class members sorted.
 **     VVT 20210426 The tests now use inheritance.
 **     VVT 20211123 Missing Javadocs and annotations added.
+**     VVT 2022xxxx Refactored to make tests pure JUnit5. See #6237.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -67,9 +68,9 @@
 */
 package com.goldencode.p2j.util;
 
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import org.junit.*;
+import org.junit.jupiter.api.*;
 
 /**
  * Tests for {@link character#valueOf(String)}.

=== modified file 'test/com/goldencode/p2j/util/TestDateFormatParse.java'
--- test/com/goldencode/p2j/util/TestDateFormatParse.java	2021-11-23 20:02:38 +0000
+++ test/com/goldencode/p2j/util/TestDateFormatParse.java	2022-09-30 12:05:39 +0000
@@ -13,6 +13,7 @@
 **     VVT 20210408 Test methods got better names. See #4880.
 **     VVT 20210413 Test methods inheritance added.
 **     VVT 20211123 Missing Javadocs and annotations added.
+**     VVT 2022xxxx Refactored to make tests pure JUnit5. See #6237.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -68,9 +69,9 @@
 */
 package com.goldencode.p2j.util;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 
-import org.junit.*;
+import org.junit.jupiter.api.*;
 
 /**
  * Tests for parsing date format with {@link ParsedDateFormat#getInstance(String)}.
@@ -138,7 +139,7 @@
    /**
     * This method is called once by the test engine before all test methods in this class.
     */
-   @BeforeClass
+   @BeforeAll
    public static void beforeClass()
    {
       date.setDateOrder(AbstractDateFormatTest.ORDER_DMY);

=== modified file 'test/com/goldencode/p2j/util/TestDateFormatter.java'
--- test/com/goldencode/p2j/util/TestDateFormatter.java	2021-04-26 21:13:50 +0000
+++ test/com/goldencode/p2j/util/TestDateFormatter.java	2022-09-30 12:05:47 +0000
@@ -7,6 +7,7 @@
 ** -#- -I- --Date-- ---------------------------------Description---------------------------------
 ** 001 VVT 20210413 Created initial version.
 **     VVT 20210426 Updated for changed DateFormatter API. Missing Javadocs added.
+**     VVT 2022xxxx Refactored to make tests pure JUnit5. See #6237.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -62,9 +63,9 @@
 */
 package com.goldencode.p2j.util;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
-import org.junit.*;
+import org.junit.jupiter.api.*;
 
 /**
  * Tests for formatting dates.

=== modified file 'test/com/goldencode/p2j/util/TestDateFormatting.java'
--- test/com/goldencode/p2j/util/TestDateFormatting.java	2021-11-23 20:02:38 +0000
+++ test/com/goldencode/p2j/util/TestDateFormatting.java	2022-09-30 12:05:54 +0000
@@ -8,6 +8,7 @@
 ** 001 VVT 20210413 Created initial version.
 **     VVT 20210426 Javadocs fixed.
 **     VVT 20211123 Missing Javadocs and annotations added.
+**     VVT 2022xxxx Refactored to make tests pure JUnit5. See #6237.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -63,9 +64,9 @@
 */
 package com.goldencode.p2j.util;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
-import org.junit.*;
+import org.junit.jupiter.api.*;
 
 /**
  * Tests for formatting dates with {@link date#toString(String)}.
@@ -87,7 +88,7 @@
    /**
     * This method is called once by the test engine before all test methods in this class.
     */
-   @BeforeClass
+   @BeforeAll
    public static void beforeClass()
    {
       date.setDateOrder(AbstractDateFormatTest.ORDER_DMY);

=== modified file 'test/com/goldencode/p2j/util/TestDatetimeFormatting.java'
--- test/com/goldencode/p2j/util/TestDatetimeFormatting.java	2021-11-23 20:02:38 +0000
+++ test/com/goldencode/p2j/util/TestDatetimeFormatting.java	2022-09-30 12:06:06 +0000
@@ -8,6 +8,7 @@
 ** 001 VVT 20210413 Created initial version.
 **     VVT 20210428 Class hierarchy changed.
 **     VVT 20211123 Missing Javadocs and annotations added.
+**     VVT 2022xxxx Refactored to make tests pure JUnit5. See #6237.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -63,9 +64,9 @@
 */
 package com.goldencode.p2j.util;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
-import org.junit.*;
+import org.junit.jupiter.api.*;
 
 /**
  * Tests for formatting with {@link datetime#toString(String)}
@@ -146,7 +147,7 @@
    /**
     * This method is called once by the test engine before all test methods in this class.
     */
-   @BeforeClass
+   @BeforeAll
    public static void beforeClass()
    {
       date.setDateOrder(AbstractDateFormatTest.ORDER_DMY);

=== modified file 'test/com/goldencode/p2j/util/TestLogicalSplitformat.java'
--- test/com/goldencode/p2j/util/TestLogicalSplitformat.java	2021-11-23 20:02:38 +0000
+++ test/com/goldencode/p2j/util/TestLogicalSplitformat.java	2022-09-30 12:06:13 +0000
@@ -13,6 +13,7 @@
 **     VVT 20210426 The class made generic. The test now use inheritance.
 **     VVT 20210428 Class renamed, was: TestBoolFormat. Class hierarchy changed.
 **     VVT 20211123 Missing Javadocs and annotations added.
+**     VVT 2022xxxx Refactored to make tests pure JUnit5. See #6237.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -69,9 +70,9 @@
 package com.goldencode.p2j.util;
 
 import static com.goldencode.p2j.util.character.valueOf;
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 
-import org.junit.*;
+import org.junit.jupiter.api.*;
 
 /**
  * Tests for {@link logical#splitFormat(String)} and some related functions of {@link logical}.

=== modified file 'test/com/goldencode/p2j/util/TestNumberTypeParseFormat.java'
--- test/com/goldencode/p2j/util/TestNumberTypeParseFormat.java	2021-11-23 20:02:38 +0000
+++ test/com/goldencode/p2j/util/TestNumberTypeParseFormat.java	2022-09-30 12:06:21 +0000
@@ -13,6 +13,7 @@
 **                  The class was renamed.
 **     VVT 20210426 Class renamed, former name TestNumberFormatParse.
 **     VVT 20211123 Missing Javadocs and annotations added.
+**     VVT 2022xxxx Refactored to make tests pure JUnit5. See #6237.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -68,9 +69,9 @@
 */
 package com.goldencode.p2j.util;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 
-import org.junit.*;
+import org.junit.jupiter.api.*;
 
 import com.goldencode.p2j.util.NumberType.*;
 

=== modified file 'test/com/goldencode/p2j/util/TestRowid.java'
--- test/com/goldencode/p2j/util/TestRowid.java	2021-09-17 15:14:10 +0000
+++ test/com/goldencode/p2j/util/TestRowid.java	2022-09-30 12:06:28 +0000
@@ -9,6 +9,7 @@
 **     VVT 20210331 A few more parse tests added after the review. See #5218-30.
 **     VVT 20210331 Two typos fixed.
 **     VVT 20210917 Javadoc fixed. 
+**     VVT 2022xxxx Refactored to make tests pure JUnit5. See #6237.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -64,12 +65,12 @@
 */
 package com.goldencode.p2j.util;
 
-import static org.junit.Assert.assertNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.util.function.*;
 
-import org.junit.*;
+import org.junit.jupiter.api.*;
 
 /**
  * Various tests for ROWID parsing and formatting. Includes tests for

=== modified file 'test/com/goldencode/util/TestPrintable.java'
--- test/com/goldencode/util/TestPrintable.java	2022-03-07 22:24:50 +0000
+++ test/com/goldencode/util/TestPrintable.java	2022-09-30 12:06:42 +0000
@@ -7,6 +7,7 @@
 ** -#- -I- --Date-- ---------------------------------Description---------------------------------
 ** 001 VVT 20220306 Created initial version.
 **     VVT 20220307 AbstractPrintable class eliminated. See #6013-153.
+**     VVT 2022xxxx Refactored to make tests pure JUnit5. See #6237.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -64,7 +65,7 @@
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
-import org.junit.*;
+import org.junit.jupiter.api.*;
 
 /**
  * Test classes, which implement {@link Printable} interface.

