Skip to content

Commit e7bfe98

Browse files
Introduce common test base for parser tests
1 parent b144c06 commit e7bfe98

File tree

3 files changed

+131
-90
lines changed

3 files changed

+131
-90
lines changed

spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/EqlComplianceTests.java

+9-61
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@
1515
*/
1616
package org.springframework.data.jpa.repository.query;
1717

18-
import static org.assertj.core.api.Assertions.*;
19-
import static org.springframework.data.jpa.repository.query.JpaQueryParsingToken.*;
18+
import java.util.List;
2019

2120
import org.antlr.v4.runtime.CharStreams;
2221
import org.antlr.v4.runtime.CommonTokenStream;
22+
import org.antlr.v4.runtime.tree.ParseTree;
2323
import org.junit.jupiter.api.Test;
2424

2525
/**
@@ -33,69 +33,22 @@
3333
* @author Greg Turnquist
3434
* @author Christoph Strobl
3535
*/
36-
class EqlComplianceTests {
36+
class EqlComplianceTests extends SqlParserTests{
3737

38-
/**
39-
* Parse the query using {@link EqlParser} then run it through the query-preserving {@link EqlQueryRenderer}.
40-
*
41-
* @param query
42-
*/
43-
private static String parseWithoutChanges(String query) {
38+
@Override
39+
ParseTree parse(String query) {
4440

4541
EqlLexer lexer = new EqlLexer(CharStreams.fromString(query));
4642
EqlParser parser = new EqlParser(new CommonTokenStream(lexer));
4743

4844
parser.addErrorListener(new BadJpqlGrammarErrorListener(query));
4945

50-
EqlParser.StartContext parsedQuery = parser.start();
51-
52-
return render(new EqlQueryRenderer().visit(parsedQuery));
53-
}
54-
55-
private void assertQuery(String query) {
56-
57-
String slimmedDownQuery = reduceWhitespace(query);
58-
assertThat(parseWithoutChanges(slimmedDownQuery)).isEqualTo(slimmedDownQuery);
59-
}
60-
61-
private String reduceWhitespace(String original) {
62-
63-
return original //
64-
.replaceAll("[ \\t\\n]{1,}", " ") //
65-
.trim();
66-
}
67-
68-
@Test
69-
void selectQueries() {
70-
71-
assertQuery("Select e FROM Employee e WHERE e.salary > 100000");
72-
assertQuery("Select e FROM Employee e WHERE e.id = :id");
73-
assertQuery("Select MAX(e.salary) FROM Employee e");
74-
assertQuery("Select e.firstName FROM Employee e");
75-
assertQuery("Select e.firstName, e.lastName FROM Employee e");
76-
}
77-
78-
@Test
79-
void selectClause() {
80-
81-
assertQuery("SELECT COUNT(e) FROM Employee e");
82-
assertQuery("SELECT MAX(e.salary) FROM Employee e");
83-
assertQuery("SELECT NEW com.acme.reports.EmpReport(e.firstName, e.lastName, e.salary) FROM Employee e");
84-
}
85-
86-
@Test
87-
void fromClause() {
88-
89-
assertQuery("SELECT e FROM Employee e");
90-
assertQuery("SELECT e, a FROM Employee e, MailingAddress a WHERE e.address = a.address");
91-
assertQuery("SELECT e FROM com.acme.Employee e");
46+
return parser.start();
9247
}
9348

94-
@Test
95-
void join() {
96-
97-
assertQuery("SELECT e FROM Employee e JOIN e.address a WHERE a.city = :city");
98-
assertQuery("SELECT e FROM Employee e JOIN e.projects p JOIN e.projects p2 WHERE p.name = :p1 AND p2.name = :p2");
49+
@Override
50+
<T extends ParseTree> List<JpaQueryParsingToken> analyze(T parseTree) {
51+
return new EqlQueryRenderer().visit(parseTree);
9952
}
10053

10154
@Test
@@ -105,11 +58,6 @@ void joinFetch() {
10558
assertQuery("SELECT e FROM Employee e JOIN FETCH e.address a ORDER BY a.city");
10659
}
10760

108-
@Test
109-
void leftJoin() {
110-
assertQuery("SELECT e FROM Employee e LEFT JOIN e.address a ORDER BY a.city");
111-
}
112-
11361
@Test
11462
void on() {
11563

spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/JpqlComplianceTests.java

+9-29
Original file line numberDiff line numberDiff line change
@@ -15,51 +15,31 @@
1515
*/
1616
package org.springframework.data.jpa.repository.query;
1717

18-
import static org.assertj.core.api.Assertions.*;
19-
import static org.springframework.data.jpa.repository.query.JpaQueryParsingToken.*;
18+
import java.util.List;
2019

2120
import org.antlr.v4.runtime.CharStreams;
2221
import org.antlr.v4.runtime.CommonTokenStream;
23-
import org.junit.jupiter.api.Test;
22+
import org.antlr.v4.runtime.tree.ParseTree;
2423

2524
/**
2625
* @author Christoph Strobl
2726
*/
28-
public class JpqlComplianceTests {
27+
public class JpqlComplianceTests extends SqlParserTests {
2928

30-
private static String parseWithoutChanges(String query) {
29+
@Override
30+
ParseTree parse(String query) {
3131

3232
JpqlLexer lexer = new JpqlLexer(CharStreams.fromString(query));
3333
JpqlParser parser = new JpqlParser(new CommonTokenStream(lexer));
3434

3535
parser.addErrorListener(new BadJpqlGrammarErrorListener(query));
3636

37-
JpqlParser.StartContext parsedQuery = parser.start();
38-
39-
return render(new JpqlQueryRenderer().visit(parsedQuery));
40-
}
41-
42-
private void assertQuery(String query) {
43-
44-
String slimmedDownQuery = reduceWhitespace(query);
45-
assertThat(parseWithoutChanges(slimmedDownQuery)).isEqualTo(slimmedDownQuery);
37+
return parser.start();
4638
}
4739

48-
private String reduceWhitespace(String original) {
49-
50-
return original //
51-
.replaceAll("[ \\t\\n]{1,}", " ") //
52-
.trim();
53-
}
54-
55-
@Test
56-
void numericLiterals() {
57-
58-
assertQuery("SELECT e FROM Employee e WHERE e.id = 1234");
59-
assertQuery("SELECT e FROM Employee e WHERE e.id = 1234L");
60-
assertQuery("SELECT s FROM Stat s WHERE s.ratio > 3.14");
61-
assertQuery("SELECT s FROM Stat s WHERE s.ratio > 3.14F");
62-
assertQuery("SELECT s FROM Stat s WHERE s.ratio > 3.14e32D");
40+
@Override
41+
<T extends ParseTree> List<JpaQueryParsingToken> analyze(T parseTree) {
42+
return new JpqlQueryRenderer().visit(parseTree);
6343
}
6444

6545
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
/*
2+
* Copyright 2023 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.springframework.data.jpa.repository.query;
17+
18+
import static org.assertj.core.api.Assertions.*;
19+
20+
import java.util.List;
21+
22+
import org.antlr.v4.runtime.tree.ParseTree;
23+
import org.junit.jupiter.api.Test;
24+
25+
/**
26+
* @author Christoph Strobl
27+
*/
28+
public abstract class SqlParserTests {
29+
30+
abstract <T extends ParseTree> T parse(String query);
31+
32+
abstract <T extends ParseTree> List<JpaQueryParsingToken> analyze(T parseTree);
33+
34+
protected String render(List<JpaQueryParsingToken> tokens) {
35+
36+
StringBuilder results = new StringBuilder();
37+
38+
tokens.forEach(token -> {
39+
40+
results.append(token.getToken());
41+
42+
if (token.getSpace()) {
43+
results.append(" ");
44+
}
45+
});
46+
47+
return results.toString().trim();
48+
}
49+
50+
@Test // GH-3277
51+
void numericLiterals() {
52+
53+
assertQuery("SELECT e FROM Employee e WHERE e.id = 1234");
54+
assertQuery("SELECT e FROM Employee e WHERE e.id = 1234L");
55+
assertQuery("SELECT s FROM Stat s WHERE s.ratio > 3.14");
56+
assertQuery("SELECT s FROM Stat s WHERE s.ratio > 3.14F");
57+
assertQuery("SELECT s FROM Stat s WHERE s.ratio > 3.14e32D");
58+
}
59+
60+
@Test
61+
void selectQueries() {
62+
63+
assertQuery("Select e FROM Employee e WHERE e.salary > 100000");
64+
assertQuery("Select e FROM Employee e WHERE e.id = :id");
65+
assertQuery("Select MAX(e.salary) FROM Employee e");
66+
assertQuery("Select e.firstName FROM Employee e");
67+
assertQuery("Select e.firstName, e.lastName FROM Employee e");
68+
}
69+
70+
@Test
71+
void selectClause() {
72+
73+
assertQuery("SELECT COUNT(e) FROM Employee e");
74+
assertQuery("SELECT MAX(e.salary) FROM Employee e");
75+
assertQuery("SELECT NEW com.acme.reports.EmpReport(e.firstName, e.lastName, e.salary) FROM Employee e");
76+
}
77+
78+
79+
@Test
80+
void fromClause() {
81+
82+
assertQuery("SELECT e FROM Employee e");
83+
assertQuery("SELECT e, a FROM Employee e, MailingAddress a WHERE e.address = a.address");
84+
assertQuery("SELECT e FROM com.acme.Employee e");
85+
}
86+
87+
@Test
88+
void join() {
89+
90+
assertQuery("SELECT e FROM Employee e JOIN e.address a WHERE a.city = :city");
91+
assertQuery("SELECT e FROM Employee e JOIN e.projects p JOIN e.projects p2 WHERE p.name = :p1 AND p2.name = :p2");
92+
}
93+
@Test
94+
void leftJoin() {
95+
assertQuery("SELECT e FROM Employee e LEFT JOIN e.address a ORDER BY a.city");
96+
}
97+
98+
protected void assertQuery(String query) {
99+
100+
String slimmedDownQuery = reduceWhitespace(query);
101+
ParseTree tree = parse(slimmedDownQuery);
102+
List<JpaQueryParsingToken> tokens = analyze(tree);
103+
104+
assertThat(render(tokens)).isEqualTo(slimmedDownQuery);
105+
}
106+
107+
private static String reduceWhitespace(String original) {
108+
109+
return original //
110+
.replaceAll("[ \\t\\n]{1,}", " ") //
111+
.trim();
112+
}
113+
}

0 commit comments

Comments
 (0)