Skip to content

Commit 8fe2088

Browse files
committed
Merge remote-tracking branch 'angularsen/v4' into SIUnitSystem
2 parents 0830706 + 1c02a3d commit 8fe2088

12 files changed

+267
-855
lines changed

UnitsNet.Tests/BaseDimensionsTests.cs

Lines changed: 89 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
using Xunit;
1+
using System;
2+
using System.Collections.Generic;
3+
using Xunit;
24

35
namespace UnitsNet.Tests
46
{
@@ -60,6 +62,70 @@ public void EqualsWorksAsExpected()
6062

6163
Assert.True(baseDimensions1.Equals(baseDimensions2));
6264
Assert.True(baseDimensions2.Equals(baseDimensions1));
65+
66+
Assert.False(baseDimensions1.Equals(null));
67+
}
68+
69+
[Fact]
70+
public void EqualityOperatorsWorkAsExpected()
71+
{
72+
var baseDimensions1 = new BaseDimensions(1, 2, 3, 4, 5, 6, 7);
73+
var baseDimensions2 = new BaseDimensions(1, 2, 3, 4, 5, 6, 7);
74+
75+
Assert.True(baseDimensions1 == baseDimensions2);
76+
Assert.True(baseDimensions2 == baseDimensions1);
77+
78+
Assert.False(baseDimensions1 == null);
79+
Assert.False(null == baseDimensions1);
80+
81+
Assert.False(baseDimensions2 == null);
82+
Assert.False(null == baseDimensions2);
83+
}
84+
85+
[Fact]
86+
public void InequalityOperatorsWorkAsExpected()
87+
{
88+
var baseDimensions1 = new BaseDimensions(1, 2, 3, 4, 5, 6, 7);
89+
var baseDimensions2 = new BaseDimensions(7, 6, 5, 4, 3, 2, 1);
90+
91+
Assert.True(baseDimensions1 != baseDimensions2);
92+
Assert.True(baseDimensions2 != baseDimensions1);
93+
94+
Assert.True(baseDimensions1 != null);
95+
Assert.True(null != baseDimensions1);
96+
97+
Assert.True(baseDimensions2 != null);
98+
Assert.True(null != baseDimensions2);
99+
}
100+
101+
[Fact]
102+
public void MultiplyThrowsExceptionIfPassedNull()
103+
{
104+
var baseDimensions1 = new BaseDimensions(1, 0, 0, 0, 0, 0, 0);
105+
Assert.Throws<ArgumentNullException>(() => baseDimensions1.Multiply(null));
106+
}
107+
108+
[Fact]
109+
public void DivideThrowsExceptionIfPassedNull()
110+
{
111+
var baseDimensions1 = new BaseDimensions(1, 0, 0, 0, 0, 0, 0);
112+
Assert.Throws<ArgumentNullException>(() => baseDimensions1.Divide(null));
113+
}
114+
115+
[Fact]
116+
public void MultiplyOperatorThrowsExceptionWithNull()
117+
{
118+
var baseDimensions1 = new BaseDimensions(1, 0, 0, 0, 0, 0, 0);
119+
Assert.Throws<ArgumentNullException>(() => baseDimensions1 / null);
120+
Assert.Throws<ArgumentNullException>(() => null / baseDimensions1);
121+
}
122+
123+
[Fact]
124+
public void DivideOperatorThrowsExceptionWithNull()
125+
{
126+
var baseDimensions1 = new BaseDimensions(1, 0, 0, 0, 0, 0, 0);
127+
Assert.Throws<ArgumentNullException>(() => baseDimensions1 * null);
128+
Assert.Throws<ArgumentNullException>(() => null * baseDimensions1);
63129
}
64130

65131
[Fact]
@@ -623,5 +689,27 @@ public void CheckToStringUsingMolarEntropy()
623689
{
624690
Assert.Equal("[Length]^2[Mass][Time]^-2[Temperature][Amount]", MolarEntropy.BaseDimensions.ToString());
625691
}
692+
693+
[Fact]
694+
public void GetHashCodeWorksProperly()
695+
{
696+
var baseDimensions1 = new BaseDimensions(1, 2, 3, 4, 5, 6, 7);
697+
var baseDimensions2 = new BaseDimensions(7, 6, 5, 4, 3, 2, 1);
698+
var baseDimensions3 = new BaseDimensions(1, 2, 3, 4, 5, 6, 7);
699+
700+
var hashSet = new HashSet<BaseDimensions>();
701+
702+
hashSet.Add(baseDimensions1);
703+
Assert.True(hashSet.Contains(baseDimensions1));
704+
705+
hashSet.Add(baseDimensions2);
706+
Assert.True(hashSet.Contains(baseDimensions2));
707+
708+
// Should be the same as baseDimensions1
709+
Assert.True(hashSet.Contains(baseDimensions3));
710+
711+
Assert.True(baseDimensions1.GetHashCode() != baseDimensions2.GetHashCode());
712+
Assert.True(baseDimensions1.GetHashCode() == baseDimensions3.GetHashCode());
713+
}
626714
}
627715
}

