/// <summary>
        ///
        /// </summary>
        /// <param name="viewName"></param>
        /// <param name="schemaSet"></param>
        /// <param name="typeDetector"></param>
        /// <param name="pattern"></param>
        /// <param name="transformIncomingViaXsl"></param>
        /// <param name="transformOutgoingViaXsl"></param>
        /// <param name="validateOriginal"></param>
        /// <param name="emitAndCompare"></param>
        /// <param name="validateEmitted"></param>
        /// <returns></returns>
        public static LoadCounters LoadFiles(
            string viewName, XmlSchemaSet schemaSet, Func <string, Type> typeDetector, string pattern,
            IXmlTransformer transformIncomingViaXsl, IXmlTransformer transformOutgoingViaXsl,
            bool validateOriginal, bool emitAndCompare, bool validateEmitted)
        {
            ITestLog testLog         = new DebugLog();
            var      counters        = new LoadCounters();
            string   sampleFilesPath = @"..\..\..\..\..\Metadata\FpML.V5r3\fpml.org\samples\5.3\" + viewName;
            // temp files
            string incomingFullPath = Path.GetFullPath(@"..\..\step1incoming.xml");
            string internalFullPath = Path.GetFullPath(@"..\..\step2internal.xml");
            string outgoingFullPath = Path.GetFullPath(@"..\..\step3outgoing.xml");
            string fullPath         = Path.GetFullPath(sampleFilesPath);
            var    fileNames        = Directory.GetFiles(fullPath, pattern, SearchOption.AllDirectories);

            System.Diagnostics.Debug.Print("Loading {0} files from path: {1}", fileNames.Length, fullPath);
            for (int index = 0; index < fileNames.Length; index++)
            {
                string originalFilename = fileNames[index];
                string baseFilename     = Path.GetFileName(originalFilename);
                string relativePath     = Path.GetDirectoryName(originalFilename.Substring(fullPath.Length));
                string testId           = $"File{index}";
                System.Diagnostics.Debug.Print("[{0}] {1} ({2}) processing...", index, baseFilename, relativePath);
                counters.FilesProcessed.Inc();
                // validation
                if (validateOriginal)
                {
                    ValidateXml(testLog, testId, originalFilename, schemaSet, counters.OrigValidationErrors, counters.OrigValidationWarnings);
                }
                // incoming transformation
                TransformXml(testLog, testId, transformIncomingViaXsl, originalFilename, incomingFullPath, counters.IncomingTransformErrors);
                // deserialise
                object fpml = DeserialiseXml(testLog, testId, typeDetector, incomingFullPath, counters.DeserialisationErrors);
                // serialise
                SerialiseXml(testLog, testId, fpml, internalFullPath, counters.SerialisationErrors);
                // compare internal documents
                CompareXml(testLog, testId, incomingFullPath, internalFullPath, counters.InternalComparisonErrors);
                // outgoing transformation
                TransformXml(testLog, testId, transformOutgoingViaXsl, internalFullPath, outgoingFullPath, counters.OutgoingTransformErrors);
                // compare external documents
                if (emitAndCompare)
                {
                    CompareXml(testLog, testId, originalFilename, outgoingFullPath, counters.ExternalComparisonErrors);
                }
                if (validateEmitted)
                {
                    ValidateXml(testLog, testId, outgoingFullPath, schemaSet, counters.CopyValidationErrors, counters.CopyValidationWarnings);
                }
            }
            return(counters);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="schemaSet"></param>
        /// <param name="typeDetector"></param>
        /// <param name="transformIncomingViaXsl"></param>
        /// <param name="transformOutgoingViaXsl"></param>
        /// <param name="validateOriginal"></param>
        /// <param name="emitAndCompare"></param>
        /// <param name="validateEmitted"></param>
        /// <returns></returns>
        public static List <object> LoadAndReturnConfirmationExamples(
            XmlSchemaSet schemaSet, Func <string, Type> typeDetector,
            IXmlTransformer transformIncomingViaXsl, IXmlTransformer transformOutgoingViaXsl,
            bool validateOriginal, bool emitAndCompare, bool validateEmitted)
        {
            ITestLog testLog  = new DebugLog();
            var      counters = new LoadCounters();
            var      result   = new List <object>();
            //string schemaPath = @"..\..\..\nab.QR.FpML.V5r3\" + viewName + ".xsd";
            //string schemaFullPath = Path.GetFullPath(schemaPath);
            //if (!File.Exists(schemaFullPath))
            //    throw new FileNotFoundException("Schema missing!", schemaFullPath);
            const string fileSpec        = "*.xml";
            const string sampleFilesPath = @"..\..\..\..\..\Metadata\FpML.V5r3\fpml.org\samples\5.3\Confirmation\products";
            // temp files
            string incomingFullPath = Path.GetFullPath(@"..\..\step1incoming.xml");
            string fullPath         = Path.GetFullPath(sampleFilesPath);
            var    filenames        = Directory.GetFiles(fullPath, fileSpec, SearchOption.AllDirectories);

            System.Diagnostics.Debug.Print("Loading {0}", filenames.Length);
            for (int index = 0; index < filenames.Length; index++)
            {
                string originalFilename = filenames[index];
                //string baseFilename = Path.GetFileName(originalFilename);
                //string relativePath = Path.GetDirectoryName(originalFilename.Substring(fullPath.Length));
                string testId = $"File{index}";
                //System.Diagnostics.Debug.Print("[{0}] {1} ({2}) processing...", index, baseFilename, relativePath);
                counters.FilesProcessed.Inc();
                // validation
                //if (validateOriginal)
                //{
                //    ValidateXml(testLog, testId, originalFilename, schemaSet, counters.OrigValidationErrors, counters.OrigValidationWarnings);
                //}
                // incoming transformation
                TransformXml(testLog, testId, transformIncomingViaXsl, originalFilename, incomingFullPath, counters.IncomingTransformErrors);
                // deserialise
                object fpml = DeserialiseXml(testLog, testId, typeDetector, incomingFullPath, counters.DeserialisationErrors);
                result.Add(fpml);
            }
            return(result);
        }