@@ -201,6 +201,50 @@ def test_max_cpu_1
201201 RUBY
202202 end
203203
204+ def test_error_includes_ivar_and_object
205+ obj = Class . new do
206+ def initialize
207+ @unshareable = -> { }
208+ end
209+
210+ def inspect
211+ "#<Unshareable>"
212+ end
213+ end . new
214+ assert_unshareable ( obj , /:ivar, :@unshareable, #<Unshareable>/ )
215+ end
216+
217+ def test_error_includes_array_index
218+ assert_unshareable ( [ 0 , -> { } ] , /:array_at, 1/ )
219+ end
220+
221+ def test_error_includes_hash_key_and_value
222+ assert_unshareable ( { unshareable : -> { } } , /:hash_at, :unshareable, #<Proc:/ )
223+ end
224+
225+ def test_error_includes_hash_unshareable_key
226+ assert_unshareable ( { -> { } => true } , /:hash_key, #<Proc:0x[[:xdigit:]]+ #{ __FILE__ } :#{ __LINE__ } / )
227+ end
228+
229+ def test_error_includes_hash_default
230+ h = Hash . new { }
231+ assert_unshareable ( h , /:hash_default, #<Proc:0x[[:xdigit:]]+ #{ __FILE__ } :#{ __LINE__ - 1 } / )
232+ end
233+
234+ def test_error_includes_proc_self
235+ pr = -> { }
236+ assert_unshareable ( pr , /:proc_self, #<#{ self . class . name } / )
237+ end
238+
239+ def test_error_wraps_freeze_error
240+ obj = Class . new do
241+ undef_method :freeze
242+ end . new
243+ e = assert_unshareable ( obj , /failed to call #freeze/ , exception : Ractor ::Error )
244+ assert_equal NoMethodError , e . cause . class
245+ assert_equal :freeze , e . cause . name
246+ end
247+
204248 def assert_make_shareable ( obj )
205249 refute Ractor . shareable? ( obj ) , "object was already shareable"
206250 Ractor . make_shareable ( obj )
@@ -209,9 +253,10 @@ def assert_make_shareable(obj)
209253
210254 def assert_unshareable ( obj , msg = nil , exception : Ractor ::IsolationError )
211255 refute Ractor . shareable? ( obj ) , "object is already shareable"
212- assert_raise_with_message ( exception , msg ) do
256+ e = assert_raise_with_message ( exception , msg ) do
213257 Ractor . make_shareable ( obj )
214258 end
215259 refute Ractor . shareable? ( obj ) , "despite raising, object became shareable"
260+ e
216261 end
217262end
0 commit comments