private bool IsFullyBoundProject(ISolutionRuleSetsInformationProvider ruleSetInfoProvider, IRuleSetSerializer ruleSetSerializer,
                                         BindingConfiguration binding, Project project, Core.Language language)
        {
            Debug.Assert(binding != null);
            Debug.Assert(project != null);

            // If solution is not bound/is missing a rules configuration file, no need to go further
            var slnLevelBindingConfigFilepath = CalculateSonarQubeSolutionBindingConfigPath(ruleSetInfoProvider, binding, language);

            if (!fileSystem.File.Exists(slnLevelBindingConfigFilepath))
            {
                return(false);
            }

            if (!BindingRefactoringDumpingGround.IsProjectLevelBindingRequired(project))
            {
                return(true); // nothing else to check
            }

            // Projects that required project-level binding should be using RuleSets for configuration,
            // so we assume that the solution-level config file is a ruleset.
            RuleSet sonarQubeRuleSet = ruleSetSerializer.LoadRuleSet(slnLevelBindingConfigFilepath);

            if (sonarQubeRuleSet == null)
            {
                return(false);
            }

            RuleSetDeclaration[] declarations = ruleSetInfoProvider.GetProjectRuleSetsDeclarations(project).ToArray();
            return(declarations.Length > 0 && // Need at least one
                   declarations.All(declaration => this.IsRuleSetBound(ruleSetSerializer, project, declaration, sonarQubeRuleSet)));
        }
        public void BindingUtilities_IsProjectLevelBindingRequired()
        {
            // 1. C# -> binding is required
            var csProject = new ProjectMock("c:\\foo.proj");

            csProject.SetCSProjectKind();

            BindingRefactoringDumpingGround.IsProjectLevelBindingRequired(csProject).Should().BeTrue();

            // 2. VB.NET -> binding is required
            var vbProject = new ProjectMock("c:\\foo.proj");

            vbProject.SetVBProjectKind();

            BindingRefactoringDumpingGround.IsProjectLevelBindingRequired(vbProject).Should().BeTrue();

            // 3. Cpp -> binding is required
            var cppProject = new ProjectMock("c:\\foo.proj");

            cppProject.ProjectKind = ProjectSystemHelper.CppProjectKind;

            BindingRefactoringDumpingGround.IsProjectLevelBindingRequired(cppProject).Should().BeFalse();

            // 4. Other -> binding is not required
            var otherProject = new ProjectMock("c:\\foo.proj");

            otherProject.ProjectKind = "{" + Guid.NewGuid().ToString() + "}";

            BindingRefactoringDumpingGround.IsProjectLevelBindingRequired(otherProject).Should().BeFalse();
        }
        // ISSUE : this method is doing too many things
        private RuleSetInformation[] CheckSlnLevelConfigExistsAndReturnAllProjectRuleSetsForAllConfigurations(
            BoundSonarQubeProject bindingInfo)
        {
            var projectSystem = this.serviceProvider.GetService <IProjectSystemHelper>();

            projectSystem.AssertLocalServiceIsNotNull();

            var ruleSetInfoProvider = this.serviceProvider.GetService <ISolutionRuleSetsInformationProvider>();

            ruleSetInfoProvider.AssertLocalServiceIsNotNull();

            var fileSystem = this.serviceProvider.GetService <IFileSystem>();

            fileSystem.AssertLocalServiceIsNotNull();

            var projectRuleSetAggregation = new Dictionary <string, RuleSetInformation>(StringComparer.OrdinalIgnoreCase);

            foreach (Project project in projectSystem.GetFilteredSolutionProjects())
            {
                // Solution-level checks (done here because the expected solution-level config
                // depends on the languages supported by the project that exist)
                string baselineRuleSet = ruleSetInfoProvider.CalculateSolutionSonarQubeRuleSetFilePath(
                    bindingInfo.ProjectKey,
                    ProjectToLanguageMapper.GetLanguageForProject(project),
                    SonarLintMode.LegacyConnected);

                if (!fileSystem.FileExist(baselineRuleSet))
                {
                    this.WriteWarning(Strings.ExpectedRuleSetNotFound, baselineRuleSet, project.FullName);
                    continue;
                }

                if (!BindingRefactoringDumpingGround.IsProjectLevelBindingRequired(project))
                {
                    continue;
                }

                foreach (RuleSetDeclaration declaration in ruleSetInfoProvider.GetProjectRuleSetsDeclarations(project))
                {
                    string projectRuleSet = CalculateProjectRuleSetFullPath(ruleSetInfoProvider, project, declaration);

                    this.AddOrUpdateAggregatedRuleSetInformation(projectRuleSetAggregation, baselineRuleSet, declaration, projectRuleSet);
                }
            }

            return(projectRuleSetAggregation.Values.ToArray());
        }