[mapguide-commits] r9675 - in sandbox/jng/catch2/Desktop: DesktopUnmanagedApi/MapGuideApi MgDesktop MgDesktop/Services/Rendering UnitTest

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Wed Jul 15 09:00:34 PDT 2020


Author: jng
Date: 2020-07-15 09:00:34 -0700 (Wed, 15 Jul 2020)
New Revision: 9675

Removed:
   sandbox/jng/catch2/Desktop/UnitTest/TestFeatureService.h
   sandbox/jng/catch2/Desktop/UnitTest/TestKmlService.h
   sandbox/jng/catch2/Desktop/UnitTest/TestLogManager.h
   sandbox/jng/catch2/Desktop/UnitTest/TestMappingService.h
   sandbox/jng/catch2/Desktop/UnitTest/TestPerformance.h
   sandbox/jng/catch2/Desktop/UnitTest/TestProfilingService.h
   sandbox/jng/catch2/Desktop/UnitTest/TestRenderingService.h
   sandbox/jng/catch2/Desktop/UnitTest/TestResourceService.h
   sandbox/jng/catch2/Desktop/UnitTest/TestTileService.h
Modified:
   sandbox/jng/catch2/Desktop/DesktopUnmanagedApi/MapGuideApi/Constants.xml
   sandbox/jng/catch2/Desktop/DesktopUnmanagedApi/MapGuideApi/MapGuideApiGen.xml
   sandbox/jng/catch2/Desktop/MgDesktop/MgDesktop.h
   sandbox/jng/catch2/Desktop/MgDesktop/MgDesktop.vcxproj
   sandbox/jng/catch2/Desktop/MgDesktop/Services/Rendering/RSMgFeatureReader.cpp
   sandbox/jng/catch2/Desktop/MgDesktop/Services/Rendering/RSMgFeatureReader.h
   sandbox/jng/catch2/Desktop/UnitTest/CMakeLists.txt
   sandbox/jng/catch2/Desktop/UnitTest/TestFeatureService.cpp
   sandbox/jng/catch2/Desktop/UnitTest/TestKmlService.cpp
   sandbox/jng/catch2/Desktop/UnitTest/TestLogManager.cpp
   sandbox/jng/catch2/Desktop/UnitTest/TestLogManagerThread.cpp
   sandbox/jng/catch2/Desktop/UnitTest/TestMappingService.cpp
   sandbox/jng/catch2/Desktop/UnitTest/TestPerformance.cpp
   sandbox/jng/catch2/Desktop/UnitTest/TestProfilingService.cpp
   sandbox/jng/catch2/Desktop/UnitTest/TestRenderingService.cpp
   sandbox/jng/catch2/Desktop/UnitTest/TestResourceService.cpp
   sandbox/jng/catch2/Desktop/UnitTest/TestTileService.cpp
   sandbox/jng/catch2/Desktop/UnitTest/UnitTest.vcxproj
   sandbox/jng/catch2/Desktop/UnitTest/UnitTest.vcxproj.filters
   sandbox/jng/catch2/Desktop/UnitTest/main.cpp
Log:
Port mg-desktop test suite over to catch2 and fix up some breakages

Modified: sandbox/jng/catch2/Desktop/DesktopUnmanagedApi/MapGuideApi/Constants.xml
===================================================================
--- sandbox/jng/catch2/Desktop/DesktopUnmanagedApi/MapGuideApi/Constants.xml	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/DesktopUnmanagedApi/MapGuideApi/Constants.xml	2020-07-15 16:00:34 UTC (rev 9675)
@@ -84,6 +84,7 @@
   <Class name="MgGeometricPathInstructionType" />
   <Class name="MgGeometryType" />
   <Class name="MgGeometryComponentType" />
+  <Class name="MgGeometrySimplificationAlgorithmType" />
   <Class name="MgLayerGroupType" />
   <Class name="MgLayerType" />
   <Class name="MgFeatureGeometricType" />
@@ -155,6 +156,7 @@
     <Header path="../../../Common/Geometry/GeometricPathInstructionType.h" />
     <Header path="../../../Common/Geometry/GeometryComponentType.h" />
     <Header path="../../../Common/Geometry/GeometryType.h" />
+    <Header path="../../../Common/Geometry/GeometrySimplificationAlgorithmType.h" />
     <Header path="../../../Common/Geometry/CoordinateSystem/CoordinateSystemCodeFormat.h" />
     <Header path="../../../Common/Geometry/CoordinateSystem/CoordinateSystemErrorCode.h" />
     <Header path="../../../Common/Geometry/CoordinateSystem/CoordinateSystemGeodeticTransformationMethod.h" />

Modified: sandbox/jng/catch2/Desktop/DesktopUnmanagedApi/MapGuideApi/MapGuideApiGen.xml
===================================================================
--- sandbox/jng/catch2/Desktop/DesktopUnmanagedApi/MapGuideApi/MapGuideApiGen.xml	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/DesktopUnmanagedApi/MapGuideApi/MapGuideApiGen.xml	2020-07-15 16:00:34 UTC (rev 9675)
@@ -187,6 +187,7 @@
     <Header path="../../../Common/Geometry/Envelope.h" />
     <Header path="../../../Common/Geometry/GeometryCollection.h" />
     <Header path="../../../Common/Geometry/GeometryFactory.h" />
+    <Header path="../../../Common/Geometry/GeometrySimplifier.h" />
     <Header path="../../../Common/Geometry/LinearRing.h" />
     <Header path="../../../Common/Geometry/LinearRingCollection.h" />
     <Header path="../../../Common/Geometry/LinearSegment.h" />
@@ -203,6 +204,7 @@
     <Header path="../../../Common/Geometry/PointCollection.h" />
     <Header path="../../../Common/Geometry/Polygon.h" />
     <Header path="../../../Common/Geometry/PolygonCollection.h" />
+    <Header path="../../../Common/Geometry/PreparedGeometry.h" />
     <Header path="../../../Common/Geometry/Transform.h" />
     <Header path="../../../Common/Geometry/WktReaderWriter.h" />
 

Modified: sandbox/jng/catch2/Desktop/MgDesktop/MgDesktop.h
===================================================================
--- sandbox/jng/catch2/Desktop/MgDesktop/MgDesktop.h	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/MgDesktop/MgDesktop.h	2020-07-15 16:00:34 UTC (rev 9675)
@@ -80,6 +80,7 @@
 
 //Uncomment to debug memory leaks. This is the header for Visual Leak Detector
 //See: http://vld.codeplex.com for download and setup
+/*
 #ifdef _WIN32
 #ifdef _DEBUG
 #define USING_VLD
@@ -86,6 +87,7 @@
 #include <vld.h>
 #endif
 #endif
+*/
 
 //Uncomment to get extra FDO join chatter when running unit tests
 //#define DEBUG_FDOJOIN

Modified: sandbox/jng/catch2/Desktop/MgDesktop/MgDesktop.vcxproj
===================================================================
--- sandbox/jng/catch2/Desktop/MgDesktop/MgDesktop.vcxproj	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/MgDesktop/MgDesktop.vcxproj	2020-07-15 16:00:34 UTC (rev 9675)
@@ -94,11 +94,11 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
     </ClCompile>
     <Link>
-      <AdditionalDependencies>FDO.lib;FDOCommon.lib;FDOGeometry.lib;ExpressionEngine.lib;ACEd.lib;MgFoundationd.lib;MgGeometryd.lib;MgMdfModeld.lib;MgMdfParserd.lib;MgPlatformBased.lib;MgRenderersd.lib;MgStylizationd.lib;MgGwsCommond.lib;MgGwsQueryEngined.lib;xerces-c_3mgD.lib;dwfcore_wt.1.7.0.lib;dwftk_wt.7.7.0.lib;w3dtk_wt.1.7.1555.lib;whiptk_wt.7.13.601.lib;MgSecurityd.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>FDO.lib;FDOCommon.lib;FDOGeometry.lib;FDOSpatial.lib;ExpressionEngine.lib;ACEd.lib;MgFoundationd.lib;MgGeometryd.lib;MgMdfModeld.lib;MgMdfParserd.lib;MgPlatformBased.lib;MgRenderersd.lib;MgStylizationd.lib;MgGwsCommond.lib;MgGwsQueryEngined.lib;xerces-c_3mgD.lib;dwfcore_wt.1.7.0.lib;dwftk_wt.7.7.0.lib;w3dtk_wt.1.7.1555.lib;whiptk_wt.7.13.601.lib;MgSecurityd.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <ShowProgress>NotSet</ShowProgress>
       <OutputFile>$(OutDir)MgDesktopd.dll</OutputFile>
       <AdditionalLibraryDirectories>..\..\Oem\ACE\ACE_wrappers\lib\$(Configuration);..\..\Oem\FDO\Lib;..\..\Oem\DWFTK\develop\global\lib\static\$(Configuration)\vc10.0;..\..\Oem\dbxml\xerces-c-src\Build\$(Configuration);..\..\Common\lib\$(Configuration);..\..\Server\lib\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <DelayLoadDLLs>FDO.dll;FDOCommon.dll;FDOGeometry.dll;ExpressionEngine.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
+      <DelayLoadDLLs>FDO.dll;FDOCommon.dll;FDOGeometry.dll;FDOSpatial.dll;ExpressionEngine.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <SubSystem>Windows</SubSystem>
       <OptimizeReferences>
@@ -131,10 +131,10 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
     </ClCompile>
     <Link>
-      <AdditionalDependencies>FDO.lib;FDOCommon.lib;FDOGeometry.lib;ExpressionEngine.lib;ACE.lib;MgFoundation.lib;MgGeometry.lib;MgMdfModel.lib;MgMdfParser.lib;MgPlatformBase.lib;MgRenderers.lib;MgStylization.lib;MgGwsCommon.lib;MgGwsQueryEngine.lib;xerces-c_3mg.lib;dwfcore_wt.1.7.0.lib;dwftk_wt.7.7.0.lib;w3dtk_wt.1.7.1555.lib;whiptk_wt.7.13.601.lib;MgSecurity.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>FDO.lib;FDOCommon.lib;FDOGeometry.lib;FDOSpatial.lib;ExpressionEngine.lib;ACE.lib;MgFoundation.lib;MgGeometry.lib;MgMdfModel.lib;MgMdfParser.lib;MgPlatformBase.lib;MgRenderers.lib;MgStylization.lib;MgGwsCommon.lib;MgGwsQueryEngine.lib;xerces-c_3mg.lib;dwfcore_wt.1.7.0.lib;dwftk_wt.7.7.0.lib;w3dtk_wt.1.7.1555.lib;whiptk_wt.7.13.601.lib;MgSecurity.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>$(OutDir)$(ProjectName).dll</OutputFile>
       <AdditionalLibraryDirectories>..\..\Oem\ACE\ACE_wrappers\lib\$(Configuration);..\..\Oem\FDO\Lib;..\..\Oem\DWFTK\develop\global\lib\static\$(Configuration)\vc10.0;..\..\Oem\dbxml\xerces-c-src\Build\$(Configuration);..\..\Common\lib\$(Configuration);..\..\Server\lib\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <DelayLoadDLLs>MgMdfParser.dll;MgGeometry.dll;MgGwsCommon.dll;MgGwsResource.dll;FDO.dll;FDOCommon.dll;MgStylization.dll;FDOGeometry.dll;ExpressionEngine.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
+      <DelayLoadDLLs>MgMdfParser.dll;MgGeometry.dll;MgGwsCommon.dll;MgGwsResource.dll;FDO.dll;FDOCommon.dll;FDOSpatial.dll;MgStylization.dll;FDOGeometry.dll;ExpressionEngine.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <SubSystem>Windows</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>
@@ -167,11 +167,11 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
     </ClCompile>
     <Link>
-      <AdditionalDependencies>FDO.lib;FDOCommon.lib;FDOGeometry.lib;ExpressionEngine.lib;ACEd.lib;MgFoundationd.lib;MgGeometryd.lib;MgMdfModeld.lib;MgMdfParserd.lib;MgPlatformBased.lib;MgRenderersd.lib;MgStylizationd.lib;MgGwsCommond.lib;MgGwsQueryEngined.lib;xerces-c_3mgD.lib;dwfcore_wt.1.7.0.lib;dwftk_wt.7.7.0.lib;w3dtk_wt.1.7.1555.lib;whiptk_wt.7.13.601.lib;MgSecurityd.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>FDO.lib;FDOCommon.lib;FDOGeometry.lib;FDOSpatial.lib;ExpressionEngine.lib;ACEd.lib;MgFoundationd.lib;MgGeometryd.lib;MgMdfModeld.lib;MgMdfParserd.lib;MgPlatformBased.lib;MgRenderersd.lib;MgStylizationd.lib;MgGwsCommond.lib;MgGwsQueryEngined.lib;xerces-c_3mgD.lib;dwfcore_wt.1.7.0.lib;dwftk_wt.7.7.0.lib;w3dtk_wt.1.7.1555.lib;whiptk_wt.7.13.601.lib;MgSecurityd.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <ShowProgress>NotSet</ShowProgress>
       <OutputFile>$(OutDir)MgDesktopd.dll</OutputFile>
-      <AdditionalLibraryDirectories>..\..\Oem\ACE\ACE_wrappers\lib64\$(Configuration);..\..\Oem\FDO\Lib64;..\..\Oem\DWFTK\develop\global\lib\static\$(Configuration)64\vc10.0;..\..\Oem\dbxml\xerces-c-src\Build\$(Configuration)64;..\..\Common\lib\$(Configuration)64;..\..\Server\lib\$(Configuration)64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <DelayLoadDLLs>FDO.dll;FDOCommon.dll;FDOGeometry.dll;ExpressionEngine.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
+      <AdditionalLibraryDirectories>..\..\Oem\ACE\ACE_wrappers\lib64\$(Configuration);..\..\Oem\FDO\Lib64;..\..\Oem\DWFTK\develop\global\lib\x64\static\$(Configuration)\vc10.0;..\..\Oem\dbxml\xerces-c-src\Build\$(Configuration)64;..\..\Common\lib\$(Configuration)64;..\..\Server\lib\$(Configuration)64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <DelayLoadDLLs>FDO.dll;FDOCommon.dll;FDOGeometry.dll;FDOSpatial.dll;ExpressionEngine.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <SubSystem>Windows</SubSystem>
       <OptimizeReferences>
@@ -207,10 +207,10 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
     </ClCompile>
     <Link>
-      <AdditionalDependencies>FDO.lib;FDOCommon.lib;FDOGeometry.lib;ExpressionEngine.lib;ACE.lib;MgFoundation.lib;MgGeometry.lib;MgMdfModel.lib;MgMdfParser.lib;MgPlatformBase.lib;MgRenderers.lib;MgStylization.lib;MgGwsCommon.lib;MgGwsQueryEngine.lib;xerces-c_3mg.lib;dwfcore_wt.1.7.0.lib;dwftk_wt.7.7.0.lib;w3dtk_wt.1.7.1555.lib;whiptk_wt.7.13.601.lib;MgSecurity.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>FDO.lib;FDOCommon.lib;FDOGeometry.lib;FDOSpatial.lib;ExpressionEngine.lib;ACE.lib;MgFoundation.lib;MgGeometry.lib;MgMdfModel.lib;MgMdfParser.lib;MgPlatformBase.lib;MgRenderers.lib;MgStylization.lib;MgGwsCommon.lib;MgGwsQueryEngine.lib;xerces-c_3mg.lib;dwfcore_wt.1.7.0.lib;dwftk_wt.7.7.0.lib;w3dtk_wt.1.7.1555.lib;whiptk_wt.7.13.601.lib;MgSecurity.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>$(OutDir)$(ProjectName).dll</OutputFile>
       <AdditionalLibraryDirectories>..\..\Oem\ACE\ACE_wrappers\lib64\$(Configuration);..\..\Oem\FDO\Lib64;..\..\Oem\DWFTK\develop\global\lib\x64\static\$(Configuration)\vc10.0;..\..\Oem\dbxml\xerces-c-src\Build\$(Configuration)64;..\..\Common\lib\$(Configuration)64;..\..\Server\lib\$(Configuration)64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <DelayLoadDLLs>MgMdfParser.dll;MgGeometry.dll;MgGwsCommon.dll;MgGwsResource.dll;FDO.dll;FDOCommon.dll;MgStylization.dll;FDOGeometry.dll;ExpressionEngine.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
+      <DelayLoadDLLs>MgMdfParser.dll;MgGeometry.dll;MgGwsCommon.dll;MgGwsResource.dll;FDO.dll;FDOCommon.dll;FDOSpatial.dll;MgStylization.dll;FDOGeometry.dll;ExpressionEngine.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <SubSystem>Windows</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>

Modified: sandbox/jng/catch2/Desktop/MgDesktop/Services/Rendering/RSMgFeatureReader.cpp
===================================================================
--- sandbox/jng/catch2/Desktop/MgDesktop/Services/Rendering/RSMgFeatureReader.cpp	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/MgDesktop/Services/Rendering/RSMgFeatureReader.cpp	2020-07-15 16:00:34 UTC (rev 9675)
@@ -3,6 +3,7 @@
 #include "RSMgInputStream.h"
 #include "LineBuffer.h"
 #include "Services/FeatureReader.h"
+#include "FdoSpatial.h"
 //#include "ServerGwsFeatureReader.h"
 
 //we want to catch the MgException and rethrow a FdoException which
@@ -278,8 +279,9 @@
 
 
 LineBuffer* RSMgdFeatureReader::GetGeometry(const wchar_t*   propertyName,
-                                           LineBuffer*      lb,
-                                           CSysTransformer* xformer)
+                                            LineBuffer*      lb,
+                                            CSysTransformer* xformer,
+                                            RS_DesiredPolygonOrientation polygonOrientation)
 {
     RSFR_TRY()
 
@@ -293,8 +295,66 @@
         throw FdoException::Create(FdoException::NLSGetMessage(FDO_NLSID(FDO_60_NULL_POINTER)));
 
     _ASSERT(lb);
-    lb->LoadFromAgf(agf, sz, xformer);
 
+    //Peek at the raw AGF bytes to see if it's a polygon ahead of time.
+    int* ireader = (int*)agf;
+    // the geometry type
+    auto geomType = (FdoGeometryType)*ireader++;
+    bool isPolygon = geomType == FdoGeometryType_Polygon
+        || geomType == FdoGeometryType_MultiPolygon
+        || geomType == FdoGeometryType_CurvePolygon
+        || geomType == FdoGeometryType_MultiCurvePolygon;
+
+    if (isPolygon && polygonOrientation != RS_DesiredPolygonOrientation::NotApplicable)
+    {
+        FdoPtr<FdoFgfGeometryFactory> geomFactory = FdoFgfGeometryFactory::GetInstance();
+        FdoPtr<FdoIGeometry> geom = geomFactory->CreateGeometryFromFgf(agf, sz);
+        FdoPtr<FdoIGeometry> reoriented;
+
+        switch (polygonOrientation)
+        {
+        case RS_DesiredPolygonOrientation::Clockwise:
+        {
+            reoriented = FdoSpatialUtility::FixPolygonVertexOrder(geom, FdoPolygonVertexOrderRule_CW);
+            FdoPtr<FdoByteArray> reFgf;
+            if (NULL != reoriented.p)
+            {
+                reFgf = geomFactory->GetFgf(reoriented);
+                lb->LoadFromAgf(reFgf->GetData(), reFgf->GetCount(), xformer);
+            }
+            else //Load original
+            {
+                lb->LoadFromAgf(agf, sz, xformer);
+            }
+            break;
+        }
+        case RS_DesiredPolygonOrientation::CounterClockwise:
+        {
+            reoriented = FdoSpatialUtility::FixPolygonVertexOrder(geom, FdoPolygonVertexOrderRule_CCW);
+            FdoPtr<FdoByteArray> reFgf;
+            if (NULL != reoriented.p)
+            {
+                reFgf = geomFactory->GetFgf(reoriented);
+                lb->LoadFromAgf(reFgf->GetData(), reFgf->GetCount(), xformer);
+            }
+            else //Load original
+            {
+                lb->LoadFromAgf(agf, sz, xformer);
+            }
+            break;
+        }
+        default:
+        {
+            _ASSERT(false);
+            break;
+        }
+        }
+    }
+    else
+    {
+        lb->LoadFromAgf(agf, sz, xformer);
+    }
+
     return lb;
 
     RSFR_CATCH()

Modified: sandbox/jng/catch2/Desktop/MgDesktop/Services/Rendering/RSMgFeatureReader.h
===================================================================
--- sandbox/jng/catch2/Desktop/MgDesktop/Services/Rendering/RSMgFeatureReader.h	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/MgDesktop/Services/Rendering/RSMgFeatureReader.h	2020-07-15 16:00:34 UTC (rev 9675)
@@ -42,7 +42,7 @@
     virtual FdoInt32        GetInt32       (const wchar_t* propertyName);
     virtual FdoInt64        GetInt64       (const wchar_t* propertyName);
     virtual const wchar_t*  GetString      (const wchar_t* propertyName);
-    virtual LineBuffer*     GetGeometry    (const wchar_t* propertyName, LineBuffer* lb, CSysTransformer* xformer);
+    virtual LineBuffer*     GetGeometry    (const wchar_t* propertyName, LineBuffer* lb, CSysTransformer* xformer, RS_DesiredPolygonOrientation polygonOrientation);
     virtual RS_Raster*      GetRaster      (const wchar_t* propertyName);
     virtual const wchar_t*  GetAsString    (const wchar_t* propertyName);
     virtual RS_InputStream* GetBLOB        (const wchar_t* propertyName);

Modified: sandbox/jng/catch2/Desktop/UnitTest/CMakeLists.txt
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/CMakeLists.txt	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/UnitTest/CMakeLists.txt	2020-07-15 16:00:34 UTC (rev 9675)
@@ -26,6 +26,7 @@
     TestProfilingService.cpp
     TestRenderingService.cpp
     TestResourceService.cpp
+    TestServiceFactory.cpp
     TestTileService.cpp
 )
 

Modified: sandbox/jng/catch2/Desktop/UnitTest/TestFeatureService.cpp
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/TestFeatureService.cpp	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/UnitTest/TestFeatureService.cpp	2020-07-15 16:00:34 UTC (rev 9675)
@@ -17,327 +17,27 @@
 
 #include "Services/Feature/FeatureUtil.h"
 #include "MgDesktop.h"
-#include "Services/Feature/FdoConnectionPool.h"
-#include "TestFeatureService.h"
 #include "CppUnitExtensions.h"
 #include "Fdo.h"
 #include <ctime>
 
+#include "CatchHelperMacros.h"
+#include "TestServiceFactory.h"
+#include "catch.hpp"
+
 //Uncommenting this will make the join benchmarks 10-15x slower (because we're writing each feature out!)
 //
 //#define DUMP_BENCHMARK_RESULTS
 
-const STRING TEST_LOCALE = L"en";
 const STRING wkt = L"LOCAL_CS[\"Non-Earth (Meter)\",LOCAL_DATUM[\"Local Datum\",0],UNIT[\"Meter\", 1],AXIS[\"X\",EAST],AXIS[\"Y\",NORTH]]";
 
-CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(TestFeatureService, "TestFeatureService");
 
-
-void TestFeatureService::setUp()
-{
-}
-
-
-void TestFeatureService::tearDown()
-{
-}
-
-
-void TestFeatureService::TestStart()
-{
-    ACE_DEBUG((LM_INFO, ACE_TEXT("\nRunning Feature Service tests.\n")));
-
-    try
-    {
-        Ptr<MgdServiceFactory> fact = new MgdServiceFactory();
-        Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
-        if (pService == 0)
-        {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestStart", __LINE__, __WFILE__, NULL, L"", NULL);
-        }
-        Ptr<MgdFeatureService> featSvc = dynamic_cast<MgdFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
-        if (featSvc == 0)
-        {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestStart", __LINE__, __WFILE__, NULL, L"", NULL);
-        }
-
-        // publish the map definition
-        Ptr<MgResourceIdentifier> mapres1 = new MgResourceIdentifier(L"Library://UnitTests/Maps/SheboyganWriteable.MapDefinition");
-        Ptr<MgByteSource> mdfsrc1 = new MgByteSource(L"../UnitTestFiles/UT_Sheboygan_Writeable.mdf", false);
-        Ptr<MgByteReader> mdfrdr1 = mdfsrc1->GetReader();
-        pService->SetResource(mapres1, mdfrdr1, NULL);
-
-        Ptr<MgResourceIdentifier> ldfres3 = new MgResourceIdentifier(L"Library://UnitTests/Layers/ParcelsWriteable.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc3 = new MgByteSource(L"../UnitTestFiles/UT_Parcels_Writeable.ldf", false);
-        Ptr<MgByteReader> ldfrdr3 = ldfsrc3->GetReader();
-        pService->SetResource(ldfres3, ldfrdr3, NULL);
-
-        Ptr<MgResourceIdentifier> fsres3 = new MgResourceIdentifier(L"Library://UnitTests/Data/ParcelsWriteable.FeatureSource");
-        Ptr<MgByteSource> fssrc3 = new MgByteSource(L"../UnitTestFiles/UT_Parcels_writeable.fs", false);
-        Ptr<MgByteReader> fsrdr3 = fssrc3->GetReader();
-        pService->SetResource(fsres3, fsrdr3, NULL);
-
-        Ptr<MgByteSource> fsSource3 = new MgByteSource(L"../UnitTestFiles/UT_Parcels.sdf", false);
-        Ptr<MgByteReader> fsReader3 = fsSource3->GetReader();
-        pService->SetResourceData(fsres3, L"UT_Parcels.sdf", L"File", fsReader3);
-
-        MgResourceIdentifier resourceIdentifier1(L"Library://UnitTests/Data/Sheboygan_Parcels.FeatureSource");
-        MgResourceIdentifier resourceIdentifier2(L"Library://UnitTests/Data/Redding_Parcels.FeatureSource");
-        MgResourceIdentifier resourceIdentifier3(L"Library://UnitTests/Data/Sheboygan_BuildingOutlines.FeatureSource");
-        MgResourceIdentifier resourceIdentifier4(L"Library://UnitTests/Data/Sheboygan_VotingDistricts.FeatureSource");
-        MgResourceIdentifier resourceIdentifier5(L"Library://UnitTests/Data/TestChainedInner1ToManyJoin.FeatureSource");
-        MgResourceIdentifier resourceIdentifier6(L"Library://UnitTests/Data/Empty.FeatureSource");
-        MgResourceIdentifier resourceIdentifier7(L"Library://UnitTests/Data/Sheboygan_Parcels_Writable.FeatureSource");
-        MgResourceIdentifier resourceIdentifier8(L"Library://UnitTests/Data/FdoJoin.FeatureSource");
-        MgResourceIdentifier resourceIdentifier9(L"Library://UnitTests/Data/SecuredCredentials.FeatureSource");
-#ifdef _WIN32
-        STRING resourceContentFileName1 = L"..\\UnitTestFiles\\Sheboygan_Parcels.FeatureSource";
-        STRING resourceContentFileName2 = L"..\\UnitTestFiles\\Redding_Parcels.FeatureSource";
-        STRING resourceContentFileName3 = L"..\\UnitTestFiles\\Sheboygan_BuildingOutlines.FeatureSource";
-        STRING resourceContentFileName4 = L"..\\UnitTestFiles\\Sheboygan_VotingDistricts.FeatureSource";
-        STRING resourceContentFileName5=  L"..\\UnitTestFiles\\TESTChainedInner1ToManyJoin.FeatureSource";
-        STRING resourceContentFileName6=  L"..\\UnitTestFiles\\Empty.FeatureSource";
-        STRING resourceContentFileName7=  L"..\\UnitTestFiles\\Sheboygan_Parcels_Writable.FeatureSource";
-        STRING resourceContentFileName8=  L"..\\UnitTestFiles\\UT_FdoJoin.FeatureSource";
-        STRING resourceContentFileName9=  L"..\\UnitTestFiles\\SecuredCredentials.fs";
-        STRING dataFileName1 = L"..\\UnitTestFiles\\Sheboygan_Parcels.sdf";
-        STRING dataFileName2 = L"..\\UnitTestFiles\\Redding_Parcels.shp";
-        STRING dataFileName3 = L"..\\UnitTestFiles\\Redding_Parcels.dbf";
-        STRING dataFileName4 = L"..\\UnitTestFiles\\Redding_Parcels.shx";
-        STRING dataFileName5 = L"..\\UnitTestFiles\\Sheboygan_BuildingOutlines.sdf";
-        STRING dataFileName6 = L"..\\UnitTestFiles\\Sheboygan_VotingDistricts.sdf";
-        STRING dataFileName7 = L"..\\UnitTestFiles\\Empty.sdf";
-        STRING dataFileName8 = L"..\\UnitTestFiles\\JoinTest.sqlite";
-#else
-        STRING resourceContentFileName1 = L"../UnitTestFiles/Sheboygan_Parcels.FeatureSource";
-        STRING resourceContentFileName2 = L"../UnitTestFiles/Redding_Parcels.FeatureSource";
-        STRING resourceContentFileName3 = L"../UnitTestFiles/Sheboygan_BuildingOutlines.FeatureSource";
-        STRING resourceContentFileName4 = L"../UnitTestFiles/Sheboygan_VotingDistricts.FeatureSource";
-        STRING resourceContentFileName5 = L"../UnitTestFiles/TESTChainedInner1ToManyJoin.FeatureSource";
-        STRING resourceContentFileName6 = L"../UnitTestFiles/Empty.FeatureSource";
-        STRING resourceContentFileName7=  L"../UnitTestFiles/Sheboygan_Parcels_Writable.FeatureSource";
-        STRING resourceContentFileName8=  L"../UnitTestFiles/UT_FdoJoin.FeatureSource";
-        STRING resourceContentFileName9=  L"../UnitTestFiles/SecuredCredentials.fs";
-        STRING dataFileName1 = L"../UnitTestFiles/Sheboygan_Parcels.sdf";
-        STRING dataFileName2 = L"../UnitTestFiles/Redding_Parcels.shp";
-        STRING dataFileName3 = L"../UnitTestFiles/Redding_Parcels.dbf";
-        STRING dataFileName4 = L"../UnitTestFiles/Redding_Parcels.shx";
-        STRING dataFileName5 = L"../UnitTestFiles/Sheboygan_BuildingOutlines.sdf";
-        STRING dataFileName6 = L"../UnitTestFiles/Sheboygan_VotingDistricts.sdf";
-        STRING dataFileName7 = L"../UnitTestFiles/Empty.sdf";
-        STRING dataFileName8 = L"../UnitTestFiles/JoinTest.sqlite";
-#endif
-
-        //Add a new resource
-        Ptr<MgByteSource> contentSource1 = new MgByteSource(resourceContentFileName1);
-        Ptr<MgByteReader> contentReader1 = contentSource1->GetReader();
-        pService->SetResource(&resourceIdentifier1, contentReader1, NULL);
-
-        Ptr<MgByteSource> contentSource2 = new MgByteSource(resourceContentFileName2);
-        Ptr<MgByteReader> contentReader2 = contentSource2->GetReader();
-        pService->SetResource(&resourceIdentifier2, contentReader2, NULL);
-
-        Ptr<MgByteSource> contentSource3 = new MgByteSource(resourceContentFileName3);
-        Ptr<MgByteReader> contentReader3 = contentSource3->GetReader();
-        pService->SetResource(&resourceIdentifier3, contentReader3, NULL);
-
-        Ptr<MgByteSource> contentSource4 = new MgByteSource(resourceContentFileName4);
-        Ptr<MgByteReader> contentReader4 = contentSource4->GetReader();
-        pService->SetResource(&resourceIdentifier4, contentReader4, NULL);
-
-        Ptr<MgByteSource> contentSource5 = new MgByteSource(resourceContentFileName5);
-        Ptr<MgByteReader> contentReader5 = contentSource5->GetReader();
-        pService->SetResource(&resourceIdentifier5, contentReader5, NULL);
-
-        Ptr<MgByteSource> contentSource6 = new MgByteSource(resourceContentFileName6);
-        Ptr<MgByteReader> contentReader6 = contentSource6->GetReader();
-        pService->SetResource(&resourceIdentifier6, contentReader6, NULL);
-
-        Ptr<MgByteSource> contentSource7 = new MgByteSource(resourceContentFileName7);
-        Ptr<MgByteReader> contentReader7 = contentSource7->GetReader();
-        pService->SetResource(&resourceIdentifier7, contentReader7, NULL);
-
-        Ptr<MgByteSource> contentSource8 = new MgByteSource(resourceContentFileName8);
-        Ptr<MgByteReader> contentReader8 = contentSource8->GetReader();
-        pService->SetResource(&resourceIdentifier8, contentReader8, NULL);
-
-        Ptr<MgByteSource> contentSource9 = new MgByteSource(resourceContentFileName9);
-        Ptr<MgByteReader> contentReader9 = contentSource9->GetReader();
-        pService->SetResource(&resourceIdentifier9, contentReader9, NULL);
-
-        //Set the resource data
-        Ptr<MgByteSource> dataSource1 = new MgByteSource(dataFileName1);
-        Ptr<MgByteReader> dataReader1 = dataSource1->GetReader();
-        pService->SetResourceData(&resourceIdentifier1, L"Sheboygan_Parcels.sdf", L"File", dataReader1);
-
-        Ptr<MgByteSource> dataSource2 = new MgByteSource(dataFileName2);
-        Ptr<MgByteReader> dataReader2 = dataSource2->GetReader();
-        pService->SetResourceData(&resourceIdentifier2, L"Redding_Parcels.shp", L"File", dataReader2);
-
-        Ptr<MgByteSource> dataSource3 = new MgByteSource(dataFileName3);
-        Ptr<MgByteReader> dataReader3 = dataSource3->GetReader();
-        pService->SetResourceData(&resourceIdentifier2, L"Redding_Parcels.dbf", L"File", dataReader3);
-
-        Ptr<MgByteSource> dataSource4 = new MgByteSource(dataFileName4);
-        Ptr<MgByteReader> dataReader4 = dataSource4->GetReader();
-        pService->SetResourceData(&resourceIdentifier2, L"Redding_Parcels.shx", L"File", dataReader4);
-
-        Ptr<MgByteSource> dataSource5 = new MgByteSource(dataFileName5);
-        Ptr<MgByteReader> dataReader5 = dataSource5->GetReader();
-        pService->SetResourceData(&resourceIdentifier3, L"Sheboygan_BuildingOutlines.sdf", L"File", dataReader5);
-
-        Ptr<MgByteSource> dataSource6 = new MgByteSource(dataFileName6);
-        Ptr<MgByteReader> dataReader6 = dataSource6->GetReader();
-        pService->SetResourceData(&resourceIdentifier4, L"Sheboygan_VotingDistricts.sdf", L"File", dataReader6);
-
-        Ptr<MgByteSource> dataSource7 = new MgByteSource(dataFileName1);
-        Ptr<MgByteReader> dataReader7 = dataSource7->GetReader();
-        pService->SetResourceData(&resourceIdentifier5, L"Sheboygan_Parcels.sdf", L"File", dataReader7);
-
-        Ptr<MgByteSource> dataSource8 = new MgByteSource(dataFileName7);
-        Ptr<MgByteReader> dataReader8 = dataSource8->GetReader();
-        pService->SetResourceData(&resourceIdentifier6, L"Empty.sdf", L"File", dataReader8);
-
-        Ptr<MgByteSource> dataSource9 = new MgByteSource(dataFileName1);
-        Ptr<MgByteReader> dataReader9 = dataSource9->GetReader();
-        pService->SetResourceData(&resourceIdentifier7, L"Sheboygan_Parcels.sdf", L"File", dataReader9);
-
-        Ptr<MgByteSource> dataSource10 = new MgByteSource(dataFileName8);
-        Ptr<MgByteReader> dataReader10 = dataSource10->GetReader();
-        pService->SetResourceData(&resourceIdentifier8, L"JoinTest.sqlite", L"File", dataReader10);
-
-        //Sortable Right side data set
-        Ptr<MgResourceIdentifier> fsId = new MgResourceIdentifier(L"Library://UnitTests/Data/SortableRight.FeatureSource");
-        Ptr<MgByteSource> fsContent = new MgByteSource(L"../UnitTestFiles/UT_Sortable_Right.fs");
-        Ptr<MgByteReader> fsReader = fsContent->GetReader();
-
-        pService->SetResource(fsId, fsReader, NULL);
-        Ptr<MgByteSource> fsData = new MgByteSource(L"../UnitTestFiles/SortableRight.sqlite");
-        Ptr<MgByteReader> fsDataReader = fsData->GetReader();
-
-        pService->SetResourceData(fsId, L"SortableRight.sqlite", L"File", fsDataReader);
-        //CPPUNIT_ASSERT(featSvc->TestConnection(fsId));
-
-        //Sortable Left side data set
-        fsId = new MgResourceIdentifier(L"Library://UnitTests/Data/SortableLeft.FeatureSource");
-        fsContent = new MgByteSource(L"../UnitTestFiles/UT_Sortable_Left.fs");
-        fsReader = fsContent->GetReader();
-
-        pService->SetResource(fsId, fsReader, NULL);
-        fsData = new MgByteSource(L"../UnitTestFiles/SortableLeft.sqlite");
-        fsDataReader = fsData->GetReader();
-
-        pService->SetResourceData(fsId, L"SortableLeft.sqlite", L"File", fsDataReader);
-        //CPPUNIT_ASSERT(featSvc->TestConnection(fsId));
-
-        //Unsortable Right side data set
-        fsId = new MgResourceIdentifier(L"Library://UnitTests/Data/UnsortableRight.FeatureSource");
-        fsContent = new MgByteSource(L"../UnitTestFiles/UT_Unsortable_Right.fs");
-        fsReader = fsContent->GetReader();
-
-        pService->SetResource(fsId, fsReader, NULL);
-        fsData = new MgByteSource(L"../UnitTestFiles/UnsortableRight.sdf");
-        fsDataReader = fsData->GetReader();
-
-        pService->SetResourceData(fsId, L"UnsortableRight.sdf", L"File", fsDataReader);
-        //CPPUNIT_ASSERT(featSvc->TestConnection(fsId));
-
-        //Unsortable Left side data set
-        fsId = new MgResourceIdentifier(L"Library://UnitTests/Data/UnsortableLeft.FeatureSource");
-        fsContent = new MgByteSource(L"../UnitTestFiles/UT_Unsortable_Left.fs");
-        fsReader = fsContent->GetReader();
-
-        pService->SetResource(fsId, fsReader, NULL);
-        fsData = new MgByteSource(L"../UnitTestFiles/UnsortableLeft.sdf");
-        fsDataReader = fsData->GetReader();
-
-        pService->SetResourceData(fsId, L"UnsortableLeft.sdf", L"File", fsDataReader);
-        //CPPUNIT_ASSERT(featSvc->TestConnection(fsId));
-    }
-    catch(MgException* e)
-    {
-        STRING message = e->GetDetails(TEST_LOCALE);
-        SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
-    }
-}
-
-
-void TestFeatureService::TestEnd()
-{
-    try
-    {
-        Ptr<MgdServiceFactory> fact = new MgdServiceFactory();
-        Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
-        if (pService == 0)
-        {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestEnd",
-                __LINE__, __WFILE__, NULL, L"", NULL);
-        }
-
-
-#ifdef DEBUG
-        ACE_DEBUG((LM_INFO, ACE_TEXT("\nConnection Pool status: \n\n")));
-        std::vector<PoolCacheEntry*> entries;
-        MgFdoConnectionPool::GetCacheInfo(entries);
-        for (std::vector<PoolCacheEntry*>::iterator it = entries.begin(); it != entries.end(); it++)
-        {
-            STRING resId = (*it)->ResourceId;
-            ACE_DEBUG((LM_INFO, ACE_TEXT(" - %W (%d Open, %d Closed)\n"), resId.c_str(), (*it)->OpenCount, (*it)->ClosedCount));
-        }
-#endif
-
-        // delete the feature sources definition
-        Ptr<MgResourceIdentifier> fsres1 = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels.FeatureSource");
-        pService->DeleteResource(fsres1);
-
-        Ptr<MgResourceIdentifier> fsres2 = new MgResourceIdentifier(L"Library://UnitTests/Data/Redding_Parcels.FeatureSource");
-        pService->DeleteResource(fsres2);
-
-        Ptr<MgResourceIdentifier> fsres3 = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_BuildingOutlines.FeatureSource");
-        pService->DeleteResource(fsres3);
-
-        Ptr<MgResourceIdentifier> fsres4 = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_VotingDistricts.FeatureSource");
-        pService->DeleteResource(fsres4);
-
-        Ptr<MgResourceIdentifier> fsres5 = new MgResourceIdentifier(L"Library://UnitTests/Data/TestChainedInner1ToManyJoin.FeatureSource");
-        pService->DeleteResource(fsres5);
-
-        Ptr<MgResourceIdentifier> fsres6 = new MgResourceIdentifier(L"Library://UnitTests/Data/Empty.FeatureSource");
-        pService->DeleteResource(fsres6);
-
-        Ptr<MgResourceIdentifier> fsres7 = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels_Writable.FeatureSource");
-        pService->DeleteResource(fsres7);
-
-        Ptr<MgResourceIdentifier> fsres8 = new MgResourceIdentifier(L"Library://UnitTests/Data/FdoJoin.FeatureSource");
-        pService->DeleteResource(fsres8);
-        
-        Ptr<MgResourceIdentifier> fsres9 = new MgResourceIdentifier(L"Library://UnitTests/Data/SecuredCredentials.FeatureSource");
-        pService->DeleteResource(fsres9);
-
-        //Ptr<MgResourceIdentifier> folder = new MgResourceIdentifier(L"Library://UnitTests/");
-        //pService->DeleteResource(folder);
-    }
-    catch (MgException* e)
-    {
-        STRING message = e->GetDetails(TEST_LOCALE);
-        SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
-    }
-    catch (...)
-    {
-        throw;
-    }
-
-    ACE_DEBUG((LM_INFO, ACE_TEXT("\nFeature Service tests completed.\n\n")));
-}
-
 ///----------------------------------------------------------------------------
 /// Test Case Description:
 ///
 /// This test case gets the feature providers.
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_GetFeatureProviders()
+TEST_CASE("GetFeatureProviders", "[FeatureService]")
 {
     try
     {
@@ -345,18 +45,18 @@
         Ptr<MgFeatureService> pService = dynamic_cast<MgFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetFeatureProviders", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetFeatureProviders", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgByteReader> byteReader = pService->GetFeatureProviders();
         STRING mimeType = byteReader->GetMimeType();
-        CPPUNIT_ASSERT(wcscmp(mimeType.c_str(), MgMimeType::Xml.c_str()) == 0);
+        REQUIRE(wcscmp(mimeType.c_str(), MgMimeType::Xml.c_str()) == 0);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -363,7 +63,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -377,7 +77,7 @@
 ///
 /// This test case tests connections to the SDF provider.
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_TestConnectionSDFProvider()
+TEST_CASE("TestConnectionSDFProvider", "[FeatureService]")
 {
     try
     {
@@ -385,7 +85,7 @@
         Ptr<MgFeatureService> pService = dynamic_cast<MgFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_TestConnectionSDFProvider", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_TestConnectionSDFProvider", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         const STRING provider = L"OSGeo.SDF";
@@ -395,13 +95,13 @@
         const STRING connectionString = L"File=../UnitTestFiles/Sheboygan_Parcels.sdf";
 #endif
         bool bSuccess = pService->TestConnection(provider, connectionString);
-        CPPUNIT_ASSERT(bSuccess);
+        REQUIRE(bSuccess);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -408,7 +108,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -421,7 +121,7 @@
 ///
 /// This test case gets the connection property values.
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_GetConnectionPropertyValues()
+TEST_CASE("GetConnectionPropertyValues", "[FeatureService]")
 {
     try
     {
@@ -429,24 +129,24 @@
         Ptr<MgFeatureService> pService = dynamic_cast<MgFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetConnectionPropertyValues", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetConnectionPropertyValues", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         STRING provider = L"";
         STRING property = L"";
         STRING connectionString = L"";
-        CPPUNIT_ASSERT_THROW_MG(pService->GetConnectionPropertyValues(provider, property, connectionString), MgInvalidArgumentException*);
+        REQUIRE_THROWS_MG(pService->GetConnectionPropertyValues(provider, property, connectionString), MgInvalidArgumentException*);
 
         provider = L"OSGeo.SDF";
         property = L"ReadOnly";
         Ptr<MgStringCollection> properties = pService->GetConnectionPropertyValues(provider, property, connectionString);
-        CPPUNIT_ASSERT(properties->GetCount() > 0);
+        REQUIRE(properties->GetCount() > 0);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -453,7 +153,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -467,7 +167,7 @@
 ///
 /// This test case gets the provider capabilities.
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_GetCapabilities()
+TEST_CASE("GetCapabilities", "[FeatureService]")
 {
     try
     {
@@ -475,7 +175,7 @@
         Ptr<MgFeatureService> pService = dynamic_cast<MgFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetCapabilities", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetCapabilities", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         STRING provider = L"OSGeo.SDF";
@@ -482,17 +182,17 @@
 
         Ptr<MgByteReader> reader = pService->GetCapabilities(provider);
         STRING mimetype = reader->GetMimeType();
-        CPPUNIT_ASSERT(wcscmp(mimetype.c_str(), MgMimeType::Xml.c_str()) == 0);
+        REQUIRE(wcscmp(mimetype.c_str(), MgMimeType::Xml.c_str()) == 0);
 
         provider = L"";
 
-        CPPUNIT_ASSERT_THROW_MG(pService->GetCapabilities(provider), MgInvalidArgumentException*);
+        REQUIRE_THROWS_MG(pService->GetCapabilities(provider), MgInvalidArgumentException*);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -499,7 +199,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -513,7 +213,7 @@
 ///
 /// This test case tests a connection to a resource.
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_TestConnectionResourceIdentifier()
+TEST_CASE("TestConnectionResourceIdentifier", "[FeatureService]")
 {
     try
     {
@@ -521,24 +221,24 @@
         Ptr<MgFeatureService> pService = dynamic_cast<MgFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_TestConnectionResourceIdentifier", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_TestConnectionResourceIdentifier", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> resource = new MgResourceIdentifier();
-        CPPUNIT_ASSERT_THROW_MG(pService->TestConnection(resource), MgInvalidRepositoryTypeException*);
+        REQUIRE_THROWS_MG(pService->TestConnection(resource), MgInvalidRepositoryTypeException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Geography/World.MapDefinition");
-        CPPUNIT_ASSERT_THROW_MG(pService->TestConnection(resource), MgInvalidResourceTypeException*);
+        REQUIRE_THROWS_MG(pService->TestConnection(resource), MgInvalidResourceTypeException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels.FeatureSource");
         bool bResult = pService->TestConnection(resource);
-        CPPUNIT_ASSERT(bResult);
+        REQUIRE(bResult);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -545,7 +245,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -559,7 +259,7 @@
 ///
 /// This test case exercises getting schemas.
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_GetSchemas()
+TEST_CASE("GetSchemas", "[FeatureService]")
 {
     try
     {
@@ -567,24 +267,24 @@
         Ptr<MgFeatureService> pService = dynamic_cast<MgFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetSchemas", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetSchemas", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> resource = new MgResourceIdentifier();
-        CPPUNIT_ASSERT_THROW_MG(pService->GetSchemas(resource), MgInvalidRepositoryTypeException*);
+        REQUIRE_THROWS_MG(pService->GetSchemas(resource), MgInvalidRepositoryTypeException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Geography/World.MapDefinition");
-        CPPUNIT_ASSERT_THROW_MG(pService->GetSchemas(resource), MgInvalidResourceTypeException*);
+        REQUIRE_THROWS_MG(pService->GetSchemas(resource), MgInvalidResourceTypeException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels.FeatureSource");
         Ptr<MgStringCollection> schemas = pService->GetSchemas(resource);
-        CPPUNIT_ASSERT(schemas->GetCount() > 0);
+        REQUIRE(schemas->GetCount() > 0);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -591,7 +291,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -605,7 +305,7 @@
 ///
 /// This test case exercises getting classes.
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_GetClasses()
+TEST_CASE("GetClasses", "[FeatureService]")
 {
     try
     {
@@ -613,26 +313,26 @@
         Ptr<MgFeatureService> pService = dynamic_cast<MgFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetClasses", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetClasses", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> resource = new MgResourceIdentifier();
         STRING schemaName = L"";
-        CPPUNIT_ASSERT_THROW_MG(pService->GetClasses(resource, schemaName), MgInvalidRepositoryTypeException*);
+        REQUIRE_THROWS_MG(pService->GetClasses(resource, schemaName), MgInvalidRepositoryTypeException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Geography/World.MapDefinition");
-        CPPUNIT_ASSERT_THROW_MG(pService->GetClasses(resource, schemaName), MgInvalidResourceTypeException*);
+        REQUIRE_THROWS_MG(pService->GetClasses(resource, schemaName), MgInvalidResourceTypeException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels.FeatureSource");
         schemaName = L"SHP_Schema";
         Ptr<MgStringCollection> classes = pService->GetClasses(resource, schemaName);
-        CPPUNIT_ASSERT(classes->GetCount() > 0);
+        REQUIRE(classes->GetCount() > 0);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -639,7 +339,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -653,7 +353,7 @@
 ///
 /// This test case exercises getting class definitions.
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_GetClassDefinition()
+TEST_CASE("GetClassDefinition", "[FeatureService]")
 {
     try
     {
@@ -661,33 +361,33 @@
         Ptr<MgFeatureService> pService = dynamic_cast<MgFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetClassDefinition", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetClassDefinition", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> resource = new MgResourceIdentifier();
         STRING schemaName = L"";
         STRING className = L"";
-        CPPUNIT_ASSERT_THROW_MG(pService->GetClassDefinition(resource, schemaName, className), MgInvalidRepositoryTypeException*);
+        REQUIRE_THROWS_MG(pService->GetClassDefinition(resource, schemaName, className), MgInvalidRepositoryTypeException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels.MapDefinition");
         schemaName = L"";
         className = L"";
-        CPPUNIT_ASSERT_THROW_MG(pService->GetClassDefinition(resource, schemaName, className), MgInvalidResourceTypeException*);
+        REQUIRE_THROWS_MG(pService->GetClassDefinition(resource, schemaName, className), MgInvalidResourceTypeException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels.FeatureSource");
         schemaName = L"SHP_Schema";
         className = L"";
-        CPPUNIT_ASSERT_THROW_MG(pService->GetClassDefinition(resource, schemaName, className), MgClassNotFoundException*);
+        REQUIRE_THROWS_MG(pService->GetClassDefinition(resource, schemaName, className), MgClassNotFoundException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels.FeatureSource");
         schemaName = L"Foo";
         className = L"Bar";
-        CPPUNIT_ASSERT_THROW_MG(pService->GetClassDefinition(resource, schemaName, className), MgFdoException*);
+        REQUIRE_THROWS_MG(pService->GetClassDefinition(resource, schemaName, className), MgFdoException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels.FeatureSource");
         schemaName = L"SHP_Schema";
         className = L"Bar";
-        CPPUNIT_ASSERT_THROW_MG(pService->GetClassDefinition(resource, schemaName, className), MgFdoException*);
+        REQUIRE_THROWS_MG(pService->GetClassDefinition(resource, schemaName, className), MgFdoException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels.FeatureSource");
         schemaName = L"SHP_Schema";
@@ -694,13 +394,13 @@
         className = L"Parcels";
         Ptr<MgClassDefinition> classDef = pService->GetClassDefinition(resource, schemaName, className);
         STRING name = classDef->GetName();
-        CPPUNIT_ASSERT(name == L"Parcels");
+        REQUIRE(name == L"Parcels");
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -707,7 +407,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -721,7 +421,7 @@
 /// This test case verifies modifications to returned class definitions does not
 /// affect subsequent fetches of the same class definition
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_GetClassDefinitionImmutability()
+TEST_CASE("GetClassDefinitionImmutability", "[FeatureService]")
 {
     try
     {
@@ -729,7 +429,7 @@
         Ptr<MgFeatureService> pService = dynamic_cast<MgFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetClassDefinition", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetClassDefinition", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels.FeatureSource");
@@ -737,7 +437,7 @@
         STRING className = L"Parcels";
         Ptr<MgClassDefinition> classDef = pService->GetClassDefinition(resource, schemaName, className);
         STRING name = classDef->GetName();
-        CPPUNIT_ASSERT(name == L"Parcels");
+        REQUIRE(name == L"Parcels");
 
         //Remove RNAME
         Ptr<MgPropertyDefinitionCollection> props = classDef->GetProperties();
@@ -744,26 +444,26 @@
         INT32 pidx = props->IndexOf(L"RNAME");
         props->RemoveAt(pidx);
         pidx = props->IndexOf(L"RNAME");
-        CPPUNIT_ASSERT(pidx < 0);
+        REQUIRE(pidx < 0);
 
         //Fetch another one
         Ptr<MgClassDefinition> classDef2 = pService->GetClassDefinition(resource, schemaName, className);
         STRING name2 = classDef2->GetName();
-        CPPUNIT_ASSERT(name2 == L"Parcels");
-        CPPUNIT_ASSERT(classDef.p != classDef2.p);
+        REQUIRE(name2 == L"Parcels");
+        REQUIRE(classDef.p != classDef2.p);
 
         //Verify our modification of the previous return value did nothing
         Ptr<MgPropertyDefinitionCollection> props2 = classDef2->GetProperties();
-        CPPUNIT_ASSERT(props2.p != props.p);
-        CPPUNIT_ASSERT(props->GetCount() == props2->GetCount() - 1);
+        REQUIRE(props2.p != props.p);
+        REQUIRE(props->GetCount() == props2->GetCount() - 1);
         pidx = props2->IndexOf(L"RNAME");
-        CPPUNIT_ASSERT(pidx >= 0);
+        REQUIRE(pidx >= 0);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -770,7 +470,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -784,7 +484,7 @@
 ///
 /// This test case exercises describing schemas.
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_DescribeSchema()
+TEST_CASE("DescribeSchema", "[FeatureService]")
 {
     try
     {
@@ -792,27 +492,27 @@
         Ptr<MgFeatureService> pService = dynamic_cast<MgFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_DescribeSchema", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_DescribeSchema", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> resource = new MgResourceIdentifier();
         STRING schemaName = L"";
-        CPPUNIT_ASSERT_THROW_MG(pService->DescribeSchema(resource, schemaName, NULL), MgInvalidRepositoryTypeException*);
+        REQUIRE_THROWS_MG(pService->DescribeSchema(resource, schemaName, nullptr), MgInvalidRepositoryTypeException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Geography/World.MapDefinition");
         schemaName = L"";
-        CPPUNIT_ASSERT_THROW_MG(pService->DescribeSchema(resource, schemaName, NULL), MgInvalidResourceTypeException*);
+        REQUIRE_THROWS_MG(pService->DescribeSchema(resource, schemaName, nullptr), MgInvalidResourceTypeException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels.FeatureSource");
         schemaName = L"";
-        Ptr<MgFeatureSchemaCollection> schemaCollection = pService->DescribeSchema(resource, schemaName, NULL);
-        CPPUNIT_ASSERT(schemaCollection->GetCount() > 0);
+        Ptr<MgFeatureSchemaCollection> schemaCollection = pService->DescribeSchema(resource, schemaName, nullptr);
+        REQUIRE(schemaCollection->GetCount() > 0);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -819,7 +519,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -833,7 +533,7 @@
 /// This test case verifies modifications to returned feature schemas does not
 /// affect subsequent fetches of the same feature schemas
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_DescribeSchemaImmutability()
+TEST_CASE("DescribeSchemaImmutability", "[FeatureService]")
 {
     try
     {
@@ -841,20 +541,20 @@
         Ptr<MgFeatureService> pService = dynamic_cast<MgFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_DescribeSchema", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_DescribeSchema", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels.FeatureSource");
         STRING schemaName = L"";
-        Ptr<MgFeatureSchemaCollection> schemaCollection = pService->DescribeSchema(resource, schemaName, NULL);
-        CPPUNIT_ASSERT(schemaCollection->GetCount() > 0);
+        Ptr<MgFeatureSchemaCollection> schemaCollection = pService->DescribeSchema(resource, schemaName, nullptr);
+        REQUIRE(schemaCollection->GetCount() > 0);
 
         schemaCollection->RemoveAt(0);
 
         //Verify modifications did not affect this return value
-        Ptr<MgFeatureSchemaCollection> schemaCollection2 = pService->DescribeSchema(resource, schemaName, NULL);
-        CPPUNIT_ASSERT(schemaCollection.p != schemaCollection2.p);
-        CPPUNIT_ASSERT(schemaCollection->GetCount() == schemaCollection2->GetCount() - 1);
+        Ptr<MgFeatureSchemaCollection> schemaCollection2 = pService->DescribeSchema(resource, schemaName, nullptr);
+        REQUIRE(schemaCollection.p != schemaCollection2.p);
+        REQUIRE(schemaCollection->GetCount() == schemaCollection2->GetCount() - 1);
 
         Ptr<MgFeatureSchema> schema = schemaCollection2->GetItem(0);
         Ptr<MgClassDefinitionCollection> classes = schema->GetClasses();
@@ -861,22 +561,22 @@
 
         classes->RemoveAt(0);
 
-        Ptr<MgFeatureSchemaCollection> schemaCollection3 = pService->DescribeSchema(resource, schemaName, NULL);
-        CPPUNIT_ASSERT(schemaCollection3.p != schemaCollection2.p);
-        CPPUNIT_ASSERT(schemaCollection.p != schemaCollection3.p);
-        CPPUNIT_ASSERT(schemaCollection->GetCount() == schemaCollection3->GetCount() - 1);
+        Ptr<MgFeatureSchemaCollection> schemaCollection3 = pService->DescribeSchema(resource, schemaName, nullptr);
+        REQUIRE(schemaCollection3.p != schemaCollection2.p);
+        REQUIRE(schemaCollection.p != schemaCollection3.p);
+        REQUIRE(schemaCollection->GetCount() == schemaCollection3->GetCount() - 1);
 
         Ptr<MgFeatureSchema> schema3 = schemaCollection3->GetItem(0);
         Ptr<MgClassDefinitionCollection> classes3 = schema3->GetClasses();
 
-        CPPUNIT_ASSERT(classes.p != classes3.p);
-        CPPUNIT_ASSERT(classes->GetCount() == classes3->GetCount() - 1);
+        REQUIRE(classes.p != classes3.p);
+        REQUIRE(classes->GetCount() == classes3->GetCount() - 1);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -883,7 +583,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -896,7 +596,7 @@
 ///
 /// Find the class definition by name from a class definition collection.
 ///----------------------------------------------------------------------------
-MgClassDefinition* FindClassByName(MgClassDefinitionCollection* classDefCol, STRING name)
+static MgClassDefinition* FindClassByName(MgClassDefinitionCollection* classDefCol, STRING name)
 {
     for (int i =0; i < classDefCol->GetCount(); i++)
     {
@@ -905,7 +605,7 @@
         if (temp == name)
             return classDef.Detach();
     }
-    return NULL;
+    return nullptr;
 }
 
 ///----------------------------------------------------------------------------
@@ -913,7 +613,7 @@
 ///
 /// This test case exercises applying schemas.
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_ApplySchema()
+TEST_CASE("ApplySchema", "[FeatureService]")
 {
     try
     {
@@ -921,7 +621,7 @@
         Ptr<MgFeatureService> pService = dynamic_cast<MgFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_ApplySchema", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_ApplySchema", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Empty.FeatureSource");
@@ -930,7 +630,7 @@
         /// The first test case:                                           ///
         /// Delete one property in an existing feature class               ///
         //////////////////////////////////////////////////////////////////////
-        Ptr<MgFeatureSchemaCollection> oldSchemas = pService->DescribeSchema(resource, L"Schema", NULL);
+        Ptr<MgFeatureSchemaCollection> oldSchemas = pService->DescribeSchema(resource, L"Schema", nullptr);
         Ptr<MgFeatureSchema> oldSchema = oldSchemas->GetItem(0);
         Ptr<MgClassDefinitionCollection> oldSchemaClasses = oldSchema->GetClasses();
         Ptr<MgClassDefinition> oldClassDef = FindClassByName(oldSchemaClasses, L"Parcel");
@@ -940,12 +640,12 @@
         pService->ApplySchema(resource, oldSchema);
 
         // Verify results
-        Ptr<MgFeatureSchemaCollection> newSchemas = pService->DescribeSchema(resource, L"Schema", NULL);
+        Ptr<MgFeatureSchemaCollection> newSchemas = pService->DescribeSchema(resource, L"Schema", nullptr);
         Ptr<MgFeatureSchema> newSchema = newSchemas->GetItem(0);
         Ptr<MgClassDefinitionCollection> newSchemaClasses = newSchema->GetClasses();
         Ptr<MgClassDefinition> newClassDef = FindClassByName(newSchemaClasses, L"Parcel");
         Ptr<MgPropertyDefinitionCollection> newProperties = newClassDef->GetProperties();
-        CPPUNIT_ASSERT(newProperties->Contains(L"Name") == false);
+        REQUIRE(newProperties->Contains(L"Name") == false);
 
         //////////////////////////////////////////////////////////////////////
         /// The second test case:                                          ///
@@ -1012,13 +712,13 @@
         schemaClasses->Add(classDef2);
 
         pService->ApplySchema(resource, schema);
-        newSchemas = pService->DescribeSchema(resource, L"Schema", NULL);
+        newSchemas = pService->DescribeSchema(resource, L"Schema", nullptr);
 
         // Verify schema
         STRING temp;
         newSchema = newSchemas->GetItem(0);
         temp = newSchema->GetName();
-        CPPUNIT_ASSERT(temp == L"Schema");
+        REQUIRE(temp == L"Schema");
 
         schemaClasses = newSchema->GetClasses();
 
@@ -1025,62 +725,62 @@
         // Verify the first feature class
         classDef1 = FindClassByName(schemaClasses, L"FeatureClass1");
         temp = classDef1->GetName();
-        CPPUNIT_ASSERT(temp == L"FeatureClass1");
+        REQUIRE(temp == L"FeatureClass1");
         temp = classDef1->GetDescription();
-        CPPUNIT_ASSERT(temp == L"Feature class 1");
+        REQUIRE(temp == L"Feature class 1");
         temp = classDef1->GetDefaultGeometryPropertyName();
-        CPPUNIT_ASSERT(temp == L"GEOM");
+        REQUIRE(temp == L"GEOM");
 
         identityProperties1 = classDef1->GetIdentityProperties();
-        CPPUNIT_ASSERT(identityProperties1->GetCount() == 1);
+        REQUIRE(identityProperties1->GetCount() == 1);
         prop = static_cast<MgDataPropertyDefinition*>(identityProperties1->GetItem(L"KEY1"));
-        CPPUNIT_ASSERT(prop != NULL);
+        REQUIRE(prop != nullptr);
 
         properties1 = classDef1->GetProperties();
-        CPPUNIT_ASSERT(properties1->GetCount() == 3);
+        REQUIRE(properties1->GetCount() == 3);
 
         prop = static_cast<MgDataPropertyDefinition*>(properties1->GetItem(L"KEY1"));
-        CPPUNIT_ASSERT(prop != NULL);
-        CPPUNIT_ASSERT(prop->GetDataType() == MgPropertyType::Int32);
-        CPPUNIT_ASSERT(prop->IsAutoGenerated() == true);
-        CPPUNIT_ASSERT(prop->GetReadOnly() == true);
+        REQUIRE(prop != nullptr);
+        REQUIRE(prop->GetDataType() == MgPropertyType::Int32);
+        REQUIRE(prop->IsAutoGenerated() == true);
+        REQUIRE(prop->GetReadOnly() == true);
 
         prop = static_cast<MgDataPropertyDefinition*>(properties1->GetItem(L"NAME1"));
-        CPPUNIT_ASSERT(prop != NULL);
-        CPPUNIT_ASSERT(prop->GetDataType() == MgPropertyType::String);
+        REQUIRE(prop != nullptr);
+        REQUIRE(prop->GetDataType() == MgPropertyType::String);
 
         propGeom = static_cast<MgGeometricPropertyDefinition*>(properties1->GetItem(L"GEOM"));
-        CPPUNIT_ASSERT(prop != NULL);
-        CPPUNIT_ASSERT(propGeom->GetGeometryTypes() == MgFeatureGeometricType::Surface);
+        REQUIRE(prop != nullptr);
+        REQUIRE(propGeom->GetGeometryTypes() == MgFeatureGeometricType::Surface);
 
         // Verify the second feature class
         classDef2 = FindClassByName(schemaClasses, L"FeatureClass2");
         temp = classDef2->GetDescription();
-        CPPUNIT_ASSERT(temp == L"Feature class 2");
+        REQUIRE(temp == L"Feature class 2");
         temp = classDef2->GetDefaultGeometryPropertyName();
-        CPPUNIT_ASSERT(temp == L"GEOM");
+        REQUIRE(temp == L"GEOM");
 
         identityProperties2 = classDef2->GetIdentityProperties();
-        CPPUNIT_ASSERT(identityProperties2->GetCount() == 1);
+        REQUIRE(identityProperties2->GetCount() == 1);
         prop = static_cast<MgDataPropertyDefinition*>(identityProperties2->GetItem(L"KEY2"));
-        CPPUNIT_ASSERT(prop != NULL);
+        REQUIRE(prop != nullptr);
 
         properties2 = classDef2->GetProperties();
-        CPPUNIT_ASSERT(properties2->GetCount() == 3);
+        REQUIRE(properties2->GetCount() == 3);
 
         prop = static_cast<MgDataPropertyDefinition*>(properties2->GetItem(L"KEY2"));
-        CPPUNIT_ASSERT(prop != NULL);
-        CPPUNIT_ASSERT(prop->GetDataType() == MgPropertyType::Int32);
-        CPPUNIT_ASSERT(prop->IsAutoGenerated() == true);
-        CPPUNIT_ASSERT(prop->GetReadOnly() == true);
+        REQUIRE(prop != nullptr);
+        REQUIRE(prop->GetDataType() == MgPropertyType::Int32);
+        REQUIRE(prop->IsAutoGenerated() == true);
+        REQUIRE(prop->GetReadOnly() == true);
 
         prop = static_cast<MgDataPropertyDefinition*>(properties2->GetItem(L"NAME2"));
-        CPPUNIT_ASSERT(prop != NULL);
-        CPPUNIT_ASSERT(prop->GetDataType() == MgPropertyType::String);
+        REQUIRE(prop != nullptr);
+        REQUIRE(prop->GetDataType() == MgPropertyType::String);
 
         propGeom = static_cast<MgGeometricPropertyDefinition*>(properties2->GetItem(L"GEOM"));
-        CPPUNIT_ASSERT(prop != NULL);
-        CPPUNIT_ASSERT(propGeom->GetGeometryTypes() == MgFeatureGeometricType::Curve);
+        REQUIRE(prop != nullptr);
+        REQUIRE(propGeom->GetGeometryTypes() == MgFeatureGeometricType::Curve);
 
         //////////////////////////////////////////////////////////////////////
         /// The third test case:                                           ///
@@ -1107,51 +807,51 @@
 
         pService->ApplySchema(resource, newSchema);
 
-        newSchemas = pService->DescribeSchema(resource, L"Schema", NULL);
+        newSchemas = pService->DescribeSchema(resource, L"Schema", nullptr);
         newSchema = newSchemas->GetItem(0);
         temp = newSchema->GetName();
-        CPPUNIT_ASSERT(temp == L"Schema");
+        REQUIRE(temp == L"Schema");
 
         schemaClasses = newSchema->GetClasses();
 
         // Verify the first feature class
         classDef1 = FindClassByName(schemaClasses, L"FeatureClass1");
-        CPPUNIT_ASSERT(classDef1 == NULL);
+        REQUIRE(classDef1 == nullptr);
 
         classDef2 = FindClassByName(schemaClasses, L"FeatureClass2");
         temp = classDef2->GetDescription();
-        CPPUNIT_ASSERT(temp == L"Modified Feature Class");
+        REQUIRE(temp == L"Modified Feature Class");
 
         properties2 = classDef2->GetProperties();
-        CPPUNIT_ASSERT(properties2->GetCount() == 5);
+        REQUIRE(properties2->GetCount() == 5);
 
         temp = classDef2->GetDefaultGeometryPropertyName();
-        CPPUNIT_ASSERT(temp == L"GEOM");
+        REQUIRE(temp == L"GEOM");
 
         identityProperties2 = classDef2->GetIdentityProperties();
-        CPPUNIT_ASSERT(identityProperties2->GetCount() == 1);
+        REQUIRE(identityProperties2->GetCount() == 1);
         prop = static_cast<MgDataPropertyDefinition*>(identityProperties2->GetItem(L"KEY2"));
-        CPPUNIT_ASSERT(prop != NULL);
+        REQUIRE(prop != nullptr);
 
         prop = static_cast<MgDataPropertyDefinition*>(properties2->GetItem(L"ID"));
-        CPPUNIT_ASSERT(prop != NULL);
-        CPPUNIT_ASSERT(prop->GetDataType() == MgPropertyType::Int32);
-        CPPUNIT_ASSERT(prop->IsAutoGenerated() == true);
-        CPPUNIT_ASSERT(prop->GetReadOnly() == true);
+        REQUIRE(prop != nullptr);
+        REQUIRE(prop->GetDataType() == MgPropertyType::Int32);
+        REQUIRE(prop->IsAutoGenerated() == true);
+        REQUIRE(prop->GetReadOnly() == true);
 
         prop = static_cast<MgDataPropertyDefinition*>(properties2->GetItem(L"LENGTH"));
-        CPPUNIT_ASSERT(prop != NULL);
-        CPPUNIT_ASSERT(prop->GetDataType() == MgPropertyType::Single);
+        REQUIRE(prop != nullptr);
+        REQUIRE(prop->GetDataType() == MgPropertyType::Single);
 
         propGeom = static_cast<MgGeometricPropertyDefinition*>(properties2->GetItem(L"GEOM"));
-        CPPUNIT_ASSERT(prop != NULL);
-        CPPUNIT_ASSERT(propGeom->GetGeometryTypes() == MgFeatureGeometricType::Curve);
+        REQUIRE(prop != nullptr);
+        REQUIRE(propGeom->GetGeometryTypes() == MgFeatureGeometricType::Curve);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -1158,7 +858,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -1172,7 +872,7 @@
 ///
 /// This test case exercises selecting features.
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_SelectFeatures()
+TEST_CASE("SelectFeatures", "[FeatureService]")
 {
     try
     {
@@ -1180,19 +880,19 @@
         Ptr<MgFeatureService> pService = dynamic_cast<MgFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_SelectFeatures", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_SelectFeatures", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> resource = new MgResourceIdentifier();
         STRING className = L"";
         Ptr<MgFeatureQueryOptions> options = new MgFeatureQueryOptions();
-        CPPUNIT_ASSERT_THROW_MG(pService->SelectFeatures(resource, className, options), MgInvalidRepositoryTypeException*);
+        REQUIRE_THROWS_MG(pService->SelectFeatures(resource, className, options), MgInvalidRepositoryTypeException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels.MapDefinition");
-        CPPUNIT_ASSERT_THROW_MG(pService->SelectFeatures(resource, className, options), MgInvalidResourceTypeException*);
+        REQUIRE_THROWS_MG(pService->SelectFeatures(resource, className, options), MgInvalidResourceTypeException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels.FeatureSource");
-        CPPUNIT_ASSERT_THROW_MG(pService->SelectFeatures(resource, className, options), MgInvalidArgumentException*);
+        REQUIRE_THROWS_MG(pService->SelectFeatures(resource, className, options), MgInvalidArgumentException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels.FeatureSource");
         className = L"Parcels";
@@ -1199,13 +899,13 @@
         Ptr<MgFeatureReader> reader = pService->SelectFeatures(resource, className, options);
         bool bResult = reader->ReadNext();
         reader->Close();
-        CPPUNIT_ASSERT(bResult);
+        REQUIRE(bResult);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -1212,7 +912,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -1225,7 +925,7 @@
 ///
 /// This test case exercises selecting features with a transform.
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_SelectFeaturesTransformed()
+TEST_CASE("SelectFeaturesTransformed", "[FeatureService]")
 {
     try
     {
@@ -1233,7 +933,7 @@
         Ptr<MgdFeatureService> pService = dynamic_cast<MgdFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_SelectFeatures", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_SelectFeatures", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         //Create our test data store
@@ -1298,39 +998,39 @@
         Ptr<MgFeatureQueryOptions> query = new MgFeatureQueryOptions();
         Ptr<MgReader> reader = pService->SelectFeatures(fsId, L"Default:Test", query, dstWkt);
         
-        CPPUNIT_ASSERT(reader->ReadNext());
-        CPPUNIT_ASSERT(!reader->IsNull(L"Geometry"));
+        REQUIRE(reader->ReadNext());
+        REQUIRE(!reader->IsNull(L"Geometry"));
 
         Ptr<MgByteReader> txAgf1 = reader->GetGeometry(L"Geometry");
         Ptr<MgGeometry> txGeom1 = agfRw->Read(txAgf1);
         MgPoint* txPt1 = dynamic_cast<MgPoint*>(txGeom1.p);
-        CPPUNIT_ASSERT(txPt1 != NULL);
+        REQUIRE(txPt1 != nullptr);
         Ptr<MgCoordinate> txCoord1 = txPt1->GetCoordinate();
 
         //TODO: Maybe we should really check that it matches the expected transformed result
-        CPPUNIT_ASSERT(txCoord1->GetX() != -37.1020);
-        CPPUNIT_ASSERT(txCoord1->GetY() != 144.0020);
+        REQUIRE(txCoord1->GetX() != -37.1020);
+        REQUIRE(txCoord1->GetY() != 144.0020);
 
-        CPPUNIT_ASSERT(reader->ReadNext());
-        CPPUNIT_ASSERT(!reader->IsNull(L"Geometry"));
+        REQUIRE(reader->ReadNext());
+        REQUIRE(!reader->IsNull(L"Geometry"));
 
         Ptr<MgByteReader> txAgf2 = reader->GetGeometry(L"Geometry");
         Ptr<MgGeometry> txGeom2 = agfRw->Read(txAgf2);
         MgPoint* txPt2 = dynamic_cast<MgPoint*>(txGeom2.p);
-        CPPUNIT_ASSERT(txPt2 != NULL);
+        REQUIRE(txPt2 != nullptr);
         Ptr<MgCoordinate> txCoord2 = txPt2->GetCoordinate();
 
         //TODO: Maybe we should really check that it matches the expected transformed result
-        CPPUNIT_ASSERT(txCoord2->GetX() != -37.2020);
-        CPPUNIT_ASSERT(txCoord2->GetY() != 144.2020);
+        REQUIRE(txCoord2->GetX() != -37.2020);
+        REQUIRE(txCoord2->GetY() != 144.2020);
 
         reader->Close();
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -1337,7 +1037,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -1350,7 +1050,7 @@
 ///
 /// This test case exercises selecting features with the scrollable reader.
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_SelectScrollable()
+TEST_CASE("SelectScrollable", "[FeatureService]")
 {
     try
     {
@@ -1358,25 +1058,25 @@
         Ptr<MgdFeatureService> pService = dynamic_cast<MgdFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_SelectFeatures", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_SelectFeatures", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> resource = new MgResourceIdentifier();
         STRING className = L"";
         Ptr<MgFeatureQueryOptions> options = new MgFeatureQueryOptions();
-        CPPUNIT_ASSERT_THROW_MG(pService->SelectFeaturesExtended(resource, className, options), MgInvalidRepositoryTypeException*);
+        REQUIRE_THROWS_MG(pService->SelectFeaturesExtended(resource, className, options), MgInvalidRepositoryTypeException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_VotingDistricts.MapDefinition");
-        CPPUNIT_ASSERT_THROW_MG(pService->SelectFeaturesExtended(resource, className, options), MgInvalidResourceTypeException*);
+        REQUIRE_THROWS_MG(pService->SelectFeaturesExtended(resource, className, options), MgInvalidResourceTypeException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_VotingDistricts.FeatureSource");
-        CPPUNIT_ASSERT_THROW_MG(pService->SelectFeaturesExtended(resource, className, options), MgInvalidArgumentException*);
+        REQUIRE_THROWS_MG(pService->SelectFeaturesExtended(resource, className, options), MgInvalidArgumentException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_VotingDistricts.FeatureSource");
         className = L"VotingDistricts";
         Ptr<MgdScrollableFeatureReader> reader = pService->SelectFeaturesExtended(resource, className, options);
         INT32 count = reader->Count();
-        CPPUNIT_ASSERT(11 == count);
+        REQUIRE(11 == count);
 
         Ptr<MgPropertyCollection> keys = new MgPropertyCollection();
         Ptr<MgInt32Property> keyVal = new MgInt32Property(L"FeatId", 4);
@@ -1407,22 +1107,22 @@
         bool bAfterLast = reader->ReadNext();
         reader->Close();
 
-        CPPUNIT_ASSERT(bScroll);
-        CPPUNIT_ASSERT(bScroll2);
-        CPPUNIT_ASSERT(!bScroll3);
-        CPPUNIT_ASSERT(!bScroll4);
-        CPPUNIT_ASSERT(!bScroll5);
-        CPPUNIT_ASSERT(bScroll6);
-        CPPUNIT_ASSERT(bFirst);
-        CPPUNIT_ASSERT(!bBeforeFirst);
-        CPPUNIT_ASSERT(bLast);
-        CPPUNIT_ASSERT(!bAfterLast);
+        REQUIRE(bScroll);
+        REQUIRE(bScroll2);
+        REQUIRE(!bScroll3);
+        REQUIRE(!bScroll4);
+        REQUIRE(!bScroll5);
+        REQUIRE(bScroll6);
+        REQUIRE(bFirst);
+        REQUIRE(!bBeforeFirst);
+        REQUIRE(bLast);
+        REQUIRE(!bAfterLast);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -1429,7 +1129,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -1443,7 +1143,7 @@
 ///
 /// This test case exercises selecting aggregate features.
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_SelectAggregate()
+TEST_CASE("SelectAggregates", "[FeatureService]")
 {
     try
     {
@@ -1451,7 +1151,7 @@
         Ptr<MgFeatureService> pService = dynamic_cast<MgFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_SelectAggregate", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_SelectAggregate", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgDataReader> reader;
@@ -1458,13 +1158,13 @@
         Ptr<MgResourceIdentifier> resource = new MgResourceIdentifier();
         STRING className = L"";
         Ptr<MgFeatureAggregateOptions> options = new MgFeatureAggregateOptions();
-        CPPUNIT_ASSERT_THROW_MG(reader = pService->SelectAggregate(resource, className, options), MgInvalidRepositoryTypeException*);
+        REQUIRE_THROWS_MG(reader = pService->SelectAggregate(resource, className, options), MgInvalidRepositoryTypeException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels.MapDefinition");
-        CPPUNIT_ASSERT_THROW_MG(reader = pService->SelectAggregate(resource, className, options), MgInvalidResourceTypeException*);
+        REQUIRE_THROWS_MG(reader = pService->SelectAggregate(resource, className, options), MgInvalidResourceTypeException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels.FeatureSource");
-        CPPUNIT_ASSERT_THROW_MG(reader = pService->SelectAggregate(resource, className, options), MgInvalidArgumentException*);
+        REQUIRE_THROWS_MG(reader = pService->SelectAggregate(resource, className, options), MgInvalidArgumentException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels.FeatureSource");
         className = L"Parcels";
@@ -1472,13 +1172,13 @@
         reader = pService->SelectAggregate(resource, className, options);
         bool bResult = reader->ReadNext();
         reader->Close();
-        CPPUNIT_ASSERT(bResult);
+        REQUIRE(bResult);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -1485,7 +1185,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -1495,7 +1195,7 @@
 
 static int smTestSdfId = -1;
 
-void TestFeatureService::TestCase_InsertFeatures()
+TEST_CASE("InsertFeatures", "[FeatureService]")
 {
     try
     {
@@ -1503,7 +1203,7 @@
         Ptr<MgdFeatureService> pService = dynamic_cast<MgdFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_InsertFeatures", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_InsertFeatures", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> fsId = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels_Writable.FeatureSource");
@@ -1533,8 +1233,8 @@
         }
         fr->Close();
 
-        CPPUNIT_ASSERT(inserted == 1);
-        CPPUNIT_ASSERT(smTestSdfId != -1);
+        REQUIRE(inserted == 1);
+        REQUIRE(smTestSdfId != -1);
 
         //Do a select to verify it's definitely there
         Ptr<MgFeatureQueryOptions> query = new MgFeatureQueryOptions();
@@ -1546,17 +1246,17 @@
 
         Ptr<MgReader> reader = pService->SelectFeatures(fsId, className, query);
         bool read = reader->ReadNext();
-        CPPUNIT_ASSERT(read);
-        CPPUNIT_ASSERT(!reader->IsNull(L"Autogenerated_SDF_ID"));
-        CPPUNIT_ASSERT(!reader->IsNull(L"RNAME"));
-        CPPUNIT_ASSERT(!reader->IsNull(L"SHPGEOM"));
-        CPPUNIT_ASSERT(reader->GetInt32(L"Autogenerated_SDF_ID") == smTestSdfId);
-        CPPUNIT_ASSERT(reader->GetString(L"RNAME") == L"Hello Parcel");
+        REQUIRE(read);
+        REQUIRE(!reader->IsNull(L"Autogenerated_SDF_ID"));
+        REQUIRE(!reader->IsNull(L"RNAME"));
+        REQUIRE(!reader->IsNull(L"SHPGEOM"));
+        REQUIRE(reader->GetInt32(L"Autogenerated_SDF_ID") == smTestSdfId);
+        REQUIRE(reader->GetString(L"RNAME") == L"Hello Parcel");
 
         agf = reader->GetGeometry(L"SHPGEOM");
         poly = agfRW->Read(agf);
         STRING wkt = wktRW->Write(poly);
-        CPPUNIT_ASSERT(wkt == origWkt);
+        REQUIRE(wkt == origWkt);
 
         for (INT32 i = 0; i < reader->GetPropertyCount(); i++)
         {
@@ -1565,19 +1265,19 @@
                 propName != L"RNAME" &&
                 propName != L"SHPGEOM")
             {
-                CPPUNIT_ASSERT(reader->IsNull(propName));
-                CPPUNIT_ASSERT(reader->IsNull(i));
+                REQUIRE(reader->IsNull(propName));
+                REQUIRE(reader->IsNull(i));
             }
         }
 
-        CPPUNIT_ASSERT(!reader->ReadNext());
+        REQUIRE(!reader->ReadNext());
         reader->Close();
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -1584,7 +1284,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -1592,7 +1292,7 @@
     }
 }
 
-void TestFeatureService::TestCase_InsertFeaturesBatch()
+TEST_CASE("InsertFeaturesBatch", "[FeatureService]")
 {
     try
     {
@@ -1600,12 +1300,12 @@
         Ptr<MgResourceService> pResSvc = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pResSvc == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_InsertFeaturesBatch", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_InsertFeaturesBatch", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
         Ptr<MgdFeatureService> pService = dynamic_cast<MgdFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_InsertFeaturesBatch", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_InsertFeaturesBatch", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         //Set up the feature source
@@ -1728,18 +1428,18 @@
             insertedCount++;
         }
         //We inserted 3 features
-        CPPUNIT_ASSERT(3 == insertedCount);
+        REQUIRE(3 == insertedCount);
 
         //Now query to verify all values are the same
-        Ptr<MgFeatureReader> reader = pService->SelectFeatures(fsId, L"Default:Parcels", NULL);
+        Ptr<MgFeatureReader> reader = pService->SelectFeatures(fsId, L"Default:Parcels", nullptr);
         
-        CPPUNIT_ASSERT(reader->ReadNext());
+        REQUIRE(reader->ReadNext());
 
-        CPPUNIT_ASSERT(!reader->IsNull(L"ID"));
-        CPPUNIT_ASSERT(!reader->IsNull(L"RNAME"));
-        CPPUNIT_ASSERT(!reader->IsNull(L"PRICE"));
-        CPPUNIT_ASSERT(!reader->IsNull(L"DATE"));
-        CPPUNIT_ASSERT(!reader->IsNull(L"SHPGEOM"));
+        REQUIRE(!reader->IsNull(L"ID"));
+        REQUIRE(!reader->IsNull(L"RNAME"));
+        REQUIRE(!reader->IsNull(L"PRICE"));
+        REQUIRE(!reader->IsNull(L"DATE"));
+        REQUIRE(!reader->IsNull(L"SHPGEOM"));
 
         INT32 fid = reader->GetInt32(L"ID");
         STRING frname = reader->GetString(L"RNAME");
@@ -1746,31 +1446,31 @@
         double fprice = reader->GetDouble(L"PRICE");
         Ptr<MgDateTime> fdt = reader->GetDateTime(L"DATE");
 
-        CPPUNIT_ASSERT(1 == fid);
-        CPPUNIT_ASSERT(L"Hello Parcel" == frname);
-        CPPUNIT_ASSERT(5000.0 == fprice);
-        CPPUNIT_ASSERT(2011 == fdt->GetYear());
-        CPPUNIT_ASSERT(9 == fdt->GetMonth());
-        CPPUNIT_ASSERT(14 == fdt->GetDay());
+        REQUIRE(1 == fid);
+        REQUIRE(L"Hello Parcel" == frname);
+        REQUIRE(5000.0 == fprice);
+        REQUIRE(2011 == fdt->GetYear());
+        REQUIRE(9 == fdt->GetMonth());
+        REQUIRE(14 == fdt->GetDay());
 
-        CPPUNIT_ASSERT(reader->ReadNext());
+        REQUIRE(reader->ReadNext());
 
-        CPPUNIT_ASSERT(!reader->IsNull(L"ID"));
-        CPPUNIT_ASSERT(reader->IsNull(L"RNAME"));
-        CPPUNIT_ASSERT(reader->IsNull(L"PRICE"));
-        CPPUNIT_ASSERT(reader->IsNull(L"DATE"));
-        CPPUNIT_ASSERT(!reader->IsNull(L"SHPGEOM"));
+        REQUIRE(!reader->IsNull(L"ID"));
+        REQUIRE(reader->IsNull(L"RNAME"));
+        REQUIRE(reader->IsNull(L"PRICE"));
+        REQUIRE(reader->IsNull(L"DATE"));
+        REQUIRE(!reader->IsNull(L"SHPGEOM"));
 
         fid = reader->GetInt32(L"ID");
-        CPPUNIT_ASSERT(2 == fid);
+        REQUIRE(2 == fid);
 
-        CPPUNIT_ASSERT(reader->ReadNext());
+        REQUIRE(reader->ReadNext());
 
-        CPPUNIT_ASSERT(!reader->IsNull(L"ID"));
-        CPPUNIT_ASSERT(!reader->IsNull(L"RNAME"));
-        CPPUNIT_ASSERT(!reader->IsNull(L"PRICE"));
-        CPPUNIT_ASSERT(!reader->IsNull(L"DATE"));
-        CPPUNIT_ASSERT(!reader->IsNull(L"SHPGEOM"));
+        REQUIRE(!reader->IsNull(L"ID"));
+        REQUIRE(!reader->IsNull(L"RNAME"));
+        REQUIRE(!reader->IsNull(L"PRICE"));
+        REQUIRE(!reader->IsNull(L"DATE"));
+        REQUIRE(!reader->IsNull(L"SHPGEOM"));
 
         fid = reader->GetInt32(L"ID");
         frname = reader->GetString(L"RNAME");
@@ -1777,20 +1477,20 @@
         fprice = reader->GetDouble(L"PRICE");
         fdt = reader->GetDateTime(L"DATE");
 
-        CPPUNIT_ASSERT(3 == fid);
-        CPPUNIT_ASSERT(L"Hello Parcel3" == frname);
-        CPPUNIT_ASSERT(15000.0 == fprice);
-        CPPUNIT_ASSERT(2011 == fdt->GetYear());
-        CPPUNIT_ASSERT(3 == fdt->GetMonth());
-        CPPUNIT_ASSERT(14 == fdt->GetDay());
+        REQUIRE(3 == fid);
+        REQUIRE(L"Hello Parcel3" == frname);
+        REQUIRE(15000.0 == fprice);
+        REQUIRE(2011 == fdt->GetYear());
+        REQUIRE(3 == fdt->GetMonth());
+        REQUIRE(14 == fdt->GetDay());
 
         reader->Close();
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -1797,7 +1497,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -1805,7 +1505,7 @@
     }
 }
 
-void TestFeatureService::TestCase_UpdateFeatures()
+TEST_CASE("UpdateFeatures", "[FeatureService]")
 {
     try
     {
@@ -1813,7 +1513,7 @@
         Ptr<MgdFeatureService> pService = dynamic_cast<MgdFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_UpdateFeatures", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_UpdateFeatures", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> fsId = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels_Writable.FeatureSource");
@@ -1834,16 +1534,16 @@
         filter += sdfNum;
 
         int updated = pService->UpdateMatchingFeatures(fsId, className, propVals, filter);
-        CPPUNIT_ASSERT(updated == 1);
+        REQUIRE(updated == 1);
 
         Ptr<MgFeatureQueryOptions> query = new MgFeatureQueryOptions();
         query->SetFilter(filter);
 
         Ptr<MgFeatureReader> reader = pService->SelectFeatures(fsId, className, query);
-        CPPUNIT_ASSERT(reader->ReadNext());
+        REQUIRE(reader->ReadNext());
 
-        CPPUNIT_ASSERT(!reader->IsNull(L"RPROPAD"));
-        CPPUNIT_ASSERT(reader->GetString(L"RPROPAD") == L"Foo Bar");
+        REQUIRE(!reader->IsNull(L"RPROPAD"));
+        REQUIRE(reader->GetString(L"RPROPAD") == L"Foo Bar");
         
         for (INT32 i = 0; i < reader->GetPropertyCount(); i++)
         {
@@ -1852,19 +1552,19 @@
                 propName != L"RPROPAD" &&
                 propName != L"SHPGEOM")
             {
-                CPPUNIT_ASSERT(reader->IsNull(propName));
-                CPPUNIT_ASSERT(reader->IsNull(i));
+                REQUIRE(reader->IsNull(propName));
+                REQUIRE(reader->IsNull(i));
             }
         }
 
-        CPPUNIT_ASSERT(!reader->ReadNext());
+        REQUIRE(!reader->ReadNext());
         reader->Close();
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -1871,7 +1571,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -1879,7 +1579,7 @@
     }
 }
 
-void TestFeatureService::TestCase_DeleteFeatures()
+TEST_CASE("DeleteFeatures", "[FeatureService]")
 {
     try
     {
@@ -1887,7 +1587,7 @@
         Ptr<MgdFeatureService> pService = dynamic_cast<MgdFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_DeleteFeatures", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_DeleteFeatures", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> fsId = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels_Writable.FeatureSource");
@@ -1899,13 +1599,13 @@
         filter += sdfNum;
 
         int deleted = pService->DeleteFeatures(fsId, className, filter);
-        CPPUNIT_ASSERT(deleted == 1);
+        REQUIRE(deleted == 1);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -1912,7 +1612,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -1926,7 +1626,7 @@
 /// This test case exercises executing SQL queries containing SELECT
 /// statements.
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_ExecuteSqlQuery()
+TEST_CASE("ExecuteSqlQuery", "[FeatureService]")
 {
     try
     {
@@ -1934,26 +1634,26 @@
         Ptr<MgFeatureService> pService = dynamic_cast<MgFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_ExecuteSqlQuery", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_ExecuteSqlQuery", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> resource = new MgResourceIdentifier();
         const STRING sqlQuery = L"";
-        CPPUNIT_ASSERT_THROW_MG(pService->ExecuteSqlQuery(resource, sqlQuery), MgInvalidRepositoryTypeException*);
+        REQUIRE_THROWS_MG(pService->ExecuteSqlQuery(resource, sqlQuery), MgInvalidRepositoryTypeException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Test.MapDefinition");
-        CPPUNIT_ASSERT_THROW_MG(pService->ExecuteSqlQuery(resource, sqlQuery), MgInvalidResourceTypeException*);
+        REQUIRE_THROWS_MG(pService->ExecuteSqlQuery(resource, sqlQuery), MgInvalidResourceTypeException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Test.FeatureSource");
-        CPPUNIT_ASSERT_THROW_MG(pService->ExecuteSqlQuery(resource, sqlQuery), MgInvalidArgumentException*);
+        REQUIRE_THROWS_MG(pService->ExecuteSqlQuery(resource, sqlQuery), MgInvalidArgumentException*);
 
         //TODO test with correct input
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -1960,7 +1660,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -1975,7 +1675,7 @@
 /// This test case exercises executing SQL queries not containing
 /// SELECT statements.
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_ExecuteSqlNonQuery()
+TEST_CASE("ExecuteSqlNonQuery", "[FeatureService]")
 {
     try
     {
@@ -1983,26 +1683,26 @@
         Ptr<MgFeatureService> pService = dynamic_cast<MgFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_ExecuteSqlNonQuery", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_ExecuteSqlNonQuery", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> resource = new MgResourceIdentifier();
         const STRING sqlNonQuery = L"";
-        CPPUNIT_ASSERT_THROW_MG(pService->ExecuteSqlNonQuery(resource, sqlNonQuery), MgInvalidRepositoryTypeException*);
+        REQUIRE_THROWS_MG(pService->ExecuteSqlNonQuery(resource, sqlNonQuery), MgInvalidRepositoryTypeException*);
         
         resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Test.MapDefinition");
-        CPPUNIT_ASSERT_THROW_MG(pService->ExecuteSqlNonQuery(resource, sqlNonQuery), MgInvalidResourceTypeException*);
+        REQUIRE_THROWS_MG(pService->ExecuteSqlNonQuery(resource, sqlNonQuery), MgInvalidResourceTypeException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Test.FeatureSource");
-        CPPUNIT_ASSERT_THROW_MG(pService->ExecuteSqlNonQuery(resource, sqlNonQuery), MgInvalidArgumentException*);
+        REQUIRE_THROWS_MG(pService->ExecuteSqlNonQuery(resource, sqlNonQuery), MgInvalidArgumentException*);
 
         //TODO test with correct input
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -2009,7 +1709,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -2023,7 +1723,7 @@
 ///
 /// This test case exercises getting spatial contexts.
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_GetSpatialContexts()
+TEST_CASE("GetSpatialContexts", "[FeatureService]")
 {
     try
     {
@@ -2031,15 +1731,15 @@
         Ptr<MgFeatureService> pService = dynamic_cast<MgFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetSpatialContexts", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetSpatialContexts", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> resource = new MgResourceIdentifier();
         bool activeOnly = false;
-        CPPUNIT_ASSERT_THROW_MG(pService->GetSpatialContexts(resource, activeOnly), MgInvalidRepositoryTypeException*);
+        REQUIRE_THROWS_MG(pService->GetSpatialContexts(resource, activeOnly), MgInvalidRepositoryTypeException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Geography/World.MapDefinition");
-        CPPUNIT_ASSERT_THROW_MG(pService->GetSpatialContexts(resource, activeOnly), MgInvalidResourceTypeException*);
+        REQUIRE_THROWS_MG(pService->GetSpatialContexts(resource, activeOnly), MgInvalidResourceTypeException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels.FeatureSource");
 
@@ -2048,7 +1748,7 @@
 
         // Advance to the 1st spatial context
         bool bResult = reader->ReadNext();
-        CPPUNIT_ASSERT(bResult);
+        REQUIRE(bResult);
 
         // Get the CS name and CS WKT
         STRING csName = reader->GetName();
@@ -2055,14 +1755,14 @@
         STRING csWkt = reader->GetCoordinateSystemWkt();
         //ACE_DEBUG((LM_DEBUG, ACE_TEXT("TestFeatureService::TestCase_GetSpatialContexts()\nName: %W\nWKT: %W\n"), csName.c_str(), csWkt.c_str()));
 
-        CPPUNIT_ASSERT(wcscmp(csName.c_str(), L"WGS84 Lat/Long's, Degre") == 0);
-        CPPUNIT_ASSERT(wcscmp(csWkt.c_str(), L"GEOGCS[\"WGS84 Lat/Long's, Degrees, -180 ==> +180\",DATUM[\"D_WGS_1984\",SPHEROID[\"World_Geodetic_System_of_1984\",6378137,298.257222932867]],PRIMEM[\"Greenwich\",0],UNIT[\"Degree\",0.017453292519943295]]") == 0);
+        REQUIRE(wcscmp(csName.c_str(), L"WGS84 Lat/Long's, Degre") == 0);
+        REQUIRE(wcscmp(csWkt.c_str(), L"GEOGCS[\"WGS84 Lat/Long's, Degrees, -180 ==> +180\",DATUM[\"D_WGS_1984\",SPHEROID[\"World_Geodetic_System_of_1984\",6378137,298.257222932867]],PRIMEM[\"Greenwich\",0],UNIT[\"Degree\",0.017453292519943295]]") == 0);
 
         // Close the reader
         reader->Close();
 
         // Force the reader to be cleaned up for the next operation
-        reader = NULL;
+        reader = nullptr;
 
         // Get a valid spatial context reader, this reader will be coming from the cache
         reader = pService->GetSpatialContexts(resource, activeOnly);
@@ -2069,13 +1769,13 @@
 
         // Advance to the 1st spatial context
         bResult = reader->ReadNext();
-        CPPUNIT_ASSERT(bResult);
+        REQUIRE(bResult);
 
         // Get the CS name and CS WKT
         csName = reader->GetName();
         csWkt = reader->GetCoordinateSystemWkt();
-        CPPUNIT_ASSERT(wcscmp(csName.c_str(), L"WGS84 Lat/Long's, Degre") == 0);
-        CPPUNIT_ASSERT(wcscmp(csWkt.c_str(), L"GEOGCS[\"WGS84 Lat/Long's, Degrees, -180 ==> +180\",DATUM[\"D_WGS_1984\",SPHEROID[\"World_Geodetic_System_of_1984\",6378137,298.257222932867]],PRIMEM[\"Greenwich\",0],UNIT[\"Degree\",0.017453292519943295]]") == 0);
+        REQUIRE(wcscmp(csName.c_str(), L"WGS84 Lat/Long's, Degre") == 0);
+        REQUIRE(wcscmp(csWkt.c_str(), L"GEOGCS[\"WGS84 Lat/Long's, Degrees, -180 ==> +180\",DATUM[\"D_WGS_1984\",SPHEROID[\"World_Geodetic_System_of_1984\",6378137,298.257222932867]],PRIMEM[\"Greenwich\",0],UNIT[\"Degree\",0.017453292519943295]]") == 0);
 
         // Close the reader
         reader->Close();
@@ -2082,9 +1782,9 @@
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -2091,7 +1791,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -2105,7 +1805,7 @@
 ///
 /// This test case exercises getting long transactions.
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_GetLongTransactions()
+TEST_CASE("GetLongTransactions", "[FeatureService]")
 {
     try
     {
@@ -2113,23 +1813,23 @@
         Ptr<MgFeatureService> pService = dynamic_cast<MgFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetLongTransactions", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetLongTransactions", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> resource = new MgResourceIdentifier();
         bool activeOnly = false;
-        CPPUNIT_ASSERT_THROW_MG(pService->GetLongTransactions(resource, activeOnly), MgInvalidRepositoryTypeException*);
+        REQUIRE_THROWS_MG(pService->GetLongTransactions(resource, activeOnly), MgInvalidRepositoryTypeException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Geography/World.MapDefinition");
-        CPPUNIT_ASSERT_THROW_MG(pService->GetLongTransactions(resource, activeOnly), MgInvalidResourceTypeException*);
+        REQUIRE_THROWS_MG(pService->GetLongTransactions(resource, activeOnly), MgInvalidResourceTypeException*);
 
         //TODO test with correct input
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -2136,7 +1836,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -2150,7 +1850,7 @@
 ///
 /// This test case exercises setting long transaction names.
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_SetLongTransaction()
+TEST_CASE("SetLongTransaction", "[FeatureService]")
 {
     try
     {
@@ -2158,43 +1858,43 @@
         Ptr<MgFeatureService> pService = dynamic_cast<MgFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_SetLongTransaction", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_SetLongTransaction", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         STRING longTransactionName = L"Live";
 
-        // verify exception when passing in a NULL resource
-        CPPUNIT_ASSERT_THROW_MG(pService->SetLongTransaction(NULL, longTransactionName), MgNullArgumentException*);
+        // verify exception when passing in a nullptr resource
+        REQUIRE_THROWS_MG(pService->SetLongTransaction(nullptr, longTransactionName), MgNullArgumentException*);
 
         // verify exception when passing in an invalid resource type
         Ptr<MgResourceIdentifier> resource = new MgResourceIdentifier();
-        CPPUNIT_ASSERT_THROW_MG(pService->SetLongTransaction(resource, longTransactionName), MgInvalidRepositoryTypeException*);
+        REQUIRE_THROWS_MG(pService->SetLongTransaction(resource, longTransactionName), MgInvalidRepositoryTypeException*);
 
         resource = new MgResourceIdentifier(L"Library://UnitTests/Geography/World.MapDefinition");
-        CPPUNIT_ASSERT_THROW_MG(pService->SetLongTransaction(resource, longTransactionName), MgInvalidResourceTypeException*);
+        REQUIRE_THROWS_MG(pService->SetLongTransaction(resource, longTransactionName), MgInvalidResourceTypeException*);
 
         // verify exception when session is not set
         //resource = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels.FeatureSource");
-        //CPPUNIT_ASSERT_THROW_MG(pService->SetLongTransaction(resource, longTransactionName), MgSessionNotFoundException*);
+        //REQUIRE_THROWS_MG(pService->SetLongTransaction(resource, longTransactionName), MgSessionNotFoundException*);
 
         // set the user information for the current thread to be administrator - this
         // alone doesn't create a session
-        //CPPUNIT_ASSERT_THROW_MG(pService->SetLongTransaction(resource, longTransactionName), MgSessionNotFoundException*);
+        //REQUIRE_THROWS_MG(pService->SetLongTransaction(resource, longTransactionName), MgSessionNotFoundException*);
 
         // now set a session
-        //CPPUNIT_ASSERT(pService->SetLongTransaction(resource, longTransactionName));
+        //REQUIRE(pService->SetLongTransaction(resource, longTransactionName));
 
         // setting the same LT name twice shouldn't matter
-        //CPPUNIT_ASSERT(pService->SetLongTransaction(resource, longTransactionName));
+        //REQUIRE(pService->SetLongTransaction(resource, longTransactionName));
 
         // should be able to clear the LT name
-        //CPPUNIT_ASSERT(pService->SetLongTransaction(resource, L""));
+        //REQUIRE(pService->SetLongTransaction(resource, L""));
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -2201,7 +1901,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -2222,19 +1922,19 @@
         Ptr<MgFeatureService> pService = MgdServiceFactory::CreateFeatureService();
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetFeatures", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetFeatures", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         STRING readerId = L"0";
-        CPPUNIT_ASSERT_THROW_MG(pService->GetFeatures(readerId), MgInvalidArgumentException*);
+        REQUIRE_THROWS_MG(pService->GetFeatures(readerId), MgInvalidArgumentException*);
 
         //TODO test with correct input
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -2241,7 +1941,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -2262,20 +1962,20 @@
         Ptr<MgFeatureService> pService = MgdServiceFactory::CreateFeatureService();
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_CloseFeatureReader", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_CloseFeatureReader", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         STRING readerId = L"0";
         bool closed = pService->CloseFeatureReader(readerId);
-        CPPUNIT_ASSERT(!closed);
+        REQUIRE(!closed);
 
         // TODO test with correct input
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -2282,7 +1982,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -2303,19 +2003,19 @@
         Ptr<MgFeatureService> pService = MgdServiceFactory::CreateFeatureService();
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetSqlRows", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetSqlRows", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         STRING sqlReader = L"0";
-        CPPUNIT_ASSERT_THROW_MG(pService->GetSqlRows(sqlReader), MgInvalidArgumentException*);
+        REQUIRE_THROWS_MG(pService->GetSqlRows(sqlReader), MgInvalidArgumentException*);
 
         //TODO test with correct input
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -2322,7 +2022,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -2343,20 +2043,20 @@
         Ptr<MgFeatureService> pService = MgdServiceFactory::CreateFeatureService();
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_CloseSqlReader", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_CloseSqlReader", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         STRING sqlReader = L"0";
         bool closed = pService->CloseSqlReader(sqlReader);
-        CPPUNIT_ASSERT(!closed);
+        REQUIRE(!closed);
 
         // TODO test with correct input
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -2363,7 +2063,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -2385,21 +2085,21 @@
         Ptr<MgFeatureService> pService = MgdServiceFactory::CreateFeatureService();
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetRaster", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetRaster", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         STRING featureReader = L"0";
         INT32 xSize = 0;
         INT32 ySize = 0;
-        CPPUNIT_ASSERT_THROW_MG(pService->GetRaster(featureReader, xSize, ySize, L""), MgInvalidArgumentException*);
+        REQUIRE_THROWS_MG(pService->GetRaster(featureReader, xSize, ySize, L""), MgInvalidArgumentException*);
 
         //TODO test with correct input
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -2406,7 +2106,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -2428,19 +2128,19 @@
         Ptr<MgFeatureService> pService = MgdServiceFactory::CreateFeatureService();
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetDataRows", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_GetDataRows", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         STRING dataReader = L"0";
-        CPPUNIT_ASSERT_THROW_MG(pService->GetDataRows(dataReader), MgInvalidArgumentException*);
+        REQUIRE_THROWS_MG(pService->GetDataRows(dataReader), MgInvalidArgumentException*);
 
         //TODO test with correct input
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -2447,7 +2147,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -2468,20 +2168,20 @@
         Ptr<MgFeatureService> pService = MgdServiceFactory::CreateFeatureService();
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_CloseDataReader", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_CloseDataReader", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         STRING dataReader = L"0";
         bool closed = pService->CloseDataReader(dataReader);
-        CPPUNIT_ASSERT(!closed);
+        REQUIRE(!closed);
 
         // TODO test with correct input
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -2488,7 +2188,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -2502,7 +2202,7 @@
 ///
 /// This test case exercises joining features.
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_JoinFeatures()
+TEST_CASE("JoinFeatures", "[FeatureService]")
 {
     try
     {
@@ -2511,12 +2211,12 @@
         if (pService == 0)
         {
             throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_JoinFeatures",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> lFeatureSource = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels.FeatureSource");
 
-        Ptr<MgFeatureReader> reader = pService->SelectFeatures(lFeatureSource, L"Ext1", NULL);
+        Ptr<MgFeatureReader> reader = pService->SelectFeatures(lFeatureSource, L"Ext1", nullptr);
 
         bool bReadNextResult = reader->ReadNext();
              bReadNextResult = reader->ReadNext();
@@ -2529,17 +2229,17 @@
         // Close the reader
         reader->Close();
 
-        CPPUNIT_ASSERT(bReadNextResult);
-        CPPUNIT_ASSERT(bIsNullResult == false);
-        CPPUNIT_ASSERT(s1 == L"NIEMUTH, ROGER L.");
-        CPPUNIT_ASSERT(s2 == L"Wells Fargo");
-        CPPUNIT_ASSERT(s3 == L"10573");
+        REQUIRE(bReadNextResult);
+        REQUIRE(bIsNullResult == false);
+        REQUIRE(s1 == L"NIEMUTH, ROGER L.");
+        REQUIRE(s2 == L"Wells Fargo");
+        REQUIRE(s3 == L"10573");
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -2546,7 +2246,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -2560,7 +2260,7 @@
 ///
 /// This test case exercises joining features defined as chained, inner, 1-to-many.
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_JoinFeaturesChainedInner1ToMany()
+TEST_CASE("JoinFeaturesChainedInner1ToMany", "[FeatureService]")
 {
     try
     {
@@ -2569,12 +2269,12 @@
         if (pService == 0)
         {
             throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_JoinFeaturesChainedInner1ToMany",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> lFeatureSource = new MgResourceIdentifier(L"Library://UnitTests/Data/TestChainedInner1ToManyJoin.FeatureSource");
 
-        Ptr<MgFeatureReader> reader = pService->SelectFeatures(lFeatureSource, L"Ext1", NULL);
+        Ptr<MgFeatureReader> reader = pService->SelectFeatures(lFeatureSource, L"Ext1", nullptr);
 
         bool bReadNextResult = reader->ReadNext();
         bool bIsNullResult = reader->IsNull(L"Join1NAME");
@@ -2598,22 +2298,22 @@
         #endif
         */
 
-        CPPUNIT_ASSERT(bReadNextResult);
-        CPPUNIT_ASSERT(bIsNullResult == false);
-        CPPUNIT_ASSERT(bIsNullResult2 == false);
-        CPPUNIT_ASSERT(s1 == L"CITY OF SHEBOYGAN");
-        CPPUNIT_ASSERT(s2 == L"Johnson Bank");
-        CPPUNIT_ASSERT(s3 == L"30320");
-        CPPUNIT_ASSERT(s4 == L"Voting District Seven");
-        CPPUNIT_ASSERT(s5 == L"7");
+        REQUIRE(bReadNextResult);
+        REQUIRE(bIsNullResult == false);
+        REQUIRE(bIsNullResult2 == false);
+        REQUIRE(s1 == L"CITY OF SHEBOYGAN");
+        REQUIRE(s2 == L"Johnson Bank");
+        REQUIRE(s3 == L"30320");
+        REQUIRE(s4 == L"Voting District Seven");
+        REQUIRE(s5 == L"7");
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
-        STRING st = e->GetStackTrace(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
+        STRING st = e->GetStackTrace(TestServiceFactory::TEST_LOCALE);
         message += L"\n" + st;
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -2620,7 +2320,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -2634,7 +2334,7 @@
 /// This test case exercises schema description APIs against a feature source
 /// with Extended Feature Classes
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_ExtendedFeatureClass()
+TEST_CASE("ExtendedFeatureClass", "[FeatureService]")
 {
     try
     {
@@ -2643,29 +2343,29 @@
         if (pService == 0)
         {
             throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_ExtendedFeatureClass",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> lFeatureSource = new MgResourceIdentifier(L"Library://UnitTests/Data/TestChainedInner1ToManyJoin.FeatureSource");
 
-        Ptr<MgFeatureReader> reader = pService->SelectFeatures(lFeatureSource, L"Ext1", NULL);
+        Ptr<MgFeatureReader> reader = pService->SelectFeatures(lFeatureSource, L"Ext1", nullptr);
 
         //With GetIdentityProperties
         Ptr<MgPropertyDefinitionCollection> idProps = pService->GetIdentityProperties(lFeatureSource, L"SHP_Schema", L"Ext1");
-        CPPUNIT_ASSERT(NULL != idProps);
-        CPPUNIT_ASSERT(1 == idProps->GetCount());
+        REQUIRE(nullptr != idProps);
+        REQUIRE(1 == idProps->GetCount());
 
         Ptr<MgStringCollection> findClasses = new MgStringCollection();
         findClasses->Add(L"Ext1");
         Ptr<MgClassDefinitionCollection> matches = pService->GetIdentityProperties(lFeatureSource, L"SHP_Schema", findClasses);
-        CPPUNIT_ASSERT(NULL != matches);
-        CPPUNIT_ASSERT(1 == matches->GetCount());
+        REQUIRE(nullptr != matches);
+        REQUIRE(1 == matches->GetCount());
 
         Ptr<MgFeatureSchemaCollection> schemas;
         Ptr<MgFeatureSchema> schema;
         //With GetClasses
         Ptr<MgStringCollection> classNames = pService->GetClasses(lFeatureSource, L"");
-        CPPUNIT_ASSERT(classNames->GetCount() > 0);
+        REQUIRE(classNames->GetCount() > 0);
         bool bFound = false;
         for (INT32 i = 0; i < classNames->GetCount(); i++)
         {
@@ -2676,12 +2376,12 @@
                 break;
             }
         }
-        CPPUNIT_ASSERT(bFound);
+        REQUIRE(bFound);
 
         //With 1st variation of DescribeSchema()
         schemas = pService->DescribeSchema(lFeatureSource, L"");
-        CPPUNIT_ASSERT(NULL != schemas.p);
-        CPPUNIT_ASSERT(1 == schemas->GetCount());
+        REQUIRE(nullptr != schemas.p);
+        REQUIRE(1 == schemas->GetCount());
         schema = schemas->GetItem(0);
         Ptr<MgClassDefinitionCollection> classes = schema->GetClasses();
         bFound = false;
@@ -2694,12 +2394,12 @@
                 break;
             }
         }
-        CPPUNIT_ASSERT(bFound);
+        REQUIRE(bFound);
 
         //1st variation of DescribeSchema() with the actual parent schema name
         schemas = pService->DescribeSchema(lFeatureSource, L"SHP_Schema");
-        CPPUNIT_ASSERT(NULL != schemas.p);
-        CPPUNIT_ASSERT(1 == schemas->GetCount());
+        REQUIRE(nullptr != schemas.p);
+        REQUIRE(1 == schemas->GetCount());
         schema = schemas->GetItem(0);
         classes = schema->GetClasses();
         bFound = false;
@@ -2712,14 +2412,14 @@
                 break;
             }
         }
-        CPPUNIT_ASSERT(bFound);
+        REQUIRE(bFound);
         Ptr<MgStringCollection> findClassNames = new MgStringCollection();
         findClassNames->Add(L"Ext1");
 
         //2nd variation of DescribeSchema()
         schemas = pService->DescribeSchema(lFeatureSource, L"SHP_Schema", findClassNames);
-        CPPUNIT_ASSERT(NULL != schemas.p);
-        CPPUNIT_ASSERT(1 == schemas->GetCount());
+        REQUIRE(nullptr != schemas.p);
+        REQUIRE(1 == schemas->GetCount());
         schema = schemas->GetItem(0);
         classes = schema->GetClasses();
         bFound = false;
@@ -2732,10 +2432,10 @@
                 break;
             }
         }
-        CPPUNIT_ASSERT(bFound);
+        REQUIRE(bFound);
 
         Ptr<MgClassDefinition> clsDef = pService->GetClassDefinition(lFeatureSource, L"SHP_Schema", L"Ext1");
-        CPPUNIT_ASSERT(NULL != clsDef.p);
+        REQUIRE(nullptr != clsDef.p);
 
         //Custom aggregates should also work
         Ptr<MgFeatureAggregateOptions> agg = new MgFeatureAggregateOptions();
@@ -2743,18 +2443,18 @@
         Ptr<MgDataReader> dr = pService->SelectAggregate(lFeatureSource, L"Ext1", agg);
         bool bRead = dr->ReadNext();
         dr->Close();
-        CPPUNIT_ASSERT(bRead);
+        REQUIRE(bRead);
 
         //XML form should also have this class
         STRING xml = pService->DescribeSchemaAsXml(lFeatureSource, L"");
-        CPPUNIT_ASSERT(!xml.empty());
+        REQUIRE(!xml.empty());
         Ptr<MgFeatureSchemaCollection> pSchemas = pService->XmlToSchema(xml);
-        CPPUNIT_ASSERT(NULL != pSchemas.p);
-        CPPUNIT_ASSERT(1 == pSchemas->GetCount());
+        REQUIRE(nullptr != pSchemas.p);
+        REQUIRE(1 == pSchemas->GetCount());
         Ptr<MgFeatureSchema> pSchema = pSchemas->GetItem(0);
         Ptr<MgClassDefinitionCollection> pClasses = pSchema->GetClasses();
-        CPPUNIT_ASSERT(NULL != pClasses.p);
-        CPPUNIT_ASSERT(pClasses->GetCount() > 0);
+        REQUIRE(nullptr != pClasses.p);
+        REQUIRE(pClasses->GetCount() > 0);
         bFound = false;
         for (INT32 i = 0; i < pClasses->GetCount(); i++)
         {
@@ -2765,18 +2465,18 @@
                 break;
             }
         }
-        CPPUNIT_ASSERT(bFound);
+        REQUIRE(bFound);
 
         //XML form should also have this class
         xml = pService->DescribeSchemaAsXml(lFeatureSource, L"SHP_Schema");
-        CPPUNIT_ASSERT(!xml.empty());
+        REQUIRE(!xml.empty());
         pSchemas = pService->XmlToSchema(xml);
-        CPPUNIT_ASSERT(NULL != pSchemas.p);
-        CPPUNIT_ASSERT(1 == pSchemas->GetCount());
+        REQUIRE(nullptr != pSchemas.p);
+        REQUIRE(1 == pSchemas->GetCount());
         pSchema = pSchemas->GetItem(0);
         pClasses = pSchema->GetClasses();
-        CPPUNIT_ASSERT(NULL != pClasses.p);
-        CPPUNIT_ASSERT(pClasses->GetCount() > 0);
+        REQUIRE(nullptr != pClasses.p);
+        REQUIRE(pClasses->GetCount() > 0);
         bFound = false;
         for (INT32 i = 0; i < pClasses->GetCount(); i++)
         {
@@ -2787,15 +2487,15 @@
                 break;
             }
         }
-        CPPUNIT_ASSERT(bFound);
+        REQUIRE(bFound);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
-        STRING st = e->GetStackTrace(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
+        STRING st = e->GetStackTrace(TestServiceFactory::TEST_LOCALE);
         message += L"\n" + st;
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -2802,7 +2502,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -2815,7 +2515,7 @@
 ///
 /// This test case exercises the UpdateFeatures API for insertion
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_UpdateFeaturesInsert()
+TEST_CASE("UpdateFeaturesInsert", "[FeatureService]")
 {
     try
     {
@@ -2822,13 +2522,13 @@
         Ptr<MgdServiceFactory> fact = new MgdServiceFactory();
         if (fact == 0)
         {
-            throw new MgNullReferenceException(L"TestFeatureService.TestCase_SavePoint", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgNullReferenceException(L"TestFeatureService.TestCase_SavePoint", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgFeatureService> pService = dynamic_cast<MgFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_SavePoint", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_SavePoint", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> featureSource = new MgResourceIdentifier(L"Library://UnitTests/Data/TestInsert.FeatureSource");
@@ -2893,10 +2593,10 @@
 
         //Execute insert. Should be fine
         Ptr<MgPropertyCollection> result = pService->UpdateFeatures(featureSource, commands, true);
-        CPPUNIT_ASSERT(result->GetCount() == 1);
+        REQUIRE(result->GetCount() == 1);
         INT32 i = 0;
         Ptr<MgProperty> resItem1 = result->GetItem(i);
-        CPPUNIT_ASSERT(resItem1->GetPropertyType() == MgPropertyType::Feature);
+        REQUIRE(resItem1->GetPropertyType() == MgPropertyType::Feature);
         Ptr<MgFeatureReader> rdr = ((MgFeatureProperty*)resItem1.p)->GetValue();
         rdr->Close();
 
@@ -2904,7 +2604,7 @@
         nameVal->SetValue(L"Bar");
 
         //Execute again, expect MgFdoException due to constraint violation
-        CPPUNIT_ASSERT_THROW_MG(result = pService->UpdateFeatures(featureSource, commands, true), MgFdoException*);
+        REQUIRE_THROWS_MG(result = pService->UpdateFeatures(featureSource, commands, true), MgFdoException*);
         
         //Expect one inserted result
         Ptr<MgFeatureQueryOptions> query = new MgFeatureQueryOptions();
@@ -2912,14 +2612,14 @@
         INT32 count = 0;
         while (qryReader->ReadNext()) { count++; }
         qryReader->Close();
-        CPPUNIT_ASSERT(1 == count);
+        REQUIRE(1 == count);
 
         //Execute again, useTransaction = false. Should not throw exception, but log
         //the error as a MgStringProperty
         result = pService->UpdateFeatures(featureSource, commands, false);
-        CPPUNIT_ASSERT(result->GetCount() == 1);
+        REQUIRE(result->GetCount() == 1);
         resItem1 = result->GetItem(i);
-        CPPUNIT_ASSERT(resItem1->GetPropertyType() == MgPropertyType::String); //Errors are of type String
+        REQUIRE(resItem1->GetPropertyType() == MgPropertyType::String); //Errors are of type String
 
         //Use new id
         idVal->SetValue(2);
@@ -2926,22 +2626,22 @@
 
         //Should be fine now
         result = pService->UpdateFeatures(featureSource, commands, true);
-        CPPUNIT_ASSERT(result->GetCount() == 1);
+        REQUIRE(result->GetCount() == 1);
         resItem1 = result->GetItem(i);
-        CPPUNIT_ASSERT(resItem1->GetPropertyType() == MgPropertyType::Feature);
+        REQUIRE(resItem1->GetPropertyType() == MgPropertyType::Feature);
         rdr = ((MgFeatureProperty*)resItem1.p)->GetValue();
         rdr->Close();
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL("FdoException occurred");
+        FAIL("FdoException occurred");
     }
     catch(...)
     {
@@ -2954,7 +2654,7 @@
 ///
 /// This test case exercises the FDO join optimization
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_JoinFdoFeatures()
+TEST_CASE("JoinFdoFeatures", "[FeatureService]")
 {
     try
     {
@@ -2963,48 +2663,48 @@
         if (pService == 0)
         {
             throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_JoinFdoFeatures",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> lFeatureSource = new MgResourceIdentifier(L"Library://UnitTests/Data/FdoJoin.FeatureSource");
 
-        Ptr<MgFeatureReader> reader = pService->SelectFeatures(lFeatureSource, L"CitiesCountries", NULL);
+        Ptr<MgFeatureReader> reader = pService->SelectFeatures(lFeatureSource, L"CitiesCountries", nullptr);
 
         INT32 count1 = 0;
         while(reader->ReadNext())
         {
-            CPPUNIT_ASSERT(reader->IsNull(L"ID") == false);
-            CPPUNIT_ASSERT(reader->IsNull(L"CountryCode") == false);
-            CPPUNIT_ASSERT(reader->IsNull(L"StateCode") == false);
-            CPPUNIT_ASSERT(reader->IsNull(L"Name") == false);
-            CPPUNIT_ASSERT(reader->IsNull(L"Population") == false);
-            CPPUNIT_ASSERT(reader->IsNull(L"CNT_CountryCode") == false);
-            CPPUNIT_ASSERT(reader->IsNull(L"CNT_Name") == false);
+            REQUIRE(reader->IsNull(L"ID") == false);
+            REQUIRE(reader->IsNull(L"CountryCode") == false);
+            REQUIRE(reader->IsNull(L"StateCode") == false);
+            REQUIRE(reader->IsNull(L"Name") == false);
+            REQUIRE(reader->IsNull(L"Population") == false);
+            REQUIRE(reader->IsNull(L"CNT_CountryCode") == false);
+            REQUIRE(reader->IsNull(L"CNT_Name") == false);
             count1++;
         }
         reader->Close();
-        CPPUNIT_ASSERT(10 == count1);
+        REQUIRE(10 == count1);
 
-        Ptr<MgFeatureReader> reader2 = pService->SelectFeatures(lFeatureSource, L"CitiesStates", NULL);
+        Ptr<MgFeatureReader> reader2 = pService->SelectFeatures(lFeatureSource, L"CitiesStates", nullptr);
 
         INT32 count2 = 0;
         while(reader2->ReadNext())
         {
-            CPPUNIT_ASSERT(reader2->IsNull(L"ID") == false);
-            CPPUNIT_ASSERT(reader2->IsNull(L"CountryCode") == false);
-            CPPUNIT_ASSERT(reader2->IsNull(L"StateCode") == false);
-            CPPUNIT_ASSERT(reader2->IsNull(L"Name") == false);
-            CPPUNIT_ASSERT(reader2->IsNull(L"Population") == false);
-            CPPUNIT_ASSERT(reader2->IsNull(L"ST_ID") == false);
-            CPPUNIT_ASSERT(reader2->IsNull(L"ST_CountryCode") == false);
-            CPPUNIT_ASSERT(reader2->IsNull(L"ST_StateCode") == false);
-            CPPUNIT_ASSERT(reader2->IsNull(L"ST_Name") == false);
+            REQUIRE(reader2->IsNull(L"ID") == false);
+            REQUIRE(reader2->IsNull(L"CountryCode") == false);
+            REQUIRE(reader2->IsNull(L"StateCode") == false);
+            REQUIRE(reader2->IsNull(L"Name") == false);
+            REQUIRE(reader2->IsNull(L"Population") == false);
+            REQUIRE(reader2->IsNull(L"ST_ID") == false);
+            REQUIRE(reader2->IsNull(L"ST_CountryCode") == false);
+            REQUIRE(reader2->IsNull(L"ST_StateCode") == false);
+            REQUIRE(reader2->IsNull(L"ST_Name") == false);
             count2++;
         }
         reader2->Close();
-        CPPUNIT_ASSERT(10 == count2);
+        REQUIRE(10 == count2);
 
-        Ptr<MgFeatureReader> reader3 = pService->SelectFeatures(lFeatureSource, L"CitiesStatesOneToOne", NULL);
+        Ptr<MgFeatureReader> reader3 = pService->SelectFeatures(lFeatureSource, L"CitiesStatesOneToOne", nullptr);
         INT32 count3 = 0;
         while(reader3->ReadNext())
         {
@@ -3011,13 +2711,13 @@
             count3++;
         }
         reader3->Close();
-        CPPUNIT_ASSERT(10 == count3);
+        REQUIRE(10 == count3);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -3024,7 +2724,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -3038,7 +2738,7 @@
 ///
 /// This test case exercises creating a feature source.
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_CreateFeatureSource()
+TEST_CASE("CreateFeatureSource", "[FeatureService]")
 {
     try
     {
@@ -3047,7 +2747,7 @@
         if (pService == 0)
         {
             throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_CreateFeatureSource",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceService> pResourceService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
@@ -3054,7 +2754,7 @@
         if (pResourceService == 0)
         {
             throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_CreateFeatureSource",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         // Create class definition
@@ -3118,9 +2818,9 @@
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -3127,7 +2827,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -3140,7 +2840,7 @@
 ///
 /// This test case benchmarks selecting features.
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_BenchmarkSelectFeatures()
+TEST_CASE("BenchmarkSelectFeatures", "[FeatureService]")
 {
     try
     {
@@ -3150,7 +2850,7 @@
         Ptr<MgFeatureService> pService = dynamic_cast<MgFeatureService*>(factory->CreateService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_BenchmarkSelectFeatures", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_BenchmarkSelectFeatures", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> resource = new MgResourceIdentifier();
@@ -3175,7 +2875,7 @@
 
             // Close the reader
             reader->Close();
-            CPPUNIT_ASSERT(nFeatures == 17565);
+            REQUIRE(nFeatures == 17565);
         }
         clock_t clock_end = clock();
         ACE_DEBUG((LM_INFO, ACE_TEXT("  Execution Time (Average of %d runs): = %6.4f (s)\n"), iterations, ((double)(clock_end - clock_start) / CLOCKS_PER_SEC)/(double)iterations ));
@@ -3183,9 +2883,9 @@
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -3192,7 +2892,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -3200,7 +2900,8 @@
     }
 }
 
-void TestFeatureService::TestCase_SecuredCredentials()
+//TEST_CASE("SecuredCredentials", "[Skip]")
+void Skip_SecuredCredentials()
 {
     //This test requires SQL Server express with a MgUnitTest database created.
     //Once these requirements are met, fill in the required SQL Server credentials here
@@ -3212,12 +2913,12 @@
         Ptr<MgFeatureService> featSvc = dynamic_cast<MgFeatureService*>(factory->CreateService(MgServiceType::FeatureService));
         if (featSvc == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_SecuredCredentials", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_SecuredCredentials", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
         Ptr<MgdResourceService> resSvc = dynamic_cast<MgdResourceService*>(factory->CreateService(MgServiceType::ResourceService));
         if (resSvc == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_SecuredCredentials", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_SecuredCredentials", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
         
         Ptr<MgResourceIdentifier> fsId = new MgResourceIdentifier(L"Library://UnitTests/Data/SecuredCredentials.FeatureSource");
@@ -3225,7 +2926,7 @@
         try
         {
             bool bResult = featSvc->TestConnection(fsId);
-            CPPUNIT_ASSERT(false == bResult);
+            REQUIRE(false == bResult);
         }
         catch (MgFdoException* ex)
         {
@@ -3234,7 +2935,7 @@
 
         //Now apply credentials
         resSvc->SetResourceCredentials(fsId, username, password);
-        CPPUNIT_ASSERT(true == featSvc->TestConnection(fsId));
+        REQUIRE(true == featSvc->TestConnection(fsId));
 
         //Now apply bad credentials
         username = L"foo";
@@ -3244,7 +2945,7 @@
         try
         {
             bool bResult = featSvc->TestConnection(fsId);
-            CPPUNIT_ASSERT(false == bResult);
+            REQUIRE(false == bResult);
         }
         catch (MgFdoException* ex)
         {
@@ -3257,7 +2958,7 @@
         try
         {
             bool bResult = featSvc->TestConnection(fsId);
-            CPPUNIT_ASSERT(false == bResult);
+            REQUIRE(false == bResult);
         }
         catch (MgFdoException* ex)
         {
@@ -3266,9 +2967,9 @@
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -3275,7 +2976,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -3283,7 +2984,7 @@
     }
 }
 
-MgdMap* TestFeatureService::CreateTestMap()
+static MgdMap* CreateTestMap()
 {
     Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/SheboyganWriteable.MapDefinition");
     MgdMap* map = new MgdMap(mdfres);
@@ -3305,7 +3006,7 @@
 ///
 /// This test case exercises the InsertFeatures() convenience API
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_LayerInsertFeatures()
+TEST_CASE("LayerInsertFeatures", "[FeatureService]")
 {
     try
     {
@@ -3338,8 +3039,8 @@
         }
         fr->Close();
 
-        CPPUNIT_ASSERT(inserted == 1);
-        CPPUNIT_ASSERT(smTestSdfId != -1);
+        REQUIRE(inserted == 1);
+        REQUIRE(smTestSdfId != -1);
 
         //Do a select to verify it's definitely there
         Ptr<MgFeatureQueryOptions> query = new MgFeatureQueryOptions();
@@ -3351,17 +3052,17 @@
 
         Ptr<MgReader> reader = parcels->SelectFeatures(query);
         bool read = reader->ReadNext();
-        CPPUNIT_ASSERT(read);
-        CPPUNIT_ASSERT(!reader->IsNull(L"Autogenerated_SDF_ID"));
-        CPPUNIT_ASSERT(!reader->IsNull(L"RNAME"));
-        CPPUNIT_ASSERT(!reader->IsNull(L"SHPGEOM"));
-        CPPUNIT_ASSERT(reader->GetInt32(L"Autogenerated_SDF_ID") == smTestSdfId);
-        CPPUNIT_ASSERT(reader->GetString(L"RNAME") == L"Hello Parcel");
+        REQUIRE(read);
+        REQUIRE(!reader->IsNull(L"Autogenerated_SDF_ID"));
+        REQUIRE(!reader->IsNull(L"RNAME"));
+        REQUIRE(!reader->IsNull(L"SHPGEOM"));
+        REQUIRE(reader->GetInt32(L"Autogenerated_SDF_ID") == smTestSdfId);
+        REQUIRE(reader->GetString(L"RNAME") == L"Hello Parcel");
 
         agf = reader->GetGeometry(L"SHPGEOM");
         poly = agfRW->Read(agf);
         STRING wkt = wktRW->Write(poly);
-        CPPUNIT_ASSERT(wkt == origWkt);
+        REQUIRE(wkt == origWkt);
 
         for (INT32 i = 0; i < reader->GetPropertyCount(); i++)
         {
@@ -3370,19 +3071,19 @@
                 propName != L"RNAME" &&
                 propName != L"SHPGEOM")
             {
-                CPPUNIT_ASSERT(reader->IsNull(propName));
-                CPPUNIT_ASSERT(reader->IsNull(i));
+                REQUIRE(reader->IsNull(propName));
+                REQUIRE(reader->IsNull(i));
             }
         }
 
-        CPPUNIT_ASSERT(!reader->ReadNext());
+        REQUIRE(!reader->ReadNext());
         reader->Close();
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -3389,7 +3090,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -3402,7 +3103,7 @@
 ///
 /// This test case exercises the UpdateFeatures() convenience API
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_LayerUpdateFeatures()
+TEST_CASE("LayerUpdateFeatures", "[FeatureService]")
 {
     try
     {
@@ -3426,16 +3127,16 @@
         filter += sdfNum;
 
         int updated = parcels->UpdateMatchingFeatures(propVals, filter);
-        CPPUNIT_ASSERT(updated == 1);
+        REQUIRE(updated == 1);
 
         Ptr<MgFeatureQueryOptions> query = new MgFeatureQueryOptions();
         query->SetFilter(filter);
 
         Ptr<MgFeatureReader> reader = parcels->SelectFeatures(query);
-        CPPUNIT_ASSERT(reader->ReadNext());
+        REQUIRE(reader->ReadNext());
 
-        CPPUNIT_ASSERT(!reader->IsNull(L"RPROPAD"));
-        CPPUNIT_ASSERT(reader->GetString(L"RPROPAD") == L"Foo Bar");
+        REQUIRE(!reader->IsNull(L"RPROPAD"));
+        REQUIRE(reader->GetString(L"RPROPAD") == L"Foo Bar");
         
         for (INT32 i = 0; i < reader->GetPropertyCount(); i++)
         {
@@ -3444,19 +3145,19 @@
                 propName != L"RPROPAD" &&
                 propName != L"SHPGEOM")
             {
-                CPPUNIT_ASSERT(reader->IsNull(propName));
-                CPPUNIT_ASSERT(reader->IsNull(i));
+                REQUIRE(reader->IsNull(propName));
+                REQUIRE(reader->IsNull(i));
             }
         }
 
-        CPPUNIT_ASSERT(!reader->ReadNext());
+        REQUIRE(!reader->ReadNext());
         reader->Close();
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -3463,7 +3164,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -3476,7 +3177,7 @@
 ///
 /// This test case exercises the DeleteFeatures() convenience API
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_LayerDeleteFeatures()
+TEST_CASE("LayerDeleteFeatures", "[FeatureService]")
 {
     try
     {
@@ -3491,13 +3192,13 @@
         filter += sdfNum;
 
         int deleted = parcels->DeleteFeatures(filter);
-        CPPUNIT_ASSERT(deleted == 1);
+        REQUIRE(deleted == 1);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -3504,7 +3205,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -3517,7 +3218,7 @@
 ///
 /// This test case exercises the SelectFeaturesExtended() convenience API
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_LayerSelectScrollable()
+TEST_CASE("LayerSelectScrollable", "[FeatureService]")
 {
     try
     {
@@ -3529,7 +3230,7 @@
         Ptr<MgFeatureQueryOptions> options = new MgFeatureQueryOptions();
         Ptr<MgdScrollableFeatureReader> reader = parcels->SelectFeaturesExtended(options);
         INT32 count = reader->Count();
-        CPPUNIT_ASSERT(17565 == count);
+        REQUIRE(17565 == count);
 
         Ptr<MgPropertyCollection> keys = new MgPropertyCollection();
         Ptr<MgInt32Property> keyVal = new MgInt32Property(L"Autogenerated_SDF_ID", 4);
@@ -3560,22 +3261,22 @@
         bool bAfterLast = reader->ReadNext();
         reader->Close();
 
-        CPPUNIT_ASSERT(bScroll);
-        CPPUNIT_ASSERT(bScroll2);
-        CPPUNIT_ASSERT(!bScroll3);
-        CPPUNIT_ASSERT(!bScroll4);
-        CPPUNIT_ASSERT(!bScroll5);
-        CPPUNIT_ASSERT(bScroll6);
-        CPPUNIT_ASSERT(bFirst);
-        CPPUNIT_ASSERT(!bBeforeFirst);
-        CPPUNIT_ASSERT(bLast);
-        CPPUNIT_ASSERT(!bAfterLast);
+        REQUIRE(bScroll);
+        REQUIRE(bScroll2);
+        REQUIRE(!bScroll3);
+        REQUIRE(!bScroll4);
+        REQUIRE(!bScroll5);
+        REQUIRE(bScroll6);
+        REQUIRE(bFirst);
+        REQUIRE(!bBeforeFirst);
+        REQUIRE(bLast);
+        REQUIRE(!bAfterLast);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -3582,7 +3283,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -3590,7 +3291,7 @@
     }
 }
 
-void TestFeatureService::TestCase_BenchmarkSdfJoin()
+TEST_CASE("BenchmarkSdfJoin", "[FeatureService]")
 {
     long total = 0L;
     try
@@ -3605,21 +3306,21 @@
         if (pService == 0)
         {
             throw new MgServiceNotAvailableException(L"TestFeatureService::TestCase_BenchmarkSdfJoin",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
         Ptr<MgFeatureService> featSvc = dynamic_cast<MgFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (featSvc == 0)
         {
             throw new MgServiceNotAvailableException(L"TestFeatureService::TestCase_BenchmarkSdfJoin",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
-        pService->SetResource(fsId, fsReader, NULL);
+        pService->SetResource(fsId, fsReader, nullptr);
         Ptr<MgByteSource> fsData = new MgByteSource(L"../UnitTestFiles/ParcelsJoinTest.sdf");
         Ptr<MgByteReader> fsDataReader = fsData->GetReader();
 
         pService->SetResourceData(fsId, L"ParcelsJoinTest.sdf", L"File", fsDataReader);
-        CPPUNIT_ASSERT(featSvc->TestConnection(fsId));
+        REQUIRE(featSvc->TestConnection(fsId));
 
         Ptr<MgFeatureReader> reader;
 
@@ -3627,7 +3328,7 @@
         ACE_DEBUG((LM_INFO, ACE_TEXT("\nTestFeatureService::TestCase_BenchmarkSdfJoin() - Inner Join \n")));
         
         clock_t clock_start = clock();
-        reader = featSvc->SelectFeatures(fsId, L"ParcelsInner", NULL);
+        reader = featSvc->SelectFeatures(fsId, L"ParcelsInner", nullptr);
         while(reader->ReadNext())
         {
             total++;
@@ -3639,7 +3340,7 @@
         clock_start = clock();
         total = 0L;
 
-        reader = featSvc->SelectFeatures(fsId, L"ParcelsLeftOuter", NULL);
+        reader = featSvc->SelectFeatures(fsId, L"ParcelsLeftOuter", nullptr);
         while(reader->ReadNext())
         {
             total++;
@@ -3651,7 +3352,7 @@
         clock_start = clock();
         total = 0L;
 
-        reader = featSvc->SelectFeatures(fsId, L"ParcelsInnerOneToOne", NULL);
+        reader = featSvc->SelectFeatures(fsId, L"ParcelsInnerOneToOne", nullptr);
         while(reader->ReadNext())
         {
             total++;
@@ -3663,7 +3364,7 @@
         clock_start = clock();
         total = 0L;
 
-        reader = featSvc->SelectFeatures(fsId, L"ParcelsLeftOuterOneToOne", NULL);
+        reader = featSvc->SelectFeatures(fsId, L"ParcelsLeftOuterOneToOne", nullptr);
         while(reader->ReadNext())
         {
             total++;
@@ -3674,9 +3375,9 @@
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -3683,7 +3384,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -3691,7 +3392,7 @@
     }
 }
 
-void TestFeatureService::TestCase_BenchmarkSqliteJoin()
+TEST_CASE("BenchmarkSqliteJoin", "[FeatureService]")
 {
     try
     {
@@ -3705,21 +3406,21 @@
         if (pService == 0)
         {
             throw new MgServiceNotAvailableException(L"TestFeatureService::TestCase_BenchmarkSqliteJoin",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
         Ptr<MgFeatureService> featSvc = dynamic_cast<MgFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (featSvc == 0)
         {
             throw new MgServiceNotAvailableException(L"TestFeatureService::TestCase_BenchmarkSqliteJoin",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
-        pService->SetResource(fsId, fsReader, NULL);
+        pService->SetResource(fsId, fsReader, nullptr);
         Ptr<MgByteSource> fsData = new MgByteSource(L"../UnitTestFiles/ParcelsJoinTest.sqlite");
         Ptr<MgByteReader> fsDataReader = fsData->GetReader();
 
         pService->SetResourceData(fsId, L"ParcelsJoinTest.sqlite", L"File", fsDataReader);
-        CPPUNIT_ASSERT(featSvc->TestConnection(fsId));
+        REQUIRE(featSvc->TestConnection(fsId));
 
         Ptr<MgFeatureReader> reader;
 
@@ -3728,7 +3429,7 @@
         clock_t clock_start = clock();
         long total = 0L;
 
-        reader = featSvc->SelectFeatures(fsId, L"ParcelsInner", NULL);
+        reader = featSvc->SelectFeatures(fsId, L"ParcelsInner", nullptr);
         while(reader->ReadNext())
         {
             total++;
@@ -3740,7 +3441,7 @@
         clock_start = clock();
         total = 0L;
 
-        reader = featSvc->SelectFeatures(fsId, L"ParcelsLeftOuter", NULL);
+        reader = featSvc->SelectFeatures(fsId, L"ParcelsLeftOuter", nullptr);
         while(reader->ReadNext())
         {
             total++;
@@ -3752,7 +3453,7 @@
         clock_start = clock();
         total = 0L;
 
-        reader = featSvc->SelectFeatures(fsId, L"ParcelsInnerOneToOne", NULL);
+        reader = featSvc->SelectFeatures(fsId, L"ParcelsInnerOneToOne", nullptr);
         while(reader->ReadNext())
         {
             total++;
@@ -3764,7 +3465,7 @@
         clock_start = clock();
         total = 0L;
 
-        reader = featSvc->SelectFeatures(fsId, L"ParcelsLeftOuterOneToOne", NULL);
+        reader = featSvc->SelectFeatures(fsId, L"ParcelsLeftOuterOneToOne", nullptr);
         while(reader->ReadNext())
         {
             total++;
@@ -3775,9 +3476,9 @@
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -3784,7 +3485,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -3792,7 +3493,7 @@
     }
 }
 
-void TestFeatureService::TestCase_BenchmarkSqliteAggregateJoin()
+TEST_CASE("BenchmarkSqliteAggregateJoin", "[FeatureService]")
 {
     try
     {
@@ -3801,17 +3502,17 @@
         if (pService == 0)
         {
             throw new MgServiceNotAvailableException(L"TestFeatureService::TestCase_BenchmarkSqliteAggregateJoin",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
         Ptr<MgFeatureService> featSvc = dynamic_cast<MgFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (featSvc == 0)
         {
             throw new MgServiceNotAvailableException(L"TestFeatureService::TestCase_BenchmarkSqliteAggregateJoin",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> fsId = new MgResourceIdentifier(L"Library://UnitTests/Data/ParcelsJoinTestSQLite.FeatureSource");
-        CPPUNIT_ASSERT(featSvc->TestConnection(fsId));
+        REQUIRE(featSvc->TestConnection(fsId));
         Ptr<MgDataReader> reader;
 
         // ----- Start the tests ------- //
@@ -3832,7 +3533,7 @@
             iterations++;
         }
         reader->Close();
-        CPPUNIT_ASSERT(iterations == 1);
+        REQUIRE(iterations == 1);
         clock_t clock_end = clock();
         ACE_DEBUG((LM_INFO, ACE_TEXT("  Execution Time (%d results): = %6.4f (s)\n"), total, ((double)(clock_end - clock_start) / CLOCKS_PER_SEC) ));
         ACE_DEBUG((LM_INFO, ACE_TEXT("\nTestFeatureService::TestCase_BenchmarkSqliteAggregateJoin() - Left Outer Join \n")));
@@ -3847,7 +3548,7 @@
             iterations++;
         }
         reader->Close();
-        CPPUNIT_ASSERT(iterations == 1L);
+        REQUIRE(iterations == 1L);
         clock_end = clock();
         ACE_DEBUG((LM_INFO, ACE_TEXT("  Execution Time (%d results): = %6.4f (s)\n"), total, ((double)(clock_end - clock_start) / CLOCKS_PER_SEC) ));
         ACE_DEBUG((LM_INFO, ACE_TEXT("\nTestFeatureService::TestCase_BenchmarkSqliteAggregateJoin() - Inner Join (Forced 1:1) \n")));
@@ -3862,7 +3563,7 @@
             iterations++;
         }
         reader->Close();
-        CPPUNIT_ASSERT(iterations == 1L);
+        REQUIRE(iterations == 1L);
         clock_end = clock();
         ACE_DEBUG((LM_INFO, ACE_TEXT("  Execution Time (%d results): = %6.4f (s)\n"), total, ((double)(clock_end - clock_start) / CLOCKS_PER_SEC) ));
         ACE_DEBUG((LM_INFO, ACE_TEXT("\nTestFeatureService::TestCase_BenchmarkSqliteAggregateJoin() - Left Outer Join (Forced 1:1) \n")));
@@ -3877,15 +3578,15 @@
             iterations++;
         }
         reader->Close();
-        CPPUNIT_ASSERT(iterations == 1L);
+        REQUIRE(iterations == 1L);
         clock_end = clock();
         ACE_DEBUG((LM_INFO, ACE_TEXT("  Execution Time (%d results): = %6.4f (s)\n"), total, ((double)(clock_end - clock_start) / CLOCKS_PER_SEC) ));
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -3892,7 +3593,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -3900,7 +3601,7 @@
     }
 }
 
-void TestFeatureService::TestCase_BenchmarkMergeSortJoin()
+TEST_CASE("BenchmarkMergeSortJoin", "[FeatureService]")
 {
     try
     {
@@ -3910,13 +3611,13 @@
         if (pService == 0)
         {
             throw new MgServiceNotAvailableException(L"TestFeatureService::TestCase_BenchmarkMergeSortJoin",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
         Ptr<MgdFeatureService> featSvc = dynamic_cast<MgdFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (featSvc == 0)
         {
             throw new MgServiceNotAvailableException(L"TestFeatureService::TestCase_BenchmarkMergeSortJoin",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         
@@ -3928,7 +3629,7 @@
         clock_t clock_start = clock();
         long total = 0L;
 
-        reader = featSvc->SelectFeatures(fsId, L"ParcelsInnerSortMerge", NULL);
+        reader = featSvc->SelectFeatures(fsId, L"ParcelsInnerSortMerge", nullptr);
 #ifdef DUMP_BENCHMARK_RESULTS
         Ptr<MgClassDefinition> classDefinition;
         Ptr<MgResourceIdentifier> dumpFsId;
@@ -3952,7 +3653,7 @@
         clock_start = clock();
         total = 0L;
 
-        reader = featSvc->SelectFeatures(fsId, L"ParcelsLeftOuterSortMerge", NULL);
+        reader = featSvc->SelectFeatures(fsId, L"ParcelsLeftOuterSortMerge", nullptr);
 #ifdef DUMP_BENCHMARK_RESULTS
         classDefinition = reader->GetClassDefinition();
         dumpFsId = CreateFeatureSource(featSvc, L"ParcelsLeftOuterSortMerge", classDefinition);
@@ -3972,7 +3673,7 @@
         clock_start = clock();
         total = 0L;
 
-        reader = featSvc->SelectFeatures(fsId, L"ParcelsInnerOneToOneSortMerge", NULL);
+        reader = featSvc->SelectFeatures(fsId, L"ParcelsInnerOneToOneSortMerge", nullptr);
 #ifdef DUMP_BENCHMARK_RESULTS
         classDefinition = reader->GetClassDefinition();
         dumpFsId = CreateFeatureSource(featSvc, L"ParcelsInnerOneToOneSortMerge", classDefinition);
@@ -3992,7 +3693,7 @@
         clock_start = clock();
         total = 0L;
 
-        reader = featSvc->SelectFeatures(fsId, L"ParcelsLeftOuterOneToOneSortMerge", NULL);
+        reader = featSvc->SelectFeatures(fsId, L"ParcelsLeftOuterOneToOneSortMerge", nullptr);
 #ifdef DUMP_BENCHMARK_RESULTS
         classDefinition = reader->GetClassDefinition();
         dumpFsId = CreateFeatureSource(featSvc, L"ParcelsLeftOuterOneToOneSortMerge", classDefinition);
@@ -4011,9 +3712,9 @@
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -4020,7 +3721,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -4028,7 +3729,7 @@
     }
 }
 
-void TestFeatureService::TestCase_BenchmarkBatchSortedBlockJoin()
+TEST_CASE("BenchmarkBatchSortedBlockJoin", "[FeatureService]")
 {
     try
     {
@@ -4038,13 +3739,13 @@
         if (pService == 0)
         {
             throw new MgServiceNotAvailableException(L"TestFeatureService::TestCase_BenchmarkBatchSortedBlockJoin",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
         Ptr<MgdFeatureService> featSvc = dynamic_cast<MgdFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (featSvc == 0)
         {
             throw new MgServiceNotAvailableException(L"TestFeatureService::TestCase_BenchmarkBatchSortedBlockJoin",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         
@@ -4056,7 +3757,7 @@
         clock_t clock_start = clock();
         long total = 0L;
 
-        reader = featSvc->SelectFeatures(fsId, L"ParcelsInnerBatchSortedBlock", NULL);
+        reader = featSvc->SelectFeatures(fsId, L"ParcelsInnerBatchSortedBlock", nullptr);
 #ifdef DUMP_BENCHMARK_RESULTS
         Ptr<MgClassDefinition> classDefinition;
         Ptr<MgResourceIdentifier> dumpFsId;
@@ -4080,7 +3781,7 @@
         clock_start = clock();
         total = 0L;
 
-        reader = featSvc->SelectFeatures(fsId, L"ParcelsLeftOuterBatchSortedBlock", NULL);
+        reader = featSvc->SelectFeatures(fsId, L"ParcelsLeftOuterBatchSortedBlock", nullptr);
 #ifdef DUMP_BENCHMARK_RESULTS
         classDefinition = reader->GetClassDefinition();
         dumpFsId = CreateFeatureSource(featSvc, L"ParcelsLeftOuterBatchSortedBlock", classDefinition);
@@ -4100,7 +3801,7 @@
         clock_start = clock();
         total = 0L;
 
-        reader = featSvc->SelectFeatures(fsId, L"ParcelsInnerOneToOneBatchSortedBlock", NULL);
+        reader = featSvc->SelectFeatures(fsId, L"ParcelsInnerOneToOneBatchSortedBlock", nullptr);
 #ifdef DUMP_BENCHMARK_RESULTS
         classDefinition = reader->GetClassDefinition();
         dumpFsId = CreateFeatureSource(featSvc, L"ParcelsInnerOneToOneBatchSortedBlock", classDefinition);
@@ -4120,7 +3821,7 @@
         clock_start = clock();
         total = 0L;
 
-        reader = featSvc->SelectFeatures(fsId, L"ParcelsLeftOuterOneToOneBatchSortedBlock", NULL);
+        reader = featSvc->SelectFeatures(fsId, L"ParcelsLeftOuterOneToOneBatchSortedBlock", nullptr);
 #ifdef DUMP_BENCHMARK_RESULTS
         classDefinition = reader->GetClassDefinition();
         dumpFsId = CreateFeatureSource(featSvc, L"ParcelsLeftOuterOneToOneBatchSortedBlock", classDefinition);
@@ -4139,9 +3840,9 @@
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -4148,7 +3849,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -4156,7 +3857,7 @@
     }
 }
 
-void TestFeatureService::TestCase_BenchmarkNestedLoopsSortedBlockJoin()
+TEST_CASE("BenchmarkNestedLoopSortedBlockJoin", "[FeatureService]")
 {
     try
     {
@@ -4166,13 +3867,13 @@
         if (pService == 0)
         {
             throw new MgServiceNotAvailableException(L"TestFeatureService::TestCase_BenchmarkNestedLoopsSortedBlockJoin",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
         Ptr<MgdFeatureService> featSvc = dynamic_cast<MgdFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (featSvc == 0)
         {
             throw new MgServiceNotAvailableException(L"TestFeatureService::TestCase_BenchmarkNestedLoopsSortedBlockJoin",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         
@@ -4184,7 +3885,7 @@
         clock_t clock_start = clock();
         long total = 0L;
 
-        reader = featSvc->SelectFeatures(fsId, L"ParcelsInnerNestedLoopSortedBlock", NULL);
+        reader = featSvc->SelectFeatures(fsId, L"ParcelsInnerNestedLoopSortedBlock", nullptr);
 #ifdef DUMP_BENCHMARK_RESULTS
         Ptr<MgClassDefinition> classDefinition;
         Ptr<MgResourceIdentifier> dumpFsId;
@@ -4208,7 +3909,7 @@
         clock_start = clock();
         total = 0L;
 
-        reader = featSvc->SelectFeatures(fsId, L"ParcelsLeftOuterNestedLoopSortedBlock", NULL);
+        reader = featSvc->SelectFeatures(fsId, L"ParcelsLeftOuterNestedLoopSortedBlock", nullptr);
 #ifdef DUMP_BENCHMARK_RESULTS
         classDefinition = reader->GetClassDefinition();
         dumpFsId = CreateFeatureSource(featSvc, L"ParcelsLeftOuterNestedLoopSortedBlock", classDefinition);
@@ -4228,7 +3929,7 @@
         clock_start = clock();
         total = 0L;
 
-        reader = featSvc->SelectFeatures(fsId, L"ParcelsInnerOneToOneNestedLoopSortedBlock", NULL);
+        reader = featSvc->SelectFeatures(fsId, L"ParcelsInnerOneToOneNestedLoopSortedBlock", nullptr);
 #ifdef DUMP_BENCHMARK_RESULTS
         classDefinition = reader->GetClassDefinition();
         dumpFsId = CreateFeatureSource(featSvc, L"ParcelsInnerOneToOneNestedLoopSortedBlock", classDefinition);
@@ -4248,7 +3949,7 @@
         clock_start = clock();
         total = 0L;
 
-        reader = featSvc->SelectFeatures(fsId, L"ParcelsLeftOuterOneToOneNestedLoopSortedBlock", NULL);
+        reader = featSvc->SelectFeatures(fsId, L"ParcelsLeftOuterOneToOneNestedLoopSortedBlock", nullptr);
 #ifdef DUMP_BENCHMARK_RESULTS
         classDefinition = reader->GetClassDefinition();
         dumpFsId = CreateFeatureSource(featSvc, L"ParcelsLeftOuterOneToOneNestedLoopSortedBlock", classDefinition);
@@ -4267,9 +3968,9 @@
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -4276,7 +3977,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -4284,7 +3985,7 @@
     }
 }
 
-MgResourceIdentifier* TestFeatureService::CreateFeatureSource(MgFeatureService* featSvc, CREFSTRING name, MgClassDefinition* classDefinition)
+static MgResourceIdentifier* CreateFeatureSource(MgFeatureService* featSvc, CREFSTRING name, MgClassDefinition* classDefinition)
 {
     STRING fsIdStr = L"Library://UnitTests/Data/";
     fsIdStr += name;
@@ -4338,7 +4039,7 @@
     return fsId.Detach();
 }
 
-MgPropertyCollection* TestFeatureService::Prepare(MgClassDefinition* cls)
+static MgPropertyCollection* Prepare(MgClassDefinition* cls)
 {
     Ptr<MgPropertyCollection> propVals = new MgPropertyCollection();
     Ptr<MgPropertyDefinitionCollection> clsProps = cls->GetProperties();
@@ -4348,7 +4049,7 @@
         STRING name = clsProp->GetName();
         if (clsProp->GetPropertyType() == MgFeaturePropertyType::GeometricProperty)
         {
-            Ptr<MgGeometryProperty> geomVal = new MgGeometryProperty(name, NULL);
+            Ptr<MgGeometryProperty> geomVal = new MgGeometryProperty(name, nullptr);
             geomVal->SetNull(true);
             propVals->Add(geomVal);
         }
@@ -4360,7 +4061,7 @@
             switch(dataProp->GetDataType())
             {
             case MgPropertyType::Blob:
-                dataVal = new MgBlobProperty(name, NULL);
+                dataVal = new MgBlobProperty(name, nullptr);
                 break;
             case MgPropertyType::Boolean:
                 dataVal = new MgBooleanProperty(name, false);
@@ -4369,10 +4070,10 @@
                 dataVal = new MgByteProperty(name, 0);
                 break;
             case MgPropertyType::Clob:
-                dataVal = new MgClobProperty(name, NULL);
+                dataVal = new MgClobProperty(name, nullptr);
                 break;
             case MgPropertyType::DateTime:
-                dataVal = new MgDateTimeProperty(name, NULL);
+                dataVal = new MgDateTimeProperty(name, nullptr);
                 break;
             case MgPropertyType::Decimal:
             case MgPropertyType::Double:
@@ -4401,7 +4102,7 @@
     return propVals.Detach();
 }
 
-void TestFeatureService::Insert(MgdFeatureService* featSvc, MgReader* reader, MgResourceIdentifier* fsId, CREFSTRING className, MgPropertyCollection* propVals)
+static void Insert(MgdFeatureService* featSvc, MgReader* reader, MgResourceIdentifier* fsId, CREFSTRING className, MgPropertyCollection* propVals)
 {
     for (INT32 i = 0; i < propVals->GetCount(); i++)
     {
@@ -4507,7 +4208,7 @@
         else 
         {
             MgNullableProperty* nprop = dynamic_cast<MgNullableProperty*>(prop.p);
-            if (NULL != nprop)
+            if (nullptr != nprop)
                 nprop->SetNull(true);
         }
     }
@@ -4515,7 +4216,7 @@
     fr->Close();
 }
 
-void TestFeatureService::TestCase_BenchmarkNestedLoopsJoin()
+TEST_CASE("BenchmarkNestedLoopsJoin", "[FeatureService]")
 {
     try
     {
@@ -4525,13 +4226,13 @@
         if (pService == 0)
         {
             throw new MgServiceNotAvailableException(L"TestFeatureService::TestCase_BenchmarkNestedLoopsJoin",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
         Ptr<MgdFeatureService> featSvc = dynamic_cast<MgdFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (featSvc == 0)
         {
             throw new MgServiceNotAvailableException(L"TestFeatureService::TestCase_BenchmarkNestedLoopsJoin",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         
@@ -4543,7 +4244,7 @@
         clock_t clock_start = clock();
         long total = 0L;
 
-        reader = featSvc->SelectFeatures(fsId, L"ParcelsInnerNestedLoops", NULL);
+        reader = featSvc->SelectFeatures(fsId, L"ParcelsInnerNestedLoops", nullptr);
 
 #ifdef DUMP_BENCHMARK_RESULTS
         Ptr<MgClassDefinition> classDefinition;
@@ -4568,7 +4269,7 @@
         clock_start = clock();
         total = 0L;
 
-        reader = featSvc->SelectFeatures(fsId, L"ParcelsLeftOuterNestedLoops", NULL);
+        reader = featSvc->SelectFeatures(fsId, L"ParcelsLeftOuterNestedLoops", nullptr);
 #ifdef DUMP_BENCHMARK_RESULTS
         classDefinition = reader->GetClassDefinition();
         dumpFsId = CreateFeatureSource(featSvc, L"ParcelsLeftOuterNestedLoops", classDefinition);
@@ -4588,7 +4289,7 @@
         clock_start = clock();
         total = 0L;
 
-        reader = featSvc->SelectFeatures(fsId, L"ParcelsInnerOneToOneNestedLoops", NULL);
+        reader = featSvc->SelectFeatures(fsId, L"ParcelsInnerOneToOneNestedLoops", nullptr);
 #ifdef DUMP_BENCHMARK_RESULTS
         classDefinition = reader->GetClassDefinition();
         dumpFsId = CreateFeatureSource(featSvc, L"ParcelsInnerOneToOneNestedLoops", classDefinition);
@@ -4608,7 +4309,7 @@
         clock_start = clock();
         total = 0L;
 
-        reader = featSvc->SelectFeatures(fsId, L"ParcelsLeftOuterOneToOneNestedLoops", NULL);
+        reader = featSvc->SelectFeatures(fsId, L"ParcelsLeftOuterOneToOneNestedLoops", nullptr);
 #ifdef DUMP_BENCHMARK_RESULTS
         classDefinition = reader->GetClassDefinition();
         dumpFsId = CreateFeatureSource(featSvc, L"ParcelsLeftOuterOneToOneNestedLoops", classDefinition);
@@ -4627,9 +4328,9 @@
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -4636,7 +4337,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -4650,7 +4351,7 @@
 /// This test case tests the correct response for a non-transactional failure
 /// in UpdateFeatures
 ///----------------------------------------------------------------------------
-void TestFeatureService::TestCase_UpdateFeaturesPartialFailure()
+TEST_CASE("UpdateFeaturesPartialFailure", "[FeatureService]")
 {
     try
     {
@@ -4657,7 +4358,7 @@
         Ptr<MgdServiceFactory> fact = new MgdServiceFactory();
         if (fact == 0)
         {
-            throw new MgNullReferenceException(L"TestFeatureService.TestCase_UpdateFeaturesPartialFailure", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgNullReferenceException(L"TestFeatureService.TestCase_UpdateFeaturesPartialFailure", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgFeatureService> featSvc = dynamic_cast<MgFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
@@ -4664,7 +4365,7 @@
         if (featSvc == 0)
         {
             throw new MgServiceNotAvailableException(L"TestFeatureService.TestCase_UpdateFeaturesPartialFailure",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> fsId = new MgResourceIdentifier(L"Library://UnitTests/Data/Sheboygan_Parcels.FeatureSource");
@@ -4676,7 +4377,7 @@
         cmds->Add(insert);
 
         Ptr<MgPropertyCollection> result = featSvc->UpdateFeatures(fsId, cmds, false);
-        CPPUNIT_ASSERT(result->GetCount() > 0);
+        REQUIRE(result->GetCount() > 0);
 
         bool bPartialFailure = false;
         for (INT32 i = 0; i < result->GetCount(); i++)
@@ -4689,13 +4390,13 @@
             }
         }
 
-        CPPUNIT_ASSERT(bPartialFailure);
+        REQUIRE(bPartialFailure);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -4702,7 +4403,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {

Deleted: sandbox/jng/catch2/Desktop/UnitTest/TestFeatureService.h
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/TestFeatureService.h	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/UnitTest/TestFeatureService.h	2020-07-15 16:00:34 UTC (rev 9675)
@@ -1,148 +0,0 @@
-//
-//  Copyright (C) 2004-2010 by Autodesk, Inc.
-//
-//  This library is free software; you can redistribute it and/or
-//  modify it under the terms of version 2.1 of the GNU Lesser
-//  General Public License as published by the Free Software Foundation.
-//
-//  This library 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
-//  Lesser General Public License for more details.
-//
-//  You should have received a copy of the GNU Lesser General Public
-//  License along with this library; if not, write to the Free Software
-//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-//
-
-#ifndef _TESTFEATURESERVICE_H
-#define _TESTFEATURESERVICE_H
-
-#include <cppunit/extensions/HelperMacros.h>
-
-class TestFeatureService : public CppUnit::TestFixture
-{
-    CPPUNIT_TEST_SUITE(TestFeatureService);
-    CPPUNIT_TEST(TestStart); // This must be the very first unit test
-
-    CPPUNIT_TEST(TestCase_GetFeatureProviders);
-    CPPUNIT_TEST(TestCase_TestConnectionSDFProvider);
-    //CPPUNIT_TEST(TestCase_TestFdoConnectionManager);
-    CPPUNIT_TEST(TestCase_GetConnectionPropertyValues);
-    CPPUNIT_TEST(TestCase_GetCapabilities);
-    CPPUNIT_TEST(TestCase_TestConnectionResourceIdentifier);
-    CPPUNIT_TEST(TestCase_GetSchemas);
-    CPPUNIT_TEST(TestCase_GetClasses);
-    CPPUNIT_TEST(TestCase_GetClassDefinition);
-    CPPUNIT_TEST(TestCase_GetClassDefinitionImmutability);
-    CPPUNIT_TEST(TestCase_DescribeSchema);
-    CPPUNIT_TEST(TestCase_DescribeSchemaImmutability);
-    CPPUNIT_TEST(TestCase_ApplySchema);
-    CPPUNIT_TEST(TestCase_CreateFeatureSource);
-    CPPUNIT_TEST(TestCase_SelectFeatures);
-    CPPUNIT_TEST(TestCase_SelectFeaturesTransformed);
-    CPPUNIT_TEST(TestCase_SelectScrollable);
-    CPPUNIT_TEST(TestCase_SelectAggregate);
-    CPPUNIT_TEST(TestCase_ExtendedFeatureClass);
-    CPPUNIT_TEST(TestCase_InsertFeatures);
-    CPPUNIT_TEST(TestCase_InsertFeaturesBatch);
-    CPPUNIT_TEST(TestCase_UpdateFeatures);
-    CPPUNIT_TEST(TestCase_UpdateFeaturesInsert);
-    CPPUNIT_TEST(TestCase_UpdateFeaturesPartialFailure);
-    CPPUNIT_TEST(TestCase_DeleteFeatures);
-//  TODO write test case when know how to make command collection
-    CPPUNIT_TEST(TestCase_ExecuteSqlQuery);
-    CPPUNIT_TEST(TestCase_ExecuteSqlNonQuery);
-    CPPUNIT_TEST(TestCase_GetSpatialContexts);
-    CPPUNIT_TEST(TestCase_GetLongTransactions);
-    CPPUNIT_TEST(TestCase_SetLongTransaction);
-    CPPUNIT_TEST(TestCase_JoinFeatures);
-    //Our sortability check has broken this for some reason
-    CPPUNIT_TEST(TestCase_JoinFeaturesChainedInner1ToMany);
-    CPPUNIT_TEST(TestCase_JoinFdoFeatures);
-    CPPUNIT_TEST(TestCase_BenchmarkSelectFeatures);
-    //CPPUNIT_TEST(TestCase_ConcurrentAccess);
-
-    //CPPUNIT_TEST(TestCase_SecuredCredentials);
-    CPPUNIT_TEST(TestCase_LayerInsertFeatures);
-    CPPUNIT_TEST(TestCase_LayerUpdateFeatures);
-    CPPUNIT_TEST(TestCase_LayerDeleteFeatures);
-    CPPUNIT_TEST(TestCase_LayerSelectScrollable);
-
-    CPPUNIT_TEST(TestCase_BenchmarkSqliteJoin);
-    CPPUNIT_TEST(TestCase_BenchmarkSqliteAggregateJoin);
-    CPPUNIT_TEST(TestCase_BenchmarkSdfJoin);
-    CPPUNIT_TEST(TestCase_BenchmarkMergeSortJoin);
-    CPPUNIT_TEST(TestCase_BenchmarkBatchSortedBlockJoin);
-    CPPUNIT_TEST(TestCase_BenchmarkNestedLoopsSortedBlockJoin);
-    CPPUNIT_TEST(TestCase_BenchmarkNestedLoopsJoin);
-
-    CPPUNIT_TEST(TestEnd); // This must be the very last unit test
-    CPPUNIT_TEST_SUITE_END();
-
-public:
-    void setUp();
-    void tearDown();
-    void TestStart();
-    void TestEnd();
-
-    void TestCase_GetFeatureProviders();
-    void TestCase_TestConnectionSDFProvider();
-    //void TestCase_TestFdoConnectionManager();
-    void TestCase_GetConnectionPropertyValues();
-    void TestCase_GetCapabilities();
-    void TestCase_TestConnectionProviderConnectionString();
-    void TestCase_TestConnectionResourceIdentifier();
-    void TestCase_GetSchemas();
-    void TestCase_GetClasses();
-    void TestCase_GetClassDefinition();
-    void TestCase_GetClassDefinitionImmutability();
-    void TestCase_DescribeSchema();
-    void TestCase_DescribeSchemaImmutability();
-    void TestCase_ApplySchema();
-    void TestCase_SelectFeatures();
-    void TestCase_SelectFeaturesTransformed();
-    void TestCase_SelectScrollable();
-    void TestCase_SelectAggregate();
-    void TestCase_UpdateFeaturesInsert();
-    void TestCase_UpdateFeaturesPartialFailure();
-    void TestCase_InsertFeatures();
-    void TestCase_InsertFeaturesBatch();
-    void TestCase_UpdateFeatures();
-    void TestCase_DeleteFeatures();
-    void TestCase_ExecuteSqlQuery();
-    void TestCase_ExecuteSqlNonQuery();
-    void TestCase_ExtendedFeatureClass();
-    void TestCase_GetSpatialContexts();
-    void TestCase_GetLongTransactions();
-    void TestCase_SetLongTransaction();
-    void TestCase_JoinFeatures();
-    void TestCase_JoinFeaturesChainedInner1ToMany();
-    void TestCase_JoinFdoFeatures();
-    void TestCase_CreateFeatureSource();
-    void TestCase_BenchmarkSelectFeatures();
-    //void TestCase_ConcurrentAccess();
-
-    void TestCase_BenchmarkSdfJoin();
-    void TestCase_BenchmarkSqliteJoin();
-    void TestCase_BenchmarkSqliteAggregateJoin();
-    void TestCase_BenchmarkMergeSortJoin();
-    void TestCase_BenchmarkBatchSortedBlockJoin();
-    void TestCase_BenchmarkNestedLoopsSortedBlockJoin();
-    void TestCase_BenchmarkNestedLoopsJoin();
-
-    void TestCase_SecuredCredentials();
-    void TestCase_LayerInsertFeatures();
-    void TestCase_LayerUpdateFeatures();
-    void TestCase_LayerDeleteFeatures();
-    void TestCase_LayerSelectScrollable();
-
-private:
-    MgdMap* CreateTestMap();
-    static MgResourceIdentifier* CreateFeatureSource(MgFeatureService* featSvc, CREFSTRING name, MgClassDefinition* classDefinition);
-    static MgPropertyCollection* Prepare(MgClassDefinition* clsDef);
-    static void Insert(MgdFeatureService* featSvc, MgReader* reader, MgResourceIdentifier* fsId, CREFSTRING className, MgPropertyCollection* propVals);
-    static bool m_bDumpJoinBenchmarkResults;
-};
-
-#endif // _TESTFEATURESERVICE_H

Modified: sandbox/jng/catch2/Desktop/UnitTest/TestKmlService.cpp
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/TestKmlService.cpp	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/UnitTest/TestKmlService.cpp	2020-07-15 16:00:34 UTC (rev 9675)
@@ -34,20 +34,20 @@
 
     m_svcResource = dynamic_cast<MgResourceService*>(
         serviceManager->RequestService(MgServiceType::ResourceService));
-    assert(m_svcResource != NULL);
+    assert(m_svcResource != nullptr);
 
     m_svcKml = dynamic_cast<MgKmlService*>(
         serviceManager->RequestService(MgServiceType::KmlService));
-    assert(m_svcKml != NULL);
+    assert(m_svcKml != nullptr);
 
     // Initialize a site connection.
     Ptr<MgServerSiteService> svcSite = dynamic_cast<MgServerSiteService*>(
         serviceManager->RequestService(MgServiceType::SiteService));
-    assert(svcSite != NULL);
+    assert(svcSite != nullptr);
 
     Ptr<MgUserInformation> userInfo = new MgUserInformation(
         L"Administrator", L"admin");
-    userInfo->SetLocale(TEST_LOCALE);
+    userInfo->SetLocale(TestServiceFactory::TEST_LOCALE);
 
     // Set the current MgUserInformation
     // This must be done before calling CreateSession()
@@ -96,7 +96,7 @@
 
         //set user info
         Ptr<MgUserInformation> userInfo = new MgUserInformation(L"Administrator", L"admin");
-        userInfo->SetLocale(TEST_LOCALE);
+        userInfo->SetLocale(TestServiceFactory::TEST_LOCALE);
         MgUserInformation::SetCurrentUserInfo(userInfo);
 
         //publish the map definition
@@ -103,39 +103,39 @@
         Ptr<MgResourceIdentifier> mapres = new MgResourceIdentifier(L"Library://UnitTests/Maps/Sheboygan.MapDefinition");
         Ptr<MgByteSource> mdfsrc = new MgByteSource(L"../UnitTestFiles/UT_Sheboygan.mdf", false);
         Ptr<MgByteReader> mdfrdr = mdfsrc->GetReader();
-        m_svcResource->SetResource(mapres, mdfrdr, NULL);
+        m_svcResource->SetResource(mapres, mdfrdr, nullptr);
 
         //publish the layer definitions
         Ptr<MgResourceIdentifier> ldfres1 = new MgResourceIdentifier(L"Library://UnitTests/Layers/HydrographicPolygons.LayerDefinition");
         Ptr<MgByteSource> ldfsrc1 = new MgByteSource(L"../UnitTestFiles/UT_HydrographicPolygons.ldf", false);
         Ptr<MgByteReader> ldfrdr1 = ldfsrc1->GetReader();
-        m_svcResource->SetResource(ldfres1, ldfrdr1, NULL);
+        m_svcResource->SetResource(ldfres1, ldfrdr1, nullptr);
 
         Ptr<MgResourceIdentifier> ldfres2 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Parcels.LayerDefinition");
         Ptr<MgByteSource> ldfsrc2 = new MgByteSource(L"../UnitTestFiles/UT_Parcels.ldf", false);
         Ptr<MgByteReader> ldfrdr2 = ldfsrc2->GetReader();
-        m_svcResource->SetResource(ldfres2, ldfrdr2, NULL);
+        m_svcResource->SetResource(ldfres2, ldfrdr2, nullptr);
 
         Ptr<MgResourceIdentifier> ldfres3 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Rail.LayerDefinition");
         Ptr<MgByteSource> ldfsrc3 = new MgByteSource(L"../UnitTestFiles/UT_Rail.ldf", false);
         Ptr<MgByteReader> ldfrdr3 = ldfsrc3->GetReader();
-        m_svcResource->SetResource(ldfres3, ldfrdr3, NULL);
+        m_svcResource->SetResource(ldfres3, ldfrdr3, nullptr);
 
         //publish the feature sources
         Ptr<MgResourceIdentifier> fsres1 = new MgResourceIdentifier(L"Library://UnitTests/Data/HydrographicPolygons.FeatureSource");
         Ptr<MgByteSource> fssrc1 = new MgByteSource(L"../UnitTestFiles/UT_HydrographicPolygons.fs", false);
         Ptr<MgByteReader> fsrdr1 = fssrc1->GetReader();
-        m_svcResource->SetResource(fsres1, fsrdr1, NULL);
+        m_svcResource->SetResource(fsres1, fsrdr1, nullptr);
 
         Ptr<MgResourceIdentifier> fsres2 = new MgResourceIdentifier(L"Library://UnitTests/Data/Parcels.FeatureSource");
         Ptr<MgByteSource> fssrc2 = new MgByteSource(L"../UnitTestFiles/UT_Parcels.fs", false);
         Ptr<MgByteReader> fsrdr2 = fssrc2->GetReader();
-        m_svcResource->SetResource(fsres2, fsrdr2, NULL);
+        m_svcResource->SetResource(fsres2, fsrdr2, nullptr);
 
         Ptr<MgResourceIdentifier> fsres3 = new MgResourceIdentifier(L"Library://UnitTests/Data/Rail.FeatureSource");
         Ptr<MgByteSource> fssrc3 = new MgByteSource(L"../UnitTestFiles/UT_Rail.fs", false);
         Ptr<MgByteReader> fsrdr3 = fssrc3->GetReader();
-        m_svcResource->SetResource(fsres3, fsrdr3, NULL);
+        m_svcResource->SetResource(fsres3, fsrdr3, nullptr);
 
         // publish the resource data
         Ptr<MgByteSource> dataSource1 = new MgByteSource(L"../UnitTestFiles/UT_HydrographicPolygons.sdf", false);
@@ -152,9 +152,9 @@
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -169,7 +169,7 @@
     {
         //set user info
         Ptr<MgUserInformation> userInfo = new MgUserInformation(L"Administrator", L"admin");
-        userInfo->SetLocale(TEST_LOCALE);
+        userInfo->SetLocale(TestServiceFactory::TEST_LOCALE);
         MgUserInformation::SetCurrentUserInfo(userInfo);
 
         //delete the map definition
@@ -206,9 +206,9 @@
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -239,7 +239,7 @@
             Ptr<MgByteReader> reader = m_svcKml->GetMapKml(map, dpi, agentUri, format);
 
             STRING mimeType = reader->GetMimeType();
-            CPPUNIT_ASSERT(mimeType.compare(MgMimeType::Kml) == 0);
+            REQUIRE(mimeType.compare(MgMimeType::Kml) == 0);
         }
         catch(MgConnectionFailedException* e)
         {
@@ -255,13 +255,13 @@
 
         //compare results against referenced content
         //TODO: Find a way to make the comparison work on Windows AND Linux
-        //CPPUNIT_ASSERT(CompareContent(reader, L"../UnitTestFiles/UT_GetMapKMLResult.txt"));
+        //REQUIRE(CompareContent(reader, L"../UnitTestFiles/UT_GetMapKMLResult.txt"));
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -290,7 +290,7 @@
             Ptr<MgByteReader> reader = m_svcKml->GetMapKml(map, dpi, agentUri, format);
 
             STRING mimeType = reader->GetMimeType();
-            CPPUNIT_ASSERT(mimeType.compare(MgMimeType::Kmz) == 0);
+            REQUIRE(mimeType.compare(MgMimeType::Kmz) == 0);
         }
         catch(MgConnectionFailedException* e)
         {
@@ -306,9 +306,9 @@
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -340,7 +340,7 @@
             Ptr<MgByteReader> reader = m_svcKml->GetLayerKml(layer, extents, width, height, dpi, drawOrder, agentUri, format);
 
             STRING mimeType = reader->GetMimeType();
-            CPPUNIT_ASSERT(mimeType.compare(MgMimeType::Kml) == 0);
+            REQUIRE(mimeType.compare(MgMimeType::Kml) == 0);
         }
         catch(MgConnectionFailedException* e)
         {
@@ -356,13 +356,13 @@
 
         //compare results against referenced content
         //TODO: Find a way to make the comparison work on Windows AND Linux
-        //CPPUNIT_ASSERT(CompareContent(reader, L"../UnitTestFiles/UT_GetLayerKMLResult.txt"));
+        //REQUIRE(CompareContent(reader, L"../UnitTestFiles/UT_GetLayerKMLResult.txt"));
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -391,18 +391,18 @@
         Ptr<MgByteReader> reader = m_svcKml->GetFeaturesKml(layer, extents, width, height, dpi, drawOrder, format);
 
         STRING mimeType = reader->GetMimeType();
-        CPPUNIT_ASSERT(mimeType.compare(MgMimeType::Kml) == 0);
+        REQUIRE(mimeType.compare(MgMimeType::Kml) == 0);
 
         //compare results against referenced content
         //TODO: Find a way to make the comparison work on Windows AND Linux
         //TODO: Find a way to allow tolerance in floating point value comparisons
-        //CPPUNIT_ASSERT(CompareContent(reader, L"../UnitTestFiles/UT_GetFeaturesKMLResult.txt"));
+        //REQUIRE(CompareContent(reader, L"../UnitTestFiles/UT_GetFeaturesKMLResult.txt"));
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -417,7 +417,7 @@
 
     STRING sessionId;
     Ptr<MgUserInformation> userInfo = MgUserInformation::GetCurrentUserInfo();
-    if (userInfo != NULL)
+    if (userInfo != nullptr)
     {
         sessionId = userInfo->GetMgSessionId();
     }
@@ -443,7 +443,7 @@
 void TestKmlService::SaveToFile(CREFSTRING content, CREFSTRING filename)
 {
     FILE* file = ACE_OS::fopen(MG_WCHAR_TO_TCHAR(filename), ACE_TEXT("wt"));
-    if (file != NULL)
+    if (file != nullptr)
     {
         fwprintf (file, content.c_str());
         fclose (file);
@@ -455,10 +455,10 @@
 {
     STRING content;
     FILE* file = ACE_OS::fopen(MG_WCHAR_TO_TCHAR(filename), ACE_TEXT("rt"));
-    if (file != NULL)
+    if (file != nullptr)
     {
         wchar_t buffer[1024];
-        while(fgetws(buffer, 1024, file) != NULL)
+        while(fgetws(buffer, 1024, file) != nullptr)
         {
             content.append(buffer);
         }

Deleted: sandbox/jng/catch2/Desktop/UnitTest/TestKmlService.h
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/TestKmlService.h	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/UnitTest/TestKmlService.h	2020-07-15 16:00:34 UTC (rev 9675)
@@ -1,62 +0,0 @@
-//
-//  Copyright (C) 2007-2010 by Autodesk, Inc.
-//
-//  This library is free software; you can redistribute it and/or
-//  modify it under the terms of version 2.1 of the GNU Lesser
-//  General Public License as published by the Free Software Foundation.
-//
-//  This library 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
-//  Lesser General Public License for more details.
-//
-//  You should have received a copy of the GNU Lesser General Public
-//  License along with this library; if not, write to the Free Software
-//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-//
-
-#ifndef TestKmlService_H_
-#define TestKmlService_H_
-
-#include <cppunit/extensions/HelperMacros.h>
-
-class TestKmlService : public CppUnit::TestFixture
-{
-    CPPUNIT_TEST_SUITE(TestKmlService);
-    CPPUNIT_TEST(TestStart); // This must be the very first unit test
-
-    CPPUNIT_TEST(TestCase_GetMapKml);
-    CPPUNIT_TEST(TestCase_GetMapKmz);
-    CPPUNIT_TEST(TestCase_GetLayerKml);
-    CPPUNIT_TEST(TestCase_GetFeaturesKml);
-
-    CPPUNIT_TEST(TestEnd); // This must be the very last unit test
-    CPPUNIT_TEST_SUITE_END();
-
-public:
-    TestKmlService();
-    ~TestKmlService();
-
-    void setUp();
-    void tearDown();
-    void TestStart();
-    void TestEnd();
-
-    void TestCase_GetMapKml();
-    void TestCase_GetMapKmz();
-    void TestCase_GetLayerKml();
-    void TestCase_GetFeaturesKml();
-
-private:
-    void PublishTheResources();
-    STRING RemoveSessionIds(CREFSTRING content);
-    void SaveToFile(CREFSTRING content, CREFSTRING filename);
-    STRING LoadFromFile(CREFSTRING filename);
-    bool CompareContent(MgByteReader* reader, CREFSTRING referenceFile);
-
-    Ptr<MgSiteConnection> m_siteConnection;
-    Ptr<MgResourceService> m_svcResource;
-    Ptr<MgKmlService> m_svcKml;
-};
-
-#endif // TestKmlService_H_

Modified: sandbox/jng/catch2/Desktop/UnitTest/TestLogManager.cpp
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/TestLogManager.cpp	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/UnitTest/TestLogManager.cpp	2020-07-15 16:00:34 UTC (rev 9675)
@@ -16,13 +16,14 @@
 //
 
 #include "MgDesktop.h"
-#include "TestLogManager.h"
-#include "CppUnitExtensions.h"
 #include "Log/LogManager.h"
 #include "TestLogManagerThread.h"
 #include "FoundationDefs.h"
-CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(TestLogManager, "TestLogManager");
 
+#include "CatchHelperMacros.h"
+#include "TestServiceFactory.h"
+#include "catch.hpp"
+
 const wchar_t TestName[] = L"TestName.log";
 const wchar_t TestName2[] = L"TestName2.log";
 const wchar_t NewTestName[] = L"SuperCoolNewTestName.log";
@@ -50,27 +51,9 @@
 const STRING LastEntry = L"<2005-03-08T00:57:08> Entry 5\n";
 #endif
 
-void TestLogManager::setUp()
+static bool CreateFile(STRING filename, STRING contents)
 {
-}
-
-void TestLogManager::tearDown()
-{
-}
-
-void TestLogManager::TestStart()
-{
-    ACE_DEBUG((LM_INFO, ACE_TEXT("\nRunning Log Manager tests.\n")));
-}
-
-void TestLogManager::TestEnd()
-{
-    ACE_DEBUG((LM_INFO, ACE_TEXT("\nLog Manager tests completed.\n\n")));
-}
-
-bool TestLogManager::CreateFile(STRING filename, STRING contents)
-{
-    FILE* file = NULL;
+    FILE* file = nullptr;
     file = ::fopen(MG_WCHAR_TO_CHAR(filename), "wb");
 
     if (file)
@@ -91,13 +74,13 @@
 /// This test case checks to see if there is a valid MgdLogManager and that
 /// there is only 1 MgdLogManager.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_ValidLogManager()
+TEST_CASE("ValidLogManager", "[LogManager]")
 {
     MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
-    CPPUNIT_ASSERT(pMgdLogManager != NULL);
+    REQUIRE(pMgdLogManager != nullptr);
 
     MgdLogManager* pMgdLogManager2 = MgdLogManager::GetInstance();
-    CPPUNIT_ASSERT(pMgdLogManager == pMgdLogManager2);
+    REQUIRE(pMgdLogManager == pMgdLogManager2);
 }
 
 ///----------------------------------------------------------------------------
@@ -105,12 +88,12 @@
 ///
 /// This test case checks the logs path.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_GetLogsPath()
+TEST_CASE("GetLogsPath", "[LogManager]")
 {
     MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
     CREFSTRING path = pMgdLogManager->GetLogsPath();
 
-    CPPUNIT_ASSERT(path.length() > 0);
+    REQUIRE(path.length() > 0);
 }
 
 ///----------------------------------------------------------------------------
@@ -119,7 +102,7 @@
 /// This test case hits the log manager with multiple threads to ensure that
 /// it encounters no deadlocking.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_TestForDeadLock()
+TEST_CASE("TestForDeadLock", "[LogManager]")
 {
     try
     {
@@ -129,9 +112,9 @@
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -145,7 +128,7 @@
 /// This test case enumerates the log files that are currently located in the
 /// logs directory
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_EnumerateLogs()
+TEST_CASE("EnumerateLogs", "[LogManager]")
 {
     try
     {
@@ -166,16 +149,16 @@
         Ptr<MgStringProperty> testName2Prop = new MgStringProperty(L"LogNameProperty", TestName2);
         Ptr<MgStringProperty> junkName2Prop = new MgStringProperty(L"LogNameProperty", JunkName2);
 
-        CPPUNIT_ASSERT(logs->Contains(junkNameProp));
-        CPPUNIT_ASSERT(logs->Contains(testNameProp));
-        CPPUNIT_ASSERT(logs->Contains(junkName2Prop));
-        CPPUNIT_ASSERT(logs->Contains(testName2Prop));
+        REQUIRE(logs->Contains(junkNameProp));
+        REQUIRE(logs->Contains(testNameProp));
+        REQUIRE(logs->Contains(junkName2Prop));
+        REQUIRE(logs->Contains(testName2Prop));
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -189,7 +172,7 @@
 /// This test case deletes log files that were created during the running
 /// of the log manager tests
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_DeleteLog()
+TEST_CASE("DeleteLog", "[LogManager]")
 {
     try
     {
@@ -203,17 +186,17 @@
 
         Ptr<MgPropertyCollection> logs = pMgdLogManager->EnumerateLogs();
 
-        CPPUNIT_ASSERT(!logs->Contains(TestName));
-        CPPUNIT_ASSERT(!logs->Contains(NewTestName));
-        CPPUNIT_ASSERT(!logs->Contains(JunkName));
-        CPPUNIT_ASSERT(!logs->Contains(TestName2));
-        CPPUNIT_ASSERT(!logs->Contains(JunkName2));
+        REQUIRE(!logs->Contains(TestName));
+        REQUIRE(!logs->Contains(NewTestName));
+        REQUIRE(!logs->Contains(JunkName));
+        REQUIRE(!logs->Contains(TestName2));
+        REQUIRE(!logs->Contains(JunkName2));
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -226,7 +209,7 @@
 /// This test case creates a file in the logs folder and then uses the api
 /// to rename it.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_RenameLog()
+TEST_CASE("RenameLog", "[LogManager]")
 {
     try
     {
@@ -242,21 +225,21 @@
         Ptr<MgPropertyCollection> logs = pMgdLogManager->EnumerateLogs();
 
         Ptr<MgStringProperty> newTestNameProp = new MgStringProperty(L"LogNameProperty", NewTestName);
-        CPPUNIT_ASSERT(logs->Contains(newTestNameProp));
+        REQUIRE(logs->Contains(newTestNameProp));
 
-        CPPUNIT_ASSERT_THROW_MG(pMgdLogManager->RenameLog(L"", NewTestName), MgNullArgumentException*);
-        CPPUNIT_ASSERT_THROW_MG(pMgdLogManager->RenameLog(NewTestName, L""), MgNullArgumentException*);
-        CPPUNIT_ASSERT_THROW_MG(pMgdLogManager->RenameLog(TestName, TestName), MgDuplicateFileException*);
-        CPPUNIT_ASSERT_THROW_MG(pMgdLogManager->RenameLog(L"DoesNotExist.log", L"NewDoesNotExist.log"), MgFileNotFoundException*);
+        REQUIRE_THROWS_MG(pMgdLogManager->RenameLog(L"", NewTestName), MgNullArgumentException*);
+        REQUIRE_THROWS_MG(pMgdLogManager->RenameLog(NewTestName, L""), MgNullArgumentException*);
+        REQUIRE_THROWS_MG(pMgdLogManager->RenameLog(TestName, TestName), MgDuplicateFileException*);
+        REQUIRE_THROWS_MG(pMgdLogManager->RenameLog(L"DoesNotExist.log", L"NewDoesNotExist.log"), MgFileNotFoundException*);
 #ifdef _WIN32
-        CPPUNIT_ASSERT_THROW_MG(pMgdLogManager->RenameLog(NewTestName, L"?"), MgInvalidArgumentException*);
+        REQUIRE_THROWS_MG(pMgdLogManager->RenameLog(NewTestName, L"?"), MgInvalidArgumentException*);
 #endif
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -269,7 +252,7 @@
 ///
 /// This test case tries to change the log info.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_SetAccessLogInfo()
+TEST_CASE("SetAccessLogInfo", "[LogManager]")
 {
     try
     {
@@ -289,15 +272,15 @@
         // Restore original info
         pMgdLogManager->SetAccessLogInfo(bOriginalEnabled, originalName, originalParams);
 
-        CPPUNIT_ASSERT(bEnabled == false);
-        CPPUNIT_ASSERT(wcscmp(name.c_str(), TestName) == 0);
-        CPPUNIT_ASSERT(wcscmp(params.c_str(), TestParameters) == 0);
+        REQUIRE(bEnabled == false);
+        REQUIRE(wcscmp(name.c_str(), TestName) == 0);
+        REQUIRE(wcscmp(params.c_str(), TestParameters) == 0);
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -310,19 +293,19 @@
 ///
 /// This test case tries to clear the log.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_ClearAccessLog()
+TEST_CASE("ClearAccessLog", "[LogManager]")
 {
     try
     {
         MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
         bool bResult = pMgdLogManager->ClearAccessLog();
-        CPPUNIT_ASSERT(bResult);
+        REQUIRE(bResult);
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -335,7 +318,7 @@
 ///
 /// This test case tries to get the contents of the log.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_GetAccessLog()
+TEST_CASE("GetAccessLog", "[LogManager]")
 {
     MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
     STRING path = pMgdLogManager->GetLogsPath();
@@ -361,9 +344,9 @@
     catch (MgException* e)
     {
         pMgdLogManager->SetAccessLogFileName(originalName);
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -371,8 +354,8 @@
         throw;
     }
 
-    CPPUNIT_ASSERT(logContents == contents);
-    CPPUNIT_ASSERT(lastLogEntry == LastEntry);
+    REQUIRE(logContents == contents);
+    REQUIRE(lastLogEntry == LastEntry);
 }
 
 ///----------------------------------------------------------------------------
@@ -380,7 +363,7 @@
 ///
 /// This test case tries to get the contents of the log between two dates.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_GetAccessLogByDate()
+TEST_CASE("GetAccessLogByDate", "[LogManager]")
 {
     MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
     STRING path = pMgdLogManager->GetLogsPath();
@@ -405,7 +388,7 @@
         toDate = new MgDateTime(2005, 3, 7, 16, 54, 19, 0);
         byteReader = pMgdLogManager->GetAccessLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == (Entry1 + Entry2 + Entry3));
+        REQUIRE(logContents == (Entry1 + Entry2 + Entry3));
 
         // from & to date are the same and at exact time an entry was made
         fromDate = new MgDateTime(2005, 3, 7, 16, 51, 13, 0);
@@ -412,7 +395,7 @@
         toDate = new MgDateTime(2005, 3, 7, 16, 51, 13, 0);
         byteReader = pMgdLogManager->GetAccessLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == Entry1);
+        REQUIRE(logContents == Entry1);
 
         // from & to date are the same and not at exact time an entry was made
         fromDate = new MgDateTime(2005, 3, 7, 16, 52, 0, 0);
@@ -419,7 +402,7 @@
         toDate = new MgDateTime(2005, 3, 7, 16, 52, 0, 0);
         byteReader = pMgdLogManager->GetAccessLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents.length() == 0);
+        REQUIRE(logContents.length() == 0);
 
         // from & to dates are at not at exact times an entry was made
         fromDate = new MgDateTime(2005, 3, 7, 16, 52, 0, 0);
@@ -426,7 +409,7 @@
         toDate = new MgDateTime(2005, 3, 7, 16, 56, 0, 0);
         byteReader = pMgdLogManager->GetAccessLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == (Entry2 + Entry3 + Entry4));
+        REQUIRE(logContents == (Entry2 + Entry3 + Entry4));
 
         // spans two different files
         fromDate = new MgDateTime(2005, 3, 7, 16, 52, 0, 0);
@@ -433,7 +416,7 @@
         toDate = new MgDateTime(2005, 3, 8, 1, 0, 0, 0);
         byteReader = pMgdLogManager->GetAccessLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == (Entry2 + Entry3 + Entry4 + LastEntry));
+        REQUIRE(logContents == (Entry2 + Entry3 + Entry4 + LastEntry));
 
         // spans two different files, the first of which doesn't exist
         fromDate = new MgDateTime(2005, 3, 6, 23, 59, 59, 0);
@@ -440,7 +423,7 @@
         toDate = new MgDateTime(2005, 3, 7, 16, 52, 0, 0);
         byteReader = pMgdLogManager->GetAccessLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == Entry1);
+        REQUIRE(logContents == Entry1);
 
         // spans two different files, the second of which doesn't exist
         fromDate = new MgDateTime(2005, 3, 8, 0, 0, 0, 0);
@@ -447,7 +430,7 @@
         toDate = new MgDateTime(2005, 3, 9, 0, 0, 0, 0);
         byteReader = pMgdLogManager->GetAccessLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == LastEntry);
+        REQUIRE(logContents == LastEntry);
 
         // from date is after the latest entry in the log files
         fromDate = new MgDateTime(2006, 1, 1, 1, 0, 0, 0);
@@ -454,15 +437,15 @@
         toDate = new MgDateTime(2006, 1, 1, 1, 0, 0, 0);
         byteReader = pMgdLogManager->GetAccessLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents.length() == 0);
+        REQUIRE(logContents.length() == 0);
 
         // Use a null value for the date
-        CPPUNIT_ASSERT_THROW_MG(pMgdLogManager->GetAccessLog(NULL, toDate), MgNullArgumentException*);
+        REQUIRE_THROWS_MG(pMgdLogManager->GetAccessLog(nullptr, toDate), MgNullArgumentException*);
 
         // Use dates more than 24 hours apart
         fromDate = new MgDateTime(2005, 2, 18, 14, 0, 0, 0);
         toDate = new MgDateTime(2005, 2, 19, 18, 0, 0, 0);
-        CPPUNIT_ASSERT_THROW_MG(pMgdLogManager->GetAccessLog(fromDate, toDate), MgInvalidArgumentException*);
+        REQUIRE_THROWS_MG(pMgdLogManager->GetAccessLog(fromDate, toDate), MgInvalidArgumentException*);
 
         // Search a log file with an invalid log entry as the first entry
         CreateFile(path + JunkName, L"asdfasdfasdf");
@@ -469,7 +452,7 @@
         pMgdLogManager->SetAccessLogFileName(JunkName);
         fromDate = new MgDateTime(2005, 3, 8, 0, 0, 0, 0);
         toDate = new MgDateTime(2005, 3, 9, 0, 0, 0, 0);
-        CPPUNIT_ASSERT_THROW_MG(pMgdLogManager->GetAccessLog(fromDate, toDate), MgdInvalidLogEntryException*);
+        REQUIRE_THROWS_MG(pMgdLogManager->GetAccessLog(fromDate, toDate), MgdInvalidLogEntryException*);
 
         pMgdLogManager->SetAccessLogFileName(originalName);
     }
@@ -476,9 +459,9 @@
     catch (MgException* e)
     {
         pMgdLogManager->SetAccessLogFileName(originalName);
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -493,10 +476,10 @@
 /// This test case tries to get the contents of the log using an invalid
 /// argument.  An exception should be thrown.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_GetAccessLogInvalid()
+TEST_CASE("GetAccessLogInvalid", "[LogManager]")
 {
     MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
-    CPPUNIT_ASSERT_THROW_MG(pMgdLogManager->GetAccessLog(-1), MgArgumentOutOfRangeException*);
+    REQUIRE_THROWS_MG(pMgdLogManager->GetAccessLog(-1), MgArgumentOutOfRangeException*);
 }
 
 ///----------------------------------------------------------------------------
@@ -504,7 +487,7 @@
 ///
 /// This test case tries to change the log info.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_SetAdminLogInfo()
+TEST_CASE("SetAdminLogInfo", "[LogManager]")
 {
     try
     {
@@ -524,15 +507,15 @@
         // Restore original info
         pMgdLogManager->SetAdminLogInfo(bOriginalEnabled, originalName, originalParams);
 
-        CPPUNIT_ASSERT(bEnabled == false);
-        CPPUNIT_ASSERT(wcscmp(name.c_str(), TestName) == 0);
-        CPPUNIT_ASSERT(wcscmp(params.c_str(), TestParameters) == 0);
+        REQUIRE(bEnabled == false);
+        REQUIRE(wcscmp(name.c_str(), TestName) == 0);
+        REQUIRE(wcscmp(params.c_str(), TestParameters) == 0);
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -545,19 +528,19 @@
 ///
 /// This test case tries to clear the log.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_ClearAdminLog()
+TEST_CASE("ClearAdminLog", "[LogManager]")
 {
     try
     {
         MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
         bool bResult = pMgdLogManager->ClearAdminLog();
-        CPPUNIT_ASSERT(bResult);
+        REQUIRE(bResult);
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -570,7 +553,7 @@
 ///
 /// This test case tries to get the contents of the log.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_GetAdminLog()
+TEST_CASE("GetAdminLog", "[LogManager]")
 {
     MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
     STRING path = pMgdLogManager->GetLogsPath();
@@ -594,9 +577,9 @@
     catch (MgException* e)
     {
         pMgdLogManager->SetAdminLogFileName(originalName);
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -604,8 +587,8 @@
         throw;
     }
 
-    CPPUNIT_ASSERT(logContents == contents);
-    CPPUNIT_ASSERT(lastLogEntry == LastEntry);
+    REQUIRE(logContents == contents);
+    REQUIRE(lastLogEntry == LastEntry);
 }
 
 ///----------------------------------------------------------------------------
@@ -613,7 +596,7 @@
 ///
 /// This test case tries to get the contents of the log between two dates.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_GetAdminLogByDate()
+TEST_CASE("GetAdminLogByData", "[LogManager]")
 {
     MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
     STRING path = pMgdLogManager->GetLogsPath();
@@ -638,7 +621,7 @@
         toDate = new MgDateTime(2005, 3, 7, 16, 54, 19, 0);
         byteReader = pMgdLogManager->GetAdminLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == (Entry1 + Entry2 + Entry3));
+        REQUIRE(logContents == (Entry1 + Entry2 + Entry3));
 
         // from & to date are the same and at exact time an entry was made
         fromDate = new MgDateTime(2005, 3, 7, 16, 51, 13, 0);
@@ -645,7 +628,7 @@
         toDate = new MgDateTime(2005, 3, 7, 16, 51, 13, 0);
         byteReader = pMgdLogManager->GetAdminLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == Entry1);
+        REQUIRE(logContents == Entry1);
 
         // from & to date are the same and not at exact time an entry was made
         fromDate = new MgDateTime(2005, 3, 7, 16, 52, 0, 0);
@@ -652,7 +635,7 @@
         toDate = new MgDateTime(2005, 3, 7, 16, 52, 0, 0);
         byteReader = pMgdLogManager->GetAdminLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents.length() == 0);
+        REQUIRE(logContents.length() == 0);
 
         // from & to dates are at not at exact times an entry was made
         fromDate = new MgDateTime(2005, 3, 7, 16, 52, 0, 0);
@@ -659,7 +642,7 @@
         toDate = new MgDateTime(2005, 3, 7, 16, 56, 0, 0);
         byteReader = pMgdLogManager->GetAdminLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == (Entry2 + Entry3 + Entry4));
+        REQUIRE(logContents == (Entry2 + Entry3 + Entry4));
 
         // spans two different files, the second of which doesn't exist
         fromDate = new MgDateTime(2005, 3, 8, 0, 0, 0, 0);
@@ -666,7 +649,7 @@
         toDate = new MgDateTime(2005, 3, 9, 0, 0, 0, 0);
         byteReader = pMgdLogManager->GetAdminLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == LastEntry);
+        REQUIRE(logContents == LastEntry);
 
         // from date is after the latest entry in the log files
         fromDate = new MgDateTime(2006, 1, 1, 1, 0, 0, 0);
@@ -673,15 +656,15 @@
         toDate = new MgDateTime(2006, 1, 1, 1, 0, 0, 0);
         byteReader = pMgdLogManager->GetAdminLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents.length() == 0);
+        REQUIRE(logContents.length() == 0);
 
         // Use a null value for the date
-        CPPUNIT_ASSERT_THROW_MG(pMgdLogManager->GetAdminLog(NULL, toDate), MgNullArgumentException*);
+        REQUIRE_THROWS_MG(pMgdLogManager->GetAdminLog(nullptr, toDate), MgNullArgumentException*);
 
         // Use dates more than 24 hours apart
         fromDate = new MgDateTime(2005, 2, 18, 14, 0, 0, 0);
         toDate = new MgDateTime(2005, 2, 19, 18, 0, 0, 0);
-        CPPUNIT_ASSERT_THROW_MG(pMgdLogManager->GetAdminLog(fromDate, toDate), MgInvalidArgumentException*);
+        REQUIRE_THROWS_MG(pMgdLogManager->GetAdminLog(fromDate, toDate), MgInvalidArgumentException*);
 
         pMgdLogManager->SetAdminLogFileName(originalName);
     }
@@ -688,9 +671,9 @@
     catch (MgException* e)
     {
         pMgdLogManager->SetAdminLogFileName(originalName);
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -705,10 +688,10 @@
 /// This test case tries to get the contents of the log using an invalid
 /// argument.  An exception should be thrown.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_GetAdminLogInvalid()
+TEST_CASE("GetAdminLogInvalid", "[LogManager]")
 {
     MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
-    CPPUNIT_ASSERT_THROW_MG(pMgdLogManager->GetAdminLog(-1), MgArgumentOutOfRangeException*);
+    REQUIRE_THROWS_MG(pMgdLogManager->GetAdminLog(-1), MgArgumentOutOfRangeException*);
 }
 
 ///----------------------------------------------------------------------------
@@ -716,7 +699,7 @@
 ///
 /// This test case tries to change the log info.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_SetAuthenticationLogInfo()
+TEST_CASE("SetAuthenticationLogInfo", "[LogManager]")
 {
     try
     {
@@ -736,15 +719,15 @@
         // Restore original info
         pMgdLogManager->SetAuthenticationLogInfo(bOriginalEnabled, originalName, originalParams);
 
-        CPPUNIT_ASSERT(bEnabled == false);
-        CPPUNIT_ASSERT(wcscmp(name.c_str(), TestName) == 0);
-        CPPUNIT_ASSERT(wcscmp(params.c_str(), TestParameters) == 0);
+        REQUIRE(bEnabled == false);
+        REQUIRE(wcscmp(name.c_str(), TestName) == 0);
+        REQUIRE(wcscmp(params.c_str(), TestParameters) == 0);
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -757,19 +740,19 @@
 ///
 /// This test case tries to clear the log.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_ClearAuthenticationLog()
+TEST_CASE("ClearAuthenticationLog", "[LogManager]")
 {
     try
     {
         MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
         bool bResult = pMgdLogManager->ClearAuthenticationLog();
-        CPPUNIT_ASSERT(bResult);
+        REQUIRE(bResult);
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -782,7 +765,7 @@
 ///
 /// This test case tries to get the contents of the log.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_GetAuthenticationLog()
+TEST_CASE("GetAuthenticationLog", "[LogManager]")
 {
     MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
     STRING path = pMgdLogManager->GetLogsPath();
@@ -806,9 +789,9 @@
     catch (MgException* e)
     {
         pMgdLogManager->SetAuthenticationLogFileName(originalName);
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -816,8 +799,8 @@
         throw;
     }
 
-    CPPUNIT_ASSERT(logContents == contents);
-    CPPUNIT_ASSERT(lastLogEntry == LastEntry);
+    REQUIRE(logContents == contents);
+    REQUIRE(lastLogEntry == LastEntry);
 }
 
 ///----------------------------------------------------------------------------
@@ -825,7 +808,7 @@
 ///
 /// This test case tries to get the contents of the log between two dates.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_GetAuthenticationLogByDate()
+TEST_CASE("GetAuthenticationLogByDate", "[LogManager]")
 {
     MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
     STRING path = pMgdLogManager->GetLogsPath();
@@ -850,7 +833,7 @@
         toDate = new MgDateTime(2005, 3, 7, 16, 54, 19, 0);
         byteReader = pMgdLogManager->GetAuthenticationLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == (Entry1 + Entry2 + Entry3));
+        REQUIRE(logContents == (Entry1 + Entry2 + Entry3));
 
         // from & to dates are at not at exact times an entry was made
         fromDate = new MgDateTime(2005, 3, 7, 16, 52, 0, 0);
@@ -857,7 +840,7 @@
         toDate = new MgDateTime(2005, 3, 7, 16, 56, 0, 0);
         byteReader = pMgdLogManager->GetAuthenticationLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == (Entry2 + Entry3 + Entry4));
+        REQUIRE(logContents == (Entry2 + Entry3 + Entry4));
 
         // spans two different files
         fromDate = new MgDateTime(2005, 3, 7, 16, 52, 0, 0);
@@ -864,7 +847,7 @@
         toDate = new MgDateTime(2005, 3, 8, 1, 0, 0, 0);
         byteReader = pMgdLogManager->GetAuthenticationLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == (Entry2 + Entry3 + Entry4 + LastEntry));
+        REQUIRE(logContents == (Entry2 + Entry3 + Entry4 + LastEntry));
 
         // spans two different files, the first of which doesn't exist
         fromDate = new MgDateTime(2005, 3, 6, 23, 59, 59, 0);
@@ -871,7 +854,7 @@
         toDate = new MgDateTime(2005, 3, 7, 16, 52, 0, 0);
         byteReader = pMgdLogManager->GetAuthenticationLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == Entry1);
+        REQUIRE(logContents == Entry1);
 
         // spans two different files, the second of which doesn't exist
         fromDate = new MgDateTime(2005, 3, 8, 0, 0, 0, 0);
@@ -878,7 +861,7 @@
         toDate = new MgDateTime(2005, 3, 9, 0, 0, 0, 0);
         byteReader = pMgdLogManager->GetAuthenticationLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == LastEntry);
+        REQUIRE(logContents == LastEntry);
 
         // from date is after the latest entry in the log files
         fromDate = new MgDateTime(2006, 1, 1, 1, 0, 0, 0);
@@ -885,15 +868,15 @@
         toDate = new MgDateTime(2006, 1, 1, 1, 0, 0, 0);
         byteReader = pMgdLogManager->GetAuthenticationLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents.length() == 0);
+        REQUIRE(logContents.length() == 0);
 
         // Use a null value for the date
-        CPPUNIT_ASSERT_THROW_MG(pMgdLogManager->GetAuthenticationLog(NULL, toDate), MgNullArgumentException*);
+        REQUIRE_THROWS_MG(pMgdLogManager->GetAuthenticationLog(nullptr, toDate), MgNullArgumentException*);
 
         // Use dates more than 24 hours apart
         fromDate = new MgDateTime(2005, 2, 18, 14, 0, 0, 0);
         toDate = new MgDateTime(2005, 2, 19, 18, 0, 0, 0);
-        CPPUNIT_ASSERT_THROW_MG(pMgdLogManager->GetAuthenticationLog(fromDate, toDate), MgInvalidArgumentException*);
+        REQUIRE_THROWS_MG(pMgdLogManager->GetAuthenticationLog(fromDate, toDate), MgInvalidArgumentException*);
 
         pMgdLogManager->SetAuthenticationLogFileName(originalName);
     }
@@ -900,9 +883,9 @@
     catch (MgException* e)
     {
         pMgdLogManager->SetAuthenticationLogFileName(originalName);
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -917,10 +900,10 @@
 /// This test case tries to get the contents of the log using an invalid
 /// argument.  An exception should be thrown.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_GetAuthenticationLogInvalid()
+TEST_CASE("GetAuthenticationLogInvalid", "[LogManager]")
 {
     MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
-    CPPUNIT_ASSERT_THROW_MG(pMgdLogManager->GetAuthenticationLog(-1), MgArgumentOutOfRangeException*);
+    REQUIRE_THROWS_MG(pMgdLogManager->GetAuthenticationLog(-1), MgArgumentOutOfRangeException*);
 }
 
 ///----------------------------------------------------------------------------
@@ -928,7 +911,7 @@
 ///
 /// This test case tries to change the log info.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_SetErrorLogInfo()
+TEST_CASE("SetErrorLogInfo", "[LogManager]")
 {
     try
     {
@@ -948,15 +931,15 @@
         // Restore original info
         pMgdLogManager->SetErrorLogInfo(bOriginalEnabled, originalName, originalParams);
 
-        CPPUNIT_ASSERT(bEnabled == false);
-        CPPUNIT_ASSERT(wcscmp(name.c_str(), TestName) == 0);
-        CPPUNIT_ASSERT(wcscmp(params.c_str(), TestParameters) == 0);
+        REQUIRE(bEnabled == false);
+        REQUIRE(wcscmp(name.c_str(), TestName) == 0);
+        REQUIRE(wcscmp(params.c_str(), TestParameters) == 0);
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -969,19 +952,19 @@
 ///
 /// This test case tries to clear the log.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_ClearErrorLog()
+TEST_CASE("ClearErrorLog", "[LogManager]")
 {
     try
     {
         MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
         bool bResult = pMgdLogManager->ClearErrorLog();
-        CPPUNIT_ASSERT(bResult);
+        REQUIRE(bResult);
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -994,7 +977,7 @@
 ///
 /// This test case tries to get the contents of the log.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_GetErrorLog()
+TEST_CASE("GetErrorLog", "[LogManager]")
 {
     MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
     STRING path = pMgdLogManager->GetLogsPath();
@@ -1018,9 +1001,9 @@
     catch (MgException* e)
     {
         pMgdLogManager->SetErrorLogFileName(originalName);
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -1028,8 +1011,8 @@
         throw;
     }
 
-    CPPUNIT_ASSERT(logContents == contents);
-    CPPUNIT_ASSERT(lastLogEntry == LastEntry);
+    REQUIRE(logContents == contents);
+    REQUIRE(lastLogEntry == LastEntry);
 }
 
 ///----------------------------------------------------------------------------
@@ -1037,7 +1020,7 @@
 ///
 /// This test case tries to get the contents of the log between two dates.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_GetErrorLogByDate()
+TEST_CASE("GetErrorLogByDate", "[LogManager]")
 {
     MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
     STRING path = pMgdLogManager->GetLogsPath();
@@ -1062,7 +1045,7 @@
         toDate = new MgDateTime(2005, 3, 7, 16, 54, 19, 0);
         byteReader = pMgdLogManager->GetErrorLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == (Entry1 + Entry2 + Entry3));
+        REQUIRE(logContents == (Entry1 + Entry2 + Entry3));
 
         // from & to dates are at not at exact times an entry was made
         fromDate = new MgDateTime(2005, 3, 7, 16, 52, 0, 0);
@@ -1069,7 +1052,7 @@
         toDate = new MgDateTime(2005, 3, 7, 16, 56, 0, 0);
         byteReader = pMgdLogManager->GetErrorLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == (Entry2 + Entry3 + Entry4));
+        REQUIRE(logContents == (Entry2 + Entry3 + Entry4));
 
         // spans two different files
         fromDate = new MgDateTime(2005, 3, 7, 16, 52, 0, 0);
@@ -1076,7 +1059,7 @@
         toDate = new MgDateTime(2005, 3, 8, 1, 0, 0, 0);
         byteReader = pMgdLogManager->GetErrorLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == (Entry2 + Entry3 + Entry4 + LastEntry));
+        REQUIRE(logContents == (Entry2 + Entry3 + Entry4 + LastEntry));
 
         // spans two different files, the first of which doesn't exist
         fromDate = new MgDateTime(2005, 3, 6, 23, 59, 59, 0);
@@ -1083,7 +1066,7 @@
         toDate = new MgDateTime(2005, 3, 7, 16, 52, 0, 0);
         byteReader = pMgdLogManager->GetErrorLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == Entry1);
+        REQUIRE(logContents == Entry1);
 
         // spans two different files, the second of which doesn't exist
         fromDate = new MgDateTime(2005, 3, 8, 0, 0, 0, 0);
@@ -1090,7 +1073,7 @@
         toDate = new MgDateTime(2005, 3, 9, 0, 0, 0, 0);
         byteReader = pMgdLogManager->GetErrorLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == LastEntry);
+        REQUIRE(logContents == LastEntry);
 
         // from date is after the latest entry in the log files
         fromDate = new MgDateTime(2006, 1, 1, 1, 0, 0, 0);
@@ -1097,15 +1080,15 @@
         toDate = new MgDateTime(2006, 1, 1, 1, 0, 0, 0);
         byteReader = pMgdLogManager->GetErrorLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents.length() == 0);
+        REQUIRE(logContents.length() == 0);
 
         // Use a null value for the date
-        CPPUNIT_ASSERT_THROW_MG(pMgdLogManager->GetErrorLog(NULL, toDate), MgNullArgumentException*);
+        REQUIRE_THROWS_MG(pMgdLogManager->GetErrorLog(nullptr, toDate), MgNullArgumentException*);
 
         // Use dates more than 24 hours apart
         fromDate = new MgDateTime(2005, 2, 18, 14, 0, 0, 0);
         toDate = new MgDateTime(2005, 2, 19, 18, 0, 0, 0);
-        CPPUNIT_ASSERT_THROW_MG(pMgdLogManager->GetErrorLog(fromDate, toDate), MgInvalidArgumentException*);
+        REQUIRE_THROWS_MG(pMgdLogManager->GetErrorLog(fromDate, toDate), MgInvalidArgumentException*);
 
         pMgdLogManager->SetErrorLogFileName(originalName);
     }
@@ -1112,9 +1095,9 @@
     catch (MgException* e)
     {
         pMgdLogManager->SetErrorLogFileName(originalName);
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -1129,10 +1112,10 @@
 /// This test case tries to get the contents of the log using an invalid
 /// argument.  An exception should be thrown.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_GetErrorLogInvalid()
+TEST_CASE("GetErrorLogInvalid", "[LogManager]")
 {
     MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
-    CPPUNIT_ASSERT_THROW_MG(pMgdLogManager->GetErrorLog(-1), MgArgumentOutOfRangeException*);
+    REQUIRE_THROWS_MG(pMgdLogManager->GetErrorLog(-1), MgArgumentOutOfRangeException*);
 }
 
 ///----------------------------------------------------------------------------
@@ -1140,7 +1123,7 @@
 ///
 /// This test case tries to change the log info.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_SetSessionLogInfo()
+TEST_CASE("SetSessionLogInfo", "[LogManager]")
 {
     try
     {
@@ -1160,15 +1143,15 @@
         // Restore original info
         pMgdLogManager->SetSessionLogInfo(bOriginalEnabled, originalName, originalParams);
 
-        CPPUNIT_ASSERT(bEnabled == false);
-        CPPUNIT_ASSERT(wcscmp(name.c_str(), TestName) == 0);
-        CPPUNIT_ASSERT(wcscmp(params.c_str(), TestParameters) == 0);
+        REQUIRE(bEnabled == false);
+        REQUIRE(wcscmp(name.c_str(), TestName) == 0);
+        REQUIRE(wcscmp(params.c_str(), TestParameters) == 0);
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -1181,19 +1164,19 @@
 ///
 /// This test case tries to clear the log.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_ClearSessionLog()
+TEST_CASE("ClearSessionLog", "[LogManager]")
 {
     try
     {
         MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
         bool bResult = pMgdLogManager->ClearSessionLog();
-        CPPUNIT_ASSERT(bResult);
+        REQUIRE(bResult);
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -1206,7 +1189,7 @@
 ///
 /// This test case tries to get the contents of the log.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_GetSessionLog()
+TEST_CASE("GetSessionLog", "[LogManager]")
 {
     MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
     STRING path = pMgdLogManager->GetLogsPath();
@@ -1230,9 +1213,9 @@
     catch (MgException* e)
     {
         pMgdLogManager->SetSessionLogFileName(originalName);
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -1240,8 +1223,8 @@
         throw;
     }
 
-    CPPUNIT_ASSERT(logContents == contents);
-    CPPUNIT_ASSERT(lastLogEntry == LastEntry);
+    REQUIRE(logContents == contents);
+    REQUIRE(lastLogEntry == LastEntry);
 }
 
 ///----------------------------------------------------------------------------
@@ -1249,7 +1232,7 @@
 ///
 /// This test case tries to get the contents of the log between two dates.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_GetSessionLogByDate()
+TEST_CASE("GetSessionLogByDate", "[LogManager]")
 {
     MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
     STRING path = pMgdLogManager->GetLogsPath();
@@ -1274,7 +1257,7 @@
         toDate = new MgDateTime(2005, 3, 7, 16, 54, 19, 0);
         byteReader = pMgdLogManager->GetSessionLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == (Entry1 + Entry2 + Entry3));
+        REQUIRE(logContents == (Entry1 + Entry2 + Entry3));
 
         // from & to dates are at not at exact times an entry was made
         fromDate = new MgDateTime(2005, 3, 7, 16, 52, 0, 0);
@@ -1281,7 +1264,7 @@
         toDate = new MgDateTime(2005, 3, 7, 16, 56, 0, 0);
         byteReader = pMgdLogManager->GetSessionLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == (Entry2 + Entry3 + Entry4));
+        REQUIRE(logContents == (Entry2 + Entry3 + Entry4));
 
         // spans two different files
         fromDate = new MgDateTime(2005, 3, 7, 16, 52, 0, 0);
@@ -1288,7 +1271,7 @@
         toDate = new MgDateTime(2005, 3, 8, 1, 0, 0, 0);
         byteReader = pMgdLogManager->GetSessionLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == (Entry2 + Entry3 + Entry4 + LastEntry));
+        REQUIRE(logContents == (Entry2 + Entry3 + Entry4 + LastEntry));
 
         // spans two different files, the first of which doesn't exist
         fromDate = new MgDateTime(2005, 3, 6, 23, 59, 59, 0);
@@ -1295,7 +1278,7 @@
         toDate = new MgDateTime(2005, 3, 7, 16, 52, 0, 0);
         byteReader = pMgdLogManager->GetSessionLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == Entry1);
+        REQUIRE(logContents == Entry1);
 
         // spans two different files, the second of which doesn't exist
         fromDate = new MgDateTime(2005, 3, 8, 0, 0, 0, 0);
@@ -1302,7 +1285,7 @@
         toDate = new MgDateTime(2005, 3, 9, 0, 0, 0, 0);
         byteReader = pMgdLogManager->GetSessionLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == LastEntry);
+        REQUIRE(logContents == LastEntry);
 
         // from date is after the latest entry in the log files
         fromDate = new MgDateTime(2006, 1, 1, 1, 0, 0, 0);
@@ -1309,15 +1292,15 @@
         toDate = new MgDateTime(2006, 1, 1, 1, 0, 0, 0);
         byteReader = pMgdLogManager->GetSessionLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents.length() == 0);
+        REQUIRE(logContents.length() == 0);
 
         // Use a null value for the date
-        CPPUNIT_ASSERT_THROW_MG(pMgdLogManager->GetSessionLog(NULL, toDate), MgNullArgumentException*);
+        REQUIRE_THROWS_MG(pMgdLogManager->GetSessionLog(nullptr, toDate), MgNullArgumentException*);
 
         // Use dates more than 24 hours apart
         fromDate = new MgDateTime(2005, 2, 18, 14, 0, 0, 0);
         toDate = new MgDateTime(2005, 2, 19, 18, 0, 0, 0);
-        CPPUNIT_ASSERT_THROW_MG(pMgdLogManager->GetSessionLog(fromDate, toDate), MgInvalidArgumentException*);
+        REQUIRE_THROWS_MG(pMgdLogManager->GetSessionLog(fromDate, toDate), MgInvalidArgumentException*);
 
         pMgdLogManager->SetSessionLogFileName(originalName);
     }
@@ -1324,9 +1307,9 @@
     catch (MgException* e)
     {
         pMgdLogManager->SetSessionLogFileName(originalName);
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -1341,10 +1324,10 @@
 /// This test case tries to get the contents of the log using an invalid
 /// argument.  An exception should be thrown.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_GetSessionLogInvalid()
+TEST_CASE("GetSessionLogInvalid", "[LogManager]")
 {
     MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
-    CPPUNIT_ASSERT_THROW_MG(pMgdLogManager->GetSessionLog(-1), MgArgumentOutOfRangeException*);
+    REQUIRE_THROWS_MG(pMgdLogManager->GetSessionLog(-1), MgArgumentOutOfRangeException*);
 }
 
 ///----------------------------------------------------------------------------
@@ -1352,7 +1335,7 @@
 ///
 /// This test case tries to change the log info.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_SetTraceLogInfo()
+TEST_CASE("SetTraceLogInfo", "[LogManager]")
 {
     try
     {
@@ -1372,15 +1355,15 @@
         // Restore original info
         pMgdLogManager->SetTraceLogInfo(bOriginalEnabled, originalName, originalParams);
 
-        CPPUNIT_ASSERT(bEnabled == false);
-        CPPUNIT_ASSERT(wcscmp(name.c_str(), TestName) == 0);
-        CPPUNIT_ASSERT(wcscmp(params.c_str(), TestParameters) == 0);
+        REQUIRE(bEnabled == false);
+        REQUIRE(wcscmp(name.c_str(), TestName) == 0);
+        REQUIRE(wcscmp(params.c_str(), TestParameters) == 0);
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -1393,19 +1376,19 @@
 ///
 /// This test case tries to clear the log.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_ClearTraceLog()
+TEST_CASE("ClearTraceLog", "[LogManager]")
 {
     try
     {
         MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
         bool bResult = pMgdLogManager->ClearTraceLog();
-        CPPUNIT_ASSERT(bResult);
+        REQUIRE(bResult);
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -1418,7 +1401,7 @@
 ///
 /// This test case tries to get the contents of the log.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_GetTraceLog()
+TEST_CASE("GetTraceLog", "[LogManager]")
 {
     MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
     STRING path = pMgdLogManager->GetLogsPath();
@@ -1442,9 +1425,9 @@
     catch (MgException* e)
     {
         pMgdLogManager->SetTraceLogFileName(originalName);
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -1452,8 +1435,8 @@
         throw;
     }
 
-    CPPUNIT_ASSERT(logContents == contents);
-    CPPUNIT_ASSERT(lastLogEntry == LastEntry);
+    REQUIRE(logContents == contents);
+    REQUIRE(lastLogEntry == LastEntry);
 }
 
 ///----------------------------------------------------------------------------
@@ -1461,7 +1444,7 @@
 ///
 /// This test case tries to get the contents of the log between two dates.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_GetTraceLogByDate()
+TEST_CASE("GetTraceLogByDate", "[LogManager]")
 {
     MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
     STRING path = pMgdLogManager->GetLogsPath();
@@ -1486,7 +1469,7 @@
         toDate = new MgDateTime(2005, 3, 7, 16, 54, 19, 0);
         byteReader = pMgdLogManager->GetTraceLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == (Entry1 + Entry2 + Entry3));
+        REQUIRE(logContents == (Entry1 + Entry2 + Entry3));
 
         // from & to dates are at not at exact times an entry was made
         fromDate = new MgDateTime(2005, 3, 7, 16, 52, 0, 0);
@@ -1493,7 +1476,7 @@
         toDate = new MgDateTime(2005, 3, 7, 16, 56, 0, 0);
         byteReader = pMgdLogManager->GetTraceLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == (Entry2 + Entry3 + Entry4));
+        REQUIRE(logContents == (Entry2 + Entry3 + Entry4));
 
         // spans two different files
         fromDate = new MgDateTime(2005, 3, 7, 16, 52, 0, 0);
@@ -1500,7 +1483,7 @@
         toDate = new MgDateTime(2005, 3, 8, 1, 0, 0, 0);
         byteReader = pMgdLogManager->GetTraceLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == (Entry2 + Entry3 + Entry4 + LastEntry));
+        REQUIRE(logContents == (Entry2 + Entry3 + Entry4 + LastEntry));
 
         // spans two different files, the first of which doesn't exist
         fromDate = new MgDateTime(2005, 3, 6, 23, 59, 59, 0);
@@ -1507,7 +1490,7 @@
         toDate = new MgDateTime(2005, 3, 7, 16, 52, 0, 0);
         byteReader = pMgdLogManager->GetTraceLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == Entry1);
+        REQUIRE(logContents == Entry1);
 
         // spans two different files, the second of which doesn't exist
         fromDate = new MgDateTime(2005, 3, 8, 0, 0, 0, 0);
@@ -1514,7 +1497,7 @@
         toDate = new MgDateTime(2005, 3, 9, 0, 0, 0, 0);
         byteReader = pMgdLogManager->GetTraceLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents == LastEntry);
+        REQUIRE(logContents == LastEntry);
 
         // from date is after the latest entry in the log files
         fromDate = new MgDateTime(2006, 1, 1, 1, 0, 0, 0);
@@ -1521,15 +1504,15 @@
         toDate = new MgDateTime(2006, 1, 1, 1, 0, 0, 0);
         byteReader = pMgdLogManager->GetTraceLog(fromDate, toDate);
         logContents = MgUtil::MultiByteToWideChar(MgUtil::GetTextFromReader(byteReader));
-        CPPUNIT_ASSERT(logContents.length() == 0);
+        REQUIRE(logContents.length() == 0);
 
         // Use a null value for the date
-        CPPUNIT_ASSERT_THROW_MG(pMgdLogManager->GetTraceLog(NULL, toDate), MgNullArgumentException*);
+        REQUIRE_THROWS_MG(pMgdLogManager->GetTraceLog(nullptr, toDate), MgNullArgumentException*);
 
         // Use dates more than 24 hours apart
         fromDate = new MgDateTime(2005, 2, 18, 14, 0, 0, 0);
         toDate = new MgDateTime(2005, 2, 19, 18, 0, 0, 0);
-        CPPUNIT_ASSERT_THROW_MG(pMgdLogManager->GetTraceLog(fromDate, toDate), MgInvalidArgumentException*);
+        REQUIRE_THROWS_MG(pMgdLogManager->GetTraceLog(fromDate, toDate), MgInvalidArgumentException*);
 
         pMgdLogManager->SetTraceLogFileName(originalName);
     }
@@ -1536,9 +1519,9 @@
     catch (MgException* e)
     {
         pMgdLogManager->SetTraceLogFileName(originalName);
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -1553,10 +1536,10 @@
 /// This test case tries to get the contents of the log using an invalid
 /// argument.  An exception should be thrown.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_GetTraceLogInvalid()
+TEST_CASE("GetTraceLogInvalid", "[LogManager]")
 {
     MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
-    CPPUNIT_ASSERT_THROW_MG(pMgdLogManager->GetTraceLog(-1), MgArgumentOutOfRangeException*);
+    REQUIRE_THROWS_MG(pMgdLogManager->GetTraceLog(-1), MgArgumentOutOfRangeException*);
 }
 
 ///----------------------------------------------------------------------------
@@ -1564,7 +1547,7 @@
 ///
 /// This test case writes an entry to the log.  (Assumes that getlog works)
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_LogAccessEntry()
+TEST_CASE("LogAccessEntry", "[LogManager]")
 {
     Ptr<MgByteReader> byteReader;
     STRING logEntry;
@@ -1589,9 +1572,9 @@
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
 
     }
     catch (...)
@@ -1600,7 +1583,7 @@
     }
 
     pos = logEntry.find(entry);
-    CPPUNIT_ASSERT(pos != string::npos);
+    REQUIRE(pos != string::npos);
 }
 
 ///----------------------------------------------------------------------------
@@ -1608,7 +1591,7 @@
 ///
 /// This test case writes an entry to the log.  (Assumes that getlog works)
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_LogAdminEntry()
+TEST_CASE("LogAdminEntry", "[LogManager]")
 {
     Ptr<MgByteReader> byteReader;
     STRING logEntry;
@@ -1633,9 +1616,9 @@
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -1643,7 +1626,7 @@
     }
 
     pos = logEntry.find(entry);
-    CPPUNIT_ASSERT(pos != string::npos);
+    REQUIRE(pos != string::npos);
 }
 
 ///----------------------------------------------------------------------------
@@ -1651,7 +1634,7 @@
 ///
 /// This test case writes an entry to the log.  (Assumes that getlog works)
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_LogAuthenticationEntry()
+TEST_CASE("LogAuthenticationEntry", "[LogManager]")
 {
     Ptr<MgByteReader> byteReader;
     STRING logEntry;
@@ -1676,9 +1659,9 @@
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -1686,7 +1669,7 @@
     }
 
     pos = logEntry.find(entry);
-    CPPUNIT_ASSERT(pos != string::npos);
+    REQUIRE(pos != string::npos);
 }
 
 ///----------------------------------------------------------------------------
@@ -1694,7 +1677,7 @@
 ///
 /// This test case writes an entry to the log.  (Assumes that getlog works)
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_LogErrorEntry()
+TEST_CASE("LogErrorEntry", "[LogManager]")
 {
     Ptr<MgByteReader> byteReader;
     STRING logEntry;
@@ -1719,9 +1702,9 @@
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -1729,7 +1712,7 @@
     }
 
     pos = logEntry.find(entry);
-    CPPUNIT_ASSERT(pos != string::npos);
+    REQUIRE(pos != string::npos);
 }
 
 ///----------------------------------------------------------------------------
@@ -1737,7 +1720,7 @@
 ///
 /// This test case writes an entry to the log.  (Assumes that getlog works)
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_LogTraceEntry()
+TEST_CASE("LogTraceEntry", "[LogManager]")
 {
     Ptr<MgByteReader> byteReader;
     STRING logEntry;
@@ -1762,9 +1745,9 @@
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -1772,7 +1755,7 @@
     }
 
     pos = logEntry.find(entry);
-    CPPUNIT_ASSERT(pos != string::npos);
+    REQUIRE(pos != string::npos);
 }
 
 
@@ -1781,7 +1764,7 @@
 ///
 /// This test case tries to get the contents of the specified log.
 ///----------------------------------------------------------------------------
-void TestLogManager::TestCase_GetLogFile()
+TEST_CASE("GetLogFile", "[LogManager]")
 {
     MgdLogManager* pMgdLogManager = MgdLogManager::GetInstance();
     STRING path = pMgdLogManager->GetLogsPath();
@@ -1805,9 +1788,9 @@
     catch (MgException* e)
     {
         pMgdLogManager->SetAccessLogFileName(originalName);
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -1815,5 +1798,5 @@
         throw;
     }
 
-    CPPUNIT_ASSERT(logContents == contents);
+    REQUIRE(logContents == contents);
 }

Deleted: sandbox/jng/catch2/Desktop/UnitTest/TestLogManager.h
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/TestLogManager.h	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/UnitTest/TestLogManager.h	2020-07-15 16:00:34 UTC (rev 9675)
@@ -1,145 +0,0 @@
-//
-//  Copyright (C) 2004-2011 by Autodesk, Inc.
-//
-//  This library is free software; you can redistribute it and/or
-//  modify it under the terms of version 2.1 of the GNU Lesser
-//  General Public License as published by the Free Software Foundation.
-//
-//  This library 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
-//  Lesser General Public License for more details.
-//
-//  You should have received a copy of the GNU Lesser General Public
-//  License along with this library; if not, write to the Free Software
-//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-//
-
-#ifndef _TESTLOGMANAGER_H
-#define _TESTLOGMANAGER_H
-
-#include <cppunit/extensions/HelperMacros.h>
-
-class TestLogManager : public CppUnit::TestFixture
-{
-    CPPUNIT_TEST_SUITE(TestLogManager);
-    CPPUNIT_TEST(TestStart); // This must be the very first unit test
-
-    CPPUNIT_TEST(TestCase_ValidLogManager);
-    CPPUNIT_TEST(TestCase_GetLogsPath);
-    CPPUNIT_TEST(TestCase_TestForDeadLock);
-
-    CPPUNIT_TEST(TestCase_EnumerateLogs);
-    CPPUNIT_TEST(TestCase_RenameLog);
-
-    CPPUNIT_TEST(TestCase_SetAccessLogInfo);
-    CPPUNIT_TEST(TestCase_ClearAccessLog);
-    CPPUNIT_TEST(TestCase_GetAccessLog);
-    CPPUNIT_TEST(TestCase_GetAccessLogByDate);
-    CPPUNIT_TEST(TestCase_GetAccessLogInvalid);
-
-    CPPUNIT_TEST(TestCase_SetAdminLogInfo);
-    CPPUNIT_TEST(TestCase_ClearAdminLog);
-    CPPUNIT_TEST(TestCase_GetAdminLog);
-    CPPUNIT_TEST(TestCase_GetAdminLogByDate);
-    CPPUNIT_TEST(TestCase_GetAdminLogInvalid);
-
-    CPPUNIT_TEST(TestCase_SetAuthenticationLogInfo);
-    CPPUNIT_TEST(TestCase_ClearAuthenticationLog);
-    CPPUNIT_TEST(TestCase_GetAuthenticationLog);
-    CPPUNIT_TEST(TestCase_GetAuthenticationLogByDate);
-    CPPUNIT_TEST(TestCase_GetAuthenticationLogInvalid);
-
-    CPPUNIT_TEST(TestCase_SetErrorLogInfo);
-    CPPUNIT_TEST(TestCase_ClearErrorLog);
-    CPPUNIT_TEST(TestCase_GetErrorLog);
-    CPPUNIT_TEST(TestCase_GetErrorLogByDate);
-    CPPUNIT_TEST(TestCase_GetErrorLogInvalid);
-
-    CPPUNIT_TEST(TestCase_SetSessionLogInfo);
-    CPPUNIT_TEST(TestCase_ClearSessionLog);
-    CPPUNIT_TEST(TestCase_GetSessionLog);
-    CPPUNIT_TEST(TestCase_GetSessionLogByDate);
-    CPPUNIT_TEST(TestCase_GetSessionLogInvalid);
-
-    CPPUNIT_TEST(TestCase_SetTraceLogInfo);
-    CPPUNIT_TEST(TestCase_ClearTraceLog);
-    CPPUNIT_TEST(TestCase_GetTraceLog);
-    CPPUNIT_TEST(TestCase_GetTraceLogByDate);
-    CPPUNIT_TEST(TestCase_GetTraceLogInvalid);
-
-    CPPUNIT_TEST(TestCase_LogAccessEntry);
-    //CPPUNIT_TEST(TestCase_LogAdminEntry);             //Not applicable for mg-desktop
-    //CPPUNIT_TEST(TestCase_LogAuthenticationEntry);    //Not applicable for mg-desktop
-    CPPUNIT_TEST(TestCase_LogErrorEntry);
-    CPPUNIT_TEST(TestCase_LogTraceEntry);
-
-    CPPUNIT_TEST(TestCase_GetLogFile);
-
-    CPPUNIT_TEST(TestCase_DeleteLog);
-
-    CPPUNIT_TEST(TestEnd); // This must be the very last unit test
-    CPPUNIT_TEST_SUITE_END();
-
-public:
-    void setUp();
-    void tearDown();
-    void TestStart();
-    void TestEnd();
-    bool CreateFile(STRING filename, STRING contents);
-
-    void TestCase_ValidLogManager();
-    void TestCase_GetLogsPath();
-    void TestCase_TestForDeadLock();
-
-    void TestCase_EnumerateLogs();
-    void TestCase_DeleteLog();
-    void TestCase_RenameLog();
-
-    void TestCase_SetAccessLogInfo();
-    void TestCase_ClearAccessLog();
-    void TestCase_GetAccessLog();
-    void TestCase_GetAccessLogByDate();
-    void TestCase_GetAccessLogInvalid();
-
-    void TestCase_SetAdminLogInfo();
-    void TestCase_ClearAdminLog();
-    void TestCase_GetAdminLog();
-    void TestCase_GetAdminLogByDate();
-    void TestCase_GetAdminLogInvalid();
-
-    void TestCase_SetAuthenticationLogInfo();
-    void TestCase_ClearAuthenticationLog();
-    void TestCase_GetAuthenticationLog();
-    void TestCase_GetAuthenticationLogByDate();
-    void TestCase_GetAuthenticationLogInvalid();
-
-    void TestCase_SetErrorLogInfo();
-    void TestCase_ClearErrorLog();
-    void TestCase_GetErrorLog();
-    void TestCase_GetErrorLogByDate();
-    void TestCase_GetErrorLogInvalid();
-
-    void TestCase_SetSessionLogInfo();
-    void TestCase_ClearSessionLog();
-    void TestCase_GetSessionLog();
-    void TestCase_GetSessionLogByDate();
-    void TestCase_GetSessionLogInvalid();
-
-    void TestCase_SetTraceLogInfo();
-    void TestCase_ClearTraceLog();
-    void TestCase_GetTraceLog();
-    void TestCase_GetTraceLogByDate();
-    void TestCase_GetTraceLogInvalid();
-
-    void TestCase_LogAccessEntry();
-    void TestCase_LogAdminEntry();
-    void TestCase_LogAuthenticationEntry();
-    void TestCase_LogErrorEntry();
-    void TestCase_LogSessionEntry();
-    void TestCase_LogTraceEntry();
-
-    void TestCase_GetLogFile();
-};
-
-#endif // _TESTLOGMANAGER_H

Modified: sandbox/jng/catch2/Desktop/UnitTest/TestLogManagerThread.cpp
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/TestLogManagerThread.cpp	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/UnitTest/TestLogManagerThread.cpp	2020-07-15 16:00:34 UTC (rev 9675)
@@ -30,9 +30,9 @@
 int TestLogManagerThread::svc()
 {
     MgdLogManager* pMan = MgdLogManager::GetInstance();
-    if (NULL == pMan)
+    if (nullptr == pMan)
     {
-        throw new MgNullReferenceException(L"TestLogManagerThread.svc", __LINE__, __WFILE__, NULL, L"", NULL);
+        throw new MgNullReferenceException(L"TestLogManagerThread.svc", __LINE__, __WFILE__, nullptr, L"", nullptr);
     }
 
     INT32 nResult = 0;

Modified: sandbox/jng/catch2/Desktop/UnitTest/TestMappingService.cpp
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/TestMappingService.cpp	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/UnitTest/TestMappingService.cpp	2020-07-15 16:00:34 UTC (rev 9675)
@@ -16,192 +16,21 @@
 //
 
 #include "MgDesktop.h"
-#include "TestMappingService.h"
-#include "CppUnitExtensions.h"
 
-const STRING TEST_LOCALE = L"en";
+#include "CatchHelperMacros.h"
+#include "TestServiceFactory.h"
+#include "catch.hpp"
 
-CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(TestMappingService, "TestMappingService");
-
-
-TestMappingService::TestMappingService()
+TEST_CASE("GetMultiPlot", "[MappingService]")
 {
-    // Initialize service objects.
-    //MgServiceManager* serviceManager = MgServiceManager::GetInstance();
-    Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
-
-    m_svcResource = dynamic_cast<MgdResourceService*>(
-        factory->CreateService(MgServiceType::ResourceService));
-    assert(m_svcResource != NULL);
-
-    m_svcMapping = dynamic_cast<MgdMappingService*>(
-        factory->CreateService(MgServiceType::MappingService));
-    assert(m_svcMapping != NULL);
-}
-
-
-TestMappingService::~TestMappingService()
-{
-}
-
-
-void TestMappingService::setUp()
-{
-}
-
-
-void TestMappingService::tearDown()
-{
-}
-
-
-void TestMappingService::TestStart()
-{
-    ACE_DEBUG((LM_INFO, ACE_TEXT("\nRunning Mapping Service tests.\n")));
-
     try
     {
-        //publish the map definition
-        Ptr<MgResourceIdentifier> mapres = new MgResourceIdentifier(L"Library://UnitTests/Maps/Sheboygan.MapDefinition");
-        Ptr<MgByteSource> mdfsrc = new MgByteSource(L"../UnitTestFiles/UT_Sheboygan.mdf", false);
-        Ptr<MgByteReader> mdfrdr = mdfsrc->GetReader();
-        m_svcResource->SetResource(mapres, mdfrdr, NULL);
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
 
-        //publish the layer definitions
-        Ptr<MgResourceIdentifier> ldfres1 = new MgResourceIdentifier(L"Library://UnitTests/Layers/HydrographicPolygons.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc1 = new MgByteSource(L"../UnitTestFiles/UT_HydrographicPolygons.ldf", false);
-        Ptr<MgByteReader> ldfrdr1 = ldfsrc1->GetReader();
-        m_svcResource->SetResource(ldfres1, ldfrdr1, NULL);
+        Ptr<MgdMappingService> pService = dynamic_cast<MgdMappingService*>(
+            factory->CreateService(MgServiceType::MappingService));
+        REQUIRE(pService.p != nullptr);
 
-        Ptr<MgResourceIdentifier> ldfres2 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Parcels.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc2 = new MgByteSource(L"../UnitTestFiles/UT_Parcels.ldf", false);
-        Ptr<MgByteReader> ldfrdr2 = ldfsrc2->GetReader();
-        m_svcResource->SetResource(ldfres2, ldfrdr2, NULL);
-
-        Ptr<MgResourceIdentifier> ldfres3 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Rail.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc3 = new MgByteSource(L"../UnitTestFiles/UT_Rail.ldf", false);
-        Ptr<MgByteReader> ldfrdr3 = ldfsrc3->GetReader();
-        m_svcResource->SetResource(ldfres3, ldfrdr3, NULL);
-
-        //publish the feature sources
-        Ptr<MgResourceIdentifier> fsres1 = new MgResourceIdentifier(L"Library://UnitTests/Data/HydrographicPolygons.FeatureSource");
-        Ptr<MgByteSource> fssrc1 = new MgByteSource(L"../UnitTestFiles/UT_HydrographicPolygons.fs", false);
-        Ptr<MgByteReader> fsrdr1 = fssrc1->GetReader();
-        m_svcResource->SetResource(fsres1, fsrdr1, NULL);
-
-        Ptr<MgResourceIdentifier> fsres2 = new MgResourceIdentifier(L"Library://UnitTests/Data/Parcels.FeatureSource");
-        Ptr<MgByteSource> fssrc2 = new MgByteSource(L"../UnitTestFiles/UT_Parcels.fs", false);
-        Ptr<MgByteReader> fsrdr2 = fssrc2->GetReader();
-        m_svcResource->SetResource(fsres2, fsrdr2, NULL);
-
-        Ptr<MgResourceIdentifier> fsres3 = new MgResourceIdentifier(L"Library://UnitTests/Data/Rail.FeatureSource");
-        Ptr<MgByteSource> fssrc3 = new MgByteSource(L"../UnitTestFiles/UT_Rail.fs", false);
-        Ptr<MgByteReader> fsrdr3 = fssrc3->GetReader();
-        m_svcResource->SetResource(fsres3, fsrdr3, NULL);
-
-        // publish the resource data
-        Ptr<MgByteSource> dataSource1 = new MgByteSource(L"../UnitTestFiles/UT_HydrographicPolygons.sdf", false);
-        Ptr<MgByteReader> dataReader1 = dataSource1->GetReader();
-        m_svcResource->SetResourceData(fsres1, L"UT_HydrographicPolygons.sdf", L"File", dataReader1);
-
-        Ptr<MgByteSource> dataSource2 = new MgByteSource(L"../UnitTestFiles/UT_Parcels.sdf", false);
-        Ptr<MgByteReader> dataReader2 = dataSource2->GetReader();
-        m_svcResource->SetResourceData(fsres2, L"UT_Parcels.sdf", L"File", dataReader2);
-
-        Ptr<MgByteSource> dataSource3 = new MgByteSource(L"../UnitTestFiles/UT_Rail.sdf", false);
-        Ptr<MgByteReader> dataReader3 = dataSource3->GetReader();
-        m_svcResource->SetResourceData(fsres3, L"UT_Rail.sdf", L"File", dataReader3);
-
-        // publish the print layouts
-        Ptr<MgResourceIdentifier> plres1 = new MgResourceIdentifier(L"Library://UnitTests/PrintLayouts/AllElements.PrintLayout");
-        Ptr<MgByteSource> plsrc1 = new MgByteSource(L"../UnitTestFiles/UT_AllElements.pl", false);
-        Ptr<MgByteReader> plrdr1 = plsrc1->GetReader();
-        m_svcResource->SetResource(plres1, plrdr1, NULL);
-
-        Ptr<MgResourceIdentifier> plres2 = new MgResourceIdentifier(L"Library://UnitTests/PrintLayouts/NoLegend.PrintLayout");
-        Ptr<MgByteSource> plsrc2 = new MgByteSource(L"../UnitTestFiles/UT_NoLegend.pl", false);
-        Ptr<MgByteReader> plrdr2 = plsrc2->GetReader();
-        m_svcResource->SetResource(plres2, plrdr2, NULL);
-
-        // publish the symbol library
-        Ptr<MgResourceIdentifier> slres1 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/SymbolMart.SymbolLibrary");
-        Ptr<MgByteSource> slsrc1 = new MgByteSource(L"../UnitTestFiles/UT_SymbolMart.sl", false);
-        Ptr<MgByteReader> slrdr1 = slsrc1->GetReader();
-        m_svcResource->SetResource(slres1, slrdr1, NULL);
-        Ptr<MgByteSource> datasrc = new MgByteSource(L"../UnitTestFiles/UT_Symbols.dwf", false);
-        Ptr<MgByteReader> datardr = datasrc->GetReader();
-        m_svcResource->SetResourceData(slres1, L"symbols.dwf", L"File", datardr);
-    }
-    catch (MgException* e)
-    {
-        STRING message = e->GetDetails(TEST_LOCALE);
-        SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
-    }
-    catch (...)
-    {
-        throw;
-    }
-}
-
-
-void TestMappingService::TestEnd()
-{
-    try
-    {
-        //delete the map definition
-        Ptr<MgResourceIdentifier> mapres = new MgResourceIdentifier(L"Library://UnitTests/Maps/Sheboygan.MapDefinition");
-        m_svcResource->DeleteResource(mapres);
-
-        //delete the layer definitions
-        Ptr<MgResourceIdentifier> ldfres1 = new MgResourceIdentifier(L"Library://UnitTests/Layers/HydrographicPolygons.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres1);
-
-        Ptr<MgResourceIdentifier> ldfres2 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Parcels.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres2);
-
-        Ptr<MgResourceIdentifier> ldfres3 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Rail.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres3);
-
-        //delete the feature sources
-        Ptr<MgResourceIdentifier> fsres1 = new MgResourceIdentifier(L"Library://UnitTests/Data/HydrographicPolygons.FeatureSource");
-        m_svcResource->DeleteResource(fsres1);
-
-        Ptr<MgResourceIdentifier> fsres2 = new MgResourceIdentifier(L"Library://UnitTests/Data/Parcels.FeatureSource");
-        m_svcResource->DeleteResource(fsres2);
-
-        Ptr<MgResourceIdentifier> fsres3 = new MgResourceIdentifier(L"Library://UnitTests/Data/Rail.FeatureSource");
-        m_svcResource->DeleteResource(fsres3);
-
-        // delete the print layouts
-        Ptr<MgResourceIdentifier> plres1 = new MgResourceIdentifier(L"Library://UnitTests/PrintLayouts/AllElements.PrintLayout");
-        m_svcResource->DeleteResource(plres1);
-
-        Ptr<MgResourceIdentifier> plres2 = new MgResourceIdentifier(L"Library://UnitTests/PrintLayouts/NoLegend.PrintLayout");
-        m_svcResource->DeleteResource(plres2);
-
-        // delete the symbol library
-        Ptr<MgResourceIdentifier> slres1 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/SymbolMart.SymbolLibrary");
-        m_svcResource->DeleteResource(slres1);
-    }
-    catch (MgException* e)
-    {
-        STRING message = e->GetDetails(TEST_LOCALE);
-        SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
-    }
-    catch (...)
-    {
-        throw;
-    }
-
-    ACE_DEBUG((LM_INFO, ACE_TEXT("\nMapping Service tests completed.\n\n")));
-}
-
-void TestMappingService::TestCase_GetMultiPlot()
-{
-    try
-    {
         // make a runtime map
         Ptr<MgResourceIdentifier> mapRes1 = new MgResourceIdentifier(L"Library://UnitTests/Maps/Sheboygan.MapDefinition");
         Ptr<MgdMap> map1 = new MgdMap(mapRes1, L"UnitTestSheboygan1");
@@ -256,11 +85,11 @@
         mapPlots->Add(mapPlot4);
 
         // call the API
-        Ptr<MgByteReader> eplot = m_svcMapping->GenerateMultiPlot(mapPlots, version);
+        Ptr<MgByteReader> eplot = pService->GenerateMultiPlot(mapPlots, version);
 
         INT64 len = eplot->GetLength();
 
-        //CPPUNIT_ASSERT(len == 7000); // TODO: determine correct length
+        //REQUIRE(len == 7000); // TODO: determine correct length
 
         //Ptr<MgByteSink> byteSink = new MgByteSink(eplot);
         //byteSink->ToFile(L"UTNewMultiPlot.dwf");
@@ -267,9 +96,9 @@
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -277,11 +106,16 @@
     }
 }
 
-
-void TestMappingService::TestCase_GetPlotUsingCurrentCenterAndScale()
+TEST_CASE("GetPlotUsingCurrentCenterAndScale", "[MappingService]")
 {
     try
     {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdMappingService> pService = dynamic_cast<MgdMappingService*>(
+            factory->CreateService(MgServiceType::MappingService));
+        REQUIRE(pService.p != nullptr);
+
         // make a runtime map
         Ptr<MgResourceIdentifier> mapRes1 = new MgResourceIdentifier(L"Library://UnitTests/Maps/Sheboygan.MapDefinition");
         Ptr<MgdMap> map1 = new MgdMap(mapRes1, L"UnitTestSheboygan1");
@@ -300,12 +134,12 @@
         Ptr<MgdLayout> layout = new MgdLayout(allElementsLayout, L"TestTitle", MgdUnitType::USEnglish);
 
         // call the API
-        Ptr<MgByteReader> eplot = m_svcMapping->GeneratePlot(map1, plotSpec, NULL, version);
+        Ptr<MgByteReader> eplot = pService->GeneratePlot(map1, plotSpec, nullptr, version);
         //Ptr<MgByteReader> eplot = m_svcMapping->GeneratePlot(map1, plotSpec, layout, version);
 
         INT64 len = eplot->GetLength();
 
-        // CPPUNIT_ASSERT(len == 7000); // TODO: determine correct length
+        // REQUIRE(len == 7000); // TODO: determine correct length
 
         //Ptr<MgByteSink> byteSink = new MgByteSink(eplot);
         //byteSink->ToFile(L"UTNewCurrentCentreAndScalePlot.dwf");
@@ -312,9 +146,9 @@
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -322,11 +156,16 @@
     }
 }
 
-
-void TestMappingService::TestCase_GetPlotUsingOverriddenCenterAndScale()
+TEST_CASE("GetPlotUsingOverriddenCenterAndScale", "[MappingService]")
 {
     try
     {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdMappingService> pService = dynamic_cast<MgdMappingService*>(
+            factory->CreateService(MgServiceType::MappingService));
+        REQUIRE(pService.p != nullptr);
+
         // make a runtime map
         Ptr<MgResourceIdentifier> mapRes1 = new MgResourceIdentifier(L"Library://UnitTests/Maps/Sheboygan.MapDefinition");
         Ptr<MgdMap> map1 = new MgdMap(mapRes1, L"UnitTestSheboygan1");
@@ -345,11 +184,11 @@
         Ptr<MgdLayout> layout = new MgdLayout(allElementsLayout, L"TestTitle", MgdUnitType::USEnglish);
 
         // call the API
-        Ptr<MgByteReader> eplot = m_svcMapping->GeneratePlot(map1, center, scale, plotSpec, layout, version);
+        Ptr<MgByteReader> eplot = pService->GeneratePlot(map1, center, scale, plotSpec, layout, version);
 
         INT64 len = eplot->GetLength();
 
-        // CPPUNIT_ASSERT(len == 7000); // TODO: determine correct length
+        // REQUIRE(len == 7000); // TODO: determine correct length
 
         //Ptr<MgByteSink> byteSink = new MgByteSink(eplot);
         //byteSink->ToFile(L"UTNewOveriddenCenterAndScalePlot.dwf");
@@ -356,9 +195,9 @@
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -366,11 +205,16 @@
     }
 }
 
-
-void TestMappingService::TestCase_GetPlotUsingExtents()
+TEST_CASE("GetPlotUsingExtents", "[MappingService]")
 {
     try
     {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdMappingService> pService = dynamic_cast<MgdMappingService*>(
+            factory->CreateService(MgServiceType::MappingService));
+        REQUIRE(pService.p != nullptr);
+
         // make a runtime map
         Ptr<MgResourceIdentifier> mapRes1 = new MgResourceIdentifier(L"Library://UnitTests/Maps/Sheboygan.MapDefinition");
         Ptr<MgdMap> map1 = new MgdMap(mapRes1, L"UnitTestSheboygan1");
@@ -389,11 +233,11 @@
         Ptr<MgdLayout> layout = new MgdLayout(allElementsLayout, L"TestTitle", MgdUnitType::USEnglish);
 
         // call the API
-        Ptr<MgByteReader> eplot = m_svcMapping->GeneratePlot(map1, extents, false, plotSpec, layout, version);
+        Ptr<MgByteReader> eplot = pService->GeneratePlot(map1, extents, false, plotSpec, layout, version);
 
         INT64 len = eplot->GetLength();
 
-        // CPPUNIT_ASSERT(len == 7000); // TODO: determine correct length
+        // REQUIRE(len == 7000); // TODO: determine correct length
 
         //Ptr<MgByteSink> byteSink = new MgByteSink(eplot);
         //byteSink->ToFile(L"UTNewExtentsPlot.dwf");
@@ -400,9 +244,9 @@
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -410,11 +254,16 @@
     }
 }
 
-
-void TestMappingService::TestCase_GetPlotUsingExtentsAndExpandToFit()
+TEST_CASE("GetPlotUsingExtentsAndExpandToFit", "[MappingService]")
 {
     try
     {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdMappingService> pService = dynamic_cast<MgdMappingService*>(
+            factory->CreateService(MgServiceType::MappingService));
+        REQUIRE(pService.p != nullptr);
+
         // make a runtime map
         Ptr<MgResourceIdentifier> mapRes1 = new MgResourceIdentifier(L"Library://UnitTests/Maps/Sheboygan.MapDefinition");
         Ptr<MgdMap> map1 = new MgdMap(mapRes1, L"UnitTestSheboygan1");
@@ -433,11 +282,11 @@
         Ptr<MgdLayout> layout = new MgdLayout(allElementsLayout, L"TestTitle", MgdUnitType::USEnglish);
 
         // call the API
-        Ptr<MgByteReader> eplot = m_svcMapping->GeneratePlot(map1, extents, true, plotSpec, NULL, version);
+        Ptr<MgByteReader> eplot = pService->GeneratePlot(map1, extents, true, plotSpec, nullptr, version);
 
         INT64 len = eplot->GetLength();
 
-        // CPPUNIT_ASSERT(len == 7000); // TODO: determine correct length
+        // REQUIRE(len == 7000); // TODO: determine correct length
 
         //Ptr<MgByteSink> byteSink = new MgByteSink(eplot);
         //byteSink->ToFile(L"UTNewExtentsExpandToFitPlot.dwf");
@@ -444,9 +293,9 @@
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {

Deleted: sandbox/jng/catch2/Desktop/UnitTest/TestMappingService.h
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/TestMappingService.h	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/UnitTest/TestMappingService.h	2020-07-15 16:00:34 UTC (rev 9675)
@@ -1,72 +0,0 @@
-//
-//  Copyright (C) 2004-2010 by Autodesk, Inc.
-//
-//  This library is free software; you can redistribute it and/or
-//  modify it under the terms of version 2.1 of the GNU Lesser
-//  General Public License as published by the Free Software Foundation.
-//
-//  This library 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
-//  Lesser General Public License for more details.
-//
-//  You should have received a copy of the GNU Lesser General Public
-//  License along with this library; if not, write to the Free Software
-//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-//
-
-#ifndef TESTMAPPINGSERVICE_H_
-#define TESTMAPPINGSERVICE_H_
-
-#include <cppunit/extensions/HelperMacros.h>
-
-class TestMappingService : public CppUnit::TestFixture
-{
-    CPPUNIT_TEST_SUITE(TestMappingService);
-    CPPUNIT_TEST(TestStart); // This must be the very first unit test
-
-    //CPPUNIT_TEST(TestCase_GetMap);
-    //CPPUNIT_TEST(TestCase_GetMapUpdate);
-    //CPPUNIT_TEST(TestCase_SaveMap);
-    CPPUNIT_TEST(TestCase_GetMultiPlot);
-    CPPUNIT_TEST(TestCase_GetPlotUsingCurrentCenterAndScale);
-    CPPUNIT_TEST(TestCase_GetPlotUsingOverriddenCenterAndScale);
-    CPPUNIT_TEST(TestCase_GetPlotUsingExtents);
-    CPPUNIT_TEST(TestCase_GetPlotUsingExtentsAndExpandToFit);
-    //CPPUNIT_TEST(TestCase_GetLegendPlot);
-    //CPPUNIT_TEST(TestCase_QueryFeaturesImageMap);
-
-    CPPUNIT_TEST(TestEnd); // This must be the very last unit test
-    CPPUNIT_TEST_SUITE_END();
-
-public:
-
-    TestMappingService();
-    ~TestMappingService();
-
-    void setUp();
-    void tearDown();
-    void TestStart();
-    void TestEnd();
-
-    //void TestCase_GetMap();
-    //void TestCase_GetMapUpdate();
-    //void TestCase_SaveMap();
-    void TestCase_GetPlot();
-    void TestCase_GetMultiPlot();
-    void TestCase_GetPlotUsingCurrentCenterAndScale();
-    void TestCase_GetPlotUsingOverriddenCenterAndScale();
-    void TestCase_GetPlotUsingExtents();
-    void TestCase_GetPlotUsingExtentsAndExpandToFit();
-    //void TestCase_GetLegendPlot();
-    //void TestCase_QueryFeaturesImageMap();
-
-private:
-
-    void PublishTheResources();
-
-    Ptr<MgdResourceService> m_svcResource;
-    Ptr<MgdMappingService> m_svcMapping;
-};
-
-#endif // TESTMAPPINGSERVICE_H_

Modified: sandbox/jng/catch2/Desktop/UnitTest/TestPerformance.cpp
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/TestPerformance.cpp	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/UnitTest/TestPerformance.cpp	2020-07-15 16:00:34 UTC (rev 9675)
@@ -61,21 +61,21 @@
         MgServiceManager* serviceManager = MgServiceManager::GetInstance();
         if(serviceManager == 0)
         {
-            throw new MgNullReferenceException(L"TestPerformance.TestStart", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgNullReferenceException(L"TestPerformance.TestStart", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(serviceManager->RequestService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestPerformance.TestStart", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestPerformance.TestStart", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         //Set the user information for the current thread to be administrator
-        MgUserInformation::SetCurrentUserInfo(NULL);
+        MgUserInformation::SetCurrentUserInfo(nullptr);
         Ptr<MgUserInformation> userInfo = new MgUserInformation(L"Administrator", L"admin");
-        if (userInfo != NULL)
+        if (userInfo != nullptr)
         {
-            userInfo->SetLocale(TEST_LOCALE);
+            userInfo->SetLocale(TestServiceFactory::TEST_LOCALE);
             MgUserInformation::SetCurrentUserInfo(userInfo);
 
             MgResourceIdentifier resourceIdentifier1(L"Library://UnitTests/Data/Sheboygan_Parcels.FeatureSource");
@@ -91,7 +91,7 @@
             //Add a new resource
             Ptr<MgByteSource> contentSource1 = new MgByteSource(resourceContentFileName1);
             Ptr<MgByteReader> contentReader1 = contentSource1->GetReader();
-            pService->SetResource(&resourceIdentifier1, contentReader1, NULL);
+            pService->SetResource(&resourceIdentifier1, contentReader1, nullptr);
 
             //Set the resource data
             Ptr<MgByteSource> dataSource1 = new MgByteSource(dataFileName1);
@@ -102,9 +102,9 @@
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
@@ -117,7 +117,7 @@
         if(serviceManager == 0)
         {
             throw new MgNullReferenceException(L"TestPerformance.TestEnd",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(serviceManager->RequestService(MgServiceType::ResourceService));
@@ -124,12 +124,12 @@
         if (pService == 0)
         {
             throw new MgServiceNotAvailableException(L"TestPerformance.TestEnd",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         // set user info
         Ptr<MgUserInformation> userInfo = new MgUserInformation(L"Administrator", L"admin");
-        userInfo->SetLocale(TEST_LOCALE);
+        userInfo->SetLocale(TestServiceFactory::TEST_LOCALE);
         MgUserInformation::SetCurrentUserInfo(userInfo);
 
         // delete the feature sources definition
@@ -146,9 +146,9 @@
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -172,13 +172,13 @@
         MgServiceManager* serviceManager = MgServiceManager::GetInstance();
         if(serviceManager == 0)
         {
-            throw new MgNullReferenceException(L"TestPerformance.TestCase_BenchmarkSelectFeatures", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgNullReferenceException(L"TestPerformance.TestCase_BenchmarkSelectFeatures", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgFeatureService> pService = dynamic_cast<MgFeatureService*>(serviceManager->RequestService(MgServiceType::FeatureService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestPerformance.TestCase_BenchmarkSelectFeatures", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestPerformance.TestCase_BenchmarkSelectFeatures", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> resource = new MgResourceIdentifier();
@@ -198,7 +198,7 @@
             }
 
             reader->Close();
-            CPPUNIT_ASSERT(nFeatures == 17565);
+            REQUIRE(nFeatures == 17565);
         }
 
         ACE_DEBUG((LM_INFO, ACE_TEXT("  Execution Time (Average of %d runs): = %6.4f (s)\n"), iterations, ((GetTickCount()-lStart)/1000.0)/(double)iterations ));
@@ -206,15 +206,15 @@
     }
     catch(MgResourceNotFoundException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
         ACE_DEBUG((LM_INFO, ACE_TEXT("\n%W\nAre the performance test resources installed?\n\n"), message.c_str()));
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -221,7 +221,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -243,7 +243,7 @@
         if(serviceManager == 0)
         {
             throw new MgNullReferenceException(L"TestPerformance.TestCase_BenchmarkJoinFeatures",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgFeatureService> pService = dynamic_cast<MgFeatureService*>(serviceManager->RequestService(MgServiceType::FeatureService));
@@ -250,7 +250,7 @@
         if (pService == 0)
         {
             throw new MgServiceNotAvailableException(L"TestPerformance.TestCase_BenchmarkJoinFeatures",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgResourceIdentifier> lFeatureSource = new MgResourceIdentifier(L"Library://JoinTest/Data/World_Countries_Join.FeatureSource");
@@ -267,7 +267,7 @@
         for(int i=0;i<iterations;i++)
         {
             nFeatures = 0;
-            Ptr<MgFeatureReader> reader = pService->SelectFeatures(lFeatureSource, L"World_Countries", NULL);
+            Ptr<MgFeatureReader> reader = pService->SelectFeatures(lFeatureSource, L"World_Countries", nullptr);
             while(reader->ReadNext())
             {
                 STRING s1 = L"<null>";
@@ -302,7 +302,7 @@
         for(int i=0;i<iterations;i++)
         {
             nFeatures = 0;
-            Ptr<MgFeatureReader> reader = pService->SelectFeatures(lFeatureSource, L"Join", NULL);
+            Ptr<MgFeatureReader> reader = pService->SelectFeatures(lFeatureSource, L"Join", nullptr);
             while(reader->ReadNext())
             {
                 STRING s1 = L"<null>";
@@ -352,7 +352,7 @@
         for(int i=0;i<iterations;i++)
         {
             nFeatures = 0;
-            Ptr<MgFeatureReader> reader = pService->SelectFeatures(lFeatureSource, L"World_Countries", NULL);
+            Ptr<MgFeatureReader> reader = pService->SelectFeatures(lFeatureSource, L"World_Countries", nullptr);
             while(reader->ReadNext())
             {
                 INT32 n1 = 0;
@@ -387,7 +387,7 @@
         for(int i=0;i<iterations;i++)
         {
             nFeatures = 0;
-            Ptr<MgFeatureReader> reader = pService->SelectFeatures(lFeatureSource, L"Join", NULL);
+            Ptr<MgFeatureReader> reader = pService->SelectFeatures(lFeatureSource, L"Join", nullptr);
             while(reader->ReadNext())
             {
                 INT32 n1 = 0;
@@ -437,7 +437,7 @@
         for(int i=0;i<iterations;i++)
         {
             nFeatures = 0;
-            Ptr<MgFeatureReader> reader = pService->SelectFeatures(lFeatureSource, L"geonames_n83", NULL);
+            Ptr<MgFeatureReader> reader = pService->SelectFeatures(lFeatureSource, L"geonames_n83", nullptr);
             while(reader->ReadNext())
             {
                 INT32 fid = 0;
@@ -475,7 +475,7 @@
         for(int i=0;i<iterations;i++)
         {
             nFeatures = 0;
-            Ptr<MgFeatureReader> reader = pService->SelectFeatures(lFeatureSource, L"GEONAMES_N83", NULL);
+            Ptr<MgFeatureReader> reader = pService->SelectFeatures(lFeatureSource, L"GEONAMES_N83", nullptr);
             while(reader->ReadNext())
             {
                 INT32 fid = 0;
@@ -513,7 +513,7 @@
         for(int i=0;i<iterations;i++)
         {
             nFeatures = 0;
-            Ptr<MgFeatureReader> reader = pService->SelectFeatures(lFeatureSource, L"Join", NULL);
+            Ptr<MgFeatureReader> reader = pService->SelectFeatures(lFeatureSource, L"Join", nullptr);
             while(reader->ReadNext())
             {
                 INT32 fid = 0;
@@ -558,15 +558,15 @@
     }
     catch(MgResourceNotFoundException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
         ACE_DEBUG((LM_INFO, ACE_TEXT("\n%W\nAre the performance test resources installed?\n\n"), message.c_str()));
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -573,7 +573,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {

Deleted: sandbox/jng/catch2/Desktop/UnitTest/TestPerformance.h
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/TestPerformance.h	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/UnitTest/TestPerformance.h	2020-07-15 16:00:34 UTC (rev 9675)
@@ -1,44 +0,0 @@
-//
-//  Copyright (C) 2004-2010 by Autodesk, Inc.
-//
-//  This library is free software; you can redistribute it and/or
-//  modify it under the terms of version 2.1 of the GNU Lesser
-//  General Public License as published by the Free Software Foundation.
-//
-//  This library 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
-//  Lesser General Public License for more details.
-//
-//  You should have received a copy of the GNU Lesser General Public
-//  License along with this library; if not, write to the Free Software
-//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-//
-
-#ifndef _TESTPERFORMANCE_H
-#define _TESTPERFORMANCE_H
-
-#include <cppunit/extensions/HelperMacros.h>
-
-class TestPerformance : public CppUnit::TestFixture
-{
-    CPPUNIT_TEST_SUITE(TestPerformance);
-    CPPUNIT_TEST(TestStart); // This must be the very first unit test
-
-    CPPUNIT_TEST(TestCase_BenchmarkSelectFeatures);
-    CPPUNIT_TEST(TestCase_BenchmarkJoinFeatures);
-
-    CPPUNIT_TEST(TestEnd); // This must be the very last unit test
-    CPPUNIT_TEST_SUITE_END();
-
-public:
-    void setUp();
-    void tearDown();
-    void TestStart();
-    void TestEnd();
-
-    void TestCase_BenchmarkSelectFeatures();
-    void TestCase_BenchmarkJoinFeatures();
-};
-
-#endif // _TESTPERFORMANCE_H

Modified: sandbox/jng/catch2/Desktop/UnitTest/TestProfilingService.cpp
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/TestProfilingService.cpp	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/UnitTest/TestProfilingService.cpp	2020-07-15 16:00:34 UTC (rev 9675)
@@ -16,408 +16,76 @@
 //
 
 #include "MgDesktop.h"
-#include "TestProfilingService.h"
 #include "StylizationDefs.h"
-const STRING TEST_LOCALE = L"en";
 
-CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(TestProfilingService, "TestProfilingService");
+#include "CatchHelperMacros.h"
+#include "TestServiceFactory.h"
+#include "catch.hpp"
 
-
-TestProfilingService::TestProfilingService()
+static MgdMap* CreateTestMap()
 {
-    // Initialize service objects.
-    Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+    Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/Sheboygan.MapDefinition");
+    MgdMap* map = new MgdMap(mdfres, L"UnitTestSheboygan");
 
-    m_svcResource = dynamic_cast<MgResourceService*>(
-        factory->CreateService(MgServiceType::ResourceService));
-    assert(m_svcResource != NULL);
+    Ptr<MgCoordinate> coordNewCenter = new MgCoordinateXY(-87.733253, 43.746199);
+    Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
+    map->SetViewCenter(ptNewCenter);
+    map->SetViewScale(75000.0);
+    map->SetDisplayDpi(96);
+    map->SetDisplayWidth(1024);
+    map->SetDisplayHeight(1024);
 
-    m_svcProfiling = dynamic_cast<MgdProfilingService*>(
-        factory->CreateService(MgServiceType::ProfilingService));
-    assert(m_svcProfiling != NULL);
+    return map;
 }
 
-
-TestProfilingService::~TestProfilingService()
+static MgdMap* CreateTestMapWithWatermark()
 {
-}
+    Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/SheboyganWithWatermark.MapDefinition");
+    MgdMap* map = new MgdMap(mdfres, L"UnitTestSheboyganWithWatermark");
 
+    Ptr<MgCoordinate> coordNewCenter = new MgCoordinateXY(-87.733253, 43.746199);
+    Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
+    map->SetViewCenter(ptNewCenter);
+    map->SetViewScale(75000.0);
+    map->SetDisplayDpi(96);
+    map->SetDisplayWidth(1024);
+    map->SetDisplayHeight(1024);
 
-void TestProfilingService::setUp()
-{
+    return map;
 }
 
-
-void TestProfilingService::tearDown()
+static MgdSelection* CreateSelection(MgdMap* map)
 {
-}
+    // make a selection in normal map
+    STRING layerId;
+    Ptr<MgLayerCollection> layers = map->GetLayers();
 
-
-void TestProfilingService::TestStart()
-{
-    ACE_DEBUG((LM_INFO, ACE_TEXT("\nRunning Profiling Service tests.\n")));
-
-    try
+    for (int i = 0; i < layers->GetCount(); i++)
     {
-        // publish the map definition
-        Ptr<MgResourceIdentifier> mapres1 = new MgResourceIdentifier(L"Library://UnitTests/Maps/Sheboygan.MapDefinition");
-        Ptr<MgByteSource> mdfsrc1 = new MgByteSource(L"../UnitTestFiles/UT_Sheboygan.mdf", false);
-        Ptr<MgByteReader> mdfrdr1 = mdfsrc1->GetReader();
-        m_svcResource->SetResource(mapres1, mdfrdr1, NULL);
+        Ptr<MgLayerBase> layer = layers->GetItem(i);
+        if (L"HydrographicPolygons" == layer->GetName())
+        {
+            layerId = layer->GetObjectId();
+        }
+    }
+    STRING selectionStr = L"<?xml version=\"1.0\" encoding=\"UTF-8\"?><FeatureSet><Layer id=\"";
+    selectionStr.append(layerId);
+    selectionStr.append(L"\"><Class id=\"SHP_Schema:HydrographicPolygons\"><ID>HQAAAA==</ID></Class></Layer></FeatureSet>");
 
-        // publish the layer definitions
-        Ptr<MgResourceIdentifier> ldfres1 = new MgResourceIdentifier(L"Library://UnitTests/Layers/HydrographicPolygons.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc1 = new MgByteSource(L"../UnitTestFiles/UT_HydrographicPolygons.ldf", false);
-        Ptr<MgByteReader> ldfrdr1 = ldfsrc1->GetReader();
-        m_svcResource->SetResource(ldfres1, ldfrdr1, NULL);
-
-        Ptr<MgResourceIdentifier> ldfres2 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Rail.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc2 = new MgByteSource(L"../UnitTestFiles/UT_Rail.ldf", false);
-        Ptr<MgByteReader> ldfrdr2 = ldfsrc2->GetReader();
-        m_svcResource->SetResource(ldfres2, ldfrdr2, NULL);
-
-        Ptr<MgResourceIdentifier> ldfres3 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Parcels.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc3 = new MgByteSource(L"../UnitTestFiles/UT_Parcels.ldf", false);
-        Ptr<MgByteReader> ldfrdr3 = ldfsrc3->GetReader();
-        m_svcResource->SetResource(ldfres3, ldfrdr3, NULL);
-
-        // publish the feature sources
-        Ptr<MgResourceIdentifier> fsres1 = new MgResourceIdentifier(L"Library://UnitTests/Data/HydrographicPolygons.FeatureSource");
-        Ptr<MgByteSource> fssrc1 = new MgByteSource(L"../UnitTestFiles/UT_HydrographicPolygons.fs", false);
-        Ptr<MgByteReader> fsrdr1 = fssrc1->GetReader();
-        m_svcResource->SetResource(fsres1, fsrdr1, NULL);
-
-        Ptr<MgResourceIdentifier> fsres2 = new MgResourceIdentifier(L"Library://UnitTests/Data/Rail.FeatureSource");
-        Ptr<MgByteSource> fssrc2 = new MgByteSource(L"../UnitTestFiles/UT_Rail.fs", false);
-        Ptr<MgByteReader> fsrdr2 = fssrc2->GetReader();
-        m_svcResource->SetResource(fsres2, fsrdr2, NULL);
-
-        Ptr<MgResourceIdentifier> fsres3 = new MgResourceIdentifier(L"Library://UnitTests/Data/Parcels.FeatureSource");
-        Ptr<MgByteSource> fssrc3 = new MgByteSource(L"../UnitTestFiles/UT_Parcels.fs", false);
-        Ptr<MgByteReader> fsrdr3 = fssrc3->GetReader();
-        m_svcResource->SetResource(fsres3, fsrdr3, NULL);
-
-        // publish the resource data
-        Ptr<MgByteSource> dataSource1 = new MgByteSource(L"../UnitTestFiles/UT_HydrographicPolygons.sdf", false);
-        Ptr<MgByteReader> dataReader1 = dataSource1->GetReader();
-        m_svcResource->SetResourceData(fsres1, L"UT_HydrographicPolygons.sdf", L"File", dataReader1);
-
-        Ptr<MgByteSource> dataSource2 = new MgByteSource(L"../UnitTestFiles/UT_Rail.sdf", false);
-        Ptr<MgByteReader> dataReader2 = dataSource2->GetReader();
-        m_svcResource->SetResourceData(fsres2, L"UT_Rail.sdf", L"File", dataReader2);
-
-        Ptr<MgByteSource> dataSource3 = new MgByteSource(L"../UnitTestFiles/UT_Parcels.sdf", false);
-        Ptr<MgByteReader> dataReader3 = dataSource3->GetReader();
-        m_svcResource->SetResourceData(fsres3, L"UT_Parcels.sdf", L"File", dataReader3);
-
-        // publish the print layouts
-        Ptr<MgResourceIdentifier> plres1 = new MgResourceIdentifier(L"Library://UnitTests/PrintLayouts/AllElements.PrintLayout");
-        Ptr<MgByteSource> plsrc1 = new MgByteSource(L"../UnitTestFiles/UT_AllElements.pl", false);
-        Ptr<MgByteReader> plrdr1 = plsrc1->GetReader();
-        m_svcResource->SetResource(plres1, plrdr1, NULL);
-
-        Ptr<MgResourceIdentifier> plres2 = new MgResourceIdentifier(L"Library://UnitTests/PrintLayouts/NoLegend.PrintLayout");
-        Ptr<MgByteSource> plsrc2 = new MgByteSource(L"../UnitTestFiles/UT_NoLegend.pl", false);
-        Ptr<MgByteReader> plrdr2 = plsrc2->GetReader();
-        m_svcResource->SetResource(plres2, plrdr2, NULL);
-
-        // publish the symbol library
-        Ptr<MgResourceIdentifier> slres1 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/SymbolMart.SymbolLibrary");
-        Ptr<MgByteSource> slsrc1 = new MgByteSource(L"../UnitTestFiles/UT_SymbolMart.sl", false);
-        Ptr<MgByteReader> slrdr1 = slsrc1->GetReader();
-        m_svcResource->SetResource(slres1, slrdr1, NULL);
-        Ptr<MgByteSource> datasrc = new MgByteSource(L"../UnitTestFiles/UT_Symbols.dwf", false);
-        Ptr<MgByteReader> datardr = datasrc->GetReader();
-        m_svcResource->SetResourceData(slres1, L"symbols.dwf", L"File", datardr);
-
-        //
-        // publish symbology stuff
-        //
-
-        // the point feature source
-        Ptr<MgResourceIdentifier> fsres4 = new MgResourceIdentifier(L"Library://UnitTests/Data/Capitals.FeatureSource");
-        Ptr<MgByteSource> fssrc4 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyPoints.fs", false);
-        Ptr<MgByteReader> fsrdr4 = fssrc4->GetReader();
-        m_svcResource->SetResource(fsres4, fsrdr4, NULL);
-
-        // point sdf file
-        Ptr<MgByteSource> dataSource4 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyPoints.sdf", false);
-        Ptr<MgByteReader> dataReader4 = dataSource4->GetReader();
-        m_svcResource->SetResourceData(fsres4, L"UT_SymbologyPoints.sdf", L"File", dataReader4);
-
-        // point symbols
-        Ptr<MgResourceIdentifier> sdres1 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/PointSymbol.SymbolDefinition");
-        Ptr<MgByteSource> sdsrc1 = new MgByteSource(L"../UnitTestFiles/symbol.sd", false);
-        Ptr<MgByteReader> sdrdr1 = sdsrc1->GetReader();
-        m_svcResource->SetResource(sdres1, sdrdr1, NULL);
-
-        Ptr<MgResourceIdentifier> sdres2 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/PointSymbolParam.SymbolDefinition");
-        Ptr<MgByteSource> sdsrc2 = new MgByteSource(L"../UnitTestFiles/symbolp.sd", false);
-        Ptr<MgByteReader> sdrdr2 = sdsrc2->GetReader();
-        m_svcResource->SetResource(sdres2, sdrdr2, NULL);
-
-        // point ldf
-        Ptr<MgResourceIdentifier> ldfres4 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Capitals.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc4 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyPoints.ldf", false);
-        Ptr<MgByteReader> ldfrdr4 = ldfsrc4->GetReader();
-        m_svcResource->SetResource(ldfres4, ldfrdr4, NULL);
-
-        Ptr<MgResourceIdentifier> ldfres5 = new MgResourceIdentifier(L"Library://UnitTests/Layers/CapitalsParam.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc5 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyPointsParam.ldf", false);
-        Ptr<MgByteReader> ldfrdr5 = ldfsrc5->GetReader();
-        m_svcResource->SetResource(ldfres5, ldfrdr5, NULL);
-
-        // point mdf
-        Ptr<MgResourceIdentifier> mapres2 = new MgResourceIdentifier(L"Library://UnitTests/Maps/Capitals.MapDefinition");
-        Ptr<MgByteSource> mdfsrc2 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyPoints.mdf", false);
-        Ptr<MgByteReader> mdfrdr2 = mdfsrc2->GetReader();
-        m_svcResource->SetResource(mapres2, mdfrdr2, NULL);
-
-        Ptr<MgResourceIdentifier> mapres3 = new MgResourceIdentifier(L"Library://UnitTests/Maps/CapitalsParam.MapDefinition");
-        Ptr<MgByteSource> mdfsrc3 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyPointsParam.mdf", false);
-        Ptr<MgByteReader> mdfrdr3 = mdfsrc3->GetReader();
-        m_svcResource->SetResource(mapres3, mdfrdr3, NULL);
-
-        // the line feature source
-        Ptr<MgResourceIdentifier> fsres5 = new MgResourceIdentifier(L"Library://UnitTests/Data/Lines.FeatureSource");
-        Ptr<MgByteSource> fssrc5 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyLines.fs", false);
-        Ptr<MgByteReader> fsrdr5 = fssrc5->GetReader();
-        m_svcResource->SetResource(fsres5, fsrdr5, NULL);
-
-        // line sdf file
-        Ptr<MgByteSource> dataSource5 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyLines.sdf", false);
-        Ptr<MgByteReader> dataReader5 = dataSource5->GetReader();
-        m_svcResource->SetResourceData(fsres5, L"UT_SymbologyLines.sdf", L"File", dataReader5);
-
-        // line symbols
-        Ptr<MgResourceIdentifier> sdres3 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/LineSymbol.SymbolDefinition");
-        Ptr<MgByteSource> sdsrc3 = new MgByteSource(L"../UnitTestFiles/linesymbol.sd", false);
-        Ptr<MgByteReader> sdrdr3 = sdsrc3->GetReader();
-        m_svcResource->SetResource(sdres3, sdrdr3, NULL);
-
-        Ptr<MgResourceIdentifier> sdres4 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/MTYP1500a.SymbolDefinition");
-        Ptr<MgByteSource> sdsrc4 = new MgByteSource(L"../UnitTestFiles/MTYP1500a.sd", false);
-        Ptr<MgByteReader> sdrdr4 = sdsrc4->GetReader();
-        m_svcResource->SetResource(sdres4, sdrdr4, NULL);
-
-        // line ldf
-        Ptr<MgResourceIdentifier> ldfres6 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Lines.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc6 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyLines.ldf", false);
-        Ptr<MgByteReader> ldfrdr6 = ldfsrc6->GetReader();
-        m_svcResource->SetResource(ldfres6, ldfrdr6, NULL);
-
-        Ptr<MgResourceIdentifier> ldfres7 = new MgResourceIdentifier(L"Library://UnitTests/Layers/LinesCrossTick.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc7 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyLinesCrossTick.ldf", false);
-        Ptr<MgByteReader> ldfrdr7 = ldfsrc7->GetReader();
-        m_svcResource->SetResource(ldfres7, ldfrdr7, NULL);
-
-        // line mdf
-        Ptr<MgResourceIdentifier> mapres4 = new MgResourceIdentifier(L"Library://UnitTests/Maps/Lines.MapDefinition");
-        Ptr<MgByteSource> mdfsrc4 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyLines.mdf", false);
-        Ptr<MgByteReader> mdfrdr4 = mdfsrc4->GetReader();
-        m_svcResource->SetResource(mapres4, mdfrdr4, NULL);
-
-        Ptr<MgResourceIdentifier> mapres5 = new MgResourceIdentifier(L"Library://UnitTests/Maps/LinesCrossTick.MapDefinition");
-        Ptr<MgByteSource> mdfsrc5 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyLinesCrossTick.mdf", false);
-        Ptr<MgByteReader> mdfrdr5 = mdfsrc5->GetReader();
-        m_svcResource->SetResource(mapres5, mdfrdr5, NULL);
-
-        // annotation ldf - this shares the point sdf
-        Ptr<MgResourceIdentifier> ldfres8 = new MgResourceIdentifier(L"Library://UnitTests/Layers/UT_Annotation1.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc8 = new MgByteSource(L"../UnitTestFiles/UT_Annotation1.ldf", false);
-        Ptr<MgByteReader> ldfrdr8 = ldfsrc8->GetReader();
-        m_svcResource->SetResource(ldfres8, ldfrdr8, NULL);
-
-        Ptr<MgResourceIdentifier> ldfres9 = new MgResourceIdentifier(L"Library://UnitTests/Layers/UT_Annotation2.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc9 = new MgByteSource(L"../UnitTestFiles/UT_Annotation2.ldf", false);
-        Ptr<MgByteReader> ldfrdr9 = ldfsrc9->GetReader();
-        m_svcResource->SetResource(ldfres9, ldfrdr9, NULL);
-
-        Ptr<MgResourceIdentifier> ldfres10 = new MgResourceIdentifier(L"Library://UnitTests/Layers/UT_Annotation3.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc10 = new MgByteSource(L"../UnitTestFiles/UT_Annotation3.ldf", false);
-        Ptr<MgByteReader> ldfrdr10 = ldfsrc10->GetReader();
-        m_svcResource->SetResource(ldfres10, ldfrdr10, NULL);
-
-        // annotation mdf
-        Ptr<MgResourceIdentifier> mapres8 = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_Annotation1.MapDefinition");
-        Ptr<MgByteSource> mdfsrc8 = new MgByteSource(L"../UnitTestFiles/UT_Annotation1.mdf", false);
-        Ptr<MgByteReader> mdfrdr8 = mdfsrc8->GetReader();
-        m_svcResource->SetResource(mapres8, mdfrdr8, NULL);
-
-        Ptr<MgResourceIdentifier> mapres9 = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_Annotation2.MapDefinition");
-        Ptr<MgByteSource> mdfsrc9 = new MgByteSource(L"../UnitTestFiles/UT_Annotation2.mdf", false);
-        Ptr<MgByteReader> mdfrdr9 = mdfsrc9->GetReader();
-        m_svcResource->SetResource(mapres9, mdfrdr9, NULL);
-
-        Ptr<MgResourceIdentifier> mapres10 = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_Annotation3.MapDefinition");
-        Ptr<MgByteSource> mdfsrc10 = new MgByteSource(L"../UnitTestFiles/UT_Annotation3.mdf", false);
-        Ptr<MgByteReader> mdfrdr10 = mdfsrc10->GetReader();
-        m_svcResource->SetResource(mapres10, mdfrdr10, NULL);
-
-        //symbology - polygons
-        Ptr<MgResourceIdentifier> mapres11 = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_SymbologyPolygons.MapDefinition");
-        Ptr<MgByteSource> mdfsrc11 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyPolygons.mdf", false);
-        Ptr<MgByteReader> mdfrdr11 = mdfsrc11->GetReader();
-        m_svcResource->SetResource(mapres11, mdfrdr11, NULL);
-
-        Ptr<MgResourceIdentifier> ldfres11 = new MgResourceIdentifier(L"Library://UnitTests/Layers/SymbologyParcels.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc11 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyParcels.ldf", false);
-        Ptr<MgByteReader> ldfrdr11 = ldfsrc11->GetReader();
-        m_svcResource->SetResource(ldfres11, ldfrdr11, NULL);
-
-        Ptr<MgResourceIdentifier> sdres5 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/AreaSymbol.SymbolDefinition");
-        Ptr<MgByteSource> sdsrc5 = new MgByteSource(L"../UnitTestFiles/areasymbol.sd", false);
-        Ptr<MgByteReader> sdrdr5 = sdsrc5->GetReader();
-        m_svcResource->SetResource(sdres5, sdrdr5, NULL);
-
-        // For watermark test
-        // publish the map definition
-        Ptr<MgResourceIdentifier> mapres12 = new MgResourceIdentifier(L"Library://UnitTests/Maps/SheboyganWithWatermark.MapDefinition");
-        Ptr<MgByteSource> mdfsrc12 = new MgByteSource(L"../UnitTestFiles/UT_SheboyganWithWatermark.mdf", false);
-        Ptr<MgByteReader> mdfrdr12 = mdfsrc12->GetReader();
-        m_svcResource->SetResource(mapres12, mdfrdr12, NULL);
-
-        // publish the watermark definition
-        Ptr<MgResourceIdentifier> wdfres1 = new MgResourceIdentifier(L"Library://UnitTests/Watermarks/PoweredByMapGuide.WatermarkDefinition");
-        Ptr<MgByteSource> wdfsrc1 = new MgByteSource(L"../UnitTestFiles/UT_PoweredByMapGuide.wdf", false);
-        Ptr<MgByteReader> wdfrdr1 = wdfsrc1->GetReader();
-        m_svcResource->SetResource(wdfres1, wdfrdr1, NULL);
-
-    }
-    catch (MgException* e)
-    {
-        STRING message = e->GetDetails(TEST_LOCALE);
-        SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
-    }
-    catch (...)
-    {
-        throw;
-    }
+    MgdSelection* selection = new MgdSelection(map, selectionStr);
+    return selection;
 }
 
-
-void TestProfilingService::TestEnd()
+TEST_CASE("ProfileRenderDynamicOverlay", "[ProfilingService]")
 {
     try
     {
-        // delete the map definition
-        Ptr<MgResourceIdentifier> mapres1 = new MgResourceIdentifier(L"Library://UnitTests/Maps/Sheboygan.MapDefinition");
-        m_svcResource->DeleteResource(mapres1);
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
 
-        // delete the layer definitions
-        Ptr<MgResourceIdentifier> ldfres1 = new MgResourceIdentifier(L"Library://UnitTests/Layers/HydrographicPolygons.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres1);
+        Ptr<MgdProfilingService> pService = dynamic_cast<MgdProfilingService*>(
+            factory->CreateService(MgServiceType::ProfilingService));
+        assert(pService.p != nullptr);
 
-        Ptr<MgResourceIdentifier> ldfres2 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Rail.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres2);
-
-        Ptr<MgResourceIdentifier> ldfres3 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Parcels.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres3);
-
-        // delete the feature sources
-        Ptr<MgResourceIdentifier> fsres1 = new MgResourceIdentifier(L"Library://UnitTests/Data/HydrographicPolygons.FeatureSource");
-        m_svcResource->DeleteResource(fsres1);
-
-        Ptr<MgResourceIdentifier> fsres2 = new MgResourceIdentifier(L"Library://UnitTests/Data/Rail.FeatureSource");
-        m_svcResource->DeleteResource(fsres2);
-
-        Ptr<MgResourceIdentifier> fsres3 = new MgResourceIdentifier(L"Library://UnitTests/Data/Parcels.FeatureSource");
-        m_svcResource->DeleteResource(fsres3);
-
-        // delete the print layouts
-        Ptr<MgResourceIdentifier> plres1 = new MgResourceIdentifier(L"Library://UnitTests/PrintLayouts/AllElements.PrintLayout");
-        m_svcResource->DeleteResource(plres1);
-
-        Ptr<MgResourceIdentifier> plres2 = new MgResourceIdentifier(L"Library://UnitTests/PrintLayouts/NoLegend.PrintLayout");
-        m_svcResource->DeleteResource(plres2);
-
-        // delete the symbol library
-        Ptr<MgResourceIdentifier> slres1 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/SymbolMart.SymbolLibrary");
-        m_svcResource->DeleteResource(slres1);
-
-        // delete symbology stuff
-        Ptr<MgResourceIdentifier> fsres4 = new MgResourceIdentifier(L"Library://UnitTests/Data/Capitals.FeatureSource");
-        m_svcResource->DeleteResource(fsres4);
-        Ptr<MgResourceIdentifier> sdres1 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/PointSymbol.SymbolDefinition");
-        m_svcResource->DeleteResource(sdres1);
-        Ptr<MgResourceIdentifier> sdres2 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/PointSymbolParam.SymbolDefinition");
-        m_svcResource->DeleteResource(sdres2);
-        Ptr<MgResourceIdentifier> ldfres4 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Capitals.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres4);
-        Ptr<MgResourceIdentifier> ldfres5 = new MgResourceIdentifier(L"Library://UnitTests/Layers/CapitalsParam.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres5);
-        Ptr<MgResourceIdentifier> mapres2 = new MgResourceIdentifier(L"Library://UnitTests/Maps/Capitals.MapDefinition");
-        m_svcResource->DeleteResource(mapres2);
-        Ptr<MgResourceIdentifier> mapres3 = new MgResourceIdentifier(L"Library://UnitTests/Maps/CapitalsParam.MapDefinition");
-        m_svcResource->DeleteResource(mapres3);
-
-        Ptr<MgResourceIdentifier> fsres5 = new MgResourceIdentifier(L"Library://UnitTests/Data/Lines.FeatureSource");
-        m_svcResource->DeleteResource(fsres5);
-        Ptr<MgResourceIdentifier> sdres3 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/LineSymbol.SymbolDefinition");
-        m_svcResource->DeleteResource(sdres3);
-        Ptr<MgResourceIdentifier> sdres4 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/MTYP1500a.SymbolDefinition");
-        m_svcResource->DeleteResource(sdres4);
-        Ptr<MgResourceIdentifier> ldfres6 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Lines.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres6);
-        Ptr<MgResourceIdentifier> ldfres7 = new MgResourceIdentifier(L"Library://UnitTests/Layers/LinesCrossTick.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres7);
-        Ptr<MgResourceIdentifier> mapres4 = new MgResourceIdentifier(L"Library://UnitTests/Maps/Lines.MapDefinition");
-        m_svcResource->DeleteResource(mapres4);
-        Ptr<MgResourceIdentifier> mapres5 = new MgResourceIdentifier(L"Library://UnitTests/Maps/LinesCrossTick.MapDefinition");
-        m_svcResource->DeleteResource(mapres5);
-
-        Ptr<MgResourceIdentifier> ldfres8 = new MgResourceIdentifier(L"Library://UnitTests/Layers/UT_Annotation1.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres8);
-        Ptr<MgResourceIdentifier> ldfres9 = new MgResourceIdentifier(L"Library://UnitTests/Layers/UT_Annotation2.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres9);
-        Ptr<MgResourceIdentifier> ldfres10 = new MgResourceIdentifier(L"Library://UnitTests/Layers/UT_Annotation3.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres10);
-        Ptr<MgResourceIdentifier> mapres8 = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_Annotation1.MapDefinition");
-        m_svcResource->DeleteResource(mapres8);
-        Ptr<MgResourceIdentifier> mapres9 = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_Annotation2.MapDefinition");
-        m_svcResource->DeleteResource(mapres9);
-        Ptr<MgResourceIdentifier> mapres10 = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_Annotation3.MapDefinition");
-        m_svcResource->DeleteResource(mapres10);
-
-        Ptr<MgResourceIdentifier> mapres11 = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_SymbologyPolygons.MapDefinition");
-        m_svcResource->DeleteResource(mapres11);
-        Ptr<MgResourceIdentifier> ldfres11 = new MgResourceIdentifier(L"Library://UnitTests/Layers/SymbologyParcels.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres11);
-        Ptr<MgResourceIdentifier> sdres5 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/AreaSymbol.SymbolDefinition");
-        m_svcResource->DeleteResource(sdres5);
-        
-        Ptr<MgResourceIdentifier> mapres12 = new MgResourceIdentifier(L"Library://UnitTests/Maps/SheboyganWithWatermark.MapDefinition");
-        m_svcResource->DeleteResource(mapres12);
-        Ptr<MgResourceIdentifier> wdfres1 = new MgResourceIdentifier(L"Library://UnitTests/Watermarks/PoweredByMapGuide.WatermarkDefinition");
-        m_svcResource->DeleteResource(wdfres1);
-    }
-    catch(MgFileIoException* e)
-    {
-        STRING message = e->GetDetails(TEST_LOCALE);
-        SAFE_RELEASE(e);
-        ACE_DEBUG((LM_INFO, ACE_TEXT("\nMgFileIoException - Possible file permission error.\nError: %W\n"), message.c_str()));
-    }
-    catch (MgException* e)
-    {
-        STRING message = e->GetDetails(TEST_LOCALE);
-        message += e->GetStackTrace(TEST_LOCALE);
-        SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
-    }
-    catch (...)
-    {
-        throw;
-    }
-
-    ACE_DEBUG((LM_INFO, ACE_TEXT("\nProfiling Service tests completed.\n\n")));
-}
-
-
-void TestProfilingService::TestCase_ProfileRenderDynamicOverlay()
-{
-    try
-    {
         // make a runtime normal map
         Ptr<MgdMap> map = CreateTestMap();
         Ptr<MgdSelection> selectionOnMap = CreateSelection(map);
@@ -427,29 +95,29 @@
         Ptr<MgdSelection> selectionOnMapWithWatermark = CreateSelection(mapWithWatermark);
 
         // make a rendering option
-        Ptr<MgdRenderingOptions> options = new MgdRenderingOptions(L"PNG",MgdRenderingOptions::RenderSelection| MgdRenderingOptions::RenderLayers| MgdRenderingOptions::KeepSelection,NULL);
+        Ptr<MgdRenderingOptions> options = new MgdRenderingOptions(L"PNG",MgdRenderingOptions::RenderSelection| MgdRenderingOptions::RenderLayers| MgdRenderingOptions::KeepSelection,nullptr);
         
         // profile rendering normal map
-        Ptr<MgByteReader> rdr1 = m_svcProfiling->ProfileRenderDynamicOverlay(map, NULL, options);
+        Ptr<MgByteReader> rdr1 = pService->ProfileRenderDynamicOverlay(map, nullptr, options);
         rdr1->ToFile(L"../UnitTestFiles/ProfileRenderDynamicOverlay_Normal.xml");
 
         // profile rendering normal map with selection
-        Ptr<MgByteReader> rdr2 = m_svcProfiling->ProfileRenderDynamicOverlay(map, selectionOnMap, options);
+        Ptr<MgByteReader> rdr2 = pService->ProfileRenderDynamicOverlay(map, selectionOnMap, options);
         rdr2->ToFile(L"../UnitTestFiles/ProfileRenderDynamicOverlay_Selection.xml");
 
         // profile rendering map with watermark
-        Ptr<MgByteReader> rdr3 = m_svcProfiling->ProfileRenderDynamicOverlay(mapWithWatermark, NULL, options);
+        Ptr<MgByteReader> rdr3 = pService->ProfileRenderDynamicOverlay(mapWithWatermark, nullptr, options);
         rdr3->ToFile(L"../UnitTestFiles/ProfileRenderDynamicOverlay_Watermark.xml");
 
         // profile rendering map with both watermark and selection
-        Ptr<MgByteReader> rdr4 = m_svcProfiling->ProfileRenderDynamicOverlay(mapWithWatermark, selectionOnMapWithWatermark, options);
+        Ptr<MgByteReader> rdr4 = pService->ProfileRenderDynamicOverlay(mapWithWatermark, selectionOnMapWithWatermark, options);
         rdr4->ToFile(L"../UnitTestFiles/ProfileRenderDynamicOverlay_Watermark_Selection.xml");
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -457,11 +125,16 @@
     }
 }
 
-
-void TestProfilingService::TestCase_ProfileRenderMap()
+TEST_CASE("ProfileRenderMap", "[ProfilingService]")
 {
     try
     {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdProfilingService> pService = dynamic_cast<MgdProfilingService*>(
+            factory->CreateService(MgServiceType::ProfilingService));
+        assert(pService.p != nullptr);
+
         // make a runtime normal map
         Ptr<MgdMap> map = CreateTestMap();
         Ptr<MgdSelection> selectionOnMap = CreateSelection(map);
@@ -471,32 +144,32 @@
         Ptr<MgdSelection> selectionOnMapWithWatermark = CreateSelection(mapWithWatermark);
 
         // make a rendering option
-        Ptr<MgdRenderingOptions> options = new MgdRenderingOptions(L"PNG",MgdRenderingOptions::RenderSelection| MgdRenderingOptions::RenderLayers| MgdRenderingOptions::KeepSelection,NULL);
+        Ptr<MgdRenderingOptions> options = new MgdRenderingOptions(L"PNG",MgdRenderingOptions::RenderSelection| MgdRenderingOptions::RenderLayers| MgdRenderingOptions::KeepSelection,nullptr);
 
         Ptr<MgCoordinate> coordNewCenter = new MgCoordinateXY(-87.733253, 43.746199);
         Ptr<MgColor> bgc = new MgColor(255, 255, 255, 255);
 
         // profile rendering normal map
-        Ptr<MgByteReader> rdr1 = m_svcProfiling->ProfileRenderMap(map, NULL, coordNewCenter, 75000, 1024, 1024, bgc, L"PNG", false);
+        Ptr<MgByteReader> rdr1 = pService->ProfileRenderMap(map, nullptr, coordNewCenter, 75000, 1024, 1024, bgc, L"PNG", false);
         rdr1->ToFile(L"../UnitTestFiles/ProfileRenderMap_Normal.xml");
 
         // profile rendering normal map with selection
-        Ptr<MgByteReader> rdr2 = m_svcProfiling->ProfileRenderMap(map, selectionOnMap, coordNewCenter, 75000, 1024, 1024, bgc, L"PNG", false);
+        Ptr<MgByteReader> rdr2 = pService->ProfileRenderMap(map, selectionOnMap, coordNewCenter, 75000, 1024, 1024, bgc, L"PNG", false);
         rdr2->ToFile(L"../UnitTestFiles/ProfileRenderMap_Selection.xml");
 
         // profile rendering normal map with watermark
-        Ptr<MgByteReader> rdr3 = m_svcProfiling->ProfileRenderMap(mapWithWatermark, NULL, coordNewCenter, 75000, 1024, 1024, bgc, L"PNG", false);
+        Ptr<MgByteReader> rdr3 = pService->ProfileRenderMap(mapWithWatermark, nullptr, coordNewCenter, 75000, 1024, 1024, bgc, L"PNG", false);
         rdr3->ToFile(L"../UnitTestFiles/ProfileRenderMap_Watermark.xml");
 
         // profile rendering normal map with watermark
-        Ptr<MgByteReader> rdr4 = m_svcProfiling->ProfileRenderMap(mapWithWatermark, selectionOnMapWithWatermark, coordNewCenter, 75000, 1024, 1024, bgc, L"PNG", false);
+        Ptr<MgByteReader> rdr4 = pService->ProfileRenderMap(mapWithWatermark, selectionOnMapWithWatermark, coordNewCenter, 75000, 1024, 1024, bgc, L"PNG", false);
         rdr4->ToFile(L"../UnitTestFiles/ProfileRenderMap_Watermark_Selection.xml");
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -503,58 +176,3 @@
         throw;
     }
 }
-
-MgdMap* TestProfilingService::CreateTestMap()
-{
-    Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/Sheboygan.MapDefinition");
-    MgdMap* map = new MgdMap(mdfres, L"UnitTestSheboygan");
-
-    Ptr<MgCoordinate> coordNewCenter = new MgCoordinateXY(-87.733253, 43.746199);
-    Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
-    map->SetViewCenter(ptNewCenter);
-    map->SetViewScale(75000.0);
-    map->SetDisplayDpi(96);
-    map->SetDisplayWidth(1024);
-    map->SetDisplayHeight(1024);
-
-    return map;
-}
-
-MgdMap* TestProfilingService::CreateTestMapWithWatermark()
-{
-    Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/SheboyganWithWatermark.MapDefinition");
-    MgdMap* map = new MgdMap(mdfres, L"UnitTestSheboyganWithWatermark");
-
-    Ptr<MgCoordinate> coordNewCenter = new MgCoordinateXY(-87.733253, 43.746199);
-    Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
-    map->SetViewCenter(ptNewCenter);
-    map->SetViewScale(75000.0);
-    map->SetDisplayDpi(96);
-    map->SetDisplayWidth(1024);
-    map->SetDisplayHeight(1024);
-
-    return map;
-}
-
-MgdSelection* TestProfilingService::CreateSelection(MgdMap* map)
-{
-    // make a selection in normal map
-    STRING layerId;
-    Ptr<MgLayerCollection> layers = map->GetLayers();
-
-    for (int i=0; i<layers->GetCount(); i++)
-    {
-        Ptr<MgLayerBase> layer = layers->GetItem(i);
-        if(L"HydrographicPolygons" ==layer->GetName())
-        {
-            layerId = layer->GetObjectId();
-        }
-    }
-    STRING selectionStr = L"<?xml version=\"1.0\" encoding=\"UTF-8\"?><FeatureSet><Layer id=\"";
-    selectionStr.append(layerId);
-    selectionStr.append(L"\"><Class id=\"SHP_Schema:HydrographicPolygons\"><ID>HQAAAA==</ID></Class></Layer></FeatureSet>");
-
-    MgdSelection* selection = new MgdSelection(map, selectionStr);
-    return selection;
-}
-

Deleted: sandbox/jng/catch2/Desktop/UnitTest/TestProfilingService.h
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/TestProfilingService.h	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/UnitTest/TestProfilingService.h	2020-07-15 16:00:34 UTC (rev 9675)
@@ -1,56 +0,0 @@
-//
-//  Copyright (C) 2011 by Autodesk, Inc.
-//
-//  This library is free software; you can redistribute it and/or
-//  modify it under the terms of version 2.1 of the GNU Lesser
-//  General Public License as published by the Free Software Foundation.
-//
-//  This library 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
-//  Lesser General Public License for more details.
-//
-//  You should have received a copy of the GNU Lesser General Public
-//  License along with this library; if not, write to the Free Software
-//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-//
-
-#ifndef _TESTPROFILINGSERVICE_H
-#define _TESTPROFILINGSERVICE_H
-
-#include <cppunit/extensions/HelperMacros.h>
-
-class TestProfilingService : public CppUnit::TestFixture
-{
-    CPPUNIT_TEST_SUITE(TestProfilingService);
-    CPPUNIT_TEST(TestStart); // This must be the very first unit test
-
-    CPPUNIT_TEST(TestCase_ProfileRenderDynamicOverlay);
-    CPPUNIT_TEST(TestCase_ProfileRenderMap);
-
-    CPPUNIT_TEST(TestEnd); // This must be the very last unit test
-    CPPUNIT_TEST_SUITE_END();
-
-public:
-    TestProfilingService();
-    ~TestProfilingService();
-
-    void setUp();
-    void tearDown();
-    void TestStart();
-    void TestEnd();
-
-    void TestCase_ProfileRenderDynamicOverlay();
-    void TestCase_ProfileRenderMap();
-
-private:
-    MgdMap* CreateTestMap();
-    MgdMap* CreateTestMapWithWatermark();
-    MgdSelection* CreateSelection(MgdMap* map);
-
-private:
-    Ptr<MgResourceService> m_svcResource;
-    Ptr<MgdProfilingService> m_svcProfiling;
-};
-
-#endif // _TESTPROFILINGSERVICE_H

Modified: sandbox/jng/catch2/Desktop/UnitTest/TestRenderingService.cpp
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/TestRenderingService.cpp	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/UnitTest/TestRenderingService.cpp	2020-07-15 16:00:34 UTC (rev 9675)
@@ -16,536 +16,126 @@
 //
 
 #include "MgDesktop.h"
-#include "TestRenderingService.h"
 #include "StylizationDefs.h"
-//#include "GDRenderer.h"
-//#include "AGGRenderer.h"
 
-const STRING TEST_LOCALE = L"en";
+#include "CatchHelperMacros.h"
+#include "TestServiceFactory.h"
+#include "catch.hpp"
 
-CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(TestRenderingService, "TestRenderingService");
-
-
-TestRenderingService::TestRenderingService()
+static STRING GetPath(CREFSTRING basePath, CREFSTRING imageFormat, CREFSTRING extension)
 {
-    Ptr<MgdServiceFactory> fact = new MgdServiceFactory();
-
-    // Initialize service objects.
-    m_svcResource = static_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
-    m_svcRendering = static_cast<MgdRenderingService*>(fact->CreateService(MgServiceType::RenderingService));
+    STRING ret;
+    ret += basePath;
+    ret += L"_";
+    ret += imageFormat;
+    ret += L".";
+    ret += extension;
+    return ret;
 }
 
-
-TestRenderingService::~TestRenderingService()
+static MgdMap* CreateTestMapWithWatermark()
 {
-}
+    Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/SheboyganWithWatermark.MapDefinition");
+    MgdMap* map = new MgdMap(mdfres);
+    //map->Create(mdfres, L"UnitTestSheboyganWithWatermark");
 
+    Ptr<MgCoordinate> coordNewCenter = new MgCoordinateXY(-87.733253, 43.746199);
+    Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
+    map->SetViewCenter(ptNewCenter);
+    map->SetViewScale(75000.0);
+    map->SetDisplayDpi(96);
+    map->SetDisplayWidth(1024);
+    map->SetDisplayHeight(1024);
 
-void TestRenderingService::setUp()
-{
+    return map;
 }
 
+static MgdMap* CreateTestMap()
+{
+    Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/Sheboygan.MapDefinition");
+    MgdMap* map = new MgdMap(mdfres);
+    //map->Create(mdfres, L"UnitTestSheboygan");
 
-void TestRenderingService::tearDown()
-{
+    Ptr<MgCoordinate> coordNewCenter = new MgCoordinateXY(-87.733253, 43.746199);
+    Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
+    map->SetViewCenter(ptNewCenter);
+    map->SetViewScale(75000.0);
+    map->SetDisplayDpi(96);
+    map->SetDisplayWidth(1024);
+    map->SetDisplayHeight(1024);
+
+    return map;
 }
 
-
-void TestRenderingService::TestStart()
+static MgdMap* CreateTestStylizationFunctionMap()
 {
-    ACE_DEBUG((LM_INFO, ACE_TEXT("\nRunning Rendering Service tests.\n")));
+    Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/StylizationFuncs.MapDefinition");
+    MgdMap* map = new MgdMap(mdfres);
+    //map->Create(mdfres, L"StylizationFuncs");
 
-    try
-    {
-        // publish the map definition
-        Ptr<MgResourceIdentifier> mapres1 = new MgResourceIdentifier(L"Library://UnitTests/Maps/Sheboygan.MapDefinition");
-        Ptr<MgByteSource> mdfsrc1 = new MgByteSource(L"../UnitTestFiles/UT_Sheboygan.mdf", false);
-        Ptr<MgByteReader> mdfrdr1 = mdfsrc1->GetReader();
-        m_svcResource->SetResource(mapres1, mdfrdr1, NULL);
+    Ptr<MgCoordinate> coordNewCenter = new MgCoordinateXY(-87.733253, 43.746199);
+    Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
+    map->SetViewCenter(ptNewCenter);
+    map->SetViewScale(60000.0);
+    map->SetDisplayDpi(96);
+    map->SetDisplayWidth(1024);
+    map->SetDisplayHeight(1024);
 
-        // publish the layer definitions
-        Ptr<MgResourceIdentifier> ldfres1 = new MgResourceIdentifier(L"Library://UnitTests/Layers/HydrographicPolygons.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc1 = new MgByteSource(L"../UnitTestFiles/UT_HydrographicPolygons.ldf", false);
-        Ptr<MgByteReader> ldfrdr1 = ldfsrc1->GetReader();
-        m_svcResource->SetResource(ldfres1, ldfrdr1, NULL);
+    return map;
+}
 
-        Ptr<MgResourceIdentifier> ldfres2 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Rail.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc2 = new MgByteSource(L"../UnitTestFiles/UT_Rail.ldf", false);
-        Ptr<MgByteReader> ldfrdr2 = ldfsrc2->GetReader();
-        m_svcResource->SetResource(ldfres2, ldfrdr2, NULL);
+static MgdMap* CreateTestTiledMap()
+{
+    Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/BaseMap.MapDefinition");
+    MgdMap* map = new MgdMap(mdfres, L"UnitTestSheboyganTiled");
 
-        Ptr<MgResourceIdentifier> ldfres3 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Parcels.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc3 = new MgByteSource(L"../UnitTestFiles/UT_Parcels.ldf", false);
-        Ptr<MgByteReader> ldfrdr3 = ldfsrc3->GetReader();
-        m_svcResource->SetResource(ldfres3, ldfrdr3, NULL);
+    Ptr<MgCoordinate> coordNewCenter = new MgCoordinateXY(-87.733253, 43.746199);
+    Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
+    map->SetViewCenter(ptNewCenter);
+    map->SetViewScale(75000.0);
+    map->SetDisplayDpi(96);
+    map->SetDisplayWidth(1024);
+    map->SetDisplayHeight(1024);
 
-        // publish the feature sources
-        Ptr<MgResourceIdentifier> fsres1 = new MgResourceIdentifier(L"Library://UnitTests/Data/HydrographicPolygons.FeatureSource");
-        Ptr<MgByteSource> fssrc1 = new MgByteSource(L"../UnitTestFiles/UT_HydrographicPolygons.fs", false);
-        Ptr<MgByteReader> fsrdr1 = fssrc1->GetReader();
-        m_svcResource->SetResource(fsres1, fsrdr1, NULL);
+    return map;
+}
 
-        Ptr<MgResourceIdentifier> fsres2 = new MgResourceIdentifier(L"Library://UnitTests/Data/Rail.FeatureSource");
-        Ptr<MgByteSource> fssrc2 = new MgByteSource(L"../UnitTestFiles/UT_Rail.fs", false);
-        Ptr<MgByteReader> fsrdr2 = fssrc2->GetReader();
-        m_svcResource->SetResource(fsres2, fsrdr2, NULL);
+// creates a selection bounds in mapping space
+static MgPolygon* CreateSelectionPolygon(MgdMap* map, double width, double height)
+{
+    Ptr<MgPoint> centerPt = map->GetViewCenter();
+    Ptr<MgCoordinate> center = centerPt->GetCoordinate();
+    double xMin = center->GetX() - 0.5 * width;
+    double yMin = center->GetY() - 0.5 * height;
+    double xMax = center->GetX() + 0.5 * width;
+    double yMax = center->GetY() + 0.5 * height;
+    Ptr<MgCoordinateXY> c1 = new MgCoordinateXY(xMin, yMin);
+    Ptr<MgCoordinateXY> c2 = new MgCoordinateXY(xMax, yMin);
+    Ptr<MgCoordinateXY> c3 = new MgCoordinateXY(xMax, yMax);
+    Ptr<MgCoordinateXY> c4 = new MgCoordinateXY(xMin, yMax);
+    Ptr<MgCoordinateXY> c5 = new MgCoordinateXY(xMin, yMin);
 
-        Ptr<MgResourceIdentifier> fsres3 = new MgResourceIdentifier(L"Library://UnitTests/Data/Parcels.FeatureSource");
-        Ptr<MgByteSource> fssrc3 = new MgByteSource(L"../UnitTestFiles/UT_Parcels.fs", false);
-        Ptr<MgByteReader> fsrdr3 = fssrc3->GetReader();
-        m_svcResource->SetResource(fsres3, fsrdr3, NULL);
+    Ptr<MgCoordinateCollection> cc = new MgCoordinateCollection();
+    cc->Add(c1);
+    cc->Add(c2);
+    cc->Add(c3);
+    cc->Add(c4);
+    cc->Add(c5);
 
-        // publish the resource data
-        Ptr<MgByteSource> dataSource1 = new MgByteSource(L"../UnitTestFiles/UT_HydrographicPolygons.sdf", false);
-        Ptr<MgByteReader> dataReader1 = dataSource1->GetReader();
-        m_svcResource->SetResourceData(fsres1, L"UT_HydrographicPolygons.sdf", L"File", dataReader1);
-
-        Ptr<MgByteSource> dataSource2 = new MgByteSource(L"../UnitTestFiles/UT_Rail.sdf", false);
-        Ptr<MgByteReader> dataReader2 = dataSource2->GetReader();
-        m_svcResource->SetResourceData(fsres2, L"UT_Rail.sdf", L"File", dataReader2);
-
-        Ptr<MgByteSource> dataSource3 = new MgByteSource(L"../UnitTestFiles/UT_Parcels.sdf", false);
-        Ptr<MgByteReader> dataReader3 = dataSource3->GetReader();
-        m_svcResource->SetResourceData(fsres3, L"UT_Parcels.sdf", L"File", dataReader3);
-
-        // publish the print layouts
-        Ptr<MgResourceIdentifier> plres1 = new MgResourceIdentifier(L"Library://UnitTests/PrintLayouts/AllElements.PrintLayout");
-        Ptr<MgByteSource> plsrc1 = new MgByteSource(L"../UnitTestFiles/UT_AllElements.pl", false);
-        Ptr<MgByteReader> plrdr1 = plsrc1->GetReader();
-        m_svcResource->SetResource(plres1, plrdr1, NULL);
-
-        Ptr<MgResourceIdentifier> plres2 = new MgResourceIdentifier(L"Library://UnitTests/PrintLayouts/NoLegend.PrintLayout");
-        Ptr<MgByteSource> plsrc2 = new MgByteSource(L"../UnitTestFiles/UT_NoLegend.pl", false);
-        Ptr<MgByteReader> plrdr2 = plsrc2->GetReader();
-        m_svcResource->SetResource(plres2, plrdr2, NULL);
-
-        // publish the symbol library
-        Ptr<MgResourceIdentifier> slres1 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/SymbolMart.SymbolLibrary");
-        Ptr<MgByteSource> slsrc1 = new MgByteSource(L"../UnitTestFiles/UT_SymbolMart.sl", false);
-        Ptr<MgByteReader> slrdr1 = slsrc1->GetReader();
-        m_svcResource->SetResource(slres1, slrdr1, NULL);
-        Ptr<MgByteSource> datasrc = new MgByteSource(L"../UnitTestFiles/UT_Symbols.dwf", false);
-        Ptr<MgByteReader> datardr = datasrc->GetReader();
-        m_svcResource->SetResourceData(slres1, L"symbols.dwf", L"File", datardr);
-
-        //
-        // publish symbology stuff
-        //
-
-        // the point feature source
-        Ptr<MgResourceIdentifier> fsres4 = new MgResourceIdentifier(L"Library://UnitTests/Data/Capitals.FeatureSource");
-        Ptr<MgByteSource> fssrc4 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyPoints.fs", false);
-        Ptr<MgByteReader> fsrdr4 = fssrc4->GetReader();
-        m_svcResource->SetResource(fsres4, fsrdr4, NULL);
-
-        // point sdf file
-        Ptr<MgByteSource> dataSource4 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyPoints.sdf", false);
-        Ptr<MgByteReader> dataReader4 = dataSource4->GetReader();
-        m_svcResource->SetResourceData(fsres4, L"UT_SymbologyPoints.sdf", L"File", dataReader4);
-
-        // point symbols
-        Ptr<MgResourceIdentifier> sdres1 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/PointSymbol.SymbolDefinition");
-        Ptr<MgByteSource> sdsrc1 = new MgByteSource(L"../UnitTestFiles/symbol.sd", false);
-        Ptr<MgByteReader> sdrdr1 = sdsrc1->GetReader();
-        m_svcResource->SetResource(sdres1, sdrdr1, NULL);
-
-        Ptr<MgResourceIdentifier> sdres2 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/PointSymbolParam.SymbolDefinition");
-        Ptr<MgByteSource> sdsrc2 = new MgByteSource(L"../UnitTestFiles/symbolp.sd", false);
-        Ptr<MgByteReader> sdrdr2 = sdsrc2->GetReader();
-        m_svcResource->SetResource(sdres2, sdrdr2, NULL);
-
-        // point ldf
-        Ptr<MgResourceIdentifier> ldfres4 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Capitals.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc4 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyPoints.ldf", false);
-        Ptr<MgByteReader> ldfrdr4 = ldfsrc4->GetReader();
-        m_svcResource->SetResource(ldfres4, ldfrdr4, NULL);
-
-        Ptr<MgResourceIdentifier> ldfres5 = new MgResourceIdentifier(L"Library://UnitTests/Layers/CapitalsParam.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc5 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyPointsParam.ldf", false);
-        Ptr<MgByteReader> ldfrdr5 = ldfsrc5->GetReader();
-        m_svcResource->SetResource(ldfres5, ldfrdr5, NULL);
-
-        // point mdf
-        Ptr<MgResourceIdentifier> mapres2 = new MgResourceIdentifier(L"Library://UnitTests/Maps/Capitals.MapDefinition");
-        Ptr<MgByteSource> mdfsrc2 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyPoints.mdf", false);
-        Ptr<MgByteReader> mdfrdr2 = mdfsrc2->GetReader();
-        m_svcResource->SetResource(mapres2, mdfrdr2, NULL);
-
-        Ptr<MgResourceIdentifier> mapres3 = new MgResourceIdentifier(L"Library://UnitTests/Maps/CapitalsParam.MapDefinition");
-        Ptr<MgByteSource> mdfsrc3 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyPointsParam.mdf", false);
-        Ptr<MgByteReader> mdfrdr3 = mdfsrc3->GetReader();
-        m_svcResource->SetResource(mapres3, mdfrdr3, NULL);
-
-        // the line feature source
-        Ptr<MgResourceIdentifier> fsres5 = new MgResourceIdentifier(L"Library://UnitTests/Data/Lines.FeatureSource");
-        Ptr<MgByteSource> fssrc5 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyLines.fs", false);
-        Ptr<MgByteReader> fsrdr5 = fssrc5->GetReader();
-        m_svcResource->SetResource(fsres5, fsrdr5, NULL);
-
-        // line sdf file
-        Ptr<MgByteSource> dataSource5 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyLines.sdf", false);
-        Ptr<MgByteReader> dataReader5 = dataSource5->GetReader();
-        m_svcResource->SetResourceData(fsres5, L"UT_SymbologyLines.sdf", L"File", dataReader5);
-
-        // line symbols
-        Ptr<MgResourceIdentifier> sdres3 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/LineSymbol.SymbolDefinition");
-        Ptr<MgByteSource> sdsrc3 = new MgByteSource(L"../UnitTestFiles/linesymbol.sd", false);
-        Ptr<MgByteReader> sdrdr3 = sdsrc3->GetReader();
-        m_svcResource->SetResource(sdres3, sdrdr3, NULL);
-
-        Ptr<MgResourceIdentifier> sdres4 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/MTYP1500a.SymbolDefinition");
-        Ptr<MgByteSource> sdsrc4 = new MgByteSource(L"../UnitTestFiles/MTYP1500a.sd", false);
-        Ptr<MgByteReader> sdrdr4 = sdsrc4->GetReader();
-        m_svcResource->SetResource(sdres4, sdrdr4, NULL);
-
-        // line ldf
-        Ptr<MgResourceIdentifier> ldfres6 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Lines.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc6 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyLines.ldf", false);
-        Ptr<MgByteReader> ldfrdr6 = ldfsrc6->GetReader();
-        m_svcResource->SetResource(ldfres6, ldfrdr6, NULL);
-
-        Ptr<MgResourceIdentifier> ldfres7 = new MgResourceIdentifier(L"Library://UnitTests/Layers/LinesCrossTick.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc7 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyLinesCrossTick.ldf", false);
-        Ptr<MgByteReader> ldfrdr7 = ldfsrc7->GetReader();
-        m_svcResource->SetResource(ldfres7, ldfrdr7, NULL);
-
-        // line mdf
-        Ptr<MgResourceIdentifier> mapres4 = new MgResourceIdentifier(L"Library://UnitTests/Maps/Lines.MapDefinition");
-        Ptr<MgByteSource> mdfsrc4 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyLines.mdf", false);
-        Ptr<MgByteReader> mdfrdr4 = mdfsrc4->GetReader();
-        m_svcResource->SetResource(mapres4, mdfrdr4, NULL);
-
-        Ptr<MgResourceIdentifier> mapres5 = new MgResourceIdentifier(L"Library://UnitTests/Maps/LinesCrossTick.MapDefinition");
-        Ptr<MgByteSource> mdfsrc5 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyLinesCrossTick.mdf", false);
-        Ptr<MgByteReader> mdfrdr5 = mdfsrc5->GetReader();
-        m_svcResource->SetResource(mapres5, mdfrdr5, NULL);
-
-        // annotation ldf - this shares the point sdf
-        Ptr<MgResourceIdentifier> ldfres8 = new MgResourceIdentifier(L"Library://UnitTests/Layers/UT_Annotation1.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc8 = new MgByteSource(L"../UnitTestFiles/UT_Annotation1.ldf", false);
-        Ptr<MgByteReader> ldfrdr8 = ldfsrc8->GetReader();
-        m_svcResource->SetResource(ldfres8, ldfrdr8, NULL);
-
-        Ptr<MgResourceIdentifier> ldfres9 = new MgResourceIdentifier(L"Library://UnitTests/Layers/UT_Annotation2.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc9 = new MgByteSource(L"../UnitTestFiles/UT_Annotation2.ldf", false);
-        Ptr<MgByteReader> ldfrdr9 = ldfsrc9->GetReader();
-        m_svcResource->SetResource(ldfres9, ldfrdr9, NULL);
-
-        Ptr<MgResourceIdentifier> ldfres10 = new MgResourceIdentifier(L"Library://UnitTests/Layers/UT_Annotation3.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc10 = new MgByteSource(L"../UnitTestFiles/UT_Annotation3.ldf", false);
-        Ptr<MgByteReader> ldfrdr10 = ldfsrc10->GetReader();
-        m_svcResource->SetResource(ldfres10, ldfrdr10, NULL);
-
-        // annotation mdf
-        Ptr<MgResourceIdentifier> mapres8 = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_Annotation1.MapDefinition");
-        Ptr<MgByteSource> mdfsrc8 = new MgByteSource(L"../UnitTestFiles/UT_Annotation1.mdf", false);
-        Ptr<MgByteReader> mdfrdr8 = mdfsrc8->GetReader();
-        m_svcResource->SetResource(mapres8, mdfrdr8, NULL);
-
-        Ptr<MgResourceIdentifier> mapres9 = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_Annotation2.MapDefinition");
-        Ptr<MgByteSource> mdfsrc9 = new MgByteSource(L"../UnitTestFiles/UT_Annotation2.mdf", false);
-        Ptr<MgByteReader> mdfrdr9 = mdfsrc9->GetReader();
-        m_svcResource->SetResource(mapres9, mdfrdr9, NULL);
-
-        Ptr<MgResourceIdentifier> mapres10 = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_Annotation3.MapDefinition");
-        Ptr<MgByteSource> mdfsrc10 = new MgByteSource(L"../UnitTestFiles/UT_Annotation3.mdf", false);
-        Ptr<MgByteReader> mdfrdr10 = mdfsrc10->GetReader();
-        m_svcResource->SetResource(mapres10, mdfrdr10, NULL);
-
-        //symbology - polygons
-        Ptr<MgResourceIdentifier> mapres11 = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_SymbologyPolygons.MapDefinition");
-        Ptr<MgByteSource> mdfsrc11 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyPolygons.mdf", false);
-        Ptr<MgByteReader> mdfrdr11 = mdfsrc11->GetReader();
-        m_svcResource->SetResource(mapres11, mdfrdr11, NULL);
-
-        Ptr<MgResourceIdentifier> ldfres11 = new MgResourceIdentifier(L"Library://UnitTests/Layers/SymbologyParcels.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc11 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyParcels.ldf", false);
-        Ptr<MgByteReader> ldfrdr11 = ldfsrc11->GetReader();
-        m_svcResource->SetResource(ldfres11, ldfrdr11, NULL);
-
-        Ptr<MgResourceIdentifier> sdres5 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/AreaSymbol.SymbolDefinition");
-        Ptr<MgByteSource> sdsrc5 = new MgByteSource(L"../UnitTestFiles/areasymbol.sd", false);
-        Ptr<MgByteReader> sdrdr5 = sdsrc5->GetReader();
-        m_svcResource->SetResource(sdres5, sdrdr5, NULL);
-
-        // For watermark test
-        // publish the map definition
-        Ptr<MgResourceIdentifier> mapres12 = new MgResourceIdentifier(L"Library://UnitTests/Maps/SheboyganWithWatermark.MapDefinition");
-        Ptr<MgByteSource> mdfsrc12 = new MgByteSource(L"../UnitTestFiles/UT_SheboyganWithWatermark.mdf", false);
-        Ptr<MgByteReader> mdfrdr12 = mdfsrc12->GetReader();
-        m_svcResource->SetResource(mapres12, mdfrdr12, NULL);
-
-        // publish the watermark definition
-        Ptr<MgResourceIdentifier> wdfres1 = new MgResourceIdentifier(L"Library://UnitTests/Watermarks/PoweredByMapGuide.WatermarkDefinition");
-        Ptr<MgByteSource> wdfsrc1 = new MgByteSource(L"../UnitTestFiles/UT_PoweredByMapGuide.wdf", false);
-        Ptr<MgByteReader> wdfrdr1 = wdfsrc1->GetReader();
-        m_svcResource->SetResource(wdfres1, wdfrdr1, NULL);
-
-        // ------------------------------------------------------
-        // base map source data
-        // ------------------------------------------------------
-        // publish the map definition
-        Ptr<MgResourceIdentifier> mapres13 = new MgResourceIdentifier(L"Library://UnitTests/Maps/BaseMap.MapDefinition");
-        Ptr<MgByteSource> mdfsrc13 = new MgByteSource(L"../UnitTestFiles/UT_BaseMap.mdf", false);
-        Ptr<MgByteReader> mdfrdr13 = mdfsrc13->GetReader();
-        m_svcResource->SetResource(mapres13, mdfrdr13, NULL);
-
-        // publish the layer definitions
-        Ptr<MgResourceIdentifier> ldfres12 = new MgResourceIdentifier(L"Library://UnitTests/Layers/RoadCenterLines.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc12 = new MgByteSource(L"../UnitTestFiles/UT_RoadCenterLines.ldf", false);
-        Ptr<MgByteReader> ldfrdr12 = ldfsrc12->GetReader();
-        m_svcResource->SetResource(ldfres12, ldfrdr12, NULL);
-
-        Ptr<MgResourceIdentifier> ldfres13 = new MgResourceIdentifier(L"Library://UnitTests/Layers/VotingDistricts.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc13 = new MgByteSource(L"../UnitTestFiles/UT_VotingDistricts.ldf", false);
-        Ptr<MgByteReader> ldfrdr13 = ldfsrc13->GetReader();
-        m_svcResource->SetResource(ldfres13, ldfrdr13, NULL);
-
-        // publish the feature sources
-        Ptr<MgResourceIdentifier> fsres6 = new MgResourceIdentifier(L"Library://UnitTests/Data/RoadCenterLines.FeatureSource");
-        Ptr<MgByteSource> fssrc6 = new MgByteSource(L"../UnitTestFiles/UT_RoadCenterLines.fs", false);
-        Ptr<MgByteReader> fsrdr6 = fssrc6->GetReader();
-        m_svcResource->SetResource(fsres6, fsrdr6, NULL);
-
-        Ptr<MgResourceIdentifier> fsres7 = new MgResourceIdentifier(L"Library://UnitTests/Data/VotingDistricts.FeatureSource");
-        Ptr<MgByteSource> fssrc7 = new MgByteSource(L"../UnitTestFiles/UT_VotingDistricts.fs", false);
-        Ptr<MgByteReader> fsrdr7 = fssrc7->GetReader();
-        m_svcResource->SetResource(fsres7, fsrdr7, NULL);
-
-        // publish the resource data
-        Ptr<MgByteSource> dataSource6 = new MgByteSource(L"../UnitTestFiles/UT_RoadCenterLines.sdf", false);
-        Ptr<MgByteReader> dataReader6 = dataSource6->GetReader();
-        m_svcResource->SetResourceData(fsres6, L"UT_RoadCenterLines.sdf", L"File", dataReader6);
-
-        Ptr<MgByteSource> dataSource7 = new MgByteSource(L"../UnitTestFiles/UT_VotingDistricts.sdf", false);
-        Ptr<MgByteReader> dataReader7 = dataSource7->GetReader();
-        m_svcResource->SetResourceData(fsres7, L"UT_VotingDistricts.sdf", L"File", dataReader7);
-
-        // ---------------------------------------------------------
-        // Data for exercising legend rendering
-        // ---------------------------------------------------------
-        Ptr<MgResourceIdentifier> ldfres14 = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiFTS.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc14 = new MgByteSource(L"../UnitTestFiles/UT_MultiFTS.ldf", false);
-        Ptr<MgByteReader> ldfrdr14 = ldfsrc14->GetReader();
-        m_svcResource->SetResource(ldfres14, ldfrdr14, NULL);
-
-        Ptr<MgResourceIdentifier> ldfres15 = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiCTS.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc15 = new MgByteSource(L"../UnitTestFiles/UT_MultiCTS.ldf", false);
-        Ptr<MgByteReader> ldfrdr15 = ldfsrc15->GetReader();
-        m_svcResource->SetResource(ldfres15, ldfrdr15, NULL);
-
-        Ptr<MgResourceIdentifier> ldfres16 = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiFTSWithTheme.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc16 = new MgByteSource(L"../UnitTestFiles/UT_MultiFTSWithTheme.ldf", false);
-        Ptr<MgByteReader> ldfrdr16 = ldfsrc16->GetReader();
-        m_svcResource->SetResource(ldfres16, ldfrdr16, NULL);
-
-        Ptr<MgResourceIdentifier> ldfres17 = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiCTSWithTheme.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc17 = new MgByteSource(L"../UnitTestFiles/UT_MultiCTSWithTheme.ldf", false);
-        Ptr<MgByteReader> ldfrdr17 = ldfsrc17->GetReader();
-        m_svcResource->SetResource(ldfres17, ldfrdr17, NULL);
-
-        Ptr<MgResourceIdentifier> ldfres18 = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiFTSSingleCTS.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc18 = new MgByteSource(L"../UnitTestFiles/UT_MultiFTSSingleCTS.ldf", false);
-        Ptr<MgByteReader> ldfrdr18 = ldfsrc18->GetReader();
-        m_svcResource->SetResource(ldfres18, ldfrdr18, NULL);
-
-        Ptr<MgResourceIdentifier> ldfres19 = new MgResourceIdentifier(L"Library://UnitTests/Layers/SingleFTSMultiCTS.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc19 = new MgByteSource(L"../UnitTestFiles/UT_SingleFTSMultiCTS.ldf", false);
-        Ptr<MgByteReader> ldfrdr19 = ldfsrc19->GetReader();
-        m_svcResource->SetResource(ldfres19, ldfrdr19, NULL);
-
-        // Data related to stylization function tests
-        Ptr<MgResourceIdentifier> ldfres20 = new MgResourceIdentifier(L"Library://UnitTests/Layers/StylizationFuncs.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc20 = new MgByteSource(L"../UnitTestFiles/UT_VotingDistrictsFunctions.ldf", false);
-        Ptr<MgByteReader> ldfrdr20 = ldfsrc20->GetReader();
-        m_svcResource->SetResource(ldfres20, ldfrdr20, NULL);
-
-        Ptr<MgResourceIdentifier> mapres15 = new MgResourceIdentifier(L"Library://UnitTests/Maps/StylizationFuncs.MapDefinition");
-        Ptr<MgByteSource> mdfsrc15 = new MgByteSource(L"../UnitTestFiles/UT_StylizationFuncs.mdf", false);
-        Ptr<MgByteReader> mdfrdr15 = mdfsrc15->GetReader();
-        m_svcResource->SetResource(mapres15, mdfrdr15, NULL);
-
-        // For layer watermark test
-        Ptr<MgResourceIdentifier> wdfres2 = new MgResourceIdentifier(L"Library://UnitTests/Watermarks/Rail.WatermarkDefinition");
-        Ptr<MgByteSource> wdfsrc2 = new MgByteSource(L"../UnitTestFiles/UT_Rail.wdf", false);
-        Ptr<MgByteReader> wdfrdr2 = wdfsrc2->GetReader();
-        m_svcResource->SetResource(wdfres2, wdfrdr2, NULL);
-
-        Ptr<MgResourceIdentifier> ldfres21 = new MgResourceIdentifier(L"Library://UnitTests/Layers/RailWatermark.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc21 = new MgByteSource(L"../UnitTestFiles/UT_Rail_Watermark.ldf", false);
-        Ptr<MgByteReader> ldfrdr21 = ldfsrc21->GetReader();
-        m_svcResource->SetResource(ldfres21, ldfrdr21, NULL);
-    }
-    catch (MgException* e)
-    {
-        STRING message = e->GetDetails(TEST_LOCALE);
-        SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
-    }
-    catch (...)
-    {
-        throw;
-    }
+    Ptr<MgLinearRing> outer = new MgLinearRing(cc);
+    return new MgPolygon(outer, nullptr);
 }
 
-
-void TestRenderingService::TestEnd()
+static void TestCase_RenderDynamicOverlay(CREFSTRING imageFormat, CREFSTRING extension)
 {
     try
     {
-        // delete the map definition
-        Ptr<MgResourceIdentifier> mapres1 = new MgResourceIdentifier(L"Library://UnitTests/Maps/Sheboygan.MapDefinition");
-        m_svcResource->DeleteResource(mapres1);
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
 
-        // delete the layer definitions
-        Ptr<MgResourceIdentifier> ldfres1 = new MgResourceIdentifier(L"Library://UnitTests/Layers/HydrographicPolygons.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres1);
+        Ptr<MgdRenderingService> pService = dynamic_cast<MgdRenderingService*>(
+            factory->CreateService(MgServiceType::RenderingService));
+        REQUIRE(pService.p != nullptr);
 
-        Ptr<MgResourceIdentifier> ldfres2 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Rail.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres2);
-
-        Ptr<MgResourceIdentifier> ldfres3 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Parcels.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres3);
-
-        // delete the feature sources
-        Ptr<MgResourceIdentifier> fsres1 = new MgResourceIdentifier(L"Library://UnitTests/Data/HydrographicPolygons.FeatureSource");
-        m_svcResource->DeleteResource(fsres1);
-
-        Ptr<MgResourceIdentifier> fsres2 = new MgResourceIdentifier(L"Library://UnitTests/Data/Rail.FeatureSource");
-        m_svcResource->DeleteResource(fsres2);
-
-        Ptr<MgResourceIdentifier> fsres3 = new MgResourceIdentifier(L"Library://UnitTests/Data/Parcels.FeatureSource");
-        m_svcResource->DeleteResource(fsres3);
-
-        // delete the print layouts
-        Ptr<MgResourceIdentifier> plres1 = new MgResourceIdentifier(L"Library://UnitTests/PrintLayouts/AllElements.PrintLayout");
-        m_svcResource->DeleteResource(plres1);
-
-        Ptr<MgResourceIdentifier> plres2 = new MgResourceIdentifier(L"Library://UnitTests/PrintLayouts/NoLegend.PrintLayout");
-        m_svcResource->DeleteResource(plres2);
-
-        // delete the symbol library
-        Ptr<MgResourceIdentifier> slres1 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/SymbolMart.SymbolLibrary");
-        m_svcResource->DeleteResource(slres1);
-
-        // delete symbology stuff
-        Ptr<MgResourceIdentifier> fsres4 = new MgResourceIdentifier(L"Library://UnitTests/Data/Capitals.FeatureSource");
-        m_svcResource->DeleteResource(fsres4);
-        Ptr<MgResourceIdentifier> sdres1 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/PointSymbol.SymbolDefinition");
-        m_svcResource->DeleteResource(sdres1);
-        Ptr<MgResourceIdentifier> sdres2 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/PointSymbolParam.SymbolDefinition");
-        m_svcResource->DeleteResource(sdres2);
-        Ptr<MgResourceIdentifier> ldfres4 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Capitals.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres4);
-        Ptr<MgResourceIdentifier> ldfres5 = new MgResourceIdentifier(L"Library://UnitTests/Layers/CapitalsParam.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres5);
-        Ptr<MgResourceIdentifier> mapres2 = new MgResourceIdentifier(L"Library://UnitTests/Maps/Capitals.MapDefinition");
-        m_svcResource->DeleteResource(mapres2);
-        Ptr<MgResourceIdentifier> mapres3 = new MgResourceIdentifier(L"Library://UnitTests/Maps/CapitalsParam.MapDefinition");
-        m_svcResource->DeleteResource(mapres3);
-
-        Ptr<MgResourceIdentifier> fsres5 = new MgResourceIdentifier(L"Library://UnitTests/Data/Lines.FeatureSource");
-        m_svcResource->DeleteResource(fsres5);
-        Ptr<MgResourceIdentifier> sdres3 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/LineSymbol.SymbolDefinition");
-        m_svcResource->DeleteResource(sdres3);
-        Ptr<MgResourceIdentifier> sdres4 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/MTYP1500a.SymbolDefinition");
-        m_svcResource->DeleteResource(sdres4);
-        Ptr<MgResourceIdentifier> ldfres6 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Lines.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres6);
-        Ptr<MgResourceIdentifier> ldfres7 = new MgResourceIdentifier(L"Library://UnitTests/Layers/LinesCrossTick.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres7);
-        Ptr<MgResourceIdentifier> mapres4 = new MgResourceIdentifier(L"Library://UnitTests/Maps/Lines.MapDefinition");
-        m_svcResource->DeleteResource(mapres4);
-        Ptr<MgResourceIdentifier> mapres5 = new MgResourceIdentifier(L"Library://UnitTests/Maps/LinesCrossTick.MapDefinition");
-        m_svcResource->DeleteResource(mapres5);
-
-        Ptr<MgResourceIdentifier> ldfres8 = new MgResourceIdentifier(L"Library://UnitTests/Layers/UT_Annotation1.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres8);
-        Ptr<MgResourceIdentifier> ldfres9 = new MgResourceIdentifier(L"Library://UnitTests/Layers/UT_Annotation2.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres9);
-        Ptr<MgResourceIdentifier> ldfres10 = new MgResourceIdentifier(L"Library://UnitTests/Layers/UT_Annotation3.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres10);
-        Ptr<MgResourceIdentifier> mapres8 = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_Annotation1.MapDefinition");
-        m_svcResource->DeleteResource(mapres8);
-        Ptr<MgResourceIdentifier> mapres9 = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_Annotation2.MapDefinition");
-        m_svcResource->DeleteResource(mapres9);
-        Ptr<MgResourceIdentifier> mapres10 = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_Annotation3.MapDefinition");
-        m_svcResource->DeleteResource(mapres10);
-
-        Ptr<MgResourceIdentifier> mapres11 = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_SymbologyPolygons.MapDefinition");
-        m_svcResource->DeleteResource(mapres11);
-        Ptr<MgResourceIdentifier> ldfres11 = new MgResourceIdentifier(L"Library://UnitTests/Layers/SymbologyParcels.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres11);
-        Ptr<MgResourceIdentifier> sdres5 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/AreaSymbol.SymbolDefinition");
-        m_svcResource->DeleteResource(sdres5);
-        
-        Ptr<MgResourceIdentifier> mapres12 = new MgResourceIdentifier(L"Library://UnitTests/Maps/SheboyganWithWatermark.MapDefinition");
-        m_svcResource->DeleteResource(mapres12);
-        Ptr<MgResourceIdentifier> wdfres1 = new MgResourceIdentifier(L"Library://UnitTests/Watermarks/PoweredByMapGuide.WatermarkDefinition");
-        m_svcResource->DeleteResource(wdfres1);
-
-        Ptr<MgResourceIdentifier> mapres13 = new MgResourceIdentifier(L"Library://UnitTests/Maps/BaseMap.MapDefinition");
-        m_svcResource->DeleteResource(mapres13);
-        Ptr<MgResourceIdentifier> ldfres12 = new MgResourceIdentifier(L"Library://UnitTests/Layers/RoadCenterLines.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres12);
-        Ptr<MgResourceIdentifier> ldfres13 = new MgResourceIdentifier(L"Library://UnitTests/Layers/VotingDistricts.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres13);
-        Ptr<MgResourceIdentifier> fsres6 = new MgResourceIdentifier(L"Library://UnitTests/Data/RoadCenterLines.FeatureSource");
-        m_svcResource->DeleteResource(fsres6);
-        Ptr<MgResourceIdentifier> fsres7 = new MgResourceIdentifier(L"Library://UnitTests/Data/VotingDistricts.FeatureSource");
-        m_svcResource->DeleteResource(fsres7);
-
-        Ptr<MgResourceIdentifier> ldfres14 = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiFTS.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres14);
-        Ptr<MgResourceIdentifier> ldfres15 = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiCTS.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres15);
-        Ptr<MgResourceIdentifier> ldfres16 = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiFTSWithTheme.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres16);
-        Ptr<MgResourceIdentifier> ldfres17 = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiCTSWithTheme.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres17);
-        Ptr<MgResourceIdentifier> ldfres18 = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiFTSSingleCTS.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres18);
-        Ptr<MgResourceIdentifier> ldfres19 = new MgResourceIdentifier(L"Library://UnitTests/Layers/SingleFTSMultiCTS.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres19);
-
-        // Data related to stylization function tests
-        Ptr<MgResourceIdentifier> ldfres20 = new MgResourceIdentifier(L"Library://UnitTests/Layers/StylizationFuncs.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres20);
-
-        Ptr<MgResourceIdentifier> mapres15 = new MgResourceIdentifier(L"Library://UnitTests/Maps/StylizationFuncs.MapDefinition");
-        m_svcResource->DeleteResource(mapres15);
-
-        // Layer watermark test
-        Ptr<MgResourceIdentifier> wdfres2 = new MgResourceIdentifier(L"Library://UnitTests/Watermarks/Rail.WatermarkDefinition");
-        m_svcResource->DeleteResource(wdfres2);
-        Ptr<MgResourceIdentifier> ldfres21 = new MgResourceIdentifier(L"Library://UnitTests/Layers/RailWatermark.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres21);
-    }
-    catch(MgFileIoException* e)
-    {
-        STRING message = e->GetDetails(TEST_LOCALE);
-        SAFE_RELEASE(e);
-        ACE_DEBUG((LM_INFO, ACE_TEXT("\nMgFileIoException - Possible file permission error.\nError: %W\n"), message.c_str()));
-    }
-    catch (MgException* e)
-    {
-        STRING message = e->GetDetails(TEST_LOCALE);
-        message += e->GetStackTrace(TEST_LOCALE);
-        SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
-    }
-    catch (...)
-    {
-        throw;
-    }
-
-    ACE_DEBUG((LM_INFO, ACE_TEXT("\nRendering Service tests completed.\n\n")));
-}
-
-void TestRenderingService::TestCase_RenderDynamicOverlay(CREFSTRING imageFormat, CREFSTRING extension)
-{
-    try
-    {
         // make a runtime map
         Ptr<MgdMap> map = CreateTestMap();
 
@@ -556,7 +146,7 @@
 
 //        for (int i=0; i<10; i++)
 //        {
-            Ptr<MgByteReader> rdr1 = m_svcRendering->RenderDynamicOverlay(map, NULL, imageFormat);
+            Ptr<MgByteReader> rdr1 = pService->RenderDynamicOverlay(map, nullptr, imageFormat);
             rdr1->ToFile(GetPath(L"../UnitTestFiles/RenderDynamicOverlay75k", imageFormat, extension));
 //        }
 
@@ -564,7 +154,7 @@
 
 //        for (int i=0; i<100; i++)
 //        {
-            Ptr<MgByteReader> rdr2 = m_svcRendering->RenderDynamicOverlay(map, NULL, imageFormat);
+            Ptr<MgByteReader> rdr2 = pService->RenderDynamicOverlay(map, nullptr, imageFormat);
             rdr2->ToFile(GetPath(L"../UnitTestFiles/RenderDynamicOverlay12k", imageFormat, extension));
 //        }
 
@@ -573,9 +163,9 @@
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -584,31 +174,37 @@
 }
 
 
-void TestRenderingService::TestCase_RenderDynamicOverlayTiledMap(CREFSTRING imageFormat, CREFSTRING extension)
+static void TestCase_RenderDynamicOverlayTiledMap(CREFSTRING imageFormat, CREFSTRING extension)
 {
     try
     {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdRenderingService> pService = dynamic_cast<MgdRenderingService*>(
+            factory->CreateService(MgServiceType::RenderingService));
+        REQUIRE(pService.p != nullptr);
+
         // make a runtime map
         Ptr<MgdMap> map = CreateTestTiledMap();
 
 //        clock_t t0 = clock();
 
-        Ptr<MgdRenderingOptions> renderOpts = new MgdRenderingOptions(imageFormat, MgdRenderingOptions::RenderLayers | MgdRenderingOptions::RenderBaseLayers, NULL);
+        Ptr<MgdRenderingOptions> renderOpts = new MgdRenderingOptions(imageFormat, MgdRenderingOptions::RenderLayers | MgdRenderingOptions::RenderBaseLayers, nullptr);
 
         map->SetViewScale(12000.0);
 //        for (int i=0; i<10; i++)
 //        {
             //EXPECT: Tiled layers rendered with transparent background for applicable formats
-            Ptr<MgByteReader> rdr1 = m_svcRendering->RenderDynamicOverlay(map, NULL, renderOpts);
+            Ptr<MgByteReader> rdr1 = pService->RenderDynamicOverlay(map, nullptr, renderOpts);
             rdr1->ToFile(GetPath(L"../UnitTestFiles/RenderDynamicOverlayTiled_WithBase12k", imageFormat, extension));
 //        }
 
-        Ptr<MgdRenderingOptions> renderOpts2 = new MgdRenderingOptions(imageFormat, MgdRenderingOptions::RenderLayers, NULL);
+        Ptr<MgdRenderingOptions> renderOpts2 = new MgdRenderingOptions(imageFormat, MgdRenderingOptions::RenderLayers, nullptr);
 
 //        for (int i=0; i<100; i++)
 //        {
             //EXPECT: Nothing, with transparent background for applicable formats
-            Ptr<MgByteReader> rdr2 = m_svcRendering->RenderDynamicOverlay(map, NULL, renderOpts2);
+            Ptr<MgByteReader> rdr2 = pService->RenderDynamicOverlay(map, nullptr, renderOpts2);
             rdr2->ToFile(GetPath(L"../UnitTestFiles/RenderDynamicOverlayTiled_NoBase12k", imageFormat, extension));
 //        }
 
@@ -617,9 +213,9 @@
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -628,27 +224,33 @@
 }
 
 
-void TestRenderingService::TestCase_RenderMap(CREFSTRING imageFormat, CREFSTRING extension)
+static void TestCase_RenderMap(CREFSTRING imageFormat, CREFSTRING extension)
 {
     try
     {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdRenderingService> pService = dynamic_cast<MgdRenderingService*>(
+            factory->CreateService(MgServiceType::RenderingService));
+        REQUIRE(pService.p != nullptr);
+
         // make a runtime map
         Ptr<MgdMap> map = CreateTestMap();
 
         // call the API using scales of 75000 and 12000
         map->SetViewScale(75000.0);
-        Ptr<MgByteReader> rdr1 = m_svcRendering->RenderMap(map, NULL, imageFormat);
+        Ptr<MgByteReader> rdr1 = pService->RenderMap(map, nullptr, imageFormat);
         rdr1->ToFile(GetPath(L"../UnitTestFiles/RenderMap75k", imageFormat, extension));
 
         map->SetViewScale(12000.0);
-        Ptr<MgByteReader> rdr2 = m_svcRendering->RenderMap(map, NULL, imageFormat);
+        Ptr<MgByteReader> rdr2 = pService->RenderMap(map, nullptr, imageFormat);
         rdr2->ToFile(GetPath(L"../UnitTestFiles/RenderMap12k", imageFormat, extension));
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -656,27 +258,33 @@
     }
 }
 
-void TestRenderingService::TestCase_RenderMapWithWatermark(CREFSTRING imageFormat, CREFSTRING extension)
+static void TestCase_RenderMapWithWatermark(CREFSTRING imageFormat, CREFSTRING extension)
 {
     try
     {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdRenderingService> pService = dynamic_cast<MgdRenderingService*>(
+            factory->CreateService(MgServiceType::RenderingService));
+        REQUIRE(pService.p != nullptr);
+
         // make a runtime map
         Ptr<MgdMap> map = CreateTestMapWithWatermark();
 
         // call the API using scales of 75000 and 12000
         map->SetViewScale(75000.0);
-        Ptr<MgByteReader> rdr1 = m_svcRendering->RenderMap(map, NULL, imageFormat);
+        Ptr<MgByteReader> rdr1 = pService->RenderMap(map, nullptr, imageFormat);
         rdr1->ToFile(GetPath(L"../UnitTestFiles/RenderMapWithWatermark75k", imageFormat, extension));
 
         map->SetViewScale(12000.0);
-        Ptr<MgByteReader> rdr2 = m_svcRendering->RenderMap(map, NULL, imageFormat);
+        Ptr<MgByteReader> rdr2 = pService->RenderMap(map, nullptr, imageFormat);
 		rdr2->ToFile(GetPath(L"../UnitTestFiles/RenderMapWithWatermark12k", imageFormat, extension));
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -685,10 +293,20 @@
 }
 
 
-void TestRenderingService::TestCase_RenderLegend(CREFSTRING imageFormat, CREFSTRING extension)
+static void TestCase_RenderLegend(CREFSTRING imageFormat, CREFSTRING extension)
 {
     try
     {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdRenderingService> pService = dynamic_cast<MgdRenderingService*>(
+            factory->CreateService(MgServiceType::RenderingService));
+        REQUIRE(pService.p != nullptr);
+
+        Ptr<MgResourceService> svcResource = dynamic_cast<MgResourceService*>(
+            factory->CreateService(MgServiceType::ResourceService));
+        REQUIRE(svcResource.p != nullptr);
+
         // make a runtime map
         Ptr<MgdMap> map = CreateTestMap();
 
@@ -696,11 +314,11 @@
         Ptr<MgColor> bgc = new MgColor(255, 255, 255, 255);
 
         map->SetViewScale(75000.0);
-        Ptr<MgByteReader> rdr1 = m_svcRendering->RenderMapLegend(map, 200, 400, bgc, imageFormat);
+        Ptr<MgByteReader> rdr1 = pService->RenderMapLegend(map, 200, 400, bgc, imageFormat);
         rdr1->ToFile(GetPath(L"../UnitTestFiles/RenderLegend75k", imageFormat, extension));
 
         map->SetViewScale(12000.0);
-        Ptr<MgByteReader> rdr2 = m_svcRendering->RenderMapLegend(map, 200, 400, bgc, imageFormat);
+        Ptr<MgByteReader> rdr2 = pService->RenderMapLegend(map, 200, 400, bgc, imageFormat);
         rdr2->ToFile(GetPath(L"../UnitTestFiles/RenderLegend12k", imageFormat, extension));
 
         // add a layer group
@@ -731,13 +349,13 @@
         group3->SetDisplayInLegend(false);
         layerGroups->Add(group3);
 
-        Ptr<MgdLayer> layer = new MgdLayer(resId, m_svcResource);
+        Ptr<MgdLayer> layer = new MgdLayer(resId, svcResource);
         layer->SetName(L"HydroPolygons");
         layer->SetLegendLabel(L"HydroPolygons (Test Group)");
         layer->SetGroup(group);
         layer->SetDisplayInLegend(true);
 
-        Ptr<MgdLayer> layer2 = new MgdLayer(ldfRail, m_svcResource);
+        Ptr<MgdLayer> layer2 = new MgdLayer(ldfRail, svcResource);
         layer2->SetName(L"RailUnderNestedGroup");
         layer2->SetLegendLabel(L"Rail (Nest Child)");
         layer2->SetGroup(group2);
@@ -748,24 +366,24 @@
 
         //Re-draw at 75k. Layer group should not be there because it has no visible layers
         map->SetViewScale(75000.0);
-        Ptr<MgByteReader> rdr3 = m_svcRendering->RenderMapLegend(map, 200, 400, bgc, imageFormat);
+        Ptr<MgByteReader> rdr3 = pService->RenderMapLegend(map, 200, 400, bgc, imageFormat);
         rdr3->ToFile(GetPath(L"../UnitTestFiles/RenderLegend75kWithEmptyLayerGroup", imageFormat, extension));
 
         //Re-draw at 14000. Layer group should still not be there because it has no visible layers
         map->SetViewScale(14000.0);
-        Ptr<MgByteReader> rdr4 = m_svcRendering->RenderMapLegend(map, 200, 400, bgc, imageFormat);
+        Ptr<MgByteReader> rdr4 = pService->RenderMapLegend(map, 200, 400, bgc, imageFormat);
         rdr4->ToFile(GetPath(L"../UnitTestFiles/RenderLegend14kWithEmptyLayerGroup", imageFormat, extension));
 
         //Re-draw at 12000. Layer group should now be there because its child layer (Parcels) should be visible
         map->SetViewScale(12000.0);
-        Ptr<MgByteReader> rdr5 = m_svcRendering->RenderMapLegend(map, 200, 400, bgc, imageFormat);
+        Ptr<MgByteReader> rdr5 = pService->RenderMapLegend(map, 200, 400, bgc, imageFormat);
         rdr5->ToFile(GetPath(L"../UnitTestFiles/RenderLegend12kWithLayerGroup", imageFormat, extension));
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -773,10 +391,16 @@
     }
 }
 
-void TestRenderingService::TestCase_RenderLegendEmptyGroups(CREFSTRING imageFormat, CREFSTRING extension)
+static void TestCase_RenderLegendEmptyGroups(CREFSTRING imageFormat, CREFSTRING extension)
 {
     try
     {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdRenderingService> pService = dynamic_cast<MgdRenderingService*>(
+            factory->CreateService(MgServiceType::RenderingService));
+        REQUIRE(pService.p != nullptr);
+
         // make a runtime map
         Ptr<MgdMap> map = CreateTestMap();
         map->SetViewScale(75000.0);
@@ -810,14 +434,14 @@
         map->Save();
 
         // Call the API
-        Ptr<MgByteReader> rdr3 = m_svcRendering->RenderMapLegend(map, 200, 400, bgc, imageFormat);
+        Ptr<MgByteReader> rdr3 = pService->RenderMapLegend(map, 200, 400, bgc, imageFormat);
         rdr3->ToFile(GetPath(L"../UnitTestFiles/RenderLegendEmptyGroups", imageFormat, extension));
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -825,21 +449,27 @@
     }
 }
 
-void TestRenderingService::TestCase_StylizationFunctions(CREFSTRING imageFormat, CREFSTRING extension)
+static void TestCase_StylizationFunctions(CREFSTRING imageFormat, CREFSTRING extension)
 {
     try
     {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdRenderingService> pService = dynamic_cast<MgdRenderingService*>(
+            factory->CreateService(MgServiceType::RenderingService));
+        REQUIRE(pService.p != nullptr);
+
         Ptr<MgdMap> map = CreateTestStylizationFunctionMap();
         
         // call the API using a scale of 75000
         map->SetViewScale(75000.0);
 
-        Ptr<MgByteReader> rdr1 = m_svcRendering->RenderDynamicOverlay(map, NULL, imageFormat);
+        Ptr<MgByteReader> rdr1 = pService->RenderDynamicOverlay(map, nullptr, imageFormat);
         rdr1->ToFile(GetPath(L"../UnitTestFiles/StylizationFunc_75k", imageFormat, extension));
 
         // call the API using a scale of 12000
         map->SetViewScale(12000);
-        Ptr<MgByteReader> rdr2 = m_svcRendering->RenderDynamicOverlay(map, NULL, imageFormat);
+        Ptr<MgByteReader> rdr2 = pService->RenderDynamicOverlay(map, nullptr, imageFormat);
         rdr2->ToFile(GetPath(L"../UnitTestFiles/StylizationFunc_12k", imageFormat, extension));
 
         // Move around
@@ -846,14 +476,14 @@
         Ptr<MgCoordinate> coordNewCenter = new MgCoordinateXY(-87.733753, 43.746899);
         Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
         map->SetViewCenter(ptNewCenter);
-        Ptr<MgByteReader> rdr3 = m_svcRendering->RenderDynamicOverlay(map, NULL, imageFormat);
+        Ptr<MgByteReader> rdr3 = pService->RenderDynamicOverlay(map, nullptr, imageFormat);
         rdr3->ToFile(GetPath(L"../UnitTestFiles/StylizationFunc_12k_Moved", imageFormat, extension));
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -861,16 +491,26 @@
     }
 }
 
-void TestRenderingService::TestCase_RenderLegendMultiFTS(CREFSTRING imageFormat, CREFSTRING extension)
+static void TestCase_RenderLegendMultiFTS(CREFSTRING imageFormat, CREFSTRING extension)
 {
     try
     {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdRenderingService> pService = dynamic_cast<MgdRenderingService*>(
+            factory->CreateService(MgServiceType::RenderingService));
+        REQUIRE(pService.p != nullptr);
+
+        Ptr<MgResourceService> svcResource = dynamic_cast<MgResourceService*>(
+            factory->CreateService(MgServiceType::ResourceService));
+        REQUIRE(svcResource.p != nullptr);
+
         // make a runtime map
         Ptr<MgdMap> map = CreateTestMap();
 
         // Insert our test layer
         Ptr<MgResourceIdentifier> layerDef = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiFTS.LayerDefinition");
-        Ptr<MgdLayer> layer = new MgdLayer(layerDef, m_svcResource);
+        Ptr<MgdLayer> layer = new MgdLayer(layerDef, svcResource);
         layer->SetLegendLabel(layerDef->GetName());
         Ptr<MgLayerCollection> layers = map->GetLayers();
         layers->Insert(0, layer);
@@ -880,14 +520,14 @@
         Ptr<MgColor> bgc = new MgColor(255, 255, 255, 255);
 
         map->SetViewScale(75000.0);
-        Ptr<MgByteReader> rdr1 = m_svcRendering->RenderMapLegend(map, 200, 400, bgc, imageFormat);
+        Ptr<MgByteReader> rdr1 = pService->RenderMapLegend(map, 200, 400, bgc, imageFormat);
         rdr1->ToFile(GetPath(L"../UnitTestFiles/RenderLegendMultiFTS", imageFormat, extension));
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -895,16 +535,26 @@
     }
 }
 
-void TestRenderingService::TestCase_RenderLegendMultiCTS(CREFSTRING imageFormat, CREFSTRING extension)
+static void TestCase_RenderLegendMultiCTS(CREFSTRING imageFormat, CREFSTRING extension)
 {
     try
     {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdRenderingService> pService = dynamic_cast<MgdRenderingService*>(
+            factory->CreateService(MgServiceType::RenderingService));
+        REQUIRE(pService.p != nullptr);
+
+        Ptr<MgResourceService> svcResource = dynamic_cast<MgResourceService*>(
+            factory->CreateService(MgServiceType::ResourceService));
+        REQUIRE(svcResource.p != nullptr);
+
         // make a runtime map
         Ptr<MgdMap> map = CreateTestMap();
 
         // Insert our test layer
         Ptr<MgResourceIdentifier> layerDef = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiCTS.LayerDefinition");
-        Ptr<MgdLayer> layer = new MgdLayer(layerDef, m_svcResource);
+        Ptr<MgdLayer> layer = new MgdLayer(layerDef, svcResource);
         layer->SetLegendLabel(layerDef->GetName());
         Ptr<MgLayerCollection> layers = map->GetLayers();
         layers->Insert(0, layer);
@@ -914,14 +564,14 @@
         Ptr<MgColor> bgc = new MgColor(255, 255, 255, 255);
 
         map->SetViewScale(75000.0);
-        Ptr<MgByteReader> rdr1 = m_svcRendering->RenderMapLegend(map, 200, 400, bgc, imageFormat);
+        Ptr<MgByteReader> rdr1 = pService->RenderMapLegend(map, 200, 400, bgc, imageFormat);
         rdr1->ToFile(GetPath(L"../UnitTestFiles/RenderLegendMultiCTS", imageFormat, extension));
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -929,16 +579,26 @@
     }
 }
 
-void TestRenderingService::TestCase_RenderLegendMultiFTSWithTheme(CREFSTRING imageFormat, CREFSTRING extension)
+static void TestCase_RenderLegendMultiFTSWithTheme(CREFSTRING imageFormat, CREFSTRING extension)
 {
     try
     {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdRenderingService> pService = dynamic_cast<MgdRenderingService*>(
+            factory->CreateService(MgServiceType::RenderingService));
+        REQUIRE(pService.p != nullptr);
+
+        Ptr<MgResourceService> svcResource = dynamic_cast<MgResourceService*>(
+            factory->CreateService(MgServiceType::ResourceService));
+        REQUIRE(svcResource.p != nullptr);
+
         // make a runtime map
         Ptr<MgdMap> map = CreateTestMap();
 
         // Insert our test layer
         Ptr<MgResourceIdentifier> layerDef = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiFTSWithTheme.LayerDefinition");
-        Ptr<MgdLayer> layer = new MgdLayer(layerDef, m_svcResource);
+        Ptr<MgdLayer> layer = new MgdLayer(layerDef, svcResource);
         layer->SetLegendLabel(layerDef->GetName());
         Ptr<MgLayerCollection> layers = map->GetLayers();
         layers->Insert(0, layer);
@@ -948,14 +608,14 @@
         Ptr<MgColor> bgc = new MgColor(255, 255, 255, 255);
 
         map->SetViewScale(75000.0);
-        Ptr<MgByteReader> rdr1 = m_svcRendering->RenderMapLegend(map, 200, 400, bgc, imageFormat);
+        Ptr<MgByteReader> rdr1 = pService->RenderMapLegend(map, 200, 400, bgc, imageFormat);
         rdr1->ToFile(GetPath(L"../UnitTestFiles/RenderLegendMultiFTSWithTheme", imageFormat, extension));
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -963,16 +623,26 @@
     }
 }
 
-void TestRenderingService::TestCase_RenderLegendMultiCTSWithTheme(CREFSTRING imageFormat, CREFSTRING extension)
+static void TestCase_RenderLegendMultiCTSWithTheme(CREFSTRING imageFormat, CREFSTRING extension)
 {
     try
     {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdRenderingService> pService = dynamic_cast<MgdRenderingService*>(
+            factory->CreateService(MgServiceType::RenderingService));
+        REQUIRE(pService.p != nullptr);
+
+        Ptr<MgResourceService> svcResource = dynamic_cast<MgResourceService*>(
+            factory->CreateService(MgServiceType::ResourceService));
+        REQUIRE(svcResource.p != nullptr);
+
         // make a runtime map
         Ptr<MgdMap> map = CreateTestMap();
 
         // Insert our test layer
         Ptr<MgResourceIdentifier> layerDef = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiCTSWithTheme.LayerDefinition");
-        Ptr<MgdLayer> layer = new MgdLayer(layerDef, m_svcResource);
+        Ptr<MgdLayer> layer = new MgdLayer(layerDef, svcResource);
         layer->SetLegendLabel(layerDef->GetName());
         Ptr<MgLayerCollection> layers = map->GetLayers();
         layers->Insert(0, layer);
@@ -982,14 +652,14 @@
         Ptr<MgColor> bgc = new MgColor(255, 255, 255, 255);
 
         map->SetViewScale(75000.0);
-        Ptr<MgByteReader> rdr1 = m_svcRendering->RenderMapLegend(map, 200, 400, bgc, imageFormat);
+        Ptr<MgByteReader> rdr1 = pService->RenderMapLegend(map, 200, 400, bgc, imageFormat);
         rdr1->ToFile(GetPath(L"../UnitTestFiles/RenderLegendMultiCTSWithTheme", imageFormat, extension));
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -997,16 +667,26 @@
     }
 }
 
-void TestRenderingService::TestCase_RenderLegendMultiFTSSingleCTS(CREFSTRING imageFormat, CREFSTRING extension)
+static void TestCase_RenderLegendMultiFTSSingleCTS(CREFSTRING imageFormat, CREFSTRING extension)
 {
     try
     {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdRenderingService> pService = dynamic_cast<MgdRenderingService*>(
+            factory->CreateService(MgServiceType::RenderingService));
+        REQUIRE(pService.p != nullptr);
+
+        Ptr<MgResourceService> svcResource = dynamic_cast<MgResourceService*>(
+            factory->CreateService(MgServiceType::ResourceService));
+        REQUIRE(svcResource.p != nullptr);
+
         // make a runtime map
         Ptr<MgdMap> map = CreateTestMap();
 
         // Insert our test layer
         Ptr<MgResourceIdentifier> layerDef = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiFTSSingleCTS.LayerDefinition");
-        Ptr<MgdLayer> layer = new MgdLayer(layerDef, m_svcResource);
+        Ptr<MgdLayer> layer = new MgdLayer(layerDef, svcResource);
         layer->SetLegendLabel(layerDef->GetName());
         Ptr<MgLayerCollection> layers = map->GetLayers();
         layers->Insert(0, layer);
@@ -1016,14 +696,14 @@
         Ptr<MgColor> bgc = new MgColor(255, 255, 255, 255);
 
         map->SetViewScale(75000.0);
-        Ptr<MgByteReader> rdr1 = m_svcRendering->RenderMapLegend(map, 200, 400, bgc, imageFormat);
+        Ptr<MgByteReader> rdr1 = pService->RenderMapLegend(map, 200, 400, bgc, imageFormat);
         rdr1->ToFile(GetPath(L"../UnitTestFiles/RenderLegendMultiFTSSingleCTS", imageFormat, extension));
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -1032,16 +712,26 @@
 }
 
 
-void TestRenderingService::TestCase_RenderLegendSingleFTSMultiCTS(CREFSTRING imageFormat, CREFSTRING extension)
+static void TestCase_RenderLegendSingleFTSMultiCTS(CREFSTRING imageFormat, CREFSTRING extension)
 {
     try
     {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdRenderingService> pService = dynamic_cast<MgdRenderingService*>(
+            factory->CreateService(MgServiceType::RenderingService));
+        REQUIRE(pService.p != nullptr);
+
+        Ptr<MgResourceService> svcResource = dynamic_cast<MgResourceService*>(
+            factory->CreateService(MgServiceType::ResourceService));
+        REQUIRE(svcResource.p != nullptr);
+
         // make a runtime map
         Ptr<MgdMap> map = CreateTestMap();
 
         // Insert our test layer
         Ptr<MgResourceIdentifier> layerDef = new MgResourceIdentifier(L"Library://UnitTests/Layers/SingleFTSMultiCTS.LayerDefinition");
-        Ptr<MgdLayer> layer = new MgdLayer(layerDef, m_svcResource);
+        Ptr<MgdLayer> layer = new MgdLayer(layerDef, svcResource);
         layer->SetLegendLabel(layerDef->GetName());
         Ptr<MgLayerCollection> layers = map->GetLayers();
         layers->Insert(0, layer);
@@ -1051,14 +741,14 @@
         Ptr<MgColor> bgc = new MgColor(255, 255, 255, 255);
 
         map->SetViewScale(75000.0);
-        Ptr<MgByteReader> rdr1 = m_svcRendering->RenderMapLegend(map, 200, 400, bgc, imageFormat);
+        Ptr<MgByteReader> rdr1 = pService->RenderMapLegend(map, 200, 400, bgc, imageFormat);
         rdr1->ToFile(GetPath(L"../UnitTestFiles/RenderLegendSingleFTSMultiCTS", imageFormat, extension));
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -1066,10 +756,20 @@
     }
 }
 
-void TestRenderingService::TestCase_LayerWatermark(CREFSTRING imageFormat, CREFSTRING extension)
+static void TestCase_LayerWatermark(CREFSTRING imageFormat, CREFSTRING extension)
 {
     try
     {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdRenderingService> pService = dynamic_cast<MgdRenderingService*>(
+            factory->CreateService(MgServiceType::RenderingService));
+        REQUIRE(pService.p != nullptr);
+
+        Ptr<MgResourceService> svcResource = dynamic_cast<MgResourceService*>(
+            factory->CreateService(MgServiceType::ResourceService));
+        REQUIRE(svcResource.p != nullptr);
+
         // make a runtime map
         Ptr<MgdMap> map = CreateTestMap();
 
@@ -1084,7 +784,7 @@
 
         // Insert our watermarked rail layer
         Ptr<MgResourceIdentifier> layerDef = new MgResourceIdentifier(L"Library://UnitTests/Layers/RailWatermark.LayerDefinition");
-        Ptr<MgdLayer> layer = new MgdLayer(layerDef, m_svcResource);
+        Ptr<MgdLayer> layer = new MgdLayer(layerDef, svcResource);
         layer->SetName(L"Rail");
         layer->SetLegendLabel(layerDef->GetName());
         layers->Insert(0, layer);
@@ -1092,19 +792,19 @@
 
         Ptr<MgColor> selColor = new MgColor(0, 0, 255);
         Ptr<MgdRenderingOptions> renderOpts = new MgdRenderingOptions(imageFormat, MgdRenderingOptions::RenderLayers | MgdRenderingOptions::RenderBaseLayers, selColor);
-        Ptr<MgByteReader> img = m_svcRendering->RenderDynamicOverlay(map, NULL, renderOpts);
+        Ptr<MgByteReader> img = pService->RenderDynamicOverlay(map, nullptr, renderOpts);
         img->ToFile(GetPath(L"../UnitTestFiles/LayerWatermarkOn", imageFormat, extension));
 
         layer->SetVisible(false);
         map->Save();
-        img = m_svcRendering->RenderDynamicOverlay(map, NULL, renderOpts);
+        img = pService->RenderDynamicOverlay(map, nullptr, renderOpts);
         img->ToFile(GetPath(L"../UnitTestFiles/LayerWatermarkOff", imageFormat, extension));
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -1112,141 +812,16 @@
     }
 }
 
-void TestRenderingService::TestCase_QueryFeatures()
+static void TestCase_SymbologyPoints(CREFSTRING imageFormat, CREFSTRING extension)
 {
     try
     {
-        // make a runtime map
-        Ptr<MgdMap> map = CreateTestMap();
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
 
-        // call the API using a scale of 75000
-        map->SetViewScale(75000.0);
+        Ptr<MgdRenderingService> pService = dynamic_cast<MgdRenderingService*>(
+            factory->CreateService(MgServiceType::RenderingService));
+        REQUIRE(pService.p != nullptr);
 
-        Ptr<MgStringCollection> layerNames1 = new MgStringCollection();
-        layerNames1->Add(L"Rail");
-        layerNames1->Add(L"HydrographicPolygons");
-        Ptr<MgPolygon> poly1 = CreateSelectionPolygon(map, 0.3, 0.3);
-        Ptr<MgdFeatureInformation> fi1 = m_svcRendering->QueryFeatures(map, layerNames1, poly1, MgFeatureSpatialOperations::Within, -1);
-
-        // call the API using a scale of 12000
-        map->SetViewScale(12000.0);
-
-        Ptr<MgStringCollection> layerNames2 = new MgStringCollection();
-        layerNames2->Add(L"Rail");
-        layerNames2->Add(L"Parcels");
-        Ptr<MgPolygon> poly2 = CreateSelectionPolygon(map, 0.05, 0.05);
-        Ptr<MgdFeatureInformation> fi2 = m_svcRendering->QueryFeatures(map, layerNames2, poly2, MgFeatureSpatialOperations::Within, -1);
-    }
-    catch (MgException* e)
-    {
-        STRING message = e->GetDetails(TEST_LOCALE);
-        SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
-    }
-    catch (...)
-    {
-        throw;
-    }
-}
-
-MgdMap* TestRenderingService::CreateTestMapWithWatermark()
-{
-    Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/SheboyganWithWatermark.MapDefinition");
-    MgdMap* map = new MgdMap(mdfres);
-    //map->Create(mdfres, L"UnitTestSheboyganWithWatermark");
-
-    Ptr<MgCoordinate> coordNewCenter = new MgCoordinateXY(-87.733253, 43.746199);
-    Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
-    map->SetViewCenter(ptNewCenter);
-    map->SetViewScale(75000.0);
-    map->SetDisplayDpi(96);
-    map->SetDisplayWidth(1024);
-    map->SetDisplayHeight(1024);
-
-    return map;
-}
-
-MgdMap* TestRenderingService::CreateTestMap()
-{
-    Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/Sheboygan.MapDefinition");
-    MgdMap* map = new MgdMap(mdfres);
-    //map->Create(mdfres, L"UnitTestSheboygan");
-
-    Ptr<MgCoordinate> coordNewCenter = new MgCoordinateXY(-87.733253, 43.746199);
-    Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
-    map->SetViewCenter(ptNewCenter);
-    map->SetViewScale(75000.0);
-    map->SetDisplayDpi(96);
-    map->SetDisplayWidth(1024);
-    map->SetDisplayHeight(1024);
-
-    return map;
-}
-
-MgdMap* TestRenderingService::CreateTestStylizationFunctionMap()
-{
-    Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/StylizationFuncs.MapDefinition");
-    MgdMap* map = new MgdMap(mdfres);
-    //map->Create(mdfres, L"StylizationFuncs");
-
-    Ptr<MgCoordinate> coordNewCenter = new MgCoordinateXY(-87.733253, 43.746199);
-    Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
-    map->SetViewCenter(ptNewCenter);
-    map->SetViewScale(60000.0);
-    map->SetDisplayDpi(96);
-    map->SetDisplayWidth(1024);
-    map->SetDisplayHeight(1024);
-
-    return map;
-}
-
-MgdMap* TestRenderingService::CreateTestTiledMap()
-{
-    Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/BaseMap.MapDefinition");
-    MgdMap* map = new MgdMap(mdfres, L"UnitTestSheboyganTiled");
-
-    Ptr<MgCoordinate> coordNewCenter = new MgCoordinateXY(-87.733253, 43.746199);
-    Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
-    map->SetViewCenter(ptNewCenter);
-    map->SetViewScale(75000.0);
-    map->SetDisplayDpi(96);
-    map->SetDisplayWidth(1024);
-    map->SetDisplayHeight(1024);
-
-    return map;
-}
-
-// creates a selection bounds in mapping space
-MgPolygon* TestRenderingService::CreateSelectionPolygon(MgdMap* map, double width, double height)
-{
-    Ptr<MgPoint> centerPt = map->GetViewCenter();
-    Ptr<MgCoordinate> center = centerPt->GetCoordinate();
-    double xMin = center->GetX() - 0.5*width;
-    double yMin = center->GetY() - 0.5*height;
-    double xMax = center->GetX() + 0.5*width;
-    double yMax = center->GetY() + 0.5*height;
-    Ptr<MgCoordinateXY> c1 = new MgCoordinateXY(xMin, yMin);
-    Ptr<MgCoordinateXY> c2 = new MgCoordinateXY(xMax, yMin);
-    Ptr<MgCoordinateXY> c3 = new MgCoordinateXY(xMax, yMax);
-    Ptr<MgCoordinateXY> c4 = new MgCoordinateXY(xMin, yMax);
-    Ptr<MgCoordinateXY> c5 = new MgCoordinateXY(xMin, yMin);
-
-    Ptr<MgCoordinateCollection> cc = new MgCoordinateCollection();
-    cc->Add(c1);
-    cc->Add(c2);
-    cc->Add(c3);
-    cc->Add(c4);
-    cc->Add(c5);
-
-    Ptr<MgLinearRing> outer = new MgLinearRing(cc);
-    return new MgPolygon(outer, NULL);
-}
-
-
-void TestRenderingService::TestCase_SymbologyPoints(CREFSTRING imageFormat, CREFSTRING extension)
-{
-    try
-    {
         // make a runtime map
         Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/Capitals.MapDefinition");
         Ptr<MgdMap> map = new MgdMap(mdfres, L"UnitTestSymbology");
@@ -1257,7 +832,7 @@
         Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
         map->SetViewCenter(ptNewCenter);
         map->SetDisplayDpi(96);
-        map->SetDisplayWidth(2*pixels);
+        map->SetDisplayWidth(2 * pixels);
         map->SetDisplayHeight(pixels);
 
         // the map is a little silly -- it's in degrees but thinks it's in meters --
@@ -1267,22 +842,28 @@
         map->SetViewScale(scale);
 
         // call the API
-        Ptr<MgByteReader> rdr = m_svcRendering->RenderMap(map, NULL, imageFormat);
+        Ptr<MgByteReader> rdr = pService->RenderMap(map, nullptr, imageFormat);
         rdr->ToFile(GetPath(L"../UnitTestFiles/SymbologyPoints", imageFormat, extension));
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
 
-void TestRenderingService::TestCase_SymbologyPointsParam(CREFSTRING imageFormat, CREFSTRING extension)
+static void TestCase_SymbologyPointsParam(CREFSTRING imageFormat, CREFSTRING extension)
 {
     try
     {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdRenderingService> pService = dynamic_cast<MgdRenderingService*>(
+            factory->CreateService(MgServiceType::RenderingService));
+        REQUIRE(pService.p != nullptr);
+
         // make a runtime map
         Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/CapitalsParam.MapDefinition");
         Ptr<MgdMap> map = new MgdMap(mdfres, L"UnitTestSymbology");
@@ -1293,7 +874,7 @@
         Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
         map->SetViewCenter(ptNewCenter);
         map->SetDisplayDpi(96);
-        map->SetDisplayWidth(2*pixels);
+        map->SetDisplayWidth(2 * pixels);
         map->SetDisplayHeight(pixels);
 
         // the map is a little silly -- it's in degrees but thinks it's in meters --
@@ -1303,22 +884,28 @@
         map->SetViewScale(scale);
 
         // call the API
-        Ptr<MgByteReader> rdr = m_svcRendering->RenderMap(map, NULL, imageFormat);
+        Ptr<MgByteReader> rdr = pService->RenderMap(map, nullptr, imageFormat);
         rdr->ToFile(GetPath(L"../UnitTestFiles/SymbologyPointsParam", imageFormat, extension));
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
 
-void TestRenderingService::TestCase_SymbologyLines(CREFSTRING imageFormat, CREFSTRING extension)
+static void TestCase_SymbologyLines(CREFSTRING imageFormat, CREFSTRING extension)
 {
     try
     {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdRenderingService> pService = dynamic_cast<MgdRenderingService*>(
+            factory->CreateService(MgServiceType::RenderingService));
+        REQUIRE(pService.p != nullptr);
+
         // make a runtime map
         Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/Lines.MapDefinition");
         Ptr<MgdMap> map = new MgdMap(mdfres, L"UnitTestSymbology");
@@ -1329,7 +916,7 @@
         Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
         map->SetViewCenter(ptNewCenter);
         map->SetDisplayDpi(96);
-        map->SetDisplayWidth(2*pixels);
+        map->SetDisplayWidth(2 * pixels);
         map->SetDisplayHeight(pixels);
 
         // the map is a little silly -- it's in degrees but thinks it's in meters --
@@ -1339,22 +926,28 @@
         map->SetViewScale(scale);
 
         // call the API
-        Ptr<MgByteReader> rdr = m_svcRendering->RenderMap(map, NULL, imageFormat);
+        Ptr<MgByteReader> rdr = pService->RenderMap(map, nullptr, imageFormat);
         rdr->ToFile(GetPath(L"../UnitTestFiles/SymbologyLines", imageFormat, extension));
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
 
-void TestRenderingService::TestCase_SymbologyLinesCrossTick(CREFSTRING imageFormat, CREFSTRING extension)
+static void TestCase_SymbologyLinesCrossTick(CREFSTRING imageFormat, CREFSTRING extension)
 {
     try
     {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdRenderingService> pService = dynamic_cast<MgdRenderingService*>(
+            factory->CreateService(MgServiceType::RenderingService));
+        REQUIRE(pService.p != nullptr);
+
         // make a runtime map
         Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/LinesCrossTick.MapDefinition");
         Ptr<MgdMap> map = new MgdMap(mdfres, L"UnitTestSymbology");
@@ -1365,7 +958,7 @@
         Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
         map->SetViewCenter(ptNewCenter);
         map->SetDisplayDpi(96);
-        map->SetDisplayWidth(2*pixels);
+        map->SetDisplayWidth(2 * pixels);
         map->SetDisplayHeight(pixels);
 
         // the map is a little silly -- it's in degrees but thinks it's in meters --
@@ -1375,22 +968,28 @@
         map->SetViewScale(scale);
 
         // call the API
-        Ptr<MgByteReader> rdr = m_svcRendering->RenderMap(map, NULL, imageFormat);
+        Ptr<MgByteReader> rdr = pService->RenderMap(map, nullptr, imageFormat);
         rdr->ToFile(GetPath(L"../UnitTestFiles/SymbologyLinesCrossTick", imageFormat, extension));
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
 
-void TestRenderingService::TestCase_Annotation1(CREFSTRING imageFormat, CREFSTRING extension)
+static void TestCase_Annotation1(CREFSTRING imageFormat, CREFSTRING extension)
 {
     try
     {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdRenderingService> pService = dynamic_cast<MgdRenderingService*>(
+            factory->CreateService(MgServiceType::RenderingService));
+        REQUIRE(pService.p != nullptr);
+
         // make a runtime map
         Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_Annotation1.MapDefinition");
         Ptr<MgdMap> map = new MgdMap(mdfres, L"UnitTestAnnotation1");
@@ -1401,7 +1000,7 @@
         Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
         map->SetViewCenter(ptNewCenter);
         map->SetDisplayDpi(96);
-        map->SetDisplayWidth(2*pixels);
+        map->SetDisplayWidth(2 * pixels);
         map->SetDisplayHeight(pixels);
 
         // the map is a little silly -- it's in degrees but thinks it's in meters --
@@ -1411,22 +1010,28 @@
         map->SetViewScale(scale);
 
         // call the API
-        Ptr<MgByteReader> rdr = m_svcRendering->RenderMap(map, NULL, imageFormat);
+        Ptr<MgByteReader> rdr = pService->RenderMap(map, nullptr, imageFormat);
         rdr->ToFile(GetPath(L"../UnitTestFiles/Annotation1", imageFormat, extension));
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
 
-void TestRenderingService::TestCase_Annotation2(CREFSTRING imageFormat, CREFSTRING extension)
+static void TestCase_Annotation2(CREFSTRING imageFormat, CREFSTRING extension)
 {
     try
     {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdRenderingService> pService = dynamic_cast<MgdRenderingService*>(
+            factory->CreateService(MgServiceType::RenderingService));
+        REQUIRE(pService.p != nullptr);
+
         // make a runtime map
         Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_Annotation2.MapDefinition");
         Ptr<MgdMap> map = new MgdMap(mdfres, L"UnitTestAnnotation2");
@@ -1437,7 +1042,7 @@
         Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
         map->SetViewCenter(ptNewCenter);
         map->SetDisplayDpi(96);
-        map->SetDisplayWidth(2*pixels);
+        map->SetDisplayWidth(2 * pixels);
         map->SetDisplayHeight(pixels);
 
         // the map is a little silly -- it's in degrees but thinks it's in meters --
@@ -1447,22 +1052,28 @@
         map->SetViewScale(scale);
 
         // call the API
-        Ptr<MgByteReader> rdr = m_svcRendering->RenderMap(map, NULL, imageFormat);
+        Ptr<MgByteReader> rdr = pService->RenderMap(map, nullptr, imageFormat);
         rdr->ToFile(GetPath(L"../UnitTestFiles/Annotation2", imageFormat, extension));
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
 
-void TestRenderingService::TestCase_Annotation3(CREFSTRING imageFormat, CREFSTRING extension)
+static void TestCase_Annotation3(CREFSTRING imageFormat, CREFSTRING extension)
 {
     try
     {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdRenderingService> pService = dynamic_cast<MgdRenderingService*>(
+            factory->CreateService(MgServiceType::RenderingService));
+        REQUIRE(pService.p != nullptr);
+
         // make a runtime map
         Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_Annotation3.MapDefinition");
         Ptr<MgdMap> map = new MgdMap(mdfres, L"UnitTestAnnotation3");
@@ -1473,7 +1084,7 @@
         Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
         map->SetViewCenter(ptNewCenter);
         map->SetDisplayDpi(96);
-        map->SetDisplayWidth(2*pixels);
+        map->SetDisplayWidth(2 * pixels);
         map->SetDisplayHeight(pixels);
 
         // the map is a little silly -- it's in degrees but thinks it's in meters --
@@ -1483,22 +1094,28 @@
         map->SetViewScale(scale);
 
         // call the API
-        Ptr<MgByteReader> rdr = m_svcRendering->RenderMap(map, NULL, imageFormat);
+        Ptr<MgByteReader> rdr = pService->RenderMap(map, nullptr, imageFormat);
         rdr->ToFile(GetPath(L"../UnitTestFiles/Annotation3", imageFormat, extension));
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
 
-void TestRenderingService::TestCase_SymbologyPolygons(CREFSTRING imageFormat, CREFSTRING extension)
+static void TestCase_SymbologyPolygons(CREFSTRING imageFormat, CREFSTRING extension)
 {
     try
     {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdRenderingService> pService = dynamic_cast<MgdRenderingService*>(
+            factory->CreateService(MgServiceType::RenderingService));
+        REQUIRE(pService.p != nullptr);
+
         // make a runtime map
         Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_SymbologyPolygons.MapDefinition");
         Ptr<MgdMap> map = new MgdMap(mdfres, L"UnitTestSymbologyPolygons");
@@ -1511,28 +1128,17 @@
         map->SetDisplayHeight(1024);
 
         map->SetViewScale(12000.0);
-        Ptr<MgByteReader> rdr2 = m_svcRendering->RenderMap(map, NULL, imageFormat);
+        Ptr<MgByteReader> rdr2 = pService->RenderMap(map, nullptr, imageFormat);
         rdr2->ToFile(GetPath(L"../UnitTestFiles/SymbologyPolygons", imageFormat, extension));
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
-STRING TestRenderingService::GetPath(CREFSTRING basePath, CREFSTRING imageFormat, CREFSTRING extension)
-{
-	STRING ret;
-	ret += basePath;
-	ret += L"_";
-	ret += imageFormat;
-	ret += L".";
-	ret += extension;
-	return ret;
-}
-
 //void TestRenderingService::TestCase_RendererPerformance()
 //{
 //    /*
@@ -1556,7 +1162,7 @@
 //
 //    AGGRenderer* agg = new AGGRenderer(1024, 1024, RS_Color(0xffffffff), false, false, 0.0);
 //
-//    agg->StartMap(NULL, RS_Bounds(0,0,0,1024,1024,0), 1.0, 1.0, 1.0, NULL);
+//    agg->StartMap(nullptr, RS_Bounds(0,0,0,1024,1024,0), 1.0, 1.0, 1.0, nullptr);
 //
 //    clock_t t0 = clock();
 //
@@ -1575,7 +1181,7 @@
 //
 //    GDRenderer* gd = new GDRenderer(1024, 1024, RS_Color(0xffffffff), false);
 //
-//    gd->StartMap(NULL, RS_Bounds(0,0,0,1024,1024,0), 1.0, 1.0, 1.0, NULL);
+//    gd->StartMap(nullptr, RS_Bounds(0,0,0,1024,1024,0), 1.0, 1.0, 1.0, nullptr);
 //
 //    t0 = clock();
 //
@@ -1592,3 +1198,143 @@
 //
 //
 //}
+
+
+TEST_CASE("QueryFeatures", "[RenderingService]")
+{
+    try
+    {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgdRenderingService> pService = dynamic_cast<MgdRenderingService*>(
+            factory->CreateService(MgServiceType::RenderingService));
+        REQUIRE(pService.p != nullptr);
+
+        // make a runtime map
+        Ptr<MgdMap> map = CreateTestMap();
+
+        // call the API using a scale of 75000
+        map->SetViewScale(75000.0);
+
+        Ptr<MgStringCollection> layerNames1 = new MgStringCollection();
+        layerNames1->Add(L"Rail");
+        layerNames1->Add(L"HydrographicPolygons");
+        Ptr<MgPolygon> poly1 = CreateSelectionPolygon(map, 0.3, 0.3);
+        Ptr<MgdFeatureInformation> fi1 = pService->QueryFeatures(map, layerNames1, poly1, MgFeatureSpatialOperations::Within, -1);
+
+        // call the API using a scale of 12000
+        map->SetViewScale(12000.0);
+
+        Ptr<MgStringCollection> layerNames2 = new MgStringCollection();
+        layerNames2->Add(L"Rail");
+        layerNames2->Add(L"Parcels");
+        Ptr<MgPolygon> poly2 = CreateSelectionPolygon(map, 0.05, 0.05);
+        Ptr<MgdFeatureInformation> fi2 = pService->QueryFeatures(map, layerNames2, poly2, MgFeatureSpatialOperations::Within, -1);
+    }
+    catch (MgException* e)
+    {
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
+        SAFE_RELEASE(e);
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+    }
+    catch (...)
+    {
+        throw;
+    }
+}
+
+//PNG output tests
+TEST_CASE("RenderDynamicOverlayPNG", "[RenderingService]") { TestCase_RenderDynamicOverlay(L"PNG", L"png"); }
+TEST_CASE("RenderDynamicOverlayTiledMapPNG", "[RenderingService]") { TestCase_RenderDynamicOverlayTiledMap(L"PNG", L"png"); }
+TEST_CASE("RenderMapPNG", "[RenderingService]") { TestCase_RenderMap(L"PNG", L"png"); }
+TEST_CASE("RenderMapWithWatermarkPNG", "[RenderingService]") { TestCase_RenderMapWithWatermark(L"PNG", L"png"); }
+TEST_CASE("RenderLegendPNG", "[RenderingService]") { TestCase_RenderLegend(L"PNG", L"png"); }
+TEST_CASE("RenderLegendEmptyGroupsPNG", "[RenderingService]") { TestCase_RenderLegendEmptyGroups(L"PNG", L"png"); }
+TEST_CASE("SymbologyPointsPNG", "[RenderingService]") { TestCase_SymbologyPoints(L"PNG", L"png"); }
+TEST_CASE("SymbologyPointsParamPNG", "[RenderingService]") { TestCase_SymbologyPointsParam(L"PNG", L"png"); }
+TEST_CASE("SymbologyLinesPNG", "[RenderingService]") { TestCase_SymbologyLines(L"PNG", L"png"); }
+TEST_CASE("SymbologyLinesCrossTickPNG", "[RenderingService]") { TestCase_SymbologyLinesCrossTick(L"PNG", L"png"); }
+TEST_CASE("SymbologyPolygonsPNG", "[RenderingService]") { TestCase_SymbologyPolygons(L"PNG", L"png"); }
+TEST_CASE("Annotation1PNG", "[RenderingService]") { TestCase_Annotation1(L"PNG", L"png"); }
+TEST_CASE("Annotation2PNG", "[RenderingService]") { TestCase_Annotation2(L"PNG", L"png"); }
+TEST_CASE("Annotation3PNG", "[RenderingService]") { TestCase_Annotation3(L"PNG", L"png"); }
+TEST_CASE("RenderLegendMultiFTSPNG", "[RenderingService]") { TestCase_RenderLegendMultiFTS(L"PNG", L"png"); }
+TEST_CASE("RenderLegendMultiCTSPNG", "[RenderingService]") { TestCase_RenderLegendMultiCTS(L"PNG", L"png"); }
+TEST_CASE("RenderLegendMultiFTSWithThemePNG", "[RenderingService]") { TestCase_RenderLegendMultiFTSWithTheme(L"PNG", L"png"); }
+TEST_CASE("RenderLegendMultiCTSWithThemePNG", "[RenderingService]") { TestCase_RenderLegendMultiCTSWithTheme(L"PNG", L"png"); }
+TEST_CASE("RenderLegendMultiFTSSingleCTSPNG", "[RenderingService]") { TestCase_RenderLegendMultiFTSSingleCTS(L"PNG", L"png"); }
+TEST_CASE("RenderLegendSingleFTSMultiCTSPNG", "[RenderingService]") { TestCase_RenderLegendSingleFTSMultiCTS(L"PNG", L"png"); }
+TEST_CASE("StylizationFunctionsPNG", "[RenderingService]") { TestCase_StylizationFunctions(L"PNG", L"png"); }
+TEST_CASE("LayerWatermarkPNG", "[RenderingService]") { TestCase_LayerWatermark(L"PNG", L"png"); }
+
+//PNG8 output tests
+TEST_CASE("RenderDynamicOverlayPNG8", "[RenderingService]") { TestCase_RenderDynamicOverlay(L"PNG8", L"png"); }
+TEST_CASE("RenderDynamicOverlayTiledMapPNG8", "[RenderingService]") { TestCase_RenderDynamicOverlayTiledMap(L"PNG8", L"png"); }
+TEST_CASE("RenderMapPNG8", "[RenderingService]") { TestCase_RenderMap(L"PNG8", L"png"); }
+TEST_CASE("RenderMapWithWatermarkPNG8", "[RenderingService]") { TestCase_RenderMapWithWatermark(L"PNG8", L"png"); }
+TEST_CASE("RenderLegendPNG8", "[RenderingService]") { TestCase_RenderLegend(L"PNG8", L"png"); }
+TEST_CASE("RenderLegendEmptyGroupsPNG8", "[RenderingService]") { TestCase_RenderLegendEmptyGroups(L"PNG8", L"png"); }
+TEST_CASE("SymbologyPointsPNG8", "[RenderingService]") { TestCase_SymbologyPoints(L"PNG8", L"png"); }
+TEST_CASE("SymbologyPointsParamPNG8", "[RenderingService]") { TestCase_SymbologyPointsParam(L"PNG8", L"png"); }
+TEST_CASE("SymbologyLinesPNG8", "[RenderingService]") { TestCase_SymbologyLines(L"PNG8", L"png"); }
+TEST_CASE("SymbologyLinesCrossTickPNG8", "[RenderingService]") { TestCase_SymbologyLinesCrossTick(L"PNG8", L"png"); }
+TEST_CASE("SymbologyPolygonsPNG8", "[RenderingService]") { TestCase_SymbologyPolygons(L"PNG8", L"png"); }
+TEST_CASE("Annotation1PNG8", "[RenderingService]") { TestCase_Annotation1(L"PNG8", L"png"); }
+TEST_CASE("Annotation2PNG8", "[RenderingService]") { TestCase_Annotation2(L"PNG8", L"png"); }
+TEST_CASE("Annotation3PNG8", "[RenderingService]") { TestCase_Annotation3(L"PNG8", L"png"); }
+TEST_CASE("RenderLegendMultiFTSPNG8", "[RenderingService]") { TestCase_RenderLegendMultiFTS(L"PNG8", L"png"); }
+TEST_CASE("RenderLegendMultiCTSPNG8", "[RenderingService]") { TestCase_RenderLegendMultiCTS(L"PNG8", L"png"); }
+TEST_CASE("RenderLegendMultiFTSWithThemePNG8", "[RenderingService]") { TestCase_RenderLegendMultiFTSWithTheme(L"PNG8", L"png"); }
+TEST_CASE("RenderLegendMultiCTSWithThemePNG8", "[RenderingService]") { TestCase_RenderLegendMultiCTSWithTheme(L"PNG8", L"png"); }
+TEST_CASE("RenderLegendMultiFTSSingleCTSPNG8", "[RenderingService]") { TestCase_RenderLegendMultiFTSSingleCTS(L"PNG8", L"png"); }
+TEST_CASE("RenderLegendSingleFTSMultiCTSPNG8", "[RenderingService]") { TestCase_RenderLegendSingleFTSMultiCTS(L"PNG8", L"png"); }
+TEST_CASE("StylizationFunctionsPNG8", "[RenderingService]") { TestCase_StylizationFunctions(L"PNG8", L"png"); }
+TEST_CASE("LayerWatermarkPNG8", "[RenderingService]") { TestCase_LayerWatermark(L"PNG8", L"png"); }
+
+//GIF output tests
+TEST_CASE("RenderDynamicOverlayGIF", "[RenderingService]") { TestCase_RenderDynamicOverlay(L"GIF", L"gif"); }
+TEST_CASE("RenderDynamicOverlayTiledMapGIF", "[RenderingService]") { TestCase_RenderDynamicOverlayTiledMap(L"GIF", L"gif"); }
+TEST_CASE("RenderMapGIF", "[RenderingService]") { TestCase_RenderMap(L"GIF", L"gif"); }
+TEST_CASE("RenderMapWithWatermarkGIF", "[RenderingService]") { TestCase_RenderMapWithWatermark(L"GIF", L"gif"); }
+TEST_CASE("RenderLegendGIF", "[RenderingService]") { TestCase_RenderLegend(L"GIF", L"gif"); }
+TEST_CASE("RenderLegendEmptyGroupsGIF", "[RenderingService]") { TestCase_RenderLegendEmptyGroups(L"GIF", L"gif"); }
+TEST_CASE("SymbologyPointsGIF", "[RenderingService]") { TestCase_SymbologyPoints(L"GIF", L"gif"); }
+TEST_CASE("SymbologyPointsParamGIF", "[RenderingService]") { TestCase_SymbologyPointsParam(L"GIF", L"gif"); }
+TEST_CASE("SymbologyLinesGIF", "[RenderingService]") { TestCase_SymbologyLines(L"GIF", L"gif"); }
+TEST_CASE("SymbologyLinesCrossTickGIF", "[RenderingService]") { TestCase_SymbologyLinesCrossTick(L"GIF", L"gif"); }
+TEST_CASE("SymbologyPolygonsGIF", "[RenderingService]") { TestCase_SymbologyPolygons(L"GIF", L"gif"); }
+TEST_CASE("Annotation1GIF", "[RenderingService]") { TestCase_Annotation1(L"GIF", L"gif"); }
+TEST_CASE("Annotation2GIF", "[RenderingService]") { TestCase_Annotation2(L"GIF", L"gif"); }
+TEST_CASE("Annotation3GIF", "[RenderingService]") { TestCase_Annotation3(L"GIF", L"gif"); }
+TEST_CASE("RenderLegendMultiFTSGIF", "[RenderingService]") { TestCase_RenderLegendMultiFTS(L"GIF", L"gif"); }
+TEST_CASE("RenderLegendMultiCTSGIF", "[RenderingService]") { TestCase_RenderLegendMultiCTS(L"GIF", L"gif"); }
+TEST_CASE("RenderLegendMultiFTSWithThemeGIF", "[RenderingService]") { TestCase_RenderLegendMultiFTSWithTheme(L"GIF", L"gif"); }
+TEST_CASE("RenderLegendMultiCTSWithThemeGIF", "[RenderingService]") { TestCase_RenderLegendMultiCTSWithTheme(L"GIF", L"gif"); }
+TEST_CASE("RenderLegendMultiFTSSingleCTSGIF", "[RenderingService]") { TestCase_RenderLegendMultiFTSSingleCTS(L"GIF", L"gif"); }
+TEST_CASE("RenderLegendSingleFTSMultiCTSGIF", "[RenderingService]") { TestCase_RenderLegendSingleFTSMultiCTS(L"GIF", L"gif"); }
+TEST_CASE("StylizationFunctionsGIF", "[RenderingService]") { TestCase_StylizationFunctions(L"GIF", L"gif"); }
+TEST_CASE("LayerWatermarkGIF", "[RenderingService]") { TestCase_LayerWatermark(L"GIF", L"gif"); }
+
+//JPG output tests
+TEST_CASE("RenderDynamicOverlayJPG", "[RenderingService]") { TestCase_RenderDynamicOverlay(L"JPG", L"jpg"); }
+TEST_CASE("RenderDynamicOverlayTiledMapJPG", "[RenderingService]") { TestCase_RenderDynamicOverlayTiledMap(L"JPG", L"jpg"); }
+TEST_CASE("RenderMapJPG", "[RenderingService]") { TestCase_RenderMap(L"JPG", L"jpg"); }
+TEST_CASE("RenderMapWithWatermarkJPG", "[RenderingService]") { TestCase_RenderMapWithWatermark(L"JPG", L"jpg"); }
+TEST_CASE("RenderLegendJPG", "[RenderingService]") { TestCase_RenderLegend(L"JPG", L"jpg"); }
+TEST_CASE("RenderLegendEmptyGroupsJPG", "[RenderingService]") { TestCase_RenderLegendEmptyGroups(L"JPG", L"jpg"); }
+TEST_CASE("SymbologyPointsJPG", "[RenderingService]") { TestCase_SymbologyPoints(L"JPG", L"jpg"); }
+TEST_CASE("SymbologyPointsParamJPG", "[RenderingService]") { TestCase_SymbologyPointsParam(L"JPG", L"jpg"); }
+TEST_CASE("SymbologyLinesJPG", "[RenderingService]") { TestCase_SymbologyLines(L"JPG", L"jpg"); }
+TEST_CASE("SymbologyLinesCrossTickJPG", "[RenderingService]") { TestCase_SymbologyLinesCrossTick(L"JPG", L"jpg"); }
+TEST_CASE("SymbologyPolygonsJPG", "[RenderingService]") { TestCase_SymbologyPolygons(L"JPG", L"jpg"); }
+TEST_CASE("Annotation1JPG", "[RenderingService]") { TestCase_Annotation1(L"JPG", L"jpg"); }
+TEST_CASE("Annotation2JPG", "[RenderingService]") { TestCase_Annotation2(L"JPG", L"jpg"); }
+TEST_CASE("Annotation3JPG", "[RenderingService]") { TestCase_Annotation3(L"JPG", L"jpg"); }
+TEST_CASE("RenderLegendMultiFTSJPG", "[RenderingService]") { TestCase_RenderLegendMultiFTS(L"JPG", L"jpg"); }
+TEST_CASE("RenderLegendMultiCTSJPG", "[RenderingService]") { TestCase_RenderLegendMultiCTS(L"JPG", L"jpg"); }
+TEST_CASE("RenderLegendMultiFTSWithThemeJPG", "[RenderingService]") { TestCase_RenderLegendMultiFTSWithTheme(L"JPG", L"jpg"); }
+TEST_CASE("RenderLegendMultiCTSWithThemeJPG", "[RenderingService]") { TestCase_RenderLegendMultiCTSWithTheme(L"JPG", L"jpg"); }
+TEST_CASE("RenderLegendMultiFTSSingleCTSJPG", "[RenderingService]") { TestCase_RenderLegendMultiFTSSingleCTS(L"JPG", L"jpg"); }
+TEST_CASE("RenderLegendSingleFTSMultiCTSJPG", "[RenderingService]") { TestCase_RenderLegendSingleFTSMultiCTS(L"JPG", L"jpg"); }
+TEST_CASE("StylizationFunctionsJPG", "[RenderingService]") { TestCase_StylizationFunctions(L"JPG", L"jpg"); }
+TEST_CASE("LayerWatermarkJPG", "[RenderingService]") { TestCase_LayerWatermark(L"JPG", L"jpg"); }
\ No newline at end of file

Deleted: sandbox/jng/catch2/Desktop/UnitTest/TestRenderingService.h
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/TestRenderingService.h	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/UnitTest/TestRenderingService.h	2020-07-15 16:00:34 UTC (rev 9675)
@@ -1,289 +0,0 @@
-//
-//  Copyright (C) 2004-2010 by Autodesk, Inc.
-//
-//  This library is free software; you can redistribute it and/or
-//  modify it under the terms of version 2.1 of the GNU Lesser
-//  General Public License as published by the Free Software Foundation.
-//
-//  This library 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
-//  Lesser General Public License for more details.
-//
-//  You should have received a copy of the GNU Lesser General Public
-//  License along with this library; if not, write to the Free Software
-//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-//
-
-#ifndef _TESTRENDERINGSERVICE_H
-#define _TESTRENDERINGSERVICE_H
-
-#include <cppunit/extensions/HelperMacros.h>
-
-class TestRenderingService : public CppUnit::TestFixture
-{
-    CPPUNIT_TEST_SUITE(TestRenderingService);
-    CPPUNIT_TEST(TestStart); // This must be the very first unit test
-
-    CPPUNIT_TEST(TestCase_StylizationFunctionsPNG);
-
-    CPPUNIT_TEST(TestCase_SymbologyPointsPNG);
-    CPPUNIT_TEST(TestCase_SymbologyPointsParamPNG);
-    CPPUNIT_TEST(TestCase_SymbologyLinesPNG);
-    CPPUNIT_TEST(TestCase_SymbologyLinesCrossTickPNG);
-    CPPUNIT_TEST(TestCase_SymbologyPolygonsPNG);
-
-    CPPUNIT_TEST(TestCase_Annotation1PNG);
-    CPPUNIT_TEST(TestCase_Annotation2PNG);
-    CPPUNIT_TEST(TestCase_Annotation3PNG);
-
-    CPPUNIT_TEST(TestCase_RenderDynamicOverlayPNG);
-    CPPUNIT_TEST(TestCase_RenderDynamicOverlayTiledMapPNG);
-    CPPUNIT_TEST(TestCase_RenderMapPNG);
-    CPPUNIT_TEST(TestCase_RenderMapWithWatermarkPNG);
-    CPPUNIT_TEST(TestCase_RenderLegendPNG);
-    CPPUNIT_TEST(TestCase_RenderLegendEmptyGroupsPNG);
-    CPPUNIT_TEST(TestCase_RenderLegendMultiFTSPNG);
-    CPPUNIT_TEST(TestCase_RenderLegendMultiCTSPNG);
-    CPPUNIT_TEST(TestCase_RenderLegendMultiFTSWithThemePNG);
-    CPPUNIT_TEST(TestCase_RenderLegendMultiCTSWithThemePNG);
-    CPPUNIT_TEST(TestCase_RenderLegendMultiFTSSingleCTSPNG);
-    CPPUNIT_TEST(TestCase_RenderLegendSingleFTSMultiCTSPNG);
-    CPPUNIT_TEST(TestCase_LayerWatermarkPNG);
-
-    CPPUNIT_TEST(TestCase_StylizationFunctionsPNG8);
-
-	CPPUNIT_TEST(TestCase_SymbologyPointsPNG8);
-    CPPUNIT_TEST(TestCase_SymbologyPointsParamPNG8);
-    CPPUNIT_TEST(TestCase_SymbologyLinesPNG8);
-    CPPUNIT_TEST(TestCase_SymbologyLinesCrossTickPNG8);
-    CPPUNIT_TEST(TestCase_SymbologyPolygonsPNG8);
-
-    CPPUNIT_TEST(TestCase_Annotation1PNG8);
-    CPPUNIT_TEST(TestCase_Annotation2PNG8);
-    CPPUNIT_TEST(TestCase_Annotation3PNG8);
-
-    CPPUNIT_TEST(TestCase_RenderDynamicOverlayPNG8);
-    CPPUNIT_TEST(TestCase_RenderDynamicOverlayTiledMapPNG8);
-    CPPUNIT_TEST(TestCase_RenderMapPNG8);
-    CPPUNIT_TEST(TestCase_RenderMapWithWatermarkPNG8);
-    CPPUNIT_TEST(TestCase_RenderLegendPNG8);
-    CPPUNIT_TEST(TestCase_RenderLegendEmptyGroupsPNG8);
-    CPPUNIT_TEST(TestCase_RenderLegendMultiFTSPNG8);
-    CPPUNIT_TEST(TestCase_RenderLegendMultiCTSPNG8);
-    CPPUNIT_TEST(TestCase_RenderLegendMultiFTSWithThemePNG8);
-    CPPUNIT_TEST(TestCase_RenderLegendMultiCTSWithThemePNG8);
-    CPPUNIT_TEST(TestCase_RenderLegendMultiFTSSingleCTSPNG8);
-    CPPUNIT_TEST(TestCase_RenderLegendSingleFTSMultiCTSPNG8);
-    CPPUNIT_TEST(TestCase_LayerWatermarkPNG8);
-
-    CPPUNIT_TEST(TestCase_StylizationFunctionsGIF);
-
-	CPPUNIT_TEST(TestCase_SymbologyPointsGIF);
-    CPPUNIT_TEST(TestCase_SymbologyPointsParamGIF);
-    CPPUNIT_TEST(TestCase_SymbologyLinesGIF);
-    CPPUNIT_TEST(TestCase_SymbologyLinesCrossTickGIF);
-    CPPUNIT_TEST(TestCase_SymbologyPolygonsGIF);
-
-    CPPUNIT_TEST(TestCase_Annotation1GIF);
-    CPPUNIT_TEST(TestCase_Annotation2GIF);
-    CPPUNIT_TEST(TestCase_Annotation3GIF);
-
-    CPPUNIT_TEST(TestCase_RenderDynamicOverlayGIF);
-    CPPUNIT_TEST(TestCase_RenderDynamicOverlayTiledMapGIF);
-    CPPUNIT_TEST(TestCase_RenderMapGIF);
-    CPPUNIT_TEST(TestCase_RenderMapWithWatermarkGIF);
-    CPPUNIT_TEST(TestCase_RenderLegendGIF);
-    CPPUNIT_TEST(TestCase_RenderLegendEmptyGroupsGIF);
-    CPPUNIT_TEST(TestCase_RenderLegendMultiFTSGIF);
-    CPPUNIT_TEST(TestCase_RenderLegendMultiCTSGIF);
-    CPPUNIT_TEST(TestCase_RenderLegendMultiFTSWithThemeGIF);
-    CPPUNIT_TEST(TestCase_RenderLegendMultiCTSWithThemeGIF);
-    CPPUNIT_TEST(TestCase_RenderLegendMultiFTSSingleCTSGIF);
-    CPPUNIT_TEST(TestCase_RenderLegendSingleFTSMultiCTSGIF);
-    CPPUNIT_TEST(TestCase_LayerWatermarkGIF);
-
-    CPPUNIT_TEST(TestCase_StylizationFunctionsJPG);
-
-	CPPUNIT_TEST(TestCase_SymbologyPointsJPG);
-    CPPUNIT_TEST(TestCase_SymbologyPointsParamJPG);
-    CPPUNIT_TEST(TestCase_SymbologyLinesJPG);
-    CPPUNIT_TEST(TestCase_SymbologyLinesCrossTickJPG);
-    CPPUNIT_TEST(TestCase_SymbologyPolygonsJPG);
-
-    CPPUNIT_TEST(TestCase_Annotation1JPG);
-    CPPUNIT_TEST(TestCase_Annotation2JPG);
-    CPPUNIT_TEST(TestCase_Annotation3JPG);
-
-    CPPUNIT_TEST(TestCase_RenderDynamicOverlayJPG);
-    CPPUNIT_TEST(TestCase_RenderDynamicOverlayTiledMapJPG);
-    CPPUNIT_TEST(TestCase_RenderMapJPG);
-    CPPUNIT_TEST(TestCase_RenderMapWithWatermarkJPG);
-    CPPUNIT_TEST(TestCase_RenderLegendJPG);
-    CPPUNIT_TEST(TestCase_RenderLegendEmptyGroupsJPG);
-    CPPUNIT_TEST(TestCase_RenderLegendMultiFTSJPG);
-    CPPUNIT_TEST(TestCase_RenderLegendMultiCTSJPG);
-    CPPUNIT_TEST(TestCase_RenderLegendMultiFTSWithThemeJPG);
-    CPPUNIT_TEST(TestCase_RenderLegendMultiCTSWithThemeJPG);
-    CPPUNIT_TEST(TestCase_RenderLegendMultiFTSSingleCTSJPG);
-    CPPUNIT_TEST(TestCase_RenderLegendSingleFTSMultiCTSJPG);
-    CPPUNIT_TEST(TestCase_LayerWatermarkJPG);
-
-    CPPUNIT_TEST(TestCase_QueryFeatures);
-
-    //CPPUNIT_TEST(TestCase_RendererPerformance);
-
-    CPPUNIT_TEST(TestEnd); // This must be the very last unit test
-    CPPUNIT_TEST_SUITE_END();
-
-public:
-    TestRenderingService();
-    ~TestRenderingService();
-
-    void setUp();
-    void tearDown();
-    void TestStart();
-    void TestEnd();
-
-    void TestCase_QueryFeatures();
-
-    //Parameterized versions that all format-specific tests call into
-    void TestCase_RenderDynamicOverlay(CREFSTRING imageFormat, CREFSTRING extension);
-    void TestCase_RenderDynamicOverlayTiledMap(CREFSTRING imageFormat, CREFSTRING extension);
-    void TestCase_RenderMap(CREFSTRING imageFormat, CREFSTRING extension);
-    void TestCase_RenderMapWithWatermark(CREFSTRING imageFormat, CREFSTRING extension);
-    void TestCase_RenderLegend(CREFSTRING imageFormat, CREFSTRING extension);
-    void TestCase_RenderLegendEmptyGroups(CREFSTRING imageFormat, CREFSTRING extension);
-    void TestCase_RenderLegendMultiFTS(CREFSTRING imageFormat, CREFSTRING extension);
-    void TestCase_RenderLegendMultiCTS(CREFSTRING imageFormat, CREFSTRING extension);
-    void TestCase_RenderLegendMultiFTSWithTheme(CREFSTRING imageFormat, CREFSTRING extension);
-    void TestCase_RenderLegendMultiCTSWithTheme(CREFSTRING imageFormat, CREFSTRING extension);
-    void TestCase_RenderLegendMultiFTSSingleCTS(CREFSTRING imageFormat, CREFSTRING extension);
-    void TestCase_RenderLegendSingleFTSMultiCTS(CREFSTRING imageFormat, CREFSTRING extension);
-    
-    void TestCase_LayerWatermark(CREFSTRING imageFormat, CREFSTRING extension);
-
-    void TestCase_SymbologyPoints(CREFSTRING imageFormat, CREFSTRING extension);
-    void TestCase_SymbologyPointsParam(CREFSTRING imageFormat, CREFSTRING extension);
-    void TestCase_SymbologyLines(CREFSTRING imageFormat, CREFSTRING extension);
-    void TestCase_SymbologyLinesCrossTick(CREFSTRING imageFormat, CREFSTRING extension);
-    void TestCase_SymbologyPolygons(CREFSTRING imageFormat, CREFSTRING extension);
-
-    void TestCase_Annotation1(CREFSTRING imageFormat, CREFSTRING extension);
-    void TestCase_Annotation2(CREFSTRING imageFormat, CREFSTRING extension);
-    void TestCase_Annotation3(CREFSTRING imageFormat, CREFSTRING extension);
-
-    void TestCase_StylizationFunctions(CREFSTRING imageFormat, CREFSTRING extension);
-
-    //PNG output tests
-    void TestCase_RenderDynamicOverlayPNG() { TestCase_RenderDynamicOverlay(L"PNG", L"png"); }
-    void TestCase_RenderDynamicOverlayTiledMapPNG() { TestCase_RenderDynamicOverlayTiledMap(L"PNG", L"png"); }
-    void TestCase_RenderMapPNG() { TestCase_RenderMap(L"PNG", L"png"); }
-    void TestCase_RenderMapWithWatermarkPNG() { TestCase_RenderMapWithWatermark(L"PNG", L"png"); }
-    void TestCase_RenderLegendPNG() { TestCase_RenderLegend(L"PNG", L"png"); }
-    void TestCase_RenderLegendEmptyGroupsPNG() { TestCase_RenderLegendEmptyGroups(L"PNG", L"png"); }
-    void TestCase_SymbologyPointsPNG() { TestCase_SymbologyPoints(L"PNG", L"png"); }
-    void TestCase_SymbologyPointsParamPNG() { TestCase_SymbologyPointsParam(L"PNG", L"png"); }
-    void TestCase_SymbologyLinesPNG() { TestCase_SymbologyLines(L"PNG", L"png"); }
-    void TestCase_SymbologyLinesCrossTickPNG() { TestCase_SymbologyLinesCrossTick(L"PNG", L"png"); }
-    void TestCase_SymbologyPolygonsPNG() { TestCase_SymbologyPolygons(L"PNG", L"png"); }
-    void TestCase_Annotation1PNG() { TestCase_Annotation1(L"PNG", L"png"); }
-    void TestCase_Annotation2PNG() { TestCase_Annotation2(L"PNG", L"png"); }
-    void TestCase_Annotation3PNG() { TestCase_Annotation3(L"PNG", L"png"); }
-    void TestCase_RenderLegendMultiFTSPNG() { TestCase_RenderLegendMultiFTS(L"PNG", L"png"); }
-    void TestCase_RenderLegendMultiCTSPNG() { TestCase_RenderLegendMultiCTS(L"PNG", L"png"); }
-    void TestCase_RenderLegendMultiFTSWithThemePNG() { TestCase_RenderLegendMultiFTSWithTheme(L"PNG", L"png"); }
-    void TestCase_RenderLegendMultiCTSWithThemePNG() { TestCase_RenderLegendMultiCTSWithTheme(L"PNG", L"png"); }
-    void TestCase_RenderLegendMultiFTSSingleCTSPNG() { TestCase_RenderLegendMultiFTSSingleCTS(L"PNG", L"png"); }
-    void TestCase_RenderLegendSingleFTSMultiCTSPNG() { TestCase_RenderLegendSingleFTSMultiCTS(L"PNG", L"png"); }
-    void TestCase_StylizationFunctionsPNG() { TestCase_StylizationFunctions(L"PNG", L"png"); }
-    void TestCase_LayerWatermarkPNG() { TestCase_LayerWatermark(L"PNG", L"png"); }
-
-    //PNG8 output tests
-    void TestCase_RenderDynamicOverlayPNG8() { TestCase_RenderDynamicOverlay(L"PNG8", L"png"); }
-    void TestCase_RenderDynamicOverlayTiledMapPNG8() { TestCase_RenderDynamicOverlayTiledMap(L"PNG8", L"png"); }
-    void TestCase_RenderMapPNG8() { TestCase_RenderMap(L"PNG8", L"png"); }
-    void TestCase_RenderMapWithWatermarkPNG8() { TestCase_RenderMapWithWatermark(L"PNG8", L"png"); }
-    void TestCase_RenderLegendPNG8() { TestCase_RenderLegend(L"PNG8", L"png"); }
-    void TestCase_RenderLegendEmptyGroupsPNG8() { TestCase_RenderLegendEmptyGroups(L"PNG8", L"png"); }
-    void TestCase_SymbologyPointsPNG8() { TestCase_SymbologyPoints(L"PNG8", L"png"); }
-    void TestCase_SymbologyPointsParamPNG8() { TestCase_SymbologyPointsParam(L"PNG8", L"png"); }
-    void TestCase_SymbologyLinesPNG8() { TestCase_SymbologyLines(L"PNG8", L"png"); }
-    void TestCase_SymbologyLinesCrossTickPNG8() { TestCase_SymbologyLinesCrossTick(L"PNG8", L"png"); }
-    void TestCase_SymbologyPolygonsPNG8() { TestCase_SymbologyPolygons(L"PNG8", L"png"); }
-    void TestCase_Annotation1PNG8() { TestCase_Annotation1(L"PNG8", L"png"); }
-    void TestCase_Annotation2PNG8() { TestCase_Annotation2(L"PNG8", L"png"); }
-    void TestCase_Annotation3PNG8() { TestCase_Annotation3(L"PNG8", L"png"); }
-    void TestCase_RenderLegendMultiFTSPNG8() { TestCase_RenderLegendMultiFTS(L"PNG8", L"png"); }
-    void TestCase_RenderLegendMultiCTSPNG8() { TestCase_RenderLegendMultiCTS(L"PNG8", L"png"); }
-    void TestCase_RenderLegendMultiFTSWithThemePNG8() { TestCase_RenderLegendMultiFTSWithTheme(L"PNG8", L"png"); }
-    void TestCase_RenderLegendMultiCTSWithThemePNG8() { TestCase_RenderLegendMultiCTSWithTheme(L"PNG8", L"png"); }
-    void TestCase_RenderLegendMultiFTSSingleCTSPNG8() { TestCase_RenderLegendMultiFTSSingleCTS(L"PNG8", L"png"); }
-    void TestCase_RenderLegendSingleFTSMultiCTSPNG8() { TestCase_RenderLegendSingleFTSMultiCTS(L"PNG8", L"png"); }
-    void TestCase_StylizationFunctionsPNG8() { TestCase_StylizationFunctions(L"PNG8", L"png"); }
-    void TestCase_LayerWatermarkPNG8() { TestCase_LayerWatermark(L"PNG8", L"png"); }
-
-    //GIF output tests
-    void TestCase_RenderDynamicOverlayGIF() { TestCase_RenderDynamicOverlay(L"GIF", L"gif"); }
-    void TestCase_RenderDynamicOverlayTiledMapGIF() { TestCase_RenderDynamicOverlayTiledMap(L"GIF", L"gif"); }
-    void TestCase_RenderMapGIF() { TestCase_RenderMap(L"GIF", L"gif"); }
-    void TestCase_RenderMapWithWatermarkGIF() { TestCase_RenderMapWithWatermark(L"GIF", L"gif"); }
-    void TestCase_RenderLegendGIF() { TestCase_RenderLegend(L"GIF", L"gif"); }
-    void TestCase_RenderLegendEmptyGroupsGIF() { TestCase_RenderLegendEmptyGroups(L"GIF", L"gif"); }
-    void TestCase_SymbologyPointsGIF() { TestCase_SymbologyPoints(L"GIF", L"gif"); }
-    void TestCase_SymbologyPointsParamGIF() { TestCase_SymbologyPointsParam(L"GIF", L"gif"); }
-    void TestCase_SymbologyLinesGIF() { TestCase_SymbologyLines(L"GIF", L"gif"); }
-    void TestCase_SymbologyLinesCrossTickGIF() { TestCase_SymbologyLinesCrossTick(L"GIF", L"gif"); }
-    void TestCase_SymbologyPolygonsGIF() { TestCase_SymbologyPolygons(L"GIF", L"gif"); }
-    void TestCase_Annotation1GIF() { TestCase_Annotation1(L"GIF", L"gif"); }
-    void TestCase_Annotation2GIF() { TestCase_Annotation2(L"GIF", L"gif"); }
-    void TestCase_Annotation3GIF() { TestCase_Annotation3(L"GIF", L"gif"); }
-    void TestCase_RenderLegendMultiFTSGIF() { TestCase_RenderLegendMultiFTS(L"GIF", L"gif"); }
-    void TestCase_RenderLegendMultiCTSGIF() { TestCase_RenderLegendMultiCTS(L"GIF", L"gif"); }
-    void TestCase_RenderLegendMultiFTSWithThemeGIF() { TestCase_RenderLegendMultiFTSWithTheme(L"GIF", L"gif"); }
-    void TestCase_RenderLegendMultiCTSWithThemeGIF() { TestCase_RenderLegendMultiCTSWithTheme(L"GIF", L"gif"); }
-    void TestCase_RenderLegendMultiFTSSingleCTSGIF() { TestCase_RenderLegendMultiFTSSingleCTS(L"GIF", L"gif"); }
-    void TestCase_RenderLegendSingleFTSMultiCTSGIF() { TestCase_RenderLegendSingleFTSMultiCTS(L"GIF", L"gif"); }
-    void TestCase_StylizationFunctionsGIF() { TestCase_StylizationFunctions(L"GIF", L"gif"); }
-    void TestCase_LayerWatermarkGIF() { TestCase_LayerWatermark(L"GIF", L"gif"); }
-
-    //JPG output tests
-    void TestCase_RenderDynamicOverlayJPG() { TestCase_RenderDynamicOverlay(L"JPG", L"jpg"); }
-    void TestCase_RenderDynamicOverlayTiledMapJPG() { TestCase_RenderDynamicOverlayTiledMap(L"JPG", L"jpg"); }
-    void TestCase_RenderMapJPG() { TestCase_RenderMap(L"JPG", L"jpg"); }
-    void TestCase_RenderMapWithWatermarkJPG() { TestCase_RenderMapWithWatermark(L"JPG", L"jpg"); }
-    void TestCase_RenderLegendJPG() { TestCase_RenderLegend(L"JPG", L"jpg"); }
-    void TestCase_RenderLegendEmptyGroupsJPG() { TestCase_RenderLegendEmptyGroups(L"JPG", L"jpg"); }
-    void TestCase_SymbologyPointsJPG() { TestCase_SymbologyPoints(L"JPG", L"jpg"); }
-    void TestCase_SymbologyPointsParamJPG() { TestCase_SymbologyPointsParam(L"JPG", L"jpg"); }
-    void TestCase_SymbologyLinesJPG() { TestCase_SymbologyLines(L"JPG", L"jpg"); }
-    void TestCase_SymbologyLinesCrossTickJPG() { TestCase_SymbologyLinesCrossTick(L"JPG", L"jpg"); }
-    void TestCase_SymbologyPolygonsJPG() { TestCase_SymbologyPolygons(L"JPG", L"jpg"); }
-    void TestCase_Annotation1JPG() { TestCase_Annotation1(L"JPG", L"jpg"); }
-    void TestCase_Annotation2JPG() { TestCase_Annotation2(L"JPG", L"jpg"); }
-    void TestCase_Annotation3JPG() { TestCase_Annotation3(L"JPG", L"jpg"); }
-    void TestCase_RenderLegendMultiFTSJPG() { TestCase_RenderLegendMultiFTS(L"JPG", L"jpg"); }
-    void TestCase_RenderLegendMultiCTSJPG() { TestCase_RenderLegendMultiCTS(L"JPG", L"jpg"); }
-    void TestCase_RenderLegendMultiFTSWithThemeJPG() { TestCase_RenderLegendMultiFTSWithTheme(L"JPG", L"jpg"); }
-    void TestCase_RenderLegendMultiCTSWithThemeJPG() { TestCase_RenderLegendMultiCTSWithTheme(L"JPG", L"jpg"); }
-    void TestCase_RenderLegendMultiFTSSingleCTSJPG() { TestCase_RenderLegendMultiFTSSingleCTS(L"JPG", L"jpg"); }
-    void TestCase_RenderLegendSingleFTSMultiCTSJPG() { TestCase_RenderLegendSingleFTSMultiCTS(L"JPG", L"jpg"); }
-    void TestCase_StylizationFunctionsJPG() { TestCase_StylizationFunctions(L"JPG", L"jpg"); }
-    void TestCase_LayerWatermarkJPG() { TestCase_LayerWatermark(L"JPG", L"jpg"); }
-
-    //void TestCase_RendererPerformance();
-
-private:
-    MgdMap* CreateTestMap();
-    MgdMap* CreateTestTiledMap();
-    MgdMap* CreateTestStylizationFunctionMap();
-    MgdMap* CreateTestMapWithWatermark();
-    MgPolygon* CreateSelectionPolygon(MgdMap* map, double width, double height);
-    static STRING GetPath(CREFSTRING basePath, CREFSTRING imageFormat, CREFSTRING extension);
-
-private:
-    Ptr<MgResourceService> m_svcResource;
-    Ptr<MgdRenderingService> m_svcRendering;
-};
-
-#endif // _TESTRENDERINGSERVICE_H

Modified: sandbox/jng/catch2/Desktop/UnitTest/TestResourceService.cpp
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/TestResourceService.cpp	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/UnitTest/TestResourceService.cpp	2020-07-15 16:00:34 UTC (rev 9675)
@@ -18,11 +18,11 @@
 #include "MgDesktop.h"
 #include "Services/Resource/ResourceContentCache.h"
 #include "Fdo.h"
-#include "TestResourceService.h"
-#include "CppUnitExtensions.h"
 #include <ctime>
 
-CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(TestResourceService, "TestResourceService");
+#include "CatchHelperMacros.h"
+#include "TestServiceFactory.h"
+#include "catch.hpp"
 
 // define thread group for tiling tests
 #define THREAD_GROUP 65530
@@ -66,87 +66,12 @@
 STRING packageName = L"../UnitTestFiles/Shuttle.zip";
 #endif
 
-void TestResourceService::setUp()
-{
-}
-
-void TestResourceService::tearDown()
-{
-}
-
-void TestResourceService::TestStart()
-{
-    ACE_DEBUG((LM_INFO, ACE_TEXT("\nRunning Resource Service tests.\n")));
-
-    Ptr<MgdServiceFactory> fact = new MgdServiceFactory();
-    Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
-    if (pService == 0)
-    {
-        throw new MgServiceNotAvailableException(L"TestResourceService.TestEnd", __LINE__, __WFILE__, NULL, L"", NULL);
-    }
-
-    Ptr<MgResourceIdentifier> fs1 = new MgResourceIdentifier(L"Library://UnitTests/Data/acea.FeatureSource");
-    Ptr<MgByteSource> fs1Source = new MgByteSource(L"../UnitTestFiles/acea.fs", false);
-    Ptr<MgByteReader> fs1Reader = fs1Source->GetReader();
-    pService->SetResource(fs1, fs1Reader, NULL);
-
-    Ptr<MgByteSource> confSource = new MgByteSource(L"../UnitTestFiles/config.xml", false);
-    Ptr<MgByteReader> confReader = confSource->GetReader();
-    pService->SetResourceData(fs1, L"config.xml", MgResourceDataType::File, confReader);
-}
-
-void TestResourceService::TestEnd()
-{
-    try
-    {
-        Ptr<MgdServiceFactory> fact = new MgdServiceFactory();
-        Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
-        if (pService == 0)
-        {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestEnd", __LINE__, __WFILE__, NULL, L"", NULL);
-        }
-
-        // delete the drawing source definition
-        Ptr<MgResourceIdentifier> mapres1 = new MgResourceIdentifier(L"Library://UnitTests/Data/Shuttle.DrawingSource");
-        pService->DeleteResource(mapres1);
-
-        Ptr<MgResourceIdentifier> fs1 = new MgResourceIdentifier(L"Library://UnitTests/Data/acea.FeatureSource");
-        pService->DeleteResource(fs1);
-
-        // Delete any resources created
-        if (pService->ResourceExists(&resourceIdentifier))
-            pService->DeleteResource(&resourceIdentifier);
-        
-        if (pService->ResourceExists(&resourceIdentifier2))
-            pService->DeleteResource(&resourceIdentifier2);
-
-        if (pService->ResourceExists(&resourceIdentifier3))
-            pService->DeleteResource(&resourceIdentifier3);
-
-        if (pService->ResourceExists(&resourceIdentifier4))
-            pService->DeleteResource(&resourceIdentifier4);
-    }
-    catch (MgException* e)
-    {
-        STRING message = e->GetDetails(TEST_LOCALE);
-        SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
-    }
-    catch (...)
-    {
-        throw;
-    }
-
-    ACE_DEBUG((LM_INFO, ACE_TEXT("\nResource Service tests completed.\n\n")));
-}
-
-
 ///----------------------------------------------------------------------------
 /// Test Case Description:
 ///
 /// This test case enumerates the repositories.
 ///----------------------------------------------------------------------------
-void TestResourceService::TestCase_EnumerateRepositories()
+TEST_CASE("EnumerateRepositories", "[ResourceService]")
 {
     try
     {
@@ -154,16 +79,16 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_EnumerateRepositories", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_EnumerateRepositories", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
-        CPPUNIT_ASSERT_THROW_MG(pService->EnumerateRepositories(L"Library"), MgNotImplementedException*);
+        REQUIRE_THROWS_MG(pService->EnumerateRepositories(L"Library"), MgNotImplementedException*);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
@@ -172,7 +97,7 @@
 ///
 /// This test case creates a new repository
 ///----------------------------------------------------------------------------
-void TestResourceService::TestCase_CreateRepository()
+TEST_CASE("CreateRepository", "[ResourceService]")
 {
     try
     {
@@ -180,16 +105,16 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_CreateRepository", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_CreateRepository", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
-        CPPUNIT_ASSERT_THROW_MG(pService->CreateRepository(NULL, NULL, NULL), MgNotImplementedException*);
+        REQUIRE_THROWS_MG(pService->CreateRepository(nullptr, nullptr, nullptr), MgNotImplementedException*);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
@@ -198,7 +123,7 @@
 ///
 /// This test case updates the repository that was created earlier
 ///----------------------------------------------------------------------------
-void TestResourceService::TestCase_UpdateRepository()
+TEST_CASE("UpdateRepository", "[ResourceService]")
 {
     try
     {
@@ -206,16 +131,16 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_UpdateRepository", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_UpdateRepository", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
-        CPPUNIT_ASSERT_THROW_MG(pService->UpdateRepository(NULL, NULL, NULL), MgNotImplementedException*);
+        REQUIRE_THROWS_MG(pService->UpdateRepository(nullptr, nullptr, nullptr), MgNotImplementedException*);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
@@ -224,7 +149,7 @@
 ///
 /// This test case gets the content of the repository created earlier
 ///----------------------------------------------------------------------------
-void TestResourceService::TestCase_GetRepositoryContent()
+TEST_CASE("GetRepositoryContent", "[ResourceService]")
 {
     try
     {
@@ -232,16 +157,16 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_GetRepositoryContent", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_GetRepositoryContent", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
         
-        CPPUNIT_ASSERT_THROW_MG(pService->GetRepositoryContent(NULL), MgNotImplementedException*);
+        REQUIRE_THROWS_MG(pService->GetRepositoryContent(nullptr), MgNotImplementedException*);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
@@ -250,7 +175,7 @@
 ///
 /// This test case gets the header of the Library:// repository
 ///----------------------------------------------------------------------------
-void TestResourceService::TestCase_GetRepositoryHeader()
+TEST_CASE("GetRepositoryHeader", "[ResourceService]")
 {
     try
     {
@@ -258,17 +183,17 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_GetRepositoryHeader", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_GetRepositoryHeader", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
-        //Try to get repository header using a NULL argument
-        CPPUNIT_ASSERT_THROW_MG(pService->GetRepositoryHeader(NULL), MgNotImplementedException*);
+        //Try to get repository header using a nullptr argument
+        REQUIRE_THROWS_MG(pService->GetRepositoryHeader(nullptr), MgNotImplementedException*);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
@@ -277,7 +202,7 @@
 ///
 /// This test case applies a resource package
 ///----------------------------------------------------------------------------
-void TestResourceService::TestCase_ApplyResourcePackage()
+TEST_CASE("ApplyResourcePackage", "[ResourceService]")
 {
     try
     {
@@ -285,11 +210,11 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_ApplyResourcePackage", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_ApplyResourcePackage", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
-        //Try using NULL argument
-        CPPUNIT_ASSERT_THROW_MG(pService->ApplyResourcePackage(NULL), MgNullArgumentException*);
+        //Try using nullptr argument
+        REQUIRE_THROWS_MG(pService->ApplyResourcePackage(nullptr), MgNullArgumentException*);
 
         //Not try the real thing
         Ptr<MgByteSource> byteSource = new MgByteSource(packageName);
@@ -300,9 +225,9 @@
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
@@ -312,7 +237,7 @@
 ///
 /// This test case deletes the repository created earlier
 ///----------------------------------------------------------------------------
-void TestResourceService::TestCase_DeleteRepository()
+TEST_CASE("DeleteRepository", "[ResourceService]")
 {
     try
     {
@@ -320,16 +245,16 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_DeleteRepository", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_DeleteRepository", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
-        CPPUNIT_ASSERT_THROW_MG(pService->DeleteRepository(NULL), MgNotImplementedException*);
+        REQUIRE_THROWS_MG(pService->DeleteRepository(nullptr), MgNotImplementedException*);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
@@ -338,7 +263,7 @@
 ///
 /// This test case checks to see if the specified resource exists.
 ///----------------------------------------------------------------------------
-void TestResourceService::TestCase_ResourceExists()
+TEST_CASE("ResourceExists", "[ResourceService]")
 {
     try
     {
@@ -345,30 +270,30 @@
         Ptr<MgdServiceFactory> fact = new MgdServiceFactory();
         Ptr<MgResourceService> service = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
 
-        if (NULL == service)
+        if (nullptr == service)
         {
             throw new MgServiceNotAvailableException(
                 L"TestResourceService.TestCase_ResourceExists",
-                __LINE__, __WFILE__, NULL, L"", NULL);
+                __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
-        // Try to check a NULL resource.
+        // Try to check a nullptr resource.
         bool existed = false;
-        CPPUNIT_ASSERT_THROW_MG(service->ResourceExists(NULL), MgNullArgumentException*);
+        REQUIRE_THROWS_MG(service->ResourceExists(nullptr), MgNullArgumentException*);
 
         // Try to check a resource that exists
         existed = service->ResourceExists(&libraryRepositoryIdentifier);
-        CPPUNIT_ASSERT(existed);
+        REQUIRE(existed);
 
         // Try to check a resource that does not exist.
         existed = service->ResourceExists(&resourceNotExist);
-        CPPUNIT_ASSERT(!existed);
+        REQUIRE(!existed);
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
@@ -377,7 +302,7 @@
 ///
 /// This test case enumerates the resources in Library://
 ///----------------------------------------------------------------------------
-void TestResourceService::TestCase_EnumerateResources()
+TEST_CASE("EnumerateResources", "[ResourceService]")
 {
     try
     {
@@ -385,22 +310,22 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_EnumerateResources", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_EnumerateResources", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
-        //Try to enumerate resources using a NULL argument
-        CPPUNIT_ASSERT_THROW_MG(pService->EnumerateResources(NULL, -1, L"", true), MgNullArgumentException*);
+        //Try to enumerate resources using a nullptr argument
+        REQUIRE_THROWS_MG(pService->EnumerateResources(nullptr, -1, L"", true), MgNullArgumentException*);
 
         // Enumerate the Library resource.
         Ptr<MgByteReader> byteReader = pService->EnumerateResources(&libraryRepositoryIdentifier, -1, L"", true);
         STRING mimeType = byteReader->GetMimeType();
-        CPPUNIT_ASSERT(wcscmp(mimeType.c_str(), MgMimeType::Xml.c_str()) == 0);
+        REQUIRE(wcscmp(mimeType.c_str(), MgMimeType::Xml.c_str()) == 0);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 ///----------------------------------------------------------------------------
@@ -409,7 +334,7 @@
 /// This test case uses the SetResource function to add and update
 /// a resource
 ///----------------------------------------------------------------------------
-void TestResourceService::TestCase_SetResource()
+TEST_CASE("SetResource", "[ResourceService]")
 {
     try
     {
@@ -417,40 +342,40 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_SetResource", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_SetResource", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgByteSource> contentSource;
-        contentSource = NULL;
+        contentSource = nullptr;
 
-        //Try to use NULL arguments
-        CPPUNIT_ASSERT_THROW_MG(pService->SetResource(NULL, NULL, NULL), MgNullArgumentException*);
-        CPPUNIT_ASSERT_THROW_MG(pService->SetResource(&resourceIdentifier, NULL, NULL), MgNullArgumentException*);
+        //Try to use nullptr arguments
+        REQUIRE_THROWS_MG(pService->SetResource(nullptr, nullptr, nullptr), MgNullArgumentException*);
+        REQUIRE_THROWS_MG(pService->SetResource(&resourceIdentifier, nullptr, nullptr), MgNullArgumentException*);
 
         //Add a new resource
         contentSource = new MgByteSource(resourceContentFileName);
         Ptr<MgByteReader> contentReader = contentSource->GetReader();
-        pService->SetResource(&resourceIdentifier, contentReader, NULL);
+        pService->SetResource(&resourceIdentifier, contentReader, nullptr);
 
         //Try to add the same resource again (should be fine and just update it)
         contentSource = new MgByteSource(resourceContentFileName);
         contentReader = contentSource->GetReader();
-        pService->SetResource(&resourceIdentifier, contentReader, NULL);
+        pService->SetResource(&resourceIdentifier, contentReader, nullptr);
 
         //Add another resource layer definition, which references to the feature source. This is for cascade MoveResource test.
         contentSource = new MgByteSource(resourceContentFileName2);
         contentReader = contentSource->GetReader();
-        pService->SetResource(&resourceIdentifier4, contentReader, NULL);
+        pService->SetResource(&resourceIdentifier4, contentReader, nullptr);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
-void TestResourceService::TestCase_SetResourceInvalid()
+TEST_CASE("SetResourceInvalid", "[ResourceService]")
 {
     try
     {
@@ -458,7 +383,7 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_MoveResource", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_MoveResource", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         std::string notXml = "Not XML content";
@@ -496,28 +421,28 @@
         //TODO: We can get xerces to vet the content as being XML, but can't figure out how to get xerces
         //to validate the content model. Until we figure that out, the relevant assertions are commented
         //out. Still at this stage it's better than letting any arbitrary content get through these calls.
-        CPPUNIT_ASSERT_THROW_MG(pService->SetResource(resId, r1, NULL), MgXmlParserException*);
-        CPPUNIT_ASSERT_THROW_MG(pService->SetResource(resId, r2, NULL), MgXmlParserException*);
-        //CPPUNIT_ASSERT_THROW_MG(pService->SetResource(resId, r3, NULL), MgXmlParserException*);
-        CPPUNIT_ASSERT_THROW_MG(pService->SetResource(ldfId, r3, NULL), MgInvalidResourceTypeException*);
+        REQUIRE_THROWS_MG(pService->SetResource(resId, r1, nullptr), MgXmlParserException*);
+        REQUIRE_THROWS_MG(pService->SetResource(resId, r2, nullptr), MgXmlParserException*);
+        //REQUIRE_THROWS_MG(pService->SetResource(resId, r3, nullptr), MgXmlParserException*);
+        REQUIRE_THROWS_MG(pService->SetResource(ldfId, r3, nullptr), MgInvalidResourceTypeException*);
         r3->Rewind();
-        CPPUNIT_ASSERT_THROW_MG(pService->SetResource(mdfId, r3, NULL), MgInvalidResourceTypeException*);
+        REQUIRE_THROWS_MG(pService->SetResource(mdfId, r3, nullptr), MgInvalidResourceTypeException*);
         r3->Rewind();
-        CPPUNIT_ASSERT_THROW_MG(pService->SetResource(pltId, r3, NULL), MgInvalidResourceTypeException*);
+        REQUIRE_THROWS_MG(pService->SetResource(pltId, r3, nullptr), MgInvalidResourceTypeException*);
         r3->Rewind();
-        CPPUNIT_ASSERT_THROW_MG(pService->SetResource(symId, r3, NULL), MgInvalidResourceTypeException*);
+        REQUIRE_THROWS_MG(pService->SetResource(symId, r3, nullptr), MgInvalidResourceTypeException*);
         r3->Rewind();
-        CPPUNIT_ASSERT_THROW_MG(pService->SetResource(slbId, r3, NULL), MgInvalidResourceTypeException*);
-        CPPUNIT_ASSERT_THROW_MG(pService->SetResource(resId, r4, NULL), MgInvalidResourceTypeException*);
-        //CPPUNIT_ASSERT_THROW_MG(pService->SetResource(resId, r5, NULL), MgXmlParserException*);
-        pService->SetResource(ssId, r6, NULL);
-        pService->SetResource(csId, r7, NULL);
+        REQUIRE_THROWS_MG(pService->SetResource(slbId, r3, nullptr), MgInvalidResourceTypeException*);
+        REQUIRE_THROWS_MG(pService->SetResource(resId, r4, nullptr), MgInvalidResourceTypeException*);
+        //REQUIRE_THROWS_MG(pService->SetResource(resId, r5, nullptr), MgXmlParserException*);
+        pService->SetResource(ssId, r6, nullptr);
+        pService->SetResource(csId, r7, nullptr);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
@@ -527,7 +452,7 @@
 /// This test case moves the resource that was created earlier to a new
 /// location
 ///----------------------------------------------------------------------------
-void TestResourceService::TestCase_MoveResource()
+TEST_CASE("MoveResource", "[ResourceService]")
 {
     try
     {
@@ -535,24 +460,24 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_MoveResource", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_MoveResource", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
-        //Try to use NULL arguments
-        CPPUNIT_ASSERT_THROW_MG(pService->MoveResource(NULL, NULL, true, false), MgNullArgumentException*);
-        CPPUNIT_ASSERT_THROW_MG(pService->MoveResource(&resourceIdentifier, NULL, true, true), MgNullArgumentException*);
-        CPPUNIT_ASSERT_THROW_MG(pService->MoveResource(NULL, &resourceIdentifier, true, false), MgNullArgumentException*);
+        //Try to use nullptr arguments
+        REQUIRE_THROWS_MG(pService->MoveResource(nullptr, nullptr, true, false), MgNullArgumentException*);
+        REQUIRE_THROWS_MG(pService->MoveResource(&resourceIdentifier, nullptr, true, true), MgNullArgumentException*);
+        REQUIRE_THROWS_MG(pService->MoveResource(nullptr, &resourceIdentifier, true, false), MgNullArgumentException*);
 
         //Try to move a resource that doesn't exist
-        CPPUNIT_ASSERT_THROW_MG(pService->MoveResource(&resourceNotExist, &resourceIdentifier2, false, true), MgResourceNotFoundException*);
+        REQUIRE_THROWS_MG(pService->MoveResource(&resourceNotExist, &resourceIdentifier2, false, true), MgResourceNotFoundException*);
 
         //Move the resource that was added earlier with cascade = true, and check referencing resource.
         pService->MoveResource(&resourceIdentifier, &resourceIdentifier2, false, true);
-        CPPUNIT_ASSERT(!pService->ResourceExists(&resourceIdentifier));
+        REQUIRE(!pService->ResourceExists(&resourceIdentifier));
         //Ptr<MgByteReader> byteReader = pService->GetResourceContent(&resourceIdentifier4, L"");
         //STRING referenceContent = byteReader->ToString();
         //STRING featureIdTag = L"<ResourceId>Library://UnitTests/Data/test-2.FeatureSource</ResourceId>";
-        //CPPUNIT_ASSERT(referenceContent.find(featureIdTag) != STRING::npos);
+        //REQUIRE(referenceContent.find(featureIdTag) != STRING::npos);
 
         //Move the resource again with cascade = false, and check referencing resource.
         pService->MoveResource(&resourceIdentifier2, &resourceIdentifier, false, false);
@@ -559,17 +484,17 @@
         //byteReader = pService->GetResourceContent(&resourceIdentifier4, L"");
         //referenceContent = byteReader->ToString();
         //featureIdTag = L"<ResourceId>Library://UnitTests/Data/test-2.FeatureSource</ResourceId>";
-        //CPPUNIT_ASSERT(referenceContent.find(featureIdTag) != STRING::npos);
-        CPPUNIT_ASSERT(!pService->ResourceExists(&resourceIdentifier2));
+        //REQUIRE(referenceContent.find(featureIdTag) != STRING::npos);
+        REQUIRE(!pService->ResourceExists(&resourceIdentifier2));
 
         //Try to move the resource into itself (ie. itself)
-        CPPUNIT_ASSERT_THROW_MG(pService->MoveResource(&resourceIdentifier, &resourceIdentifier, false), MgInvalidArgumentException*);
+        REQUIRE_THROWS_MG(pService->MoveResource(&resourceIdentifier, &resourceIdentifier, false), MgInvalidArgumentException*);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
@@ -579,7 +504,7 @@
 /// This test case copies the resource that was just moved to the original
 /// location that it was moved from.
 ///----------------------------------------------------------------------------
-void TestResourceService::TestCase_CopyResource()
+TEST_CASE("CopyResource", "[ResourceService]")
 {
     try
     {
@@ -587,28 +512,28 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_CopyResource", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_CopyResource", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
-        //Try to use NULL arguments
-        CPPUNIT_ASSERT_THROW_MG(pService->CopyResource(NULL, NULL, true), MgNullArgumentException*);
-        CPPUNIT_ASSERT_THROW_MG(pService->CopyResource(&resourceIdentifier, NULL, true), MgNullArgumentException*);
-        CPPUNIT_ASSERT_THROW_MG(pService->CopyResource(NULL, &resourceIdentifier2, true), MgNullArgumentException*);
+        //Try to use nullptr arguments
+        REQUIRE_THROWS_MG(pService->CopyResource(nullptr, nullptr, true), MgNullArgumentException*);
+        REQUIRE_THROWS_MG(pService->CopyResource(&resourceIdentifier, nullptr, true), MgNullArgumentException*);
+        REQUIRE_THROWS_MG(pService->CopyResource(nullptr, &resourceIdentifier2, true), MgNullArgumentException*);
 
         //Try to use source & destination as the same thing
-        CPPUNIT_ASSERT_THROW_MG(pService->CopyResource(&resourceIdentifier2, &resourceIdentifier2, false), MgInvalidArgumentException*);
+        REQUIRE_THROWS_MG(pService->CopyResource(&resourceIdentifier2, &resourceIdentifier2, false), MgInvalidArgumentException*);
 
         //Copy the moved resource to another location
         pService->CopyResource(&resourceIdentifier, &resourceIdentifier2, false);
 
         //Try to copy a resource to one that should now exist
-        CPPUNIT_ASSERT_THROW_MG(pService->CopyResource(&resourceIdentifier2, &resourceIdentifier, false), MgDuplicateResourceException*);
+        REQUIRE_THROWS_MG(pService->CopyResource(&resourceIdentifier2, &resourceIdentifier, false), MgDuplicateResourceException*);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 ///----------------------------------------------------------------------------
@@ -616,7 +541,7 @@
 ///
 /// This test case gets the content of the resource
 ///----------------------------------------------------------------------------
-void TestResourceService::TestCase_GetResourceContent()
+TEST_CASE("GetResourceContent", "[ResourceService]")
 {
     try
     {
@@ -624,28 +549,28 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_GetResourceContent", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_GetResourceContent", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgByteReader> byteReader;
-        byteReader = NULL;
+        byteReader = nullptr;
 
-        //Try to get the content using NULL arguments
-        CPPUNIT_ASSERT_THROW_MG(pService->GetResourceContent(NULL, L""), MgNullArgumentException*);
+        //Try to get the content using nullptr arguments
+        REQUIRE_THROWS_MG(pService->GetResourceContent(nullptr, L""), MgNullArgumentException*);
 
         //Try to get the content of a resource that doesn't exist
-        CPPUNIT_ASSERT_THROW_MG(pService->GetResourceContent(&resourceNotExist, L""), MgResourceNotFoundException*);
+        REQUIRE_THROWS_MG(pService->GetResourceContent(&resourceNotExist, L""), MgResourceNotFoundException*);
 
         //Get the content of the resource that was added in TestCase_SetResource
         byteReader = pService->GetResourceContent(&resourceIdentifier, L"");
         STRING mimeType = byteReader->GetMimeType();
-        CPPUNIT_ASSERT(wcscmp(mimeType.c_str(), MgMimeType::Xml.c_str()) == 0);
+        REQUIRE(wcscmp(mimeType.c_str(), MgMimeType::Xml.c_str()) == 0);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
@@ -654,7 +579,7 @@
 ///
 /// This test case gets the contents of a collection of resources
 ///----------------------------------------------------------------------------
-void TestResourceService::TestCase_GetResourceContents()
+TEST_CASE("GetResourceContents", "[ResourceService]")
 {
     try
     {
@@ -662,34 +587,34 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_GetResourceContents", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_GetResourceContents", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
-        //Try to get the contents using NULL arguments
-        CPPUNIT_ASSERT_THROW_MG(pService->GetResourceContents(NULL, NULL), MgNullArgumentException*);
+        //Try to get the contents using nullptr arguments
+        REQUIRE_THROWS_MG(pService->GetResourceContents(nullptr, nullptr), MgNullArgumentException*);
 
         //Try to get the content of a resource that doesn't exist
         Ptr<MgStringCollection> resourceNotExistCol = new MgStringCollection();
         resourceNotExistCol->Add(resourceNotExist.ToString());
         resourceNotExistCol->Add(resourceIdentifier.ToString());
-        CPPUNIT_ASSERT_THROW_MG(pService->GetResourceContents(resourceNotExistCol, NULL), MgResourceNotFoundException*);
+        REQUIRE_THROWS_MG(pService->GetResourceContents(resourceNotExistCol, nullptr), MgResourceNotFoundException*);
 
         //Get the content of the resource that was added in TestCase_SetResource
         Ptr<MgStringCollection> resourceIds = new MgStringCollection();
         resourceIds->Add(resourceIdentifier.ToString());
         resourceIds->Add(resourceIdentifier4.ToString());
-        Ptr<MgStringCollection> ret = pService->GetResourceContents(resourceIds, NULL);
-        CPPUNIT_ASSERT(ret->GetCount() == 2);
+        Ptr<MgStringCollection> ret = pService->GetResourceContents(resourceIds, nullptr);
+        REQUIRE(ret->GetCount() == 2);
         for(int i = 0; i < ret->GetCount(); i ++)
         {
-            CPPUNIT_ASSERT(!ret->GetItem(i).empty());
+            REQUIRE(!ret->GetItem(i).empty());
         }
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
@@ -698,7 +623,7 @@
 ///
 /// This test case gets the header of the resource
 ///----------------------------------------------------------------------------
-void TestResourceService::TestCase_GetResourceHeader()
+TEST_CASE("GetResourceHeader", "[ResourceService]")
 {
     try
     {
@@ -706,16 +631,16 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_GetResourceHeader", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_GetResourceHeader", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
-        CPPUNIT_ASSERT_THROW_MG(pService->GetResourceHeader(NULL), MgNotImplementedException*);
+        REQUIRE_THROWS_MG(pService->GetResourceHeader(nullptr), MgNotImplementedException*);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
@@ -724,7 +649,7 @@
 ///
 /// This test case enumerates the references of the resource
 ///----------------------------------------------------------------------------
-void TestResourceService::TestCase_EnumerateReferences()
+TEST_CASE("EnumerateReferences", "[ResourceService]")
 {
     try
     {
@@ -732,16 +657,16 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_EnumerateReferences", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_EnumerateReferences", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
-        CPPUNIT_ASSERT_THROW_MG(pService->EnumerateReferences(NULL), MgNotImplementedException*);
+        REQUIRE_THROWS_MG(pService->EnumerateReferences(nullptr), MgNotImplementedException*);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
@@ -750,7 +675,7 @@
 ///
 /// This test case changes the owner of a resource
 ///----------------------------------------------------------------------------
-void TestResourceService::TestCase_ChangeResourceOwner()
+TEST_CASE("ChangeResourceOwner", "[ResourceService]")
 {
     try
     {
@@ -758,16 +683,16 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_ChangeResourceOwner", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_ChangeResourceOwner", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
-        CPPUNIT_ASSERT_THROW_MG(pService->ChangeResourceOwner(NULL, L"", false), MgNotImplementedException*);
+        REQUIRE_THROWS_MG(pService->ChangeResourceOwner(nullptr, L"", false), MgNotImplementedException*);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
@@ -776,7 +701,7 @@
 ///
 /// This test case sets all decendants of the resource to inherit permissions
 ///----------------------------------------------------------------------------
-void TestResourceService::TestCase_InheritPermissionsFrom()
+TEST_CASE("InheritPermissionsFrom", "[ResourceService]")
 {
     try
     {
@@ -784,16 +709,16 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_InheritPermissionsFrom", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_InheritPermissionsFrom", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
-        CPPUNIT_ASSERT_THROW_MG(pService->InheritPermissionsFrom(NULL), MgNotImplementedException*);
+        REQUIRE_THROWS_MG(pService->InheritPermissionsFrom(nullptr), MgNotImplementedException*);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
@@ -803,7 +728,7 @@
 /// This test case enumerates the resource data of the resource that was
 /// added earlier
 ///----------------------------------------------------------------------------
-void TestResourceService::TestCase_EnumerateResourceData()
+TEST_CASE("EnumerateResourceData", "[ResourceService]")
 {
     try
     {
@@ -811,28 +736,28 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_EnumerateResourceData", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_EnumerateResourceData", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgByteReader> byteReader;
-        byteReader = NULL;
+        byteReader = nullptr;
 
-        //Try enumerating using a NULL argument
-        CPPUNIT_ASSERT_THROW_MG(pService->EnumerateResourceData(NULL), MgNullArgumentException*);
+        //Try enumerating using a nullptr argument
+        REQUIRE_THROWS_MG(pService->EnumerateResourceData(nullptr), MgNullArgumentException*);
 
         //Try enumerating using a resource that doesn't exist
-        CPPUNIT_ASSERT_THROW_MG(pService->EnumerateResourceData(&resourceNotExist), MgResourceNotFoundException*);
+        REQUIRE_THROWS_MG(pService->EnumerateResourceData(&resourceNotExist), MgResourceNotFoundException*);
 
         //Enumerate the resource data of the resource added earlier
         byteReader = pService->EnumerateResourceData(&resourceIdentifier);
         STRING mimeType = byteReader->GetMimeType();
-        CPPUNIT_ASSERT(wcscmp(mimeType.c_str(), MgMimeType::Xml.c_str()) == 0);
+        REQUIRE(wcscmp(mimeType.c_str(), MgMimeType::Xml.c_str()) == 0);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
@@ -841,7 +766,7 @@
 ///
 /// This test case sets the data of a resource
 ///----------------------------------------------------------------------------
-void TestResourceService::TestCase_SetResourceData()
+TEST_CASE("SetResourceData", "[ResourceService]")
 {
     try
     {
@@ -849,19 +774,19 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_SetResourceData", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_SetResourceData", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgByteSource> dataSource;
-        dataSource = NULL;
+        dataSource = nullptr;
 
-        //Try using a NULL identifier
-        CPPUNIT_ASSERT_THROW_MG(pService->SetResourceData(NULL, L"", L"", NULL), MgNullArgumentException*);
+        //Try using a nullptr identifier
+        REQUIRE_THROWS_MG(pService->SetResourceData(nullptr, L"", L"", nullptr), MgNullArgumentException*);
 
         //Try to name the resource data with a 0 character string
         dataSource = new MgByteSource(dataFileName);
         Ptr<MgByteReader> dataReader = dataSource->GetReader();
-        CPPUNIT_ASSERT_THROW_MG(pService->SetResourceData(&resourceIdentifier, L"", L"File", dataReader), MgNullArgumentException*);
+        REQUIRE_THROWS_MG(pService->SetResourceData(&resourceIdentifier, L"", L"File", dataReader), MgNullArgumentException*);
 
         //Set the resource data
         dataSource = new MgByteSource(dataFileName);
@@ -870,9 +795,9 @@
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
@@ -881,7 +806,7 @@
 ///
 /// This test case renames a resource's data
 ///----------------------------------------------------------------------------
-void TestResourceService::TestCase_RenameResourceData()
+TEST_CASE("RenameResourceData", "[ResourceService]")
 {
     try
     {
@@ -889,20 +814,20 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_RenameResourceData", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_RenameResourceData", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
         
         //Try using a null argument for the idenfier
-        CPPUNIT_ASSERT_THROW_MG(pService->RenameResourceData(NULL, resourceDataName, resourceDataName2, true), MgNullArgumentException*);
+        REQUIRE_THROWS_MG(pService->RenameResourceData(nullptr, resourceDataName, resourceDataName2, true), MgNullArgumentException*);
 
         //Try using a resource identifier that doesn't exist
-        CPPUNIT_ASSERT_THROW_MG(pService->RenameResourceData(&resourceNotExist, resourceDataName, resourceDataName2, true), MgResourceNotFoundException*);
+        REQUIRE_THROWS_MG(pService->RenameResourceData(&resourceNotExist, resourceDataName, resourceDataName2, true), MgResourceNotFoundException*);
 
         //Try to use a resource data name that doesn't exist
-        CPPUNIT_ASSERT_THROW_MG(pService->RenameResourceData(&resourceIdentifier, L"DoesNotExist", resourceDataName2, true), MgResourceDataNotFoundException*);
+        REQUIRE_THROWS_MG(pService->RenameResourceData(&resourceIdentifier, L"DoesNotExist", resourceDataName2, true), MgResourceDataNotFoundException*);
 
         //Try to name the resource data with a 0 character string
-        CPPUNIT_ASSERT_THROW_MG(pService->RenameResourceData(&resourceIdentifier, resourceDataName, L"", true), MgNullArgumentException*);
+        REQUIRE_THROWS_MG(pService->RenameResourceData(&resourceIdentifier, resourceDataName, L"", true), MgNullArgumentException*);
 
         //Try to do a valid rename
         pService->RenameResourceData(&resourceIdentifier, resourceDataName, resourceDataName2, false);
@@ -910,9 +835,9 @@
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
@@ -921,7 +846,7 @@
 ///
 /// This test case retrieves the data of the resource
 ///----------------------------------------------------------------------------
-void TestResourceService::TestCase_GetResourceData()
+TEST_CASE("GetResourceData", "[ResourceService]")
 {
     try
     {
@@ -929,23 +854,23 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_GetResourceData", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_GetResourceData", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgByteReader> byteReader;
-        byteReader = NULL;
+        byteReader = nullptr;
 
-        //Try to get resource data using a NULL identifier
-        CPPUNIT_ASSERT_THROW_MG(pService->GetResourceData(NULL, resourceDataName, L""), MgNullArgumentException*);
+        //Try to get resource data using a nullptr identifier
+        REQUIRE_THROWS_MG(pService->GetResourceData(nullptr, resourceDataName, L""), MgNullArgumentException*);
 
         //Try to get resource data using an empty data name string
-        CPPUNIT_ASSERT_THROW_MG(pService->GetResourceData(&resourceIdentifier, L"", L""), MgNullArgumentException*);
+        REQUIRE_THROWS_MG(pService->GetResourceData(&resourceIdentifier, L"", L""), MgNullArgumentException*);
 
         //Try to get the resource data of a resource that does not exist
-        CPPUNIT_ASSERT_THROW_MG(pService->GetResourceData(&resourceNotExist, resourceDataName, L""), MgResourceNotFoundException*);
+        REQUIRE_THROWS_MG(pService->GetResourceData(&resourceNotExist, resourceDataName, L""), MgResourceNotFoundException*);
 
         //Try to get the resource data of a data name that doesn't exist
-        CPPUNIT_ASSERT_THROW_MG(pService->GetResourceData(&resourceIdentifier, L"DoesNotExist", L""), MgResourceDataNotFoundException*);
+        REQUIRE_THROWS_MG(pService->GetResourceData(&resourceIdentifier, L"DoesNotExist", L""), MgResourceDataNotFoundException*);
 
         //Get resource data using valid arguments
         byteReader = pService->GetResourceData(&resourceIdentifier, resourceDataName, L"");
@@ -952,9 +877,9 @@
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
@@ -963,7 +888,7 @@
 ///
 /// This test case deletes the data of the resource
 ///----------------------------------------------------------------------------
-void TestResourceService::TestCase_DeleteResourceData()
+TEST_CASE("DeleteResourceData", "[ResourceService]")
 {
     try
     {
@@ -971,17 +896,17 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_DeleteResourceData", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_DeleteResourceData", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
-        //Try using a NULL resource identifier
-        CPPUNIT_ASSERT_THROW_MG(pService->DeleteResourceData(NULL, resourceDataName), MgNullArgumentException*);
+        //Try using a nullptr resource identifier
+        REQUIRE_THROWS_MG(pService->DeleteResourceData(nullptr, resourceDataName), MgNullArgumentException*);
 
         //Try using an empty string for the resource data name
-        CPPUNIT_ASSERT_THROW_MG(pService->DeleteResourceData(&resourceIdentifier, L""), MgNullArgumentException*);
+        REQUIRE_THROWS_MG(pService->DeleteResourceData(&resourceIdentifier, L""), MgNullArgumentException*);
 
         //Try deleting data that does not exist
-        CPPUNIT_ASSERT_THROW_MG(pService->DeleteResourceData(&resourceIdentifier, L"DoesNotExist"), MgResourceDataNotFoundException*);
+        REQUIRE_THROWS_MG(pService->DeleteResourceData(&resourceIdentifier, L"DoesNotExist"), MgResourceDataNotFoundException*);
 
         //Delete the resource data that was set earlier
         pService->DeleteResourceData(&resourceIdentifier, resourceDataName);
@@ -988,9 +913,9 @@
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
@@ -1000,7 +925,7 @@
 /// This test case deletes the resources that were added and copied in the
 /// earlier tests
 ///----------------------------------------------------------------------------
-void TestResourceService::TestCase_DeleteResource()
+TEST_CASE("DeleteResource", "[ResourceService]")
 {
     try
     {
@@ -1008,17 +933,17 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_DeleteResource", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_DeleteResource", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgFeatureService> pFeatureService = dynamic_cast<MgFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
         if (pFeatureService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_DeleteResource", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_DeleteResource", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
-        //Try to use a NULL argument
-        CPPUNIT_ASSERT_THROW_MG(pService->DeleteResource(NULL), MgNullArgumentException*);
+        //Try to use a nullptr argument
+        REQUIRE_THROWS_MG(pService->DeleteResource(nullptr), MgNullArgumentException*);
 
         //Try to delete a resource that doesn't exist. We allow doing this for performance reason.
         pService->DeleteResource(&resourceNotExist);
@@ -1043,7 +968,7 @@
         Ptr<MgByteSource> contentSource;
         contentSource = new MgByteSource(rcName);
         Ptr<MgByteReader> contentReader = contentSource->GetReader();
-        pService->SetResource(resource, contentReader, NULL);
+        pService->SetResource(resource, contentReader, nullptr);
 
         Ptr<MgByteSource> dataSource;
         dataSource = new MgByteSource(dfName);
@@ -1051,7 +976,7 @@
         Ptr<MgByteReader> dataReader;
         dataReader = dataSource->GetReader();
         pService->SetResourceData(resource, L"TEST.sdf", L"File", dataReader);
-        dataReader = NULL; // Holds on to the file, so must release resources!
+        dataReader = nullptr; // Holds on to the file, so must release resources!
 
         // Force an FDO exception
         Ptr<MgFeatureAggregateOptions> options = new MgFeatureAggregateOptions();
@@ -1060,10 +985,10 @@
 
         Ptr<MgDataReader> reader = pFeatureService->SelectAggregate(resource, className, options);
         bool bResult = reader->ReadNext();
-        CPPUNIT_ASSERT(bResult);
+        REQUIRE(bResult);
 
         reader->Close();
-        reader = NULL; // Holds on to the file, so must release resources!
+        reader = nullptr; // Holds on to the file, so must release resources!
 
         // Attempt to delete the resource
         pService->DeleteResource(resource);
@@ -1070,9 +995,9 @@
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(FdoException* e)
     {
@@ -1079,7 +1004,7 @@
         STRING message = L"FdoException occurred: ";
         message += e->GetExceptionMessage();
         FDO_SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch(...)
     {
@@ -1092,7 +1017,7 @@
 ///
 /// This test case enumerates the unmanaged data
 ///----------------------------------------------------------------------------
-void TestResourceService::TestCase_EnumerateUnmanagedData()
+TEST_CASE("EnumerateUnmanagedData", "[ResourceService]")
 {
     try
     {
@@ -1100,28 +1025,28 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_EnumerateUnmanagedData", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_EnumerateUnmanagedData", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         // Try to enumerate mappings
         Ptr<MgByteReader> byteReader0 = pService->EnumerateUnmanagedData(L"", false, MgdUnmanagedDataType::Folders, L"");
         STRING mimeType0 = byteReader0->GetMimeType();
-        CPPUNIT_ASSERT(wcscmp(mimeType0.c_str(), MgMimeType::Xml.c_str()) == 0);
+        REQUIRE(wcscmp(mimeType0.c_str(), MgMimeType::Xml.c_str()) == 0);
 
         // Enumerate all unmanaged data files
         Ptr<MgByteReader> byteReader1 = pService->EnumerateUnmanagedData(L"", true, MgdUnmanagedDataType::Files, L"");
         STRING mimeType1 = byteReader1->GetMimeType();
-        CPPUNIT_ASSERT(wcscmp(mimeType1.c_str(), MgMimeType::Xml.c_str()) == 0);
+        REQUIRE(wcscmp(mimeType1.c_str(), MgMimeType::Xml.c_str()) == 0);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
-void TestResourceService::TestCase_BenchmarkGetResourceContents()
+TEST_CASE("BenchmarkGetResourceContents", "[ResourceService]")
 {
     try
     {
@@ -1129,7 +1054,7 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_BenchmarkGetResourceContents", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_BenchmarkGetResourceContents", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         Ptr<MgStringCollection> resources = new MgStringCollection();
@@ -1146,7 +1071,7 @@
             resIdStr += L".LayerDefinition";
 
             Ptr<MgResourceIdentifier> resId = new MgResourceIdentifier(resIdStr);
-            pService->SetResource(resId, reader, NULL);
+            pService->SetResource(resId, reader, nullptr);
             resources->Add(resId->ToString());
             reader->Rewind();
         }
@@ -1183,9 +1108,9 @@
         clock_start = clock();
         Ptr<MgStringCollection> contents;
         ACE_DEBUG((LM_INFO, ACE_TEXT("\nTestResourceService::TestCase_BenchmarkGetResourceContents() - Multi-threaded GetResourceContents call (cold) \n")));
-        contents = pService->GetResourceContents(resources, NULL);
-        CPPUNIT_ASSERT(NULL != contents.p);
-        CPPUNIT_ASSERT(contents->GetCount() == resources->GetCount());
+        contents = pService->GetResourceContents(resources, nullptr);
+        REQUIRE(nullptr != contents.p);
+        REQUIRE(contents->GetCount() == resources->GetCount());
         clock_end = clock();
         ACE_DEBUG((LM_INFO, ACE_TEXT("  Execution Time: = %6.4f (s)\n"), ((double)(clock_end - clock_start) / CLOCKS_PER_SEC) ));
         ACE_DEBUG((LM_INFO, ACE_TEXT(" %d resource content items in cache\n"), (cache->GetCacheSize()) ));
@@ -1192,9 +1117,9 @@
 
         clock_start = clock();
         ACE_DEBUG((LM_INFO, ACE_TEXT("\nTestResourceService::TestCase_BenchmarkGetResourceContents() - Multi-threaded GetResourceContents call (cached contents) \n")));
-        contents = pService->GetResourceContents(resources, NULL);
-        CPPUNIT_ASSERT(NULL != contents.p);
-        CPPUNIT_ASSERT(contents->GetCount() == resources->GetCount());
+        contents = pService->GetResourceContents(resources, nullptr);
+        REQUIRE(nullptr != contents.p);
+        REQUIRE(contents->GetCount() == resources->GetCount());
         clock_end = clock();
         ACE_DEBUG((LM_INFO, ACE_TEXT("  Execution Time: = %6.4f (s)\n"), ((double)(clock_end - clock_start) / CLOCKS_PER_SEC) ));
         ACE_DEBUG((LM_INFO, ACE_TEXT(" %d resource content items in cache\n"), (cache->GetCacheSize()) ));
@@ -1201,13 +1126,13 @@
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
-void TestResourceService::TestCase_PackageNoOpUpdateRepository()
+TEST_CASE("PackageNoOpUpdateRepository", "[ResourceService]")
 {
     try
     {
@@ -1215,7 +1140,7 @@
         Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_PackageNoOpUpdateRepository", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_PackageNoOpUpdateRepository", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
         MgResourceIdentifier resId(L"Library://UnitTests/Package/LineSymbol.SymbolDefinition");
         if (pService->ResourceExists(&resId))
@@ -1228,17 +1153,17 @@
 
         //This package contains an UPDATEREPOSITORY directive, which should no-op when loaded by mg-desktop
         pService->ApplyResourcePackage(byteReader);
-        CPPUNIT_ASSERT(pService->ResourceExists(&resId));
+        REQUIRE(pService->ResourceExists(&resId));
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
 
-void TestResourceService::TestCase_AliasedConfigurationDocument()
+TEST_CASE("AliasedConfigurationDocument", "[ResourceService]")
 {
     try
     {
@@ -1246,7 +1171,7 @@
         Ptr<MgdResourceService> pService = dynamic_cast<MgdResourceService*>(fact->CreateService(MgServiceType::ResourceService));
         if (pService == 0)
         {
-            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_PackageNoOpUpdateRepository", __LINE__, __WFILE__, NULL, L"", NULL);
+            throw new MgServiceNotAvailableException(L"TestResourceService.TestCase_PackageNoOpUpdateRepository", __LINE__, __WFILE__, nullptr, L"", nullptr);
         }
 
         pService->AddAliasMapping(L"MG_TEST", L"C:/Temp");
@@ -1259,13 +1184,13 @@
         sink->ToString(xml);
 
         //It should have no alias tags as they have been substituted
-        CPPUNIT_ASSERT(xml.find(L"MG_TEST") == STRING::npos);
-        CPPUNIT_ASSERT(xml.find(L"MG_DATA_PATH_ALIAS") == STRING::npos);
+        REQUIRE(xml.find(L"MG_TEST") == STRING::npos);
+        REQUIRE(xml.find(L"MG_DATA_PATH_ALIAS") == STRING::npos);
     }
     catch(MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
 }
\ No newline at end of file

Deleted: sandbox/jng/catch2/Desktop/UnitTest/TestResourceService.h
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/TestResourceService.h	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/UnitTest/TestResourceService.h	2020-07-15 16:00:34 UTC (rev 9675)
@@ -1,116 +0,0 @@
-//
-//  Copyright (C) 2004-2010 by Autodesk, Inc.
-//
-//  This library is free software; you can redistribute it and/or
-//  modify it under the terms of version 2.1 of the GNU Lesser
-//  General Public License as published by the Free Software Foundation.
-//
-//  This library 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
-//  Lesser General Public License for more details.
-//
-//  You should have received a copy of the GNU Lesser General Public
-//  License along with this library; if not, write to the Free Software
-//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-//
-
-#ifndef TESTRESOURCESERVICE_H_
-#define TESTRESOURCESERVICE_H_
-
-#include <cppunit/extensions/HelperMacros.h>
-
-class TestResourceService : public CppUnit::TestFixture
-{
-    CPPUNIT_TEST_SUITE(TestResourceService);
-    CPPUNIT_TEST(TestStart); // This must be the very first unit test
-
-    CPPUNIT_TEST(TestCase_EnumerateRepositories);
-    CPPUNIT_TEST(TestCase_CreateRepository);
-    CPPUNIT_TEST(TestCase_UpdateRepository);
-    CPPUNIT_TEST(TestCase_GetRepositoryContent);
-    CPPUNIT_TEST(TestCase_GetRepositoryHeader);
-    CPPUNIT_TEST(TestCase_ApplyResourcePackage);
-    CPPUNIT_TEST(TestCase_DeleteRepository);
-
-    CPPUNIT_TEST(TestCase_ResourceExists);
-    CPPUNIT_TEST(TestCase_EnumerateResources);
-    CPPUNIT_TEST(TestCase_SetResource);
-    CPPUNIT_TEST(TestCase_SetResourceInvalid);
-    CPPUNIT_TEST(TestCase_MoveResource);
-    CPPUNIT_TEST(TestCase_CopyResource);
-    CPPUNIT_TEST(TestCase_GetResourceContent);
-    CPPUNIT_TEST(TestCase_GetResourceContents);
-    CPPUNIT_TEST(TestCase_GetResourceHeader);
-    CPPUNIT_TEST(TestCase_EnumerateReferences);
-    CPPUNIT_TEST(TestCase_ChangeResourceOwner);
-    CPPUNIT_TEST(TestCase_InheritPermissionsFrom);
-
-    CPPUNIT_TEST(TestCase_EnumerateResourceData);
-    CPPUNIT_TEST(TestCase_SetResourceData);
-    CPPUNIT_TEST(TestCase_RenameResourceData);
-    CPPUNIT_TEST(TestCase_GetResourceData);
-    CPPUNIT_TEST(TestCase_DeleteResourceData);
-
-    CPPUNIT_TEST(TestCase_DeleteResource);
-
-    CPPUNIT_TEST(TestCase_EnumerateUnmanagedData);
-    //CPPUNIT_TEST(TestCase_RepositoryBusy);
-
-	CPPUNIT_TEST(TestCase_BenchmarkGetResourceContents);
-    CPPUNIT_TEST(TestCase_PackageNoOpUpdateRepository);
-    CPPUNIT_TEST(TestCase_AliasedConfigurationDocument);
-
-    CPPUNIT_TEST(TestEnd); // This must be the very last unit test
-    CPPUNIT_TEST_SUITE_END();
-
-public:
-    void setUp();
-    void tearDown();
-    void TestStart();
-    void TestEnd();
-
-    // Test Repository Management APIs
-    void TestCase_EnumerateRepositories();
-    void TestCase_CreateRepository();
-    void TestCase_UpdateRepository();
-    void TestCase_GetRepositoryContent();
-    void TestCase_GetRepositoryHeader();
-    void TestCase_ApplyResourcePackage();
-    void TestCase_DeleteRepository();
-
-    // Test Resource Management APIs
-    void TestCase_ResourceExists();
-    void TestCase_EnumerateResources();
-    void TestCase_SetResource();
-    void TestCase_SetResourceInvalid();
-    void TestCase_MoveResource();
-    void TestCase_CopyResource();
-    void TestCase_GetResourceContent();
-    void TestCase_GetResourceContents();
-    void TestCase_GetResourceHeader();
-    void TestCase_EnumerateReferences();
-    void TestCase_ChangeResourceOwner();
-    void TestCase_InheritPermissionsFrom();
-
-    // Test Resource Data Management APIs
-    void TestCase_EnumerateResourceData();
-    void TestCase_SetResourceData();
-    void TestCase_RenameResourceData();
-    void TestCase_GetResourceData();
-    void TestCase_DeleteResourceData();
-
-    void TestCase_DeleteResource();
-
-    void TestCase_EnumerateUnmanagedData();
-    //void TestCase_RepositoryBusy();
-
-    void TestCase_PackageNoOpUpdateRepository();
-
-	// Benchmarking
-	void TestCase_BenchmarkGetResourceContents();
-
-    void TestCase_AliasedConfigurationDocument();
-};
-
-#endif // TESTRESOURCESERVICE_H_

Modified: sandbox/jng/catch2/Desktop/UnitTest/TestTileService.cpp
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/TestTileService.cpp	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/UnitTest/TestTileService.cpp	2020-07-15 16:00:34 UTC (rev 9675)
@@ -16,9 +16,11 @@
 //
 
 #include "MgDesktop.h"
-#include "TestTileService.h"
-#include "CppUnitExtensions.h"
 
+#include "CatchHelperMacros.h"
+#include "TestServiceFactory.h"
+#include "catch.hpp"
+
 #define PATH_LEN 512
 
 // determines the number of requests to make, as a factor of the number of tiles
@@ -29,186 +31,41 @@
 
 static const INT32 MG_TEST_THREADS = 4;
 
-const STRING TEST_LOCALE = L"en";
-
-CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(TestTileService, "TestTileService");
-
-
-TestTileService::TestTileService()
+////////////////////////////////////////////////////////////////
+/// Helpers
+////////////////////////////////////////////////////////////////
+static MgdMap* CreateMap(CREFSTRING mapName = L"")
 {
-    Ptr<MgdServiceFactory> fact = new MgdServiceFactory();
+    // set a default name if not supplied
+    STRING name = (mapName.empty()) ? L"UnitTestBaseMap" : mapName;
 
-    // store references to the various services we use
-    m_svcResource = static_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
-    assert(m_svcResource != NULL);
+    // make a runtime map
+    Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/BaseMap.MapDefinition");
+    MgdMap* map = new MgdMap(mdfres, name);
 
-    m_svcTile = static_cast<MgdTileService*>(fact->CreateService(MgServiceType::TileService));
-    assert(m_svcTile != NULL);
-}
+    // set the view
+    Ptr<MgCoordinate> coordNewCenter = new MgCoordinateXY(-87.723636, 43.715015);
+    Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
+    map->SetViewCenter(ptNewCenter);
+    map->SetDisplayDpi(96);
+    map->SetDisplayWidth(1024);
+    map->SetDisplayHeight(1024);
 
+    // render at a scale of 1:12500
+    map->SetViewScale(12500.0);
 
-TestTileService::~TestTileService()
-{
+    return map;
 }
 
 
-void TestTileService::setUp()
+// returns a random integer in the range 0 to n-1
+static INT32 Rand(INT32 n)
 {
+    double numer = (double)rand() + 0.5;
+    double denom = (double)RAND_MAX + 1.0;
+    return (INT32)(numer / denom * n);
 }
 
-
-void TestTileService::tearDown()
-{
-}
-
-
-void TestTileService::TestStart()
-{
-    ACE_DEBUG((LM_INFO, ACE_TEXT("\nRunning Tile Service tests.\n")));
-
-    try
-    {
-        /*
-        #ifdef _DEBUG
-        MgFdoConnectionManager* pFdoConnectionManager = MgFdoConnectionManager::GetInstance();
-        if(pFdoConnectionManager)
-        {
-            pFdoConnectionManager->ShowCache();
-        }
-        #endif
-        */
-
-        // ------------------------------------------------------
-        // base map source data
-        // ------------------------------------------------------
-
-        // publish the map definition
-        Ptr<MgResourceIdentifier> mapres1 = new MgResourceIdentifier(L"Library://UnitTests/Maps/BaseMap.MapDefinition");
-        Ptr<MgByteSource> mdfsrc1 = new MgByteSource(L"../UnitTestFiles/UT_BaseMap.mdf", false);
-        Ptr<MgByteReader> mdfrdr1 = mdfsrc1->GetReader();
-        m_svcResource->SetResource(mapres1, mdfrdr1, NULL);
-
-        // publish the layer definitions
-        Ptr<MgResourceIdentifier> ldfres1 = new MgResourceIdentifier(L"Library://UnitTests/Layers/RoadCenterLines.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc1 = new MgByteSource(L"../UnitTestFiles/UT_RoadCenterLines.ldf", false);
-        Ptr<MgByteReader> ldfrdr1 = ldfsrc1->GetReader();
-        m_svcResource->SetResource(ldfres1, ldfrdr1, NULL);
-
-        Ptr<MgResourceIdentifier> ldfres2 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Parcels.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc2 = new MgByteSource(L"../UnitTestFiles/UT_Parcels.ldf", false);
-        Ptr<MgByteReader> ldfrdr2 = ldfsrc2->GetReader();
-        m_svcResource->SetResource(ldfres2, ldfrdr2, NULL);
-
-        Ptr<MgResourceIdentifier> ldfres3 = new MgResourceIdentifier(L"Library://UnitTests/Layers/VotingDistricts.LayerDefinition");
-        Ptr<MgByteSource> ldfsrc3 = new MgByteSource(L"../UnitTestFiles/UT_VotingDistricts.ldf", false);
-        Ptr<MgByteReader> ldfrdr3 = ldfsrc3->GetReader();
-        m_svcResource->SetResource(ldfres3, ldfrdr3, NULL);
-
-        // publish the feature sources
-        Ptr<MgResourceIdentifier> fsres1 = new MgResourceIdentifier(L"Library://UnitTests/Data/RoadCenterLines.FeatureSource");
-        Ptr<MgByteSource> fssrc1 = new MgByteSource(L"../UnitTestFiles/UT_RoadCenterLines.fs", false);
-        Ptr<MgByteReader> fsrdr1 = fssrc1->GetReader();
-        m_svcResource->SetResource(fsres1, fsrdr1, NULL);
-
-        Ptr<MgResourceIdentifier> fsres2 = new MgResourceIdentifier(L"Library://UnitTests/Data/Parcels.FeatureSource");
-        Ptr<MgByteSource> fssrc2 = new MgByteSource(L"../UnitTestFiles/UT_Parcels.fs", false);
-        Ptr<MgByteReader> fsrdr2 = fssrc2->GetReader();
-        m_svcResource->SetResource(fsres2, fsrdr2, NULL);
-
-        Ptr<MgResourceIdentifier> fsres3 = new MgResourceIdentifier(L"Library://UnitTests/Data/VotingDistricts.FeatureSource");
-        Ptr<MgByteSource> fssrc3 = new MgByteSource(L"../UnitTestFiles/UT_VotingDistricts.fs", false);
-        Ptr<MgByteReader> fsrdr3 = fssrc3->GetReader();
-        m_svcResource->SetResource(fsres3, fsrdr3, NULL);
-
-        // publish the resource data
-        Ptr<MgByteSource> dataSource1 = new MgByteSource(L"../UnitTestFiles/UT_RoadCenterLines.sdf", false);
-        Ptr<MgByteReader> dataReader1 = dataSource1->GetReader();
-        m_svcResource->SetResourceData(fsres1, L"UT_RoadCenterLines.sdf", L"File", dataReader1);
-
-        Ptr<MgByteSource> dataSource2 = new MgByteSource(L"../UnitTestFiles/UT_Parcels.sdf", false);
-        Ptr<MgByteReader> dataReader2 = dataSource2->GetReader();
-        m_svcResource->SetResourceData(fsres2, L"UT_Parcels.sdf", L"File", dataReader2);
-
-        Ptr<MgByteSource> dataSource3 = new MgByteSource(L"../UnitTestFiles/UT_VotingDistricts.sdf", false);
-        Ptr<MgByteReader> dataReader3 = dataSource3->GetReader();
-        m_svcResource->SetResourceData(fsres3, L"UT_VotingDistricts.sdf", L"File", dataReader3);
-
-        // set up temporary directory for tile images
-        MgFileUtil::CreateDirectory(L"./temp_tiles", false);
-    }
-    catch (MgException* e)
-    {
-        STRING message = e->GetDetails(TEST_LOCALE);
-        SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
-    }
-    catch (...)
-    {
-        throw;
-    }
-}
-
-
-void TestTileService::TestEnd()
-{
-    try
-    {
-        // ------------------------------------------------------
-        // base map source data
-        // ------------------------------------------------------
-
-        // delete the map definition
-        Ptr<MgResourceIdentifier> mapres1 = new MgResourceIdentifier(L"Library://UnitTests/Maps/BaseMap.MapDefinition");
-        m_svcResource->DeleteResource(mapres1);
-
-        // delete the layer definitions
-        Ptr<MgResourceIdentifier> ldfres1 = new MgResourceIdentifier(L"Library://UnitTests/Layers/RoadCenterLines.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres1);
-
-        Ptr<MgResourceIdentifier> ldfres2 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Parcels.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres2);
-
-        Ptr<MgResourceIdentifier> ldfres3 = new MgResourceIdentifier(L"Library://UnitTests/Layers/VotingDistricts.LayerDefinition");
-        m_svcResource->DeleteResource(ldfres3);
-
-        // delete the feature sources
-        Ptr<MgResourceIdentifier> fsres1 = new MgResourceIdentifier(L"Library://UnitTests/Data/RoadCenterLines.FeatureSource");
-        m_svcResource->DeleteResource(fsres1);
-
-        Ptr<MgResourceIdentifier> fsres2 = new MgResourceIdentifier(L"Library://UnitTests/Data/Parcels.FeatureSource");
-        m_svcResource->DeleteResource(fsres2);
-
-        Ptr<MgResourceIdentifier> fsres3 = new MgResourceIdentifier(L"Library://UnitTests/Data/VotingDistricts.FeatureSource");
-        m_svcResource->DeleteResource(fsres3);
-
-        // remove temporary directory for tile images
-        MgFileUtil::DeleteDirectory(L"./temp_tiles", true, false);
-
-        /*
-        #ifdef _DEBUG
-        MgFdoConnectionManager* pFdoConnectionManager = MgFdoConnectionManager::GetInstance();
-        if(pFdoConnectionManager)
-        {
-            pFdoConnectionManager->ShowCache();
-        }
-        #endif
-        */
-    }
-    catch (MgException* e)
-    {
-        STRING message = e->GetDetails(TEST_LOCALE);
-        SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
-    }
-    catch (...)
-    {
-        throw;
-    }
-
-    ACE_DEBUG((LM_INFO, ACE_TEXT("\nTile Service tests completed.\n\n")));
-}
-
-
 // data structure which is passed to each thread
 struct TileThreadData
 {
@@ -227,7 +84,7 @@
 
 
 // the method which gets executed by the ACE worker thread
-ACE_THR_FUNC_RETURN GetTileWorker(void* param)
+static ACE_THR_FUNC_RETURN GetTileWorker(void* param)
 {
     // get the data for this thread
     TileThreadData* threadData = (TileThreadData*)param;
@@ -245,7 +102,7 @@
         // get the tile service instance
         Ptr<MgdServiceFactory> fact = new MgdServiceFactory();
         Ptr<MgdTileService> svcTile = static_cast<MgdTileService*>(fact->CreateService(MgServiceType::TileService));
-        assert(svcTile != NULL);
+        assert(svcTile != nullptr);
 
         // get the tile
         Ptr<MgByteReader> img = svcTile->GetTile(map, L"BaseLayers", tileCol, tileRow);
@@ -260,9 +117,9 @@
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -277,8 +134,7 @@
     return 0;
 }
 
-
-void TestTileService::TestCase_GetTile()
+TEST_CASE("GetTile", "[TileService]")
 {
     // specify the number of threads to use
     const INT32 numThreads = MG_TEST_THREADS;
@@ -333,8 +189,8 @@
             Ptr<MgLayerCollection> mapLayers = map->GetLayers();
             Ptr<MgLayerCollection> newMapLayers = newMap->GetLayers();
 
-            CPPUNIT_ASSERT(mapLayers->GetCount() == newMapLayers->GetCount());
-            CPPUNIT_ASSERT(mapGroups->GetCount() == newMapGroups->GetCount());
+            REQUIRE(mapLayers->GetCount() == newMapLayers->GetCount());
+            REQUIRE(mapGroups->GetCount() == newMapGroups->GetCount());
 
             threadData[i].threadId = i;
             threadData[i].done     = true;
@@ -374,7 +230,7 @@
                         threadData[i].tileCol  = tileCols[nTile];
 
                         // spawn a new thread using a specific group id
-                        int thid = manager->spawn(ACE_THR_FUNC(GetTileWorker), &threadData[i], 0, NULL, NULL, 0, THREAD_GROUP);
+                        int thid = manager->spawn(ACE_THR_FUNC(GetTileWorker), &threadData[i], 0, nullptr, nullptr, 0, THREAD_GROUP);
                         nRequest++;
                     }
 
@@ -408,9 +264,9 @@
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -425,7 +281,7 @@
 
 
 // the method which gets executed by the ACE worker thread
-ACE_THR_FUNC_RETURN SetTileWorker(void* param)
+static ACE_THR_FUNC_RETURN SetTileWorker(void* param)
 {
     // get the data for this thread
     TileThreadData* threadData = (TileThreadData*)param;
@@ -442,7 +298,7 @@
         // get the tile service instance
         Ptr<MgdServiceFactory> fact = new MgdServiceFactory();
         Ptr<MgdTileService> svcTile = static_cast<MgdTileService*>(fact->CreateService(MgServiceType::TileService));
-        assert(svcTile != NULL);
+        assert(svcTile != nullptr);
 
         // find the finite display scale closest to the requested map scale
         double scale = map->GetViewScale();
@@ -464,9 +320,9 @@
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -481,8 +337,7 @@
     return 0;
 }
 
-
-void TestTileService::TestCase_SetTile()
+TEST_CASE("SetTile", "[TileService]")
 {
     // specify the number of threads to use
     const INT32 numThreads = MG_TEST_THREADS;
@@ -560,7 +415,7 @@
                         threadData[i].tileCol = tileCols[nRequest];
 
                         // spawn a new thread using a specific group id
-                        int thid = manager->spawn(ACE_THR_FUNC(SetTileWorker), &threadData[i], 0, NULL, NULL, 0, THREAD_GROUP);
+                        int thid = manager->spawn(ACE_THR_FUNC(SetTileWorker), &threadData[i], 0, nullptr, nullptr, 0, THREAD_GROUP);
                         nRequest++;
                     }
 
@@ -623,7 +478,7 @@
                         threadData[i].tileCol = tileCols[nTile];
 
                         // spawn a new thread using a specific group id
-                        int thid = manager->spawn(ACE_THR_FUNC(SetTileWorker), &threadData[i], 0, NULL, NULL, 0, THREAD_GROUP);
+                        int thid = manager->spawn(ACE_THR_FUNC(SetTileWorker), &threadData[i], 0, nullptr, nullptr, 0, THREAD_GROUP);
                         nRequest++;
                     }
 
@@ -657,9 +512,9 @@
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -671,9 +526,7 @@
 ////////////////////////////////////////////////////////////////
 /// GetSetTile methods
 ////////////////////////////////////////////////////////////////
-
-
-void TestTileService::TestCase_GetSetTile()
+TEST_CASE("GetSetTile", "[TileService]")
 {
     // specify the number of threads to use
     const INT32 numThreads = MG_TEST_THREADS;
@@ -756,9 +609,9 @@
                         // spawn a new thread - 75% of the calls are gets, 25% are sets
                         int thid;
                         if ((double)rand() < 0.75 * (double)RAND_MAX)
-                            thid = manager->spawn(ACE_THR_FUNC(GetTileWorker), &threadData[i], 0, NULL, NULL, 0, THREAD_GROUP);
+                            thid = manager->spawn(ACE_THR_FUNC(GetTileWorker), &threadData[i], 0, nullptr, nullptr, 0, THREAD_GROUP);
                         else
-                            thid = manager->spawn(ACE_THR_FUNC(SetTileWorker), &threadData[i], 0, NULL, NULL, 0, THREAD_GROUP);
+                            thid = manager->spawn(ACE_THR_FUNC(SetTileWorker), &threadData[i], 0, nullptr, nullptr, 0, THREAD_GROUP);
                         nRequest++;
                     }
 
@@ -792,9 +645,9 @@
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -806,15 +659,16 @@
 ////////////////////////////////////////////////////////////////
 /// ClearCache methods
 ////////////////////////////////////////////////////////////////
-
-
-void TestTileService::TestCase_ClearCache()
+TEST_CASE("ClearCache", "[TileService]")
 {
     try
     {
-        // call the API with a NULL argument
-        CPPUNIT_ASSERT_THROW_MG(m_svcTile->ClearCache(NULL), MgNullArgumentException*);
+        Ptr<MgdServiceFactory> fact = new MgdServiceFactory();
+        Ptr<MgdTileService> m_svcTile = dynamic_cast<MgdTileService*>(fact->CreateService(MgServiceType::TileService));
 
+        // call the API with a nullptr argument
+        REQUIRE_THROWS_MG(m_svcTile->ClearCache(nullptr), MgNullArgumentException*);
+
         // call the API with a map having a different name
         Ptr<MgdMap> map = CreateMap(L"blah");
         m_svcTile->ClearCache(map);
@@ -828,9 +682,9 @@
     }
     catch (MgException* e)
     {
-        STRING message = e->GetDetails(TEST_LOCALE);
+        STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
         SAFE_RELEASE(e);
-        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+        FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
     }
     catch (...)
     {
@@ -837,41 +691,3 @@
         throw;
     }
 }
-
-
-////////////////////////////////////////////////////////////////
-/// Helpers
-////////////////////////////////////////////////////////////////
-
-
-MgdMap* TestTileService::CreateMap(CREFSTRING mapName)
-{
-    // set a default name if not supplied
-    STRING name = (mapName.empty())? L"UnitTestBaseMap" : mapName;
-
-    // make a runtime map
-    Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/BaseMap.MapDefinition");
-    MgdMap* map = new MgdMap(mdfres, name);
-
-    // set the view
-    Ptr<MgCoordinate> coordNewCenter = new MgCoordinateXY(-87.723636, 43.715015);
-    Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
-    map->SetViewCenter(ptNewCenter);
-    map->SetDisplayDpi(96);
-    map->SetDisplayWidth(1024);
-    map->SetDisplayHeight(1024);
-
-    // render at a scale of 1:12500
-    map->SetViewScale(12500.0);
-
-    return map;
-}
-
-
-// returns a random integer in the range 0 to n-1
-INT32 TestTileService::Rand(INT32 n)
-{
-    double numer = (double)rand() + 0.5;
-    double denom = (double)RAND_MAX + 1.0;
-    return (INT32)(numer / denom * n);
-}

Deleted: sandbox/jng/catch2/Desktop/UnitTest/TestTileService.h
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/TestTileService.h	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/UnitTest/TestTileService.h	2020-07-15 16:00:34 UTC (rev 9675)
@@ -1,59 +0,0 @@
-//
-//  Copyright (C) 2004-2010 by Autodesk, Inc.
-//
-//  This library is free software; you can redistribute it and/or
-//  modify it under the terms of version 2.1 of the GNU Lesser
-//  General Public License as published by the Free Software Foundation.
-//
-//  This library 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
-//  Lesser General Public License for more details.
-//
-//  You should have received a copy of the GNU Lesser General Public
-//  License along with this library; if not, write to the Free Software
-//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-//
-
-#ifndef _TESTTILESERVICE_H
-#define _TESTTILESERVICE_H
-
-#include <cppunit/extensions/HelperMacros.h>
-
-class TestTileService : public CppUnit::TestFixture
-{
-    CPPUNIT_TEST_SUITE(TestTileService);
-    CPPUNIT_TEST(TestStart); // This must be the very first unit test
-
-    CPPUNIT_TEST(TestCase_GetTile);
-    CPPUNIT_TEST(TestCase_SetTile);
-    CPPUNIT_TEST(TestCase_GetSetTile);
-    CPPUNIT_TEST(TestCase_ClearCache);
-
-    CPPUNIT_TEST(TestEnd); // This must be the very last unit test
-    CPPUNIT_TEST_SUITE_END();
-
-public:
-    TestTileService();
-    ~TestTileService();
-
-    void setUp();
-    void tearDown();
-    void TestStart();
-    void TestEnd();
-
-    void TestCase_GetTile();
-    void TestCase_SetTile();
-    void TestCase_GetSetTile();
-    void TestCase_ClearCache();
-
-private:
-    MgdMap* CreateMap(CREFSTRING mapName = L"");
-    INT32 Rand(INT32 n);
-
-private:
-    Ptr<MgResourceService> m_svcResource;
-    Ptr<MgdTileService> m_svcTile;
-};
-
-#endif

Modified: sandbox/jng/catch2/Desktop/UnitTest/UnitTest.vcxproj
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/UnitTest.vcxproj	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/UnitTest/UnitTest.vcxproj	2020-07-15 16:00:34 UTC (rev 9675)
@@ -76,7 +76,7 @@
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\Common\Foundation;..\..\Common\PlatformBase;..\..\Common\Geometry;..\..\Common\MdfModel;..\..\Common\MdfParser;..\..\Oem\ACE\ACE_wrappers;..\..\Oem\dbxml\xerces-c-src\src;..\..\Oem\FDO\Inc;..\..\Oem\FDO\Inc\ExpressionEngine;..\..\Common\Renderers;..\..\Common\Stylization;..\..\Oem\DWFTK\develop\global\src;..\..\Oem\DWFTK\develop\global\src\dwf;..\..\Oem\CppUnit-1.9.14\include;..\MgDesktop;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\Common\Foundation;..\..\Common\PlatformBase;..\..\Common\Geometry;..\..\Common\MdfModel;..\..\Common\MdfParser;..\..\Oem\ACE\ACE_wrappers;..\..\Oem\dbxml\xerces-c-src\src;..\..\Oem\FDO\Inc;..\..\Oem\FDO\Inc\ExpressionEngine;..\..\Common\Renderers;..\..\Common\Stylization;..\..\Oem\DWFTK\develop\global\src;..\..\Oem\DWFTK\develop\global\src\dwf;..\..\Oem\catch2;..\MgDesktop;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>true</MinimalRebuild>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
@@ -85,8 +85,8 @@
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
     </ClCompile>
     <Link>
-      <AdditionalDependencies>cppunitd.lib;MgDesktopd.lib;FDO.lib;FDOCommon.lib;ACEd.lib;MgFoundationd.lib;MgGeometryd.lib;MgMdfModeld.lib;MgMdfParserd.lib;MgPlatformBased.lib;MgRenderersd.lib;MgStylizationd.lib;xerces-c_3mgD.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <AdditionalLibraryDirectories>..\..\Oem\ACE\ACE_wrappers\lib\$(Configuration);..\..\Oem\FDO\Lib;..\..\Oem\DWFTK\develop\global\lib\static\$(Configuration);..\..\Oem\dbxml\xerces-c-src\Build\$(Configuration);..\..\Common\lib\$(Configuration);..\Lib\debug;..\..\Oem\CppUnit-1.9.14\lib\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalDependencies>MgDesktopd.lib;FDO.lib;FDOCommon.lib;ACEd.lib;MgFoundationd.lib;MgGeometryd.lib;MgMdfModeld.lib;MgMdfParserd.lib;MgPlatformBased.lib;MgRenderersd.lib;MgStylizationd.lib;xerces-c_3mgD.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\Oem\ACE\ACE_wrappers\lib\$(Configuration);..\..\Oem\FDO\Lib;..\..\Oem\DWFTK\develop\global\lib\static\$(Configuration);..\..\Oem\dbxml\xerces-c-src\Build\$(Configuration);..\..\Common\lib\$(Configuration);..\Lib\debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <TargetMachine>MachineX86</TargetMachine>
     </Link>
@@ -124,7 +124,7 @@
     </Midl>
     <ClCompile>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\Common\Foundation;..\..\Common\PlatformBase;..\..\Common\Geometry;..\..\Common\MdfModel;..\..\Common\MdfParser;..\..\Oem\ACE\ACE_wrappers;..\..\Oem\dbxml\xerces-c-src\src;..\..\Oem\FDO\Inc;..\..\Oem\FDO\Inc\ExpressionEngine;..\..\Common\Renderers;..\..\Common\Stylization;..\..\Oem\DWFTK\develop\global\src;..\..\Oem\DWFTK\develop\global\src\dwf;..\..\Oem\CppUnit-1.9.14\include;..\MgDesktop;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\Common\Foundation;..\..\Common\PlatformBase;..\..\Common\Geometry;..\..\Common\MdfModel;..\..\Common\MdfParser;..\..\Oem\ACE\ACE_wrappers;..\..\Oem\dbxml\xerces-c-src\src;..\..\Oem\FDO\Inc;..\..\Oem\FDO\Inc\ExpressionEngine;..\..\Common\Renderers;..\..\Common\Stylization;..\..\Oem\DWFTK\develop\global\src;..\..\Oem\DWFTK\develop\global\src\dwf;..\..\Oem\catch2;..\MgDesktop;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>true</MinimalRebuild>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
@@ -133,8 +133,8 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
     </ClCompile>
     <Link>
-      <AdditionalDependencies>cppunitd.lib;MgDesktopd.lib;FDO.lib;FDOCommon.lib;ACEd.lib;MgFoundationd.lib;MgGeometryd.lib;MgMdfModeld.lib;MgMdfParserd.lib;MgPlatformBased.lib;MgRenderersd.lib;MgStylizationd.lib;xerces-c_3mgD.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <AdditionalLibraryDirectories>..\..\Oem\ACE\ACE_wrappers\lib64\$(Configuration);..\..\Oem\FDO\Lib64;..\..\Oem\DWFTK\develop\global\lib\static\$(Configuration)64;..\..\Oem\dbxml\xerces-c-src\Build\$(Configuration)64;..\..\Common\lib\$(Configuration)64;..\Lib\debug64;..\..\Oem\CppUnit-1.9.14\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalDependencies>MgDesktopd.lib;FDO.lib;FDOCommon.lib;ACEd.lib;MgFoundationd.lib;MgGeometryd.lib;MgMdfModeld.lib;MgMdfParserd.lib;MgPlatformBased.lib;MgRenderersd.lib;MgStylizationd.lib;xerces-c_3mgD.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\Oem\ACE\ACE_wrappers\lib64\$(Configuration);..\..\Oem\FDO\Lib64;..\..\Oem\DWFTK\develop\global\lib\static\$(Configuration)64;..\..\Oem\dbxml\xerces-c-src\Build\$(Configuration)64;..\..\Common\lib\$(Configuration)64;..\Lib\debug64</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <TargetMachine>MachineX64</TargetMachine>
     </Link>
@@ -170,7 +170,7 @@
     <ClCompile>
       <Optimization>MaxSpeed</Optimization>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <AdditionalIncludeDirectories>..\..\Common\Foundation;..\..\Common\PlatformBase;..\..\Common\Geometry;..\..\Common\MdfModel;..\..\Common\MdfParser;..\..\Oem\ACE\ACE_wrappers;..\..\Oem\dbxml\xerces-c-src\src;..\..\Oem\FDO\Inc;..\..\Oem\FDO\Inc\ExpressionEngine;..\..\Common\Renderers;..\..\Common\Stylization;..\..\Oem\DWFTK\develop\global\src;..\..\Oem\DWFTK\develop\global\src\dwf;..\..\Oem\CppUnit-1.9.14\include;..\MgDesktop;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\Common\Foundation;..\..\Common\PlatformBase;..\..\Common\Geometry;..\..\Common\MdfModel;..\..\Common\MdfParser;..\..\Oem\ACE\ACE_wrappers;..\..\Oem\dbxml\xerces-c-src\src;..\..\Oem\FDO\Inc;..\..\Oem\FDO\Inc\ExpressionEngine;..\..\Common\Renderers;..\..\Common\Stylization;..\..\Oem\DWFTK\develop\global\src;..\..\Oem\DWFTK\develop\global\src\dwf;..\..\Oem\catch2;..\MgDesktop;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -178,8 +178,8 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
     </ClCompile>
     <Link>
-      <AdditionalDependencies>cppunit.lib;MgDesktop.lib;FDO.lib;FDOCommon.lib;ACE.lib;MgFoundation.lib;MgGeometry.lib;MgMdfModel.lib;MgMdfParser.lib;MgPlatformBase.lib;MgRenderers.lib;MgStylization.lib;xerces-c_3mg.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <AdditionalLibraryDirectories>..\..\Oem\ACE\ACE_wrappers\lib\$(Configuration);..\..\Oem\FDO\Lib;..\..\Oem\DWFTK\develop\global\lib\static\$(Configuration);..\..\Oem\dbxml\xerces-c-src\Build\$(Configuration);..\..\Common\lib\$(Configuration);..\Lib\release;..\..\Oem\CppUnit-1.9.14\lib\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalDependencies>MgDesktop.lib;FDO.lib;FDOCommon.lib;ACE.lib;MgFoundation.lib;MgGeometry.lib;MgMdfModel.lib;MgMdfParser.lib;MgPlatformBase.lib;MgRenderers.lib;MgStylization.lib;xerces-c_3mg.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\Oem\ACE\ACE_wrappers\lib\$(Configuration);..\..\Oem\FDO\Lib;..\..\Oem\DWFTK\develop\global\lib\static\$(Configuration);..\..\Oem\dbxml\xerces-c-src\Build\$(Configuration);..\..\Common\lib\$(Configuration);..\Lib\release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <DelayLoadDLLs>FDO.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <OptimizeReferences>true</OptimizeReferences>
@@ -222,7 +222,7 @@
     <ClCompile>
       <Optimization>MaxSpeed</Optimization>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <AdditionalIncludeDirectories>..\..\Common\Foundation;..\..\Common\PlatformBase;..\..\Common\Geometry;..\..\Common\MdfModel;..\..\Common\MdfParser;..\..\Oem\ACE\ACE_wrappers;..\..\Oem\dbxml\xerces-c-src\src;..\..\Oem\FDO\Inc;..\..\Oem\FDO\Inc\ExpressionEngine;..\..\Common\Renderers;..\..\Common\Stylization;..\..\Oem\DWFTK\develop\global\src;..\..\Oem\DWFTK\develop\global\src\dwf;..\..\Oem\CppUnit-1.9.14\include;..\MgDesktop;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\Common\Foundation;..\..\Common\PlatformBase;..\..\Common\Geometry;..\..\Common\MdfModel;..\..\Common\MdfParser;..\..\Oem\ACE\ACE_wrappers;..\..\Oem\dbxml\xerces-c-src\src;..\..\Oem\FDO\Inc;..\..\Oem\FDO\Inc\ExpressionEngine;..\..\Common\Renderers;..\..\Common\Stylization;..\..\Oem\DWFTK\develop\global\src;..\..\Oem\DWFTK\develop\global\src\dwf;..\..\Oem\catch2;..\MgDesktop;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -230,8 +230,8 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
     </ClCompile>
     <Link>
-      <AdditionalDependencies>cppunit.lib;MgDesktop.lib;FDO.lib;FDOCommon.lib;ACE.lib;MgFoundation.lib;MgGeometry.lib;MgMdfModel.lib;MgMdfParser.lib;MgPlatformBase.lib;MgRenderers.lib;MgStylization.lib;xerces-c_3mg.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <AdditionalLibraryDirectories>..\..\Oem\ACE\ACE_wrappers\lib64\$(Configuration);..\..\Oem\FDO\Lib64;..\..\Oem\DWFTK\develop\global\lib\static\$(Configuration)64;..\..\Oem\dbxml\xerces-c-src\Build\$(Configuration)64;..\..\Common\lib\$(Configuration)64;..\Lib\release64;..\..\Oem\CppUnit-1.9.14\lib64\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalDependencies>MgDesktop.lib;FDO.lib;FDOCommon.lib;ACE.lib;MgFoundation.lib;MgGeometry.lib;MgMdfModel.lib;MgMdfParser.lib;MgPlatformBase.lib;MgRenderers.lib;MgStylization.lib;xerces-c_3mg.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\Oem\ACE\ACE_wrappers\lib64\$(Configuration);..\..\Oem\FDO\Lib64;..\..\Oem\DWFTK\develop\global\lib\static\$(Configuration)64;..\..\Oem\dbxml\xerces-c-src\Build\$(Configuration)64;..\..\Common\lib\$(Configuration)64;..\Lib\release64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <DelayLoadDLLs>FDO.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <OptimizeReferences>true</OptimizeReferences>
@@ -288,20 +288,13 @@
     <ClCompile Include="TestProfilingService.cpp" />
     <ClCompile Include="TestRenderingService.cpp" />
     <ClCompile Include="TestResourceService.cpp" />
+    <ClCompile Include="TestServiceFactory.cpp" />
     <ClCompile Include="TestTileService.cpp" />
   </ItemGroup>
   <ItemGroup>
-    <ClInclude Include="CppUnitExtensions.h" />
-    <ClInclude Include="TestFeatureService.h" />
-    <ClInclude Include="TestKmlService.h" />
-    <ClInclude Include="TestLogManager.h" />
+    <ClInclude Include="CatchHelperMacros.h" />
     <ClInclude Include="TestLogManagerThread.h" />
-    <ClInclude Include="TestMappingService.h" />
-    <ClInclude Include="TestPerformance.h" />
-    <ClInclude Include="TestProfilingService.h" />
-    <ClInclude Include="TestRenderingService.h" />
-    <ClInclude Include="TestResourceService.h" />
-    <ClInclude Include="TestTileService.h" />
+    <ClInclude Include="TestServiceFactory.h" />
     <ClInclude Include="UnitTesting.h" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

Modified: sandbox/jng/catch2/Desktop/UnitTest/UnitTest.vcxproj.filters
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/UnitTest.vcxproj.filters	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/UnitTest/UnitTest.vcxproj.filters	2020-07-15 16:00:34 UTC (rev 9675)
@@ -48,43 +48,22 @@
     <ClCompile Include="TestLogManagerThread.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="TestServiceFactory.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
-    <ClInclude Include="CppUnitExtensions.h">
+    <ClInclude Include="UnitTesting.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="TestFeatureService.h">
+    <ClInclude Include="TestLogManagerThread.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="TestKmlService.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="TestMappingService.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="TestPerformance.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="TestRenderingService.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="TestResourceService.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="TestTileService.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="UnitTesting.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="TestProfilingService.h">
+    <ClInclude Include="TestServiceFactory.h">
       <Filter>Source Files</Filter>
     </ClInclude>
-    <ClInclude Include="TestLogManagerThread.h">
+    <ClInclude Include="CatchHelperMacros.h">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="TestLogManager.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
   </ItemGroup>
 </Project>
\ No newline at end of file

Modified: sandbox/jng/catch2/Desktop/UnitTest/main.cpp
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/main.cpp	2020-07-15 13:45:54 UTC (rev 9674)
+++ sandbox/jng/catch2/Desktop/UnitTest/main.cpp	2020-07-15 16:00:34 UTC (rev 9675)
@@ -1,12 +1,25 @@
+//
+//  Copyright (C) 2004-2020 by Autodesk, Inc.
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of version 2.1 of the GNU Lesser
+//  General Public License as published by the Free Software Foundation.
+//
+//  This library 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
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+//
+
+#define CATCH_CONFIG_RUNNER
+#include "catch.hpp"
 #include "MgDesktop.h"
+#include "TestServiceFactory.h"
 #include <fstream>
-#include <cppunit/TestResult.h>
-#include <cppunit/TestResultCollector.h>
-#include <cppunit/TextOutputter.h>
-#include <cppunit/XmlOutputter.h>
-#include <cppunit/BriefTestProgressListener.h>
-#include <cppunit/extensions/TestFactoryRegistry.h>
-#include <cppunit/TextTestRunner.h>
 
 // for memory leak detection
 #if defined(_WIN32) && defined(_DEBUG)
@@ -67,63 +80,20 @@
 
     ACE_DEBUG((LM_INFO, ACE_TEXT("MENTOR_DICTIONARY_PATH is: %s\n"), dictDir.c_str()));
 
-    CppUnit::TextTestRunner runner;
-
-    // Add all of the tests
+    TestServiceFactory::AddSuiteToRun("[FeatureService]");
     //NOTE: Leave trace log off, otherwise one of the tests here will fail
-#if TEST_LOG_MANAGER == 1
-    runner.addTest(CppUnit::TestFactoryRegistry::getRegistry("TestLogManager").makeTest());
-#endif
-#if TEST_RESOURCE_SERVICE == 1
-    runner.addTest(CppUnit::TestFactoryRegistry::getRegistry("TestResourceService").makeTest());
-#endif
-#if TEST_RENDERING_SERVICE == 1
-    runner.addTest(CppUnit::TestFactoryRegistry::getRegistry("TestRenderingService").makeTest());
-#endif
-#if TEST_FEATURE_SERVICE == 1
-    runner.addTest(CppUnit::TestFactoryRegistry::getRegistry("TestFeatureService").makeTest());
-#endif
-#if TEST_MAPPING_SERVICE == 1
-    runner.addTest(CppUnit::TestFactoryRegistry::getRegistry("TestMappingService").makeTest());
-#endif
-#if TEST_PROFILING_SERVICE == 1
-	runner.addTest(CppUnit::TestFactoryRegistry::getRegistry("TestProfilingService").makeTest());
-#endif
-#if TEST_TILE_SERVICE == 1
-    //This causes access violations in Visual Leak Detector when run in debug mode. Only uncommment
+    TestServiceFactory::AddSuiteToRun("[LogManager]");
+    TestServiceFactory::AddSuiteToRun("[MappingService]");
+    TestServiceFactory::AddSuiteToRun("[ProfilingService]");
+    TestServiceFactory::AddSuiteToRun("[RenderingService]");
+    TestServiceFactory::AddSuiteToRun("[ResourceService]");
+    //This may cause access violations in Visual Leak Detector when run in debug mode. Only uncommment
     //to verify functionality, but don't use VLD for memory leak detection. Seek an alternate tool/library
     //in this case.
-    runner.addTest(CppUnit::TestFactoryRegistry::getRegistry("TestTileService").makeTest());
-#endif
+    TestServiceFactory::AddSuiteToRun("[TileService]");
 
-    STRING fileName = L"UnitTestResults.xml";
-    if (fileName.size() > 0)
-    {
-        ofstream outfile(MG_WCHAR_TO_CHAR(fileName.c_str()));
-
-        if (outfile.is_open())
-        {
-            runner.setOutputter(new CppUnit::XmlOutputter(&runner.result(), outfile, "ISO-8859-1"));
-            //This is what we have to do to get detailed non-dotted test output 
-            //during execution like we get with FDO's unit tests
-            CppUnit::BriefTestProgressListener listener;
-            runner.eventManager().addListener(&listener);
-            runner.run("", false, true, false);
-            outfile.close();
-        }
-    }
-    else
-    {
-        runner.setOutputter(new CppUnit::TextOutputter(&runner.result(), std::cout));
-        //This is what we have to do to get detailed non-dotted test output 
-        //during execution like we get with FDO's unit tests
-        CppUnit::BriefTestProgressListener listener;
-        runner.eventManager().addListener(&listener);
-        runner.run("", false, true, false);
-    }
-
-    int nResult = runner.result().testFailuresTotal();
-
+    Catch::Session session;
+    int nResult = session.run(argc, argv);
     MgdPlatform::Terminate();
 
     return nResult;



More information about the mapguide-commits mailing list