diff --git a/pydantic/errors.py b/pydantic/errors.py
--- a/pydantic/errors.py
+++ b/pydantic/errors.py
@@ -48,6 +48,7 @@
     'TupleLengthError',
     'ListMinLengthError',
     'ListMaxLengthError',
+    'ListUniqueItemsError',
     'SetMinLengthError',
     'SetMaxLengthError',
     'FrozenSetMinLengthError',
@@ -324,6 +325,11 @@ def __init__(self, *, limit_value: int) -> None:
         super().__init__(limit_value=limit_value)
 
 
+class ListUniqueItemsError(PydanticValueError):
+    code = 'list.unique_items'
+    msg_template = 'the list has duplicated items'
+
+
 class SetMinLengthError(PydanticValueError):
     code = 'set.min_items'
     msg_template = 'ensure this value has at least {limit_value} items'
diff --git a/pydantic/fields.py b/pydantic/fields.py
--- a/pydantic/fields.py
+++ b/pydantic/fields.py
@@ -103,6 +103,7 @@ class FieldInfo(Representation):
         'multiple_of',
         'min_items',
         'max_items',
+        'unique_items',
         'min_length',
         'max_length',
         'allow_mutation',
@@ -123,6 +124,7 @@ class FieldInfo(Representation):
         'multiple_of': None,
         'min_items': None,
         'max_items': None,
+        'unique_items': None,
         'allow_mutation': True,
     }
 
@@ -143,6 +145,7 @@ def __init__(self, default: Any = Undefined, **kwargs: Any) -> None:
         self.multiple_of = kwargs.pop('multiple_of', None)
         self.min_items = kwargs.pop('min_items', None)
         self.max_items = kwargs.pop('max_items', None)
+        self.unique_items = kwargs.pop('unique_items', None)
         self.min_length = kwargs.pop('min_length', None)
         self.max_length = kwargs.pop('max_length', None)
         self.allow_mutation = kwargs.pop('allow_mutation', True)
