/// <summary>
        /// Gets the test case list with basic information
        /// </summary>
        /// <param name="resultFolder">The path to the result folder</param>
        /// <param name="captureFolder">The path to the capture folder</param>
        /// <returns>Returns the test case list with basic information</returns>
        private List <DataType.TestCase> GetTestCaseList(string resultFolder, string captureFolder)
        {
            List <DataType.TestCase> testCaseList = new List <DataType.TestCase>();

            if (!File.Exists(CaseCategoryFile))
            {
                GenerateCaseCategoryFile();
            }

            string sJSON = File.ReadAllText(CaseCategoryFile);
            Dictionary <string, List <string> > testCases = serializer.Deserialize <Dictionary <string, List <string> > >(sJSON);

            string[] txtfiles = Directory.GetFiles(resultFolder);
            foreach (var file in txtfiles)
            {
                string caseName = Path.GetFileNameWithoutExtension(file);
                int    i        = caseName.IndexOf('_');
                caseName = caseName.Substring(i + 1); // out the sort id
                i        = caseName.IndexOf('_');
                string caseStatus = caseName.Substring(0, i);
                caseName = caseName.Substring(i + 1);
                DataType.TestCase tc = new DataType.TestCase()
                {
                    Name      = caseName,
                    Result    = caseStatus,
                    ClassType = caseClass.ContainsKey(caseName) ? caseClass[caseName] : null,
                    Category  = testCases.ContainsKey(caseName) ? testCases[caseName] : null,
                };
                testCaseList.Add(tc);
            }
            return(testCaseList);
        }
        /// <summary>
        /// Gets the test case list with basic information
        /// </summary>
        /// <param name="resultFolder">The path to the result folder</param>
        /// <param name="captureFolder">The path to the capture folder</param>
        /// <param name="results">The dictionary containing all the test case results</param>
        /// <returns>Returns the test case list with basic information</returns>
        private List <DataType.TestCase> GetTestCaseList(string resultFolder, string captureFolder, ConcurrentDictionary <string, DataType.TestCaseDetail> results)
        {
            Dictionary <string, DataType.TestCase> testCases = new Dictionary <string, DataType.TestCase>();

            var txtfiles = Directory.GetFiles(resultFolder)
                           .Select(file => Path.GetFileNameWithoutExtension(file));

            // File name structure is {datetime}_{result}_{casename}.
            // So order them by name, they are also ordered by execution time.
            // Using casename as the key of dictionary, the new record will overwrite the old one.
            txtfiles = txtfiles.OrderBy(i => i);
            foreach (var file in txtfiles)
            {
                string caseName = file;
                int    i        = caseName.IndexOf('_');
                caseName = caseName.Substring(i + 1); // out the sort id
                i        = caseName.IndexOf('_');
                string caseStatus = caseName.Substring(0, i);
                caseName = caseName.Substring(i + 1);
                DataType.TestCase tc = new DataType.TestCase()
                {
                    Name      = caseName,
                    Result    = caseStatus,
                    ClassType = results.ContainsKey(caseName) ? results[caseName].ClassType : null,
                    Category  = results.ContainsKey(caseName) ? results[caseName].Categories : new List <string>(),
                };
                testCases[caseName] = tc; // overwrite the same case if any
            }

            List <DataType.TestCase> testCaseList = testCases.Values.OrderBy(tc => tc.Name).ToList(); // Sort by case name

            return(testCaseList);
        }
        /// <summary>
        /// Gets the test case list with basic information
        /// </summary>
        /// <param name="resultFolder">The path to the result folder</param>
        /// <param name="captureFolder">The path to the capture folder</param>
        /// <returns>Returns the test case list with basic information</returns>
        private List <DataType.TestCase> GetTestCaseList(string resultFolder, string captureFolder)
        {
            Dictionary <string, DataType.TestCase> testCases = new Dictionary <string, DataType.TestCase>();

            if (!File.Exists(CaseCategoryFile))
            {
                GenerateCaseCategoryFile();
            }

            string sJSON = File.ReadAllText(CaseCategoryFile);
            Dictionary <string, List <string> > testCaseToCategory = serializer.Deserialize <Dictionary <string, List <string> > >(sJSON);

            string[] txtfiles = Directory.GetFiles(resultFolder)
                                .Select(file => Path.GetFileNameWithoutExtension(file)).ToArray();

            // File name structure is {datetime}_{result}_{casename}.
            // So order them by name, they are also ordered by execution time.
            // Using casename as the key of dictionary, the new record will overwrite the old one.
            txtfiles = txtfiles.OrderBy(i => i).ToArray();
            foreach (var file in txtfiles)
            {
                string caseName = file;
                int    i        = caseName.IndexOf('_');
                caseName = caseName.Substring(i + 1); // out the sort id
                i        = caseName.IndexOf('_');
                string caseStatus = caseName.Substring(0, i);
                caseName = caseName.Substring(i + 1);
                DataType.TestCase tc = new DataType.TestCase()
                {
                    Name      = caseName,
                    Result    = caseStatus,
                    ClassType = caseClass.ContainsKey(caseName) ? caseClass[caseName] : null,
                    Category  = testCaseToCategory.ContainsKey(caseName) ? testCaseToCategory[caseName] : null,
                };
                testCases[caseName] = tc; // overwrite the same case if any
            }

            List <DataType.TestCase> testCaseList = testCases.Values.OrderBy(tc => tc.Name).ToList(); // Sort by case name

            return(testCaseList);
        }
        /// <summary>
        /// Gets the test case list with basic information
        /// </summary>
        /// <param name="resultFolder">The path to the result folder</param>
        /// <param name="captureFolder">The path to the capture folder</param>
        /// <param name="results">The dictionary containing all the test case results</param>
        /// <returns>Returns the test case list with basic information</returns>
        private List <DataType.TestCase> GetTestCaseList(ConcurrentDictionary <string, DataType.TestCaseDetail> results)
        {
            Dictionary <string, DataType.TestCase> testCases = new Dictionary <string, DataType.TestCase>();

            foreach (var kvp in results)
            {
                DataType.TestCase tc = new DataType.TestCase()
                {
                    FullyQualifiedName = kvp.Key,
                    Name      = kvp.Value.Name,
                    Result    = kvp.Value.Result,
                    ClassType = kvp.Value.ClassType,
                    Category  = kvp.Value.Categories,
                };
                testCases[kvp.Key] = tc; // overwrite the same case if any
            }

            List <DataType.TestCase> testCaseList = testCases.Values.OrderBy(tc => tc.Name).ToList(); // Sort by case name

            return(testCaseList);
        }
        /// <summary>
        /// Gets the test case list with basic information
        /// </summary>
        /// <param name="resultFolder">The path to the result folder</param>
        /// <param name="captureFolder">The path to the capture folder</param>
        /// <returns>Returns the test case list with basic information</returns>
        private List<DataType.TestCase> GetTestCaseList(string resultFolder, string captureFolder)
        {
            List<DataType.TestCase> testCaseList = new List<DataType.TestCase>();

            if (!File.Exists(CaseCategoryFile))
            {
                GenerateCaseCategoryFile();
            }

            string sJSON = File.ReadAllText(CaseCategoryFile);
            Dictionary<string, List<string>> testCases = serializer.Deserialize<Dictionary<string, List<string>>>(sJSON);
            string[] txtfiles = Directory.GetFiles(resultFolder);
            foreach (var file in txtfiles)
            {
                string caseName = Path.GetFileNameWithoutExtension(file);
                int i = caseName.IndexOf('_');
                caseName = caseName.Substring(i + 1); // out the sort id
                i = caseName.IndexOf('_');
                string caseStatus = caseName.Substring(0, i);
                caseName = caseName.Substring(i + 1);
                DataType.TestCase tc = new DataType.TestCase()
                {
                    Name = caseName,
                    Result = caseStatus,
                    ClassType = caseClass.ContainsKey(caseName) ? caseClass[caseName] : null,
                    Category = testCases.ContainsKey(caseName) ? testCases[caseName] : null,
                };
                testCaseList.Add(tc);
            }
            return testCaseList;
        }