Skip to content

Commit 1c02a3d

Browse files
authored
Merge pull request #523 Replace GetHashCode implementation to match library
Replace GetHashCode implementation to match library. Fixing exception…
2 parents 7cfca07 + 283c6b6 commit 1c02a3d

File tree

2 files changed

+122
-26
lines changed

2 files changed

+122
-26
lines changed

UnitsNet.Tests/BaseDimensionsTests.cs

+90-2
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,83 @@
1-
using Xunit;
1+
using System;
2+
using System.Collections.Generic;
3+
using Xunit;
24

35
namespace UnitsNet.Tests
46
{
57
public class BaseDimensionsTests
68
{
79
[Fact]
8-
public void EqualityWorksAsExpected()
10+
public void EqualsWorksAsExpected()
911
{
1012
var baseDimensions1 = new BaseDimensions(1, 2, 3, 4, 5, 6, 7);
1113
var baseDimensions2 = new BaseDimensions(1, 2, 3, 4, 5, 6, 7);
1214

1315
Assert.True(baseDimensions1.Equals(baseDimensions2));
1416
Assert.True(baseDimensions2.Equals(baseDimensions1));
17+
18+
Assert.False(baseDimensions1.Equals(null));
19+
}
20+
21+
[Fact]
22+
public void EqualityOperatorsWorkAsExpected()
23+
{
24+
var baseDimensions1 = new BaseDimensions(1, 2, 3, 4, 5, 6, 7);
25+
var baseDimensions2 = new BaseDimensions(1, 2, 3, 4, 5, 6, 7);
26+
27+
Assert.True(baseDimensions1 == baseDimensions2);
28+
Assert.True(baseDimensions2 == baseDimensions1);
29+
30+
Assert.False(baseDimensions1 == null);
31+
Assert.False(null == baseDimensions1);
32+
33+
Assert.False(baseDimensions2 == null);
34+
Assert.False(null == baseDimensions2);
35+
}
36+
37+
[Fact]
38+
public void InequalityOperatorsWorkAsExpected()
39+
{
40+
var baseDimensions1 = new BaseDimensions(1, 2, 3, 4, 5, 6, 7);
41+
var baseDimensions2 = new BaseDimensions(7, 6, 5, 4, 3, 2, 1);
42+
43+
Assert.True(baseDimensions1 != baseDimensions2);
44+
Assert.True(baseDimensions2 != baseDimensions1);
45+
46+
Assert.True(baseDimensions1 != null);
47+
Assert.True(null != baseDimensions1);
48+
49+
Assert.True(baseDimensions2 != null);
50+
Assert.True(null != baseDimensions2);
51+
}
52+
53+
[Fact]
54+
public void MultiplyThrowsExceptionIfPassedNull()
55+
{
56+
var baseDimensions1 = new BaseDimensions(1, 0, 0, 0, 0, 0, 0);
57+
Assert.Throws<ArgumentNullException>(() => baseDimensions1.Multiply(null));
58+
}
59+
60+
[Fact]
61+
public void DivideThrowsExceptionIfPassedNull()
62+
{
63+
var baseDimensions1 = new BaseDimensions(1, 0, 0, 0, 0, 0, 0);
64+
Assert.Throws<ArgumentNullException>(() => baseDimensions1.Divide(null));
65+
}
66+
67+
[Fact]
68+
public void MultiplyOperatorThrowsExceptionWithNull()
69+
{
70+
var baseDimensions1 = new BaseDimensions(1, 0, 0, 0, 0, 0, 0);
71+
Assert.Throws<ArgumentNullException>(() => baseDimensions1 / null);
72+
Assert.Throws<ArgumentNullException>(() => null / baseDimensions1);
73+
}
74+
75+
[Fact]
76+
public void DivideOperatorThrowsExceptionWithNull()
77+
{
78+
var baseDimensions1 = new BaseDimensions(1, 0, 0, 0, 0, 0, 0);
79+
Assert.Throws<ArgumentNullException>(() => baseDimensions1 * null);
80+
Assert.Throws<ArgumentNullException>(() => null * baseDimensions1);
1581
}
1682

1783
[Fact]
@@ -575,5 +641,27 @@ public void CheckToStringUsingMolarEntropy()
575641
{
576642
Assert.Equal("[Length]^2[Mass][Time]^-2[Temperature][Amount]", MolarEntropy.BaseDimensions.ToString());
577643
}
644+
645+
[Fact]
646+
public void GetHashCodeWorksProperly()
647+
{
648+
var baseDimensions1 = new BaseDimensions(1, 2, 3, 4, 5, 6, 7);
649+
var baseDimensions2 = new BaseDimensions(7, 6, 5, 4, 3, 2, 1);
650+
var baseDimensions3 = new BaseDimensions(1, 2, 3, 4, 5, 6, 7);
651+
652+
var hashSet = new HashSet<BaseDimensions>();
653+
654+
hashSet.Add(baseDimensions1);
655+
Assert.True(hashSet.Contains(baseDimensions1));
656+
657+
hashSet.Add(baseDimensions2);
658+
Assert.True(hashSet.Contains(baseDimensions2));
659+
660+
// Should be the same as baseDimensions1
661+
Assert.True(hashSet.Contains(baseDimensions3));
662+
663+
Assert.True(baseDimensions1.GetHashCode() != baseDimensions2.GetHashCode());
664+
Assert.True(baseDimensions1.GetHashCode() == baseDimensions3.GetHashCode());
665+
}
578666
}
579667
}

