JustDummies

Juste des dummies, mais redoutablement efficaces.

Sections de la documentation

JD016 : CollectionConstraintsAdmitNoValue

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

Les contraintes de cardinal déclarées ne peuvent pas toutes tenir, ou la chaîne réclame plus d’éléments distincts que son générateur d’éléments ne peut en produire — la barrière de cardinalité que consigne l’ADR-0004 ouvre un nouvel onglet.

Les deux lèvent à la déclaration : cette règle transforme donc un rouge d’arrangement en rouge de compilation, plutôt que de fermer un vert silencieux. Cela vaut tout de même la peine : la chaîne se trouve d’ordinaire dans un utilitaire d’arrangement à plusieurs cadres d’appel du test qui meurt dessus, où le message nomme deux contraintes que le lecteur doit ensuite aller chercher.

Non conforme

Any.ListOf(Any.Int32()).WithCount(0).NonEmpty()                  // fixé à 0, puis exigé non vide
Any.ListOf(Any.Int32()).WithMinCount(5).WithMaxCount(2)          // aucun cardinal ne satisfait les deux
Any.ListOf(Any.Int32()).WithMaxCount(2).Containing(1).Containing(2).Containing(3)   // 3 éléments, 2 places
Any.SetOf(Any.Boolean()).WithCount(5)                            // 5 booléens distincts n'existent pas
Any.ListOf(Any.Enum<Day>()).Distinct().WithCount(10)             // plus que le nombre de membres de l'enum
Any.SetOf(Any.Int16()).WithCount(70000)                          // seules 65536 valeurs Int16 distinctes existent
Any.SetOf(Any.Char().OneOf('a', 'b')).WithCount(5)               // restreint à 2 caractères, pas les 128 de l'ASCII

Conforme

Any.ListOf(Any.Int32()).WithCountBetween(2, 10)
Any.SetOf(Any.Boolean()).WithCount(2)
Any.ListOf(Any.Boolean()).WithCount(10)                          // sans Distinct : les répétitions sont normales
Any.SetOf(Any.Char().OneOf('a', 'b', 'c')).WithCount(3)          // tient exactement dans le pool restreint

Les domaines qu’elle sait prouver

Uniquement ceux que le compilateur tranche : Any.Boolean() (2) ; les petites lignes primitives — Any.Char() (128, le pool ASCII de l’ADR-0075 ouvre un nouvel onglet), Any.Byte()/Any.SByte() (256), Any.Int16()/Any.UInt16() (65536), Any.Half() (63487 — les Half finis distincts, les deux zéros n’en comptant qu’un puisqu’ils sont égaux) ; Any.Enum<T>() (ses valeurs distinctes déclarées, pas ses noms déclarés — un membre aliasé comme Grade { Low = 1, …, Min = 1 } compte toujours 3, pas 5) ; et un ensemble OneOf/ElementOf de constantes (son nombre de valeurs distinctes). Tout le reste est improuvable et n’est pas signalé — un domaine improuvable ne doit jamais être traité comme un petit domaine.

Un pool restreint par Any.Char().OneOf(...) est compté pour ce qu’il déclare réellement plutôt que replié sur les 128 valeurs par défaut : le pool propre à l’appelant peut dépasser l’ASCII à dessein, documenté sur le membre lui-même, donc Any.Char().OneOf('a', 'b') se lit 2, pas 128.

AllowingCombinations() en est l’illustration. Elle élargit l’univers d’un enum à la clôture par OU de ses membres déclarés — huit valeurs pour quatre drapeaux — de sorte que compter les membres déclarés condamnerait une chaîne légale. La règle renonce plutôt que de calculer la clôture : un faux négatif délibéré, découvert par mise à l’épreuve contre AnyEnumCombinationTests, qui affirme que WithCount(8) réussit.

Ce qui n’est pas signalé

  • Un cardinal ou un générateur d’éléments qui n’est pas une constante de compilation.
  • Une chaîne répartie sur plusieurs instructions — elle doit être une seule expression.
  • Un test négatif vérifiant un conflit, où la chaîne illégale constitue tout le corps d’une lambda passée en argument.

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