UnitsNet.WindowsRuntimeComponent/GeneratedCode/Quantities/Information.WindowsRuntimeComponent.g.cs

Lines changed: 15 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,7 @@ public static Information From(double value, InformationUnit fromUnit)
623623
/// </exception>
624624
public static Information Parse(string str)
625625
{
626-
return ParseInternal(str, null);
626+
return Parse(str, null);
627627
}
628628

629629
/// <summary>
@@ -652,7 +652,10 @@ public static Information Parse(string str)
652652
public static Information Parse(string str, [CanBeNull] string cultureName)
653653
{
654654
IFormatProvider provider = GetFormatProviderFromCultureName(cultureName);
655-
return ParseInternal(str, provider);
655+
return QuantityParser.Default.Parse<Information, InformationUnit>(
656+
str,
657+
provider,
658+
From);
656659
}
657660

658661
/// <summary>
@@ -665,7 +668,7 @@ public static Information Parse(string str, [CanBeNull] string cultureName)
665668
/// </example>
666669
public static bool TryParse([CanBeNull] string str, out Information result)
667670
{
668-
return TryParseInternal(str, null, out result);
671+
return TryParse(str, null, out result);
669672
}
670673

671674
/// <summary>
@@ -681,7 +684,11 @@ public static bool TryParse([CanBeNull] string str, out Information result)
681684
public static bool TryParse([CanBeNull] string str, [CanBeNull] string cultureName, out Information result)
682685
{
683686
IFormatProvider provider = GetFormatProviderFromCultureName(cultureName);
684-
return TryParseInternal(str, provider, out result);
687+
return QuantityParser.Default.TryParse<Information, InformationUnit>(
688+
str,
689+
provider,
690+
From,
691+
out result);
685692
}
686693

