コード例 #1
0
            public void ShouldExtractForLoops() // for loops have ';'
            {
                const string Code = "for(var i = 0; i < 3; i++) { Foo(); }";

                var parser = new RegionParser();
                var result = parser.Parse(Code);

                result.Count().ShouldEqual(1);
                var region = result[0];

                Code.Substring(region.Offset, region.Length).ShouldEqual(Code);
            }
コード例 #2
0
            public void ShouldExtractExpressionsInParantheses()
            {
                const string Code = "(10 + 5 * ( 4 - 8) )";

                var parser = new RegionParser();
                var result = parser.Parse(Code);

                result.Count().ShouldEqual(1);
                var region = result[0];

                Code.Substring(region.Offset, region.Length).ShouldEqual(Code);
            }
コード例 #3
0
            public void ShouldExtractVariableStatements()
            {
                const string Code = "var x = 10;";

                var parser = new RegionParser();
                var result = parser.Parse(Code);

                result.Count().ShouldEqual(1);
                var region = result[0];

                Code.Substring(region.Offset, region.Length).ShouldEqual(Code);
            }
コード例 #4
0
            public void ShouldExtractBlockCodeThatBeginsWithLeftCurlyBrackets()
            {
                const string Code = "{ Foo(); ) }";

                var parser = new RegionParser();
                var result = parser.Parse(Code);

                result.Count().ShouldEqual(1);
                var region = result[0];

                Code.Substring(region.Offset, region.Length).ShouldEqual(Code);
            }
コード例 #5
0
            public void ShouldExtractBlock()
            {
                const string Code = "if (true) { some code; }";

                var parser = new RegionParser();
                var result = parser.Parse(Code);

                result.Count().ShouldEqual(1);
                var region = result[0];

                Code.Substring(region.Offset, region.Length).ShouldEqual(Code);
            }
コード例 #6
0
        public void TestFile()
        {
            const string FilePath = @"D:\Work\BOA.Kernel\Dev\BOA.Kernel.CardGeneral\DebitCard\BOA.Engine.DebitCard\Utility\Validation.cs";

            var data = new RegionParserTestData
            {
                SourceText = File.ReadAllText(FilePath)
            };

            RegionParser.Parse(data);

            Assert.IsTrue(data.Regions.Count > 0);
        }
コード例 #7
0
            public void ShouldExtractDoWhileAsSingleBlock()
            {
                const string Code = "do { }   while (true);";

                var parser = new RegionParser();
                var result = parser.Parse(Code);

                result.Count().ShouldEqual(1);

                var region = result[0];

                Code.Substring(region.Offset, region.Length).ShouldEqual(Code);
            }
コード例 #8
0
            public void ShouldExtractComplexVariableStatement()
            {
                const string Code = "var version = File.ReadAllText(\"src/CommonAssemblyInfo.cs\").Split(new[] { \"AssemblyInformationalVersion(\\\"\" }, 2, StringSplitOptions.None).ElementAt(1).Split(new[] { '\"' }).First();";

                var parser = new RegionParser();
                var result = parser.Parse(Code);

                result.Count().ShouldEqual(1);

                var region = result[0];

                Code.Substring(region.Offset, region.Length).ShouldEqual(Code);
            }
コード例 #9
0
            public void ShouldExtractMultipleIfElseAsSingleBlock()
            {
                const string Code = "if { } else if { } else if { } else { }";

                var parser = new RegionParser();
                var result = parser.Parse(Code);

                result.Count().ShouldEqual(1);

                var region = result[0];

                Code.Substring(region.Offset, region.Length).ShouldEqual(Code);
            }
コード例 #10
0
        public void TestLargeFile()
        {
            const string FilePath = @"D:\Work\BOA.BusinessModules\Dev\BOA.CardGeneral.DebitCard\BOA.Orchestration.CardGeneral.DebitCard\CardTransactionListForm.cs";

            var data = new RegionParserTestData
            {
                SourceText = File.ReadAllText(FilePath)
            };

            RegionParser.Parse(data);

            Assert.IsTrue(data.Regions.Count > 0);

            Log.Push(new ArgumentException("xxx"));
        }
コード例 #11
0
            public void ShouldExtractComplexMethods()
            {
                const string Code = "var bau = Require<Bau>();\n\nbau\n.Task(\"default\").DependsOn(string.IsNullOrWhiteSpace(ci) ? new[] { \"unit\", \"component\", \"pack\" } : new[] { \"unit\", \"component\", \"accept\", \"pack\" });\n";

                var parser = new RegionParser();
                var result = parser.Parse(Code);

                result.Count().ShouldEqual(2);

                var region = result[0];

                Code.Substring(region.Offset, region.Length).ShouldEqual("var bau = Require<Bau>();");

                region = result[1];
                Code.Substring(region.Offset, region.Length).ShouldEqual("bau\n.Task(\"default\").DependsOn(string.IsNullOrWhiteSpace(ci) ? new[] { \"unit\", \"component\", \"pack\" } : new[] { \"unit\", \"component\", \"accept\", \"pack\" });");
            }
