Skip to content

Commit 21d8459

Browse files
committed
Fixing BaseUnits to not throw exception for undefined units. The Length quantity for example has a BaseUnits where only Length would be set. Only a UnitSystem needs it all. Moving logic there. Expanding UnitSystem tests and logic. Fixing WRC.
1 parent f3c90ed commit 21d8459

File tree

4 files changed

+231
-43
lines changed

4 files changed

+231
-43
lines changed

UnitsNet.Tests/BaseUnitsTests.cs

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -42,23 +42,6 @@ public void ConstructorSetsUnitsProperly()
4242
Assert.Equal(LuminousIntensityUnit.Candela, baseUnits.LuminousIntensity);
4343
}
4444

45-
[Theory]
46-
[InlineData(LengthUnit.Undefined, MassUnit.Kilogram, DurationUnit.Second, ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela)]
47-
[InlineData(LengthUnit.Meter, MassUnit.Undefined, DurationUnit.Second, ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela)]
48-
[InlineData(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Undefined, ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela)]
49-
[InlineData(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second, ElectricCurrentUnit.Undefined, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela)]
50-
[InlineData(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second, ElectricCurrentUnit.Ampere, TemperatureUnit.Undefined, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela)]
51-
[InlineData(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second, ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Undefined, LuminousIntensityUnit.Candela)]
52-
[InlineData(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second, ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Undefined)]
53-
public void ConstructorThrowsExceptionWithUndefinedUnits(LengthUnit length, MassUnit mass, DurationUnit time, ElectricCurrentUnit current,
54-
TemperatureUnit temperature, AmountOfSubstanceUnit amount, LuminousIntensityUnit luminousIntensity)
55-
{
56-
var baseUnits = new BaseUnits(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second,
57-
ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela);
58-
59-
Assert.Throws<ArgumentException>(() => new BaseUnits(length, mass, time, current, temperature, amount, luminousIntensity));
60-
}
61-
6245
[Fact]
6346
public void EqualsObjectIsImplementedCorrectly()
6447
{
@@ -68,7 +51,12 @@ public void EqualsObjectIsImplementedCorrectly()
6851
var baseUnits2 = new BaseUnits(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second,
6952
ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela);
7053

54+
var baseUnits3 = new BaseUnits(LengthUnit.Foot, MassUnit.Pound, DurationUnit.Second,
55+
ElectricCurrentUnit.Ampere, TemperatureUnit.DegreeFahrenheit, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela);
56+
7157
Assert.True(baseUnits1.Equals((object)baseUnits2));
58+
Assert.False(baseUnits1.Equals((object)baseUnits3));
59+
7260
Assert.False(baseUnits1.Equals("Some object."));
7361
Assert.False(baseUnits1.Equals((IFormatProvider)null));
7462
}
@@ -82,8 +70,15 @@ public void EqualsBaseUnitsIsImplementedCorrectly()
8270
var baseUnits2 = new BaseUnits(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second,
8371
ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela);
8472

73+
var baseUnits3 = new BaseUnits(LengthUnit.Foot, MassUnit.Pound, DurationUnit.Second,
74+
ElectricCurrentUnit.Ampere, TemperatureUnit.DegreeFahrenheit, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela);
75+
8576
Assert.True(baseUnits1.Equals(baseUnits2));
8677
Assert.True(baseUnits2.Equals(baseUnits1));
78+
79+
Assert.False(baseUnits1.Equals(baseUnits3));
80+
Assert.False(baseUnits3.Equals(baseUnits1));
81+
8782
Assert.False(baseUnits1.Equals(null));
8883
}
8984

@@ -96,7 +91,15 @@ public void EqualityOperatorIsImplementedCorrectly()
9691
var baseUnits2 = new BaseUnits(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second,
9792
ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela);
9893

94+
var baseUnits3 = new BaseUnits(LengthUnit.Foot, MassUnit.Pound, DurationUnit.Second,
95+
ElectricCurrentUnit.Ampere, TemperatureUnit.DegreeFahrenheit, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela);
96+
9997
Assert.True(baseUnits1 == baseUnits2);
98+
Assert.True(baseUnits2 == baseUnits1);
99+
100+
Assert.False(baseUnits1 == baseUnits3);
101+
Assert.False(baseUnits3 == baseUnits1);
102+
100103
Assert.False(baseUnits1 == null);
101104
Assert.False(null == baseUnits1);
102105
}
@@ -107,10 +110,18 @@ public void InequalityOperatorIsImplementedCorrectly()
107110
var baseUnits1 = new BaseUnits(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second,
108111
ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela);
109112

