Skip to content

Commit

Permalink
Fix tests failing due to manipulating shared static state
Browse files Browse the repository at this point in the history
Move unit abbreviations out of UnitInfo and into UnitAbbreviationsCache, so manipulating one cache instance won't affect another instance.
  • Loading branch information
angularsen committed Jul 11, 2023
1 parent e00aadd commit a93fc31
Show file tree
Hide file tree
Showing 8 changed files with 283 additions and 124 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public AbbreviatedUnitsConverter()
/// </summary>
/// <param name="comparer">The comparer used to compare the property/quantity names (e.g. StringComparer.OrdinalIgnoreCase) </param>
public AbbreviatedUnitsConverter(IEqualityComparer<string?> comparer)
: this(new Dictionary<string, QuantityInfo>(Quantity.ByName, comparer), UnitAbbreviationsCache.Default, comparer)
: this(new Dictionary<string, QuantityInfo>(Quantity.ByName, comparer), UnitsNetSetup.Default.UnitAbbreviations, comparer)
{
}

Expand Down
29 changes: 29 additions & 0 deletions UnitsNet.Tests/AlphabeticalOrderer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// Licensed under MIT No Attribution, see LICENSE file at the root.
// Copyright 2013 Andreas Gullberg Larsen ([email protected]). Maintained at https://github.com/angularsen/UnitsNet.

using System.Collections.Generic;
using System.Linq;
using Xunit.Abstractions;
using Xunit.Sdk;

namespace UnitsNet.Tests;

/// <summary>
/// Useful for debugging tests where a particular order of tests is required.
/// </summary>
/// <example>
/// Add the attribute to your test class:
/// <code>
/// <![CDATA[
/// [TestCaseOrderer(
/// ordererTypeName: "UnitsNet.Tests.AlphabeticalOrderer",
/// ordererAssemblyName: "UnitsNet.Tests")]
/// ]]>
/// </code>
/// </example>
public class AlphabeticalOrderer : ITestCaseOrderer
{
public IEnumerable<TTestCase> OrderTestCases<TTestCase>(
IEnumerable<TTestCase> testCases) where TTestCase : ITestCase =>
testCases.OrderBy(testCase => testCase.TestMethod.Method.Name);
}
15 changes: 8 additions & 7 deletions UnitsNet.Tests/BaseUnitsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -140,13 +140,14 @@ public void ToStringGivesExpectedResult()
AmountOfSubstanceUnit.Mole,
LuminousIntensityUnit.Candela);

var m = UnitAbbreviationsCache.Default.GetDefaultAbbreviation(LengthUnit.Meter);
var kg = UnitAbbreviationsCache.Default.GetDefaultAbbreviation(MassUnit.Kilogram);
var s = UnitAbbreviationsCache.Default.GetDefaultAbbreviation(DurationUnit.Second);
var A = UnitAbbreviationsCache.Default.GetDefaultAbbreviation(ElectricCurrentUnit.Ampere);
var K = UnitAbbreviationsCache.Default.GetDefaultAbbreviation(TemperatureUnit.Kelvin);
var mol = UnitAbbreviationsCache.Default.GetDefaultAbbreviation(AmountOfSubstanceUnit.Mole);
var cd = UnitAbbreviationsCache.Default.GetDefaultAbbreviation(LuminousIntensityUnit.Candela);
UnitAbbreviationsCache cache = UnitsNetSetup.Default.UnitAbbreviations;
var m = cache.GetDefaultAbbreviation(LengthUnit.Meter);
var kg = cache.GetDefaultAbbreviation(MassUnit.Kilogram);
var s = cache.GetDefaultAbbreviation(DurationUnit.Second);
var A = cache.GetDefaultAbbreviation(ElectricCurrentUnit.Ampere);
var K = cache.GetDefaultAbbreviation(TemperatureUnit.Kelvin);
var mol = cache.GetDefaultAbbreviation(AmountOfSubstanceUnit.Mole);
var cd = cache.GetDefaultAbbreviation(LuminousIntensityUnit.Candela);

Assert.Equal($"[Length]: {m}, [Mass]: {kg}, [Time]: {s}, [Current]: {A}, [Temperature]: {K}, [Amount]: {mol}, [LuminousIntensity]: {cd}", siBaseUnits.ToString());
}
Expand Down
9 changes: 5 additions & 4 deletions UnitsNet.Tests/QuantityIFormattableTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,12 @@ public void EmptyOrNullFormatStringEqualsGFormat()
[Fact]
public void AFormatGetsAbbreviations()
{
Assert.Equal(UnitAbbreviationsCache.Default.GetDefaultAbbreviation(MyLength.Unit, CultureInfo.InvariantCulture), MyLength.ToString("a", CultureInfo.InvariantCulture));
Assert.Equal(UnitAbbreviationsCache.Default.GetDefaultAbbreviation(MyLength.Unit, CultureInfo.InvariantCulture), MyLength.ToString("a0", CultureInfo.InvariantCulture));
UnitAbbreviationsCache cache = UnitsNetSetup.Default.UnitAbbreviations;
Assert.Equal(cache.GetDefaultAbbreviation(MyLength.Unit, CultureInfo.InvariantCulture), MyLength.ToString("a", CultureInfo.InvariantCulture));
Assert.Equal(cache.GetDefaultAbbreviation(MyLength.Unit, CultureInfo.InvariantCulture), MyLength.ToString("a0", CultureInfo.InvariantCulture));

Assert.Equal(UnitAbbreviationsCache.Default.GetUnitAbbreviations(MyLength.Unit, CultureInfo.InvariantCulture)[1], MyLength.ToString("a1", CultureInfo.InvariantCulture));
Assert.Equal(UnitAbbreviationsCache.Default.GetUnitAbbreviations(MyLength.Unit, CultureInfo.InvariantCulture)[2], MyLength.ToString("a2", CultureInfo.InvariantCulture));
Assert.Equal(cache.GetUnitAbbreviations(MyLength.Unit, CultureInfo.InvariantCulture)[1], MyLength.ToString("a1", CultureInfo.InvariantCulture));
Assert.Equal(cache.GetUnitAbbreviations(MyLength.Unit, CultureInfo.InvariantCulture)[2], MyLength.ToString("a2", CultureInfo.InvariantCulture));
}

[Fact]
Expand Down
18 changes: 18 additions & 0 deletions UnitsNet.Tests/UnitAbbreviationsCacheTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,24 @@ public void GetDefaultAbbreviationFallsBackToUsEnglishCulture()
Assert.Equal("US english abbreviation for Unit1", abbreviation);
}

[Fact]
public void MapUnitToAbbreviation_DoesNotAffectOtherCacheInstances()
{
var culture = AmericanCulture;
var unit = AreaUnit.SquareMeter;

var cache1 = new UnitAbbreviationsCache();
cache1.MapUnitToAbbreviation(unit, culture, "m^2");

var cache2 = new UnitAbbreviationsCache();
cache2.MapUnitToAbbreviation(unit, culture, "m2");

Assert.Equal(new[] { "m²", "m^2" }, cache1.GetUnitAbbreviations(unit, culture));
Assert.Equal(new[] { "m²", "m2" }, cache2.GetUnitAbbreviations(unit, culture));
Assert.Equal("m²", cache1.GetDefaultAbbreviation(unit, culture));
Assert.Equal("m²", cache2.GetDefaultAbbreviation(unit, culture));
}

[Fact]
public void MapUnitToAbbreviation_AddCustomUnit_DoesNotOverrideDefaultAbbreviationForAlreadyMappedUnits()
{
Expand Down
Loading

0 comments on commit a93fc31

Please sign in to comment.