Exemplo n.º 1
0
        public void BuildCopShouldExcludeBuildGroupsFromExplicitConfig()
        {
            BuildCopConfiguration config     = new BuildCopConfiguration();
            buildGroupElement     buildGroup = new buildGroupElement();

            buildGroup.enabled = true;
            buildGroup.name    = "TestBuildGroup";
            buildFilePathElement path = new buildFilePathElement();

            path.rootPath      = @"BuildFiles";
            path.excludedFiles = "default";
            buildGroup.buildFiles.paths.Add(path);
            ruleElement mockRule = new ruleElement();

            mockRule.name = "Mock";
            mockRule.type = typeof(MockRule).AssemblyQualifiedName;
            buildGroup.rules.Add(mockRule);
            config.buildGroups.Add(buildGroup);

            BuildCopReport report = BuildCopEngine.Execute(config, new string[] { });

            Assert.IsNotNull(report);
            IList <BuildGroupReport> groupReports = report.BuildGroupReports;

            Assert.IsNotNull(groupReports);
            Assert.AreEqual <int>(0, groupReports.Count);
        }
Exemplo n.º 2
0
        public void VerifyMultipleFilesWithGlobalExclude()
        {
            BuildCopConfiguration config     = new BuildCopConfiguration();
            buildGroupElement     buildGroup = new buildGroupElement();

            buildGroup.name    = "TestBuildGroup";
            buildGroup.enabled = true;
            buildGroup.buildFiles.excludedFiles = "signed";
            buildFilePathElement path = new buildFilePathElement();

            path.rootPath      = @"BuildFiles";
            path.excludedFiles = "default";
            buildGroup.buildFiles.paths.Add(path);
            ruleElement mockRule = new ruleElement();

            mockRule.name = "Mock";
            mockRule.type = typeof(MockRule).AssemblyQualifiedName;
            buildGroup.rules.Add(mockRule);
            config.buildGroups.Add(buildGroup);

            BuildCopReport report = BuildCopEngine.Execute(config);

            Assert.IsNotNull(report);
            IList <BuildGroupReport> groupReports = report.BuildGroupReports;

            Assert.IsNotNull(groupReports);
            Assert.AreEqual <int>(1, groupReports.Count);
            BuildGroupReport groupReport = groupReports[0];

            Assert.IsNotNull(groupReport);
            Assert.AreEqual <string>("TestBuildGroup", groupReport.BuildGroupName);
            Assert.IsNotNull(groupReport.BuildFileReports);
            Assert.AreEqual <int>(0, groupReport.BuildFileReports.Count);
        }
Exemplo n.º 3
0
        public void BuildCopShouldReportRuleExceptions()
        {
            BuildCopConfiguration config     = new BuildCopConfiguration();
            buildGroupElement     buildGroup = new buildGroupElement();

            buildGroup.name    = "TestBuildGroup";
            buildGroup.enabled = true;
            buildFilePathElement path = new buildFilePathElement();

            path.rootPath      = @"BuildFiles";
            path.searchPattern = "DefaultConsoleApplication.csproj";
            buildGroup.buildFiles.paths.Add(path);
            ruleElement mockRule = new ruleElement();

            mockRule.name        = "Mock";
            mockRule.type        = typeof(ExceptionMockRule).AssemblyQualifiedName;
            mockRule.RuleChecker = new ExceptionMockRule(mockRule);
            buildGroup.rules.Add(mockRule);
            config.buildGroups.Add(buildGroup);

            BuildCopReport report = BuildCopEngine.Execute(config);

            Assert.IsNotNull(report);

            IList <BuildGroupReport> groupReports = report.BuildGroupReports;

            Assert.IsNotNull(groupReports);
            Assert.AreEqual <int>(1, groupReports.Count);
            BuildGroupReport groupReport = groupReports[0];

            Assert.IsNotNull(groupReport);
            Assert.AreEqual <string>("TestBuildGroup", groupReport.BuildGroupName);
            Assert.IsNotNull(groupReport.BuildFileReports);
            Assert.AreEqual <int>(1, groupReport.BuildFileReports.Count);
            BuildFileReport fileReport = groupReport.BuildFileReports[0];

            Assert.IsNotNull(fileReport);
            Assert.AreEqual <string>(@"BuildFiles\DefaultConsoleApplication.csproj", fileReport.FileName);
            Assert.IsNotNull(fileReport.LogEntries);
            Assert.AreEqual <int>(1, fileReport.LogEntries.Count);
            LogEntry entry = fileReport.LogEntries[0];

            Assert.AreEqual <LogLevel>(LogLevel.Exception, entry.Level);
            Assert.AreEqual <string>("An exception occurred while analysing the build file.", entry.Message);
            Assert.IsNotNull(entry.Detail);
            Assert.IsTrue(entry.Detail.Contains("ExceptionMock was configured to throw exceptions."));
        }