@@ -208,6 +211,7 @@ def Field(
     multiple_of: float = None,
     min_items: int = None,
     max_items: int = None,
+    unique_items: bool = None,
     min_length: int = None,
     max_length: int = None,
     allow_mutation: bool = True,
@@ -241,6 +245,12 @@ def Field(
       schema will have a ``maximum`` validation keyword
     :param multiple_of: only applies to numbers, requires the field to be "a multiple of". The
       schema will have a ``multipleOf`` validation keyword
+    :param min_items: only applies to lists, requires the field to have a minimum number of
+      elements. The schema will have a ``minItems`` validation keyword
+    :param max_items: only applies to lists, requires the field to have a maximum number of
+      elements. The schema will have a ``maxItems`` validation keyword
+    :param max_items: only applies to lists, requires the field not to have duplicated
+      elements. The schema will have a ``uniqueItems`` validation keyword
     :param min_length: only applies to strings, requires the field to have a minimum length. The
       schema will have a ``maximum`` validation keyword
     :param max_length: only applies to strings, requires the field to have a maximum length. The
@@ -268,6 +278,7 @@ def Field(
         multiple_of=multiple_of,
         min_items=min_items,
         max_items=max_items,
+        unique_items=unique_items,
         min_length=min_length,
         max_length=max_length,
         allow_mutation=allow_mutation,
diff --git a/pydantic/schema.py b/pydantic/schema.py
--- a/pydantic/schema.py
+++ b/pydantic/schema.py
@@ -953,11 +953,9 @@ def get_annotation_from_field_info(
     :return: the same ``annotation`` if unmodified or a new annotation with validation in place
     """
     constraints = field_info.get_constraints()
-
     used_constraints: Set[str] = set()
     if constraints:
         annotation, used_constraints = get_annotation_with_constraints(annotation, field_info)
-
     if validate_assignment:
         used_constraints.add('allow_mutation')
 
@@ -1001,9 +999,18 @@ def go(type_: Any) -> Type[Any]:
             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):
-                used_constraints.update({'min_items', 'max_items'})
-                return conlist(go(args[0]), min_items=field_info.min_items, max_items=field_info.max_items)
+            if issubclass(origin, List) and (
+                field_info.min_items is not None
+                or field_info.max_items is not None
+                or field_info.unique_items is not None
+            ):
+                used_constraints.update({'min_items', 'max_items', 'unique_items'})
+                return conlist(
+                    go(args[0]),
+                    min_items=field_info.min_items,
+                    max_items=field_info.max_items,
+                    unique_items=field_info.unique_items,
+                )
 
             if issubclass(origin, Set) and (field_info.min_items is not None or field_info.max_items is not None):
                 used_constraints.update({'min_items', 'max_items'})
diff --git a/pydantic/types.py b/pydantic/types.py
--- a/pydantic/types.py
+++ b/pydantic/types.py
@@ -540,15 +540,18 @@ class ConstrainedList(list):  # type: ignore
 
     min_items: Optional[int] = None
     max_items: Optional[int] = None
+    unique_items: Optional[bool] = None
     item_type: Type[T]  # type: ignore
 
     @classmethod
     def __get_validators__(cls) -> 'CallableGenerator':
         yield cls.list_length_validator
+        if cls.unique_items:
+            yield cls.unique_items_validator
 
     @classmethod
     def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None:
-        update_not_none(field_schema, minItems=cls.min_items, maxItems=cls.max_items)
+        update_not_none(field_schema, minItems=cls.min_items, maxItems=cls.max_items, uniqueItems=cls.unique_items)
 
     @classmethod
     def list_length_validator(cls, v: 'Optional[List[T]]') -> 'Optional[List[T]]':
@@ -566,10 +569,22 @@ def list_length_validator(cls, v: 'Optional[List[T]]') -> 'Optional[List[T]]':
 
         return v
 
+    @classmethod
+    def unique_items_validator(cls, v: 'List[T]') -> 'List[T]':
+        for i, value in enumerate(v, start=1):
+            if value in v[i:]:
+                raise errors.ListUniqueItemsError()
+
+        return v
 
-def conlist(item_type: Type[T], *, min_items: int = None, max_items: int = None) -> Type[List[T]]:
+
+def conlist(
+    item_type: Type[T], *, min_items: int = None, max_items: int = None, unique_items: bool = None
+) -> Type[List[T]]:
     # __args__ is needed to conform to typing generics api
-    namespace = {'min_items': min_items, 'max_items': max_items, 'item_type': item_type, '__args__': (item_type,)}
+    namespace = dict(
+        min_items=min_items, max_items=max_items, unique_items=unique_items, item_type=item_type, __args__=(item_type,)
+    )
     # We use new_class to be able to deal with Generic types
     return new_class('ConstrainedListValue', (ConstrainedList,), {}, lambda ns: ns.update(namespace))
 

As a workaround, maybe you could set the attribute type to a set? Then when a list gets passed in, it gets deduplicated automatically. Then you can override `json()` and `dict()` to convert it back to a list on the way out.
@mdavis-xyz The idea of this feature is to validate that sequences have only unique items.

Code below will show the idea:
```python
from typing import Set

from pydantic import BaseModel, Field


class FooForm(BaseModel):
    tags: Set[int]


foo = FooForm(tags=[1, 1, 2])  # tags attribute will be {1, 2}


class BarForm(BaseModel):
    tags: Set[int] = Field(unique=True)


bar = BarForm(tags=[1, 1, 2])  # will fail, because sequence has duplicate items
```

If you have any questions, feel free to ask.
This is an interesting issue that clarifies some of the friction points with validation and casting within Pydantic. 

As a workaround, it's possible to add a validator with 'pre=True' to get the desired behavior. 

```python
from typing import Set, Sequence
from pydantic import BaseModel, Field, validator

def custom_to_set(xs: Sequence[int]) -> Set[int]:
    items = set([])
    for item in xs:
        if item in items:
            raise ValueError(f"Duplicate item {item}")
        else:
            items.add(item)
    return items


class Record(BaseModel):
    tags: Set[int] = Field(...)

    @validator('tags', pre=True)
    def validate_unique_tags(cls, value):
        # raise ValueError or a set
        return custom_to_set(value)

def example() -> int:

    t1 = ['1', '2'] # Notice how liberal Pydantic is. This is not a validation error
    t2 = [1, 3, 1] # This now raises
    for t in [t1, t2]:
        print(Record(tags=t))
    return 0
```


Is this issue a bandaid for the fundamental loose casting/coercion model that Pydantic has adopted?

https://github.com/samuelcolvin/pydantic/issues/1098

Your proposal does seem reasonable and clarifies the default behavior  of `Set[T]` in a "strict" mode should raise a core validation error if the input sequence has any duplicates. However, this is not how Pydantic has approached validation.  Perhaps it would be better to wait until Pydantic has a coherent "strict" model?

With regards to the proposal, it's a bit counterintuitive to define a `Set[int]` and also set `Field(unique=True)` to get the validation to work "correctly".  Similarly, `List[T] = Field(unique=True)` is counterintuitive because it's not clear why a `Set[T]` isn't being used.  This case might be better solved by a custom validation/casting function with `pre=True`? 


@mpkocher  This issue came up when I faced with an issue which I thought was a bug.

I had a model and one of the fields had a type `Set[str]`, the model looked like:
```python
class Form(BaseModel):
    tags: Set[int]
```
When one of the scripts tried to instantiate `Form` with duplicated items it simply cast sequence to a set, which was the wrong behavior for me script. After investigating I found that this is expected behavior, that why I create this PR)

I agree with you that `List[T] = Field(unique=True)` can be a little bit confusing.

Regarding #1098 it looks great and maybe it's better to return to this feature after `Strict Configuration` will be implemented.
I'm running into similar friction points where the overly liberal casting yields surprising results. 
diff --git a/tests/test_types.py b/tests/test_types.py
--- a/tests/test_types.py
+++ b/tests/test_types.py
@@ -216,6 +216,39 @@ class ConListModelMin(BaseModel):
     ]
 
 
+def test_constrained_list_not_unique_hashable_items():
+    class ConListModelUnique(BaseModel):
+        v: conlist(int, unique_items=True)
+
+    with pytest.raises(ValidationError) as exc_info:
+        ConListModelUnique(v=[1, 1, 2, 2, 2, 3])
+    assert exc_info.value.errors() == [
+        {
+            'loc': ('v',),
+            'msg': 'the list has duplicated items',
+            'type': 'value_error.list.unique_items',
+        }
+    ]
+
+
+def test_constrained_list_not_unique_unhashable_items():
+    class ConListModelUnique(BaseModel):
+        v: conlist(Set[int], unique_items=True)
+
+    m = ConListModelUnique(v=[{1}, {2}, {3}])
+    assert m.v == [{1}, {2}, {3}]
+
+    with pytest.raises(ValidationError) as exc_info:
+        ConListModelUnique(v=[{1}, {1}, {2}, {2}, {2}, {3}])
+    assert exc_info.value.errors() == [
+        {
+            'loc': ('v',),
+            'msg': 'the list has duplicated items',
+            'type': 'value_error.list.unique_items',
+        }
+    ]
+
+
 def test_constrained_list_optional():
     class Model(BaseModel):
         req: Optional[conlist(str, min_items=1)] = ...
@@ -296,8 +329,8 @@ class ConListModel(BaseModel):
 
 def test_conlist():
     class Model(BaseModel):
-        foo: List[int] = Field(..., min_items=2, max_items=4)
-        bar: conlist(str, min_items=1, max_items=4) = None
+        foo: List[int] = Field(..., min_items=2, max_items=4, unique_items=True)
+        bar: conlist(str, min_items=1, max_items=4, unique_items=False) = None
 
     assert Model(foo=[1, 2], bar=['spoon']).dict() == {'foo': [1, 2], 'bar': ['spoon']}
 
@@ -307,12 +340,29 @@ class Model(BaseModel):
     with pytest.raises(ValidationError, match='ensure this value has at most 4 items'):
         Model(foo=list(range(5)))
 
+    with pytest.raises(ValidationError, match='the list has duplicated items'):
+        Model(foo=[1, 1, 2, 2])
+
     assert Model.schema() == {
         'title': 'Model',
         'type': 'object',
         'properties': {
-            'foo': {'title': 'Foo', 'type': 'array', 'items': {'type': 'integer'}, 'minItems': 2, 'maxItems': 4},
-            'bar': {'title': 'Bar', 'type': 'array', 'items': {'type': 'string'}, 'minItems': 1, 'maxItems': 4},
+            'foo': {
+                'title': 'Foo',
+                'type': 'array',
+                'items': {'type': 'integer'},
+                'minItems': 2,
+                'maxItems': 4,
+                'uniqueItems': True,
+            },
+            'bar': {
+                'title': 'Bar',
+                'type': 'array',
+                'items': {'type': 'string'},
+                'minItems': 1,
+                'maxItems': 4,
+                'uniqueItems': False,
+            },
         },
         'required': ['foo'],
     }

Sequence constraint to enforce only unique items
### 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 feature/change is needed
* [x] After submitting this, I commit to one of:
    * Look through open issues and helped at least one other person
    * Hit the "watch" button on this repo to receive notifications and I commit to help at least 2 people that ask questions in the future
    * Implement a Pull Request for a confirmed bug

<!-- Sorry to sound so draconian, but every second saved replying to issues is time spend improving pydantic :-) -->

# Feature Request

Output of `python -c "import pydantic.utils; print(pydantic.utils.version_info())"`:
```
             pydantic version: 1.6.1
            pydantic compiled: False
                 install path: /Users/yuriikarabas/my-projects/pydantic/pydantic
               python version: 3.6.8 (v3.6.8:3c6b436a57, Dec 24 2018, 02:04:31)  [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)]
                     platform: Darwin-19.6.0-x86_64-i386-64bit
     optional deps. installed: ['typing-extensions', 'email-validator', 'devtools']

```
<!-- or if you're using pydantic prior to v1.3, manually include: OS, python version and pydantic version -->

<!-- Please read the [docs](https://pydantic-docs.helpmanual.io/) and search through issues to
confirm your feature hasn't been asked for before, or already implemented. -->

<!-- Where possible please include a self-contained code snippet describing your feature request: -->

The idea of this feature is to add the ability to validate that sequence types (like `list`, `tuple`, or `set`) contains only unique items.

I think the best API for this feature will be something like this:
```python
from typing import List
from pydantic import BaseModel, EmailStr, Field

class User(BaseModel):
    email: EmailStr


class Form(BaseModel):
    users: List[User] = Field(unique=True)
```

In case when data contains duplicates, they will be available using `errors` method.
For instance:
```python
try:
    f = Form(users=[{'email': 'some@email.com'}] * 2)
except ValidationError as e:
    print(e.errors())
```
Will print:
```python
[
    {
        'loc': ('users',),
        'msg': "value contains duplicate items [User(email='some@email.com')]",
        'type': 'type_error.sequencenotunique',
        'ctx': {'duplicates': [User(email='some@email.com')]}
    },
]
```


Also, as an option, we can add a new generic type `Unique`. 
Usage will look like:
```python
from pydantic import BaseModel, EmailStr, Unique

class User(BaseModel):
    email: EmailStr


class Form(BaseModel):
    users: Unique[User]
```


I have already implemented this feature in my fork. [link to commit](https://github.com/uriyyo/pydantic/commit/bb67a2e9f15da0d826ba48da117230284182c1b3)

tests/test_types.py::test_constrained_list_not_unique_hashable_items tests/test_types.py::test_constrained_list_not_unique_unhashable_items tests/test_types.py::test_conlist
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_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_confrozenset tests/test_types.py::test_confrozenset_not_required tests/test_types.py::test_constrained_frozenset_optional 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_smart_union_types tests/test_types.py::test_default_union_class tests/test_types.py::test_smart_union_class tests/test_types.py::test_default_union_subclass tests/test_types.py::test_smart_union_subclass tests/test_types.py::test_default_union_compound_types 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_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]