• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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