@@ -59,4 +59,135 @@ void builder() {
5959 assertThat (result .returnDirect ()).isTrue ();
6060 }
6161
62+ @ Test
63+ void whenBuilderWithMinimalRequiredFields () {
64+ var conversationHistory = new ArrayList <Message >();
65+ var result = DefaultToolExecutionResult .builder ().conversationHistory (conversationHistory ).build ();
66+
67+ assertThat (result .conversationHistory ()).isEqualTo (conversationHistory );
68+ assertThat (result .returnDirect ()).isFalse (); // Default value should be false
69+ }
70+
71+ @ Test
72+ void whenBuilderWithReturnDirectFalse () {
73+ var conversationHistory = new ArrayList <Message >();
74+ var result = DefaultToolExecutionResult .builder ()
75+ .conversationHistory (conversationHistory )
76+ .returnDirect (false )
77+ .build ();
78+
79+ assertThat (result .conversationHistory ()).isEqualTo (conversationHistory );
80+ assertThat (result .returnDirect ()).isFalse ();
81+ }
82+
83+ @ Test
84+ void whenConversationHistoryIsEmpty () {
85+ var conversationHistory = new ArrayList <Message >();
86+ var result = DefaultToolExecutionResult .builder ()
87+ .conversationHistory (conversationHistory )
88+ .returnDirect (true )
89+ .build ();
90+
91+ assertThat (result .conversationHistory ()).isEmpty ();
92+ assertThat (result .returnDirect ()).isTrue ();
93+ }
94+
95+ @ Test
96+ void whenConversationHistoryHasMultipleMessages () {
97+ var conversationHistory = new ArrayList <Message >();
98+ var message1 = new org .springframework .ai .chat .messages .UserMessage ("Hello" );
99+ var message2 = new org .springframework .ai .chat .messages .AssistantMessage ("Hi there!" );
100+ conversationHistory .add (message1 );
101+ conversationHistory .add (message2 );
102+
103+ var result = DefaultToolExecutionResult .builder ()
104+ .conversationHistory (conversationHistory )
105+ .returnDirect (false )
106+ .build ();
107+
108+ assertThat (result .conversationHistory ()).hasSize (2 );
109+ assertThat (result .conversationHistory ()).containsExactly (message1 , message2 );
110+ assertThat (result .returnDirect ()).isFalse ();
111+ }
112+
113+ @ Test
114+ void whenConversationHistoryHasNullElementsInMiddle () {
115+ var history = new ArrayList <Message >();
116+ history .add (new org .springframework .ai .chat .messages .UserMessage ("First message" ));
117+ history .add (null );
118+ history .add (new org .springframework .ai .chat .messages .AssistantMessage ("Last message" ));
119+
120+ assertThatThrownBy (() -> DefaultToolExecutionResult .builder ().conversationHistory (history ).build ())
121+ .isInstanceOf (IllegalArgumentException .class )
122+ .hasMessage ("conversationHistory cannot contain null elements" );
123+ }
124+
125+ @ Test
126+ void whenConversationHistoryHasMultipleNullElements () {
127+ var history = new ArrayList <Message >();
128+ history .add (null );
129+ history .add (null );
130+ history .add (new org .springframework .ai .chat .messages .UserMessage ("Valid message" ));
131+
132+ assertThatThrownBy (() -> DefaultToolExecutionResult .builder ().conversationHistory (history ).build ())
133+ .isInstanceOf (IllegalArgumentException .class )
134+ .hasMessage ("conversationHistory cannot contain null elements" );
135+ }
136+
137+ @ Test
138+ void whenBuilderIsReused () {
139+ var conversationHistory1 = new ArrayList <Message >();
140+ conversationHistory1 .add (new org .springframework .ai .chat .messages .UserMessage ("Message 1" ));
141+
142+ var conversationHistory2 = new ArrayList <Message >();
143+ conversationHistory2 .add (new org .springframework .ai .chat .messages .UserMessage ("Message 2" ));
144+
145+ var builder = DefaultToolExecutionResult .builder ();
146+
147+ var result1 = builder .conversationHistory (conversationHistory1 ).returnDirect (true ).build ();
148+
149+ var result2 = builder .conversationHistory (conversationHistory2 ).returnDirect (false ).build ();
150+
151+ assertThat (result1 .conversationHistory ()).isEqualTo (conversationHistory1 );
152+ assertThat (result1 .returnDirect ()).isTrue ();
153+ assertThat (result2 .conversationHistory ()).isEqualTo (conversationHistory2 );
154+ assertThat (result2 .returnDirect ()).isFalse ();
155+ }
156+
157+ @ Test
158+ void whenConversationHistoryIsModifiedAfterBuilding () {
159+ var conversationHistory = new ArrayList <Message >();
160+ var originalMessage = new org .springframework .ai .chat .messages .UserMessage ("Original" );
161+ conversationHistory .add (originalMessage );
162+
163+ var result = DefaultToolExecutionResult .builder ().conversationHistory (conversationHistory ).build ();
164+
165+ // Modify the original list after building
166+ conversationHistory .add (new org .springframework .ai .chat .messages .AssistantMessage ("Added later" ));
167+
168+ // The result should reflect the modification if the same list reference is used
169+ // This tests whether the builder stores a reference or creates a copy
170+ assertThat (result .conversationHistory ()).hasSize (2 );
171+ assertThat (result .conversationHistory ().get (0 )).isEqualTo (originalMessage );
172+ }
173+
174+ @ Test
175+ void whenEqualsAndHashCodeAreConsistent () {
176+ var conversationHistory = new ArrayList <Message >();
177+ conversationHistory .add (new org .springframework .ai .chat .messages .UserMessage ("Test message" ));
178+
179+ var result1 = DefaultToolExecutionResult .builder ()
180+ .conversationHistory (conversationHistory )
181+ .returnDirect (true )
182+ .build ();
183+
184+ var result2 = DefaultToolExecutionResult .builder ()
185+ .conversationHistory (conversationHistory )
186+ .returnDirect (true )
187+ .build ();
188+
189+ assertThat (result1 ).isEqualTo (result2 );
190+ assertThat (result1 .hashCode ()).isEqualTo (result2 .hashCode ());
191+ }
192+
62193}
0 commit comments