@@ -19,6 +19,7 @@ class Claude::ToolResultTest < ActiveSupport::TestCase
1919
2020 assert_equal :bash , tool_result . tool_name
2121 assert_equal "List files" , tool_result . tool_use_description
22+ assert_equal ( { description : "List files" } , tool_result . tool_use_input )
2223 assert_equal "file1.txt\n file2.txt" , tool_result . content
2324 refute tool_result . is_error
2425 end
@@ -32,6 +33,7 @@ class Claude::ToolResultTest < ActiveSupport::TestCase
3233
3334 assert_equal :unknown , tool_result . tool_name
3435 assert_nil tool_result . tool_use_description
36+ assert_equal ( { } , tool_result . tool_use_input )
3537 end
3638
3739 test "initialize with tool_use without description" do
@@ -85,6 +87,64 @@ class Claude::ToolResultTest < ActiveSupport::TestCase
8587 assert_match ( /error details/ , output )
8688 end
8789
90+ test "error_line strips the tool_use_error wrapper and upcases the tool name" do
91+ tool_use_message = Claude ::Messages ::ToolUseMessage . new (
92+ type : :tool_use ,
93+ hash : { name : "bash" , input : { } } ,
94+ )
95+ tool_result = Claude ::ToolResult . new (
96+ tool_use : tool_use_message ,
97+ content : "<tool_use_error>File has not been read yet.</tool_use_error>" ,
98+ is_error : true ,
99+ )
100+
101+ output = tool_result . send ( :error_line )
102+
103+ assert_equal "BASH ERROR File has not been read yet." , output
104+ end
105+
106+ test "error_line handles nil content gracefully" do
107+ tool_use_message = Claude ::Messages ::ToolUseMessage . new (
108+ type : :tool_use ,
109+ hash : { name : "read" , input : { } } ,
110+ )
111+ tool_result = Claude ::ToolResult . new (
112+ tool_use : tool_use_message ,
113+ content : nil ,
114+ is_error : true ,
115+ )
116+
117+ output = tool_result . send ( :error_line )
118+
119+ assert_equal "READ ERROR" , output
120+ end
121+
122+ test "format error path keeps the full content" do
123+ tool_result = Claude ::ToolResult . new (
124+ tool_use : nil ,
125+ content : "Error: command failed\n at line 3\n exit status 1" ,
126+ is_error : true ,
127+ )
128+
129+ output = tool_result . format
130+
131+ assert_equal "UNKNOWN ERROR Error: command failed\n at line 3\n exit status 1" , output
132+ end
133+
134+ test "format routes errors through the error_line helper" do
135+ tool_result = Claude ::ToolResult . new (
136+ tool_use : nil ,
137+ content : "error details" ,
138+ is_error : true ,
139+ )
140+
141+ tool_result . expects ( :error_line ) . returns ( "ERROR LINE" )
142+
143+ output = tool_result . format
144+
145+ assert_equal "ERROR LINE" , output
146+ end
147+
88148 test "format includes description when present" do
89149 tool_use_message = Claude ::Messages ::ToolUseMessage . new (
90150 type : :tool_use ,
@@ -100,6 +160,109 @@ class Claude::ToolResultTest < ActiveSupport::TestCase
100160
101161 assert_match ( /Run command/ , output )
102162 end
163+
164+ test "ok_line renders a bare OK line when given no parts" do
165+ tool_use_message = Claude ::Messages ::ToolUseMessage . new (
166+ type : :tool_use ,
167+ hash : { name : "bash" , input : { } } ,
168+ )
169+ tool_result = Claude ::ToolResult . new (
170+ tool_use : tool_use_message ,
171+ content : nil ,
172+ is_error : false ,
173+ )
174+
175+ output = tool_result . send ( :ok_line )
176+
177+ assert_equal "BASH OK" , output
178+ end
179+
180+ test "ok_line appends a single part and upcases the tool name" do
181+ tool_use_message = Claude ::Messages ::ToolUseMessage . new (
182+ type : :tool_use ,
183+ hash : { name : "bash" , input : { } } ,
184+ )
185+ tool_result = Claude ::ToolResult . new (
186+ tool_use : tool_use_message ,
187+ content : nil ,
188+ is_error : false ,
189+ )
190+
191+ output = tool_result . send ( :ok_line , "3 files" )
192+
193+ assert_equal "BASH OK 3 files" , output
194+ end
195+
196+ test "ok_line joins multiple parts with a dot separator" do
197+ tool_use_message = Claude ::Messages ::ToolUseMessage . new (
198+ type : :tool_use ,
199+ hash : { name : "bash" , input : { } } ,
200+ )
201+ tool_result = Claude ::ToolResult . new (
202+ tool_use : tool_use_message ,
203+ content : nil ,
204+ is_error : false ,
205+ )
206+
207+ output = tool_result . send ( :ok_line , "3 lines" , "preview text" )
208+
209+ assert_equal "BASH OK 3 lines · preview text" , output
210+ end
211+
212+ test "ok_line drops blank and nil parts before joining" do
213+ tool_use_message = Claude ::Messages ::ToolUseMessage . new (
214+ type : :tool_use ,
215+ hash : { name : "bash" , input : { } } ,
216+ )
217+ tool_result = Claude ::ToolResult . new (
218+ tool_use : tool_use_message ,
219+ content : nil ,
220+ is_error : false ,
221+ )
222+
223+ output = tool_result . send ( :ok_line , "3 lines" , "" , nil )
224+
225+ assert_equal "BASH OK 3 lines" , output
226+ end
227+
228+ test "truncate returns strings within the limit unchanged" do
229+ tool_result = Claude ::ToolResult . new (
230+ tool_use : nil ,
231+ content : nil ,
232+ is_error : false ,
233+ )
234+ string_at_limit = "a" * Claude ::ToolResult ::TRUNCATE_LIMIT
235+
236+ output = tool_result . send ( :truncate , string_at_limit )
237+
238+ assert_equal string_at_limit , output
239+ end
240+
241+ test "truncate cuts longer strings to the limit with an ellipsis" do
242+ tool_result = Claude ::ToolResult . new (
243+ tool_use : nil ,
244+ content : nil ,
245+ is_error : false ,
246+ )
247+ limit = Claude ::ToolResult ::TRUNCATE_LIMIT
248+
249+ output = tool_result . send ( :truncate , "a" * ( limit + 10 ) )
250+
251+ assert_equal "#{ "a" * ( limit - 3 ) } ..." , output
252+ assert_equal limit , output . length
253+ end
254+
255+ test "truncate maps nil to an empty string" do
256+ tool_result = Claude ::ToolResult . new (
257+ tool_use : nil ,
258+ content : nil ,
259+ is_error : false ,
260+ )
261+
262+ output = tool_result . send ( :truncate , nil )
263+
264+ assert_equal "" , output
265+ end
103266 end
104267 end
105268 end
0 commit comments