from testutils import assert_raises

# simple values
assert min(0, 0) == 0
assert min(1, 0) == 0
assert min(1.0, 0.0) == 0.0
assert min(-1, 0) == -1
assert min(1, 2, 3) == 1

# iterables
assert min([1, 2, 3]) == 1
assert min((1, 2, 3)) == 1
assert (
    min(
        {
            "a": 0,
            "b": 1,
        }
    )
    == "a"
)
assert min([1, 2], default=0) == 1
assert min([], default=0) == 0

assert_raises(ValueError, min, [])

# key parameter
assert min(1, 2, -3, key=abs) == 1
assert min([1, 2, -3], key=abs) == 1

# no argument
assert_raises(TypeError, min)

# one non-iterable argument
assert_raises(TypeError, min, 1)


# custom class
class MyComparable:
    nb = 0

    def __init__(self):
        self.my_nb = MyComparable.nb
        MyComparable.nb += 1

    def __gt__(self, other):
        return self.my_nb > other.my_nb


first = MyComparable()
second = MyComparable()
assert min(first, second) == first
assert min([first, second]) == first


class MyNotComparable:
    pass


assert_raises(TypeError, min, MyNotComparable(), MyNotComparable())