Exemplo n.º 4
0
        public void FormattersShouldNotThrowOnFormatting()
        {
            BuildCopConfiguration config     = new BuildCopConfiguration();
            buildGroupElement     buildGroup = new buildGroupElement();

            buildGroup.name = "TestBuildGroup";
            buildFilePathElement path = new buildFilePathElement();

            path.rootPath      = @"BuildFiles";
            path.searchPattern = "DefaultConsoleApplication.csproj";
            buildGroup.buildFiles.paths.Add(path);
            ruleElement mockRule = new ruleElement();

            mockRule.name = "Mock";
            mockRule.type = typeof(MockRule).AssemblyQualifiedName;
            buildGroup.rules.Add(mockRule);
            config.buildGroups.Add(buildGroup);
            BuildCopReport report = BuildCopEngine.Execute(config);

            Assert.IsNotNull(report);

            // Execute the known formatters.
            BaseFormatter formatter;

            formatter = new ConsoleFormatter(null);
            formatter.WriteReport(report, LogLevel.Information);
            formatterElement htmlFileConfiguration = new formatterElement();

            htmlFileConfiguration.output.fileName   = "TestFormatterOutput.html";
            htmlFileConfiguration.output.launch     = false;
            htmlFileConfiguration.output.stylesheet = string.Empty;
            formatter = new HtmlFormatter(htmlFileConfiguration);
            formatter.WriteReport(report, LogLevel.Information);
            formatterElement xmlFileConfiguration = new formatterElement();

            xmlFileConfiguration.output.fileName   = "TestFormatterOutput.xml";
            xmlFileConfiguration.output.launch     = false;
            xmlFileConfiguration.output.stylesheet = string.Empty;
            formatter = new XmlFormatter(xmlFileConfiguration);
            formatter.WriteReport(report, LogLevel.Information);
            formatterElement csvFileConfiguration = new formatterElement();

            csvFileConfiguration.output.fileName = "TestFormatterOutput.csv";
            csvFileConfiguration.output.launch   = false;
            formatter = new CsvFormatter(csvFileConfiguration);
            formatter.WriteReport(report, LogLevel.Information);
        }
Exemplo n.º 5
0
        public void BuildCopShouldExecuteFormatters()
        {
            BuildCopConfiguration config     = new BuildCopConfiguration();
            buildGroupElement     buildGroup = new buildGroupElement();

            buildGroup.name    = "TestBuildGroup";
            buildGroup.enabled = true;
            buildFilePathElement path = new buildFilePathElement();

            path.rootPath      = @"BuildFiles";
            path.searchPattern = "DefaultConsoleApplication.csproj";
            buildGroup.buildFiles.paths.Add(path);
            ruleElement mockRule = new ruleElement();

            mockRule.name        = "Mock";
            mockRule.type        = typeof(MockRule).AssemblyQualifiedName;
            mockRule.RuleChecker = new MockRule(mockRule);
            buildGroup.rules.Add(mockRule);
            config.buildGroups.Add(buildGroup);
            formatterElement formatter = new formatterElement();

            formatter.type            = typeof(MockFormatter).AssemblyQualifiedName;
            formatter.minimumLogLevel = LogLevel.Information;
            formatter.Formatter       = new MockFormatter(formatter);
            config.formatters.Add(formatter);

            MockFormatter.LastReport = null;
            BuildCopEngine.Execute(config);
            BuildCopReport lastReport = MockFormatter.LastReport;

            Assert.IsNotNull(lastReport);
            Assert.AreEqual <string>(typeof(BuildCopEngine).Assembly.GetName().Version.ToString(), lastReport.EngineVersion);
            Assert.IsTrue(DateTime.Now - lastReport.GeneratedTime < TimeSpan.FromMinutes(1));
            IList <BuildGroupReport> groupReports = lastReport.BuildGroupReports;

            Assert.IsNotNull(groupReports);
            Assert.AreEqual <int>(1, groupReports.Count);
            BuildGroupReport groupReport = groupReports[0];

            Assert.IsNotNull(groupReport);
            Assert.AreEqual <string>("TestBuildGroup", groupReport.BuildGroupName);
            Assert.IsNotNull(groupReport.BuildFileReports);
            Assert.AreEqual <int>(1, groupReport.BuildFileReports.Count);
            CheckMockFileReport(groupReport.BuildFileReports[0], @"BuildFiles\DefaultConsoleApplication.csproj");
        }
