Skip to content

Commit

Permalink
1. Implementation for single line comment support (#95)
Browse files Browse the repository at this point in the history
* 1. Implementation for single line comment support
---------

Co-authored-by: github-actions <[email protected]>
  • Loading branch information
Puchaczov and github-actions authored Jan 18, 2025
1 parent 0256d44 commit 6220d73
Show file tree
Hide file tree
Showing 8 changed files with 255 additions and 32 deletions.
4 changes: 2 additions & 2 deletions Musoq.Parser.Tests/EscapeHelpersTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -148,15 +148,15 @@ public void Unescape_LargeString_ComplexEscapes()

// Act
var sw = System.Diagnostics.Stopwatch.StartNew();
string result = input.ToString().Unescape();
var result = input.ToString().Unescape();
sw.Stop();

// Assert
Assert.IsTrue(result.Length > 0);
Assert.IsTrue(result.Contains("\n"));
Assert.IsTrue(result.Contains("\\text"));
Assert.IsTrue(result.Contains("\t"));
Assert.IsTrue(sw.ElapsedMilliseconds < 100,
Assert.IsTrue(sw.ElapsedMilliseconds < 200,
$"Processing took too long: {sw.ElapsedMilliseconds}ms");
}

Expand Down
231 changes: 216 additions & 15 deletions Musoq.Parser.Tests/ParserTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,15 @@ public class ParserTests
[TestMethod]
public void CheckReorderedQueryWithJoin_ShouldConstructQuery()
{
var query = "from #some.a() s1 inner join #some.b() s2 on s1.col = s2.col where s1.col2 = '1' group by s2.col3 select s1.col4, s2.col4 skip 1 take 1";
var query =
"from #some.a() s1 inner join #some.b() s2 on s1.col = s2.col where s1.col2 = '1' group by s2.col3 select s1.col4, s2.col4 skip 1 take 1";

var lexer = new Lexer(query, true);
var parser = new Parser(lexer);

parser.ComposeAll();
}

[TestMethod]
public void CouplingSyntax_ComposeSchemaMethodWithKeywordAsMethod_ShouldParse()
{
Expand All @@ -28,7 +29,7 @@ public void CouplingSyntax_ComposeSchemaMethodWithKeywordAsMethod_ShouldParse()

parser.ComposeAll();
}

[TestMethod]
public void CouplingSyntax_ComposeSchemaMethodWithWordAsMethod_ShouldParse()
{
Expand All @@ -39,7 +40,7 @@ public void CouplingSyntax_ComposeSchemaMethodWithWordAsMethod_ShouldParse()

parser.ComposeAll();
}

[TestMethod]
public void CouplingSyntax_ComposeSchemaMethodWithWordFinishedWithNumberAsMethod_ShouldParse()
{
Expand All @@ -50,7 +51,7 @@ public void CouplingSyntax_ComposeSchemaMethodWithWordFinishedWithNumberAsMethod

parser.ComposeAll();
}

[TestMethod]
public void SelectWithUnnecessaryFirstComma_ShouldFail()
{
Expand All @@ -61,7 +62,7 @@ public void SelectWithUnnecessaryFirstComma_ShouldFail()

Assert.ThrowsException<SyntaxException>(() => parser.ComposeAll());
}

[TestMethod]
public void SelectWithUnnecessaryLastComma_ShouldFail()
{
Expand All @@ -72,7 +73,7 @@ public void SelectWithUnnecessaryLastComma_ShouldFail()

Assert.ThrowsException<SyntaxException>(() => parser.ComposeAll());
}

[TestMethod]
public void SelectTwoCommas_ShouldFail()
{
Expand All @@ -83,7 +84,7 @@ public void SelectTwoCommas_ShouldFail()

Assert.ThrowsException<SyntaxException>(() => parser.ComposeAll());
}

[TestMethod]
public void GroupByWithUnnecessaryFirstComma_ShouldParse()
{
Expand All @@ -94,7 +95,7 @@ public void GroupByWithUnnecessaryFirstComma_ShouldParse()

Assert.ThrowsException<SyntaxException>(() => parser.ComposeAll());
}

[TestMethod]
public void GroupByWithUnnecessaryLastComma_ShouldFail()
{
Expand All @@ -105,7 +106,7 @@ public void GroupByWithUnnecessaryLastComma_ShouldFail()

Assert.ThrowsException<SyntaxException>(() => parser.ComposeAll());
}

[TestMethod]
public void SelectTypo_ShouldFail()
{
Expand All @@ -116,7 +117,7 @@ public void SelectTypo_ShouldFail()

Assert.ThrowsException<SyntaxException>(() => parser.ComposeAll());
}

[TestMethod]
public void FromTypo_ShouldFail()
{
Expand All @@ -126,10 +127,10 @@ public void FromTypo_ShouldFail()
var parser = new Parser(lexer);

var exc = Assert.ThrowsException<SyntaxException>(() => parser.ComposeAll());

Assert.AreEqual("select 1 form #some.", exc.QueryPart);
}

[TestMethod]
public void SemicolonAtTheEnd_ShouldPass()
{
Expand All @@ -140,7 +141,7 @@ public void SemicolonAtTheEnd_ShouldPass()

parser.ComposeAll();
}

[TestMethod]
public void WhenCaseWhenWithMissingEnd_ShouldFail()
{
Expand All @@ -152,6 +153,206 @@ public void WhenCaseWhenWithMissingEnd_ShouldFail()
Assert.ThrowsException<SyntaxException>(() => parser.ComposeAll());
}

[TestMethod]
public void WhenCommentAtTheBegining_ShouldParse()
{
var query = """
--some comment
select
1
from #some.a() --some comment
""";

var lexer = new Lexer(query, true);
var parser = new Parser(lexer);

parser.ComposeAll();
}

[TestMethod]
public void WhenCommentAfterColumn_ShouldParse()
{
var query = """
select
1 --some comment
from #some.a()
""";

var lexer = new Lexer(query, true);
var parser = new Parser(lexer);

parser.ComposeAll();
}

[TestMethod]
public void WhenCommentAfterQuery_ShouldParse()
{
var query = """
select
1
from #some.a() --some comment
""";

var lexer = new Lexer(query, true);
var parser = new Parser(lexer);

parser.ComposeAll();
}

[TestMethod]
public void WhenCommentAtTheNewLineAfterQuery_ShouldParse()
{
var query = """
select
1
from #some.a()
--some comment
""";

var lexer = new Lexer(query, true);
var parser = new Parser(lexer);

parser.ComposeAll();
}

[TestMethod]
public void WhenCommentAfterColumnAndAtTheNextLine_ShouldParse()
{
var query = """
select
1 --some comment
--some comment
from #some.a()
""";

var lexer = new Lexer(query, true);
var parser = new Parser(lexer);

parser.ComposeAll();
}

[TestMethod]
public void WhenCommentBetweenKeywords_ShouldParse()
{
var query = """
select --some comment
1
from #some.a()
""";

var lexer = new Lexer(query, true);
var parser = new Parser(lexer);

parser.ComposeAll();
}

[TestMethod]
public void WhenMultipleCommentsOnSameLine_ShouldParse()
{
var query = """
select --first comment --second comment
1
from #some.a()
""";

var lexer = new Lexer(query, true);
var parser = new Parser(lexer);

parser.ComposeAll();
}

[TestMethod]
public void WhenCommentContainsSpecialCharacters_ShouldParse()
{
var query = """
select
1
from #some.a() --comment with !@#$%^&*()
""";

var lexer = new Lexer(query, true);
var parser = new Parser(lexer);

parser.ComposeAll();
}

[TestMethod]
public void WhenCommentContainsSQLKeywords_ShouldParse()
{
var query = """
select
1
from #some.a() --comment containing SELECT FROM WHERE
""";

var lexer = new Lexer(query, true);
var parser = new Parser(lexer);

parser.ComposeAll();
}

[TestMethod]
public void WhenEmptyComment_ShouldParse()
{
var query = """
select
1 --
from #some.a()
""";

var lexer = new Lexer(query, true);
var parser = new Parser(lexer);

parser.ComposeAll();
}

[TestMethod]
public void WhenCommentHasLeadingSpaces_ShouldParse()
{
var query = """
select
1 -- spaced comment
from #some.a()
""";

var lexer = new Lexer(query, true);
var parser = new Parser(lexer);

parser.ComposeAll();
}

[TestMethod]
public void WhenCommentsAroundJoins_ShouldParse()
{
var query = """
select
1
from #some.a() a--comment before join
inner join #some.b() b--comment after join
on a.id = b.id
""";

var lexer = new Lexer(query, true);
var parser = new Parser(lexer);

parser.ComposeAll();
}

[TestMethod]
public void WhenCommentContainsDoubleHyphen_ShouldParse()
{
var query = """
select
1 -- comment with -- inside
from #some.a()
""";

var lexer = new Lexer(query, true);
var parser = new Parser(lexer);

parser.ComposeAll();
}

[TestMethod]
[DataRow("select 1 from #some.thing() r cross apply r.Prop.Nested c")]
[DataRow("select 1 from #some.thing() r cross apply r.Prop.Nested c cross apply c.Prop.Nested2 d")]
Expand All @@ -160,7 +361,7 @@ public void WhenNestedPropertyUsedWithCrossApply_ShouldPass(string query)
{
var lexer = new Lexer(query, true);
var parser = new Parser(lexer);

Assert.IsNotNull(parser.ComposeAll());
}
}
Loading

0 comments on commit 6220d73

Please sign in to comment.