コード例 #12
0
            public void ShouldExtractInvalidDoWhileAsTwoBlocks()
            {
                const string Code = "do { }   if (true);";

                var parser = new RegionParser();
                var result = parser.Parse(Code);

                result.Count().ShouldEqual(2);

                var region = result[0];

                Code.Substring(region.Offset, region.Length).ShouldEqual("do { }");

                region = result[1];
                Code.Substring(region.Offset, region.Length).ShouldEqual("if (true);");
            }
コード例 #13
0
            public void ShouldExtractMultipleBlocks()
            {
                const string Code = "using(var s = File.Open(\"test.cs\")){ } public Foo(int x) { return x }";

                var parser = new RegionParser();
                var result = parser.Parse(Code);

                result.Count().ShouldEqual(2);

                var region = result[0];

                Code.Substring(region.Offset, region.Length).ShouldEqual("using(var s = File.Open(\"test.cs\")){ }");

                region = result[1];
                Code.Substring(region.Offset, region.Length).ShouldEqual("public Foo(int x) { return x }");
            }
コード例 #14
0
            public void ShouldExtractMultipleStatements()
            {
                const string Code = "var x = 123;Action a = () => x++;Console.WriteLine(x);";

                var parser = new RegionParser();
                var result = parser.Parse(Code);

                result.Count().ShouldEqual(3);
                var region = result[0];

                Code.Substring(region.Offset, region.Length).ShouldEqual("var x = 123;");

                region = result[1];
                Code.Substring(region.Offset, region.Length).ShouldEqual("Action a = () => x++;");

                region = result[2];
                Code.Substring(region.Offset, region.Length).ShouldEqual("Console.WriteLine(x);");
            }
コード例 #15
0
        public void SimpleCall()
        {
            const string sourceText = @"
            
            var checkResponse =   boCardStatusChecker.CheckCardStatus(data);
            if (!checkResponse.Success)
            {
                returnObject.Results.AddRange(checkResponse.Results);
                return returnObject;
            }

";
            var          data       = new RegionParserTestData
            {
                SourceText = sourceText
            };

            RegionParser.Parse(data);

            Assert.AreEqual("boCardStatusChecker.CheckCardStatus(data);", data.Regions?[0]?.Text);
        }
コード例 #16
0
        public void SimpleCallWithKnownMethod()
        {
            const string sourceText = @"
            
            var checkResponse =   boCardStatusChecker.CheckCardStatus(data);
            if (!checkResponse.Success)
            {
                returnObject.Results.AddRange(checkResponse.Results);
                return returnObject;
            }
            var x = checkResponse.Value.GetValueOrDefault();

";
            var          data       = new RegionParserTestData
            {
                SourceText = sourceText
            };

            RegionParser.Parse(data);

            Assert.AreEqual("var x = boCardStatusChecker.CheckCardStatus(data).GetValueOrDefault();", data.Regions?[0]?.Text);
        }
コード例 #17
0
        public List <SegmentResult> Segment(string code)
        {
            const string ScriptPattern = @"#line 1.*?\n";
            var          isScriptFile  = Regex.IsMatch(code, ScriptPattern);

            if (isScriptFile)
            {
                // Remove debug line
                code = Regex.Replace(code, ScriptPattern, "");
            }

            var analyser = new CodeAnalyzer();
            var result   = new List <SegmentResult>();

            using (var parser = new RegionParser())
            {
                foreach (var region in parser.Parse(code))
                {
                    // Calculate region linenumber
                    var lineNr = code.Substring(0, region.Offset).Count(x => x.Equals('\n'));

                    var segment = code.Substring(region.Offset, region.Length);

                    if (analyser.IsClass(segment))
                    {
                        result.Add(new SegmentResult
                        {
                            Type      = SegmentType.Class,
                            BeginLine = lineNr,
                            Code      = segment
                        });
                    }
                    else
                    {
                        var isMethod = analyser.IsMethod(segment);

                        if (isMethod)
                        {
                            // method ok
                            var method = analyser.ExtractPrototypeAndMethod(segment);

                            result.Add(new SegmentResult
                            {
                                Type      = SegmentType.Prototype,
                                BeginLine = lineNr,
                                Code      = method.ProtoType
                            });

                            result.Add(new SegmentResult
                            {
                                Type      = SegmentType.Method,
                                BeginLine = lineNr,
                                Code      = method.MethodExpression
                            });
                        }
                        else
                        {
                            result.Add(new SegmentResult
                            {
                                Type      = SegmentType.Evaluation,
                                BeginLine = lineNr,
                                Code      = segment
                            });
                        }
                    }
                }
            }

            return(result
                   .OrderBy(x => x.Type)
                   .ToList());
        }