fscheck/FsCheck

Consider adding NullableRef and NullableValue wrappers

Opened this issue · 4 comments

The code below does not fail in v3. This seems similar to #30 (v2 does still return nulls).

[Property]
public Property Test(string s) {
  return (s != null).Collect(s);
}

Is this an expected change for v3? What is the recommended way to have nulls mixed in?

Yeah, I felt like the default has changed to "nulls are opt-in" in recent years, in F# since the beginning and in C# more recently.

You can write a string generator that also generates nulls in whatever frequency you'd like.

Thank you, I was able to figure out the following which fails the test with nulls...

[Property]
public Property Test() {
  // Gen<string?> NullableString() => Gen.Frequency((1, Gen.Constant<string?>(null)), (7, ArbMap.Default.GeneratorFor<string?>()));
  Gen<string?> NullableString() => Gen.OrNull(ArbMap.Default.GeneratorFor<string?>());

  return Prop.ForAll(NullableString().ToArbitrary(), s => {
    return (s != null).Collect(s);
  });
}

I see something in the source called Nullable that looks like it gens a null 1/8th of the time and may be simpler to use, but I can't figure out how to use it. Do you have an example somewhere?

that's in reference to https://docs.microsoft.com/en-us/dotnet/api/system.nullable-1.value?view=net-6.0 i.e. for nullable value types. So it won't help with strings.

Should probably have NullableRef and NullableValue at this point...

The idea to use this would be:

public Property Test(NullableRef<string> wrapper) {
    var theStringOrNull = wrapper.Value;
    
}

OK, thanks for all the help!

Not sure if you want this issue open for "NullableRef and NullableValue", so feel free to close if not.