Skip to content

Commit

Permalink
new tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Frédéric Peschanski authored and Frédéric Peschanski committed Oct 18, 2020
1 parent 9770251 commit 729a021
Show file tree
Hide file tree
Showing 2 changed files with 136 additions and 0 deletions.
69 changes: 69 additions & 0 deletions test/progs/42_anagrammes_KO_01.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
##!FAIL: OptionCoercionWarning[str/str + NoneType]@55:18

def moins_lettre(c : str, a : str) -> Optional[str]:
"""Précondition : len(c) == 1
Retourne le mot c privé de la première occurrence du caractère a
si c contient a, ou None sinon.
"""

# première occurrence vue ou non
premiere_trouvee : bool = False

# résultat
res : str = ''

d : str # caractère courant
for d in c:
if d != a:
res = res + d
elif not premiere_trouvee:
premiere_trouvee = True
else:
res = res + d

if premiere_trouvee:
return res
else:
return None

# Jeu de tests
assert moins_lettre('banane', 'a') == 'bnane'
assert moins_lettre('banane', 'u') == None
assert moins_lettre('banane', 'e') == 'banan'
assert moins_lettre('', 'a') == None


## Question 2 - Mots anagrammes

def anagramme(m1 : str, m2 : str) -> bool:
"""Renvoie True quand les mots m1 et m2 sont anagrammes,
ou False sinon.
"""

# copie de m2 à laquelle on va retirer des lettres
cm2 : str = m2

# résultat de la fonction moins_lettre
res : Optional[str] = None

a : str
for a in m1:
res = moins_lettre(cm2, a) # on essaye de retirer a dans la copie courante de m2, cm2
if res == None: # si on n'a pas pu (car cm2 ne contient pas res)
return False # m1 et m2 ne peuvent etre anagrammes
else: # sinon
cm2 = res # cm2 devient l'ancienne cm2 sans la lettre a

return (cm2 == '') # en fin de boucle on vérifie que toutes les lettres ont été
# enlevées. On rend donc True s'il ne reste rien dans cm2
# (cela signifiant que tout à été enlevé) ou False sinon.


# Jeu de tests
assert anagramme("alberteinstein", "alberteinstein") == True
assert anagramme("alberteinstein", "riennestetabli") == True
assert anagramme("alberteinstein", "toutestrelatif") == False
assert anagramme("lagravitationuniverselle", "loivitaleregnantsurlavie") == True
assert anagramme("lesfeuxdelamour", "dramesexuelflou") == True
assert anagramme("iamlordvoldemort", "tommarvoloriddle") == True
assert anagramme("iamharrypotter", "tommarvoloriddle") == False
67 changes: 67 additions & 0 deletions test/progs/42_anagrammes_OK.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
def moins_lettre(c : str, a : str) -> Optional[str]:
"""Précondition : len(c) == 1
Retourne le mot c privé de la première occurrence du caractère a
si c contient a, ou None sinon.
"""

# première occurrence vue ou non
premiere_trouvee : bool = False

# résultat
res : str = ''

d : str # caractère courant
for d in c:
if d != a:
res = res + d
elif not premiere_trouvee:
premiere_trouvee = True
else:
res = res + d

if premiere_trouvee:
return res
else:
return None

# Jeu de tests
assert moins_lettre('banane', 'a') == 'bnane'
assert moins_lettre('banane', 'u') == None
assert moins_lettre('banane', 'e') == 'banan'
assert moins_lettre('', 'a') == None


## Question 2 - Mots anagrammes

def anagramme(m1 : str, m2 : str) -> bool:
"""Renvoie True quand les mots m1 et m2 sont anagrammes,
ou False sinon.
"""

# copie de m2 à laquelle on va retirer des lettres
cm2 : str = m2

# résultat de la fonction moins_lettre
res : Optional[str] = None

a : str
for a in m1:
res = moins_lettre(cm2, a) # on essaye de retirer a dans la copie courante de m2, cm2
if res == None: # si on n'a pas pu (car cm2 ne contient pas res)
return False # m1 et m2 ne peuvent etre anagrammes
else: # sinon
cm2 = str(res) # cm2 devient l'ancienne cm2 sans la lettre a

return (cm2 == '') # en fin de boucle on vérifie que toutes les lettres ont été
# enlevées. On rend donc True s'il ne reste rien dans cm2
# (cela signifiant que tout à été enlevé) ou False sinon.


# Jeu de tests
assert anagramme("alberteinstein", "alberteinstein") == True
assert anagramme("alberteinstein", "riennestetabli") == True
assert anagramme("alberteinstein", "toutestrelatif") == False
assert anagramme("lagravitationuniverselle", "loivitaleregnantsurlavie") == True
assert anagramme("lesfeuxdelamour", "dramesexuelflou") == True
assert anagramme("iamlordvoldemort", "tommarvoloriddle") == True
assert anagramme("iamharrypotter", "tommarvoloriddle") == False

0 comments on commit 729a021

Please sign in to comment.