Exemplo n.º 6
0
        /// <summary>
        /// Gets the output type mappings.
        /// </summary>
        /// <param name="configuration">The configuration from which to read additional mappings..</param>
        /// <returns>A dictionary with output type aliases as key and their project type GUID as value.</returns>
        private static IDictionary <string, string> GetOutputTypeMappings(BuildCopConfiguration configuration)
        {
            // Populate the output type mappings dictionary.
            IDictionary <string, string> outputTypeMappings = new Dictionary <string, string>();

            // Add the Web Application Projects alias by default.
            outputTypeMappings.Add("Web", "{349c5851-65df-11da-9384-00065b846f21}");

            // Add the mappings from the configuration (overwriting existing entries if needed).
            if (configuration.outputTypeMappings != null)
            {
                foreach (outputTypeElement outputType in configuration.outputTypeMappings)
                {
                    outputTypeMappings[outputType.alias] = outputType.projectTypeGuid;
                }
            }
            return(outputTypeMappings);
        }
Exemplo n.º 7
0
        public void BuildCopShouldExecuteSharedRules()
        {
            BuildCopConfiguration config     = new BuildCopConfiguration();
            buildGroupElement     buildGroup = new buildGroupElement();

            buildGroup.name    = "TestBuildGroup";
            buildGroup.enabled = true;
            buildFilePathElement path = new buildFilePathElement();

            path.rootPath      = @"BuildFiles";
            path.searchPattern = "DefaultConsoleApplication.csproj";
            buildGroup.buildFiles.paths.Add(path);
            ruleElement mockRule = new ruleElement();

            mockRule.name        = "Mock";
            mockRule.RuleChecker = new MockRule(mockRule);
            buildGroup.rules.Add(mockRule);
            ruleElement sharedMockRule = new ruleElement();

            sharedMockRule.name        = "Mock";
            sharedMockRule.type        = typeof(MockRule).AssemblyQualifiedName;
            sharedMockRule.RuleChecker = new MockRule(sharedMockRule);
            config.sharedRules.Add(sharedMockRule);
            config.buildGroups.Add(buildGroup);

            BuildCopReport report = BuildCopEngine.Execute(config);

            Assert.IsNotNull(report);

            IList <BuildGroupReport> groupReports = report.BuildGroupReports;

            Assert.IsNotNull(groupReports);
            Assert.AreEqual <int>(1, groupReports.Count);
            BuildGroupReport groupReport = groupReports[0];

            Assert.IsNotNull(groupReport);
            Assert.AreEqual <string>("TestBuildGroup", groupReport.BuildGroupName);
            Assert.IsNotNull(groupReport.BuildFileReports);
            Assert.AreEqual <int>(1, groupReport.BuildFileReports.Count);
            CheckMockFileReport(groupReport.BuildFileReports[0], @"BuildFiles\DefaultConsoleApplication.csproj");
        }
