@@ -3308,4 +3308,101 @@ class A
33083308 end
33093309 end
33103310 end
3311+
3312+ def test_ruby_attribute_members_untyped
3313+ SignatureManager . new do |manager |
3314+ manager . add_ruby_file ( "attributes.rb" , <<~RUBY )
3315+ class AttributeTest
3316+ attr_reader :name
3317+ attr_writer :age
3318+ attr_accessor :email
3319+ end
3320+ RUBY
3321+
3322+ manager . build do |env |
3323+ builder = DefinitionBuilder . new ( env : env )
3324+
3325+ builder . build_instance ( type_name ( "::AttributeTest" ) ) . tap do |definition |
3326+ # Test attr_reader generates reader method
3327+ assert_method_definition definition . methods [ :name ] , [ "() -> untyped" ] , accessibility : :public
3328+ assert_ivar_definition definition . instance_variables [ :@name ] , "untyped"
3329+
3330+ # Test attr_writer generates writer method
3331+ assert_method_definition definition . methods [ :age= ] , [ "(untyped age) -> untyped" ] , accessibility : :public
3332+ assert_ivar_definition definition . instance_variables [ :@age ] , "untyped"
3333+
3334+ # Test attr_accessor generates both reader and writer methods
3335+ assert_method_definition definition . methods [ :email ] , [ "() -> untyped" ] , accessibility : :public
3336+ assert_method_definition definition . methods [ :email= ] , [ "(untyped email) -> untyped" ] , accessibility : :public
3337+ assert_ivar_definition definition . instance_variables [ :@email ] , "untyped"
3338+ end
3339+ end
3340+ end
3341+ end
3342+
3343+ def test_ruby_attribute_members_typed
3344+ SignatureManager . new do |manager |
3345+ manager . add_ruby_file ( "typed_attributes.rb" , <<~RUBY )
3346+ class TypedAttributeTest
3347+ attr_reader :name #: String
3348+
3349+ attr_writer :age #: Integer
3350+
3351+ attr_accessor :email #: String
3352+ end
3353+ RUBY
3354+
3355+ manager . build do |env |
3356+ builder = DefinitionBuilder . new ( env : env )
3357+
3358+ builder . build_instance ( type_name ( "::TypedAttributeTest" ) ) . tap do |definition |
3359+ # Test typed attr_reader
3360+ assert_method_definition definition . methods [ :name ] , [ "() -> ::String" ] , accessibility : :public
3361+ assert_ivar_definition definition . instance_variables [ :@name ] , "::String"
3362+
3363+ # Test typed attr_writer
3364+ assert_method_definition definition . methods [ :age= ] , [ "(::Integer age) -> ::Integer" ] , accessibility : :public
3365+ assert_ivar_definition definition . instance_variables [ :@age ] , "::Integer"
3366+
3367+ # Test typed attr_accessor
3368+ assert_method_definition definition . methods [ :email ] , [ "() -> ::String" ] , accessibility : :public
3369+ assert_method_definition definition . methods [ :email= ] , [ "(::String email) -> ::String" ] , accessibility : :public
3370+ assert_ivar_definition definition . instance_variables [ :@email ] , "::String"
3371+ end
3372+ end
3373+ end
3374+ end
3375+
3376+
3377+ def test_ruby_attribute_members_multiple_names
3378+ SignatureManager . new do |manager |
3379+ manager . add_ruby_file ( "multiple_attributes.rb" , <<~RUBY )
3380+ class MultipleAttributeTest
3381+ attr_reader :first_name, :last_name #: String
3382+
3383+ attr_accessor :x, :y #: Integer
3384+ end
3385+ RUBY
3386+
3387+ manager . build do |env |
3388+ builder = DefinitionBuilder . new ( env : env )
3389+
3390+ builder . build_instance ( type_name ( "::MultipleAttributeTest" ) ) . tap do |definition |
3391+ # Test multiple attr_reader names
3392+ assert_method_definition definition . methods [ :first_name ] , [ "() -> ::String" ] , accessibility : :public
3393+ assert_method_definition definition . methods [ :last_name ] , [ "() -> ::String" ] , accessibility : :public
3394+ assert_ivar_definition definition . instance_variables [ :@first_name ] , "::String"
3395+ assert_ivar_definition definition . instance_variables [ :@last_name ] , "::String"
3396+
3397+ # Test multiple attr_accessor names
3398+ assert_method_definition definition . methods [ :x ] , [ "() -> ::Integer" ] , accessibility : :public
3399+ assert_method_definition definition . methods [ :x= ] , [ "(::Integer x) -> ::Integer" ] , accessibility : :public
3400+ assert_method_definition definition . methods [ :y ] , [ "() -> ::Integer" ] , accessibility : :public
3401+ assert_method_definition definition . methods [ :y= ] , [ "(::Integer y) -> ::Integer" ] , accessibility : :public
3402+ assert_ivar_definition definition . instance_variables [ :@x ] , "::Integer"
3403+ assert_ivar_definition definition . instance_variables [ :@y ] , "::Integer"
3404+ end
3405+ end
3406+ end
3407+ end
33113408end
0 commit comments