[mapguide-commits] r9676 - in sandbox/jng/catch2/Desktop: DesktopUnmanagedApi UnitTest

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Tue Jul 21 02:14:23 PDT 2020


Author: jng
Date: 2020-07-21 02:14:23 -0700 (Tue, 21 Jul 2020)
New Revision: 9676

Added:
   sandbox/jng/catch2/Desktop/UnitTest/CatchHelperMacros.h
   sandbox/jng/catch2/Desktop/UnitTest/TestServiceFactory.cpp
   sandbox/jng/catch2/Desktop/UnitTest/TestServiceFactory.h
Modified:
   sandbox/jng/catch2/Desktop/DesktopUnmanagedApi/
Log:
mg-desktop: Add missing files

Index: sandbox/jng/catch2/Desktop/DesktopUnmanagedApi
===================================================================
--- sandbox/jng/catch2/Desktop/DesktopUnmanagedApi	2020-07-15 16:00:34 UTC (rev 9675)
+++ sandbox/jng/catch2/Desktop/DesktopUnmanagedApi	2020-07-21 09:14:23 UTC (rev 9676)

Property changes on: sandbox/jng/catch2/Desktop/DesktopUnmanagedApi
___________________________________________________________________
Added: svn:ignore
## -0,0 +1 ##
+lib
Added: sandbox/jng/catch2/Desktop/UnitTest/CatchHelperMacros.h
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/CatchHelperMacros.h	                        (rev 0)
+++ sandbox/jng/catch2/Desktop/UnitTest/CatchHelperMacros.h	2020-07-21 09:14:23 UTC (rev 9676)
@@ -0,0 +1,26 @@
+//
+//  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
+//
+
+#include "catch.hpp"
+#define REQUIRE_THROWS_MG(action, extype) \
+    try { \
+        action; \
+        FAIL("Expected exception to be thrown"); \
+    } \
+    catch (extype ex) { \
+        SAFE_RELEASE(ex); \
+    }