Exemplo n.º 8
0
        public void BuildCopShouldExcludeBuildGroupsWithoutRules()
        {
            BuildCopConfiguration config     = new BuildCopConfiguration();
            buildGroupElement     buildGroup = new buildGroupElement();

            buildGroup.name    = "TestBuildGroup";
            buildGroup.enabled = true;
            buildFilePathElement path = new buildFilePathElement();

            path.rootPath      = @"BuildFiles";
            path.excludedFiles = "default";
            buildGroup.buildFiles.paths.Add(path);
            config.buildGroups.Add(buildGroup);

            BuildCopReport report = BuildCopEngine.Execute(config);

            Assert.IsNotNull(report);
            IList <BuildGroupReport> groupReports = report.BuildGroupReports;

            Assert.IsNotNull(groupReports);
            Assert.AreEqual <int>(0, groupReports.Count);
        }
Exemplo n.º 9
0
        public void BuildCopShouldExcludeRulesOnOutputTypeWithProjectTypeGuids()
        {
            BuildCopConfiguration config     = new BuildCopConfiguration();
            buildGroupElement     buildGroup = new buildGroupElement();

            buildGroup.name    = "TestBuildGroup";
            buildGroup.enabled = true;
            buildFilePathElement path = new buildFilePathElement();

            path.rootPath      = @"BuildFiles";
            path.searchPattern = "SignedConsoleApplication.csproj";
            buildGroup.buildFiles.paths.Add(path);
            ruleElement mockRule = new ruleElement();

            mockRule.name = "Mock";
            mockRule.type = typeof(MockRule).AssemblyQualifiedName;
            mockRule.excludedOutputTypes = "Dummy;Web";
            buildGroup.rules.Add(mockRule);
            config.buildGroups.Add(buildGroup);

            BuildCopReport report = BuildCopEngine.Execute(config);

            Assert.IsNotNull(report);

            IList <BuildGroupReport> groupReports = report.BuildGroupReports;

            Assert.IsNotNull(groupReports);
            Assert.AreEqual <int>(1, groupReports.Count);
            BuildGroupReport groupReport = groupReports[0];

            Assert.IsNotNull(groupReport);
            Assert.AreEqual <string>("TestBuildGroup", groupReport.BuildGroupName);
            Assert.IsNotNull(groupReport.BuildFileReports);
            Assert.AreEqual <int>(1, groupReport.BuildFileReports.Count);
            Assert.AreEqual <int>(0, groupReport.BuildFileReports[0].LogEntries.Count);
        }
