OLD | NEW |
(Empty) | |
| 1 #region Copyright notice and license |
| 2 // Protocol Buffers - Google's data interchange format |
| 3 // Copyright 2015 Google Inc. All rights reserved. |
| 4 // https://developers.google.com/protocol-buffers/ |
| 5 // |
| 6 // Redistribution and use in source and binary forms, with or without |
| 7 // modification, are permitted provided that the following conditions are |
| 8 // met: |
| 9 // |
| 10 // * Redistributions of source code must retain the above copyright |
| 11 // notice, this list of conditions and the following disclaimer. |
| 12 // * Redistributions in binary form must reproduce the above |
| 13 // copyright notice, this list of conditions and the following disclaimer |
| 14 // in the documentation and/or other materials provided with the |
| 15 // distribution. |
| 16 // * Neither the name of Google Inc. nor the names of its |
| 17 // contributors may be used to endorse or promote products derived from |
| 18 // this software without specific prior written permission. |
| 19 // |
| 20 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| 21 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| 22 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| 23 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| 24 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| 25 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| 26 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 27 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 28 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 29 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 30 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 31 #endregion |
| 32 |
| 33 using System.Collections.Generic; |
| 34 using System.IO; |
| 35 using Google.Protobuf.TestProtos; |
| 36 using NUnit.Framework; |
| 37 |
| 38 namespace Google.Protobuf |
| 39 { |
| 40 public class FieldCodecTest |
| 41 { |
| 42 #pragma warning disable 0414 // Used by tests via reflection - do not remove! |
| 43 private static readonly List<ICodecTestData> Codecs = new List<ICodecTes
tData> |
| 44 { |
| 45 new FieldCodecTestData<bool>(FieldCodec.ForBool(100), true, "Bool"), |
| 46 new FieldCodecTestData<string>(FieldCodec.ForString(100), "sample",
"String"), |
| 47 new FieldCodecTestData<ByteString>(FieldCodec.ForBytes(100), ByteStr
ing.CopyFrom(1, 2, 3), "Bytes"), |
| 48 new FieldCodecTestData<int>(FieldCodec.ForInt32(100), -1000, "Int32"
), |
| 49 new FieldCodecTestData<int>(FieldCodec.ForSInt32(100), -1000, "SInt3
2"), |
| 50 new FieldCodecTestData<int>(FieldCodec.ForSFixed32(100), -1000, "SFi
xed32"), |
| 51 new FieldCodecTestData<uint>(FieldCodec.ForUInt32(100), 1234, "UInt3
2"), |
| 52 new FieldCodecTestData<uint>(FieldCodec.ForFixed32(100), 1234, "Fixe
d32"), |
| 53 new FieldCodecTestData<long>(FieldCodec.ForInt64(100), -1000, "Int64
"), |
| 54 new FieldCodecTestData<long>(FieldCodec.ForSInt64(100), -1000, "SInt
64"), |
| 55 new FieldCodecTestData<long>(FieldCodec.ForSFixed64(100), -1000, "SF
ixed64"), |
| 56 new FieldCodecTestData<ulong>(FieldCodec.ForUInt64(100), 1234, "UInt
64"), |
| 57 new FieldCodecTestData<ulong>(FieldCodec.ForFixed64(100), 1234, "Fix
ed64"), |
| 58 new FieldCodecTestData<float>(FieldCodec.ForFloat(100), 1234.5f, "Fl
oat"), |
| 59 new FieldCodecTestData<double>(FieldCodec.ForDouble(100), 1234567890
.5d, "Double"), |
| 60 new FieldCodecTestData<ForeignEnum>( |
| 61 FieldCodec.ForEnum(100, t => (int) t, t => (ForeignEnum) t), For
eignEnum.FOREIGN_BAZ, "Enum"), |
| 62 new FieldCodecTestData<ForeignMessage>( |
| 63 FieldCodec.ForMessage(100, ForeignMessage.Parser), new ForeignMe
ssage { C = 10 }, "Message"), |
| 64 }; |
| 65 #pragma warning restore 0414 |
| 66 |
| 67 [Test, TestCaseSource("Codecs")] |
| 68 public void RoundTripWithTag(ICodecTestData codec) |
| 69 { |
| 70 codec.TestRoundTripWithTag(); |
| 71 } |
| 72 |
| 73 [Test, TestCaseSource("Codecs")] |
| 74 public void RoundTripRaw(ICodecTestData codec) |
| 75 { |
| 76 codec.TestRoundTripRaw(); |
| 77 } |
| 78 |
| 79 [Test, TestCaseSource("Codecs")] |
| 80 public void CalculateSize(ICodecTestData codec) |
| 81 { |
| 82 codec.TestCalculateSizeWithTag(); |
| 83 } |
| 84 |
| 85 [Test, TestCaseSource("Codecs")] |
| 86 public void DefaultValue(ICodecTestData codec) |
| 87 { |
| 88 codec.TestDefaultValue(); |
| 89 } |
| 90 |
| 91 [Test, TestCaseSource("Codecs")] |
| 92 public void FixedSize(ICodecTestData codec) |
| 93 { |
| 94 codec.TestFixedSize(); |
| 95 } |
| 96 |
| 97 // This is ugly, but it means we can have a non-generic interface. |
| 98 // It feels like NUnit should support this better, but I don't know |
| 99 // of any better ways right now. |
| 100 public interface ICodecTestData |
| 101 { |
| 102 void TestRoundTripRaw(); |
| 103 void TestRoundTripWithTag(); |
| 104 void TestCalculateSizeWithTag(); |
| 105 void TestDefaultValue(); |
| 106 void TestFixedSize(); |
| 107 } |
| 108 |
| 109 public class FieldCodecTestData<T> : ICodecTestData |
| 110 { |
| 111 private readonly FieldCodec<T> codec; |
| 112 private readonly T sampleValue; |
| 113 private readonly string name; |
| 114 |
| 115 public FieldCodecTestData(FieldCodec<T> codec, T sampleValue, string
name) |
| 116 { |
| 117 this.codec = codec; |
| 118 this.sampleValue = sampleValue; |
| 119 this.name = name; |
| 120 } |
| 121 |
| 122 public void TestRoundTripRaw() |
| 123 { |
| 124 var stream = new MemoryStream(); |
| 125 var codedOutput = new CodedOutputStream(stream); |
| 126 codec.ValueWriter(codedOutput, sampleValue); |
| 127 codedOutput.Flush(); |
| 128 stream.Position = 0; |
| 129 var codedInput = new CodedInputStream(stream); |
| 130 Assert.AreEqual(sampleValue, codec.ValueReader(codedInput)); |
| 131 Assert.IsTrue(codedInput.IsAtEnd); |
| 132 } |
| 133 |
| 134 public void TestRoundTripWithTag() |
| 135 { |
| 136 var stream = new MemoryStream(); |
| 137 var codedOutput = new CodedOutputStream(stream); |
| 138 codec.WriteTagAndValue(codedOutput, sampleValue); |
| 139 codedOutput.Flush(); |
| 140 stream.Position = 0; |
| 141 var codedInput = new CodedInputStream(stream); |
| 142 codedInput.AssertNextTag(codec.Tag); |
| 143 Assert.AreEqual(sampleValue, codec.Read(codedInput)); |
| 144 Assert.IsTrue(codedInput.IsAtEnd); |
| 145 } |
| 146 |
| 147 public void TestCalculateSizeWithTag() |
| 148 { |
| 149 var stream = new MemoryStream(); |
| 150 var codedOutput = new CodedOutputStream(stream); |
| 151 codec.WriteTagAndValue(codedOutput, sampleValue); |
| 152 codedOutput.Flush(); |
| 153 Assert.AreEqual(stream.Position, codec.CalculateSizeWithTag(samp
leValue)); |
| 154 } |
| 155 |
| 156 public void TestDefaultValue() |
| 157 { |
| 158 // WriteTagAndValue ignores default values |
| 159 var stream = new MemoryStream(); |
| 160 var codedOutput = new CodedOutputStream(stream); |
| 161 codec.WriteTagAndValue(codedOutput, codec.DefaultValue); |
| 162 codedOutput.Flush(); |
| 163 Assert.AreEqual(0, stream.Position); |
| 164 Assert.AreEqual(0, codec.CalculateSizeWithTag(codec.DefaultValue
)); |
| 165 if (typeof(T).IsValueType) |
| 166 { |
| 167 Assert.AreEqual(default(T), codec.DefaultValue); |
| 168 } |
| 169 |
| 170 // The plain ValueWriter/ValueReader delegates don't. |
| 171 if (codec.DefaultValue != null) // This part isn't appropriate f
or message types. |
| 172 { |
| 173 codedOutput = new CodedOutputStream(stream); |
| 174 codec.ValueWriter(codedOutput, codec.DefaultValue); |
| 175 codedOutput.Flush(); |
| 176 Assert.AreNotEqual(0, stream.Position); |
| 177 Assert.AreEqual(stream.Position, codec.ValueSizeCalculator(c
odec.DefaultValue)); |
| 178 stream.Position = 0; |
| 179 var codedInput = new CodedInputStream(stream); |
| 180 Assert.AreEqual(codec.DefaultValue, codec.ValueReader(codedI
nput)); |
| 181 } |
| 182 } |
| 183 |
| 184 public void TestFixedSize() |
| 185 { |
| 186 Assert.AreEqual(name.Contains("Fixed"), codec.FixedSize != 0); |
| 187 } |
| 188 |
| 189 public override string ToString() |
| 190 { |
| 191 return name; |
| 192 } |
| 193 } |
| 194 } |
| 195 } |
OLD | NEW |