Skip to content

Commit 876f31f

Browse files
authored
Merge pull request #524 from tmilnthorp/SIUnitSystem
Adds UnitSystem and SI base units.
2 parents 98fce99 + 466f68a commit 876f31f

File tree

6 files changed

+676
-1
lines changed

6 files changed

+676
-1
lines changed

UnitsNet.Tests/BaseDimensionsTests.cs

+58
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,54 @@ namespace UnitsNet.Tests
66
{
77
public class BaseDimensionsTests
88
{
9+
[Fact]
10+
public void ConstructorImplementedCorrectly()
11+
{
12+
var baseDimensions = new BaseDimensions(1, 2, 3, 4, 5, 6, 7);
13+
14+
Assert.True(baseDimensions.Length == 1);
15+
Assert.True(baseDimensions.Mass == 2);
16+
Assert.True(baseDimensions.Time == 3);
17+
Assert.True(baseDimensions.Current == 4);
18+
Assert.True(baseDimensions.Temperature == 5);
19+
Assert.True(baseDimensions.Amount == 6);
20+
Assert.True(baseDimensions.LuminousIntensity == 7);
21+
}
22+
23+
[Theory]
24+
[InlineData(1, 0, 0, 0, 0, 0, 0)]
25+
[InlineData(0, 1, 0, 0, 0, 0, 0)]
26+
[InlineData(0, 0, 1, 0, 0, 0, 0)]
27+
[InlineData(0, 0, 0, 1, 0, 0, 0)]
28+
[InlineData(0, 0, 0, 0, 1, 0, 0)]
29+
[InlineData(0, 0, 0, 0, 0, 1, 0)]
30+
[InlineData(0, 0, 0, 0, 0, 0, 1)]
31+
public void IsBaseQuantityImplementedProperly(int length, int mass, int time, int current, int temperature, int amount, int luminousIntensity)
32+
{
33+
var baseDimensions = new BaseDimensions(length, mass, time, current, temperature, amount, luminousIntensity);
34+
var derivedDimensions = new BaseDimensions(length * 2, mass * 2, time * 2, current * 2, temperature * 2, amount * 2, luminousIntensity * 2);
35+
36+
Assert.True(baseDimensions.IsBaseQuantity());
37+
Assert.False(derivedDimensions.IsBaseQuantity());
38+
}
39+
40+
[Theory]
41+
[InlineData(2, 0, 0, 0, 0, 0, 0)]
42+
[InlineData(0, 2, 0, 0, 0, 0, 0)]
43+
[InlineData(0, 0, 2, 0, 0, 0, 0)]
44+
[InlineData(0, 0, 0, 2, 0, 0, 0)]
45+
[InlineData(0, 0, 0, 0, 2, 0, 0)]
46+
[InlineData(0, 0, 0, 0, 0, 2, 0)]
47+
[InlineData(0, 0, 0, 0, 0, 0, 2)]
48+
public void IsDerivedQuantityImplementedProperly(int length, int mass, int time, int current, int temperature, int amount, int luminousIntensity)
49+
{
50+
var baseDimensions = new BaseDimensions(length / 2, mass / 2, time / 2, current / 2, temperature / 2, amount / 2, luminousIntensity / 2);
51+
var derivedDimensions = new BaseDimensions(length, mass, time, current, temperature, amount, luminousIntensity);
52+
53+
Assert.False(baseDimensions.IsDerivedQuantity());
54+
Assert.True(derivedDimensions.IsDerivedQuantity());
55+
}
56+
957
[Fact]
1058
public void EqualsWorksAsExpected()
1159
{
@@ -32,6 +80,11 @@ public void EqualityOperatorsWorkAsExpected()
3280

3381
Assert.False(baseDimensions2 == null);
3482
Assert.False(null == baseDimensions2);
83+
84+
BaseDimensions nullBaseDimensions1 = null;
85+
BaseDimensions nullBaseDimensions2 = null;
86+
87+
Assert.True(nullBaseDimensions1 == nullBaseDimensions2);
3588
}
3689

3790
[Fact]
@@ -48,6 +101,11 @@ public void InequalityOperatorsWorkAsExpected()
48101

49102
Assert.True(baseDimensions2 != null);
50103
Assert.True(null != baseDimensions2);
104+
105+
BaseDimensions nullBaseDimensions1 = null;
106+
BaseDimensions nullBaseDimensions2 = null;
107+
108+
Assert.False(nullBaseDimensions1 != nullBaseDimensions2);
51109
}
52110

53111
[Fact]

UnitsNet.Tests/BaseUnitsTests.cs

+121
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
// Copyright (c) 2013 Andreas Gullberg Larsen (andreas.larsen84@gmail.com).
2+
// https://github.com/angularsen/UnitsNet
3+
//
4+
// Permission is hereby granted, free of charge, to any person obtaining a copy
5+
// of this software and associated documentation files (the "Software"), to deal
6+
// in the Software without restriction, including without limitation the rights
7+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8+
// copies of the Software, and to permit persons to whom the Software is
9+
// furnished to do so, subject to the following conditions:
10+
//
11+
// The above copyright notice and this permission notice shall be included in
12+
// all copies or substantial portions of the Software.
13+
//
14+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20+
// THE SOFTWARE.
21+
22+
using System;
23+
using UnitsNet.Units;
24+
using Xunit;
25+
26+
namespace UnitsNet.Tests
27+
{
28+
public class BaseUnitsTests
29+
{
30+
private static BaseUnits siBaseUnits = new BaseUnits(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second,
31+
ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela);
32+
33+
private static BaseUnits siBaseUnitsCopy = new BaseUnits(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second,
34+
ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela);
35+
36+
private static BaseUnits nonSiBaseUnits = new BaseUnits(LengthUnit.Foot, MassUnit.Pound, DurationUnit.Second,
37+
ElectricCurrentUnit.Ampere, TemperatureUnit.DegreeFahrenheit, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela);
38+
39+
[Fact]
40+
public void ConstructorSetsUnitsProperly()
41+
{
42+
var baseUnits = new BaseUnits(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second,
43+
ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela);
44+
45+
Assert.Equal(LengthUnit.Meter, baseUnits.Length);
46+
Assert.Equal(MassUnit.Kilogram, baseUnits.Mass);
47+
Assert.Equal(DurationUnit.Second, baseUnits.Time);
48+
Assert.Equal(ElectricCurrentUnit.Ampere, baseUnits.Current);
49+
Assert.Equal(TemperatureUnit.Kelvin, baseUnits.Temperature);
50+
Assert.Equal(AmountOfSubstanceUnit.Mole, baseUnits.Amount);
51+
Assert.Equal(LuminousIntensityUnit.Candela, baseUnits.LuminousIntensity);
52+
}
53+
54+
[Fact]
55+
public void EqualsObjectIsImplementedCorrectly()
56+
{
57+
Assert.True(siBaseUnits.Equals((object)siBaseUnitsCopy));
58+
Assert.False(siBaseUnits.Equals((object)nonSiBaseUnits));
59+
60+
Assert.False(siBaseUnits.Equals("Some object."));
61+
Assert.False(siBaseUnits.Equals((IFormatProvider)null));
62+
}
63+
64+
[Fact]
65+
public void EqualsBaseUnitsIsImplementedCorrectly()
66+
{
67+
Assert.True(siBaseUnits.Equals(siBaseUnitsCopy));
68+
Assert.True(siBaseUnitsCopy.Equals(siBaseUnits));
69+
70+
Assert.False(siBaseUnits.Equals(nonSiBaseUnits));
71+
Assert.False(nonSiBaseUnits.Equals(siBaseUnits));
72+
73+
Assert.False(siBaseUnits.Equals(null));
74+
}
75+
76+
[Fact]
77+
public void EqualityOperatorIsImplementedCorrectly()
78+
{
79+
Assert.True(siBaseUnits == siBaseUnitsCopy);
80+
Assert.True(siBaseUnitsCopy == siBaseUnits);
81+
82+
Assert.False(siBaseUnits == nonSiBaseUnits);
83+
Assert.False(nonSiBaseUnits == siBaseUnits);
84+
85+
Assert.False(siBaseUnits == null);
86+
Assert.False(null == siBaseUnits);
87+
88+
BaseUnits nullBaseUnits1 = null;
89+
BaseUnits nullBaseUnits2 = null;
90+
91+
Assert.True(nullBaseUnits1 == nullBaseUnits2);
92+
}
93+
94+
[Fact]
95+
public void InequalityOperatorIsImplementedCorrectly()
96+
{
97+
Assert.False(siBaseUnits != siBaseUnitsCopy);
98+
Assert.False(siBaseUnitsCopy != siBaseUnits);
99+
100+
Assert.True(siBaseUnits != nonSiBaseUnits);
101+
Assert.True(nonSiBaseUnits != siBaseUnits);
102+
103+
Assert.True(siBaseUnits != null);
104+
Assert.True(null != siBaseUnits);
105+
106+
BaseUnits nullBaseUnits1 = null;
107+
BaseUnits nullBaseUnits2 = null;
108+
109+
Assert.False(nullBaseUnits1 != nullBaseUnits2);
110+
}
111+
112+
[Fact]
113+
public void ToStringGivesExpectedResult()
114+
{
115+
var siBaseUnits = new BaseUnits(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second,
116+
ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela);
117+
118+
Assert.Equal("[Length]: m, [Mass]: kg, [Time]: s, [Current]: A, [Temperature]: K, [Amount]: mol, [LuminousIntensity]: cd", siBaseUnits.ToString());
119+
}
120+
}
121+
}

UnitsNet.Tests/UnitSystemTests.cs

+171
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
// Copyright (c) 2013 Andreas Gullberg Larsen (andreas.larsen84@gmail.com).
2+
// https://github.com/angularsen/UnitsNet
3+
//
4+
// Permission is hereby granted, free of charge, to any person obtaining a copy
5+
// of this software and associated documentation files (the "Software"), to deal
6+
// in the Software without restriction, including without limitation the rights
7+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8+
// copies of the Software, and to permit persons to whom the Software is
9+
// furnished to do so, subject to the following conditions:
10+
//
11+
// The above copyright notice and this permission notice shall be included in
12+
// all copies or substantial portions of the Software.
13+
//
14+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20+
// THE SOFTWARE.
21+
22+
using System;
23+
using UnitsNet.Units;
24+
using Xunit;
25+
26+
namespace UnitsNet.Tests
27+
{
28+
public class UnitSystemTests
29+
{
30+
[Fact]
31+
public void ConstructorImplementedProperly()
32+
{
33+
var baseUnits = new BaseUnits(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second,
34+
ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela);
35+
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+
UnitSystem nullUnitSystem1 = null;
124+
UnitSystem nullUnitSystem2 = null;
125+
126+
Assert.True(nullUnitSystem1 == nullUnitSystem2);
127+
}
128+
129+
[Fact]
130+
public void InequalityOperatorIsImplementedCorrectly()
131+
{
132+
var unitSystem1 = new UnitSystem(new BaseUnits(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second,
133+
ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela));
134+
135+
var unitSystem2 = new UnitSystem(new BaseUnits(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second,
136+
ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela));
137+
138+
var unitSystem3 = new UnitSystem(new BaseUnits(LengthUnit.Foot, MassUnit.Pound, DurationUnit.Second,
139+
ElectricCurrentUnit.Ampere, TemperatureUnit.DegreeFahrenheit, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela));
140+
141+
Assert.False(unitSystem1 != unitSystem2);
142+
Assert.False(unitSystem2 != unitSystem1);
143+
144+
Assert.True(unitSystem1 != unitSystem3);
145+
Assert.True(unitSystem3 != unitSystem1);
146+
147+
Assert.True(unitSystem1 != null);
148+
Assert.True(null != unitSystem1);
149+
150+
UnitSystem nullUnitSystem1 = null;
151+
UnitSystem nullUnitSystem2 = null;
152+
153+
Assert.False(nullUnitSystem1 != nullUnitSystem2);
154+
}
155+
156+
[Fact]
157+
public void SIUnitSystemHasCorrectBaseUnits()
158+
{
159+
var siBaseUnits = new BaseUnits(LengthUnit.Meter, MassUnit.Kilogram, DurationUnit.Second,
160+
ElectricCurrentUnit.Ampere, TemperatureUnit.Kelvin, AmountOfSubstanceUnit.Mole, LuminousIntensityUnit.Candela);
161+
162+
Assert.Equal(LengthUnit.Meter, UnitSystem.SI.BaseUnits.Length);
163+
Assert.Equal(MassUnit.Kilogram, UnitSystem.SI.BaseUnits.Mass);
164+
Assert.Equal(DurationUnit.Second, UnitSystem.SI.BaseUnits.Time);
165+
Assert.Equal(ElectricCurrentUnit.Ampere, UnitSystem.SI.BaseUnits.Current);
166+
Assert.Equal(TemperatureUnit.Kelvin, UnitSystem.SI.BaseUnits.Temperature);
167+
Assert.Equal(AmountOfSubstanceUnit.Mole, UnitSystem.SI.BaseUnits.Amount);
168+
Assert.Equal(LuminousIntensityUnit.Candela, UnitSystem.SI.BaseUnits.LuminousIntensity);
169+
}
170+
}
171+
}

0 commit comments

Comments
 (0)