687694
/// <summary>
@@ -695,7 +702,7 @@ public static bool TryParse([CanBeNull] string str, [CanBeNull] string cultureNa
695702
/// <exception cref="UnitsNetException">Error parsing string.</exception>
696703
public static InformationUnit ParseUnit(string str)
697704
{
698-
return ParseUnitInternal(str, null);
705+
return ParseUnit(str, null);
699706
}
700707

701708
/// <summary>
@@ -711,12 +718,12 @@ public static InformationUnit ParseUnit(string str)
711718
public static InformationUnit ParseUnit(string str, [CanBeNull] string cultureName)
712719
{
713720
IFormatProvider provider = GetFormatProviderFromCultureName(cultureName);
714-
return ParseUnitInternal(str, provider);
721+
return UnitParser.Default.Parse<InformationUnit>(str, provider);
715722
}
716723

717724
public static bool TryParseUnit(string str, out InformationUnit unit)
718725
{
719-
return TryParseUnitInternal(str, null, out unit);
726+
return TryParseUnit(str, null, out unit);
720727
}
721728

722729
/// <summary>
@@ -732,114 +739,7 @@ public static bool TryParseUnit(string str, out InformationUnit unit)
732739
public static bool TryParseUnit(string str, [CanBeNull] string cultureName, out InformationUnit unit)
733740
{
734741
IFormatProvider provider = GetFormatProviderFromCultureName(cultureName);
735-
return TryParseUnitInternal(str, provider, out unit);
736-
}
737-
738-
/// <summary>
739-
/// Parse a string with one or two quantities of the format "&lt;quantity&gt; &lt;unit&gt;".
740-
/// </summary>
741-
/// <param name="str">String to parse. Typically in the form: {number} {unit}</param>
742-
/// <param name="provider">Format to use when parsing number and unit. Defaults to <see cref="GlobalConfiguration.DefaultCulture" />.</param>
743-
/// <example>
744-
/// Length.Parse("5.5 m", new CultureInfo("en-US"));
745-
/// </example>
746-
/// <exception cref="ArgumentNullException">The value of 'str' cannot be null. </exception>
747-
/// <exception cref="ArgumentException">
748-
/// Expected string to have one or two pairs of quantity and unit in the format
749-
/// "&lt;quantity&gt; &lt;unit&gt;". Eg. "5.5 m" or "1ft 2in"
750-
/// </exception>
751-
/// <exception cref="AmbiguousUnitParseException">
752-
/// More than one unit is represented by the specified unit abbreviation.
753-
/// Example: Volume.Parse("1 cup") will throw, because it can refer to any of
754-
/// <see cref="VolumeUnit.MetricCup" />, <see cref="VolumeUnit.UsLegalCup" /> and <see cref="VolumeUnit.UsCustomaryCup" />.
755-
/// </exception>
756-
/// <exception cref="UnitsNetException">
757-
/// If anything else goes wrong, typically due to a bug or unhandled case.
758-
/// We wrap exceptions in <see cref="UnitsNetException" /> to allow you to distinguish
759-
/// Units.NET exceptions from other exceptions.
760-
/// </exception>
761-
private static Information ParseInternal(string str, [CanBeNull] IFormatProvider provider)
762-
{
763-
if (str == null) throw new ArgumentNullException(nameof(str));
764-
765-
provider = provider ?? GlobalConfiguration.DefaultCulture;
766-
767-
return QuantityParser.Default.Parse<Information, InformationUnit>(str, provider, ParseUnitInternal, From);
768-
}
769-
770-
/// <summary>
771-
/// Try to parse a string with one or two quantities of the format "&lt;quantity&gt; &lt;unit&gt;".
772-
/// </summary>
773-
/// <param name="str">String to parse. Typically in the form: {number} {unit}</param>
774-
/// <param name="provider">Format to use when parsing number and unit. Defaults to <see cref="GlobalConfiguration.DefaultCulture" />.</param>
775-
/// <param name="result">Resulting unit quantity if successful.</param>
776-
/// <returns>True if successful, otherwise false.</returns>
777-
/// <example>
778-
/// Length.Parse("5.5 m", new CultureInfo("en-US"));
779-
/// </example>
780-
private static bool TryParseInternal([CanBeNull] string str, [CanBeNull] IFormatProvider provider, out Information result)
781-
{
782-
result = default;
783-
784-
if(string.IsNullOrWhiteSpace(str))
785-
return false;
786-
787-
provider = provider ?? GlobalConfiguration.DefaultCulture;
788-
789-
return QuantityParser.Default.TryParse<Information, InformationUnit>(str, provider, TryParseUnitInternal, From, out result);
790-
}
791-
792-
/// <summary>
793-
/// Parse a unit string.
794-
/// </summary>
795-
/// <param name="str">String to parse. Typically in the form: {number} {unit}</param>
796-
/// <param name="provider">Format to use when parsing number and unit. Defaults to <see cref="GlobalConfiguration.DefaultCulture" />.</param>
797-
/// <example>
798-
/// Length.ParseUnit("m", new CultureInfo("en-US"));
799-
/// </example>
800-
/// <exception cref="ArgumentNullException">The value of 'str' cannot be null. </exception>
801-
/// <exception cref="UnitsNetException">Error parsing string.</exception>
802-
private static InformationUnit ParseUnitInternal(string str, IFormatProvider provider = null)
803-
{
804-
if (str == null) throw new ArgumentNullException(nameof(str));
805-
806-
var unit = UnitParser.Default.Parse<InformationUnit>(str.Trim(), provider);
807-
808-
if (unit == InformationUnit.Undefined)
809-
{
810-
var newEx = new UnitsNetException("Error parsing string. The unit is not a recognized InformationUnit.");
811-
newEx.Data["input"] = str;
812-
newEx.Data["provider"] = provider?.ToString() ?? "(null)";
813-
throw newEx;
814-
}
815-
816-
return unit;
817-
}
818-
819-
/// <summary>
820-
/// Parse a unit string.
821-
/// </summary>
822-
/// <param name="str">String to parse. Typically in the form: {number} {unit}</param>
823-
/// <param name="provider">Format to use when parsing number and unit. Defaults to <see cref="GlobalConfiguration.DefaultCulture" />.</param>
824-
/// <param name="unit">The parsed unit if successful.</param>
825-
/// <returns>True if successful, otherwise false.</returns>
826-
/// <example>
827-
/// Length.ParseUnit("m", new CultureInfo("en-US"));
828-
/// </example>
829-
private static bool TryParseUnitInternal(string str, IFormatProvider provider, out InformationUnit unit)
830-
{
831-
unit = InformationUnit.Undefined;
832-
833-
if(string.IsNullOrWhiteSpace(str))
834-
return false;
835-
836-
if(!UnitParser.Default.TryParse<InformationUnit>(str.Trim(), provider, out unit))
837-
return false;
838-
839-
if(unit == InformationUnit.Undefined)
840-
return false;
841-
842-
return true;
742+
return UnitParser.Default.TryParse<InformationUnit>(str, provider, out unit);
843743
}
844744

845745
#endregion

0 commit comments

Comments
 (0)