@@ -109,6 +109,7 @@ class Obj2:
109109
110110 self .assertEqual (util .get_class_field_type (Obj2 , 'a' , False ), Obj1 )
111111 self .assertIsNone (util .get_class_field_type (Obj2 , 'b' , False ))
112+ self .assertIsNone (util .get_class_field_type (Obj2 , 'b' , True ))
112113
113114 def test_get_class_field_type_optional (self ):
114115 util = testing_clib .DataClassesUtil ()
@@ -121,18 +122,25 @@ class Obj2:
121122 self .assertEqual (util .get_class_field_type (Obj2 , 'a' , False ), Obj1 )
122123 self .assertEqual (util .get_class_field_type (Obj2 , 'b' , False ), Obj1 )
123124
124- def test_get_class_field_list (self ):
125+ def test_get_class_field_list_tuple (self ):
125126 util = testing_clib .DataClassesUtil ()
126127
127128 @dataclasses .dataclass
128129 class Obj2 :
129130 a : list [Obj1 ]
131+ b : tuple [Obj1 , ...]
130132
131133 list_type = util .get_class_field_type (Obj2 , 'a' , False )
134+ tuple_type = util .get_class_field_type (Obj2 , 'b' , False )
132135 self .assertEqual (list_type , list [Obj1 ])
136+ self .assertEqual (tuple_type , tuple [Obj1 , ...])
133137 self .assertEqual (
134138 util .get_class_field_type (list_type , '__items__' , False ), Obj1
135139 )
140+ with self .assertRaisesRegex (ValueError , 'only tuple.T, .... is supported' ):
141+ _ = util .get_class_field_type (tuple [Obj1 , Obj1 ], '__items__' , False )
142+ with self .assertRaisesRegex (ValueError , 'only tuple.T, .... is supported' ):
143+ _ = util .get_class_field_type (tuple [Obj1 ], '__items__' , False )
136144
137145 def test_get_class_field_dict (self ):
138146 util = testing_clib .DataClassesUtil ()
@@ -192,6 +200,21 @@ def test_get_class_field_type_errors(self):
192200 ):
193201 _ = util .get_class_field_type (int , 'a' , False )
194202
203+ with self .assertRaisesRegex (
204+ ValueError , 'expected dict class; got instead: list.int.'
205+ ):
206+ _ = util .get_class_field_type (list [int ], '__keys__' , False )
207+
208+ with self .assertRaisesRegex (
209+ ValueError , 'expected dict class; got instead: list.int.'
210+ ):
211+ _ = util .get_class_field_type (list [int ], '__values__' , False )
212+
213+ with self .assertRaisesRegex (
214+ ValueError , 'expected list class; got instead: dict.int. int.'
215+ ):
216+ _ = util .get_class_field_type (dict [int , int ], '__items__' , False )
217+
195218 def test_has_optional_field (self ):
196219 util = testing_clib .DataClassesUtil ()
197220
@@ -205,17 +228,36 @@ class Obj2:
205228 bad_0 : int | Any
206229 bad_1 : int | float | None
207230 bad_2 : None | int
231+ g : int = 1
208232
209233 self .assertTrue (util .has_optional_field (Obj2 , 'a' ))
210234 self .assertFalse (util .has_optional_field (Obj2 , 'b' ))
211235 self .assertTrue (util .has_optional_field (Obj2 , 'c' ))
212- self .assertFalse (util .has_optional_field (Obj2 , 'd' ))
213- self .assertFalse (util .has_optional_field (Obj2 , 'e' ))
214- self .assertFalse (util .has_optional_field (Obj2 , 'f' ))
236+ with self .assertRaisesRegex (
237+ ValueError ,
238+ 'field cannot have missing values: d' ,
239+ ):
240+ _ = util .has_optional_field (Obj2 , 'd' )
241+ with self .assertRaisesRegex (
242+ ValueError ,
243+ 'field cannot have missing values: e' ,
244+ ):
245+ _ = util .has_optional_field (Obj2 , 'e' )
246+ with self .assertRaisesRegex (
247+ ValueError ,
248+ 'field cannot have missing values: f' ,
249+ ):
250+ _ = util .has_optional_field (Obj2 , 'f' )
251+ with self .assertRaisesRegex (
252+ ValueError ,
253+ 'field cannot have missing values: g' ,
254+ ):
255+ _ = util .has_optional_field (Obj2 , 'g' )
215256 self .assertFalse (util .has_optional_field (int , 'non_existent_field' ))
216257 with self .assertRaisesRegex (
217258 ValueError ,
218- 'only unions `SomeType | None` are supported ; got instead: int | Any' ,
259+ 'only unions `SomeType | None` are supported ; got instead: int |'
260+ ' typing.Any' ,
219261 ):
220262 _ = util .has_optional_field (Obj2 , 'bad_0' )
221263
@@ -237,13 +279,6 @@ def test_create_class_instance_kwargs(self):
237279 obj = util .create_class_instance_kwargs (Obj1 , ['a' , 'b' ], [123 , 'abc' ])
238280 self .assertEqual (obj , Obj1 (a = 123 , b = 'abc' ))
239281
240- def test_create_class_instance_args (self ):
241- util = testing_clib .DataClassesUtil ()
242- obj = util .create_class_instance_args (list , [1 , 2 , 3 ])
243- self .assertEqual (obj , list ([1 , 2 , 3 ]))
244- obj2 = util .create_class_instance_args (tuple , [1 , 2 , 3 ])
245- self .assertEqual (obj2 , tuple ([1 , 2 , 3 ]))
246-
247282 def test_get_simple_namespace_class (self ):
248283 util = testing_clib .DataClassesUtil ()
249284 simple_namespace_class = util .get_simple_namespace_class ()
0 commit comments