

пройдено = 0

def содержит(что, где, игнор_регистра=False, стоп=False):
    # функция проверяет что хотя бы один элемент из "что" (или вся перменная целеком) содержится хоты бы в одном элементе из "где" (или является частью самой переменной "где")

    # функция возвращает True или False
    # переменные "что" и "где" могут быть двух видов:
        # 1. итерируемые объекты (кортеж или список), всеми элементами которых являются строки (текст)
        # 2. сама переменная может быть строкой (текстом)
        # при нарушении любого из этих пунктов будет вызвана ошибка с описанием этой проблемы
    # переменная "Игнорировать_регистр" может принимать только True или быть по умолчанию False. При передаче другого будет вызвана ошибка.
    # при получении в "что" или "где" пустых строк или пустых списков будет возвращаться False.
    if type(что) not in [list, str, tuple]:
        raise TypeError(f"Переменная 'что' может принять только список, кортеж или текст. Был получен {type(что)}")
    
    if type(игнор_регистра) != bool:
        raise TypeError(f"Переменная 'регистр' может принять True или False. Был получен {type(игнор_регистра)}")
    
    if type(где) not in [list, str, tuple]:
        raise TypeError(f"Переменная 'где' может принять только список, кортеж или текст. Был получен {type(где)}")
    
    if что in [[], (), ""]:
        if что == []:
            текст_ошибки = "список"
        elif что == ():
            текст_ошибки = "кортеж"
        elif что == "":
            текст_ошибки = "текст"
        raise TypeError(f"Переменная 'что' не может принять {текст_ошибки}")
    
    if где in [[], (), ""]:
        if где == []:
            текст_ошибки = "список"
        elif где == ():
            текст_ошибки = "кортеж"
        elif где == "":
            текст_ошибки = "текст"
        raise TypeError(f"Переменная 'где' не может принять {текст_ошибки}")
    
    for элемент in что:
        if type(элемент) != str:
            raise TypeError(f"Внутри переменной 'что' оказался не текстовый элемент - {элемент}")
        
    for элемент in где:
        if type(элемент) != str:
            raise TypeError(f"Внутри переменной 'где' оказался не текстовый элемент - {элемент}")
        
    if стоп:
        print("Стоп")

    if игнор_регистра:
        if type(что) == str:
            что = что.lower()
        else:
            # что = что.copy()
            # for индекс in range(len(что)):
            #     что[индекс] = что[индекс].lower()

            маленькие_буквы = []
            for элемент in что:
                маленькие_буквы.append(элемент.lower())
            что = маленькие_буквы

        if type(где) == str:
            где = где.lower()
        else:
            # где = где.copy()
            # for индекс in range(len(где)):
            #     где[индекс] = где[индекс].lower()

            маленькие_буквы = []
            for элемент in где:
                маленькие_буквы.append(элемент.lower())
            где = маленькие_буквы

    # текст - текст
    if type(что) == type(где) == str:
        return что in где
    
    # текст - множество
    if type(что) == str:
        for элемент in где:
            if что in элемент:
                return True
            
    # множество - текст
    if type(где) == str:
        for элемент in что:
            if элемент in где:
                return True
    
    # множество - множество
    if type(что) != str and type(где) != str:
        for элемент_что in что:
            for элемент_где in где:
                if элемент_что in элемент_где:
                    return True
    return False



