diff --git a/UnitsNet.Tests/UnitAbbreviationsCacheTests.cs b/UnitsNet.Tests/UnitAbbreviationsCacheTests.cs index d029208eb4..9b45d8b990 100644 --- a/UnitsNet.Tests/UnitAbbreviationsCacheTests.cs +++ b/UnitsNet.Tests/UnitAbbreviationsCacheTests.cs @@ -81,13 +81,29 @@ public void GetUnitAbbreviationsReturnsTheExpectedAbbreviationWhenConstructedWit Assert.Equal("g", unitAbbreviationCache.GetUnitAbbreviations(MassUnit.Gram, AmericanCulture)[0]); } + [Fact] + public void UnitInfoOverloads_WithUnitOutsideConfiguredQuantities_ThrowUnitNotFoundException() + { + var unitAbbreviationCache = new UnitAbbreviationsCache([Mass.Info]); + UnitInfo lengthUnitInfo = Length.Info[LengthUnit.Meter]; + + Assert.Multiple(checks: + [ + () => Assert.Throws(() => unitAbbreviationCache.GetUnitAbbreviations(lengthUnitInfo, AmericanCulture)), + () => Assert.Throws(() => unitAbbreviationCache.GetDefaultAbbreviation(lengthUnitInfo, AmericanCulture)), + () => Assert.Throws(() => unitAbbreviationCache.MapUnitToAbbreviation(lengthUnitInfo, AmericanCulture, "m")), + () => Assert.Throws(() => unitAbbreviationCache.MapUnitToDefaultAbbreviation(lengthUnitInfo, AmericanCulture, "m")) + ]); + } + [Fact] public void GetDefaultAbbreviationReturnsTheExpectedAbbreviationWhenConstructedWithTheSpecificQuantityInfo() { Assert.Multiple(checks: [ () => { Assert.Equal("g", new UnitAbbreviationsCache([Mass.Info]).GetDefaultAbbreviation(MassUnit.Gram, AmericanCulture)); }, - () => { Assert.Equal("g", new UnitAbbreviationsCache([Mass.Info]).GetDefaultAbbreviation(typeof(MassUnit), (int)MassUnit.Gram, AmericanCulture)); } + () => { Assert.Equal("g", new UnitAbbreviationsCache([Mass.Info]).GetDefaultAbbreviation(typeof(MassUnit), (int)MassUnit.Gram, AmericanCulture)); }, + () => { Assert.Equal("g", new UnitAbbreviationsCache([Mass.Info]).GetDefaultAbbreviation(Mass.Info[MassUnit.Gram])); } ]); } @@ -133,6 +149,14 @@ public void GetDefaultAbbreviation_WithNullUnitType_ThrowsArgumentNullException( Assert.Throws(() => UnitAbbreviationsCache.Default.GetDefaultAbbreviation(null!, 1)); } + [Fact] + public void GetDefaultAbbreviation_WithNullUnitInfo_ThrowsArgumentNullException() + { + var result = Assert.Throws(() => UnitAbbreviationsCache.Default.GetDefaultAbbreviation((UnitInfo)null!)); + + Assert.Equal("unitInfo", result.ParamName); + } + [Fact] public void GetDefaultAbbreviationThrowsUnitNotFoundExceptionIfNoneExist() { @@ -230,6 +254,14 @@ public void MapUnitToDefaultAbbreviation_GivenUnitTypeValueAndCulture_SetsDefaul Assert.Equal("m^2", cache.GetDefaultAbbreviation(AreaUnit.SquareMeter, AmericanCulture)); } + [Fact] + public void MapUnitToDefaultAbbreviation_WithNullUnitInfo_ThrowsArgumentNullException() + { + var result = Assert.Throws(() => UnitAbbreviationsCache.Default.MapUnitToDefaultAbbreviation((UnitInfo)null!, AmericanCulture, "x")); + + Assert.Equal("unitInfo", result.ParamName); + } + [Fact] public void MapUnitToDefaultAbbreviation_GivenCustomAbbreviation_SetsAbbreviationUsedByQuantityToString() { @@ -253,6 +285,22 @@ public void MapUnitToAbbreviation_GivenUnitTypeAndValue_AddsTheAbbreviationForUn Assert.DoesNotContain("zz", cache.GetUnitAbbreviations(MassUnit.Gram, AmericanCulture)); } + [Fact] + public void MapUnitToAbbreviation_WithNullUnitInfo_ThrowsArgumentNullException() + { + var result = Assert.Throws(() => UnitAbbreviationsCache.Default.MapUnitToAbbreviation((UnitInfo)null!, AmericanCulture, "x")); + + Assert.Equal("unitInfo", result.ParamName); + } + + [Fact] + public void GetUnitAbbreviations_WithNullUnitInfo_ThrowsArgumentNullException() + { + var result = Assert.Throws(() => UnitAbbreviationsCache.Default.GetUnitAbbreviations((UnitInfo)null!, AmericanCulture)); + + Assert.Equal("unitInfo", result.ParamName); + } + [Fact] public void MapUnitToAbbreviation_DoesNotInsertDuplicates() { diff --git a/UnitsNet/CustomCode/UnitAbbreviationsCache.cs b/UnitsNet/CustomCode/UnitAbbreviationsCache.cs index 073cb50f03..af397e9d35 100644 --- a/UnitsNet/CustomCode/UnitAbbreviationsCache.cs +++ b/UnitsNet/CustomCode/UnitAbbreviationsCache.cs @@ -105,7 +105,7 @@ public void MapUnitToAbbreviation(TUnitType unit, params IEnumerable< MapUnitToAbbreviation(UnitKey.ForUnit(unit), abbreviations); } - /// > + /// /// The unit enum type. /// The unit enum value. /// The format provider to use for lookup. Defaults to if null. @@ -121,7 +121,7 @@ public void MapUnitToAbbreviation(Type unitType, int unitValue, IFormatProvider? MapUnitToAbbreviation(UnitKey.Create(unitType, unitValue), formatProvider, abbreviations); } - /// > + /// /// The unit key value. /// Unit abbreviations to add. public void MapUnitToAbbreviation(UnitKey unitKey, params IEnumerable abbreviations) @@ -129,7 +129,7 @@ public void MapUnitToAbbreviation(UnitKey unitKey, params IEnumerable ab MapUnitToAbbreviation(unitKey, CultureInfo.CurrentCulture, abbreviations); } - /// > + /// /// The unit enum value. /// The format provider to use for lookup. Defaults to if null. /// Unit abbreviations to add. @@ -140,13 +140,22 @@ public void MapUnitToAbbreviation(TUnitType unit, IFormatProvider? fo MapUnitToAbbreviation(UnitKey.ForUnit(unit), formatProvider, abbreviations); } - /// > + /// /// The unit key value. /// The format provider to use for lookup. Defaults to if null. /// Unit abbreviations to add. public void MapUnitToAbbreviation(UnitKey unitKey, IFormatProvider? formatProvider, params IEnumerable abbreviations) { - PerformAbbreviationMapping(unitKey, formatProvider, false, abbreviations); + MapUnitToAbbreviation(Quantities.GetUnitInfo(unitKey), formatProvider, abbreviations); + } + + /// + /// The info representing the unit. + /// The format provider to use for lookup. Defaults to if null. + /// Unit abbreviations to add. + public void MapUnitToAbbreviation(UnitInfo unitInfo, IFormatProvider? formatProvider, params IEnumerable abbreviations) + { + AddAbbreviation(GetConfiguredUnitInfo(unitInfo), formatProvider, false, abbreviations); } #endregion @@ -171,7 +180,7 @@ public void MapUnitToDefaultAbbreviation(TUnitType unit, string abbre MapUnitToDefaultAbbreviation(UnitKey.ForUnit(unit), abbreviation); } - /// > + /// /// The unit key value. /// Unit abbreviations to add as default. public void MapUnitToDefaultAbbreviation(UnitKey unitKey, string abbreviation) @@ -179,7 +188,7 @@ public void MapUnitToDefaultAbbreviation(UnitKey unitKey, string abbreviation) MapUnitToDefaultAbbreviation(unitKey, CultureInfo.CurrentCulture, abbreviation); } - /// > + /// /// The unit enum value. /// The format provider to use for lookup. Defaults to if null. /// Unit abbreviation to add as default. @@ -190,7 +199,7 @@ public void MapUnitToDefaultAbbreviation(TUnitType unit, IFormatProvi MapUnitToDefaultAbbreviation(UnitKey.ForUnit(unit), formatProvider, abbreviation); } - /// > + /// /// The unit enum type. /// The unit enum value. /// The format provider to use for lookup. Defaults to if null. @@ -206,22 +215,26 @@ public void MapUnitToDefaultAbbreviation(Type unitType, int unitValue, IFormatPr MapUnitToDefaultAbbreviation(UnitKey.Create(unitType, unitValue), formatProvider, abbreviation); } - /// > + /// /// The unit key value. /// The format provider to use for lookup. Defaults to if null. /// Unit abbreviation to add as default. public void MapUnitToDefaultAbbreviation(UnitKey unitKey, IFormatProvider? formatProvider, string abbreviation) { - PerformAbbreviationMapping(unitKey, formatProvider, true, abbreviation); + MapUnitToDefaultAbbreviation(Quantities.GetUnitInfo(unitKey), formatProvider, abbreviation); } - #endregion - - private void PerformAbbreviationMapping(UnitKey unitKey, IFormatProvider? formatProvider, bool setAsDefault, params IEnumerable abbreviations) + /// + /// The info representing the unit. + /// The format provider to use for lookup. Defaults to if null. + /// Unit abbreviation to add as default. + public void MapUnitToDefaultAbbreviation(UnitInfo unitInfo, IFormatProvider? formatProvider, string abbreviation) { - AddAbbreviation(Quantities.GetUnitInfo(unitKey), formatProvider, setAsDefault, abbreviations); + AddAbbreviation(GetConfiguredUnitInfo(unitInfo), formatProvider, true, abbreviation); } - + + #endregion + /// /// Gets the default abbreviation for a given unit type and its numeric enum value. /// If a unit has more than one abbreviation defined, then it returns the first one. @@ -282,10 +295,26 @@ public string GetDefaultAbbreviation(Type unitType, int unitValue, IFormatProvid /// public string GetDefaultAbbreviation(UnitKey unitKey, IFormatProvider? formatProvider = null) { - IReadOnlyList abbreviations = GetUnitAbbreviations(unitKey, formatProvider); + return GetDefaultAbbreviation(Quantities.GetUnitInfo(unitKey), formatProvider); + } + + /// + /// The info representing the unit. + /// The format provider to use for lookup. Defaults to if null. + /// + /// Thrown when no unit information is found for the specified + /// . + /// + /// + /// Thrown when no abbreviations are mapped for the specified unit. + /// + public string GetDefaultAbbreviation(UnitInfo unitInfo, IFormatProvider? formatProvider = null) + { + unitInfo = GetConfiguredUnitInfo(unitInfo); + IReadOnlyList abbreviations = GetUnitAbbreviations(unitInfo, formatProvider); if (abbreviations.Count == 0) { - throw new InvalidOperationException($"No abbreviations were found for {unitKey.UnitEnumType.Name}.{(Enum)unitKey}. Make sure that the unit abbreviations are mapped."); + throw new InvalidOperationException($"No abbreviations were found for {unitInfo.QuantityInfo.Name}.{unitInfo.Name}. Make sure that the unit abbreviations are mapped."); } return abbreviations[0]; @@ -342,12 +371,28 @@ public IReadOnlyList GetUnitAbbreviations(Type unitType, int unitValue, /// public IReadOnlyList GetUnitAbbreviations(UnitKey unitKey, IFormatProvider? formatProvider = null) { + return GetUnitAbbreviations(Quantities.GetUnitInfo(unitKey), formatProvider); + } + + /// + /// Retrieves the unit abbreviations for a specified unit info and optional format provider. + /// + /// The unit info object representing the unit. + /// The format provider to use for lookup. Defaults to if null. + /// A read-only collection of unit abbreviation strings. + /// + /// Thrown when no unit information is found for the specified + /// . + /// + public IReadOnlyList GetUnitAbbreviations(UnitInfo unitInfo, IFormatProvider? formatProvider = null) + { + unitInfo = GetConfiguredUnitInfo(unitInfo); if (formatProvider is not CultureInfo culture) { culture = CultureInfo.CurrentCulture; } - return GetAbbreviationsWithFallbackCulture(Quantities.GetUnitInfo(unitKey), culture); + return GetAbbreviationsWithFallbackCulture(unitInfo, culture); } /// @@ -400,6 +445,12 @@ public IReadOnlyList GetAllUnitAbbreviationsForQuantity(Type unitEnumTyp return allAbbreviations; } + private UnitInfo GetConfiguredUnitInfo(UnitInfo unitInfo) + { + if (unitInfo is null) throw new ArgumentNullException(nameof(unitInfo)); + return Quantities.GetUnitInfo(unitInfo.UnitKey); + } + /// /// Get all abbreviations for the given unit and culture. ///