def test_cheltuieli_sortate_dupa_tip():
    l = setUp()
    cheltuieli_sortate_dupa_tip(l)
    assert ( get_tip(l[0]) == "imbracaminte")
    assert ( get_tip(l[1]) == "imbracaminte")
    assert ( get_tip(l[2]) == "imbracaminte")
    assert ( get_tip(l[3]) == "intretinere")
    assert ( get_tip(l[4]) == "telefon")
def test_cheltuieli_sortate_dupa_tip():
    l = setUp()
    cheltuieli_sortate_dupa_tip(l)
    assert (get_tip(l[0]) == "imbracaminte")
    assert (get_tip(l[1]) == "imbracaminte")
    assert (get_tip(l[2]) == "imbracaminte")
    assert (get_tip(l[3]) == "intretinere")
    assert (get_tip(l[4]) == "telefon")
def cheltuieli_sortate_dupa_tip(l):
    '''
    functia sorteaza elementele liste dupa tip, in ordine alfabetica
    l - lista
    functia foloseste metoda elevului pentru ordonare
    '''
    for i in range(0, len(l)):
        for j in range(0, len(l)):
            if get_tip(l[i]) < get_tip(l[j]):
                l[i], l[j] = l[j], l[i]
def cheltuieli_sortate_dupa_tip(l):
    '''
    functia sorteaza elementele liste dupa tip, in ordine alfabetica
    l - lista
    functia foloseste metoda elevului pentru ordonare
    '''
    for i in range(0, len(l)):
        for j in range(0, len(l)):
            if get_tip(l[i]) < get_tip(l[j]):
                l[i], l[j] = l[j], l[i]
def actualizeaza_cheltuiala(l, zi, tip, c, undolist):
    '''
    functia actualizeaza cheltuiala(suma) pentru ziua si tipul precizat
    l-lista, zi-numar intreg, tip-cuvant, c-numar intreg
    '''
    for s in l:
        if get_ziua(s) == zi and get_tip(s) == tip:
            s["suma"] = c
    
    lista_provizorie = deepcopy(l)
    undolist.append(lista_provizorie)
def suma_totala_pentru_un_anumit_tip(l, tip):
    '''
    functia returneaza suma totala pentru un anumit tip de cheltuiala
    l - lista, tip - cuvant, suma_totala - numar intreg
    parcurg lista si adun la suma_totala elementele care sunt de acelasi tip cu cel specificat
    '''
    suma_totala = 0
    for s in l:
        if get_tip(s) == tip:
            suma_totala = suma_totala + get_suma(s)
    return suma_totala
def cheltuieli_de_un_anumit_tip(l, tip):
    '''
    functia returneaza o lista ,,aux'' toate cheltuielile de un anumit tip
    l - lista, tip - cuvant, aux- lista
    parcurg lista l si memorez in lista ,,aux" elementele care indeplinesc conditia specificata
    '''
    aux = []
    for s in l:
        if(get_tip(s) == tip):
            aux.append(s)
    return aux    
def actualizeaza_cheltuiala(l, zi, tip, c, undolist):
    '''
    functia actualizeaza cheltuiala(suma) pentru ziua si tipul precizat
    l-lista, zi-numar intreg, tip-cuvant, c-numar intreg
    '''
    for s in l:
        if get_ziua(s) == zi and get_tip(s) == tip:
            s["suma"] = c

    lista_provizorie = deepcopy(l)
    undolist.append(lista_provizorie)
def suma_totala_pentru_un_anumit_tip(l, tip):
    '''
    functia returneaza suma totala pentru un anumit tip de cheltuiala
    l - lista, tip - cuvant, suma_totala - numar intreg
    parcurg lista si adun la suma_totala elementele care sunt de acelasi tip cu cel specificat
    '''
    suma_totala = 0
    for s in l:
        if get_tip(s) == tip:
            suma_totala = suma_totala + get_suma(s)
    return suma_totala
def cheltuieli_de_un_anumit_tip(l, tip):
    '''
    functia returneaza o lista ,,aux'' toate cheltuielile de un anumit tip
    l - lista, tip - cuvant, aux- lista
    parcurg lista l si memorez in lista ,,aux" elementele care indeplinesc conditia specificata
    '''
    aux = []
    for s in l:
        if (get_tip(s) == tip):
            aux.append(s)
    return aux
def elimina_cheltuieli_de_un_anumit_tip(l,tip, undolist):
    '''
    functia elimina din lista toate cheltuielile de un anumit tip precizat
    l - lista, tip - cuvant
    am folosit o functie auxiliara ,,rez" in care pun elementele ce NU indeplinesc conditia specificata
    apoi copiez lista auxiliara in lista l
    '''
    rez = []
    for s in l:
        if get_tip(s) != tip :
            rez.append(s)
    l[:] = rez
def elimina_cheltuieli_de_un_anumit_tip(l, tip, undolist):
    '''
    functia elimina din lista toate cheltuielile de un anumit tip precizat
    l - lista, tip - cuvant
    am folosit o functie auxiliara ,,rez" in care pun elementele ce NU indeplinesc conditia specificata
    apoi copiez lista auxiliara in lista l
    '''
    rez = []
    for s in l:
        if get_tip(s) != tip:
            rez.append(s)
    l[:] = rez
def sterge_cheltuiala_de_un_anumit_tip(l, tip, undolist):
    '''
    functia sterge toate cheltuielile de un anumit tip precizat
    l-lista, tip-cuvant
    
    folosesc o lista auxiliara ,,rez" si pun in ea elementele care nu sunt de acel tip precizat
    apoi reactualizez lista ,,l" cu lista ,,rez"
    '''
    rez=[]
    for s in l:
        if get_tip(s) != tip:
            rez.append(s)
    l[:] = rez
    
    lista_provizorie = deepcopy(l)
    undolist.append(lista_provizorie)
def sterge_cheltuiala_de_un_anumit_tip(l, tip, undolist):
    '''
    functia sterge toate cheltuielile de un anumit tip precizat
    l-lista, tip-cuvant
    
    folosesc o lista auxiliara ,,rez" si pun in ea elementele care nu sunt de acel tip precizat
    apoi reactualizez lista ,,l" cu lista ,,rez"
    '''
    rez = []
    for s in l:
        if get_tip(s) != tip:
            rez.append(s)
    l[:] = rez

    lista_provizorie = deepcopy(l)
    undolist.append(lista_provizorie)
def afisare_cheltuiala(s):
    '''
    afisez o singura cheltuiala de tipul (zi, suma, tip)
    '''
    print("({0},{1},{2})".format(get_ziua(s), get_suma(s), get_tip(s)))
def afisare_cheltuiala(s):
    '''
    afisez o singura cheltuiala de tipul (zi, suma, tip)
    '''
    print("({0},{1},{2})".format(get_ziua(s), get_suma(s), get_tip(s) ) )