diff --git a/docs/examples/model_config_smart_union_off.py b/docs/examples/model_config_smart_union_off.py
new file mode 100644
--- /dev/null
+++ b/docs/examples/model_config_smart_union_off.py
@@ -0,0 +1,19 @@
+from typing import Union
+
+from pydantic import BaseModel
+
+
+class Foo(BaseModel):
+    pass
+
+
+class Bar(BaseModel):
+    pass
+
+
+class Model(BaseModel):
+    x: Union[str, int]
+    y: Union[Foo, Bar]
+
+
+print(Model(x=1, y=Bar()))
diff --git a/docs/examples/model_config_smart_union_on.py b/docs/examples/model_config_smart_union_on.py
new file mode 100644
--- /dev/null
+++ b/docs/examples/model_config_smart_union_on.py
@@ -0,0 +1,22 @@
+from typing import Union
+
+from pydantic import BaseModel
+
+
+class Foo(BaseModel):
+    pass
+
+
+class Bar(BaseModel):
+    pass
+
+
+class Model(BaseModel):
+    x: Union[str, int]
+    y: Union[Foo, Bar]
+
+    class Config:
+        smart_union = True
+
+
+print(Model(x=1, y=Bar()))
diff --git a/docs/examples/model_config_smart_union_on_edge_case.py b/docs/examples/model_config_smart_union_on_edge_case.py
new file mode 100644
--- /dev/null
+++ b/docs/examples/model_config_smart_union_on_edge_case.py
@@ -0,0 +1,14 @@
+from typing import List, Union
+
+from pydantic import BaseModel
+
+
+class Model(BaseModel, smart_union=True):
+    x: Union[List[str], List[int]]
+
+
+# Expected coercion
+print(Model(x=[1, '2']))
+
+# Unexpected coercion
+print(Model(x=[1, 2]))
diff --git a/pydantic/config.py b/pydantic/config.py
--- a/pydantic/config.py
+++ b/pydantic/config.py
@@ -63,8 +63,10 @@ class BaseConfig:
     json_encoders: Dict[Type[Any], AnyCallable] = {}
     underscore_attrs_are_private: bool = False
 
-    # Whether or not inherited models as fields should be reconstructed as base model
+    # whether inherited models as fields should be reconstructed as base model
     copy_on_model_validation: bool = True
+    # whether `Union` should check all allowed types before even trying to coerce
+    smart_union: bool = False
 
     @classmethod
     def get_field_info(cls, name: str) -> Dict[str, Any]:
diff --git a/pydantic/env_settings.py b/pydantic/env_settings.py
--- a/pydantic/env_settings.py
+++ b/pydantic/env_settings.py
@@ -6,7 +6,7 @@
 from .config import BaseConfig, Extra
 from .fields import ModelField
 from .main import BaseModel
-from .typing import StrPath, display_as_type, get_origin, is_union_origin
+from .typing import StrPath, display_as_type, get_origin, is_union
 from .utils import deep_update, path_type, sequence_like
 
 env_file_sentinel = str(object())
@@ -175,9 +175,7 @@ def __call__(self, settings: BaseSettings) -> Dict[str, Any]:
                 except ValueError as e:
                     raise SettingsError(f'error parsing JSON for "{env_name}"') from e
             elif (
-                is_union_origin(get_origin(field.type_))
-                and field.sub_fields
-                and any(f.is_complex() for f in field.sub_fields)
+                is_union(get_origin(field.type_)) and field.sub_fields and any(f.is_complex() for f in field.sub_fields)
             ):
                 try:
                     env_val = settings.__config__.json_loads(env_val)
diff --git a/pydantic/fields.py b/pydantic/fields.py
--- a/pydantic/fields.py
+++ b/pydantic/fields.py
@@ -42,7 +42,7 @@
     is_new_type,
     is_none_type,
     is_typeddict,
-    is_union_origin,
+    is_union,
     new_type_supertype,
 )
 from .utils import PyObjectStr, Representation, ValueItems, lenient_issubclass, sequence_like, smart_deepcopy
@@ -560,7 +560,7 @@ def _type_analysis(self) -> None:  # noqa: C901 (ignore complexity)
             return
         if origin is Callable:
             return
-        if is_union_origin(origin):
+        if is_union(origin):
             types_ = []
             for type_ in get_args(self.type_):
                 if type_ is NoneType:
@@ -935,6 +935,35 @@ def _validate_singleton(
     ) -> 'ValidateReturn':
         if self.sub_fields:
             errors = []