UnitsNet/BaseDimensions.cs

+32-24
Original file line numberDiff line numberDiff line change
@@ -47,29 +47,21 @@ public override bool Equals(object obj)
4747
if(obj is null || !(obj is BaseDimensions))
4848
return false;
4949

50-
var baseDimensionsObj = (BaseDimensions)obj;
51-
52-
return Length == baseDimensionsObj.Length &&
53-
Mass == baseDimensionsObj.Mass &&
54-
Time == baseDimensionsObj.Time &&
55-
Current == baseDimensionsObj.Current &&
56-
Temperature == baseDimensionsObj.Temperature &&
57-
Amount == baseDimensionsObj.Amount &&
58-
LuminousIntensity == baseDimensionsObj.LuminousIntensity;
50+
var other = (BaseDimensions)obj;
51+
52+
return Length == other.Length &&
53+
Mass == other.Mass &&
54+
Time == other.Time &&
55+
Current == other.Current &&
56+
Temperature == other.Temperature &&
57+
Amount == other.Amount &&
58+
LuminousIntensity == other.LuminousIntensity;
5959
}
6060

6161
/// <inheritdoc />
6262
public override int GetHashCode()
6363
{
64-
int hash = 17;
65-
hash = hash * 23 + Length;
66-
hash = hash * 23 + Mass;
67-
hash = hash * 23 + Time;
68-
hash = hash * 23 + Current;
69-
hash = hash * 23 + Temperature;
70-
hash = hash * 23 + Amount;
71-
hash = hash * 23 + LuminousIntensity;
72-
return hash;
64+
return new {Length, Mass, Time, Current, Temperature, Amount, LuminousIntensity}.GetHashCode();
7365
}
7466

7567
/// <summary>
@@ -79,6 +71,9 @@ public override int GetHashCode()
7971
/// <returns>Resulting dimensions.</returns>
8072
public BaseDimensions Multiply(BaseDimensions right)
8173
{
74+
if(right is null)
75+
throw new ArgumentNullException(nameof(right));
76+
8277
return new BaseDimensions(
8378
Length + right.Length,
8479
Mass + right.Mass,
@@ -96,6 +91,9 @@ public BaseDimensions Multiply(BaseDimensions right)
9691
/// <returns>Resulting dimensions.</returns>
9792
public BaseDimensions Divide(BaseDimensions right)
9893
{
94+
if(right is null)
95+
throw new ArgumentNullException(nameof(right));
96+
9997
return new BaseDimensions(
10098
Length - right.Length,
10199
Mass - right.Mass,
@@ -137,6 +135,11 @@ public BaseDimensions Divide(BaseDimensions right)
137135
/// <returns>Resulting dimensions.</returns>
138136
public static BaseDimensions operator *(BaseDimensions left, BaseDimensions right)
139137
{
138+
if(left is null)
139+
throw new ArgumentNullException(nameof(left));
140+
else if(right is null)
141+
throw new ArgumentNullException(nameof(right));
142+
140143
return left.Multiply(right);
141144
}
142145

@@ -148,6 +151,11 @@ public BaseDimensions Divide(BaseDimensions right)
148151
/// <returns>Resulting dimensions.</returns>
149152
public static BaseDimensions operator /(BaseDimensions left, BaseDimensions right)
150153
{
154+
if(left is null)
155+
throw new ArgumentNullException(nameof(left));
156+
else if(right is null)
157+
throw new ArgumentNullException(nameof(right));
158+
151159
return left.Divide(right);
152160
}
153161
#endif
@@ -168,16 +176,16 @@ public override string ToString()
168176
return sb.ToString();
169177
}
170178

171-
private static void AppendDimensionString( StringBuilder sb, string name, int value )
179+
private static void AppendDimensionString(StringBuilder sb, string name, int value)
172180
{
173-
var absoluteValue = Math.Abs( value );
181+
var absoluteValue = Math.Abs(value);
174182

175-
if( absoluteValue > 0 )
183+
if(absoluteValue > 0)
176184
{
177-
sb.AppendFormat( "[{0}]", name );
185+
sb.AppendFormat("[{0}]", name);
178186

179-
if( absoluteValue > 1 )
180-
sb.AppendFormat( "^{0}", value );
187+
if(absoluteValue > 1)
188+
sb.AppendFormat("^{0}", value);
181189
}
182190
}
183191

0 commit comments

Comments
 (0)