2017-03-13 25 views
2

私はこのジェネレータが動作しているようですが、生成された値をチェックすると、決してnull値を選択しません。ヌル値を選択するジェネレータはどのように記述しますか?このコードでは、「終了日」の日付のNULL値は決して選択されません。FsCheckでヌル入力可能な型のnullを生成する方法は?

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

のように、何でも自分のシナリオのために理にかなっていると、その条件を置き換える?固定するために

NullableDateTimeGenまたはTestTuple関数ですか? – Evk

+0

@Evk:TestTuple – epitka

答えて

0

問題はFsCheckに関連して、この文であるされていません:あなたはspからNULL値をフィルタリング

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)) 

注ので、彼らはnullになることはありません。 eの場合はnullになりうる唯一のものです。ヌルと比べて何かが常にfalseであるためeは、nullの場合しかし、あなたは

where s <= e 

この比較ですが、真なることはありませんか。したがって、eのヌル値も除外します。ちょうどnull値を選択しない、正確に何

where e == null || s <= e 
関連する問題