static ElectiveReport CheckGraphicsAPI(SupportedConfiguration config)
        {
            var report = new ElectiveReport();

            if (config.SupportedGraphicsAPIs == null || config.SupportedGraphicsAPIs.Length == 0)
            {
                return(report);
            }

            if (config.SupportedGraphicsAPIs.Any(api => api == SystemInfo.graphicsDeviceType))
            {
                if (config.SupportedGraphicsAPIsIsOrdered &&
                    config.SupportedGraphicsAPIs[0] != SystemInfo.graphicsDeviceType)
                {
                    report.AddMessageFail(Messages.UnsupportedGraphicsSupportedVersionsAre +
                                          config.SupportedGraphicsAPIs.Stringify() +
                                          Messages.DetectedVersionIs + SystemInfo.graphicsDeviceType +
                                          Messages.EndQuoteNewLine + Messages.GraphicsApiIsUnsupportedOrder);
                }
                else
                {
                    report.AddMessagePass(Messages.GraphicsApiIsSupported +
                                          config.SupportedGraphicsAPIs.Stringify() + Messages.EndQuoteNewLine);
                }
            }
            else
            {
                report.AddMessageFail(Messages.UnsupportedGraphicsSupportedVersionsAre +
                                      config.SupportedGraphicsAPIs.Stringify() +
                                      Messages.DetectedVersionIs + SystemInfo.graphicsDeviceType +
                                      Messages.EndQuoteNewLine + Messages.GraphicsApiIsUnsupported);
            }

            return(report);
        }
        static ElectiveReport CheckDefineSymbols(SupportedConfiguration config)
        {
            var report = new ElectiveReport();

            if (config.DefineSymbols == null || config.DefineSymbols.Length == 0)
            {
                return(report);
            }

            var definesAreMissing = false;

            foreach (var define in config.DefineSymbols)
            {
                if (define.Required && !define.Present)
                {
                    definesAreMissing = true;
                }
            }

            if (!definesAreMissing)
            {
                report.AddMessagePass(Messages.DefineSymbolsFoundAll);
            }
            else
            {
                report.AddMessageFail(Messages.DefineSymbolsNotFoundHeader);
            }

            foreach (var define in config.DefineSymbols)
            {
                if (define.Present)
                {
                    report.AddMessagePass(Messages.DefineSymbolsFound + define.Name + Messages.EndQuoteNewLine);
                }
                else
                {
                    if (define.Required)
                    {
                        report.AddMessageFail(Messages.DefineSymbolsMissed + define.Name + Messages.EndQuoteNewLine);
                    }

                    else
                    {
                        report.AddMessagePass(Messages.DefineSymbolsMissedNotRequired + define.Name +
                                              Messages.EndQuoteNewLine);
                    }
                }
            }

            if (definesAreMissing)
            {
                var suggestedString = string.Join(";", config.DefineSymbols.Select(m => m.Name).ToArray());
                report.MessageFail += Messages.DefineSymbolsExampleHeader + suggestedString + Environment.NewLine;
            }

            return(report);
        }
        public static string RunReport(SupportedConfiguration config)
        {
            if (config.ReportOutputLevel == SupportedConfiguration.ReportOutputLevels.ReportDisabled)
            {
                return("Reporting disabled.");
            }

            ElectiveReport[] reports =
            {
                CheckGraphicsAPI(config),
                CheckPackageVersions(config),
                CheckDefineSymbols(config),
            };

            if (MarsUserPreferences.ElectiveExtensionsReportsErrors)
            {
                config.ReportOutputLevel = SupportedConfiguration.ReportOutputLevels.ErrorOnIssue;
            }
            else if (config.ReportOutputLevel == SupportedConfiguration.ReportOutputLevels.ErrorOnIssue)
            {
                config.ReportOutputLevel = SupportedConfiguration.ReportOutputLevels.WarnOnIssue;
            }

            var result = "";

            if (config.ReportOutputLevel != SupportedConfiguration.ReportOutputLevels.ReportDisabled)
            {
                result = ReportAsString(reports, config);
            }

            switch (config.ReportOutputLevel)
            {
            case SupportedConfiguration.ReportOutputLevels.ErrorOnIssue when reports.Any(report => !report.Succeeded):
                Debug.LogError(result + Messages.LogErrorOnIssueDetectedNotice);

                break;

            case SupportedConfiguration.ReportOutputLevels.WarnOnIssue when reports.Any(report => !report.Succeeded):
                Debug.LogWarning(result);

                break;

            case SupportedConfiguration.ReportOutputLevels.ReportDisabled:
                break;

            case SupportedConfiguration.ReportOutputLevels.DebugLogOnly:
                Debug.Log(result);
                break;

            default:
                Debug.Log(result);
                break;
            }

            return(result);
        }
        static string ReportAsString(IEnumerable <ElectiveReport> reports, SupportedConfiguration config)
        {
            var messagesPass = "";
            var messagesFail = "";

            foreach (var report in reports)
            {
                messagesPass += report.MessagePass;
                messagesFail += report.MessageFail;
            }

            if (reports.All(report => report.Succeeded))
            {
                return(Messages.NoIssuesFound + messagesPass + Messages.ReportUsedConfig + config.FriendlyName +
                       Messages.EndQuoteNewLine);
            }

            return(messagesFail + Environment.NewLine + Messages.FollowingPassed + Environment.NewLine + messagesPass + Messages.ReportUsedConfig + config.FriendlyName +
                   Messages.EndQuoteNewLine);
        }
        static ElectiveReport CheckPackageVersions(SupportedConfiguration config)
        {
            var report = new ElectiveReport();

            if (config.Dependencies == null || config.Dependencies.Length == 0)
            {
                return(report);
            }

            var installedPackages = InstalledPackages.Infos;
            var pairs             = new List <MatchedPackagePair>();

            foreach (var dependency in config.Dependencies)
            {
                var pair = new MatchedPackagePair {
                    dependencyPackage = dependency
                };
                foreach (var installedPackage in installedPackages)
                {
                    if (dependency.Name == installedPackage.name)
                    {
                        pair.installedPackage = installedPackage;
                        pair.foundNameMatch   = true;
                        break;
                    }
                }
                pairs.Add(pair);
            }

            foreach (var pair in pairs)
            {
                report = ComparePackagesForReport(pair, report);
            }

            return(report);
        }