FsCheck icon indicating copy to clipboard operation
FsCheck copied to clipboard

Consider adding NullableRef and NullableValue wrappers

Open jibbers42 opened this issue 2 years ago • 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?

jibbers42 avatar Jun 03 '22 09:06 jibbers42

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.

kurtschelfthout avatar Jun 03 '22 21:06 kurtschelfthout

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?

jibbers42 avatar Jun 03 '22 22:06 jibbers42

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;
    
}

kurtschelfthout avatar Jun 03 '22 22:06 kurtschelfthout

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.

jibbers42 avatar Jun 03 '22 23:06 jibbers42