From d5266ef6f324b70007ee55383be003831d0e4d14 Mon Sep 17 00:00:00 2001 From: Matteo Taveggia Date: Mon, 13 Mar 2023 01:04:09 -0700 Subject: [PATCH] Cleaning up a few tests; fixing one (#1940) --- .../BatchParser/BatchParserTests.cs | 75 +++++++++---------- 1 file changed, 34 insertions(+), 41 deletions(-) diff --git a/test/Microsoft.SqlTools.ManagedBatchParser.IntegrationTests/BatchParser/BatchParserTests.cs b/test/Microsoft.SqlTools.ManagedBatchParser.IntegrationTests/BatchParser/BatchParserTests.cs index 0ad1053f..9a786b19 100644 --- a/test/Microsoft.SqlTools.ManagedBatchParser.IntegrationTests/BatchParser/BatchParserTests.cs +++ b/test/Microsoft.SqlTools.ManagedBatchParser.IntegrationTests/BatchParser/BatchParserTests.cs @@ -37,8 +37,13 @@ namespace Microsoft.SqlTools.ManagedBatchParser.UnitTests.BatchParser TestInitialize(); } + /// + /// Verified that the parser throws an exception when the the sqlcmd script + /// uses a variable that is not defined. The expected exception has the + /// correct ErrorCode and TokenType. + /// [Test] - public void VerifyThrowOnUnresolvedVariable() + public void VerifyVariableResolverThrowsWhenVariableIsNotDefined() { string script = "print '$(NotDefined)'"; StringBuilder output = new StringBuilder(); @@ -54,18 +59,17 @@ namespace Microsoft.SqlTools.ManagedBatchParser.UnitTests.BatchParser p.ThrowOnUnresolvedVariable = true; handler.SetParser(p); - Assert.Throws(p.Parse); + var exc = Assert.Throws(p.Parse, "Expected exception because $(NotDefined) was not defined!"); + Assert.That(exc.ErrorCode, Is.EqualTo(Microsoft.SqlTools.ServiceLayer.BatchParser.ErrorCode.VariableNotDefined), "Error code should be VariableNotDefined!"); + Assert.That(exc.TokenType, Is.EqualTo(LexerTokenType.Text), "Token"); } } - /// - /// Variable parameter in powershell: Specifies, as a string array, a sqlcmd scripting variable - /// for use in the sqlcmd script, and sets a value for the variable. - /// [Test] - public void VerifyVariableResolverUsingVaribleParameter() + public void VerifyVariableResolverThrowsWhenVariableHasInvalidName_StartsWithNumber() { - string query = @" Invoke-Sqlcmd -Query ""SELECT `$(calcOne)"" -Variable ""calcOne = 10 + 20"" "; + // instead of using variable calcOne, I purposely use variable 0alcOne + string query = @"SELECT $(0alcOne)"; TestCommandHandler handler = new TestCommandHandler(new StringBuilder()); IVariableResolver resolver = new TestVariableResolver(new StringBuilder()); @@ -77,16 +81,18 @@ namespace Microsoft.SqlTools.ManagedBatchParser.UnitTests.BatchParser { p.ThrowOnUnresolvedVariable = true; handler.SetParser(p); - Assert.Throws(p.Parse); + var exc = Assert.Throws(p.Parse, "Expected exception because $(0alcOne) was not defined!"); + Assert.That(exc.ErrorCode, Is.EqualTo(Microsoft.SqlTools.ServiceLayer.BatchParser.ErrorCode.InvalidVariableName), "Error code should be InvalidVariableName!"); + Assert.That(exc.TokenType, Is.EqualTo(LexerTokenType.Text), "Token"); + Assert.That(exc.Text, Is.EqualTo("$(0"), "Token"); } } - // Verify the starting identifier of Both parameter and variable are same. [Test] - public void VerifyVariableResolverIsStartIdentifierChar() + public void VerifyVariableResolverThrowsWhenVariableHasInvalidName_ContainesInvalidChar() { - // instead of using variable calcOne, I purposely used In-variable 0alcOne - string query = @" Invoke-Sqlcmd -Query ""SELECT `$(0alcOne)"" -Variable ""calcOne1 = 1"" "; + // instead of using variable calcOne, I purposely use variable ca@lcOne + string query = @"SELECT $(ca@lcOne)"; TestCommandHandler handler = new TestCommandHandler(new StringBuilder()); IVariableResolver resolver = new TestVariableResolver(new StringBuilder()); @@ -98,37 +104,21 @@ namespace Microsoft.SqlTools.ManagedBatchParser.UnitTests.BatchParser { p.ThrowOnUnresolvedVariable = true; handler.SetParser(p); - Assert.Throws(p.Parse); + + var exc = Assert.Throws(p.Parse, "Expected exception because $(ca@lcOne) was not defined!"); + Assert.That(exc.ErrorCode, Is.EqualTo(Microsoft.SqlTools.ServiceLayer.BatchParser.ErrorCode.InvalidVariableName), "Error code should be InvalidVariableName!"); + Assert.That(exc.TokenType, Is.EqualTo(LexerTokenType.Text), "Token"); + Assert.That(exc.Text, Is.EqualTo("$(ca@"), "Token"); } } - // Verify all the characters inside variable are valid Identifier. + // A GO followed by a number that is greater than 2147483647 cause the parser to + // throw an exception. [Test] - public void VerifyVariableResolverIsIdentifierChar() + public void VerifyInvalidNumberExceptionThrownWhenParsingGoExceedsMaxInt32() { - // instead of using variable calcOne, I purposely used In-variable 0alcOne - string query = @" Invoke-Sqlcmd -Query ""SELECT `$(ca@lcOne)"" -Variable ""calcOne = 1"" "; - - TestCommandHandler handler = new TestCommandHandler(new StringBuilder()); - IVariableResolver resolver = new TestVariableResolver(new StringBuilder()); - using (Parser p = new Parser( - handler, - resolver, - new StringReader(query), - "test")) - { - p.ThrowOnUnresolvedVariable = true; - handler.SetParser(p); - Assert.Throws(p.Parse); - } - } - - // Verify the execution by passing long value , Except a exception. - [Test] - public void VerifyInvalidNumber() - { - string query = @" SELECT 1+1 - GO 999999999999999999999999999999999999999"; + string query = $@"SELECT 1+1 + GO {1L + int.MaxValue}"; TestCommandHandler handler = new TestCommandHandler(new StringBuilder()); IVariableResolver resolver = new TestVariableResolver(new StringBuilder()); @@ -142,7 +132,10 @@ namespace Microsoft.SqlTools.ManagedBatchParser.UnitTests.BatchParser handler.SetParser(p); // This test will fail because we are passing invalid number. // Exception will be raised from ParseGo() - Assert.Throws(p.Parse); + var exc = Assert.Throws(p.Parse, $"Expected exception because GO is followed by a invalid number (>{int.MaxValue})"); + Assert.That(exc.ErrorCode, Is.EqualTo(Microsoft.SqlTools.ServiceLayer.BatchParser.ErrorCode.InvalidNumber), "Error code should be InvalidNumber!"); + Assert.That(exc.TokenType, Is.EqualTo(LexerTokenType.Text), "Token"); + Assert.That(exc.Text, Is.EqualTo("2147483648"), "Token"); } } @@ -372,7 +365,7 @@ GO"; string password = liveConnection.ConnectionInfo.ConnectionDetails.Password; var credentials = string.IsNullOrEmpty(userName) ? string.Empty : $"-U {userName} -P {password}"; string sqlCmdQuery = $@" -:Connect {serverName}{credentials} +:Connect {serverName} {credentials} GO select * from sys.databases where name = 'master' GO";