110-
var baseUnits2 = new BaseUnits(LengthUnit.Foot, MassUnit.Pound, DurationUnit.Second,
113+
var baseUnits2 = new BaseUnits(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second,
114+
ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela);
115+
116+
var baseUnits3 = new BaseUnits(LengthUnit.Foot, MassUnit.Pound, DurationUnit.Second,
111117
ElectricCurrentUnit.Ampere, TemperatureUnit.DegreeFahrenheit, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela);
112118

113-
Assert.True(baseUnits1 != baseUnits2);
119+
Assert.False(baseUnits1 != baseUnits2);
120+
Assert.False(baseUnits2 != baseUnits1);
121+
122+
Assert.True(baseUnits1 != baseUnits3);
123+
Assert.True(baseUnits3 != baseUnits1);
124+
114125
Assert.True(baseUnits1 != null);
115126
Assert.True(null != baseUnits1);
116127
}

UnitsNet.Tests/UnitSystemTests.cs

Lines changed: 110 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2020
// THE SOFTWARE.
2121

22+
using System;
2223
using UnitsNet.Units;
2324
using Xunit;
2425

@@ -27,14 +28,119 @@ namespace UnitsNet.Tests
2728
public class UnitSystemTests
2829
{
2930
[Fact]
30-
public void Constructor()
31+
public void ConstructorImplementedProperly()
3132
{
32-
var siBaseUnits = new BaseUnits(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second,
33+
var baseUnits = new BaseUnits(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second,
3334
ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela);
3435

35-
var unitSystem = new UnitSystem(siBaseUnits);
36+
var unitSystem = new UnitSystem(baseUnits);
37+
38+
Assert.Equal(unitSystem.BaseUnits, baseUnits);
39+
}
40+
41+
[Fact]
42+
public void ConstructorThrowsArgumentNullExceptionForNullBaseUnits()
43+
{
44+
Assert.Throws<ArgumentNullException>(() => new UnitSystem(null));
45+
}
46+
47+
[Theory]
48+
[InlineData(LengthUnit.Undefined, MassUnit.Kilogram, DurationUnit.Second, ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela)]
49+
[InlineData(LengthUnit.Meter, MassUnit.Undefined, DurationUnit.Second, ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela)]
50+
[InlineData(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Undefined, ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela)]
51+
[InlineData(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second, ElectricCurrentUnit.Undefined, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela)]
52+
[InlineData(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second, ElectricCurrentUnit.Ampere, TemperatureUnit.Undefined, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela)]
53+
[InlineData(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second, ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Undefined, LuminousIntensityUnit.Candela)]
54+
[InlineData(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second, ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Undefined)]
55+
public void ConstructorThrowsArgumentExceptionWithUndefinedUnits(LengthUnit length, MassUnit mass, DurationUnit time, ElectricCurrentUnit current,
56+
TemperatureUnit temperature, AmountOfSubstanceUnit amount, LuminousIntensityUnit luminousIntensity)
57+
{
58+
var baseUnits = new BaseUnits(length, mass, time, current, temperature, amount, luminousIntensity);
59+
Assert.Throws<ArgumentException>(() => new UnitSystem(baseUnits));
60+
}
61+
62+
[Fact]
63+
public void EqualsObjectIsImplementedCorrectly()
64+
{
65+
var unitSystem1 = new UnitSystem(new BaseUnits(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second,
66+
ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela));
67+
68+
var unitSystem2 = new UnitSystem(new BaseUnits(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second,
69+
ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela));
70+
71+
var unitSystem3 = new UnitSystem(new BaseUnits(LengthUnit.Foot, MassUnit.Pound, DurationUnit.Second,
72+
ElectricCurrentUnit.Ampere, TemperatureUnit.DegreeFahrenheit, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela));
73+
74+
Assert.True(unitSystem1.Equals((object)unitSystem2));
75+
Assert.False(unitSystem1.Equals((object)unitSystem3));
76+
77+
Assert.False(unitSystem1.Equals("Some object."));
78+
Assert.False(unitSystem1.Equals((IFormatProvider)null));
79+
}
80+
81+
[Fact]
82+
public void EqualsUnitSystemIsImplementedCorrectly()
83+
{
84+
var unitSystem1 = new UnitSystem(new BaseUnits(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second,
85+
ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela));
86+
87+
var unitSystem2 = new UnitSystem(new BaseUnits(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second,
88+
ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela));
89+
90+
var unitSystem3 = new UnitSystem(new BaseUnits(LengthUnit.Foot, MassUnit.Pound, DurationUnit.Second,
91+
ElectricCurrentUnit.Ampere, TemperatureUnit.DegreeFahrenheit, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela));
92+
93+
Assert.True(unitSystem1.Equals(unitSystem2));
94+
Assert.True(unitSystem2.Equals(unitSystem1));
95+
96+
Assert.False(unitSystem1.Equals(unitSystem3));
97+
Assert.False(unitSystem3.Equals(unitSystem1));
98+
99+
Assert.False(unitSystem1.Equals(null));
100+
}
101+
102+
[Fact]
103+
public void EqualityOperatorIsImplementedCorrectly()
104+
{
105+
var unitSystem1 = new UnitSystem(new BaseUnits(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second,
106+
ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela));
107+
108+
var unitSystem2 = new UnitSystem(new BaseUnits(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second,
109+
ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela));
110+
111+
var unitSystem3 = new UnitSystem(new BaseUnits(LengthUnit.Foot, MassUnit.Pound, DurationUnit.Second,
112+
ElectricCurrentUnit.Ampere, TemperatureUnit.DegreeFahrenheit, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela));
113+
114+
Assert.True(unitSystem1 == unitSystem2);
115+
Assert.True(unitSystem2 == unitSystem1);
116+
117+
Assert.False(unitSystem1 == unitSystem3);
118+
Assert.False(unitSystem3 == unitSystem1);
119+
120+
Assert.False(unitSystem1 == null);
121+
Assert.False(null == unitSystem1);
122+
}
123+
124+
[Fact]
125+
public void InequalityOperatorIsImplementedCorrectly()
126+
{
127+
var unitSystem1 = new UnitSystem(new BaseUnits(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second,
128+
ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela));
129+
130+
var unitSystem2 = new UnitSystem(new BaseUnits(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second,
131+
ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela));
132+
133+
var unitSystem3 = new UnitSystem(new BaseUnits(LengthUnit.Foot, MassUnit.Pound, DurationUnit.Second,
134+
ElectricCurrentUnit.Ampere, TemperatureUnit.DegreeFahrenheit, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela));
135+
136+
Assert.False(unitSystem1 != unitSystem2);
137+
Assert.False(unitSystem2 != unitSystem1);
138+
139+
Assert.True(unitSystem1 != unitSystem3);
140+
Assert.True(unitSystem3 != unitSystem1);
36141

37-
Assert.Equal(unitSystem.BaseUnits, siBaseUnits);
142+
Assert.True(unitSystem1 != null);
143+
Assert.True(null != unitSystem1);
38144
}
39145

40146
[Fact]

UnitsNet/BaseUnits.cs

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,15 @@
2525

2626
namespace UnitsNet
2727
{
28+
#if !WINDOWS_UWP
29+
public sealed partial class BaseUnits : IEquatable<BaseUnits> { }
30+
#endif
31+
2832
/// <summary>
2933
/// Represents the base units for a quantity. All quantities, both base and derived, can be
3034
/// represented by a combination of these seven base units.
3135
/// </summary>
32-
public sealed class BaseUnits : IEquatable<BaseUnits>
36+
public sealed partial class BaseUnits
3337
{
3438
/// <summary>
3539
/// Creates an instance of if the base units class that represents the base units for a quantity.
@@ -42,25 +46,9 @@ public sealed class BaseUnits : IEquatable<BaseUnits>
4246
/// <param name="temperature">The temperature unit (Θ).</param>
4347
/// <param name="amount">The amount of substance unit (N).</param>
4448
/// <param name="luminousIntensity">The luminous intensity unit (J).</param>
45-
/// <exception cref="ArgumentException">Throws an ArgumentException if any of the units are undefined.</exception>
4649
public BaseUnits(LengthUnit length, MassUnit mass, DurationUnit time, ElectricCurrentUnit current,
4750
TemperatureUnit temperature, AmountOfSubstanceUnit amount, LuminousIntensityUnit luminousIntensity)
4851
{
49-
if(length == LengthUnit.Undefined)
50-
throw new ArgumentException("The given length unit is undefined.", nameof(length));
51-
if(mass == MassUnit.Undefined)
52-
throw new ArgumentException("The given mass unit is undefined.", nameof(mass));
53-
if(time == DurationUnit.Undefined)
54-
throw new ArgumentException("The given time unit is undefined.", nameof(time));
55-
if(current == ElectricCurrentUnit.Undefined)
56-
throw new ArgumentException("The given electric current unit is undefined.", nameof(current));
57-
if(temperature == TemperatureUnit.Undefined)
58-
throw new ArgumentException("The given temperature unit is undefined.", nameof(temperature));
59-
if(amount == AmountOfSubstanceUnit.Undefined)
60-
throw new ArgumentException("The given amount of substance unit is undefined.", nameof(amount));
61-
if(luminousIntensity == LuminousIntensityUnit.Undefined)
62-
throw new ArgumentException("The given luminous intensity unit is undefined.", nameof(luminousIntensity));
63-
6452
Length = length;
6553
Mass = mass;
6654
Time = time;
@@ -84,6 +72,9 @@ public override bool Equals(object obj)
8472
/// </summary>
8573
/// <param name="other">The other instance to check if equal to.</param>
8674
/// <returns>True if equal, otherwise false.</returns>
75+
#if WINDOWS_UWP
76+
[Windows.Foundation.Metadata.DefaultOverload]
77+
#endif
8778
public bool Equals(BaseUnits other)
8879
{
8980
if(other is null)

0 commit comments

Comments
 (0)