2017-03-13 1 views
2

J'ai ce générateur qui semble fonctionner, mais quand je vérifie les valeurs générées, il ne choisit jamais la valeur nulle. Comment écrit-on un générateur qui choisira une valeur nulle. Ce code ne choisit jamais de valeur nulle pour la date "fin".Comment générer une valeur null pour les types Nullable avec FsCheck?

public static Gen<DateTime?> NullableDateTimeGen() 
    { 
     var list = new List<DateTime?>(); 

     if (list.Any() == false) 
     { 
      var endDate = DateTime.Now.AddDays(5); 
      var startDate = DateTime.Now.AddDays(-10); 

      list.AddRange(Enumerable.Range(0, 1 + endDate.Subtract(startDate).Days) 
       .Select(offset => startDate.AddDays(offset)) 
       .Cast<DateTime?>() 
       .ToList()); 

      list.Add(null); 
      list.Insert(0, null); 
     } 

     return from i in Gen.Choose(0, list.Count - 1) 
       select list[i]; 
    } 

    public static Arbitrary<Tuple<DateRange, DateTime>> TestTuple() 
    { 
     return (from s in NullableDateTimeGen().Where(x => x != null) 
       from e in NullableDateTimeGen() 
       from p in NullableDateTimeGen().Where(x => x != null) 
       where s <= e 
       select new Tuple<DateRange, DateTime>(new DateRange(s.Value, e), p.Value)) 
       .ToArbitrary(); 
    } 
+0

Que signifie exactement choisir pas les valeurs NULL? Fonction NullableDateTimeGen ou TestTuple? – Evk

+0

@Evk: TestTuple – epitka

Répondre

0

Le problème est pas lié à FsCheck et est dans cette déclaration:

from s in NullableDateTimeGen().Where(x => x != null) 
      from e in NullableDateTimeGen() 
      from p in NullableDateTimeGen().Where(x => x != null) 
      where s <= e 
      select new Tuple<DateRange, DateTime>(new DateRange(s.Value, e), p.Value)) 

Notez que vous filtrez et s de nulls p, donc ils ne sont jamais nuls. La seule chose qui peut être nulle si e. Cependant, vous

where s <= e 

Ce ne peut jamais être comparision vrai si e est nulle, parce que tout comparé à nul est toujours faux. Donc, vous filtrez les valeurs nulles pour e également.

Pour fixer simplement remplacer cette condition avec tout ce qui fait sens pour votre scénario, comme

where e == null || s <= e