JustDummies

Juste des dummies, mais redoutablement efficaces.

Sections de la documentation

JD023 : ScalarChainAdmitsNoValue

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

Les contraintes constantes réduisent le domaine entier à rien : la chaîne lève une ConflictingAnyConstraintException dès l’exécution de la ligne d’arrangement.

La bibliothèque calcule cela par un unique test de vacuité sur les bornes, le treillis et la liste d’autorisation. Cette règle exécute le même test sur les constantes écrites au site d’appel — et se tait pour tout argument qu’elle ne peut pas replier.

Non conforme

Any.Int32().Between(1, 10).MultipleOf(20)     // aucun multiple de 20 dans [1, 10]
Any.Int32().GreaterThan(10).LessThan(3)       // intervalle vide
Any.Int32().Positive().Negative()             // vide par construction
Any.Int32().Zero().NonZero()                  // la seule valeur restante est ensuite interdite
Any.Int32().OneOf(5).Except(5)                // la liste d'autorisation est vidée

Conforme

Any.Int32().Between(1, 10).MultipleOf(5)
Any.Int32().GreaterThan(-100).LessThan(100)
Any.Int32().OneOf(1, 2, 3).Except(2)

Portée, et une limite qui mérite d’être connue

Générateurs entiers uniquementInt32, Int16, Int64, Byte, SByte, UInt16, UInt32, UInt64. Le modèle est de l’arithmétique entière, et un domaine flottant ou décimal ne se comporte pas ainsi.

Les bornes vont jusqu’aux extrêmes représentables. Any.Int64().LessThanOrEqualTo(long.MinValue) est une chaîne légale qui produit exactement une valeur, et n’est pas signalée ; seule une borne réclamant quelque chose de réellement hors plage — GreaterThan(long.MaxValue) — vide le domaine. La première version de cette règle s’est trompée là-dessus, en prenant -long.MaxValue comme sentinelle « non borné », ce qui rendait long.MinValue inexprimable et condamnait une chaîne que la propre suite de la bibliothèque affirme légale.

Le modèle raisonne en long, où toute valeur des sept autres familles tient. Un ulong au-delà de long.MaxValue n’y tient pas : il est laissé sans jugement plutôt que tronqué en une borne qui voudrait dire autre chose.

Ce qui n’est pas signalé

  • Une chaîne dont un argument ne se replie pas en constante.
  • Une borne UInt64 au-delà de long.MaxValue — hors de la plage du modèle, la chaîne est laissée tranquille.
  • Une chaîne répartie sur plusieurs instructions — elle doit être une seule expression.
  • Une contrainte que le modèle ne suit pas : la marche s’arrête plutôt que de deviner.
  • Un test négatif vérifiant un conflit.

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