示例#1
0
        static void Main(string[] args)
        {
            var myObject = new MyObject(
                100,
                SingleCaseUnion.NewSingleCaseUnion(12345),
                DiscriminatedUnion.NewCase1DU(111, "aaa"),
                ListModule.OfSeq(new[] { 0, 1, 2, 3, 4, 5 }),
                MapModule.OfSeq(new[] { Tuple.Create("One", 1), Tuple.Create("Two", 2) }),
                Tuple.Create("Hello", "F# fans"),
                FSharpOption <string> .Some("Option1")
                );

            //var converters = new JsonConverter[0];
            var converters = new JsonConverter[] { new UnionConverter() };

            // Test a single serialize and deserialize
            var json        = JsonConvert.SerializeObject(myObject, converters);
            var myNewObject = JsonConvert.DeserializeObject <MyObject>(json, converters);

            Console.WriteLine("Writing {0}", json);
            //Console.WriteLine("Objects are the same {0}", (myObject == myNewObject));

            var count = 10000;

            Duration(() => SerializeLoad(false, count, myObject, converters), count, "Serialize Default");
            Duration(() => DeserializeLoad(false, count, myObject, converters), count, "Deserialize Default");
            Duration(() => SerializeLoad(true, count, myObject, converters), count, "Serialize Custom");
            Duration(() => DeserializeLoad(true, count, myObject, converters), count, "Deserialize Custom");
        }
示例#2
0
        internal static DataStoreEventArgs CreateDataStoreEventArgs <T>(ushort startAddress, ModbusDataType modbusDataType, IEnumerable <T> data)
        {
            if (data == null)
            {
                throw new ArgumentNullException("data");
            }

            if (!(typeof(T) == typeof(bool) || typeof(T) == typeof(ushort)))
            {
                throw new ArgumentException("Generic type T should be of type bool or ushort");
            }

            var eventArgs = new DataStoreEventArgs(startAddress, modbusDataType);

            if (typeof(T) == typeof(bool))
            {
                eventArgs.Data = DiscriminatedUnion <ReadOnlyCollection <bool>, ReadOnlyCollection <ushort> > .CreateA(data.Cast <bool>().ToReadOnly());
            }
            else
            {
                eventArgs.Data = DiscriminatedUnion <ReadOnlyCollection <bool>, ReadOnlyCollection <ushort> > .CreateB(data.Cast <ushort>().ToReadOnly());
            }

            return(eventArgs);
        }
示例#3
0
        public void DiscriminatedUnion_AllowNulls()
        {
            var du = DiscriminatedUnion <object, object> .CreateB(null);

            Assert.Equal(DiscriminatedUnionOption.B, du.Option);
            Assert.Equal(null, du.B);
        }
示例#4
0
    public void DiscriminatedUnion_CreateB()
    {
        DiscriminatedUnion <string, string>?du = DiscriminatedUnion <string, string> .CreateB("foo");

        Assert.Equal(DiscriminatedUnionOption.B, du.Option);
        Assert.Equal("foo", du.B);
    }
示例#5
0
        public void DiscriminatedUnion_CreateA()
        {
            var du = DiscriminatedUnion <string, string> .CreateA("foo");

            Assert.Equal(DiscriminatedUnionOption.A, du.Option);
            Assert.Equal("foo", du.A);
        }
