1 #region Copyright notice and license 2 // Protocol Buffers - Google's data interchange format 3 // Copyright 2017 Google Inc. All rights reserved. 4 // 5 // Use of this source code is governed by a BSD-style 6 // license that can be found in the LICENSE file or at 7 // https://developers.google.com/open-source/licenses/bsd 8 #endregion 9 10 using NUnit.Framework; 11 using System.Collections.Generic; 12 using System.Linq; 13 using static Google.Protobuf.Collections.ProtobufEqualityComparers; 14 15 namespace Google.Protobuf.Collections 16 { 17 public class ProtobufEqualityComparersTest 18 { 19 private static readonly double[] doubles = 20 { 21 0, 22 1, 23 1.5, 24 -1.5, 25 double.PositiveInfinity, 26 double.NegativeInfinity, 27 // Three different types of NaN... 28 SampleNaNs.Regular, 29 SampleNaNs.SignallingFlipped, 30 SampleNaNs.PayloadFlipped 31 }; 32 33 [Test] GetEqualityComparer_Default()34 public void GetEqualityComparer_Default() 35 { 36 // It's more pain than it's worth to try to parameterize these tests. 37 Assert.AreSame(EqualityComparer<object>.Default, GetEqualityComparer<object>()); 38 Assert.AreSame(EqualityComparer<string>.Default, GetEqualityComparer<string>()); 39 Assert.AreSame(EqualityComparer<int>.Default, GetEqualityComparer<int>()); 40 Assert.AreSame(EqualityComparer<int?>.Default, GetEqualityComparer<int?>()); 41 } 42 43 [Test] GetEqualityComparer_NotDefault()44 public void GetEqualityComparer_NotDefault() 45 { 46 // It's more pain than it's worth to try to parameterize these tests. 47 Assert.AreSame(BitwiseDoubleEqualityComparer, GetEqualityComparer<double>()); 48 Assert.AreSame(BitwiseSingleEqualityComparer, GetEqualityComparer<float>()); 49 Assert.AreSame(BitwiseNullableDoubleEqualityComparer, GetEqualityComparer<double?>()); 50 Assert.AreSame(BitwiseNullableSingleEqualityComparer, GetEqualityComparer<float?>()); 51 } 52 53 [Test] DoubleComparisons()54 public void DoubleComparisons() 55 { 56 ValidateEqualityComparer(BitwiseDoubleEqualityComparer, doubles); 57 } 58 59 [Test] NullableDoubleComparisons()60 public void NullableDoubleComparisons() 61 { 62 ValidateEqualityComparer(BitwiseNullableDoubleEqualityComparer, doubles.Select(d => (double?) d).Concat(new double?[] { null })); 63 } 64 65 [Test] SingleComparisons()66 public void SingleComparisons() 67 { 68 ValidateEqualityComparer(BitwiseSingleEqualityComparer, doubles.Select(d => (float) d)); 69 } 70 71 [Test] NullableSingleComparisons()72 public void NullableSingleComparisons() 73 { 74 ValidateEqualityComparer(BitwiseNullableSingleEqualityComparer, doubles.Select(d => (float?) d).Concat(new float?[] { null })); 75 } 76 ValidateEqualityComparer(EqualityComparer<T> comparer, IEnumerable<T> values)77 private static void ValidateEqualityComparer<T>(EqualityComparer<T> comparer, IEnumerable<T> values) 78 { 79 var array = values.ToArray(); 80 // Each value should be equal to itself, but not to any other value. 81 for (int i = 0; i < array.Length; i++) 82 { 83 for (int j = 0; j < array.Length; j++) 84 { 85 if (i == j) 86 { 87 Assert.IsTrue(comparer.Equals(array[i], array[j]), 88 "{0} should be equal to itself", array[i], array[j]); 89 } 90 else 91 { 92 Assert.IsFalse(comparer.Equals(array[i], array[j]), 93 "{0} and {1} should not be equal", array[i], array[j]); 94 Assert.AreNotEqual(comparer.GetHashCode(array[i]), comparer.GetHashCode(array[j]), 95 "Hash codes for {0} and {1} should not be equal", array[i], array[j]); 96 } 97 } 98 } 99 } 100 } 101 } 102