Chapitre 13. Tests unitaires

13.1. Introduction au chiffres romains

Dans les chapitres précédents, nous avons «plongé» en regardant immédiatement du code et en essayant de le comprendre le plus vite possible. Maintenant que vous connaissez un peu plus de Python, nous allons prendre un peu de recul et regarder ce qui se passe avant que le code soit écrit.

Dans ce chapitres et les suivants, nous allons écrire, déboguer et optimiser un ensemble de fonctions utilitaires pour convertir vers et depuis des chiffres romains. Nous avons vu la méthode de construction et de validation des chiffres romains au chapitre Section 7.3, «Exemple : chiffres romains», nous allons maintenant considérer ce qu’il faut faire pour étendre cette méthode pour qu’elle fonctionne dans les deux sens.

Les règles de construction des chiffres romains amènent à un certain nombre d’observations intéressantes :

  1. Il n’y a qu’une seule façon correcte de représenter une valeur en chiffres romains.
  2. L’inverse est aussi vrai : si une chaîne de caractères en chiffres romains est un nombre valide, elle ne représente qu’un nombre (c.a.d. qu’elle ne peut être lue que d’une manière).
  3. Il y a un intervalle limité de valeurs pouvant être exprimées en chiffres romains, les nombres de 1 à 3999 (les Romains avaient plusieurs manières d’exprimer des nombres plus grand, par exemple en inscrivant une barre au dessus d’un caractère pour signifier que sa valeur normale devait être multipliée par 1000, mais nous n’allons pas prendre ça en compte. Pour ce qui est de ce chapitre, les chiffres romains vont de 1 à 3999).
  4. Il n’est pas possible de représenter 0 en chiffres romains (étonnamment, les anciens romains n’avaient pas de notion du 0 comme chiffre. Les nombres servaient à compter les choses qu’on avait, comment compter ce que l’on n’a pas ?).
  5. Il n’est pas possible de représenter les valeurs négatives en chiffres romains.
  6. Il n’est pas possible de représenter des fractions ou des nombres non-entiers en chiffres romains.

Sachant tout cela, que pouvons nous exiger d’un ensemble de fonctions pour convertir vers et depuis les chiffres romains ?

Spécification de roman.py

  1. toRoman doit retourner la représentation en chiffres romains de tous les entiers entre 1 et 3999.
  2. toRoman doit échouer s’il lui est passé un entier hors de l’intervalle 1 à 3999.
  3. toRoman doit échouer s’il lui est passé une valeur non-entière.
  4. fromRoman doit prendre un nombre en chiffres romains valide et retourner la valeur qu’il représente.
  5. fromRoman doit échouer s’il lui est passé un nombre en chiffres romains invalide.
  6. Si vous prenez un nombre, le convertissez en chiffres romains, puis le convertissez à nouveau en nombre, vous devez obtenir la même valeur que celle de départ. Donc fromRoman(toRoman(n)) == n pour tout n compris dans 1..3999.
  7. toRoman doit toujours retourner un des chiffres romains en lettres majuscules.
  8. fromRoman doit seulement accepter des chiffres romains en majuscules (il doit échouer s’il lui est passé une entrée en minuscules.

Pour en savoir plus

  • Ce site a plus d’information sur les nombres romains, y compris une histoire fascinante de la manière dont les Romains et d’autres civilisations les utilisaient vraiment (pour faire court, à l’aveuglette et sans cohérence).