|
23 | 23 | import java.util.Date; |
24 | 24 | import java.util.List; |
25 | 25 | import java.util.UUID; |
| 26 | +import java.util.stream.Stream; |
26 | 27 |
|
27 | 28 | import org.bson.BsonBinary; |
28 | 29 | import org.bson.BsonBinarySubType; |
29 | 30 | import org.bson.BsonRegularExpression; |
30 | 31 | import org.bson.Document; |
31 | 32 | import org.bson.codecs.DecoderContext; |
32 | 33 | import org.junit.jupiter.api.Test; |
33 | | - |
| 34 | +import org.junit.jupiter.params.ParameterizedTest; |
| 35 | +import org.junit.jupiter.params.provider.Arguments; |
| 36 | +import org.junit.jupiter.params.provider.MethodSource; |
34 | 37 | import org.springframework.data.expression.ValueExpressionParser; |
35 | 38 | import org.springframework.data.spel.EvaluationContextProvider; |
36 | 39 | import org.springframework.data.spel.ExpressionDependencies; |
@@ -84,47 +87,12 @@ void bindQuotedIntegerValue() { |
84 | 87 | assertThat(target).isEqualTo(new Document("lastname", "100")); |
85 | 88 | } |
86 | 89 |
|
87 | | - @Test // GH-4806 |
88 | | - void regexConsidersOptions() { |
89 | | - |
90 | | - Document target = parse("{ 'c': /^true$/i }"); |
91 | | - |
92 | | - BsonRegularExpression pattern = target.get("c", BsonRegularExpression.class); |
93 | | - assertThat(pattern.getPattern()).isEqualTo("^true$"); |
94 | | - assertThat(pattern.getOptions()).isEqualTo("i"); |
95 | | - } |
96 | | - |
97 | | - @Test // GH-4806 |
98 | | - void regexConsidersBindValueWithOptions() { |
99 | | - |
100 | | - Document target = parse("{ 'c': /^?0$/i }", "foo"); |
101 | | - |
102 | | - BsonRegularExpression pattern = target.get("c", BsonRegularExpression.class); |
103 | | - assertThat(pattern.getPattern()).isEqualTo("^foo$"); |
104 | | - assertThat(pattern.getOptions()).isEqualTo("i"); |
105 | | - } |
106 | | - |
107 | | - @Test // GH-4806 |
108 | | - void treatsQuotedValueThatLooksLikeRegexAsPlainString() { |
109 | | - |
110 | | - Document target = parse("{ 'c': '/^?0$/i' }", "foo"); |
111 | | - |
112 | | - assertThat(target.get("c")).isInstanceOf(String.class); |
113 | | - } |
114 | | - |
115 | | - @Test // GH-4806 |
116 | | - void treatsStringParameterValueThatLooksLikeRegexAsPlainString() { |
117 | | - |
118 | | - Document target = parse("{ 'c': ?0 }", "/^foo$/i"); |
119 | | - |
120 | | - assertThat(target.get("c")).isInstanceOf(String.class); |
121 | | - } |
122 | | - |
123 | | - @Test |
124 | | - void bindValueToRegex() { |
| 90 | + @ParameterizedTest // GH-4806 |
| 91 | + @MethodSource("treatNestedStringParametersArgs") |
| 92 | + void treatNestedStringParameters(String source, String value, Object expected) { |
125 | 93 |
|
126 | | - Document target = parse("{ 'lastname' : { '$regex' : '^(?0)'} }", "kohlin"); |
127 | | - assertThat(target).isEqualTo(Document.parse("{ 'lastname' : { '$regex' : '^(kohlin)'} }")); |
| 94 | + Document target = parse(source, value); |
| 95 | + assertThat(target.get("value")).isEqualTo(expected); |
128 | 96 | } |
129 | 97 |
|
130 | 98 | @Test |
@@ -634,6 +602,20 @@ void shouldParseUUIDasStandardRepresentation() { |
634 | 602 | assertThat(value.getType()).isEqualTo(BsonBinarySubType.UUID_STANDARD.getValue()); |
635 | 603 | } |
636 | 604 |
|
| 605 | + static Stream<Arguments> treatNestedStringParametersArgs() { |
| 606 | + return Stream.of( // |
| 607 | + Arguments.of("{ 'value': '/^?0$/i' }", "foo", "/^foo$/i"), |
| 608 | + Arguments.of("{ 'value': /^true$/i }", null, new BsonRegularExpression("^true$", "i")), |
| 609 | + Arguments.of("{ 'value': /^?0$/i }", "foo", new BsonRegularExpression("^foo$", "i")), // |
| 610 | + Arguments.of("{ 'value': '/^?0$/i' }", "\\Qfoo\\E", "/^\\Qfoo\\E$/i"), |
| 611 | + Arguments.of("{ 'value': '?0' }", "/^foo$/i", "/^foo$/i"), // |
| 612 | + Arguments.of("{ 'value': /^\\Q?0\\E/}", "foo", new BsonRegularExpression("^\\Qfoo\\E")), // |
| 613 | + Arguments.of("{ 'value': /^\\Q?0\\E/}", "\\E.*", new BsonRegularExpression("^\\Q\\\\E.*\\E")), // |
| 614 | + Arguments.of("{ 'value': ?0 }", "/^foo$/i", "/^foo$/i"), // |
| 615 | + Arguments.of("{ 'value': { '$regex' : '^(?0)'} }", "foo", new Document("$regex", "^(foo)")) // |
| 616 | + ); |
| 617 | + } |
| 618 | + |
637 | 619 | private static Document parse(String json, Object... args) { |
638 | 620 | return new ParameterBindingDocumentCodec().decode(json, args); |
639 | 621 | } |
|
0 commit comments