def тесты():
    def тест(что ,где ,регистр, ожидаемый_ответ, название_теста):
        global пройдено

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

    название = "что кортеж, где корректное, регистр корректный - не ожидаем ошибку"
    что = ("1", "2", "3")
    где = ["1", "2", "3"]
    регистр = True
    ожидаемый_ответ = True
    тест(что ,где , регистр, ожидаемый_ответ, название)

    название = "что текст, где корректное, регистр корректный - не ожидаем ошибку"
    что = "1"
    где = ["1", "2", "3"]
    регистр = True
    ожидаемый_ответ = True
    тест(что ,где , регистр, ожидаемый_ответ, название)


    название = "что другой тип, где корректное, регистр корректный - ожидаем ошибку"
    что = 1
    где = ["1", "2", "3"]
    регистр = True
    ожидаемый_ответ = "ошибка"
    тест(что ,где , регистр, ожидаемый_ответ, название)

    название = "что пустой список, где корректное, регистр корректный - ожидаем ошибку"
    что = []
    где = ["1", "2", "3"]
    регистр = True
    ожидаемый_ответ = "ошибка"
    тест(что ,где , регистр, ожидаемый_ответ, название)

    название = "что пустой кортеж, где корректное, регистр корректный - ожидаем ошибку"
    что = ()
    где = ["1", "2", "3"]
    регистр = True
    ожидаемый_ответ = "ошибка"
    тест(что ,где , регистр, ожидаемый_ответ, название)

    название = "что пустой текст, где корректное, регистр корректный - ожидаем ошибку"
    что = ""
    где = ["1", "2", "3"]
    регистр = True
    ожидаемый_ответ = "ошибка"
    тест(что ,где , регистр, ожидаемый_ответ, название)

    название = "в что один из элементов не строка, где корректный, регистр корректный - ожидаем ошибку"
    что = ["1", "2", 3]
    где = ["1", "2", "3"]
    регистр = True
    ожидаемый_ответ = "ошибка"
    тест(что ,где , регистр, ожидаемый_ответ, название)


    название = "что корректное, где список, регистр корректный - не ожидаем ошибку"
    что = ["1", "2", "3"]
    где = ["1", "2", "3"]
    регистр = True
    ожидаемый_ответ = True
    тест(что ,где , регистр, ожидаемый_ответ, название)

    название = "что корректное, где кортеж, регистр корректный - не ожидаем ошибку"
    что = ["1", "2", "3"]
    где = ("1", "2", "3")
    регистр = True
    ожидаемый_ответ = True
    тест(что ,где , регистр, ожидаемый_ответ, название)

    название = "что корректное, где текст, регистр корректный - не ожидаем ошибку"
    что = ["1", "2", "3"]
    где = "1"
    регистр = True
    ожидаемый_ответ = True
    тест(что ,где , регистр, ожидаемый_ответ, название)


    название = "что корректное, где другой тип, регистр корректный - ожидаем ошибку"
    что = ["1", "2", "3"]
    где = 3
    регистр = True
    ожидаемый_ответ = "ошибка"
    тест(что ,где , регистр, ожидаемый_ответ, название)

    название = "что корректное, где пустой список, регистр корректный - ожидаем ошибку"
    что = ["1", "2", "3"]
    где = []
    регистр = True
    ожидаемый_ответ = "ошибка"
    тест(что ,где , регистр, ожидаемый_ответ, название)

    название = "что корректное, где пустой кортеж, регистр корректный - ожидаем ошибку"
    что = ["1", "2", "3"]
    где = ()
    регистр = True
    ожидаемый_ответ = "ошибка"
    тест(что ,где , регистр, ожидаемый_ответ, название)

    название = "что корректное, где пустой текст, регистр корректный - ожидаем ошибку"
    что = ["1", "2", "3"]
    где = ""
    регистр = True
    ожидаемый_ответ = "ошибка"
    тест(что ,где , регистр, ожидаемый_ответ, название)

    название = "что корректное, где один из элементов не строка, регистр корректный - ожидаем ошибку"
    что = ["1", "2", "3"]
    где = ["1", "2", 3]
    регистр = True
    ожидаемый_ответ = "ошибка"
    тест(что ,где , регистр, ожидаемый_ответ, название)


    название = "что корректное, где корректное, регистр True - не ожидаем ошибку"
    что = ["1", "2", "3"]
    где = ["1", "2", "3"]
    регистр = True
    ожидаемый_ответ = True
    тест(что ,где , регистр, ожидаемый_ответ, название)

    название = "что корректное, где корректное, регистр False - не ожидаем ошибку"
    что = ["1", "2", "3"]
    где = ["1", "2", "3"]
    регистр = False
    ожидаемый_ответ = True
    тест(что ,где , регистр, ожидаемый_ответ, название)


    название = "что корректное, где корректное, регистр другой тип - ожидаем ошибку"
    что = ["1", "2", "3"]
    где = ["1", "2", "3"]
    регистр = "True"
    ожидаемый_ответ = "ошибка"
    тест(что ,где , регистр, ожидаемый_ответ, название)

    
    список_видео = ["фильм.mp4", "кино.mp4", "песня.MP3"]
    список_картинок = ["котики.jpg", "море.jpg", "каникулы.mp4"]
    список_музыки = ["мелодия.mp3", "трек.mp3", "обложка.JPG"]
    список_документов = ["доклад.docx", "список дел.txt", "книга.fb2", "таблица.xlsx"]

    варианты = [
        ["элемент-элемент, регистр важен, результат - не содержит", ".jpg", "обложка.JPG", False, False],
        ["элемент-элемент, регистр важен, результат - содержит", ".jpg", "котики.jpg", False, True],
        ["элемент-элемент, регистр не важен, результат - не содержит", ".jpg", "песня.MP3", True, False],
        ["элемент-элемент, регистр не важен, результат - содержит", ".jpg", "обложка.JPG", True, True],
        ["элемент-множество, регистр важен, результат - не содержит", ".mp3", список_видео, False, False],
        ["элемент-множество, регистр важен, результат - содержит", ".jpg", список_картинок, False, True],
        ["элемент-множество, регистр не важен, результат - не содержит", ".txt", список_видео, True, False],
        ["элемент-множество, регистр не важен, результат - содержит", ".mp3", список_видео, True, True],
        ["множество-элемент, регистр важен, результат - не содержит", [".jpg", ".mp3"], "песня.MP3", False, False],
        ["множество-элемент, регистр важен, результат - содержит", [".txt", ".mp3"], "список дел.txt", False, True],
        ["множество-элемент, регистр не важен, результат - не содержит", [".xlsx", ".fb2"], "трек.mp3", True, False],
        ["множество-элемент, регистр не важен, результат - содержит", [".jpg", ".mp3"], "песня.MP3", True, True],
        ["множество-множество, регистр важен, результат - не содержит", [".jpg", ".mp3"], список_видео, False, False],
        ["множество-множество, регистр важен, результат - содержит", [".mp4", ".jpg"], список_картинок, False, True],
        ["множество-множество, регистр не важен, результат - не содержит", [".docx", ".xlsx"], список_видео, True, False],
        ["множество-множество, регистр не важен, результат - содержит", [".mp3", ".docx"], список_видео, True, True],
    ]

    for вариант in варианты:
        название, что, где, регистр, ожидаемый_ответ = вариант
        тест(что ,где , регистр, ожидаемый_ответ, название)

    вариант = ["элемент-множество, регистр важен, результат - не содержит", ".mp3", список_видео, False, False]
    название, что, где, регистр, ожидаемый_ответ = вариант
    
    print()
    print(f"Пройдено тестов: {пройдено} / 35")

    if содержит(что, где, регистр, стоп=True) == ожидаемый_ответ:
        print("верно")
    else:
        print("неверно")

if __name__ == "__main__":
    тесты()