Skip to content

Commit 79d6a49

Browse files
committed
test: Add comprehensive test coverage for Prompt and ChatOptions builders
Signed-off-by: Alex Klimenko <[email protected]>
1 parent e0ccc13 commit 79d6a49

File tree

2 files changed

+113
-0
lines changed

2 files changed

+113
-0
lines changed

spring-ai-model/src/test/java/org/springframework/ai/chat/prompt/ChatOptionsBuilderTests.java

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,4 +173,73 @@ void shouldBeImmutableAfterBuild() {
173173
.isInstanceOf(UnsupportedOperationException.class);
174174
}
175175

176+
@Test
177+
void shouldHandleNullStopSequences() {
178+
ChatOptions options = this.builder.model("test-model").stopSequences(null).build();
179+
180+
assertThat(options.getStopSequences()).isNull();
181+
}
182+
183+
@Test
184+
void shouldHandleEmptyStopSequences() {
185+
ChatOptions options = this.builder.model("test-model").stopSequences(List.of()).build();
186+
187+
assertThat(options.getStopSequences()).isEmpty();
188+
}
189+
190+
@Test
191+
void shouldHandleFrequencyAndPresencePenalties() {
192+
ChatOptions options = this.builder.model("test-model").frequencyPenalty(0.5).presencePenalty(0.3).build();
193+
194+
assertThat(options.getFrequencyPenalty()).isEqualTo(0.5);
195+
assertThat(options.getPresencePenalty()).isEqualTo(0.3);
196+
}
197+
198+
@Test
199+
void shouldMaintainStopSequencesOrder() {
200+
List<String> orderedSequences = List.of("first", "second", "third", "fourth");
201+
202+
ChatOptions options = this.builder.model("test-model").stopSequences(orderedSequences).build();
203+
204+
assertThat(options.getStopSequences()).containsExactly("first", "second", "third", "fourth");
205+
}
206+
207+
@Test
208+
void shouldCreateIndependentCopies() {
209+
ChatOptions original = this.builder.model("test-model")
210+
.stopSequences(new ArrayList<>(List.of("stop1")))
211+
.build();
212+
213+
ChatOptions copy1 = original.copy();
214+
ChatOptions copy2 = original.copy();
215+
216+
assertThat(copy1).isNotSameAs(copy2);
217+
assertThat(copy1.getStopSequences()).isNotSameAs(copy2.getStopSequences());
218+
assertThat(copy1).usingRecursiveComparison().isEqualTo(copy2);
219+
}
220+
221+
@Test
222+
void shouldHandleSpecialStringValues() {
223+
ChatOptions options = this.builder.model("") // Empty string
224+
.stopSequences(List.of("", " ", "\n", "\t"))
225+
.build();
226+
227+
assertThat(options.getModel()).isEmpty();
228+
assertThat(options.getStopSequences()).containsExactly("", " ", "\n", "\t");
229+
}
230+
231+
@Test
232+
void shouldPreserveCopyIntegrity() {
233+
List<String> mutableList = new ArrayList<>(List.of("original"));
234+
ChatOptions original = this.builder.model("test-model").stopSequences(mutableList).build();
235+
236+
// Modify the original list after building
237+
mutableList.add("modified");
238+
239+
ChatOptions copy = original.copy();
240+
241+
assertThat(original.getStopSequences()).containsExactly("original");
242+
assertThat(copy.getStopSequences()).containsExactly("original");
243+
}
244+
176245
}

spring-ai-model/src/test/java/org/springframework/ai/chat/prompt/PromptTests.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,4 +261,48 @@ void augmentSystemMessageWhenNotFirst() {
261261
assertThat(prompt.getSystemMessage().getText()).isEqualTo("Hello");
262262
}
263263

264+
@Test
265+
void shouldPreserveMessageOrder() {
266+
SystemMessage system = new SystemMessage("You are helpful");
267+
UserMessage user1 = new UserMessage("First question");
268+
UserMessage user2 = new UserMessage("Second question");
269+
270+
Prompt prompt = Prompt.builder().messages(system, user1, user2).build();
271+
272+
assertThat(prompt.getInstructions()).hasSize(3);
273+
assertThat(prompt.getInstructions().get(0)).isEqualTo(system);
274+
assertThat(prompt.getInstructions().get(1)).isEqualTo(user1);
275+
assertThat(prompt.getInstructions().get(2)).isEqualTo(user2);
276+
}
277+
278+
@Test
279+
void shouldHandleEmptyMessageList() {
280+
Prompt prompt = Prompt.builder().messages(List.of()).build();
281+
282+
assertThat(prompt.getInstructions()).isEmpty();
283+
assertThat(prompt.getUserMessage().getText()).isEmpty();
284+
assertThat(prompt.getSystemMessage().getText()).isEmpty();
285+
}
286+
287+
@Test
288+
void shouldCreatePromptWithOptions() {
289+
ChatOptions options = ChatOptions.builder().model("test-model").temperature(0.5).build();
290+
Prompt prompt = new Prompt("Test content", options);
291+
292+
assertThat(prompt.getOptions()).isEqualTo(options);
293+
assertThat(prompt.getUserMessage().getText()).isEqualTo("Test content");
294+
}
295+
296+
@Test
297+
void shouldHandleMixedMessageTypes() {
298+
SystemMessage system = new SystemMessage("System message");
299+
UserMessage user = new UserMessage("User message");
300+
301+
Prompt prompt = Prompt.builder().messages(user, system).build();
302+
303+
assertThat(prompt.getInstructions()).hasSize(2);
304+
assertThat(prompt.getUserMessage().getText()).isEqualTo("User message");
305+
assertThat(prompt.getSystemMessage().getText()).isEqualTo("System message");
306+
}
307+
264308
}

0 commit comments

Comments
 (0)