Skip to content

Commit 16b77f0

Browse files
yrodieregsmet
authored andcommitted
HV-1774 Add a few tests to demonstrate the behavior of TokenCollector
1 parent 29bd0f4 commit 16b77f0

File tree

4 files changed

+411
-64
lines changed

4 files changed

+411
-64
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
/*
2+
* Hibernate Validator, declare and validate application constraints
3+
*
4+
* License: Apache License, Version 2.0
5+
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
6+
*/
7+
package org.hibernate.validator.test.internal.engine.messageinterpolation;
8+
9+
import org.hibernate.validator.internal.engine.messageinterpolation.InterpolationTermType;
10+
import org.hibernate.validator.internal.engine.messageinterpolation.parser.MessageDescriptorFormatException;
11+
import org.hibernate.validator.internal.engine.messageinterpolation.parser.Token;
12+
import org.hibernate.validator.internal.engine.messageinterpolation.parser.TokenCollector;
13+
14+
import org.assertj.core.api.Assertions;
15+
import org.testng.annotations.Test;
16+
17+
/**
18+
* Abstract base for {@code TokenCollector} tests.
19+
*
20+
* @author Hardy Ferentschik
21+
*/
22+
public abstract class AbstractTokenCollectorTest {
23+
24+
protected abstract InterpolationTermType getInterpolationTermType();
25+
26+
@Test
27+
public void testLiteral() {
28+
Assertions.assertThat(
29+
new TokenCollector( "foo bar", getInterpolationTermType() )
30+
.getTokenList()
31+
)
32+
.hasSize( 1 )
33+
.element( 0 )
34+
.returns( "foo bar", Token::getTokenValue )
35+
.returns( false, Token::isParameter );
36+
}
37+
38+
@Test(expectedExceptions = MessageDescriptorFormatException.class, expectedExceptionsMessageRegExp = "HV000169.*")
39+
public void testNestedParametersThrowException() {
40+
new TokenCollector( "#{foo {}", getInterpolationTermType() );
41+
}
42+
43+
@Test(expectedExceptions = MessageDescriptorFormatException.class, expectedExceptionsMessageRegExp = "HV000168.*")
44+
public void testClosingBraceWithoutOpeningBraceThrowsException() {
45+
new TokenCollector( "foo}", getInterpolationTermType() );
46+
}
47+
48+
@Test(expectedExceptions = MessageDescriptorFormatException.class, expectedExceptionsMessageRegExp = "HV000168.*")
49+
public void testOpeningBraceWithoutClosingBraceThrowsException() {
50+
new TokenCollector( "{foo", getInterpolationTermType() );
51+
}
52+
53+
@Test
54+
public void testBackslashEscapesNonMetaCharacter() {
55+
Assertions.assertThat(
56+
new TokenCollector( "foo \\bar", getInterpolationTermType() )
57+
.getTokenList()
58+
)
59+
.hasSize( 1 )
60+
.element( 0 )
61+
// Backslashes are removed later, in AbstractMessageInterpolator.replaceEscapedLiterals
62+
.returns( "foo \\bar", Token::getTokenValue )
63+
.returns( false, Token::isParameter );
64+
}
65+
66+
@Test
67+
public void testBackslashEscapesDollar() {
68+
Assertions.assertThat(
69+
new TokenCollector( "foo \\$ bar", getInterpolationTermType() )
70+
.getTokenList()
71+
)
72+
.hasSize( 1 )
73+
.element( 0 )
74+
// Backslashes are removed later, in AbstractMessageInterpolator.replaceEscapedLiterals
75+
.returns( "foo \\$ bar", Token::getTokenValue )
76+
.returns( false, Token::isParameter );
77+
}
78+
79+
@Test
80+
public void testBackslashEscapesOpeningBrace() {
81+
Assertions.assertThat(
82+
new TokenCollector( "foo \\{ bar", getInterpolationTermType() )
83+
.getTokenList()
84+
)
85+
.hasSize( 1 )
86+
.element( 0 )
87+
// Backslashes are removed later, in AbstractMessageInterpolator.replaceEscapedLiterals
88+
.returns( "foo \\{ bar", Token::getTokenValue )
89+
.returns( false, Token::isParameter );
90+
}
91+
92+
@Test
93+
public void testBackslashEscapesClosingBrace() {
94+
Assertions.assertThat(
95+
new TokenCollector( "foo \\} bar", getInterpolationTermType() )
96+
.getTokenList()
97+
)
98+
.hasSize( 1 )
99+
.element( 0 )
100+
// Backslashes are removed later, in AbstractMessageInterpolator.replaceEscapedLiterals
101+
.returns( "foo \\} bar", Token::getTokenValue )
102+
.returns( false, Token::isParameter );
103+
}
104+
105+
@Test
106+
public void testBackslashEscapesBackslash() {
107+
Assertions.assertThat(
108+
new TokenCollector( "foo \\\\ bar", getInterpolationTermType() )
109+
.getTokenList()
110+
)
111+
.hasSize( 1 )
112+
.element( 0 )
113+
// Backslashes are removed later, in AbstractMessageInterpolator.replaceEscapedLiterals
114+
.returns( "foo \\\\ bar", Token::getTokenValue )
115+
.returns( false, Token::isParameter );
116+
}
117+
118+
@Test
119+
public void testBackslashEscapesEL() {
120+
Assertions.assertThat(
121+
new TokenCollector( "foo \\$\\{bar\\}", getInterpolationTermType() )
122+
.getTokenList()
123+
)
124+
.hasSize( 1 )
125+
.element( 0 )
126+
// Backslashes are removed later, in AbstractMessageInterpolator.replaceEscapedLiterals
127+
.returns( "foo \\$\\{bar\\}", Token::getTokenValue )
128+
// What's important is that we did NOT detect the expression
129+
.returns( false, Token::isParameter );
130+
}
131+
132+
@Test
133+
public void testBackslashEscapesParameter() {
134+
Assertions.assertThat(
135+
new TokenCollector( "foo \\{bar\\}", getInterpolationTermType() )
136+
.getTokenList()
137+
)
138+
.hasSize( 1 )
139+
.element( 0 )
140+
// Backslashes are removed later, in AbstractMessageInterpolator.replaceEscapedLiterals
141+
.returns( "foo \\{bar\\}", Token::getTokenValue )
142+
// What's important is that we did NOT detect the parameter
143+
.returns( false, Token::isParameter );
144+
}
145+
146+
@Test(expectedExceptions = MessageDescriptorFormatException.class, expectedExceptionsMessageRegExp = "HV000168.*")
147+
public void testTrailingClosingBraceThrowsException() {
148+
new TokenCollector( "this message contains a invalid parameter start token {", getInterpolationTermType() );
149+
}
150+
151+
@Test
152+
public void testDollarThenNonMetaCharacterInterpretedAsLiteral() {
153+
Assertions.assertThat(
154+
new TokenCollector( "$a", getInterpolationTermType() )
155+
.getTokenList()
156+
)
157+
.hasSize( 1 )
158+
.element( 0 )
159+
.returns( "$a", Token::getTokenValue )
160+
.returns( false, Token::isParameter );
161+
}
162+
163+
@Test
164+
public void testTrailingDollarInterpretedAsLiteral() {
165+
Assertions.assertThat(
166+
new TokenCollector( "foo $", getInterpolationTermType() )
167+
.getTokenList()
168+
)
169+
.hasSize( 1 )
170+
.element( 0 )
171+
.returns( "foo $", Token::getTokenValue )
172+
.returns( false, Token::isParameter );
173+
}
174+
175+
@Test
176+
public void testTrailingBackslashInterpretedAsLiteral() {
177+
Assertions.assertThat(
178+
new TokenCollector( "foo \\", getInterpolationTermType() )
179+
.getTokenList()
180+
)
181+
.hasSize( 1 )
182+
.element( 0 )
183+
.returns( "foo \\", Token::getTokenValue )
184+
.returns( false, Token::isParameter );
185+
}
186+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
/*
2+
* Hibernate Validator, declare and validate application constraints
3+
*
4+
* License: Apache License, Version 2.0
5+
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
6+
*/
7+
package org.hibernate.validator.test.internal.engine.messageinterpolation;
8+
9+
import org.hibernate.validator.internal.engine.messageinterpolation.InterpolationTermType;
10+
import org.hibernate.validator.internal.engine.messageinterpolation.parser.MessageDescriptorFormatException;
11+
import org.hibernate.validator.internal.engine.messageinterpolation.parser.Token;
12+
import org.hibernate.validator.internal.engine.messageinterpolation.parser.TokenCollector;
13+
14+
import org.assertj.core.api.Assertions;
15+
import org.assertj.core.api.ListAssert;
16+
import org.testng.annotations.Test;
17+
18+
/**
19+
* Tests for {@code TokenCollector} in message expression mode.
20+
*
21+
* @author Hardy Ferentschik
22+
*/
23+
public class TokenCollectorMessageExpressionTest extends AbstractTokenCollectorTest {
24+
@Override
25+
protected InterpolationTermType getInterpolationTermType() {
26+
return InterpolationTermType.EL;
27+
}
28+
29+
// Several tests inherited from the abstract class
30+
31+
@Test
32+
public void testMessageParameter() {
33+
ListAssert<Token> assertion = Assertions.assertThat(
34+
new TokenCollector( "foo {bar}", getInterpolationTermType() )
35+
.getTokenList()
36+
)
37+
.hasSize( 2 );
38+
assertion.element( 0 )
39+
.returns( "foo ", Token::getTokenValue )
40+
.returns( false, Token::isParameter );
41+
assertion.element( 1 )
42+
.returns( "{bar}", Token::getTokenValue )
43+
.returns( false, Token::isParameter );
44+
}
45+
46+
@Test
47+
public void testMessageExpression() {
48+
ListAssert<Token> assertion = Assertions.assertThat(
49+
new TokenCollector( "foo ${bar}", getInterpolationTermType() )
50+
.getTokenList()
51+
)
52+
.hasSize( 2 );
53+
assertion.element( 0 )
54+
.returns( "foo ", Token::getTokenValue )
55+
.returns( false, Token::isParameter );
56+
assertion.element( 1 )
57+
.returns( "${bar}", Token::getTokenValue )
58+
.returns( true, Token::isParameter );
59+
}
60+
61+
@Test
62+
public void testDollarThenDollarThenParameterInterpretedAsLiterals() {
63+
ListAssert<Token> assertion = Assertions.assertThat(
64+
new TokenCollector( "$${1+1}", getInterpolationTermType() )
65+
.getTokenList()
66+
)
67+
.hasSize( 2 );
68+
assertion.element( 0 )
69+
.returns( "$$", Token::getTokenValue )
70+
.returns( false, Token::isParameter );
71+
assertion.element( 1 )
72+
.returns( "{1+1}", Token::getTokenValue )
73+
.returns( false, Token::isParameter );
74+
}
75+
76+
@Test
77+
public void testDollarThenDollarThenLiteralsInterpretedAsLiterals() {
78+
ListAssert<Token> assertion = Assertions.assertThat(
79+
new TokenCollector( "$$foo", getInterpolationTermType() )
80+
.getTokenList()
81+
)
82+
.hasSize( 2 );
83+
assertion.element( 0 )
84+
.returns( "$$", Token::getTokenValue )
85+
.returns( false, Token::isParameter );
86+
assertion.element( 1 )
87+
.returns( "foo", Token::getTokenValue )
88+
.returns( false, Token::isParameter );
89+
}
90+
91+
@Test(expectedExceptions = MessageDescriptorFormatException.class, expectedExceptionsMessageRegExp = "HV000168.*")
92+
public void testDollarThenClosingBraceThrowsException() {
93+
new TokenCollector( "$}", getInterpolationTermType() );
94+
}
95+
96+
@Test
97+
public void testDollarThenEscapeInterpretedAsLiterals() {
98+
ListAssert<Token> assertion = Assertions.assertThat(
99+
new TokenCollector( "$\\A{1+1}", getInterpolationTermType() )
100+
.getTokenList()
101+
)
102+
.hasSize( 2 );
103+
assertion.element( 0 )
104+
.returns( "$\\A", Token::getTokenValue )
105+
.returns( false, Token::isParameter );
106+
assertion.element( 1 )
107+
.returns( "{1+1}", Token::getTokenValue )
108+
.returns( false, Token::isParameter );
109+
}
110+
}

0 commit comments

Comments
 (0)