static ElectiveReport ComparePackagesForReport(MatchedPackagePair pair, ElectiveReport report)
        {
            var installedPackage = pair.installedPackage;
            var dependency       = pair.dependencyPackage;

            if (pair.foundNameMatch)
            {
                if (dependency.Required)
                {
                    if (CheckSinglePackageVersion(installedPackage.version,
                                                  new[] { dependency.Version }))
                    {
                        report.AddMessagePass(
                            Messages.PackageVersionIsSupported + dependency.Name +
                            " : " + dependency.Version + Messages.DetectedVersionIs +
                            installedPackage.name + " : " +
                            installedPackage.version + Messages.EndQuoteNewLine);
                    }
                    else
                    {
                        report.AddMessageFail(Messages.PackageVersionIsUnsupported +
                                              dependency.Name + " : " +
                                              dependency.Version + Messages.DetectedVersionIs +
                                              installedPackage.name + " : " +
                                              installedPackage.version +
                                              Messages.EndQuoteNewLine);
                    }
                }
                else
                {
                    report.AddMessagePass(Messages.PackageVersionIsOptional +
                                          dependency.Name + " : " +
                                          dependency.Version + Messages.DetectedVersionIs +
                                          installedPackage.name + " : " +
                                          installedPackage.version + Messages.EndQuoteNewLine);
                }
            }
            else
            {
                if (dependency.Required)
                {
                    report.AddMessageFail(Messages.PackageVersionIsMissing + dependency.Name +
                                          " : " + dependency.Version + Messages.EndQuoteNewLine);
                }
                else
                {
                    report.AddMessagePass(Messages.PackageVersionIsMissingAndOptional +
                                          dependency.Name + " : " +
                                          dependency.Version + Messages.EndQuoteNewLine);
                }
            }

            return(report);
        }
        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);
        }