OrderTestClasses(IEnumerable <IGrouping <ITestClass, IXunitTestCase> > testCaseGroups)
        {
            int lastOrder = 0;

            //nasty check if we are in class without collection defined
            if (testCaseGroups.First().Key.TestCollection.CollectionDefinition != null)
            {
                foreach (var g in
                         testCaseGroups
                         .GroupBy(g => GetClassOrder(g.Key))
                         .OrderBy(g => g.Key))
                {
                    int count = g.Count();

                    if (count > 1)
                    {
                        DiagnosticSink.OnMessage(
                            new DiagnosticMessage(
                                g.Key == 0
                                                                        ? "Found {0} test classes with unassigned or order 0. '{2}'"
                                                                        : "Found {0} duplicates of order '{1}' on test collection '{2}'",
                                count,
                                g.Key,
                                string.Join("', '", g.Select(tc => tc.Key.Class.Name))));
                    }

                    if (lastOrder < g.Key - 1)
                    {
                        int lower = lastOrder + 1;
                        int upper = g.Key - 1;

                        DiagnosticSink.OnMessage(
                            new DiagnosticMessage(
                                lower == upper
                                                                        ? "Missing test classes order '{0}' for collection '{2}'."
                                                                        : "Missing test classes order sequence from '{0}' to '{1}' for collection '{2}'.",
                                lower,
                                upper,
                                GetCollectionName(g.First().Key.TestCollection)));
                    }

                    lastOrder = g.Key;
                }
            }

            return(testCaseGroups.OrderBy(g => GetClassOrder(g.Key)));
        }
        public virtual IEnumerable <TTestCase> OrderTestCases <TTestCase>(IEnumerable <TTestCase> testCases)
            where TTestCase : ITestCase
        {
            int lastOrder = 0;

            foreach (var g in
                     testCases
                     .GroupBy(tc => GetCaseOrder(tc))
                     .OrderBy(g => g.Key))
            {
                int count = g.Count();

                if (count > 1)
                {
                    DiagnosticSink.OnMessage(
                        new DiagnosticMessage(
                            g.Key == 0
                                                                ? "Found {0} test cases with unassigned or order 0. '{2}'"
                                                                : "Found {0} duplicate order '{1}' for test cases '{2}'",
                            count,
                            g.Key,
                            string.Join("', '", g.Select(tc => $"{tc.TestMethod.TestClass.Class.Name}.{tc.TestMethod.Method.Name}"))));
                }

                if (lastOrder < g.Key - 1)
                {
                    int lower = lastOrder + 1;
                    int upper = g.Key - 1;

                    DiagnosticSink.OnMessage(
                        new DiagnosticMessage(
                            lower == upper
                                                                ? "Missing test case order '{0}' in test class '{2}'."
                                                                : "Missing test case order sequence from '{0}' to '{1}' in test class '{2}'.",
                            lower,
                            upper,
                            string.Join("], [", g.Select(tc => tc.TestMethod.TestClass.Class.Name))));
                }

                lastOrder = g.Key;
            }

            return(testCases.OrderBy(tc => GetCaseOrder(tc)));
        }
        public IEnumerable <ITestCollection> OrderTestCollections(IEnumerable <ITestCollection> testCollections)
        {
            int lastOrder = 0;

            foreach (var g in testCollections
                     .GroupBy(tc => GetOrder(tc))
                     .OrderBy(g => g.Key))
            {
                int count = g.Count();

                if (count > 1)
                {
                    DiagnosticSink.OnMessage(
                        new DiagnosticMessage(
                            g.Key == 0
                                                                ? "Found {0} test collections with unassigned or order 0. '{2}'"
                                                                : "Found {0} duplicate order '{1}' on test collections '{2}'",
                            count,
                            g.Key,
                            string.Join("', '", g.Select(tc => GetCollectionName(tc)))));
                }

                if (lastOrder < g.Key - 1)
                {
                    int lower = lastOrder + 1;
                    int upper = g.Key - 1;

                    DiagnosticSink.OnMessage(
                        new DiagnosticMessage(
                            lower == upper
                                                                ? "Missing test collection order '{0}'."
                                                                : "Missing test collection order sequence from '{0}' to '{1}'.",
                            lower,
                            upper));
                }

                lastOrder = g.Key;
            }

            return(testCollections.OrderBy(c => GetOrder(c)));
        }