Welcome to mirror list, hosted at ThFree Co, Russian Federation.

StringInterningTests.cs « ShareTests « Tests « Scripts « Assets « MessagePack.UnityClient « src - github.com/aspnet/MessagePack-CSharp.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: d4e98f77a5d24d22e7f31af2957939f6a2e52b02 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// Copyright (c) All contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using MessagePack.Formatters;
using MessagePack.Resolvers;
using Nerdbank.Streams;
using Xunit;

namespace MessagePack.Tests
{
    public class StringInterningTests
    {
        [Fact]
        public void NullString()
        {
            var seq = new Sequence<byte>();
            var writer = new MessagePackWriter(seq);
            writer.WriteNil();
            writer.Flush();

            var reader = new MessagePackReader(seq);
            string result = StandardResolver.Instance.GetFormatter<string>().Deserialize(ref reader, MessagePackSerializerOptions.Standard);
            Assert.Null(result);
        }

        [Fact]
        public void EmptyString()
        {
            var seq = new Sequence<byte>();
            var writer = new MessagePackWriter(seq);
            writer.Write(string.Empty);
            writer.Flush();

            var reader = new MessagePackReader(seq);
            string result = StandardResolver.Instance.GetFormatter<string>().Deserialize(ref reader, MessagePackSerializerOptions.Standard);
            Assert.Same(string.Empty, result);
        }

        [Theory]
        [InlineData(3)]
        [InlineData(1024 * 1024)]
        public void EquivalentStringsGetSharedInstance(int length)
        {
            string originalValue1 = new string('a', length);
            string originalValue3 = new string('b', length);
            var seq = new Sequence<byte>();
            var writer = new MessagePackWriter(seq);
            writer.Write(originalValue1);
            writer.Write(originalValue1);
            writer.Write(originalValue3);
            writer.Flush();

            var reader = new MessagePackReader(seq);
            var formatter = new StringInterningFormatter();
            string value1 = formatter.Deserialize(ref reader, MessagePackSerializerOptions.Standard);
            string value2 = formatter.Deserialize(ref reader, MessagePackSerializerOptions.Standard);
            string value3 = formatter.Deserialize(ref reader, MessagePackSerializerOptions.Standard);

            Assert.Equal(originalValue1, value1);
            Assert.Equal(originalValue3, value3);

            Assert.Same(value1, value2);
        }

        [Fact]
        public void StringMemberInterning()
        {
            ClassOfStrings before = new ClassOfStrings { InternedString = "abc", OrdinaryString = "def" };
            ClassOfStrings after1 = MessagePackSerializer.Deserialize<ClassOfStrings>(MessagePackSerializer.Serialize(before, MessagePackSerializerOptions.Standard), MessagePackSerializerOptions.Standard);
            ClassOfStrings after2 = MessagePackSerializer.Deserialize<ClassOfStrings>(MessagePackSerializer.Serialize(before, MessagePackSerializerOptions.Standard), MessagePackSerializerOptions.Standard);
            Assert.Equal(after1.InternedString, after2.InternedString);
            Assert.Equal(after1.OrdinaryString, after2.OrdinaryString);

            Assert.Same(after1.InternedString, after2.InternedString);
            Assert.NotSame(after1.OrdinaryString, after2.OrdinaryString);
        }

        [Fact]
        public void StringMemberInterning_CustomResolver()
        {
            var options = MessagePackSerializerOptions.Standard.WithResolver(
                CompositeResolver.Create(
                    new IMessagePackFormatter[] { new StringInterningFormatter() },
                    new IFormatterResolver[] { StandardResolver.Instance }));

            ClassOfStrings before = new ClassOfStrings { InternedString = "abc", OrdinaryString = "def" };
            ClassOfStrings after1 = MessagePackSerializer.Deserialize<ClassOfStrings>(MessagePackSerializer.Serialize(before, options), options);
            ClassOfStrings after2 = MessagePackSerializer.Deserialize<ClassOfStrings>(MessagePackSerializer.Serialize(before, options), options);
            Assert.Equal(after1.InternedString, after2.InternedString);
            Assert.Equal(after1.OrdinaryString, after2.OrdinaryString);

            Assert.Same(after1.InternedString, after2.InternedString);
            Assert.Same(after1.OrdinaryString, after2.OrdinaryString);
        }

        [MessagePackObject]
        public class ClassOfStrings
        {
            [Key(0)]
            [MessagePackFormatter(typeof(StringInterningFormatter))]
            public string InternedString { get; set; }

            [Key(1)]
            public string OrdinaryString { get; set; }
        }
    }
}