Exemplo n.º 10
0
        /// <summary>
        /// Starts analysis using the specified configuration.
        /// </summary>
        /// <param name="configuration">The BuildCop configuration to use.</param>
        /// <param name="buildGroups">The build groups to verify.</param>
        /// <returns>The report containing the outcome of a verification for a list of build groups.</returns>
        public static BuildCopReport Execute(BuildCopConfiguration configuration, IList <string> buildGroups)
        {
            IList <BuildGroupReport> groupReports = new List <BuildGroupReport>();

            IDictionary <string, string> outputTypeMappings = GetOutputTypeMappings(configuration);

            foreach (buildGroupElement buildGroup in configuration.buildGroups)
            {
                bool shouldVerifyBuildGroup = buildGroup.enabled;
                if (buildGroup.rules.Count == 0)
                {
                    shouldVerifyBuildGroup = false;
                }
                else if (buildGroups != null && !buildGroups.Contains(buildGroup.name))
                {
                    shouldVerifyBuildGroup = false;
                }
                if (shouldVerifyBuildGroup)
                {
                    IList <BuildFileReport> fileReports = new List <BuildFileReport>();

                    // Determine build files.
                    IList <BuildFile> buildFiles = GetBuildFiles(buildGroup.buildFiles);

                    // Determine rules.
                    IList <ruleElement> rules = new List <ruleElement>();
                    foreach (ruleElement ruleDefinition in buildGroup.rules)
                    {
                        ////BaseRule rule = CreateRule(ruleDefinition, configuration.sharedRules);
                        rules.Add(ruleDefinition);
                    }

                    // Run rules on all build files.
                    foreach (BuildFile buildFile in buildFiles)
                    {
                        List <LogEntry> allEntries = new List <LogEntry>();
                        try
                        {
                            buildFile.Parse();
                            foreach (ruleElement rule in rules)
                            {
                                if (!ShouldExcludeFile(buildFile.FileName, rule.excludedFiles))
                                {
                                    if (!ShouldExcludeOutputType(buildFile.OutputType, buildFile.ProjectTypeGuids, outputTypeMappings, rule.excludedOutputTypes))
                                    {
                                        if (string.IsNullOrEmpty(rule.type.Trim()))
                                        {
                                            // Shared rules entry
                                            foreach (var sharedRule in configuration.sharedRules)
                                            {
                                                if (sharedRule.name == rule.name)
                                                {
                                                    IList <LogEntry> ruleEntries = sharedRule.RuleChecker.Check(buildFile);
                                                    allEntries.AddRange(ruleEntries);
                                                }
                                            }
                                        }
                                        else
                                        {
                                            IList <LogEntry> ruleEntries = rule.RuleChecker.Check(buildFile);
                                            allEntries.AddRange(ruleEntries);
                                        }
                                    }
                                }
                            }
                        }
                        catch (Exception exc)
                        {
                            LogEntry entry = CreateExceptionLogEntry(exc);
                            allEntries.Add(entry);
                        }
                        BuildFileReport fileReport = new BuildFileReport(buildFile.FileName, allEntries);
                        fileReports.Add(fileReport);
                    }

                    groupReports.Add(new BuildGroupReport(buildGroup.name, fileReports));
                }
            }

            BuildCopReport report = new BuildCopReport(groupReports);

            // Write reports to formatters.
            foreach (formatterElement formatterDefinition in configuration.formatters)
            {
                formatterDefinition.Formatter.WriteReport(report, formatterDefinition.minimumLogLevel);
            }

            return(report);
        }
Exemplo n.º 11
0
 /// <summary>
 /// Starts analysis using the specified configuration.
 /// </summary>
 /// <param name="configuration">The BuildCop configuration to use.</param>
 /// <returns>The report containing the outcome of a verification for a list of build groups.</returns>
 public static BuildCopReport Execute(BuildCopConfiguration configuration)
 {
     return(Execute(configuration, null));
 }
Exemplo n.º 12
0
        /// <summary>
        /// Starts analysis using the calling application's configuration.
        /// </summary>
        /// <param name="buildGroups">The build groups to verify.</param>
        /// <returns>The report containing the outcome of a verification for a list of build groups.</returns>
        public static BuildCopReport Execute(IList <string> buildGroups)
        {
            BuildCopConfiguration theConfig = BuildCopConfiguration.LoadFromFile(@"BuildCop.config");

            return(Execute(theConfig, buildGroups));
        }
Exemplo n.º 13
0
        /// <summary>
        /// Starts analysis using the calling application's configuration.
        /// </summary>
        /// <returns>The report containing the outcome of a verification for a list of build groups.</returns>
        public static BuildCopReport Execute()
        {
            BuildCopConfiguration theConfig = BuildCopConfiguration.LoadFromFile(@"BuildCop.config");

            return(Execute(theConfig, null));
        }
