| Propriété | Valeur |
|---|---|
| Catégorie | Contraintes (JustDummies.Constraints) |
| Sévérité | 🟡 Avertissement |
| Activée par défaut | Oui |
La même valeur figure deux fois dans un réservoir. Un réservoir est dédoublonné sous l’égalité par défaut à la construction du générateur : une valeur écrite deux fois n’y contribue qu’une seule fois.
La lecture que cette règle existe pour refuser est la pondération. Lister une valeur deux fois ressemble à « tirer celle-ci plus souvent », et la bibliothèque refuse délibérément de pondérer un réservoir — le doublon ne fait donc rien du tout, et le réservoir est plus petit d’une valeur que ce qu’il paraît.
Non conforme
Any.OneOf(1, 2, 1) // JD025 : le réservoir contient deux valeurs, pas trois
Any.OneOf("EUR", "USD", "EUR") // JD025
Any.Int32().OneOf(3, 3) // JD025
Conforme
Any.OneOf(1, 2) // dire ce qu'est le réservoir
Any.OneOf("EUR", "USD")
Où l’écart se manifeste
Rien n’échoue ici, et c’est bien le problème : la conséquence tombe complètement ailleurs. Une collection distincte au-dessus du réservoir vérifie le vrai nombre de valeurs distinctes, et annonce un nombre que l’auteur ne retrouve pas dans son source :
Any.SetOf(Any.OneOf(1, 2, 1)).WithCount(3)
// ConflictingAnyConstraintException : 3 elements required to be distinct
// exceed the 2 distinct value(s) the element generator can produce.
Trois valeurs sont écrites sur la ligne ; le message en annonce deux. Cette règle désigne la ligne réellement fautive.
Ce qui n’est pas signalé
- Un réservoir dont les éléments ne sont pas tous des constantes de compilation — un seul élément non repliable et le réservoir cesse d’être connaissable, donc la règle se retire plutôt que de signaler un parcours partiel.
- Un réservoir tenu dans une variable ou construit par une requête (
Any.ElementOf(orders)) ; seules les valeurs écrites sur le site d’appel sont visibles. - Des valeurs qui se ressemblent seulement :
Any.OneOf("a", "A")est un réservoir de deux.