import os 
import sys
этот_файл = __file__ 
эта_папка = os.path.dirname(этот_файл) 
папка_выше = os.path.dirname(эта_папка)
sys.path.append(папка_выше) 
from инструменты.терминал import печать

пройдено = 0

def проверка_содержит(что,где,игнорировать_регистр = False, стоп=False): 
    # функция проверяет что хотя бы один элемент из "что" (или вся переменная целиком) содержится хотя бы в одном элементе "где"(или является частью переменной "где")
    # функция возвращает True или False
    # переменные "что" и "где" могут быть 2 видов
        #1.Итеррируемые объекты (кортыж или список), всеми элементами которых являются строки(текст)
        # 2.сама переменная может быть строкой (текстом)
        # при нарушении люього из этих пунктов бутет вызвана ошибка с описание проблемы 
    # переменная "игнорировать_регистр" может принимать только True , или быть по умолчанию false.При передаче другого типа данных будет вызвана ошибка.
    # При получении в "что" или "где" пустых строк или пустых списков будет возвращаться False 
    #
    if type(что) not in [list,str,tuple]:
        raise TypeError(f'Переменная "что" может принять только список, кортеж или текст.по факту получая {type(что)}')
    if type(где) not in [list,str,tuple]:
        raise TypeError(f'Переменная "где" может принять только список, кортеж или текст.по факту получая {type(где)}')
    if type(игнорировать_регистр) != bool:
         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(что) == str and 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 результат == ожидаемый_ответ:
            печать(f'тест"{название_теста}"пройден!', зеленый=True) 
            пройдено += 1
        else:
            печать(f'тест"{название_теста}"не пройден!', красный=True) 
            print(f"ожидался ответ - {ожидаемый_ответ}")
            print(f"получили результат - {результат}")
            print()


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

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

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

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

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

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

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

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

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


    видео = ".mp4"
    картинка = ".jpg"
    музыка = ".mp3"
    ворд = ".docx"
    текст = ".txt"
    книга = ".fb2"
    эксель = ".xlsx"

    список_видео = ["фильм.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 варианты:
        название, что ,где ,регистор, ожидаемый_ответ = вариант
        тест(что, где,регистор,ожидаемый_ответ, название) 

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

    вариант = ["элемент-множество, регистр важен, результат - содержит", ".jpg", список_картинок, False, True]


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