示例#6
0
    internal static DataStoreEventArgs CreateDataStoreEventArgs <T>(ushort startAddress, ModbusDataType modbusDataType, IEnumerable <T> data)
    {
        if (data == null)
        {
            throw new ArgumentNullException(nameof(data));
        }

        DataStoreEventArgs eventArgs;

        if (typeof(T) == typeof(bool))
        {
            ReadOnlyCollection <bool>?a = new(data.Cast <bool>().ToArray());

            eventArgs = new DataStoreEventArgs(startAddress, modbusDataType)
            {
                Data = DiscriminatedUnion <ReadOnlyCollection <bool>, ReadOnlyCollection <ushort> > .CreateA(a)
            };
        }
        else if (typeof(T) == typeof(ushort))
        {
            ReadOnlyCollection <ushort>?b = new(data.Cast <ushort>().ToArray());

            eventArgs = new DataStoreEventArgs(startAddress, modbusDataType)
            {
                Data = DiscriminatedUnion <ReadOnlyCollection <bool>, ReadOnlyCollection <ushort> > .CreateB(b)
            };
        }
        else
        {
            throw new ArgumentException("Generic type T should be of type bool or ushort");
        }

        return(eventArgs);
    }
        public void Match2CasesTest()
        {
            var union = new DiscriminatedUnion <string, bool>("ok");

            Assert.True(union.Match(
                            s => true,
                            b => false
                            ));
        }
        public void DiscriminatedUnion_TwoTypes_ThrowsIfTypeNotAllowed()
        {
            // Arrange
            var union = new DiscriminatedUnion <int, string>();

            // Act/Assert
            var ex = Assert.Throws <InvalidOperationException>(() => union.Value = 'C');

            Assert.Equal("Type 'Char' is not a valid type for this value. Valid values are: 'Int32', 'String'.", ex.Message);
        }
        public void Write_DiscriminatedUnionAsString_WritesValueAsJson()
        {
            // Arrange
            DiscriminatedUnion <int, string> union = "Hello, World!";

            // Act
            var result = JsonSerializer.Serialize(union, _serializerOptions);

            // Assert
            Assert.Equal(@"""Hello, World!""", result);
        }
        public void Write_DiscriminatedUnionAsBool_WritesValueAsJson()
        {
            // Arrange
            DiscriminatedUnion <int, bool> union = true;

            // Act
            var result = JsonSerializer.Serialize(union, _serializerOptions);

            // Assert
            Assert.Equal("true", result);
        }
        public void Write_DiscriminatedUnionAsInteger_WritesValueAsJson()
        {
            // Arrange
            DiscriminatedUnion <int, IEnumerable <int> > union = 1;

            // Act
            var result = JsonSerializer.Serialize(union, _serializerOptions);

            // Assert
            Assert.Equal("1", result);
        }
示例#12
0
        public void CreateOptionType()
        {
            var typeName = "Option";

            var du = new DiscriminatedUnion(
                typeName,
                new SimpleDiscriminatedUnionCase("None", typeName),
                new ParameterisedDiscriminatedUnionCase("Some", typeName, "object"));

            var typeDefinition = du.ToString();
            WriteToFile(typeName, typeDefinition);
        }
        public void DiscriminatedUnion_TwoTypes_SetsValueIfAllowed()
        {
            // Arrange
            var union = new DiscriminatedUnion <int, string>();

            // Act/Assert
            union.Value = 1;
            Assert.IsType <int>(union.Value);
            Assert.Equal(1, union.Value);

            union.Value = "Hello, World!";
            Assert.IsType <string>(union.Value);
            Assert.Equal("Hello, World!", union.Value);
        }
示例#14
0
        public void Match3CasesTest()
        {
            var union = new DiscriminatedUnion <string, bool, int>(true);

            var fail = true;

            var r = union.Match(
                s => fail = true,
                b => fail = false,
                i => fail = true
                );

            Assert.False(fail);
            Assert.False(r);
        }
示例#15
0
 public void DeepCopyTests_FSharp_Types()
 {
     // discriminated union case with an array field
     {
         var original = DiscriminatedUnion.nonEmptyArray();
         var copy     = (DiscriminatedUnion)this.fixture.SerializationManager.DeepCopy(original);
         Assert.Equal(original, copy);
     }
     {
         var original = DiscriminatedUnion.emptyArray();
         var copy     = (DiscriminatedUnion)this.fixture.SerializationManager.DeepCopy(original);
         Assert.Equal(original, copy);
     }
     // discriminated union case with an F# list field
     {
         var original = DiscriminatedUnion.emptyList();
         var copy     = (DiscriminatedUnion)this.fixture.SerializationManager.DeepCopy(original);
         Assert.Equal(original, copy);
     }
     {
         var original = DiscriminatedUnion.nonEmptyList();
         var copy     = (DiscriminatedUnion)this.fixture.SerializationManager.DeepCopy(original);
         Assert.Equal(original, copy);
     }
     // discriminated union case with an F# set field
     {
         var original = DiscriminatedUnion.emptySet();
         var copy     = (DiscriminatedUnion)this.fixture.SerializationManager.DeepCopy(original);
         Assert.Equal(original, copy);
     }
     {
         var original = DiscriminatedUnion.nonEmptySet();
         var copy     = (DiscriminatedUnion)this.fixture.SerializationManager.DeepCopy(original);
         Assert.Equal(original, copy);
     }
     // discriminated union case with an F# map field
     {
         var original = DiscriminatedUnion.emptyMap();
         var copy     = (DiscriminatedUnion)this.fixture.SerializationManager.DeepCopy(original);
         Assert.Equal(original, copy);
     }
     {
         var original = DiscriminatedUnion.nonEmptyMap();
         var copy     = (DiscriminatedUnion)this.fixture.SerializationManager.DeepCopy(original);
         Assert.Equal(original, copy);
     }
 }