Added: sandbox/jng/catch2/Desktop/UnitTest/TestServiceFactory.cpp
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/TestServiceFactory.cpp	                        (rev 0)
+++ sandbox/jng/catch2/Desktop/UnitTest/TestServiceFactory.cpp	2020-07-21 09:14:23 UTC (rev 9676)
@@ -0,0 +1,1560 @@
+//
+//  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
+//
+
+#include "TestServiceFactory.h"
+#include "Services/Feature/FdoConnectionPool.h"
+
+#define CATCH_CONFIG_EXTERNAL_INTERFACES
+#include "catch.hpp"
+
+const STRING TestServiceFactory::TEST_LOCALE = L"en";
+
+std::set<std::string> TestServiceFactory::sm_suitesToRun;
+
+bool TestServiceFactory::IsRunningSuite(const std::string& suite)
+{
+    return sm_suitesToRun.find(suite) != sm_suitesToRun.end();
+}
+
+void TestServiceFactory::GetCatch2Tags(std::string& testOrTags)
+{
+    bool bFirst = true;
+    for (auto const& item : sm_suitesToRun)
+    {
+        if (bFirst)
+        {
+            bFirst = false;
+        }
+        else
+        {
+            testOrTags += ",";
+        }
+        testOrTags += item;
+    }
+}
+
+void TestServiceFactory::AddSuiteToRun(const std::string& suite)
+{
+    sm_suitesToRun.insert(suite);
+}
+
+struct TestDataSetup : Catch::TestEventListenerBase
+{
+    using TestEventListenerBase::TestEventListenerBase; // inherit constructor
+
+   // Get rid of Wweak-tables
+    ~TestDataSetup();
+
+    void testCaseStarting(Catch::TestCaseInfo const& _testInfo) override {
+        printf(">>> Starting test case: %s\n", _testInfo.name.c_str());
+    }
+
+    // The whole test run starting
+    void testRunStarting(Catch::TestRunInfo const& testRunInfo) override {
+
+        Ptr<MgdServiceFactory> fact = new MgdServiceFactory();
+        Ptr<MgResourceService> pService = dynamic_cast<MgResourceService*>(fact->CreateService(MgServiceType::ResourceService));
+        if (pService == nullptr)
+        {
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestStart", __LINE__, __WFILE__, nullptr, L"", nullptr);
+        }
+        Ptr<MgdFeatureService> featSvc = dynamic_cast<MgdFeatureService*>(fact->CreateService(MgServiceType::FeatureService));
+        if (featSvc == nullptr)
+        {
+            throw new MgServiceNotAvailableException(L"TestFeatureService.TestStart", __LINE__, __WFILE__, nullptr, L"", nullptr);
+        }
+
+        Ptr<MgCoordinateSystemFactory> csFactory = new MgCoordinateSystemFactory();
+        Ptr<MgCoordinateSystemCatalog> csCatalog = csFactory->GetCatalog();
+        STRING dictPath = csCatalog->GetDictionaryDir();
+        ACE_DEBUG((LM_INFO, ACE_TEXT("\nCoordinate System Dictionary Path is: %W\n"), dictPath.c_str()));
+
+#ifdef _WIN32
+        //If the FDO we're using has a full providers.xml and we haven't met the dependencies
+        //of some providers (eg. OCI.dll for King.Oracle), then it's going to show a message box
+        //in our face about this that has to be manually dismissed. Not something you want to have 
+        //happen when trying to run tests in an automated fashion. This test suite only covers the
+        //SDF, SHP and SQLite providers so having such message boxes show up is intrusive.
+        //
+        //This call will suppress such message boxes when loading dlls with unmet depdendencies. It's
+        //okay to do this here because mgserver.exe would not be running as a service or long-running process
+        //when running its test suite, so this will only take effect for the duration of the test run
+        SetErrorMode(SEM_FAILCRITICALERRORS);
+#endif
+
+        printf("*******************************************\n");
+        printf("******* Setting up test environment *******\n");
+        printf("*******************************************\n");
+
+        // TestMappingService setup
+        if (TestServiceFactory::IsRunningSuite("[MappingService]"))
+        {
+            printf("Setting up data for suite: MappingService\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();
+                pService->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();
+                pService->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();
+                pService->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();
+                pService->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();
+                pService->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();
+                pService->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();
+                pService->SetResource(fsres3, fsrdr3, nullptr);
+
+                // publish the resource data
+                Ptr<MgByteSource> dataSource1 = new MgByteSource(L"../UnitTestFiles/UT_HydrographicPolygons.sdf", false);
+                Ptr<MgByteReader> dataReader1 = dataSource1->GetReader();
+                pService->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();
+                pService->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();
+                pService->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();
+                pService->SetResource(plres1, plrdr1, nullptr);
+
+                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();
+                pService->SetResource(plres2, plrdr2, nullptr);
+
+                // 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();
+                pService->SetResource(slres1, slrdr1, nullptr);
+                Ptr<MgByteSource> datasrc = new MgByteSource(L"../UnitTestFiles/UT_Symbols.dwf", false);
+                Ptr<MgByteReader> datardr = datasrc->GetReader();
+                pService->SetResourceData(slres1, L"symbols.dwf", L"File", datardr);
+            }
+            catch (MgException* e)
+            {
+                STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
+                SAFE_RELEASE(e);
+                FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+            }
+            catch (...)
+            {
+                throw;
+            }
+        }
+
+        // TestRenderingService setup
+        if (TestServiceFactory::IsRunningSuite("[RenderingService]"))
+        {
+            printf("Setting up data for suite: RenderingService\n");
+            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();
+                pService->SetResource(mapres1, mdfrdr1, 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();
+                pService->SetResource(ldfres1, ldfrdr1, nullptr);
+
+                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();
+                pService->SetResource(ldfres2, ldfrdr2, nullptr);
+
+                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();
+                pService->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();
+                pService->SetResource(fsres1, fsrdr1, nullptr);
+
+                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();
+                pService->SetResource(fsres2, fsrdr2, nullptr);
+
+                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();
+                pService->SetResource(fsres3, fsrdr3, nullptr);
+
+                // publish the resource data
+                Ptr<MgByteSource> dataSource1 = new MgByteSource(L"../UnitTestFiles/UT_HydrographicPolygons.sdf", false);
+                Ptr<MgByteReader> dataReader1 = dataSource1->GetReader();
+                pService->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();
+                pService->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();
+                pService->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();
+                pService->SetResource(plres1, plrdr1, nullptr);
+
+                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();
+                pService->SetResource(plres2, plrdr2, nullptr);
+
+                // 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();
+                pService->SetResource(slres1, slrdr1, nullptr);
+                Ptr<MgByteSource> datasrc = new MgByteSource(L"../UnitTestFiles/UT_Symbols.dwf", false);
+                Ptr<MgByteReader> datardr = datasrc->GetReader();
+                pService->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();
+                pService->SetResource(fsres4, fsrdr4, nullptr);
+
+                // point sdf file
+                Ptr<MgByteSource> dataSource4 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyPoints.sdf", false);
+                Ptr<MgByteReader> dataReader4 = dataSource4->GetReader();
+                pService->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();
+                pService->SetResource(sdres1, sdrdr1, nullptr);
+
+                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();
+                pService->SetResource(sdres2, sdrdr2, nullptr);
+
+                // 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();
+                pService->SetResource(ldfres4, ldfrdr4, nullptr);
+
+                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();
+                pService->SetResource(ldfres5, ldfrdr5, nullptr);
+
+                // 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();
+                pService->SetResource(mapres2, mdfrdr2, nullptr);
+
+                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();
+                pService->SetResource(mapres3, mdfrdr3, nullptr);
+
+                // 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();
+                pService->SetResource(fsres5, fsrdr5, nullptr);
+
+                // line sdf file
+                Ptr<MgByteSource> dataSource5 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyLines.sdf", false);
+                Ptr<MgByteReader> dataReader5 = dataSource5->GetReader();
+                pService->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();
+                pService->SetResource(sdres3, sdrdr3, nullptr);
+
+                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();
+                pService->SetResource(sdres4, sdrdr4, nullptr);
+
+                // 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();
+                pService->SetResource(ldfres6, ldfrdr6, nullptr);
+
+                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();
+                pService->SetResource(ldfres7, ldfrdr7, nullptr);
+
+                // 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();
+                pService->SetResource(mapres4, mdfrdr4, nullptr);
+
+                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();
+                pService->SetResource(mapres5, mdfrdr5, nullptr);
+
+                // 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();
+                pService->SetResource(ldfres8, ldfrdr8, nullptr);
+
+                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();
+                pService->SetResource(ldfres9, ldfrdr9, nullptr);
+
+                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();
+                pService->SetResource(ldfres10, ldfrdr10, nullptr);
+
+                // 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();
+                pService->SetResource(mapres8, mdfrdr8, nullptr);
+
+                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();
+                pService->SetResource(mapres9, mdfrdr9, nullptr);
+
+                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();
+                pService->SetResource(mapres10, mdfrdr10, nullptr);
+
+                //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();
+                pService->SetResource(mapres11, mdfrdr11, nullptr);
+
+                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();
+                pService->SetResource(ldfres11, ldfrdr11, nullptr);
+
+                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();
+                pService->SetResource(sdres5, sdrdr5, nullptr);
+
+                // 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();
+                pService->SetResource(mapres12, mdfrdr12, nullptr);
+
+                // 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();
+                pService->SetResource(wdfres1, wdfrdr1, nullptr);
+
+                // ------------------------------------------------------
+                // 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();
+                pService->SetResource(mapres13, mdfrdr13, nullptr);
+
+                // 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();
+                pService->SetResource(ldfres12, ldfrdr12, nullptr);
+
+                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();
+                pService->SetResource(ldfres13, ldfrdr13, nullptr);
+
+                // 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();
+                pService->SetResource(fsres6, fsrdr6, nullptr);
+
+                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();
+                pService->SetResource(fsres7, fsrdr7, nullptr);
+
+                // publish the resource data
+                Ptr<MgByteSource> dataSource6 = new MgByteSource(L"../UnitTestFiles/UT_RoadCenterLines.sdf", false);
+                Ptr<MgByteReader> dataReader6 = dataSource6->GetReader();
+                pService->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();
+                pService->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();
+                pService->SetResource(ldfres14, ldfrdr14, nullptr);
+
+                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();
+                pService->SetResource(ldfres15, ldfrdr15, nullptr);
+
+                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();
+                pService->SetResource(ldfres16, ldfrdr16, nullptr);
+
+                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();
+                pService->SetResource(ldfres17, ldfrdr17, nullptr);
+
+                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();
+                pService->SetResource(ldfres18, ldfrdr18, nullptr);
+
+                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();
+                pService->SetResource(ldfres19, ldfrdr19, nullptr);
+
+                // 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();
+                pService->SetResource(ldfres20, ldfrdr20, nullptr);
+
+                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();
+                pService->SetResource(mapres15, mdfrdr15, nullptr);
+
+                // 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();
+                pService->SetResource(wdfres2, wdfrdr2, nullptr);
+
+                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();
+                pService->SetResource(ldfres21, ldfrdr21, nullptr);
+            }
+            catch (MgException* e)
+            {
+                STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
+                SAFE_RELEASE(e);
+                FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+            }
+            catch (...)
+            {
+                throw;
+            }
+        }
+
+        // TestTileService setup
+        if (TestServiceFactory::IsRunningSuite("[TileService]"))
+        {
+            printf("Setting up data for suite: TileService\n");
+            try
+            {
+                // ------------------------------------------------------
+        // 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();
+                pService->SetResource(mapres1, mdfrdr1, nullptr);
+
+                // 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();
+                pService->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();
+                pService->SetResource(ldfres2, ldfrdr2, nullptr);
+
+                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();
+                pService->SetResource(ldfres3, ldfrdr3, nullptr);
+
+                // 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();
+                pService->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();
+                pService->SetResource(fsres2, fsrdr2, nullptr);
+
+                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();
+                pService->SetResource(fsres3, fsrdr3, nullptr);
+
+                // publish the resource data
+                Ptr<MgByteSource> dataSource1 = new MgByteSource(L"../UnitTestFiles/UT_RoadCenterLines.sdf", false);
+                Ptr<MgByteReader> dataReader1 = dataSource1->GetReader();
+                pService->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();
+                pService->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();
+                pService->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(TestServiceFactory::TEST_LOCALE);
+                SAFE_RELEASE(e);
+                FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+            }
+            catch (...)
+            {
+                throw;
+            }
+        }
+
+        // TestResourceService setup
+        if (TestServiceFactory::IsRunningSuite("[ResourceService]"))
+        {
+            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, nullptr);
+
+            Ptr<MgByteSource> confSource = new MgByteSource(L"../UnitTestFiles/config.xml", false);
+            Ptr<MgByteReader> confReader = confSource->GetReader();
+            pService->SetResourceData(fs1, L"config.xml", MgResourceDataType::File, confReader);
+        }
+
+        // TestProfilingService setup
+        if (TestServiceFactory::IsRunningSuite("[ProfilingService]"))
+        {
+            printf("Setting up data for suite: ProfilingService\n");
+            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();
+                pService->SetResource(mapres1, mdfrdr1, 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();
+                pService->SetResource(ldfres1, ldfrdr1, nullptr);
+
+                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();
+                pService->SetResource(ldfres2, ldfrdr2, nullptr);
+
+                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();
+                pService->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();
+                pService->SetResource(fsres1, fsrdr1, nullptr);
+
+                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();
+                pService->SetResource(fsres2, fsrdr2, nullptr);
+
+                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();
+                pService->SetResource(fsres3, fsrdr3, nullptr);
+
+                // publish the resource data
+                Ptr<MgByteSource> dataSource1 = new MgByteSource(L"../UnitTestFiles/UT_HydrographicPolygons.sdf", false);
+                Ptr<MgByteReader> dataReader1 = dataSource1->GetReader();
+                pService->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();
+                pService->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();
+                pService->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();
+                pService->SetResource(plres1, plrdr1, nullptr);
+
+                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();
+                pService->SetResource(plres2, plrdr2, nullptr);
+
+                // 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();
+                pService->SetResource(slres1, slrdr1, nullptr);
+                Ptr<MgByteSource> datasrc = new MgByteSource(L"../UnitTestFiles/UT_Symbols.dwf", false);
+                Ptr<MgByteReader> datardr = datasrc->GetReader();
+                pService->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();
+                pService->SetResource(fsres4, fsrdr4, nullptr);
+
+                // point sdf file
+                Ptr<MgByteSource> dataSource4 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyPoints.sdf", false);
+                Ptr<MgByteReader> dataReader4 = dataSource4->GetReader();
+                pService->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();
+                pService->SetResource(sdres1, sdrdr1, nullptr);
+
+                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();
+                pService->SetResource(sdres2, sdrdr2, nullptr);
+
+                // 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();
+                pService->SetResource(ldfres4, ldfrdr4, nullptr);
+
+                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();
+                pService->SetResource(ldfres5, ldfrdr5, nullptr);
+
+                // 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();
+                pService->SetResource(mapres2, mdfrdr2, nullptr);
+
+                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();
+                pService->SetResource(mapres3, mdfrdr3, nullptr);
+
+                // 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();
+                pService->SetResource(fsres5, fsrdr5, nullptr);
+
+                // line sdf file
+                Ptr<MgByteSource> dataSource5 = new MgByteSource(L"../UnitTestFiles/UT_SymbologyLines.sdf", false);
+                Ptr<MgByteReader> dataReader5 = dataSource5->GetReader();
+                pService->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();
+                pService->SetResource(sdres3, sdrdr3, nullptr);
+
+                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();
+                pService->SetResource(sdres4, sdrdr4, nullptr);
+
+                // 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();
+                pService->SetResource(ldfres6, ldfrdr6, nullptr);
+
+                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();
+                pService->SetResource(ldfres7, ldfrdr7, nullptr);
+
+                // 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();
+                pService->SetResource(mapres4, mdfrdr4, nullptr);
+
+                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();
+                pService->SetResource(mapres5, mdfrdr5, nullptr);
+
+                // 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();
+                pService->SetResource(ldfres8, ldfrdr8, nullptr);
+
+                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();
+                pService->SetResource(ldfres9, ldfrdr9, nullptr);
+
+                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();
+                pService->SetResource(ldfres10, ldfrdr10, nullptr);
+
+                // 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();
+                pService->SetResource(mapres8, mdfrdr8, nullptr);
+
+                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();
+                pService->SetResource(mapres9, mdfrdr9, nullptr);
+
+                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();
+                pService->SetResource(mapres10, mdfrdr10, nullptr);
+
+                //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();
+                pService->SetResource(mapres11, mdfrdr11, nullptr);
+
+                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();
+                pService->SetResource(ldfres11, ldfrdr11, nullptr);
+
+                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();
+                pService->SetResource(sdres5, sdrdr5, nullptr);
+
+                // 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();
+                pService->SetResource(mapres12, mdfrdr12, nullptr);
+
+                // 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();
+                pService->SetResource(wdfres1, wdfrdr1, nullptr);
+            }
+            catch (MgException* e)
+            {
+                STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
+                SAFE_RELEASE(e);
+                FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+            }
+            catch (...)
+            {
+                throw;
+            }
+        }
+
+        // TestFeatureService setup
+        if (TestServiceFactory::IsRunningSuite("[FeatureService]"))
+        {
+            printf("Setting up data for suite: FeatureService\n");
+            try
+            {
+                // 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, nullptr);
+
+                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, nullptr);
+
+                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, nullptr);
+
+                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, nullptr);
+
+                Ptr<MgByteSource> contentSource2 = new MgByteSource(resourceContentFileName2);
+                Ptr<MgByteReader> contentReader2 = contentSource2->GetReader();
+                pService->SetResource(&resourceIdentifier2, contentReader2, nullptr);
+
+                Ptr<MgByteSource> contentSource3 = new MgByteSource(resourceContentFileName3);
+                Ptr<MgByteReader> contentReader3 = contentSource3->GetReader();
+                pService->SetResource(&resourceIdentifier3, contentReader3, nullptr);
+
+                Ptr<MgByteSource> contentSource4 = new MgByteSource(resourceContentFileName4);
+                Ptr<MgByteReader> contentReader4 = contentSource4->GetReader();
+                pService->SetResource(&resourceIdentifier4, contentReader4, nullptr);
+
+                Ptr<MgByteSource> contentSource5 = new MgByteSource(resourceContentFileName5);
+                Ptr<MgByteReader> contentReader5 = contentSource5->GetReader();
+                pService->SetResource(&resourceIdentifier5, contentReader5, nullptr);
+
+                Ptr<MgByteSource> contentSource6 = new MgByteSource(resourceContentFileName6);
+                Ptr<MgByteReader> contentReader6 = contentSource6->GetReader();
+                pService->SetResource(&resourceIdentifier6, contentReader6, nullptr);
+
+                Ptr<MgByteSource> contentSource7 = new MgByteSource(resourceContentFileName7);
+                Ptr<MgByteReader> contentReader7 = contentSource7->GetReader();
+                pService->SetResource(&resourceIdentifier7, contentReader7, nullptr);
+
+                Ptr<MgByteSource> contentSource8 = new MgByteSource(resourceContentFileName8);
+                Ptr<MgByteReader> contentReader8 = contentSource8->GetReader();
+                pService->SetResource(&resourceIdentifier8, contentReader8, nullptr);
+
+                Ptr<MgByteSource> contentSource9 = new MgByteSource(resourceContentFileName9);
+                Ptr<MgByteReader> contentReader9 = contentSource9->GetReader();
+                pService->SetResource(&resourceIdentifier9, contentReader9, nullptr);
+
+                //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, nullptr);
+                Ptr<MgByteSource> fsData = new MgByteSource(L"../UnitTestFiles/SortableRight.sqlite");
+                Ptr<MgByteReader> fsDataReader = fsData->GetReader();
+
+                pService->SetResourceData(fsId, L"SortableRight.sqlite", L"File", fsDataReader);
+                //REQUIRE(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, nullptr);
+                fsData = new MgByteSource(L"../UnitTestFiles/SortableLeft.sqlite");
+                fsDataReader = fsData->GetReader();
+
+                pService->SetResourceData(fsId, L"SortableLeft.sqlite", L"File", fsDataReader);
+                //REQUIRE(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, nullptr);
+                fsData = new MgByteSource(L"../UnitTestFiles/UnsortableRight.sdf");
+                fsDataReader = fsData->GetReader();
+
+                pService->SetResourceData(fsId, L"UnsortableRight.sdf", L"File", fsDataReader);
+                //REQUIRE(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, nullptr);
+                fsData = new MgByteSource(L"../UnitTestFiles/UnsortableLeft.sdf");
+                fsDataReader = fsData->GetReader();
+
+                pService->SetResourceData(fsId, L"UnsortableLeft.sdf", L"File", fsDataReader);
+            }
+            catch (MgException* e)
+            {
+                STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
+                SAFE_RELEASE(e);
+                FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+            }
+        }
+    }
+
+    // The whole test run ending
+    void testRunEnded(Catch::TestRunStats const& testRunStats) override {
+        Ptr<MgdServiceFactory> factory = new MgdServiceFactory();
+
+        Ptr<MgResourceService> pService = dynamic_cast<MgdResourceService*>(
+            factory->CreateService(MgServiceType::ResourceService));
+        assert(pService.p != nullptr);
+
+        printf("Tearing down test data\n");
+
+        printf("***************************************\n");
+        printf("**** Tearing down test environment ****\n");
+        printf("***************************************\n");
+
+        // TestMappingService teardown
+        if (TestServiceFactory::IsRunningSuite("[MappingService]"))
+        {
+            printf("Tearing down data for suite: MappingService\n");
+            try
+            {
+                //delete the map definition
+                Ptr<MgResourceIdentifier> mapres = new MgResourceIdentifier(L"Library://UnitTests/Maps/Sheboygan.MapDefinition");
+                pService->DeleteResource(mapres);
+
+                //delete the layer definitions
+                Ptr<MgResourceIdentifier> ldfres1 = new MgResourceIdentifier(L"Library://UnitTests/Layers/HydrographicPolygons.LayerDefinition");
+                pService->DeleteResource(ldfres1);
+
+                Ptr<MgResourceIdentifier> ldfres2 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Parcels.LayerDefinition");
+                pService->DeleteResource(ldfres2);
+
+                Ptr<MgResourceIdentifier> ldfres3 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Rail.LayerDefinition");
+                pService->DeleteResource(ldfres3);
+
+                //delete the feature sources
+                Ptr<MgResourceIdentifier> fsres1 = new MgResourceIdentifier(L"Library://UnitTests/Data/HydrographicPolygons.FeatureSource");
+                pService->DeleteResource(fsres1);
+
+                Ptr<MgResourceIdentifier> fsres2 = new MgResourceIdentifier(L"Library://UnitTests/Data/Parcels.FeatureSource");
+                pService->DeleteResource(fsres2);
+
+                Ptr<MgResourceIdentifier> fsres3 = new MgResourceIdentifier(L"Library://UnitTests/Data/Rail.FeatureSource");
+                pService->DeleteResource(fsres3);
+
+                // delete the print layouts
+                Ptr<MgResourceIdentifier> plres1 = new MgResourceIdentifier(L"Library://UnitTests/PrintLayouts/AllElements.PrintLayout");
+                pService->DeleteResource(plres1);
+
+                Ptr<MgResourceIdentifier> plres2 = new MgResourceIdentifier(L"Library://UnitTests/PrintLayouts/NoLegend.PrintLayout");
+                pService->DeleteResource(plres2);
+
+                // delete the symbol library
+                Ptr<MgResourceIdentifier> slres1 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/SymbolMart.SymbolLibrary");
+                pService->DeleteResource(slres1);
+            }
+            catch (MgException* e)
+            {
+                STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
+                SAFE_RELEASE(e);
+                FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+            }
+            catch (...)
+            {
+                throw;
+            }
+        }
+
+        // TestProfilingService teardown
+        if (TestServiceFactory::IsRunningSuite("[ProfilingService]"))
+        {
+            printf("Tearing down data for suite: ProfilingService\n");
+            try
+            {
+                // delete the map definition
+                Ptr<MgResourceIdentifier> mapres1 = new MgResourceIdentifier(L"Library://UnitTests/Maps/Sheboygan.MapDefinition");
+                pService->DeleteResource(mapres1);
+
+                // delete the layer definitions
+                Ptr<MgResourceIdentifier> ldfres1 = new MgResourceIdentifier(L"Library://UnitTests/Layers/HydrographicPolygons.LayerDefinition");
+                pService->DeleteResource(ldfres1);
+
+                Ptr<MgResourceIdentifier> ldfres2 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Rail.LayerDefinition");
+                pService->DeleteResource(ldfres2);
+
+                Ptr<MgResourceIdentifier> ldfres3 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Parcels.LayerDefinition");
+                pService->DeleteResource(ldfres3);
+
+                // delete the feature sources
+                Ptr<MgResourceIdentifier> fsres1 = new MgResourceIdentifier(L"Library://UnitTests/Data/HydrographicPolygons.FeatureSource");
+                pService->DeleteResource(fsres1);
+
+                Ptr<MgResourceIdentifier> fsres2 = new MgResourceIdentifier(L"Library://UnitTests/Data/Rail.FeatureSource");
+                pService->DeleteResource(fsres2);
+
+                Ptr<MgResourceIdentifier> fsres3 = new MgResourceIdentifier(L"Library://UnitTests/Data/Parcels.FeatureSource");
+                pService->DeleteResource(fsres3);
+
+                // delete the print layouts
+                Ptr<MgResourceIdentifier> plres1 = new MgResourceIdentifier(L"Library://UnitTests/PrintLayouts/AllElements.PrintLayout");
+                pService->DeleteResource(plres1);
+
+                Ptr<MgResourceIdentifier> plres2 = new MgResourceIdentifier(L"Library://UnitTests/PrintLayouts/NoLegend.PrintLayout");
+                pService->DeleteResource(plres2);
+
+                // delete the symbol library
+                Ptr<MgResourceIdentifier> slres1 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/SymbolMart.SymbolLibrary");
+                pService->DeleteResource(slres1);
+
+                // delete symbology stuff
+                Ptr<MgResourceIdentifier> fsres4 = new MgResourceIdentifier(L"Library://UnitTests/Data/Capitals.FeatureSource");
+                pService->DeleteResource(fsres4);
+                Ptr<MgResourceIdentifier> sdres1 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/PointSymbol.SymbolDefinition");
+                pService->DeleteResource(sdres1);
+                Ptr<MgResourceIdentifier> sdres2 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/PointSymbolParam.SymbolDefinition");
+                pService->DeleteResource(sdres2);
+                Ptr<MgResourceIdentifier> ldfres4 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Capitals.LayerDefinition");
+                pService->DeleteResource(ldfres4);
+                Ptr<MgResourceIdentifier> ldfres5 = new MgResourceIdentifier(L"Library://UnitTests/Layers/CapitalsParam.LayerDefinition");
+                pService->DeleteResource(ldfres5);
+                Ptr<MgResourceIdentifier> mapres2 = new MgResourceIdentifier(L"Library://UnitTests/Maps/Capitals.MapDefinition");
+                pService->DeleteResource(mapres2);
+                Ptr<MgResourceIdentifier> mapres3 = new MgResourceIdentifier(L"Library://UnitTests/Maps/CapitalsParam.MapDefinition");
+                pService->DeleteResource(mapres3);
+
+                Ptr<MgResourceIdentifier> fsres5 = new MgResourceIdentifier(L"Library://UnitTests/Data/Lines.FeatureSource");
+                pService->DeleteResource(fsres5);
+                Ptr<MgResourceIdentifier> sdres3 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/LineSymbol.SymbolDefinition");
+                pService->DeleteResource(sdres3);
+                Ptr<MgResourceIdentifier> sdres4 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/MTYP1500a.SymbolDefinition");
+                pService->DeleteResource(sdres4);
+                Ptr<MgResourceIdentifier> ldfres6 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Lines.LayerDefinition");
+                pService->DeleteResource(ldfres6);
+                Ptr<MgResourceIdentifier> ldfres7 = new MgResourceIdentifier(L"Library://UnitTests/Layers/LinesCrossTick.LayerDefinition");
+                pService->DeleteResource(ldfres7);
+                Ptr<MgResourceIdentifier> mapres4 = new MgResourceIdentifier(L"Library://UnitTests/Maps/Lines.MapDefinition");
+                pService->DeleteResource(mapres4);
+                Ptr<MgResourceIdentifier> mapres5 = new MgResourceIdentifier(L"Library://UnitTests/Maps/LinesCrossTick.MapDefinition");
+                pService->DeleteResource(mapres5);
+
+                Ptr<MgResourceIdentifier> ldfres8 = new MgResourceIdentifier(L"Library://UnitTests/Layers/UT_Annotation1.LayerDefinition");
+                pService->DeleteResource(ldfres8);
+                Ptr<MgResourceIdentifier> ldfres9 = new MgResourceIdentifier(L"Library://UnitTests/Layers/UT_Annotation2.LayerDefinition");
+                pService->DeleteResource(ldfres9);
+                Ptr<MgResourceIdentifier> ldfres10 = new MgResourceIdentifier(L"Library://UnitTests/Layers/UT_Annotation3.LayerDefinition");
+                pService->DeleteResource(ldfres10);
+                Ptr<MgResourceIdentifier> mapres8 = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_Annotation1.MapDefinition");
+                pService->DeleteResource(mapres8);
+                Ptr<MgResourceIdentifier> mapres9 = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_Annotation2.MapDefinition");
+                pService->DeleteResource(mapres9);
+                Ptr<MgResourceIdentifier> mapres10 = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_Annotation3.MapDefinition");
+                pService->DeleteResource(mapres10);
+
+                Ptr<MgResourceIdentifier> mapres11 = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_SymbologyPolygons.MapDefinition");
+                pService->DeleteResource(mapres11);
+                Ptr<MgResourceIdentifier> ldfres11 = new MgResourceIdentifier(L"Library://UnitTests/Layers/SymbologyParcels.LayerDefinition");
+                pService->DeleteResource(ldfres11);
+                Ptr<MgResourceIdentifier> sdres5 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/AreaSymbol.SymbolDefinition");
+                pService->DeleteResource(sdres5);
+
+                Ptr<MgResourceIdentifier> mapres12 = new MgResourceIdentifier(L"Library://UnitTests/Maps/SheboyganWithWatermark.MapDefinition");
+                pService->DeleteResource(mapres12);
+                Ptr<MgResourceIdentifier> wdfres1 = new MgResourceIdentifier(L"Library://UnitTests/Watermarks/PoweredByMapGuide.WatermarkDefinition");
+                pService->DeleteResource(wdfres1);
+            }
+            catch (MgFileIoException* e)
+            {
+                STRING message = e->GetDetails(TestServiceFactory::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(TestServiceFactory::TEST_LOCALE);
+                message += e->GetStackTrace(TestServiceFactory::TEST_LOCALE);
+                SAFE_RELEASE(e);
+                FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+            }
+            catch (...)
+            {
+                throw;
+            }
+        }
+
+        // TestRenderingService teardown
+        if (TestServiceFactory::IsRunningSuite("[RenderingService]"))
+        {
+            printf("Tearing down data for suite: RenderingService\n");
+            try
+            {
+                // delete the map definition
+                Ptr<MgResourceIdentifier> mapres1 = new MgResourceIdentifier(L"Library://UnitTests/Maps/Sheboygan.MapDefinition");
+                pService->DeleteResource(mapres1);
+
+                // delete the layer definitions
+                Ptr<MgResourceIdentifier> ldfres1 = new MgResourceIdentifier(L"Library://UnitTests/Layers/HydrographicPolygons.LayerDefinition");
+                pService->DeleteResource(ldfres1);
+
+                Ptr<MgResourceIdentifier> ldfres2 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Rail.LayerDefinition");
+                pService->DeleteResource(ldfres2);
+
+                Ptr<MgResourceIdentifier> ldfres3 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Parcels.LayerDefinition");
+                pService->DeleteResource(ldfres3);
+
+                // delete the feature sources
+                Ptr<MgResourceIdentifier> fsres1 = new MgResourceIdentifier(L"Library://UnitTests/Data/HydrographicPolygons.FeatureSource");
+                pService->DeleteResource(fsres1);
+
+                Ptr<MgResourceIdentifier> fsres2 = new MgResourceIdentifier(L"Library://UnitTests/Data/Rail.FeatureSource");
+                pService->DeleteResource(fsres2);
+
+                Ptr<MgResourceIdentifier> fsres3 = new MgResourceIdentifier(L"Library://UnitTests/Data/Parcels.FeatureSource");
+                pService->DeleteResource(fsres3);
+
+                // delete the print layouts
+                Ptr<MgResourceIdentifier> plres1 = new MgResourceIdentifier(L"Library://UnitTests/PrintLayouts/AllElements.PrintLayout");
+                pService->DeleteResource(plres1);
+
+                Ptr<MgResourceIdentifier> plres2 = new MgResourceIdentifier(L"Library://UnitTests/PrintLayouts/NoLegend.PrintLayout");
+                pService->DeleteResource(plres2);
+
+                // delete the symbol library
+                Ptr<MgResourceIdentifier> slres1 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/SymbolMart.SymbolLibrary");
+                pService->DeleteResource(slres1);
+
+                // delete symbology stuff
+                Ptr<MgResourceIdentifier> fsres4 = new MgResourceIdentifier(L"Library://UnitTests/Data/Capitals.FeatureSource");
+                pService->DeleteResource(fsres4);
+                Ptr<MgResourceIdentifier> sdres1 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/PointSymbol.SymbolDefinition");
+                pService->DeleteResource(sdres1);
+                Ptr<MgResourceIdentifier> sdres2 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/PointSymbolParam.SymbolDefinition");
+                pService->DeleteResource(sdres2);
+                Ptr<MgResourceIdentifier> ldfres4 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Capitals.LayerDefinition");
+                pService->DeleteResource(ldfres4);
+                Ptr<MgResourceIdentifier> ldfres5 = new MgResourceIdentifier(L"Library://UnitTests/Layers/CapitalsParam.LayerDefinition");
+                pService->DeleteResource(ldfres5);
+                Ptr<MgResourceIdentifier> mapres2 = new MgResourceIdentifier(L"Library://UnitTests/Maps/Capitals.MapDefinition");
+                pService->DeleteResource(mapres2);
+                Ptr<MgResourceIdentifier> mapres3 = new MgResourceIdentifier(L"Library://UnitTests/Maps/CapitalsParam.MapDefinition");
+                pService->DeleteResource(mapres3);
+
+                Ptr<MgResourceIdentifier> fsres5 = new MgResourceIdentifier(L"Library://UnitTests/Data/Lines.FeatureSource");
+                pService->DeleteResource(fsres5);
+                Ptr<MgResourceIdentifier> sdres3 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/LineSymbol.SymbolDefinition");
+                pService->DeleteResource(sdres3);
+                Ptr<MgResourceIdentifier> sdres4 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/MTYP1500a.SymbolDefinition");
+                pService->DeleteResource(sdres4);
+                Ptr<MgResourceIdentifier> ldfres6 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Lines.LayerDefinition");
+                pService->DeleteResource(ldfres6);
+                Ptr<MgResourceIdentifier> ldfres7 = new MgResourceIdentifier(L"Library://UnitTests/Layers/LinesCrossTick.LayerDefinition");
+                pService->DeleteResource(ldfres7);
+                Ptr<MgResourceIdentifier> mapres4 = new MgResourceIdentifier(L"Library://UnitTests/Maps/Lines.MapDefinition");
+                pService->DeleteResource(mapres4);
+                Ptr<MgResourceIdentifier> mapres5 = new MgResourceIdentifier(L"Library://UnitTests/Maps/LinesCrossTick.MapDefinition");
+                pService->DeleteResource(mapres5);
+
+                Ptr<MgResourceIdentifier> ldfres8 = new MgResourceIdentifier(L"Library://UnitTests/Layers/UT_Annotation1.LayerDefinition");
+                pService->DeleteResource(ldfres8);
+                Ptr<MgResourceIdentifier> ldfres9 = new MgResourceIdentifier(L"Library://UnitTests/Layers/UT_Annotation2.LayerDefinition");
+                pService->DeleteResource(ldfres9);
+                Ptr<MgResourceIdentifier> ldfres10 = new MgResourceIdentifier(L"Library://UnitTests/Layers/UT_Annotation3.LayerDefinition");
+                pService->DeleteResource(ldfres10);
+                Ptr<MgResourceIdentifier> mapres8 = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_Annotation1.MapDefinition");
+                pService->DeleteResource(mapres8);
+                Ptr<MgResourceIdentifier> mapres9 = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_Annotation2.MapDefinition");
+                pService->DeleteResource(mapres9);
+                Ptr<MgResourceIdentifier> mapres10 = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_Annotation3.MapDefinition");
+                pService->DeleteResource(mapres10);
+
+                Ptr<MgResourceIdentifier> mapres11 = new MgResourceIdentifier(L"Library://UnitTests/Maps/UT_SymbologyPolygons.MapDefinition");
+                pService->DeleteResource(mapres11);
+                Ptr<MgResourceIdentifier> ldfres11 = new MgResourceIdentifier(L"Library://UnitTests/Layers/SymbologyParcels.LayerDefinition");
+                pService->DeleteResource(ldfres11);
+                Ptr<MgResourceIdentifier> sdres5 = new MgResourceIdentifier(L"Library://UnitTests/Symbols/AreaSymbol.SymbolDefinition");
+                pService->DeleteResource(sdres5);
+
+                Ptr<MgResourceIdentifier> mapres12 = new MgResourceIdentifier(L"Library://UnitTests/Maps/SheboyganWithWatermark.MapDefinition");
+                pService->DeleteResource(mapres12);
+                Ptr<MgResourceIdentifier> wdfres1 = new MgResourceIdentifier(L"Library://UnitTests/Watermarks/PoweredByMapGuide.WatermarkDefinition");
+                pService->DeleteResource(wdfres1);
+
+                Ptr<MgResourceIdentifier> mapres13 = new MgResourceIdentifier(L"Library://UnitTests/Maps/BaseMap.MapDefinition");
+                pService->DeleteResource(mapres13);
+                Ptr<MgResourceIdentifier> ldfres12 = new MgResourceIdentifier(L"Library://UnitTests/Layers/RoadCenterLines.LayerDefinition");
+                pService->DeleteResource(ldfres12);
+                Ptr<MgResourceIdentifier> ldfres13 = new MgResourceIdentifier(L"Library://UnitTests/Layers/VotingDistricts.LayerDefinition");
+                pService->DeleteResource(ldfres13);
+                Ptr<MgResourceIdentifier> fsres6 = new MgResourceIdentifier(L"Library://UnitTests/Data/RoadCenterLines.FeatureSource");
+                pService->DeleteResource(fsres6);
+                Ptr<MgResourceIdentifier> fsres7 = new MgResourceIdentifier(L"Library://UnitTests/Data/VotingDistricts.FeatureSource");
+                pService->DeleteResource(fsres7);
+
+                Ptr<MgResourceIdentifier> ldfres14 = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiFTS.LayerDefinition");
+                pService->DeleteResource(ldfres14);
+                Ptr<MgResourceIdentifier> ldfres15 = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiCTS.LayerDefinition");
+                pService->DeleteResource(ldfres15);
+                Ptr<MgResourceIdentifier> ldfres16 = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiFTSWithTheme.LayerDefinition");
+                pService->DeleteResource(ldfres16);
+                Ptr<MgResourceIdentifier> ldfres17 = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiCTSWithTheme.LayerDefinition");
+                pService->DeleteResource(ldfres17);
+                Ptr<MgResourceIdentifier> ldfres18 = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiFTSSingleCTS.LayerDefinition");
+                pService->DeleteResource(ldfres18);
+                Ptr<MgResourceIdentifier> ldfres19 = new MgResourceIdentifier(L"Library://UnitTests/Layers/SingleFTSMultiCTS.LayerDefinition");
+                pService->DeleteResource(ldfres19);
+
+                // Data related to stylization function tests
+                Ptr<MgResourceIdentifier> ldfres20 = new MgResourceIdentifier(L"Library://UnitTests/Layers/StylizationFuncs.LayerDefinition");
+                pService->DeleteResource(ldfres20);
+
+                Ptr<MgResourceIdentifier> mapres15 = new MgResourceIdentifier(L"Library://UnitTests/Maps/StylizationFuncs.MapDefinition");
+                pService->DeleteResource(mapres15);
+
+                // Layer watermark test
+                Ptr<MgResourceIdentifier> wdfres2 = new MgResourceIdentifier(L"Library://UnitTests/Watermarks/Rail.WatermarkDefinition");
+                pService->DeleteResource(wdfres2);
+                Ptr<MgResourceIdentifier> ldfres21 = new MgResourceIdentifier(L"Library://UnitTests/Layers/RailWatermark.LayerDefinition");
+                pService->DeleteResource(ldfres21);
+            }
+            catch (MgFileIoException* e)
+            {
+                STRING message = e->GetDetails(TestServiceFactory::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(TestServiceFactory::TEST_LOCALE);
+                message += e->GetStackTrace(TestServiceFactory::TEST_LOCALE);
+                SAFE_RELEASE(e);
+                FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+            }
+            catch (...)
+            {
+                throw;
+            }
+        }
+
+        // TestTileService teardown
+        if (TestServiceFactory::IsRunningSuite("[TileService]"))
+        {
+            printf("Tearing down data for suite: TileService\n");
+            try
+            {
+                // ------------------------------------------------------
+                // base map source data
+                // ------------------------------------------------------
+
+                // delete the map definition
+                Ptr<MgResourceIdentifier> mapres1 = new MgResourceIdentifier(L"Library://UnitTests/Maps/BaseMap.MapDefinition");
+                pService->DeleteResource(mapres1);
+
+                // delete the layer definitions
+                Ptr<MgResourceIdentifier> ldfres1 = new MgResourceIdentifier(L"Library://UnitTests/Layers/RoadCenterLines.LayerDefinition");
+                pService->DeleteResource(ldfres1);
+
+                Ptr<MgResourceIdentifier> ldfres2 = new MgResourceIdentifier(L"Library://UnitTests/Layers/Parcels.LayerDefinition");
+                pService->DeleteResource(ldfres2);
+
+                Ptr<MgResourceIdentifier> ldfres3 = new MgResourceIdentifier(L"Library://UnitTests/Layers/VotingDistricts.LayerDefinition");
+                pService->DeleteResource(ldfres3);
+
+                // delete the feature sources
+                Ptr<MgResourceIdentifier> fsres1 = new MgResourceIdentifier(L"Library://UnitTests/Data/RoadCenterLines.FeatureSource");
+                pService->DeleteResource(fsres1);
+
+                Ptr<MgResourceIdentifier> fsres2 = new MgResourceIdentifier(L"Library://UnitTests/Data/Parcels.FeatureSource");
+                pService->DeleteResource(fsres2);
+
+                Ptr<MgResourceIdentifier> fsres3 = new MgResourceIdentifier(L"Library://UnitTests/Data/VotingDistricts.FeatureSource");
+                pService->DeleteResource(fsres3);
+
+                // remove temporary directory for tile images
+                MgFileUtil::DeleteDirectory(L"./temp_tiles", true, false);
+            }
+            catch (MgException* e)
+            {
+                STRING message = e->GetDetails(TestServiceFactory::TEST_LOCALE);
+                SAFE_RELEASE(e);
+                FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+            }
+            catch (...)
+            {
+                throw;
+            }
+        }
+
+        // TestResourceService teardown
+        if (TestServiceFactory::IsRunningSuite("[ResourceService]"))
+        {
+            printf("Tearing down data for suite: ResourceService\n");
+            try
+            {
+                // 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);
+
+                MgResourceIdentifier resourceIdentifier(L"Library://UnitTests/Data/test-1.FeatureSource"); // Original resource added
+                MgResourceIdentifier resourceIdentifier2(L"Library://UnitTests/Data/test-2.FeatureSource"); // Used in copy and move
+                MgResourceIdentifier resourceIdentifier3(L"Library://UnitTests/Data/World.DrawingSource"); // Added by package
+                MgResourceIdentifier resourceIdentifier4(L"Library://UnitTests/Layer/test-1.LayerDefinition"); // For cascade move resource
+
+                // 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(TestServiceFactory::TEST_LOCALE);
+                SAFE_RELEASE(e);
+                FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+            }
+            catch (...)
+            {
+                throw;
+            }
+        }
+
+        // TestFeatureService teardown
+        if (TestServiceFactory::IsRunningSuite("[FeatureService]"))
+        {
+            printf("Tearing down data for suite: FeatureService\n");
+            try
+            {
+                // 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(TestServiceFactory::TEST_LOCALE);
+                SAFE_RELEASE(e);
+                FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+            }
+            catch (...)
+            {
+                throw;
+            }
+        }
+
+#ifdef DEBUG
+        ACE_DEBUG((LM_INFO, ACE_TEXT("\nConnection Pool status: \n\n")));
+        std::vector<PoolCacheEntry*> entries;
+        MgdFdoConnectionPool::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
+    }
+};
+
+CATCH_REGISTER_LISTENER(TestDataSetup)
+
+// Get rid of Wweak-tables
+TestDataSetup::~TestDataSetup() {}
\ No newline at end of file

Added: sandbox/jng/catch2/Desktop/UnitTest/TestServiceFactory.h
===================================================================
--- sandbox/jng/catch2/Desktop/UnitTest/TestServiceFactory.h	                        (rev 0)
+++ sandbox/jng/catch2/Desktop/UnitTest/TestServiceFactory.h	2020-07-21 09:14:23 UTC (rev 9676)
@@ -0,0 +1,41 @@
+//
+//  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
+//
+
+#ifndef _TESTSERVICEFACTORY_H
+#define _TESTSERVICEFACTORY_H
+
+#include "MgDesktop.h"
+
+#include <string>
+#include <set>
+
+class TestServiceFactory
+{
+public:
+    static const STRING TEST_LOCALE;
+
+    static void AddSuiteToRun(const std::string& suite);
+
+    static void GetCatch2Tags(std::string& testOrTags);
+
+    static bool IsRunningSuite(const std::string& suite);
+
+private:
+    static std::set<std::string> sm_suitesToRun;
+};
+
+#endif



More information about the mapguide-commits mailing list