Improve support for running tests on windows

Signed-off-by: szarpul@users.noreply.github.com
Signed-off-by: Mark Pollack <mark.pollack@broadcom.com>
This commit is contained in:
Mark Pollack
2025-05-08 12:46:06 -04:00
committed by Soby Chacko
parent 9774b4eedc
commit 06ea88312a
4 changed files with 182 additions and 69 deletions

View File

@@ -25,14 +25,14 @@ import static org.assertj.core.api.Assertions.assertThat;
/**
* @author Christian Tzolov
*/
public class ContentFormatterTests {
class ContentFormatterTests {
Document document = new Document("The World is Big and Salvation Lurks Around the Corner",
Map.of("embedKey1", "value1", "embedKey2", "value2", "embedKey3", "value3", "llmKey2", "value4"));
@Test
public void noExplicitlySetFormatter() {
assertThat(this.document.getText()).isEqualTo("""
void noExplicitlySetFormatter() {
TextBlockAssertion.assertThat(this.document.getText()).isEqualTo("""
The World is Big and Salvation Lurks Around the Corner""");
assertThat(this.document.getFormattedContent()).isEqualTo(this.document.getFormattedContent(MetadataMode.ALL));
@@ -42,17 +42,18 @@ public class ContentFormatterTests {
}
@Test
public void defaultConfigTextFormatter() {
void defaultConfigTextFormatter() {
DefaultContentFormatter defaultConfigFormatter = DefaultContentFormatter.defaultConfig();
assertThat(this.document.getFormattedContent(defaultConfigFormatter, MetadataMode.ALL)).isEqualTo("""
llmKey2: value4
embedKey1: value1
embedKey2: value2
embedKey3: value3
TextBlockAssertion.assertThat(this.document.getFormattedContent(defaultConfigFormatter, MetadataMode.ALL))
.isEqualTo("""
llmKey2: value4
embedKey1: value1
embedKey2: value2
embedKey3: value3
The World is Big and Salvation Lurks Around the Corner""");
The World is Big and Salvation Lurks Around the Corner""");
assertThat(this.document.getFormattedContent(defaultConfigFormatter, MetadataMode.ALL))
.isEqualTo(this.document.getFormattedContent());

View File

@@ -0,0 +1,54 @@
/*
* Copyright 2024-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.document;
import java.util.Arrays;
import org.assertj.core.api.AbstractCharSequenceAssert;
import org.assertj.core.api.Assertions;
public class TextBlockAssertion extends AbstractCharSequenceAssert<TextBlockAssertion, String> {
protected TextBlockAssertion(String string) {
super(string, TextBlockAssertion.class);
}
public static TextBlockAssertion assertThat(String actual) {
return new TextBlockAssertion(actual);
}
@Override
public TextBlockAssertion isEqualTo(Object expected) {
Assertions.assertThat(normalizedEOL(actual)).isEqualTo(normalizedEOL((String) expected));
return this;
}
@Override
public TextBlockAssertion contains(CharSequence... values) {
Assertions.assertThat(normalizedEOL(actual)).contains(normalizedEOL(values));
return this;
}
private String normalizedEOL(CharSequence... values) {
return Arrays.stream(values).map(CharSequence::toString).map(this::normalizedEOL).reduce("", (a, b) -> a + b);
}
private String normalizedEOL(String line) {
return line.replaceAll("\r\n|\r|\n", System.lineSeparator());
}
}

View File

@@ -38,6 +38,7 @@ import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.slf4j.LoggerFactory;
import org.springframework.ai.util.TextBlockAssertion;
import org.springframework.core.ParameterizedTypeReference;
import static org.assertj.core.api.Assertions.assertThat;
@@ -246,24 +247,25 @@ class BeanOutputConverterTest {
@Test
void formatClassType() {
var converter = new BeanOutputConverter<>(TestClass.class);
assertThat(converter.getFormat()).isEqualTo(
"""
Your response should be in JSON format.
Do not include any explanations, only provide a RFC8259 compliant JSON response following this format without deviation.
Do not include markdown code blocks in your response.
Remove the ```json markdown from the output.
Here is the JSON Schema instance your output must adhere to:
```{
"$schema" : "https://json-schema.org/draft/2020-12/schema",
"type" : "object",
"properties" : {
"someString" : {
"type" : "string"
}
},
"additionalProperties" : false
}```
""");
TextBlockAssertion.assertThat(converter.getFormat())
.isEqualTo(
"""
Your response should be in JSON format.
Do not include any explanations, only provide a RFC8259 compliant JSON response following this format without deviation.
Do not include markdown code blocks in your response.
Remove the ```json markdown from the output.
Here is the JSON Schema instance your output must adhere to:
```{
"$schema" : "https://json-schema.org/draft/2020-12/schema",
"type" : "object",
"properties" : {
"someString" : {
"type" : "string"
}
},
"additionalProperties" : false
}```
""");
}
@Test
@@ -271,24 +273,25 @@ class BeanOutputConverterTest {
var converter = new BeanOutputConverter<>(new ParameterizedTypeReference<TestClass>() {
});
assertThat(converter.getFormat()).isEqualTo(
"""
Your response should be in JSON format.
Do not include any explanations, only provide a RFC8259 compliant JSON response following this format without deviation.
Do not include markdown code blocks in your response.
Remove the ```json markdown from the output.
Here is the JSON Schema instance your output must adhere to:
```{
"$schema" : "https://json-schema.org/draft/2020-12/schema",
"type" : "object",
"properties" : {
"someString" : {
"type" : "string"
}
},
"additionalProperties" : false
}```
""");
TextBlockAssertion.assertThat(converter.getFormat())
.isEqualTo(
"""
Your response should be in JSON format.
Do not include any explanations, only provide a RFC8259 compliant JSON response following this format without deviation.
Do not include markdown code blocks in your response.
Remove the ```json markdown from the output.
Here is the JSON Schema instance your output must adhere to:
```{
"$schema" : "https://json-schema.org/draft/2020-12/schema",
"type" : "object",
"properties" : {
"someString" : {
"type" : "string"
}
},
"additionalProperties" : false
}```
""");
}
@Test
@@ -296,33 +299,34 @@ class BeanOutputConverterTest {
var converter = new BeanOutputConverter<>(new ParameterizedTypeReference<List<TestClass>>() {
});
assertThat(converter.getFormat()).isEqualTo(
"""
Your response should be in JSON format.
Do not include any explanations, only provide a RFC8259 compliant JSON response following this format without deviation.
Do not include markdown code blocks in your response.
Remove the ```json markdown from the output.
Here is the JSON Schema instance your output must adhere to:
```{
"$schema" : "https://json-schema.org/draft/2020-12/schema",
"type" : "array",
"items" : {
"type" : "object",
"properties" : {
"someString" : {
"type" : "string"
}
},
"additionalProperties" : false
}
}```
""");
TextBlockAssertion.assertThat(converter.getFormat())
.isEqualTo(
"""
Your response should be in JSON format.
Do not include any explanations, only provide a RFC8259 compliant JSON response following this format without deviation.
Do not include markdown code blocks in your response.
Remove the ```json markdown from the output.
Here is the JSON Schema instance your output must adhere to:
```{
"$schema" : "https://json-schema.org/draft/2020-12/schema",
"type" : "array",
"items" : {
"type" : "object",
"properties" : {
"someString" : {
"type" : "string"
}
},
"additionalProperties" : false
}
}```
""");
}
@Test
void formatClassTypeWithAnnotations() {
var converter = new BeanOutputConverter<>(TestClassWithJsonAnnotations.class);
assertThat(converter.getFormat()).contains("""
TextBlockAssertion.assertThat(converter.getFormat()).contains("""
```{
"$schema" : "https://json-schema.org/draft/2020-12/schema",
"type" : "object",
@@ -342,7 +346,7 @@ class BeanOutputConverterTest {
var converter = new BeanOutputConverter<>(new ParameterizedTypeReference<TestClassWithJsonAnnotations>() {
});
assertThat(converter.getFormat()).contains("""
TextBlockAssertion.assertThat(converter.getFormat()).contains("""
```{
"$schema" : "https://json-schema.org/draft/2020-12/schema",
"type" : "object",

View File

@@ -0,0 +1,54 @@
/*
* Copyright 2024-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.util;
import java.util.Arrays;
import org.assertj.core.api.AbstractCharSequenceAssert;
import org.assertj.core.api.Assertions;
public class TextBlockAssertion extends AbstractCharSequenceAssert<TextBlockAssertion, String> {
protected TextBlockAssertion(String string) {
super(string, TextBlockAssertion.class);
}
public static TextBlockAssertion assertThat(String actual) {
return new TextBlockAssertion(actual);
}
@Override
public TextBlockAssertion isEqualTo(Object expected) {
Assertions.assertThat(normalizedEOL(actual)).isEqualTo(normalizedEOL((String) expected));
return this;
}
@Override
public TextBlockAssertion contains(CharSequence... values) {
Assertions.assertThat(normalizedEOL(actual)).contains(normalizedEOL(values));
return this;
}
private String normalizedEOL(CharSequence... values) {
return Arrays.stream(values).map(CharSequence::toString).map(this::normalizedEOL).reduce("", (a, b) -> a + b);
}
private String normalizedEOL(String line) {
return line.replaceAll("\r\n|\r|\n", System.lineSeparator());
}
}