# принципы праграмирования TDD  Test Driven Development
# переводиться как "разработка" основанная на тестированиях
# данный принцып претпологает что сначала создаются тесты для нужной функции которые будут проверять все возможные варианты ввода и вывода и только потом пишется сама функция
# При каждом обновлении функции необходимо запустить все тесты и удостовериться что все они пройдены без ошибок 

# тесты всегда должны писаться "явным" образом - все входные данные и ожидаемые результаты работы должны быть записаны "от руки" - они не должны вычислятся самим тестом

def максимальное_число(список):
    if type(список) != list and type(список) != tuple:
        raise TypeError(F"Эта функция может принять только список или кортеж. По факту был передан {type(список)}")

    # список = [5,9,2,3,15]

    наибольшее = список[0]
    for i in range(len(список)):
        элемент = список[i]
        if элемент > наибольшее:
            наибольшее = элемент
    return наибольшее

def максимальное_число_через_сортировку(список):
    список.sort()
    return список[-1]


def тест():

    
    название_теста = "список чисел"
    данные = [5,9,2,3,15]
    ожидаемый_ответ = 15
    результат = максимальное_число(данные)
    if результат == ожидаемый_ответ:
        print(f"Тест '{название_теста}' пройден")
    else:
        print(f"Тест '{название_теста}' не пройден")
        print(f"Ожидался ответ {ожидаемый_ответ}")
        print(f"Полученный ответ {результат}")



    название_теста = "список чисел с отрицательными"
    данные = [2,3,6,12,33,-12,34,-4]
    ожидаемый_ответ = 34
    результат = максимальное_число_через_сортировку(данные)
    if результат == ожидаемый_ответ:
        print(f"Тест '{название_теста}' пройден")
    else:
        print(f"Тест '{название_теста}' не пройден")
        print(f"Ожидался ответ {ожидаемый_ответ}")
        print(f"Полученный ответ {результат}")



    название_теста = "передан не список"
    данные = "какой то текст"
    ожидаемый_ответ = "ошибка"
    try:
        результат = максимальное_число(данные)
    except:
        результат = "ошибка"
    if результат == ожидаемый_ответ:
        print(f"Тест '{название_теста}' пройден")
    else:
        print(f"Тест '{название_теста}' не пройден")
        print(f"Ожидался ответ {ожидаемый_ответ}")
        print(f"Полученный ответ {результат}")

тест()