public static void RunRulesTest(string rule, string testFileName, Type ruleType, List <RuleViolation> expectedRuleViolations) { // arrange var path = Path.GetFullPath(Path.Combine(TestContext.CurrentContext.TestDirectory, $@"UnitTests/LintingRules/{rule}/test-files/{testFileName}.sql")); var fileStream = File.OpenRead(path); var ruleViolations = new List <RuleViolation>(); void ErrorCallback(string ruleName, string ruleText, int startLine, int startColumn) { ruleViolations.Add(new RuleViolation(ruleName, startLine, startColumn)); } var visitor = GetVisitor(ruleType, ErrorCallback); var compareer = new RuleViolationComparer(); var fragmentBuilder = new FragmentBuilder(120); var textReader = new StreamReader(fileStream); var sqlFragment = fragmentBuilder.GetFragment(textReader, out _); // act sqlFragment.Accept(visitor); ruleViolations = ruleViolations.OrderBy(o => o.Line).ToList(); expectedRuleViolations = expectedRuleViolations.OrderBy(o => o.Line).ToList(); // assert CollectionAssert.AreEqual(expectedRuleViolations, ruleViolations, compareer); Assert.AreEqual(expectedRuleViolations.Count, ruleViolations.Count); }
public static void RunDynamicSQLRulesTest(Type ruleType, string sql, List <RuleViolation> expectedRuleViolations) { // arrange var ruleViolations = new List <RuleViolation>(); var mockReporter = Substitute.For <IReporter>(); var mockPath = string.Empty; var compareer = new RuleViolationComparer(); var fragmentBuilder = new FragmentBuilder(); var sqlStream = ParsingUtility.GenerateStreamFromString(sql); void ErrorCallback(string ruleName, string ruleText, int startLine, int startColumn) { ruleViolations.Add(new RuleViolation(ruleName, startLine, startColumn)); } var visitors = new List <TSqlFragmentVisitor> { GetVisitor(ruleType, ErrorCallback) }; var mockRuleVisitorBuilder = Substitute.For <IRuleVisitorBuilder>(); mockRuleVisitorBuilder.BuildVisitors(Arg.Any <string>(), Arg.Any <IEnumerable <IRuleException> >()).Returns(visitors); var sqlRuleVisitor = new SqlRuleVisitor(mockRuleVisitorBuilder, fragmentBuilder, mockReporter); // act sqlRuleVisitor.VisitRules(mockPath, new List <IRuleException>(), sqlStream); ruleViolations = ruleViolations.OrderBy(o => o.Line).ThenBy(o => o.Column).ToList(); expectedRuleViolations = expectedRuleViolations.OrderBy(o => o.Line).ThenBy(o => o.Column).ToList(); // assert CollectionAssert.AreEqual(expectedRuleViolations, ruleViolations, compareer); }
public void Run() { configReader.LoadConfig(commandLineOptions.ConfigFile); var fragmentBuilder = new FragmentBuilder(configReader.CompatabilityLevel); var ruleVisitorBuilder = new RuleVisitorBuilder(configReader, this.reporter); var ruleVisitor = new SqlRuleVisitor(ruleVisitorBuilder, fragmentBuilder, reporter); pluginHandler = new PluginHandler(reporter); fileProcessor = new SqlFileProcessor(ruleVisitor, pluginHandler, reporter, new FileSystem()); pluginHandler.ProcessPaths(configReader.GetPlugins()); var response = commandLineOptionHandler.Handle(new CommandLineRequestMessage(commandLineOptions)); if (response.ShouldLint) { fileProcessor.ProcessList(commandLineOptions.LintPath); } if (fileProcessor.FileCount > 0) { reporter.ReportResults(timer.Stop(), fileProcessor.FileCount); } if (!response.Success) { Environment.ExitCode = 1; } }
public void VisitRules_InvalidSql_ShouldStillLint() { // arrange var mockReporter = Substitute.For <IReporter>(); var fragmentBuilder = new FragmentBuilder(120); var ruleViolations = new List <RuleViolation>(); void ErrorCallback(string ruleName, string ruleText, int startLine, int startColumn) { ruleViolations.Add(new RuleViolation(ruleName, startLine, startColumn)); } var visitors = new List <TSqlFragmentVisitor> { new KeywordCapitalizationRule(ErrorCallback) }; var mockRuleVisitorBuilder = Substitute.For <IRuleVisitorBuilder>(); mockRuleVisitorBuilder.BuildVisitors(Arg.Any <string>(), Arg.Any <List <IRuleException> >()).Returns(visitors); var sqlStream = ParsingUtility.GenerateStreamFromString("select"); var sqlRuleVisitor = new SqlRuleVisitor(mockRuleVisitorBuilder, fragmentBuilder, mockReporter); // act sqlRuleVisitor.VisitRules(Path, new List <IRuleException>(), sqlStream); // assert Assert.AreEqual(1, ruleViolations.Count); }
public Nfa(AstNode program) { cache = new Dictionary <List <NfaState>, DfaState>(new ListCmp()); var nfaFragment = new FragmentBuilder().Build(program); foreach (var end in nfaFragment.Outs) { end.Add(matchState); } this.start = GetDfaState(StartList(nfaFragment.Start, l1)); }
public void Test(string description, string sql, int expectedOverrideCount) { var fragmentBuilder = new FragmentBuilder(Constants.DefaultCompatabilityLevel); var overrideFider = new OverrideFinder(); var sqlStream = ParsingUtility.GenerateStreamFromString(sql); var overrides = overrideFider.GetOverrideList(sqlStream); var fragment = fragmentBuilder.GetFragment(new StreamReader(sqlStream), out var errors, overrides); Assert.AreEqual(expectedOverrideCount, overrides.Count()); Assert.IsEmpty(errors); Assert.IsNotNull(fragment); }
public void VisitRules_InvalidSql_ShouldReportError() { // arrange var mockReporter = Substitute.For <IReporter>(); var fragmentBuilder = new FragmentBuilder(); var mockRuleVisitorBuilder = Substitute.For <IRuleVisitorBuilder>(); var sqlStream = ParsingUtility.GenerateStreamFromString("SELECT"); var sqlRuleVisitor = new SqlRuleVisitor(mockRuleVisitorBuilder, fragmentBuilder, mockReporter); // act sqlRuleVisitor.VisitRules(Path, sqlStream); // assert mockReporter.Received().ReportViolation(Arg.Is <RuleViolation>(x => x.FileName == Path && x.Text == "TSQL not syntactically correct")); }
public Application(string[] args, IReporter reporter) { timer = new ConsoleTimer(); timer.Start(); this.reporter = reporter; commandLineOptions = new CommandLineOptions.CommandLineOptions(args); configReader = new ConfigReader(reporter); commandLineOptionHandler = new CommandLineOptionHandler(commandLineOptions, new ConfigFileGenerator(), configReader, reporter); var fragmentBuilder = new FragmentBuilder(); var ruleVisitorBuilder = new RuleVisitorBuilder(configReader, this.reporter); IRuleVisitor ruleVisitor = new SqlRuleVisitor(ruleVisitorBuilder, fragmentBuilder, reporter); pluginHandler = new PluginHandler(reporter); fileProcessor = new SqlFileProcessor(ruleVisitor, pluginHandler, reporter, new FileSystem()); }
public void ShouldIgnore(string description, string testString) { var stream = ParsingUtility.GenerateStreamFromString(testString); void DynamicCallback(string dynamicSQL, int dynamicStartLine, int dynamicStartColumn) { Assert.Fail("should not perform callback"); } var visitor = new DynamicSQLParser(DynamicCallback); var fragmentBuilder = new FragmentBuilder(); var textReader = new StreamReader(stream); var sqlFragment = fragmentBuilder.GetFragment(textReader, out var errors); sqlFragment.Accept(visitor); CollectionAssert.IsEmpty(errors, "parsing errors were generated"); }
public void Run() { configReader.LoadConfig(commandLineOptions.ConfigFile); var fragmentBuilder = new FragmentBuilder(configReader.CompatabilityLevel); var ruleVisitorBuilder = new RuleVisitorBuilder(configReader, this.reporter); IRuleVisitor ruleVisitor = new SqlRuleVisitor(ruleVisitorBuilder, fragmentBuilder, reporter); pluginHandler = new PluginHandler(reporter); fileProcessor = new SqlFileProcessor(ruleVisitor, pluginHandler, reporter, new FileSystem()); pluginHandler.ProcessPaths(configReader.GetPlugins()); commandLineOptionHandler.HandleCommandLineOptions(commandLineOptions); fileProcessor.ProcessList(commandLineOptions.LintPath); if (fileProcessor.FileCount > 0) { reporter.ReportResults(timer.Stop(), fileProcessor.FileCount); } }
public void ShouldParse(string description, string executeStatement, string innerSql, bool expectCallback = true) { var stream = ParsingUtility.GenerateStreamFromString(executeStatement); var receivedCallback = false; void DynamicCallback(string dynamicSQL, int dynamicStartLine, int dynamicStartColumn) { Assert.AreEqual(innerSql, dynamicSQL); receivedCallback = true; } var visitor = new DynamicSQLParser(DynamicCallback); var fragmentBuilder = new FragmentBuilder(); var textReader = new StreamReader(stream); var sqlFragment = fragmentBuilder.GetFragment(textReader, out var errors); CollectionAssert.IsEmpty(errors, "parsing errors were generated"); sqlFragment.Accept(visitor); Assert.AreEqual(receivedCallback, expectCallback); }