@@ -55,6 +55,14 @@ module RefinedModule
5555 end
5656 end
5757
58+ def with_untyped_singleton_possible
59+ with_untyped do |untyped |
60+ next if Integer === untyped || Float === untyped || Symbol === untyped
61+ untyped = ::Kernel . instance_method ( :dup ) . bind_call ( untyped ) if ::Kernel . instance_method ( :frozen? ) . bind_call ( untyped )
62+ yield untyped
63+ end
64+ end
65+
5866 def test_op_lt
5967 with Object , Float , Hash do |mod |
6068 assert_send_type '(Module) -> bool?' ,
@@ -1071,72 +1079,191 @@ def foo = 4
10711079 def test_append_features
10721080 assert_visibility :private ,
10731081 Module . new , :append_features
1074- omit 'todo'
1082+
1083+ assert_send_type '(Module) -> Module' ,
1084+ Module . new , :append_features , Module . new
10751085 end
10761086
10771087 def test_const_added
10781088 assert_visibility :private ,
10791089 Module . new , :const_added
1080- omit 'todo'
1090+
1091+ # const_added directly works
1092+ assert_send_type '(Symbol) -> void' ,
1093+ Module . new , :const_added , :foo
1094+
1095+ # Setting the constant also works
1096+ const_added_module = proc do
1097+ assert_type_meth = method ( :assert_type )
1098+ mod = Module . new do
1099+ define_singleton_method :const_added do |name |
1100+ assert_type_meth . call ( 'Symbol' , name )
1101+ end
1102+ end
1103+ end
1104+
1105+ # Make sure the `::` assignment passes a symbol
1106+ eval <<~EOS
1107+ const_added_module.call()::Foo = 3
1108+ EOS
1109+
1110+ # Make sure that `const_set` also always passes a symbol to the `const_added`
1111+ with_interned :Foo do |name |
1112+ const_added_module . call ( ) . const_set ( name , 2 r)
1113+ end
10811114 end
10821115
10831116 def test_extend_object
10841117 assert_visibility :private ,
10851118 Module . new , :extend_object
1086- omit 'todo'
1119+
1120+ with_untyped_singleton_possible do |untyped |
1121+ assert_send_type '[T] (T) -> T' ,
1122+ Module . new , :extend_object , untyped
1123+ end
1124+
1125+ # No need to make sure `object.extend(module)` works because the signature
1126+ # is `(T) -> T`, which means it can take any type (and we aren't testing the
1127+ # return value of `extend`)
10871128 end
10881129
10891130 def test_extended
10901131 assert_visibility :private ,
10911132 Module . new , :extended
1092- omit 'todo'
1133+
1134+ with_untyped_singleton_possible do |untyped |
1135+ assert_send_type '(untyped) -> void' ,
1136+ Module . new , :extended , untyped
1137+ end
1138+
1139+ # No need to make sure `object.extend(module)` works because the signature
1140+ # is `(untyped) -> void`, which means it can take any type, and we dont care
1141+ # about the return value.
10931142 end
10941143
10951144 def test_included
10961145 assert_visibility :private ,
10971146 Module . new , :included
1098- omit 'todo'
1147+
1148+ assert_send_type '(Module) -> void' ,
1149+ Module . new , :included , Module . new
1150+
1151+ assert_send_type '(Module) -> void' ,
1152+ Module . new , :included , Class . new
10991153 end
11001154
11011155 def test_method_added
11021156 assert_visibility :private ,
11031157 Module . new , :method_added
1104- omit 'todo'
1158+
1159+
1160+ # method_added directly works
1161+ assert_send_type '(Symbol) -> void' ,
1162+ Module . new , :method_added , :foo
1163+
1164+ # make sure using `with_intern` always passes a symbol
1165+ assert_type_meth = method ( :assert_type )
1166+ mod = Module . new do
1167+ define_singleton_method :method_added do |name |
1168+ assert_type_meth . call ( 'Symbol' , name )
1169+ end
1170+ end
1171+
1172+ with_interned :foo do |name |
1173+ mod . define_method ( :foo ) { }
1174+ mod . undef_method ( :foo ) # avoid warnings
1175+ end
11051176 end
11061177
11071178 def test_method_removed
11081179 assert_visibility :private ,
11091180 Module . new , :method_removed
1110- omit 'todo'
1181+
1182+ # method_removed directly works
1183+ assert_send_type '(Symbol) -> void' ,
1184+ Module . new , :method_removed , :foo
1185+
1186+ # make sure using `with_intern` always passes a symbol
1187+ assert_type_meth = method ( :assert_type )
1188+ mod = Module . new do
1189+ define_singleton_method :method_removed do |name |
1190+ assert_type_meth . call ( 'Symbol' , name )
1191+ end
1192+ end
1193+
1194+ with_interned :foo do |name |
1195+ mod . define_method ( :foo ) { }
1196+ mod . remove_method ( name )
1197+ end
11111198 end
11121199
11131200 def test_method_undefined
11141201 assert_visibility :private ,
11151202 Module . new , :method_undefined
1116- omit 'todo'
1203+
1204+ # method_undefined directly works
1205+ assert_send_type '(Symbol) -> void' ,
1206+ Module . new , :method_undefined , :foo
1207+
1208+ # make sure using `with_intern` always passes a symbol
1209+ assert_type_meth = method ( :assert_type )
1210+ mod = Module . new do
1211+ define_singleton_method :method_undefined do |name |
1212+ assert_type_meth . call ( 'Symbol' , name )
1213+ end
1214+ end
1215+
1216+ with_interned :foo do |name |
1217+ mod . define_method ( :foo ) { }
1218+ mod . undef_method ( name )
1219+ end
11171220 end
11181221
11191222 def test_prepend_features
11201223 assert_visibility :private ,
11211224 Module . new , :prepend_features
1122- omit 'todo'
1225+
1226+ assert_send_type '(Module) -> Module' ,
1227+ Module . new , :prepend_features , Module . new
1228+
1229+ assert_send_type '(Module) -> Module' ,
1230+ Module . new , :prepend_features , Class . new
11231231 end
11241232
11251233 def test_prepended
11261234 assert_visibility :private ,
11271235 Module . new , :prepended
1128- omit 'todo'
1236+
1237+ assert_send_type '(Module) -> void' ,
1238+ Module . new , :prepended , Module . new
1239+
1240+ assert_send_type '(Module) -> void' ,
1241+ Module . new , :prepended , Class . new
11291242 end
11301243
11311244 def test_remove_const
11321245 assert_visibility :private ,
11331246 Module . new , :remove_const
1134- omit 'todo'
1247+
1248+ with_interned :Foo do |name |
1249+ mod = Module . new
1250+ mod . const_set :Foo , 1 r
1251+
1252+ assert_send_type '(interned) -> untyped' ,
1253+ mod , :remove_const , name
1254+ end
1255+ end
1256+
1257+
1258+ module UsingModule
1259+ UsingReturnValue = using Module . new
11351260 end
11361261
11371262 def test_using
11381263 assert_visibility :private ,
11391264 Module . new , :using
1140- omit 'todo'
1265+
1266+ # Cant actually test `using` in modules, so this is the best we got
1267+ assert_type 'Module' , UsingModule ::UsingModule
11411268 end
11421269end
0 commit comments