1#region Copyright notice and license 2// Protocol Buffers - Google's data interchange format 3// Copyright 2008 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 33using System; 34using System.Text; 35using NUnit.Framework; 36 37namespace Google.Protobuf 38{ 39 public class ByteStringTest 40 { 41 [Test] 42 public void Equality() 43 { 44 ByteString b1 = ByteString.CopyFrom(1, 2, 3); 45 ByteString b2 = ByteString.CopyFrom(1, 2, 3); 46 ByteString b3 = ByteString.CopyFrom(1, 2, 4); 47 ByteString b4 = ByteString.CopyFrom(1, 2, 3, 4); 48 EqualityTester.AssertEquality(b1, b1); 49 EqualityTester.AssertEquality(b1, b2); 50 EqualityTester.AssertInequality(b1, b3); 51 EqualityTester.AssertInequality(b1, b4); 52 EqualityTester.AssertInequality(b1, null); 53#pragma warning disable 1718 // Deliberately calling ==(b1, b1) and !=(b1, b1) 54 Assert.IsTrue(b1 == b1); 55 Assert.IsTrue(b1 == b2); 56 Assert.IsFalse(b1 == b3); 57 Assert.IsFalse(b1 == b4); 58 Assert.IsFalse(b1 == null); 59 Assert.IsTrue((ByteString) null == null); 60 Assert.IsFalse(b1 != b1); 61 Assert.IsFalse(b1 != b2); 62#pragma warning disable 1718 63 Assert.IsTrue(b1 != b3); 64 Assert.IsTrue(b1 != b4); 65 Assert.IsTrue(b1 != null); 66 Assert.IsFalse((ByteString) null != null); 67 } 68 69 [Test] 70 public void EmptyByteStringHasZeroSize() 71 { 72 Assert.AreEqual(0, ByteString.Empty.Length); 73 } 74 75 [Test] 76 public void CopyFromStringWithExplicitEncoding() 77 { 78 ByteString bs = ByteString.CopyFrom("AB", Encoding.Unicode); 79 Assert.AreEqual(4, bs.Length); 80 Assert.AreEqual(65, bs[0]); 81 Assert.AreEqual(0, bs[1]); 82 Assert.AreEqual(66, bs[2]); 83 Assert.AreEqual(0, bs[3]); 84 } 85 86 [Test] 87 public void IsEmptyWhenEmpty() 88 { 89 Assert.IsTrue(ByteString.CopyFromUtf8("").IsEmpty); 90 } 91 92 [Test] 93 public void IsEmptyWhenNotEmpty() 94 { 95 Assert.IsFalse(ByteString.CopyFromUtf8("X").IsEmpty); 96 } 97 98 [Test] 99 public void CopyFromByteArrayCopiesContents() 100 { 101 byte[] data = new byte[1]; 102 data[0] = 10; 103 ByteString bs = ByteString.CopyFrom(data); 104 Assert.AreEqual(10, bs[0]); 105 data[0] = 5; 106 Assert.AreEqual(10, bs[0]); 107 } 108 109 [Test] 110 public void ToByteArrayCopiesContents() 111 { 112 ByteString bs = ByteString.CopyFromUtf8("Hello"); 113 byte[] data = bs.ToByteArray(); 114 Assert.AreEqual((byte)'H', data[0]); 115 Assert.AreEqual((byte)'H', bs[0]); 116 data[0] = 0; 117 Assert.AreEqual(0, data[0]); 118 Assert.AreEqual((byte)'H', bs[0]); 119 } 120 121 [Test] 122 public void CopyFromUtf8UsesUtf8() 123 { 124 ByteString bs = ByteString.CopyFromUtf8("\u20ac"); 125 Assert.AreEqual(3, bs.Length); 126 Assert.AreEqual(0xe2, bs[0]); 127 Assert.AreEqual(0x82, bs[1]); 128 Assert.AreEqual(0xac, bs[2]); 129 } 130 131 [Test] 132 public void CopyFromPortion() 133 { 134 byte[] data = new byte[] {0, 1, 2, 3, 4, 5, 6}; 135 ByteString bs = ByteString.CopyFrom(data, 2, 3); 136 Assert.AreEqual(3, bs.Length); 137 Assert.AreEqual(2, bs[0]); 138 Assert.AreEqual(3, bs[1]); 139 } 140 141 [Test] 142 public void ToStringUtf8() 143 { 144 ByteString bs = ByteString.CopyFromUtf8("\u20ac"); 145 Assert.AreEqual("\u20ac", bs.ToStringUtf8()); 146 } 147 148 [Test] 149 public void ToStringWithExplicitEncoding() 150 { 151 ByteString bs = ByteString.CopyFrom("\u20ac", Encoding.Unicode); 152 Assert.AreEqual("\u20ac", bs.ToString(Encoding.Unicode)); 153 } 154 155 [Test] 156 public void FromBase64_WithText() 157 { 158 byte[] data = new byte[] {0, 1, 2, 3, 4, 5, 6}; 159 string base64 = Convert.ToBase64String(data); 160 ByteString bs = ByteString.FromBase64(base64); 161 Assert.AreEqual(data, bs.ToByteArray()); 162 } 163 164 [Test] 165 public void FromBase64_Empty() 166 { 167 // Optimization which also fixes issue 61. 168 Assert.AreSame(ByteString.Empty, ByteString.FromBase64("")); 169 } 170 } 171}