11"""Tests for auto-disambiguators."""
2+ from dataclasses import dataclass
23from functools import partial
34from typing import Literal , Union
45
78from hypothesis import HealthCheck , assume , given , settings
89
910from cattrs import Converter
10- from cattrs .disambiguators import (
11- create_default_dis_func ,
12- create_uniq_field_dis_func ,
13- is_supported_union ,
14- )
11+ from cattrs .disambiguators import create_default_dis_func , is_supported_union
1512from cattrs .gen import make_dict_structure_fn , override
1613
1714from .untyped import simple_classes
@@ -27,7 +24,7 @@ class A:
2724
2825 with pytest .raises (ValueError ):
2926 # Can't generate for only one class.
30- create_uniq_field_dis_func (c , A )
27+ create_default_dis_func (c , A )
3128
3229 with pytest .raises (ValueError ):
3330 create_default_dis_func (c , A )
@@ -38,7 +35,7 @@ class B:
3835
3936 with pytest .raises (TypeError ):
4037 # No fields on either class.
41- create_uniq_field_dis_func (c , A , B )
38+ create_default_dis_func (c , A , B )
4239
4340 @define
4441 class C :
@@ -50,7 +47,7 @@ class D:
5047
5148 with pytest .raises (TypeError ):
5249 # No unique fields on either class.
53- create_uniq_field_dis_func (c , C , D )
50+ create_default_dis_func (c , C , D )
5451
5552 with pytest .raises (TypeError ):
5653 # No discriminator candidates
@@ -66,7 +63,7 @@ class F:
6663
6764 with pytest .raises (TypeError ):
6865 # no usable non-default attributes
69- create_uniq_field_dis_func (c , E , F )
66+ create_default_dis_func (c , E , F )
7067
7168 @define
7269 class G :
@@ -93,7 +90,7 @@ def test_fallback(cl_and_vals):
9390 class A :
9491 pass
9592
96- fn = create_uniq_field_dis_func (c , A , cl )
93+ fn = create_default_dis_func (c , A , cl )
9794
9895 assert fn ({}) is A
9996 assert fn (asdict (cl (* vals , ** kwargs ))) is cl
@@ -124,7 +121,7 @@ def test_disambiguation(cl_and_vals_a, cl_and_vals_b):
124121 for attr_name in req_b - req_a :
125122 assume (getattr (fields (cl_b ), attr_name ).default is NOTHING )
126123
127- fn = create_uniq_field_dis_func (c , cl_a , cl_b )
124+ fn = create_default_dis_func (c , cl_a , cl_b )
128125
129126 assert fn (asdict (cl_a (* vals_a , ** kwargs_a ))) is cl_a
130127
@@ -271,3 +268,33 @@ class B:
271268
272269 assert converter .structure ({"a" : 1 }, Union [A , B ]) == A (1 )
273270 assert converter .structure ({"b" : 1 }, Union [A , B ]) == B (1 )
271+
272+
273+ def test_dataclasses (converter ):
274+ """The default strategy works for dataclasses too."""
275+
276+ @define
277+ class A :
278+ a : int
279+
280+ @dataclass
281+ class B :
282+ b : int
283+
284+ assert converter .structure ({"a" : 1 }, Union [A , B ]) == A (1 )
285+ assert converter .structure ({"b" : 1 }, Union [A , B ]) == B (1 )
286+
287+
288+ def test_dataclasses_literals (converter ):
289+ """The default strategy works for dataclasses too."""
290+
291+ @define
292+ class A :
293+ a : Literal ["a" ] = "a"
294+
295+ @dataclass
296+ class B :
297+ b : Literal ["b" ]
298+
299+ assert converter .structure ({"a" : "a" }, Union [A , B ]) == A ()
300+ assert converter .structure ({"b" : "b" }, Union [A , B ]) == B ("b" )
0 commit comments