示例#16
0
        public void SerializationTests_FSharp_Discriminated_Union()
        {
            // discriminated union case with an array field
            RoundtripSerializationTest(DiscriminatedUnion.emptyArray());
            RoundtripSerializationTest(DiscriminatedUnion.nonEmptyArray());

            // discriminated union case with an F# list field
            RoundtripSerializationTest(DiscriminatedUnion.emptyList());
            RoundtripSerializationTest(DiscriminatedUnion.nonEmptyList());

            // discriminated union case with an F# set field
            RoundtripSerializationTest(DiscriminatedUnion.emptySet());
            RoundtripSerializationTest(DiscriminatedUnion.nonEmptySet());

            // discriminated union case with an F# map  field
            RoundtripSerializationTest(DiscriminatedUnion.emptyMap());
            RoundtripSerializationTest(DiscriminatedUnion.nonEmptyMap());
        }
示例#17
0
        public void Match4CasesTest()
        {
            var union = new DiscriminatedUnion <string, bool, int, long>(8L);

            Assert.Throws <Exception>(() =>
            {
                union.Match(
                    s => true,
                    b => false
                    );
            });

            Assert.True(union.Match(
                            s => false,
                            b => false,
                            i => false,
                            l => true
                            ));
        }
        public void DiscriminatedUnion_FourTypes_SetsValueIfAllowed()
        {
            // Arrange
            var union = new DiscriminatedUnion <int, string, long, decimal>();

            // Act/Assert
            union.Value = 1;
            Assert.IsType <int>(union.Value);
            Assert.Equal(1, union.Value);

            union.Value = "Hello, World!";
            Assert.IsType <string>(union.Value);
            Assert.Equal("Hello, World!", union.Value);

            union.Value = long.MaxValue;
            Assert.IsType <long>(union.Value);
            Assert.Equal(long.MaxValue, union.Value);

            union.Value = 1.2M;
            Assert.IsType <decimal>(union.Value);
            Assert.Equal(1.2M, union.Value);
        }
示例#19
0
        public void CreateShapeType()
        {
            var typeName = "Shape";

            var du = new DiscriminatedUnion(
                typeName,
                new SimpleDiscriminatedUnionCase("Point", typeName),
                new ParameterisedDiscriminatedUnionCase("Line", typeName, "int"),
                new ParameterisedDiscriminatedUnionCase(
                    "Square",
                    typeName,
                    Tuple.Create("Width", "int"),
                    Tuple.Create("Height", "int")),
                new ParameterisedDiscriminatedUnionCase(
                    "Cube",
                    typeName,
                    Tuple.Create("Width", "int"),
                    Tuple.Create("Height", "int"),
                    Tuple.Create("Depth", "int")));

            var typeDefinition = du.ToString();
            WriteToFile(typeName, typeDefinition);
        }
        public void AccessInvalidOption_B()
        {
            var du = DiscriminatedUnion <string, string> .CreateA("foo");

            du.B.ToString();
        }
示例#21
0
        public void DiscriminatedUnion_ToString()
        {
            var du = DiscriminatedUnion <string, string> .CreateA("foo");

            Assert.Equal(du.ToString(), "foo");
        }
示例#22
0
        public void AccessInvalidOption_B()
        {
            var du = DiscriminatedUnion <string, string> .CreateA("foo");

            Assert.Throws <InvalidOperationException>(() => du.B.ToString());
        }