public void ShouldParseHasPropertyDefinitionMultipleTimes()
        {
            //GIVEN
            var propertyName  = Any.String();
            var depending     = Any.String();
            var propertyValue = Any.String();

            //WHEN
            var ruleUnionDtos = ParserRulePreface.Then(ParseProjectScopedRule.Complement).Many().Parse(
                $"{depending} {HasPropertyRuleMetadata.HasProperty} {propertyName}:{propertyValue}{Environment.NewLine}" +
                $"{depending} {HasPropertyRuleMetadata.HasProperty} {propertyName}:{propertyValue}{Environment.NewLine}"
                ).WhereValueExist().ToList();

            //THEN
            ruleUnionDtos.Count.Should().Be(2);
            var rule1Dto = ruleUnionDtos.First();

            rule1Dto.Accept(new HasPropertyAssertion(dto =>
            {
                dto.RuleName.Should().Be(HasPropertyRuleMetadata.HasProperty);
                dto.ProjectAssemblyNamePattern.Text().Should().Be(depending);
                dto.PropertyName.Should().Be(propertyName);
                dto.PropertyValue.Should().Be(Pattern.WithoutExclusion(propertyValue));
            }));
            rule1Dto.RuleName.Should().Be(HasPropertyRuleMetadata.HasProperty);
        }
        public void ShouldParseHasAttributesOnRuleDefinitionMultipleTimes()
        {
            //GIVEN
            var depending     = Any.String();
            var classPattern  = Any.String();
            var methodPattern = Any.String();

            //WHEN
            var ruleUnionDtos = ParserRulePreface.Then(ParseProjectScopedRule.Complement).Many().Parse(
                $"{depending} {HasAttributesOnRuleMetadata.HasAttributesOn} {classPattern}:{methodPattern}{Environment.NewLine}" +
                $"{depending} {HasAttributesOnRuleMetadata.HasAttributesOn} {classPattern}:{methodPattern}{Environment.NewLine}"
                ).WhereValueExist().ToList();

            //THEN
            ruleUnionDtos.Count.Should().Be(2);
            var rule1Dto = ruleUnionDtos.First();

            rule1Dto.Accept(new HasAttributesOnRuleComplementAssertion(dto =>
            {
                dto.RuleName.Should().Be(HasAttributesOnRuleMetadata.HasAttributesOn);
                dto.ClassNameInclusionPattern.Text().Should().Be(classPattern);
                dto.MethodNameInclusionPattern.Text().Should().Be(methodPattern);
                dto.ProjectAssemblyNamePattern.Text().Should().Be(depending);
            }));
            rule1Dto.RuleName.Should().Be(HasAttributesOnRuleMetadata.HasAttributesOn);
        }
        public void ShouldParseNoCircularUsingsRuleDefinition()
        {
            //GIVEN
            var depending = Any.String();

            //WHEN
            var ruleUnionDto = ParserRulePreface.Then(ParseNamespaceBasedRule.Complement)
                               .Parse($"{depending} {HasNoCircularUsingsRuleMetadata.HasNoCircularUsings}").Value;

            //THEN
            ruleUnionDto.Accept(new NoCircularUsingsRuleComplementDtoAssertion(dto =>
            {
                dto.RuleName.Should().Be(HasNoCircularUsingsRuleMetadata.HasNoCircularUsings);
                dto.ProjectAssemblyNamePattern.Should().Be(Pattern.WithoutExclusion(depending));
            }));
            ruleUnionDto.RuleName.Should().Be(HasNoCircularUsingsRuleMetadata.HasNoCircularUsings);
        }
        public void ShouldParseDefaultRuleSyntaxWithMoreThanOneSpace()
        {
            //GIVEN
            var depending      = Any.String();
            var dependencyType = Any.String();
            var dependency     = Any.String();

            //WHEN
            var ruleUnionDto = ParserRulePreface.Then(ParseDependencyPathBasedRule.Complement)
                               .Parse($"{depending}  {IndependentRuleMetadata.IndependentOf}  {dependencyType}:{dependency}{Environment.NewLine}").Value;

            //THEN
            ruleUnionDto.Accept(new IndependentRuleComplementDtoAssertion(independentRule =>
            {
                independentRule.DependingPattern.Should().Be(Pattern.WithoutExclusion(depending));
                independentRule.DependencyType.Should().Be(dependencyType);
                independentRule.DependencyPattern.Pattern.Should().Be(dependency);
                independentRule.RuleName.Should().Be(IndependentRuleMetadata.IndependentOf);
            }));
            ruleUnionDto.RuleName.Should().Be(IndependentRuleMetadata.IndependentOf);
        }
        public void ShouldParseNoUsingsRuleDefinition()
        {
            //GIVEN
            var depending = Any.String();

            //WHEN
            var from         = Any.String();
            var to           = Any.String();
            var ruleUnionDto = ParserRulePreface.Then(ParseNamespaceBasedRule.Complement)
                               .Parse(TestRuleFormats.FormatNoUsingsRule(depending, from, to)).Value;

            //THEN
            ruleUnionDto.Accept(new NoUsingsRuleComplementDtoAssertion(dto =>
            {
                dto.RuleName.Should().Be(HasNoUsingsRuleMetadata.HasNoUsings);
                dto.ProjectAssemblyNamePattern.Should().Be(Pattern.WithoutExclusion(depending));
                dto.FromPattern.Should().Be(Pattern.WithoutExclusion(from));
                dto.ToPattern.Should().Be(Pattern.WithoutExclusion(to));
            }));
            ruleUnionDto.RuleName.Should().Be(HasNoUsingsRuleMetadata.HasNoUsings);
        }
        public void ShouldParseNoCircularUsingsRuleDefinitionMultipleTimes()
        {
            //GIVEN
            var depending = Any.String();

            //WHEN
            var ruleUnionDtos = ParserRulePreface.Then(ParseNamespaceBasedRule.Complement).Many().Parse(
                $"{depending} {HasNoCircularUsingsRuleMetadata.HasNoCircularUsings}{Environment.NewLine}" +
                $"{depending} {HasNoCircularUsingsRuleMetadata.HasNoCircularUsings}{Environment.NewLine}"
                ).WhereValueExist().ToList();

            //THEN
            ruleUnionDtos.Count.Should().Be(2);
            var ruleUnionDto = ruleUnionDtos.First();

            ruleUnionDto.Accept(new NoCircularUsingsRuleComplementDtoAssertion(dto =>
            {
                dto.RuleName.Should().Be(HasNoCircularUsingsRuleMetadata.HasNoCircularUsings);
                dto.ProjectAssemblyNamePattern.Should().Be(Pattern.WithoutExclusion(depending));
            }));
            ruleUnionDto.RuleName.Should().Be(HasNoCircularUsingsRuleMetadata.HasNoCircularUsings);
        }
        /// <summary>
        /// Entry point
        /// </summary>
        /// <param name="inputArguments">arguments</param>
        /// <param name="output">output for report</param>
        /// <param name="support">logging stuff</param>
        /// <returns></returns>
        public static int Run(
            InputArgumentsDto inputArguments,
            INScanOutput output,
            INScanSupport support)
        {
            try
            {
                //SpinWait.SpinUntil(() => Debugger.IsAttached);

                output.WriteVersion(Versioning.VersionOf(Assembly.GetExecutingAssembly()));

                var csharpProjectDtos = ReadCsharpProjects(inputArguments, support);
                var analysis          = Analysis.PrepareFor(csharpProjectDtos, support);

                var rulesString = ReadRulesTextFrom(inputArguments);

                var dependencyPathDtos = ParserRulePreface.Then(ParseDependencyPathBasedRule.Complement).Many().Parse(rulesString).WhereValueExist();
                LogDependencyPathRules(dependencyPathDtos, support);
                analysis.AddDependencyPathRules(dependencyPathDtos);

                var projectScopedDtos = ParserRulePreface.Then(ParseProjectScopedRule.Complement).Many().Parse(rulesString).WhereValueExist();
                analysis.AddProjectScopedRules(projectScopedDtos);
                LogProjectScopedRules(projectScopedDtos, support);

                var namespaceBasedDtos = ParserRulePreface.Then(ParseNamespaceBasedRule.Complement).Many().Parse(rulesString).WhereValueExist();
                LogNamespaceBasedRules(namespaceBasedDtos, support);
                analysis.AddNamespaceBasedRules(namespaceBasedDtos);

                analysis.Run();
                output.WriteAnalysisReport(analysis.Report);
                return(analysis.ReturnCode);
            }
            catch (Exception e)
            {
                support.Report(e);
                return(-2);
            }
        }
        public void ShouldParseHasTargetFrameworkDefinitionMultipleTimes()
        {
            //GIVEN
            var depending     = Any.String();
            var frameworkName = Any.String();

            //WHEN
            var ruleUnionDtos = ParserRulePreface.Then(ParseProjectScopedRule.Complement).Many().Parse(
                $"{depending} {HasTargetFrameworkRuleMetadata.HasTargetFramework} {frameworkName}{Environment.NewLine}" +
                $"{depending} {HasTargetFrameworkRuleMetadata.HasTargetFramework} {frameworkName}{Environment.NewLine}"
                ).WhereValueExist().ToList();

            //THEN
            ruleUnionDtos.Count.Should().Be(2);
            var rule1Dto = ruleUnionDtos.First();

            rule1Dto.Accept(new HasTargetFrameworkAssertion(dto =>
            {
                dto.RuleName.Should().Be(HasTargetFrameworkRuleMetadata.HasTargetFramework);
                dto.ProjectAssemblyNamePattern.Text().Should().Be(depending);
                dto.TargetFramework.Should().Be(frameworkName);
            }));
            rule1Dto.RuleName.Should().Be(HasTargetFrameworkRuleMetadata.HasTargetFramework);
        }