diff --git a/Directory.Packages.props b/Directory.Packages.props
index cbe66772..0ae2bf37 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -10,6 +10,7 @@
+
diff --git a/Funcky.Xunit.v3.Test/Funcky.Xunit.v3.Test.csproj b/Funcky.Xunit.v3.Test/Funcky.Xunit.v3.Test.csproj
index fce7830d..d2e42bb3 100644
--- a/Funcky.Xunit.v3.Test/Funcky.Xunit.v3.Test.csproj
+++ b/Funcky.Xunit.v3.Test/Funcky.Xunit.v3.Test.csproj
@@ -1,4 +1,4 @@
-
+
net9.0
preview
@@ -24,4 +24,5 @@
+
diff --git a/Funcky.Xunit.v3.Test/Serializers/EitherSerializerTest.cs b/Funcky.Xunit.v3.Test/Serializers/EitherSerializerTest.cs
new file mode 100644
index 00000000..27cd7f4b
--- /dev/null
+++ b/Funcky.Xunit.v3.Test/Serializers/EitherSerializerTest.cs
@@ -0,0 +1,38 @@
+using Funcky.Xunit.Serializers;
+
+namespace Funcky.Xunit.Test;
+
+public sealed class EitherSerializerTest
+{
+ private static readonly EitherSerializer Serializer = new();
+
+ [Theory]
+ [MemberData(nameof(EitherProvider))]
+ public void RoundtripsEitherValues(IEither either)
+ {
+ Assert.True(Serializer.IsSerializable(either.GetType(), either, out _));
+ var serialized = Serializer.Serialize(either);
+ var deserialized = Serializer.Deserialize(either.GetType(), serialized);
+ Assert.Equal(either, deserialized);
+ }
+
+ public static TheoryData EitherProvider()
+ => new((IEnumerable)[
+ Either.Return(10),
+ Either.Return(20),
+ Either.Left("foo"),
+ Either.Left("bar"),
+ Either.Left("bar"),
+ Either.Right(42),
+ Either.Left(42),
+ ]);
+
+ [Fact]
+ public void EitherSideOfNonSerializableTypeIsNotSerializable()
+ {
+ Assert.False(Serializer.IsSerializable(typeof(Either), Either.Left(new NonSerializable()), out _));
+ Assert.False(Serializer.IsSerializable(typeof(Either), Either.Right(new NonSerializable()), out _));
+ }
+
+ public sealed class NonSerializable;
+}
diff --git a/Funcky.Xunit.v3.Test/Serializers/OptionSerializerTest.cs b/Funcky.Xunit.v3.Test/Serializers/OptionSerializerTest.cs
new file mode 100644
index 00000000..25fadc4d
--- /dev/null
+++ b/Funcky.Xunit.v3.Test/Serializers/OptionSerializerTest.cs
@@ -0,0 +1,45 @@
+using Funcky.Xunit.Serializers;
+
+namespace Funcky.Xunit.Test;
+
+public sealed class OptionSerializerTest
+{
+ private static readonly OptionSerializer Serializer = new();
+
+ [Theory]
+ [MemberData(nameof(OptionProvider))]
+ public void RoundtripsOptionValues(Option option)
+ {
+ var serialized = Serializer.Serialize(option);
+ var deserialized = Serializer.Deserialize(option.GetType(), serialized);
+ Assert.Equal(option, deserialized);
+ }
+
+ public static TheoryData