"""
Common helper functions for tests.
"""

from __future__ import absolute_import, division, print_function

from attr import Attribute
from attr._make import NOTHING, make_class


def simple_class(
    cmp=False, repr=False, hash=False, str=False, slots=False, frozen=False
):
    """
    Return a new simple class.
    """
    return make_class(
        "C",
        ["a", "b"],
        cmp=cmp,
        repr=repr,
        hash=hash,
        init=True,
        slots=slots,
        str=str,
        frozen=frozen,
    )


def simple_attr(
    name,
    default=NOTHING,
    validator=None,
    repr=True,
    cmp=True,
    hash=None,
    init=True,
    converter=None,
    kw_only=False,
):
    """
    Return an attribute with a name and no other bells and whistles.
    """
    return Attribute(
        name=name,
        default=default,
        validator=validator,
        repr=repr,
        cmp=cmp,
        hash=hash,
        init=init,
        converter=converter,
        kw_only=False,
    )


class TestSimpleClass(object):
    """
    Tests for the testing helper function `make_class`.
    """

    def test_returns_class(self):
        """
        Returns a class object.
        """
        assert type is simple_class().__class__

    def returns_distinct_classes(self):
        """
        Each call returns a completely new class.
        """
        assert simple_class() is not simple_class()
