#nullable enable using System; using Barotrauma; using Barotrauma.Networking; using FluentAssertions; using FsCheck; using Microsoft.Xna.Framework; using Xunit; namespace TestProject { // ReSharper disable UnusedMember.Local NotAccessedField.Local UnusedMember.Global public class INetSerializableStructTests { private class CustomGenerators { // no null strings!!! public static Arbitrary StringGeneratorOverride() => Arb.Default.String().Generator.Where(s => s != null).ToArbitrary(); } public INetSerializableStructTests() { Arb.Register(); Arb.Register(); } [Fact] public void TestOptional() { Prop.ForAll>(SerializeDeserialize).QuickCheckThrowOnFailure(); Prop.ForAll>(SerializeDeserialize).QuickCheckThrowOnFailure(); Prop.ForAll>(SerializeDeserialize).QuickCheckThrowOnFailure(); } [Fact] public void TestNested() { Prop.ForAll((arg1, arg2, arg3) => SerializeDeserializeNullableTuple(arg1, new TupleNullableStruct { One = arg2, Two = arg3 })).QuickCheckThrowOnFailure(); Prop.ForAll((arg1, arg2) => SerializeDeserialize(new TupleNullableStruct { One = arg1, Two = arg2 })).QuickCheckThrowOnFailure(); Prop.ForAll((arg1, arg2) => SerializeDeserialize(new TupleNullableStruct { One = arg1, Two = arg2 })).QuickCheckThrowOnFailure(); } [Fact] public void TestVector2() { Prop.ForAll(SerializeDeserialize).QuickCheckThrowOnFailure(); } [Fact] public void TestColor() { Prop.ForAll(SerializeDeserialize).QuickCheckThrowOnFailure(); } [Fact] public void TestEnum() { Prop.ForAll(SerializeDeserialize).QuickCheckThrowOnFailure(); } [Fact] public void TestArray() { Prop.ForAll(SerializeDeserialize).QuickCheckThrowOnFailure(); Prop.ForAll(SerializeDeserialize).QuickCheckThrowOnFailure(); Prop.ForAll(SerializeDeserialize).QuickCheckThrowOnFailure(); } [Fact] public void TestNullable() { Prop.ForAll(SerializeDeserializeNullableTuple).QuickCheckThrowOnFailure(); } [Fact] public void TestBoolean() { Prop.ForAll(SerializeDeserialize).QuickCheckThrowOnFailure(); } [Fact] public void TestByte() { Prop.ForAll(SerializeDeserialize).QuickCheckThrowOnFailure(); } [Fact] public void TestUInt16() { Prop.ForAll(SerializeDeserialize).QuickCheckThrowOnFailure(); } [Fact] public void TestInt16() { Prop.ForAll(SerializeDeserialize).QuickCheckThrowOnFailure(); } [Fact] public void TestUInt32() { Prop.ForAll(SerializeDeserialize).QuickCheckThrowOnFailure(); } [Fact] public void TestInt32() { Prop.ForAll(SerializeDeserialize).QuickCheckThrowOnFailure(); } [Fact] public void TestUInt64() { Prop.ForAll(SerializeDeserialize).QuickCheckThrowOnFailure(); } [Fact] public void TestInt64() { Prop.ForAll(SerializeDeserialize).QuickCheckThrowOnFailure(); } [Fact] public void TestSingle() { Prop.ForAll(SerializeDeserialize).QuickCheckThrowOnFailure(); } [Fact] public void TestDouble() { Prop.ForAll(SerializeDeserialize).QuickCheckThrowOnFailure(); } [Fact] public void TestString() { Prop.ForAll(SerializeDeserialize).QuickCheckThrowOnFailure(); } private enum EnumTest { One = 1, Two = 2, Three = 3, Thousand = 1000 } private struct TestStruct : INetSerializableStruct { [NetworkSerialize] public T Value; public T NotSerializedValue; public T NotSerializedFunction() => throw new NotImplementedException(); } private struct TupleNullableStruct : INetSerializableStruct { [NetworkSerialize] public T? One; [NetworkSerialize] public U? Two; public (T, U) NotSerializedValue; public (T, U) NotSerializedFunction() => throw new NotImplementedException(); } private static void SerializeDeserialize(T arg) where T : notnull { ReadWriteMessage msg = new ReadWriteMessage(); TestStruct writeStruct = new TestStruct { Value = arg }; ((INetSerializableStruct)writeStruct).Write(msg); msg.BitPosition = 0; TestStruct readStruct = INetSerializableStruct.Read>(msg); readStruct.Should().BeEquivalentTo(writeStruct, options => options.ComparingByMembers>()); } private static void SerializeDeserializeNullableTuple(T arg1, U arg2) { ReadWriteMessage msg = new ReadWriteMessage(); TupleNullableStruct writeStruct = new TupleNullableStruct { One = arg1, Two = arg2 }; ((INetSerializableStruct)writeStruct).Write(msg); msg.BitPosition = 0; TupleNullableStruct readStruct = INetSerializableStruct.Read>(msg); readStruct.Should().BeEquivalentTo(writeStruct, options => options.ComparingByMembers>()); } } }