+
+            if self.model_config.smart_union and is_union(get_origin(self.type_)):
+                # 1st pass: check if the value is an exact instance of one of the Union types
+                # (e.g. to avoid coercing a bool into an int)
+                for field in self.sub_fields:
+                    if v.__class__ is field.outer_type_:
+                        return v, None
+
+                # 2nd pass: check if the value is an instance of any subclass of the Union types
+                for field in self.sub_fields:
+                    # This whole logic will be improved later on to support more complex `isinstance` checks
+                    # It will probably be done once a strict mode is added and be something like:
+                    # ```
+                    #     value, error = field.validate(v, values, strict=True)
+                    #     if error is None:
+                    #         return value, None
+                    # ```
+                    try:
+                        if isinstance(v, field.outer_type_):
+                            return v, None
+                    except TypeError:
+                        # compound type
+                        if isinstance(v, get_origin(field.outer_type_)):
+                            value, error = field.validate(v, values, loc=loc, cls=cls)
+                            if not error:
+                                return value, None
+
+            # 1st pass by default or 3rd pass with `smart_union` enabled:
+            # check if the value can be coerced into one of the Union types
             for field in self.sub_fields:
                 value, error = field.validate(v, values, loc=loc, cls=cls)
                 if error:
diff --git a/pydantic/main.py b/pydantic/main.py
--- a/pydantic/main.py
+++ b/pydantic/main.py
@@ -39,7 +39,7 @@
     get_origin,
     is_classvar,
     is_namedtuple,
-    is_union_origin,
+    is_union,
     resolve_annotations,
     update_model_forward_refs,
 )
@@ -191,7 +191,7 @@ def is_untouched(v: Any) -> bool:
                 elif is_valid_field(ann_name):
                     validate_field_name(bases, ann_name)
                     value = namespace.get(ann_name, Undefined)
-                    allowed_types = get_args(ann_type) if is_union_origin(get_origin(ann_type)) else (ann_type,)
+                    allowed_types = get_args(ann_type) if is_union(get_origin(ann_type)) else (ann_type,)
                     if (
                         is_untouched(value)
                         and ann_type != PyObject
diff --git a/pydantic/schema.py b/pydantic/schema.py
--- a/pydantic/schema.py
+++ b/pydantic/schema.py
@@ -72,7 +72,7 @@
     is_literal_type,
     is_namedtuple,
     is_none_type,
-    is_union_origin,
+    is_union,
 )
 from .utils import ROOT_KEY, get_model, lenient_issubclass, sequence_like
 
@@ -995,7 +995,7 @@ def go(type_: Any) -> Type[Any]:
 
             if origin is Annotated:
                 return go(args[0])
-            if is_union_origin(origin):
+            if is_union(origin):
                 return Union[tuple(go(a) for a in args)]  # type: ignore
 
             if issubclass(origin, List) and (field_info.min_items is not None or field_info.max_items is not None):
diff --git a/pydantic/typing.py b/pydantic/typing.py
--- a/pydantic/typing.py
+++ b/pydantic/typing.py
@@ -193,7 +193,7 @@ def get_args(tp: Type[Any]) -> Tuple[Any, ...]:
 
 if sys.version_info < (3, 10):
 
-    def is_union_origin(tp: Type[Any]) -> bool:
+    def is_union(tp: Type[Any]) -> bool:
         return tp is Union
 
     WithArgsTypes = (TypingGenericAlias,)
@@ -202,8 +202,8 @@ def is_union_origin(tp: Type[Any]) -> bool:
     import types
     import typing
 
-    def is_union_origin(origin: Type[Any]) -> bool:
-        return origin is Union or origin is types.UnionType  # noqa: E721
+    def is_union(tp: Type[Any]) -> bool:
+        return tp is Union or tp is types.UnionType  # noqa: E721
 
     WithArgsTypes = (typing._GenericAlias, types.GenericAlias, types.UnionType)
 
@@ -269,7 +269,7 @@ def is_union_origin(origin: Type[Any]) -> bool:
     'get_origin',
     'typing_base',
     'get_all_type_hints',
-    'is_union_origin',
+    'is_union',
     'StrPath',
 )
 

diff --git a/tests/test_types.py b/tests/test_types.py
--- a/tests/test_types.py
+++ b/tests/test_types.py
@@ -22,6 +22,7 @@
     Sequence,
     Set,
     Tuple,
+    Union,
 )
 from uuid import UUID
 
@@ -2838,6 +2839,143 @@ class Model(BaseModel):
     ]
 
 
