JustDummies

Juste des dummies, mais redoutablement efficaces.

Sections de la documentation

JD025 : DuplicatePoolValue

PropriétéValeur
CatégorieContraintes (JustDummies.Constraints)
Sévérité🟡 Avertissement
Activée par défautOui

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.

Lire la source, ou la corriger là-bas ouvre un nouvel onglet· Repris depuis lib-v1.0.0-preview.6