Exemplo n.º 14
0
        public void ConfigurationFileShouldBeReadCorrectly()
        {
            BuildCopConfiguration config = BuildCopConfiguration.LoadFromFile(@"BuildCop.config");

            Assert.IsNotNull(config);
            Assert.IsNotNull(config.buildGroups);
            Assert.AreEqual <int>(1, config.buildGroups.Count);

            buildGroupElement group = config.buildGroups[0];

            Assert.IsNotNull(group);
            Assert.AreEqual <string>("TestBuildGroup", group.name);
            Assert.IsTrue(group.enabled);
            Assert.IsNotNull(group.buildFiles);
            Assert.AreEqual <string>("jpg;gif", group.buildFiles.excludedFiles);
            Assert.IsNotNull(group.buildFiles.paths);
            Assert.AreEqual <int>(1, group.buildFiles.paths.Count);
            buildFilePathElement buildFilePath = group.buildFiles.paths[0];

            Assert.AreEqual <string>("TestRootPath", buildFilePath.rootPath);
            Assert.AreEqual <string>("*.csproj", buildFilePath.searchPattern);
            Assert.AreEqual <string>("exclude;bak", buildFilePath.excludedFiles);
            Assert.IsNotNull(group.rules);
            Assert.AreEqual <int>(7, group.rules.Count);

            ruleElement asmRefRule = group.rules[0];

            Assert.IsNotNull(asmRefRule);
            Assert.AreEqual <string>("AssemblyReferenceRule", asmRefRule.name);
            Assert.AreEqual <string>("BuildCop.Rules.AssemblyReferences.AssemblyReferenceRule", asmRefRule.type);
            Assert.AreEqual <string>("dat;bin", asmRefRule.excludedFiles);
            Assert.AreEqual <string>("WinExe;Exe", asmRefRule.excludedOutputTypes);
            Assert.AreEqual <bool>(true, asmRefRule.enabled);
            ////Assert.IsNotNull(asmRefRule.RuleConfiguration);
            ////Assert.IsInstanceOfType(asmRefRule.assemblyLocations, typeof(AssemblyReferenceRuleElement));
            ////AssemblyReferenceRuleElement asmRefRuleConfig = (AssemblyReferenceRuleElement)asmRefRule.RuleConfiguration;
            Assert.IsNotNull(asmRefRule.assemblyLocations);
            Assert.AreEqual <int>(1, asmRefRule.assemblyLocations.Count);
            ruleElementAssemblyLocation asmLocation = asmRefRule.assemblyLocations[0];

            Assert.IsNotNull(asmLocation);
            Assert.AreEqual <string>("TestAssemblyName", asmLocation.assemblyName);
            Assert.AreEqual <string>("TestAssemblyPath", asmLocation.assemblyPath);

            ruleElement strongNamingRule = group.rules[1];

            Assert.IsNotNull(strongNamingRule);
            Assert.AreEqual <string>("StrongNamingRule", strongNamingRule.name);
            Assert.AreEqual <string>("BuildCop.Rules.StrongNaming.StrongNamingRule", strongNamingRule.type);
            Assert.AreEqual <string>(string.Empty, strongNamingRule.excludedFiles);
            Assert.AreEqual <string>(string.Empty, strongNamingRule.excludedOutputTypes);
            Assert.AreEqual <bool>(true, strongNamingRule.enabled);
            Assert.AreEqual <bool>(true, strongNamingRule.strongNaming.strongNameRequired);
            Assert.AreEqual <string>("TestKeyPath", strongNamingRule.strongNaming.keyPath);
            Assert.AreEqual <bool>(false, strongNamingRule.strongNaming.ignoreUnsignedProjects);

            ruleElement namingConventionsRule = group.rules[2];

            Assert.IsNotNull(namingConventionsRule);
            Assert.AreEqual <string>("NamingConventionsRule", namingConventionsRule.name);
            Assert.AreEqual <string>("BuildCop.Rules.NamingConventions.NamingConventionsRule", namingConventionsRule.type);
            Assert.AreEqual <string>(string.Empty, namingConventionsRule.excludedFiles);
            Assert.AreEqual <string>(string.Empty, namingConventionsRule.excludedOutputTypes);
            Assert.AreEqual <bool>(false, namingConventionsRule.enabled);
            Assert.IsNotNull(namingConventionsRule.prefixes);
            Assert.AreEqual <string>("TestAssemblyNamePrefix", namingConventionsRule.prefixes.assemblyNamePrefix);
            Assert.AreEqual <string>("TestNamespacePrefix", namingConventionsRule.prefixes.namespacePrefix);
            Assert.AreEqual <bool>(true, namingConventionsRule.prefixes.assemblyNameShouldMatchRootNamespace);

            ruleElement buildPropertiesRule = group.rules[3];

            Assert.IsNotNull(buildPropertiesRule);
            Assert.AreEqual <string>("BuildPropertiesRule", buildPropertiesRule.name);
            Assert.AreEqual <string>("BuildCop.Rules.BuildProperties.BuildPropertiesRule", buildPropertiesRule.type);
            Assert.AreEqual <string>(string.Empty, buildPropertiesRule.excludedFiles);
            Assert.AreEqual <string>(string.Empty, buildPropertiesRule.excludedOutputTypes);
            Assert.AreEqual <bool>(true, buildPropertiesRule.enabled);
            Assert.IsNotNull(buildPropertiesRule.buildProperties);
            Assert.AreEqual <int>(3, buildPropertiesRule.buildProperties.Count);
            Assert.AreEqual <string>("ProductVersion", buildPropertiesRule.buildProperties[0].name);
            Assert.AreEqual <string>("8.0.50727", buildPropertiesRule.buildProperties[0].value);
            Assert.AreEqual <string>(string.Empty, buildPropertiesRule.buildProperties[0].condition);
            Utility.CheckCompareOption(CompareOption.EqualTo, buildPropertiesRule.buildProperties[0].compareOption);
            Utility.CheckStringComparison(StringComparison.Ordinal, buildPropertiesRule.buildProperties[0].stringCompareOption);
            Assert.AreEqual <string>("SchemaVersion", buildPropertiesRule.buildProperties[1].name);
            Assert.AreEqual <string>("2.0", buildPropertiesRule.buildProperties[1].value);
            Assert.AreEqual <string>(string.Empty, buildPropertiesRule.buildProperties[1].condition);
            Utility.CheckCompareOption(CompareOption.EqualTo, buildPropertiesRule.buildProperties[1].compareOption);
            Utility.CheckStringComparison(StringComparison.Ordinal, buildPropertiesRule.buildProperties[1].stringCompareOption);
            Assert.AreEqual <string>("DebugType", buildPropertiesRule.buildProperties[2].name);
            Assert.AreEqual <string>("full", buildPropertiesRule.buildProperties[2].value);
            Assert.AreEqual <string>("Debug", buildPropertiesRule.buildProperties[2].condition);
            Utility.CheckCompareOption(CompareOption.DoesNotExist, buildPropertiesRule.buildProperties[2].compareOption);
            Utility.CheckStringComparison(StringComparison.OrdinalIgnoreCase, buildPropertiesRule.buildProperties[2].stringCompareOption);

            ruleElement documentationFileRule = group.rules[4];

            Assert.IsNotNull(documentationFileRule);
            Assert.AreEqual <string>("DocumentationFileRule", documentationFileRule.name);
            Assert.AreEqual <string>("BuildCop.Rules.DocumentationFile.DocumentationFileRule", documentationFileRule.type);
            Assert.AreEqual <string>(string.Empty, documentationFileRule.excludedFiles);
            Assert.AreEqual <string>(string.Empty, documentationFileRule.excludedOutputTypes);
            Assert.AreEqual <bool>(true, documentationFileRule.enabled);

            ruleElement orphanedProjectsRule = group.rules[5];

            Assert.IsNotNull(orphanedProjectsRule);
            Assert.AreEqual <string>("OrphanedProjects", orphanedProjectsRule.name);
            Assert.AreEqual <string>("BuildCop.Rules.OrphanedProjects.OrphanedProjectsRule", orphanedProjectsRule.type);
            Assert.AreEqual <string>(string.Empty, orphanedProjectsRule.excludedFiles);
            Assert.AreEqual <string>(string.Empty, orphanedProjectsRule.excludedOutputTypes);
            Assert.AreEqual <bool>(true, orphanedProjectsRule.enabled);
            Assert.IsNotNull(orphanedProjectsRule.solutions);
            Assert.AreEqual <string>("TestSearchPath", orphanedProjectsRule.solutions.searchPath);

            ruleElement sharedDocumentationFileRuleRef = group.rules[6];

            Assert.IsNotNull(sharedDocumentationFileRuleRef);
            Assert.AreEqual <string>("SharedDocumentationFileRule", sharedDocumentationFileRuleRef.name);
            Assert.AreEqual <string>(string.Empty, sharedDocumentationFileRuleRef.type);
            Assert.AreEqual <string>(string.Empty, sharedDocumentationFileRuleRef.excludedFiles);
            Assert.AreEqual <string>(string.Empty, sharedDocumentationFileRuleRef.excludedOutputTypes);
            Assert.AreEqual <bool>(true, sharedDocumentationFileRuleRef.enabled);

            Assert.IsNotNull(config.sharedRules);
            Assert.AreEqual <int>(1, config.sharedRules.Count);
            ruleElement sharedDocumentationFileRule = config.sharedRules[0];

            Assert.IsNotNull(sharedDocumentationFileRule);
            Assert.AreEqual <string>("SharedDocumentationFileRule", sharedDocumentationFileRule.name);
            Assert.AreEqual <string>("BuildCop.Rules.DocumentationFile.DocumentationFileRule", sharedDocumentationFileRule.type);
            Assert.AreEqual <string>(string.Empty, sharedDocumentationFileRule.excludedFiles);
            Assert.AreEqual <string>(string.Empty, sharedDocumentationFileRule.excludedOutputTypes);
            Assert.AreEqual <bool>(true, sharedDocumentationFileRule.enabled);

            Assert.IsNotNull(config.formatters);
            Assert.AreEqual <int>(4, config.formatters.Count);

            formatterElement consoleFormatter = config.formatters[0];

            Assert.IsNotNull(consoleFormatter);
            Assert.AreEqual <string>("Console", consoleFormatter.name);
            Assert.AreEqual <string>("BuildCop.Formatters.Console.ConsoleFormatter", consoleFormatter.type);
            Assert.AreEqual <LogLevel>(LogLevel.Warning, consoleFormatter.minimumLogLevel);

            formatterElement htmlFormatter = config.formatters[1];

            Assert.IsNotNull(htmlFormatter);
            Assert.AreEqual <string>("Html", htmlFormatter.name);
            Assert.AreEqual <string>("BuildCop.Formatters.Html.HtmlFormatter", htmlFormatter.type);
            Assert.AreEqual <LogLevel>(LogLevel.Information, htmlFormatter.minimumLogLevel);
            Assert.AreEqual <string>("out.html", htmlFormatter.output.fileName);
            Assert.AreEqual <string>(string.Empty, htmlFormatter.output.stylesheet);
            Assert.AreEqual <bool>(false, htmlFormatter.output.launch);

            formatterElement xmlFormatter = config.formatters[2];

            Assert.IsNotNull(xmlFormatter);
            Assert.AreEqual <string>("Xml", xmlFormatter.name);
            Assert.AreEqual <string>("BuildCop.Formatters.Xml.XmlFormatter", xmlFormatter.type);
            Assert.AreEqual <LogLevel>(LogLevel.Error, xmlFormatter.minimumLogLevel);
            Assert.AreEqual <string>("out.xml", xmlFormatter.output.fileName);
            Assert.AreEqual <string>("TestStylesheet.xslt", xmlFormatter.output.stylesheet);
            Assert.AreEqual <bool>(false, xmlFormatter.output.launch);

            formatterElement csvFormatter = config.formatters[3];

            Assert.IsNotNull(csvFormatter);
            Assert.AreEqual <string>("Csv", csvFormatter.name);
            Assert.AreEqual <string>("BuildCop.Formatters.Csv.CsvFormatter", csvFormatter.type);
            Assert.AreEqual <LogLevel>(LogLevel.Exception, csvFormatter.minimumLogLevel);
            Assert.AreEqual <string>("out.csv", csvFormatter.output.fileName);
            Assert.AreEqual <bool>(false, csvFormatter.output.launch);

            List <outputTypeElement> outputTypeMappings = config.outputTypeMappings;

            Assert.IsNotNull(outputTypeMappings);
            Assert.AreEqual <int>(1, outputTypeMappings.Count);
            outputTypeElement outputType = outputTypeMappings[0];

            Assert.IsNotNull(outputType);
            Assert.AreEqual <string>("Web", outputType.alias);
            Assert.AreEqual <string>("{349c5851-65df-11da-9384-00065b846f21}", outputType.projectTypeGuid);
        }