from testutils import assert_raises

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

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

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

# no argument
assert_raises(TypeError, max)

# one non-iterable argument
assert_raises(TypeError, max, 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 max(first, second) == second
assert max([first, second]) == second


class MyNotComparable:
    pass


assert_raises(TypeError, max, MyNotComparable(), MyNotComparable())
