diff --git a/UnitsNet.Tests/BaseDimensionsTests.cs b/UnitsNet.Tests/BaseDimensionsTests.cs index cecb54327c..191d631946 100644 --- a/UnitsNet.Tests/BaseDimensionsTests.cs +++ b/UnitsNet.Tests/BaseDimensionsTests.cs @@ -721,5 +721,24 @@ public void GetHashCodeWorksProperly() Assert.True(baseDimensions1.GetHashCode() != baseDimensions2.GetHashCode()); Assert.True(baseDimensions1.GetHashCode() == baseDimensions3.GetHashCode()); } + + [Fact] + public void DimensionlessPropertyIsCorrect() + { + Assert.True(BaseDimensions.Dimensionless == new BaseDimensions(0, 0, 0, 0, 0, 0, 0)); + } + + [Fact] + public void IsDimensionlessMethodImplementedCorrectly() + { + Assert.True(BaseDimensions.Dimensionless.IsDimensionless()); + Assert.True(new BaseDimensions(0, 0, 0, 0, 0, 0, 0).IsDimensionless()); + + Assert.False(BaseDimensions.Dimensionless.IsBaseQuantity()); + Assert.False(BaseDimensions.Dimensionless.IsDerivedQuantity()); + + // Example case + Assert.True(Level.BaseDimensions.IsDimensionless()); + } } } diff --git a/UnitsNet.Tests/GeneratedCode/InformationTestsBase.g.cs b/UnitsNet.Tests/GeneratedCode/InformationTestsBase.g.cs index 86a6c376d0..e118b75e76 100644 --- a/UnitsNet.Tests/GeneratedCode/InformationTestsBase.g.cs +++ b/UnitsNet.Tests/GeneratedCode/InformationTestsBase.g.cs @@ -435,7 +435,7 @@ public void UnitsDoesNotContainUndefined() } [Fact] - public void AllUnitsHaveAtLeastOneAbbreviationSpecified() + public void HasAtLeastOneAbbreviationSpecified() { var units = Enum.GetValues(typeof(InformationUnit)).Cast(); foreach(var unit in units) @@ -446,5 +446,11 @@ public void AllUnitsHaveAtLeastOneAbbreviationSpecified() var defaultAbbreviation = UnitAbbreviationsCache.Default.GetDefaultAbbreviation(unit); } } + + [Fact] + public void BaseDimensionsShouldNeverBeNull() + { + Assert.False(Information.BaseDimensions is null); + } } } diff --git a/UnitsNet.Tests/GeneratedCode/LengthTestsBase.g.cs b/UnitsNet.Tests/GeneratedCode/LengthTestsBase.g.cs index e6ec38cd20..02e0798ada 100644 --- a/UnitsNet.Tests/GeneratedCode/LengthTestsBase.g.cs +++ b/UnitsNet.Tests/GeneratedCode/LengthTestsBase.g.cs @@ -419,7 +419,7 @@ public void UnitsDoesNotContainUndefined() } [Fact] - public void AllUnitsHaveAtLeastOneAbbreviationSpecified() + public void HasAtLeastOneAbbreviationSpecified() { var units = Enum.GetValues(typeof(LengthUnit)).Cast(); foreach(var unit in units) @@ -430,5 +430,11 @@ public void AllUnitsHaveAtLeastOneAbbreviationSpecified() var defaultAbbreviation = UnitAbbreviationsCache.Default.GetDefaultAbbreviation(unit); } } + + [Fact] + public void BaseDimensionsShouldNeverBeNull() + { + Assert.False(Length.BaseDimensions is null); + } } } diff --git a/UnitsNet.Tests/GeneratedCode/LevelTestsBase.g.cs b/UnitsNet.Tests/GeneratedCode/LevelTestsBase.g.cs index 210411b811..e156b8563f 100644 --- a/UnitsNet.Tests/GeneratedCode/LevelTestsBase.g.cs +++ b/UnitsNet.Tests/GeneratedCode/LevelTestsBase.g.cs @@ -224,7 +224,7 @@ public void UnitsDoesNotContainUndefined() } [Fact] - public void AllUnitsHaveAtLeastOneAbbreviationSpecified() + public void HasAtLeastOneAbbreviationSpecified() { var units = Enum.GetValues(typeof(LevelUnit)).Cast(); foreach(var unit in units) @@ -235,5 +235,11 @@ public void AllUnitsHaveAtLeastOneAbbreviationSpecified() var defaultAbbreviation = UnitAbbreviationsCache.Default.GetDefaultAbbreviation(unit); } } + + [Fact] + public void BaseDimensionsShouldNeverBeNull() + { + Assert.False(Level.BaseDimensions is null); + } } } diff --git a/UnitsNet.WindowsRuntimeComponent/GeneratedCode/Quantities/Information.WindowsRuntimeComponent.g.cs b/UnitsNet.WindowsRuntimeComponent/GeneratedCode/Quantities/Information.WindowsRuntimeComponent.g.cs index a2fd03bcc8..661f864348 100644 --- a/UnitsNet.WindowsRuntimeComponent/GeneratedCode/Quantities/Information.WindowsRuntimeComponent.g.cs +++ b/UnitsNet.WindowsRuntimeComponent/GeneratedCode/Quantities/Information.WindowsRuntimeComponent.g.cs @@ -66,7 +66,7 @@ public sealed partial class Information : IQuantity static Information() { - BaseDimensions = new BaseDimensions(0, 0, 0, 0, 0, 0, 0); + BaseDimensions = BaseDimensions.Dimensionless; } /// /// Creates the quantity with a value of 0 in the base unit Bit. diff --git a/UnitsNet.WindowsRuntimeComponent/GeneratedCode/Quantities/Level.WindowsRuntimeComponent.g.cs b/UnitsNet.WindowsRuntimeComponent/GeneratedCode/Quantities/Level.WindowsRuntimeComponent.g.cs index a8d924885c..91400e35e9 100644 --- a/UnitsNet.WindowsRuntimeComponent/GeneratedCode/Quantities/Level.WindowsRuntimeComponent.g.cs +++ b/UnitsNet.WindowsRuntimeComponent/GeneratedCode/Quantities/Level.WindowsRuntimeComponent.g.cs @@ -66,7 +66,7 @@ public sealed partial class Level : IQuantity static Level() { - BaseDimensions = new BaseDimensions(0, 0, 0, 0, 0, 0, 0); + BaseDimensions = BaseDimensions.Dimensionless; } /// /// Creates the quantity with a value of 0 in the base unit Decibel. diff --git a/UnitsNet/BaseDimensions.cs b/UnitsNet/BaseDimensions.cs index 6e82d94ab1..6ce00d968b 100644 --- a/UnitsNet/BaseDimensions.cs +++ b/UnitsNet/BaseDimensions.cs @@ -54,12 +54,21 @@ public bool IsBaseQuantity() } /// - /// Checks the dimensions represent a derived quantity. + /// Checks if the dimensions represent a derived quantity. /// /// True if the dimensions represent a derived quantity, otherwise false. public bool IsDerivedQuantity() { - return !IsBaseQuantity(); + return !IsBaseQuantity() && !IsDimensionless(); + } + + /// + /// Checks if this base dimensions object represents a dimensionless quantity. + /// + /// True if this object represents a dimensionless quantity, otherwise false. + public bool IsDimensionless() + { + return this == Dimensionless; } /// @@ -246,5 +255,10 @@ private static void AppendDimensionString(StringBuilder sb, string name, int val /// Gets the luminous intensity dimensions (J). /// public int LuminousIntensity{ get; } + + /// + /// Represents a dimensionless (unitless) quantity. + /// + public static BaseDimensions Dimensionless { get; } = new BaseDimensions(0, 0, 0, 0, 0, 0, 0); } } diff --git a/UnitsNet/GeneratedCode/Quantities/Information.NetFramework.g.cs b/UnitsNet/GeneratedCode/Quantities/Information.NetFramework.g.cs index f700290d38..72d82253f3 100644 --- a/UnitsNet/GeneratedCode/Quantities/Information.NetFramework.g.cs +++ b/UnitsNet/GeneratedCode/Quantities/Information.NetFramework.g.cs @@ -63,7 +63,7 @@ public partial struct Information : IQuantity, IComparable, ICo static Information() { - BaseDimensions = new BaseDimensions(0, 0, 0, 0, 0, 0, 0); + BaseDimensions = BaseDimensions.Dimensionless; } /// diff --git a/UnitsNet/GeneratedCode/Quantities/Level.NetFramework.g.cs b/UnitsNet/GeneratedCode/Quantities/Level.NetFramework.g.cs index 2eb3c5b031..f5c6b09eb2 100644 --- a/UnitsNet/GeneratedCode/Quantities/Level.NetFramework.g.cs +++ b/UnitsNet/GeneratedCode/Quantities/Level.NetFramework.g.cs @@ -63,7 +63,7 @@ public partial struct Level : IQuantity, IComparable, IComparable diff --git a/UnitsNet/Scripts/Include-GenerateQuantitySourceCodeNetFramework.ps1 b/UnitsNet/Scripts/Include-GenerateQuantitySourceCodeNetFramework.ps1 index 6eff130e3a..9f96b2e933 100644 --- a/UnitsNet/Scripts/Include-GenerateQuantitySourceCodeNetFramework.ps1 +++ b/UnitsNet/Scripts/Include-GenerateQuantitySourceCodeNetFramework.ps1 @@ -19,7 +19,9 @@ function GenerateQuantitySourceCodeNetFramework([Quantity]$quantity, [string]$ta $unitEnumName = "$quantityName" + "Unit" $wrc = $target -eq "WindowsRuntimeComponent" $privateAccessModifierIfWrc = if ($wrc) { "private" } else { "public" } + $baseDimensions = $quantity.BaseDimensions; + $isDimensionless = $baseDimensions -eq $null -or ( $baseDimensions.Length -eq 0 -and $baseDimensions.Mass -eq 0 -and $baseDimensions.Time -eq 0 -and $baseDimensions.ElectricCurrent -eq 0 -and $baseDimensions.Temperature -eq 0 -and $baseDimensions.AmountOfSubstance -eq 0 -and $baseDimensions.LuminousIntensity -eq 0 ) [GeneratorArgs]$genArgs = New-Object GeneratorArgs -Property @{ Quantity = $quantity; @@ -112,10 +114,15 @@ if ($obsoleteAttribute) static $quantityName() { -"@; if($baseDimensions) +"@; if($isDimensionless) + {@" + BaseDimensions = BaseDimensions.Dimensionless; +"@; } + else {@" BaseDimensions = new BaseDimensions($($baseDimensions.Length), $($baseDimensions.Mass), $($baseDimensions.Time), $($baseDimensions.ElectricCurrent), $($baseDimensions.Temperature), $($baseDimensions.AmountOfSubstance), $($baseDimensions.LuminousIntensity)); -"@; }@" +"@; } +@" } "@; # Windows Runtime Component requires a default constructor if ($wrc) {@" diff --git a/UnitsNet/Scripts/Include-GenerateUnitTestBaseClassSourceCode.ps1 b/UnitsNet/Scripts/Include-GenerateUnitTestBaseClassSourceCode.ps1 index 6248119c7a..4ca6bb70e5 100644 --- a/UnitsNet/Scripts/Include-GenerateUnitTestBaseClassSourceCode.ps1 +++ b/UnitsNet/Scripts/Include-GenerateUnitTestBaseClassSourceCode.ps1 @@ -264,7 +264,7 @@ namespace UnitsNet.Tests } [Fact] - public void AllUnitsHaveAtLeastOneAbbreviationSpecified() + public void HasAtLeastOneAbbreviationSpecified() { var units = Enum.GetValues(typeof($unitEnumName)).Cast<$unitEnumName>(); foreach(var unit in units) @@ -275,6 +275,12 @@ namespace UnitsNet.Tests var defaultAbbreviation = UnitAbbreviationsCache.Default.GetDefaultAbbreviation(unit); } } + + [Fact] + public void BaseDimensionsShouldNeverBeNull() + { + Assert.False($quantityName.BaseDimensions is null); + } } } "@;