+def test_default_union_types():
+    class DefaultModel(BaseModel):
+        v: Union[int, bool, str]
+
+    assert DefaultModel(v=True).dict() == {'v': 1}
+    assert DefaultModel(v=1).dict() == {'v': 1}
+    assert DefaultModel(v='1').dict() == {'v': 1}
+
+    # In 3.6, Union[int, bool, str] == Union[int, str]
+    allowed_json_types = ('integer', 'string') if sys.version_info[:2] == (3, 6) else ('integer', 'boolean', 'string')
+
+    assert DefaultModel.schema() == {
+        'title': 'DefaultModel',
+        'type': 'object',
+        'properties': {'v': {'title': 'V', 'anyOf': [{'type': t} for t in allowed_json_types]}},
+        'required': ['v'],
+    }
+
+
+def test_smart_union_types():
+    class SmartModel(BaseModel):
+        v: Union[int, bool, str]
+
+        class Config:
+            smart_union = True
+
+    assert SmartModel(v=1).dict() == {'v': 1}
+    assert SmartModel(v=True).dict() == {'v': True}
+    assert SmartModel(v='1').dict() == {'v': '1'}
+
+    # In 3.6, Union[int, bool, str] == Union[int, str]
+    allowed_json_types = ('integer', 'string') if sys.version_info[:2] == (3, 6) else ('integer', 'boolean', 'string')
+
+    assert SmartModel.schema() == {
+        'title': 'SmartModel',
+        'type': 'object',
+        'properties': {'v': {'title': 'V', 'anyOf': [{'type': t} for t in allowed_json_types]}},
+        'required': ['v'],
+    }
+
+
+def test_default_union_class():
+    class A(BaseModel):
+        x: str
+
+    class B(BaseModel):
+        x: str
+
+    class Model(BaseModel):
+        y: Union[A, B]
+
+    assert isinstance(Model(y=A(x='a')).y, A)
+    # `B` instance is coerced to `A`
+    assert isinstance(Model(y=B(x='b')).y, A)
+
+
+def test_smart_union_class():
+    class A(BaseModel):
+        x: str
+
+    class B(BaseModel):
+        x: str
+
+    class Model(BaseModel):
+        y: Union[A, B]
+
+        class Config:
+            smart_union = True
+
+    assert isinstance(Model(y=A(x='a')).y, A)
+    assert isinstance(Model(y=B(x='b')).y, B)
+
+
+def test_default_union_subclass():
+    class MyStr(str):
+        ...
+
+    class Model(BaseModel):
+        x: Union[int, str]
+
+    assert Model(x=MyStr('1')).x == 1
+
+
+def test_smart_union_subclass():
+    class MyStr(str):
+        ...
+
+    class Model(BaseModel):
+        x: Union[int, str]
+
+        class Config:
+            smart_union = True
+
+    assert Model(x=MyStr('1')).x == '1'
+
+
+def test_default_union_compound_types():
+    class Model(BaseModel):
+        values: Union[Dict[str, str], List[str]]
+
+    assert Model(values={'L': '1'}).dict() == {'values': {'L': '1'}}
+    assert Model(values=['L1']).dict() == {'values': {'L': '1'}}  # dict(['L1']) == {'L': '1'}
+
+
+def test_smart_union_compound_types():
+    class Model(BaseModel):
+        values: Union[Dict[str, str], List[str], Dict[str, List[str]]]
+
+        class Config:
+            smart_union = True
+
+    assert Model(values={'L': '1'}).dict() == {'values': {'L': '1'}}
+    assert Model(values=['L1']).dict() == {'values': ['L1']}
+    assert Model(values=('L1',)).dict() == {'values': {'L': '1'}}  # expected coercion into first dict if not a list
+    assert Model(values={'x': ['pika']}) == {'values': {'x': ['pika']}}
+    assert Model(values={'x': ('pika',)}).dict() == {'values': {'x': ['pika']}}
+    with pytest.raises(ValidationError) as e:
+        Model(values={'x': {'a': 'b'}})
+    assert e.value.errors() == [
+        {'loc': ('values', 'x'), 'msg': 'str type expected', 'type': 'type_error.str'},
+        {'loc': ('values',), 'msg': 'value is not a valid list', 'type': 'type_error.list'},
+        {'loc': ('values', 'x'), 'msg': 'value is not a valid list', 'type': 'type_error.list'},
+    ]
+
+
+def test_smart_union_compouned_types_edge_case():
+    """For now, `smart_union` does not support well compound types"""
+
+    class Model(BaseModel, smart_union=True):
+        x: Union[List[str], List[int]]
+
+    # should consider [1, 2] valid and not coerce once `smart_union` is improved
+    assert Model(x=[1, 2]).x == ['1', '2']
+    # still coerce if needed
+    assert Model(x=[1, '2']).x == ['1', '2']
+
+
 @pytest.mark.parametrize(
     'value,result',
     (

Wrong assignement of values in `Union[Foo, List[Foo]]`
### Checks

* [x] I added a descriptive title to this issue
* [x] I have searched (google, github) for similar issues and couldn't find anything
* [x] I have read and followed [the docs](https://pydantic-docs.helpmanual.io/) and still think this is a bug

# Bug

When validating a model that allows either a single object `Foo` or a list of `Foo` objects, the wrong values are assigned. The key of the second parameter is assigned as value of the first parameter (which is a string).

Output of `python -c "import pydantic.utils; print(pydantic.utils.version_info())"`:
```
             pydantic version: 1.8.2
            pydantic compiled: True
                 install path: /home/anaconda3/envs/py38/lib/python3.8/site-packages/pydantic
               python version: 3.8.5 (default, Sep  4 2020, 07:30:14)  [GCC 7.3.0]
                     platform: Linux-5.11.0-38-generic-x86_64-with-glibc2.10
     optional deps. installed: ['typing-extensions']
```

The following minimal example repruduces the bug: 

```py
from pydantic import BaseModel, Field
from typing import List, Optional, Union


class Foo(BaseModel):
    a: str = Field(
        ...,
    )
    b: Optional[float]


class Bar(BaseModel):
    foo: Union[Foo, List[Foo]]


bar = {
    "foo": [
        {
            "a": "some string",
            "b": 1.0
        },
        {
            "a": "another string",
            "b": 2.0
        }
    ]
}

a = Bar(**bar)

print(a)
```

- Output: `foo=Foo(a='b', b=None)`
- Expected Output: `foo=[Foo(a='some string', b=1.0), Foo(a='another string', b=2.0)]`

I am not sure if this is related somehow to  #2092


tests/test_types.py::test_smart_union_types tests/test_types.py::test_smart_union_class tests/test_types.py::test_smart_union_subclass tests/test_types.py::test_smart_union_compound_types tests/test_types.py::test_smart_union_compouned_types_edge_case
tests/test_types.py::test_constrained_bytes_good tests/test_types.py::test_constrained_bytes_default tests/test_types.py::test_constrained_bytes_too_long tests/test_types.py::test_constrained_bytes_lower_enabled tests/test_types.py::test_constrained_bytes_lower_disabled tests/test_types.py::test_constrained_bytes_strict_true tests/test_types.py::test_constrained_bytes_strict_false tests/test_types.py::test_constrained_bytes_strict_default tests/test_types.py::test_constrained_list_good tests/test_types.py::test_constrained_list_default tests/test_types.py::test_constrained_list_too_long tests/test_types.py::test_constrained_list_too_short tests/test_types.py::test_constrained_list_optional tests/test_types.py::test_constrained_list_constraints tests/test_types.py::test_constrained_list_item_type_fails tests/test_types.py::test_conlist tests/test_types.py::test_conlist_wrong_type_default tests/test_types.py::test_constrained_set_good tests/test_types.py::test_constrained_set_default tests/test_types.py::test_constrained_set_default_invalid tests/test_types.py::test_constrained_set_too_long tests/test_types.py::test_constrained_set_too_short tests/test_types.py::test_constrained_set_optional tests/test_types.py::test_constrained_set_constraints tests/test_types.py::test_constrained_set_item_type_fails tests/test_types.py::test_conset tests/test_types.py::test_conset_not_required tests/test_types.py::test_constrained_str_good tests/test_types.py::test_constrained_str_default tests/test_types.py::test_constrained_str_too_long tests/test_types.py::test_constrained_str_lower_enabled tests/test_types.py::test_constrained_str_lower_disabled tests/test_types.py::test_constrained_str_max_length_0 tests/test_types.py::test_module_import tests/test_types.py::test_pyobject_none tests/test_types.py::test_pyobject_callable tests/test_types.py::test_default_validators[bool_check-True-True0] tests/test_types.py::test_default_validators[bool_check-1-True0] tests/test_types.py::test_default_validators[bool_check-y-True] tests/test_types.py::test_default_validators[bool_check-Y-True] tests/test_types.py::test_default_validators[bool_check-yes-True] tests/test_types.py::test_default_validators[bool_check-Yes-True] tests/test_types.py::test_default_validators[bool_check-YES-True] tests/test_types.py::test_default_validators[bool_check-true-True] tests/test_types.py::test_default_validators[bool_check-True-True1] tests/test_types.py::test_default_validators[bool_check-TRUE-True0] tests/test_types.py::test_default_validators[bool_check-on-True] tests/test_types.py::test_default_validators[bool_check-On-True] tests/test_types.py::test_default_validators[bool_check-ON-True] tests/test_types.py::test_default_validators[bool_check-1-True1] tests/test_types.py::test_default_validators[bool_check-t-True] tests/test_types.py::test_default_validators[bool_check-T-True] tests/test_types.py::test_default_validators[bool_check-TRUE-True1] tests/test_types.py::test_default_validators[bool_check-False-False0] tests/test_types.py::test_default_validators[bool_check-0-False0] tests/test_types.py::test_default_validators[bool_check-n-False] tests/test_types.py::test_default_validators[bool_check-N-False] tests/test_types.py::test_default_validators[bool_check-no-False] tests/test_types.py::test_default_validators[bool_check-No-False] tests/test_types.py::test_default_validators[bool_check-NO-False] tests/test_types.py::test_default_validators[bool_check-false-False] tests/test_types.py::test_default_validators[bool_check-False-False1] tests/test_types.py::test_default_validators[bool_check-FALSE-False0] tests/test_types.py::test_default_validators[bool_check-off-False] tests/test_types.py::test_default_validators[bool_check-Off-False] tests/test_types.py::test_default_validators[bool_check-OFF-False] tests/test_types.py::test_default_validators[bool_check-0-False1] tests/test_types.py::test_default_validators[bool_check-f-False] tests/test_types.py::test_default_validators[bool_check-F-False] tests/test_types.py::test_default_validators[bool_check-FALSE-False1] tests/test_types.py::test_default_validators[bool_check-None-ValidationError] tests/test_types.py::test_default_validators[bool_check--ValidationError] tests/test_types.py::test_default_validators[bool_check-value36-ValidationError] tests/test_types.py::test_default_validators[bool_check-value37-ValidationError] tests/test_types.py::test_default_validators[bool_check-value38-ValidationError] tests/test_types.py::test_default_validators[bool_check-value39-ValidationError] tests/test_types.py::test_default_validators[bool_check-2-ValidationError0] tests/test_types.py::test_default_validators[bool_check-2-ValidationError1] tests/test_types.py::test_default_validators[bool_check-2-ValidationError2] tests/test_types.py::test_default_validators[bool_check-\x81-ValidationError] tests/test_types.py::test_default_validators[bool_check-value44-ValidationError] tests/test_types.py::test_default_validators[str_check-s-s0] tests/test_types.py::test_default_validators[str_check- tests/test_types.py::test_default_validators[str_check-s-s1] tests/test_types.py::test_default_validators[str_check-1-1] tests/test_types.py::test_default_validators[str_check-xxxxxxxxxxx-ValidationError0] tests/test_types.py::test_default_validators[str_check-xxxxxxxxxxx-ValidationError1] tests/test_types.py::test_default_validators[bytes_check-s-s0] tests/test_types.py::test_default_validators[bytes_check- tests/test_types.py::test_default_validators[bytes_check-s-s1] tests/test_types.py::test_default_validators[bytes_check-1-1] tests/test_types.py::test_default_validators[bytes_check-value57-xx] tests/test_types.py::test_default_validators[bytes_check-True-True] tests/test_types.py::test_default_validators[bytes_check-False-False] tests/test_types.py::test_default_validators[bytes_check-value60-ValidationError] tests/test_types.py::test_default_validators[bytes_check-xxxxxxxxxxx-ValidationError0] tests/test_types.py::test_default_validators[bytes_check-xxxxxxxxxxx-ValidationError1] tests/test_types.py::test_default_validators[int_check-1-10] tests/test_types.py::test_default_validators[int_check-1.9-1] tests/test_types.py::test_default_validators[int_check-1-11] tests/test_types.py::test_default_validators[int_check-1.9-ValidationError] tests/test_types.py::test_default_validators[int_check-1-12] tests/test_types.py::test_default_validators[int_check-12-120] tests/test_types.py::test_default_validators[int_check-12-121] tests/test_types.py::test_default_validators[int_check-12-122] tests/test_types.py::test_default_validators[float_check-1-1.00] tests/test_types.py::test_default_validators[float_check-1.0-1.00] tests/test_types.py::test_default_validators[float_check-1.0-1.01] tests/test_types.py::test_default_validators[float_check-1-1.01] tests/test_types.py::test_default_validators[float_check-1.0-1.02] tests/test_types.py::test_default_validators[float_check-1-1.02] tests/test_types.py::test_default_validators[uuid_check-ebcdab58-6eb8-46fb-a190-d07a33e9eac8-result77] tests/test_types.py::test_default_validators[uuid_check-value78-result78] tests/test_types.py::test_default_validators[uuid_check-ebcdab58-6eb8-46fb-a190-d07a33e9eac8-result79] tests/test_types.py::test_default_validators[uuid_check-\x124Vx\x124Vx\x124Vx\x124Vx-result80] tests/test_types.py::test_default_validators[uuid_check-ebcdab58-6eb8-46fb-a190--ValidationError] tests/test_types.py::test_default_validators[uuid_check-123-ValidationError] tests/test_types.py::test_default_validators[decimal_check-42.24-result83] tests/test_types.py::test_default_validators[decimal_check-42.24-result84] tests/test_types.py::test_default_validators[decimal_check-42.24-result85] tests/test_types.py::test_default_validators[decimal_check- tests/test_types.py::test_default_validators[decimal_check-value87-result87] tests/test_types.py::test_default_validators[decimal_check-not tests/test_types.py::test_default_validators[decimal_check-NaN-ValidationError] tests/test_types.py::test_string_too_long tests/test_types.py::test_string_too_short tests/test_types.py::test_datetime_successful tests/test_types.py::test_datetime_errors tests/test_types.py::test_enum_successful tests/test_types.py::test_enum_fails tests/test_types.py::test_int_enum_successful_for_str_int tests/test_types.py::test_enum_type tests/test_types.py::test_int_enum_type tests/test_types.py::test_string_success tests/test_types.py::test_string_fails tests/test_types.py::test_dict tests/test_types.py::test_list_success[value0-result0] tests/test_types.py::test_list_success[value1-result1] tests/test_types.py::test_list_success[value2-result2] tests/test_types.py::test_list_success[<genexpr>-result3] tests/test_types.py::test_list_success[value4-result4] tests/test_types.py::test_list_fails[1230] tests/test_types.py::test_list_fails[1231] tests/test_types.py::test_ordered_dict tests/test_types.py::test_tuple_success[value0-result0] tests/test_types.py::test_tuple_success[value1-result1] tests/test_types.py::test_tuple_success[value2-result2] tests/test_types.py::test_tuple_success[<genexpr>-result3] tests/test_types.py::test_tuple_success[value4-result4] tests/test_types.py::test_tuple_fails[1230] tests/test_types.py::test_tuple_fails[1231] tests/test_types.py::test_tuple_variable_len_success[value0-int-result0] tests/test_types.py::test_tuple_variable_len_success[value1-int-result1] tests/test_types.py::test_tuple_variable_len_success[<genexpr>-int-result2] tests/test_types.py::test_tuple_variable_len_success[value3-str-result3] tests/test_types.py::test_tuple_variable_len_fails[value0-str-exc0] tests/test_types.py::test_tuple_variable_len_fails[value1-str-exc1] tests/test_types.py::test_set_success[value0-result0] tests/test_types.py::test_set_success[value1-result1] tests/test_types.py::test_set_success[value2-result2] tests/test_types.py::test_set_success[value3-result3] tests/test_types.py::test_set_fails[1230] tests/test_types.py::test_set_fails[1231] tests/test_types.py::test_list_type_fails tests/test_types.py::test_set_type_fails tests/test_types.py::test_sequence_success[int-value0-result0] tests/test_types.py::test_sequence_success[int-value1-result1] tests/test_types.py::test_sequence_success[int-value2-result2] tests/test_types.py::test_sequence_success[float-value3-result3] tests/test_types.py::test_sequence_success[cls4-value4-result4] tests/test_types.py::test_sequence_success[cls5-value5-result5] tests/test_types.py::test_sequence_generator_success[int-<genexpr>-result0] tests/test_types.py::test_sequence_generator_success[float-<genexpr>-result1] tests/test_types.py::test_sequence_generator_success[str-<genexpr>-result2] tests/test_types.py::test_infinite_iterable tests/test_types.py::test_invalid_iterable tests/test_types.py::test_infinite_iterable_validate_first tests/test_types.py::test_sequence_generator_fails[int-<genexpr>-errors0] tests/test_types.py::test_sequence_generator_fails[float-<genexpr>-errors1] tests/test_types.py::test_sequence_fails[int-value0-errors0] tests/test_types.py::test_sequence_fails[int-value1-errors1] tests/test_types.py::test_sequence_fails[float-value2-errors2] tests/test_types.py::test_sequence_fails[float-value3-errors3] tests/test_types.py::test_sequence_fails[float-value4-errors4] tests/test_types.py::test_sequence_fails[cls5-value5-errors5] tests/test_types.py::test_sequence_fails[cls6-value6-errors6] tests/test_types.py::test_sequence_fails[cls7-value7-errors7] tests/test_types.py::test_int_validation tests/test_types.py::test_float_validation tests/test_types.py::test_strict_bytes tests/test_types.py::test_strict_bytes_subclass tests/test_types.py::test_strict_str tests/test_types.py::test_strict_str_subclass tests/test_types.py::test_strict_bool tests/test_types.py::test_strict_int tests/test_types.py::test_strict_int_subclass tests/test_types.py::test_strict_float tests/test_types.py::test_strict_float_subclass tests/test_types.py::test_bool_unhashable_fails tests/test_types.py::test_uuid_error tests/test_types.py::test_uuid_validation tests/test_types.py::test_anystr_strip_whitespace_enabled tests/test_types.py::test_anystr_strip_whitespace_disabled tests/test_types.py::test_anystr_lower_enabled tests/test_types.py::test_anystr_lower_disabled tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value0-result0] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value1-result1] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value2-result2] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value3-result3] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value4-result4] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value5-result5] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value6-result6] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value7-result7] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value8-result8] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value9-result9] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value10-result10] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value11-result11] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value12-result12] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value13-result13] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value14-result14] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value15-result15] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value16-result16] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value17-result17] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value18-result18] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value19-result19] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value20-result20] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-NaN-result21] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue--NaN-result22] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-+NaN-result23] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-sNaN-result24] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue--sNaN-result25] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-+sNaN-result26] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-Inf-result27] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue--Inf-result28] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-+Inf-result29] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-Infinity-result30] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue--Infinity-result31] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue--Infinity-result32] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value33-result33] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value34-result34] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value35-result35] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value36-result36] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value37-result37] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value38-result38] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value39-result39] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value40-result40] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value41-result41] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value42-result42] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value43-result43] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value44-result44] tests/test_types.py::test_decimal_validation[ConstrainedDecimalValue-value45-result45] tests/test_types.py::test_path_validation_success[/test/path-result0] tests/test_types.py::test_path_validation_success[value1-result1] tests/test_types.py::test_path_validation_fails tests/test_types.py::test_file_path_validation_success[tests/test_types.py-result0] tests/test_types.py::test_file_path_validation_success[value1-result1] tests/test_types.py::test_file_path_validation_fails[nonexistentfile-errors0] tests/test_types.py::test_file_path_validation_fails[value1-errors1] tests/test_types.py::test_file_path_validation_fails[tests-errors2] tests/test_types.py::test_file_path_validation_fails[value3-errors3] tests/test_types.py::test_directory_path_validation_success[tests-result0] tests/test_types.py::test_directory_path_validation_success[value1-result1] tests/test_types.py::test_directory_path_validation_fails[nonexistentdirectory-errors0] tests/test_types.py::test_directory_path_validation_fails[value1-errors1] tests/test_types.py::test_directory_path_validation_fails[tests/test_types.py-errors2] tests/test_types.py::test_directory_path_validation_fails[value3-errors3] tests/test_types.py::test_number_gt tests/test_types.py::test_number_ge tests/test_types.py::test_number_lt tests/test_types.py::test_number_le tests/test_types.py::test_number_multiple_of_int_valid[10] tests/test_types.py::test_number_multiple_of_int_valid[100] tests/test_types.py::test_number_multiple_of_int_valid[20] tests/test_types.py::test_number_multiple_of_int_invalid[1337] tests/test_types.py::test_number_multiple_of_int_invalid[23] tests/test_types.py::test_number_multiple_of_int_invalid[6] tests/test_types.py::test_number_multiple_of_int_invalid[14] tests/test_types.py::test_number_multiple_of_float_valid[0.2] tests/test_types.py::test_number_multiple_of_float_valid[0.3] tests/test_types.py::test_number_multiple_of_float_valid[0.4] tests/test_types.py::test_number_multiple_of_float_valid[0.5] tests/test_types.py::test_number_multiple_of_float_valid[1] tests/test_types.py::test_number_multiple_of_float_invalid[0.07] tests/test_types.py::test_number_multiple_of_float_invalid[1.27] tests/test_types.py::test_number_multiple_of_float_invalid[1.003] tests/test_types.py::test_bounds_config_exceptions[conint] tests/test_types.py::test_bounds_config_exceptions[confloat] tests/test_types.py::test_bounds_config_exceptions[condecimal] tests/test_types.py::test_new_type_success tests/test_types.py::test_new_type_fails tests/test_types.py::test_valid_simple_json tests/test_types.py::test_invalid_simple_json tests/test_types.py::test_valid_simple_json_bytes tests/test_types.py::test_valid_detailed_json tests/test_types.py::test_invalid_detailed_json_value_error tests/test_types.py::test_valid_detailed_json_bytes tests/test_types.py::test_invalid_detailed_json_type_error tests/test_types.py::test_json_not_str tests/test_types.py::test_json_pre_validator tests/test_types.py::test_json_optional_simple tests/test_types.py::test_json_optional_complex tests/test_types.py::test_json_explicitly_required tests/test_types.py::test_json_no_default tests/test_types.py::test_pattern tests/test_types.py::test_pattern_error tests/test_types.py::test_secretstr tests/test_types.py::test_secretstr_equality tests/test_types.py::test_secretstr_idempotent tests/test_types.py::test_secretstr_error tests/test_types.py::test_secretstr_min_max_length tests/test_types.py::test_secretbytes tests/test_types.py::test_secretbytes_equality tests/test_types.py::test_secretbytes_idempotent tests/test_types.py::test_secretbytes_error tests/test_types.py::test_secretbytes_min_max_length tests/test_types.py::test_secrets_schema[no-constrains-SecretStr] tests/test_types.py::test_secrets_schema[no-constrains-SecretBytes] tests/test_types.py::test_secrets_schema[min-constraint-SecretStr] tests/test_types.py::test_secrets_schema[min-constraint-SecretBytes] tests/test_types.py::test_secrets_schema[max-constraint-SecretStr] tests/test_types.py::test_secrets_schema[max-constraint-SecretBytes] tests/test_types.py::test_secrets_schema[min-max-constraints-SecretStr] tests/test_types.py::test_secrets_schema[min-max-constraints-SecretBytes] tests/test_types.py::test_generic_without_params tests/test_types.py::test_generic_without_params_error tests/test_types.py::test_literal_single tests/test_types.py::test_literal_multiple tests/test_types.py::test_unsupported_field_type tests/test_types.py::test_frozenset_field tests/test_types.py::test_frozenset_field_conversion[value0-result0] tests/test_types.py::test_frozenset_field_conversion[value1-result1] tests/test_types.py::test_frozenset_field_conversion[value2-result2] tests/test_types.py::test_frozenset_field_conversion[value3-result3] tests/test_types.py::test_frozenset_field_not_convertible tests/test_types.py::test_bytesize_conversions[1-1-1.0B-1.0B] tests/test_types.py::test_bytesize_conversions[1.0-1-1.0B-1.0B] tests/test_types.py::test_bytesize_conversions[1b-1-1.0B-1.0B] tests/test_types.py::test_bytesize_conversions[1.5 tests/test_types.py::test_bytesize_conversions[5.1kib-5222-5.1KiB-5.2KB] tests/test_types.py::test_bytesize_conversions[6.2EiB-7148113328562451456-6.2EiB-7.1EB] tests/test_types.py::test_bytesize_to tests/test_types.py::test_bytesize_raises tests/test_types.py::test_deque_success tests/test_types.py::test_deque_generic_success[int-value0-result0] tests/test_types.py::test_deque_generic_success[int-value1-result1] tests/test_types.py::test_deque_generic_success[int-value2-result2] tests/test_types.py::test_deque_generic_success[float-value3-result3] tests/test_types.py::test_deque_generic_success[cls4-value4-result4] tests/test_types.py::test_deque_generic_success[cls5-value5-result5] tests/test_types.py::test_deque_generic_success[str-value6-result6] tests/test_types.py::test_deque_generic_success[int-value7-result7] tests/test_types.py::test_deque_fails[int-value0-errors0] tests/test_types.py::test_deque_fails[int-value1-errors1] tests/test_types.py::test_deque_fails[float-value2-errors2] tests/test_types.py::test_deque_fails[float-value3-errors3] tests/test_types.py::test_deque_fails[float-value4-errors4] tests/test_types.py::test_deque_fails[cls5-value5-errors5] tests/test_types.py::test_deque_fails[cls6-value6-errors6] tests/test_types.py::test_deque_fails[cls7-value7-errors7] tests/test_types.py::test_deque_model tests/test_types.py::test_deque_json tests/test_types.py::test_none[None] tests/test_types.py::test_none[NoneType0] tests/test_types.py::test_none[NoneType1] tests/test_types.py::test_none[value_type3] tests/test_types.py::test_default_union_types tests/test_types.py::test_default_union_class tests/test_types.py::test_default_union_subclass tests/test_types.py::test_default_union_compound_types tests/test_types.py::test_past_date_validation_success[1996-01-22-result0] tests/test_types.py::test_past_date_validation_success[value1-result1] tests/test_types.py::test_past_date_validation_fails[value0] tests/test_types.py::test_past_date_validation_fails[value1] tests/test_types.py::test_past_date_validation_fails[value2] tests/test_types.py::test_past_date_validation_fails[value3] tests/test_types.py::test_past_date_validation_fails[2064-06-01] tests/test_types.py::test_future_date_validation_success[value0-result0] tests/test_types.py::test_future_date_validation_success[value1-result1] tests/test_types.py::test_future_date_validation_success[2064-06-01-result2] tests/test_types.py::test_future_date_validation_fails[value0] tests/test_types.py::test_future_date_validation_fails[value1] tests/test_types.py::test_future_date_validation_fails[value2] tests/test_types.py::test_future_date_validation_fails[value3] tests/test_types.py::test_future_date_validation_fails[1996-01-22]