| Propriété | Valeur |
|---|---|
| Catégorie | Constraints (JustDummies.Constraints) |
| Sévérité | 🔵 Info |
| Activée par défaut | Oui |
Une valeur écrite dans un value set est refusée par une contrainte déclarée sur la même chaîne : aucun tirage ne pourra jamais la rendre. La règle lit les familles de chaînes et les familles numériques — tous les types entiers et decimal.
Un value set se compose avec les autres contraintes : chaque valeur fournie les passe ou échoue, et le domaine est l’ensemble de celles qui passent. Une valeur qui échoue quitte le domaine en silence — seul un domaine vidé est signalé, et à la déclaration. Entre « toutes les valeurs survivent » et « aucune ne survit », il n’y a aucun signal : un pool peut se lire à cinq valeurs et tirer sur trois.
C’est le dual de JD024. Cette règle-là signale une contrainte qui ne rétrécit rien ; celle-ci signale une valeur que rien ne laisse passer.
Non conforme
string code = Any.String().OneOf("abc", "de").WithLength(3).Generate();
"de" fait deux caractères : WithLength(3) la refuse, et le pool vaut une valeur, pas deux.
Conforme
string code = Any.String().OneOf("abc", "xyz").WithLength(3).Generate();
L’une ou l’autre réparation referme le cas, et laquelle est la bonne n’est pas quelque chose que la règle peut savoir : retirer la valeur du pool, ou relâcher la contrainte qui la refuse.
Info plutôt que Warning
Rétrécir un pool partagé sur un appel précis est exactement ce à quoi sert la déclaration d’une contrainte à côté d’un value set. Une équipe peut tenir un seul catalogue et en tirer une tranche différente dans chaque test ; une règle qui y verrait un défaut aurait tort plus souvent que raison. Elle énonce donc un fait à peser, jamais un verdict.
Cela ne vaut que tant que la chaîne tire encore quelque chose. Un pool dont aucune valeur ne survit n’est pas un rétrécissement — il lève à la déclaration — donc cette règle se tait alors, et JD015 le signale une fois, sur la chaîne, à la sévérité que mérite une chaîne qui lève. Y lister en plus chaque valeur redirait la même chose une seconde fois, dans un registre qui se lit « ça marche encore ».
Ce qu’elle ne signale pas
- Un pool tenu dans une variable, qui est le cas le plus important et celui qu’une réponse au build ne peut pas atteindre. Un catalogue chargé d’un fichier ou partagé par un champ est traité à l’exécution, par
IPoolInspection<T>— sur les valeurs réellement fournies, et avec toutes les contraintes qui refusent chacune. - Un pool à virgule flottante binaire —
Any.Double(),Any.Single(),Any.Half()— et les entiers 128 bits. Une constantedoublen’a pas dedecimalexact, et decimal ne peut pas contenir la plage des 128 bits : les juger par ce biais pourrait refuser une valeur que l’exécution admet. Hors périmètre plutôt qu’approximé. - Une contrainte dont l’argument n’est pas une constante de compilation. Elle est ignorée plutôt que devinée : une valeur qu’elle seule refuse n’est donc pas signalée. Sous-signaler est la direction sûre ici — une valeur que la règle signale est réellement refusée, puisque ajouter des contraintes ne peut qu’en retirer davantage.
- Une chaîne coupée par des instructions ou des variables, et une chaîne sans value set du tout.
- Un pool dont aucune valeur ne survit — c’est celui de JD015, cf. le paragraphe ci-dessus.
- Un test négatif d’assertion de conflit, où la chaîne est tout le corps d’un lambda passé en argument.