From 5f625cb2ead04f3727d56f67a798d8c3d09d34a2 Mon Sep 17 00:00:00 2001 From: Tristan Milnthorp Date: Tue, 16 Oct 2018 15:13:58 -0400 Subject: [PATCH 1/4] Implementing dimensionless base dimension --- UnitsNet.Tests/BaseDimensionsTests.cs | 66 +++++++++++++++++++ .../Information.WindowsRuntimeComponent.g.cs | 2 +- .../Level.WindowsRuntimeComponent.g.cs | 2 +- UnitsNet/BaseDimensions.cs | 31 +++++++++ .../Quantities/Information.NetFramework.g.cs | 2 +- .../Quantities/Level.NetFramework.g.cs | 2 +- ...GenerateQuantitySourceCodeNetFramework.ps1 | 9 ++- ...de-GenerateUnitTestBaseClassSourceCode.ps1 | 8 ++- 8 files changed, 115 insertions(+), 7 deletions(-) diff --git a/UnitsNet.Tests/BaseDimensionsTests.cs b/UnitsNet.Tests/BaseDimensionsTests.cs index 7ea943e63e..29e3ca5c64 100644 --- a/UnitsNet.Tests/BaseDimensionsTests.cs +++ b/UnitsNet.Tests/BaseDimensionsTests.cs @@ -6,6 +6,56 @@ namespace UnitsNet.Tests { public class BaseDimensionsTests { + [Fact] + public void ConstructorImplementedCorrectly() + { + var baseDimensions = new BaseDimensions(1, 2, 3, 4, 5, 6, 7); + + Assert.True(baseDimensions.Length == 1); + Assert.True(baseDimensions.Mass == 2); + Assert.True(baseDimensions.Time == 3); + Assert.True(baseDimensions.Current == 4); + Assert.True(baseDimensions.Temperature == 5); + Assert.True(baseDimensions.Amount == 6); + Assert.True(baseDimensions.LuminousIntensity == 7); + } + + [Theory] + [InlineData(1, 0, 0, 0, 0, 0, 0)] + [InlineData(0, 1, 0, 0, 0, 0, 0)] + [InlineData(0, 0, 1, 0, 0, 0, 0)] + [InlineData(0, 0, 0, 1, 0, 0, 0)] + [InlineData(0, 0, 0, 0, 1, 0, 0)] + [InlineData(0, 0, 0, 0, 0, 1, 0)] + [InlineData(0, 0, 0, 0, 0, 0, 1)] + public void IsBaseImplementedProperly(int length, int mass, int time, int current, int temperature, int amount, int luminousIntensity) + { + var baseDimensions = new BaseDimensions(length, mass, time, current, temperature, amount, luminousIntensity); + var derivedDimensions = new BaseDimensions(length * 2, mass * 2, time * 2, current * 2, temperature * 2, amount * 2, luminousIntensity * 2); + + Assert.True(baseDimensions.IsBase()); + Assert.False(derivedDimensions.IsBase()); + Assert.False(BaseDimensions.Dimensionless.IsBase()); + } + + [Theory] + [InlineData(2, 0, 0, 0, 0, 0, 0)] + [InlineData(0, 2, 0, 0, 0, 0, 0)] + [InlineData(0, 0, 2, 0, 0, 0, 0)] + [InlineData(0, 0, 0, 2, 0, 0, 0)] + [InlineData(0, 0, 0, 0, 2, 0, 0)] + [InlineData(0, 0, 0, 0, 0, 2, 0)] + [InlineData(0, 0, 0, 0, 0, 0, 2)] + public void IsDerivedImplementedSuccessfully(int length, int mass, int time, int current, int temperature, int amount, int luminousIntensity) + { + var baseDimensions = new BaseDimensions(length / 2, mass / 2, time / 2, current / 2, temperature / 2, amount / 2, luminousIntensity / 2); + var derivedDimensions = new BaseDimensions(length, mass, time, current, temperature, amount, luminousIntensity); + + Assert.False(baseDimensions.IsDerived()); + Assert.True(derivedDimensions.IsDerived()); + Assert.False(BaseDimensions.Dimensionless.IsDerived()); + } + [Fact] public void EqualsWorksAsExpected() { @@ -663,5 +713,21 @@ 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()); + + // Example case + Assert.True(Level.BaseDimensions.IsDimensionless()); + } } } 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 8f1f0ea7d2..b118126211 100644 --- a/UnitsNet/BaseDimensions.cs +++ b/UnitsNet/BaseDimensions.cs @@ -41,6 +41,35 @@ public BaseDimensions(int length, int mass, int time, int current, int temperatu LuminousIntensity = luminousIntensity; } + /// + /// Checks if this base dimensions object represents a base quantity. + /// + /// True if this object represents a base quantity, otherwise false. + public bool IsBase() + { + var dimensionsArray = new int[]{Length, Mass, Time, Current, Temperature, Amount, LuminousIntensity}; + bool onlyOneEqualsOne = dimensionsArray.Where(dimension => dimension == 1).Take(2).Count() == 1; + return onlyOneEqualsOne; + } + + /// + /// Checks if this base dimensions object represents a derived quantity. + /// + /// True if this object represents a derived quantity, otherwise false. + public bool IsDerived() + { + return !IsBase() && !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; + } + /// public override bool Equals(object obj) { @@ -223,5 +252,7 @@ private static void AppendDimensionString(StringBuilder sb, string name, int val /// Gets the luminous intensity dimensions (J). /// public int LuminousIntensity{ get; } + + 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..ffa0872f5c 100644 --- a/UnitsNet/Scripts/Include-GenerateQuantitySourceCodeNetFramework.ps1 +++ b/UnitsNet/Scripts/Include-GenerateQuantitySourceCodeNetFramework.ps1 @@ -112,10 +112,15 @@ if ($obsoleteAttribute) static $quantityName() { -"@; if($baseDimensions) +"@; if($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 ) ) + {@" + 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); + } } } "@; From a187b58e598fd628770dcc03a3f438d58042605a Mon Sep 17 00:00:00 2001 From: Tristan Milnthorp Date: Wed, 17 Oct 2018 09:18:46 -0400 Subject: [PATCH 2/4] Adding doc and tests --- UnitsNet.Tests/GeneratedCode/InformationTestsBase.g.cs | 8 +++++++- UnitsNet.Tests/GeneratedCode/LengthTestsBase.g.cs | 8 +++++++- UnitsNet.Tests/GeneratedCode/LevelTestsBase.g.cs | 8 +++++++- UnitsNet/BaseDimensions.cs | 3 +++ 4 files changed, 24 insertions(+), 3 deletions(-) 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/BaseDimensions.cs b/UnitsNet/BaseDimensions.cs index e047289fd2..6ce00d968b 100644 --- a/UnitsNet/BaseDimensions.cs +++ b/UnitsNet/BaseDimensions.cs @@ -256,6 +256,9 @@ private static void AppendDimensionString(StringBuilder sb, string name, int val /// public int LuminousIntensity{ get; } + /// + /// Represents a dimensionless (unitless) quantity. + /// public static BaseDimensions Dimensionless { get; } = new BaseDimensions(0, 0, 0, 0, 0, 0, 0); } } From 8ca0738351dc956229f3508333540d47d7ec8b1c Mon Sep 17 00:00:00 2001 From: Tristan Milnthorp Date: Wed, 17 Oct 2018 09:24:08 -0400 Subject: [PATCH 3/4] Cleanup --- UnitsNet.Tests/BaseDimensionsTests.cs | 4 ++-- .../Include-GenerateQuantitySourceCodeNetFramework.ps1 | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/UnitsNet.Tests/BaseDimensionsTests.cs b/UnitsNet.Tests/BaseDimensionsTests.cs index 8c470565da..2bc2ab2b90 100644 --- a/UnitsNet.Tests/BaseDimensionsTests.cs +++ b/UnitsNet.Tests/BaseDimensionsTests.cs @@ -723,13 +723,13 @@ public void GetHashCodeWorksProperly() } [Fact] - public void DimensionLessPropertyIsCorrect() + public void DimensionlessPropertyIsCorrect() { Assert.True(BaseDimensions.Dimensionless == new BaseDimensions(0, 0, 0, 0, 0, 0, 0)); } [Fact] - public void IsDimensionLessMethodImplementedCorrectly() + public void IsDimensionlessMethodImplementedCorrectly() { Assert.True(BaseDimensions.Dimensionless.IsDimensionless()); Assert.True(new BaseDimensions(0, 0, 0, 0, 0, 0, 0).IsDimensionless()); diff --git a/UnitsNet/Scripts/Include-GenerateQuantitySourceCodeNetFramework.ps1 b/UnitsNet/Scripts/Include-GenerateQuantitySourceCodeNetFramework.ps1 index ffa0872f5c..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,7 +114,7 @@ if ($obsoleteAttribute) static $quantityName() { -"@; if($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 ) ) +"@; if($isDimensionless) {@" BaseDimensions = BaseDimensions.Dimensionless; "@; } From b2c0097cff3b7ae114461432b55d009491f8a744 Mon Sep 17 00:00:00 2001 From: Tristan Milnthorp Date: Wed, 17 Oct 2018 09:27:07 -0400 Subject: [PATCH 4/4] Add test --- UnitsNet.Tests/BaseDimensionsTests.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/UnitsNet.Tests/BaseDimensionsTests.cs b/UnitsNet.Tests/BaseDimensionsTests.cs index 2bc2ab2b90..191d631946 100644 --- a/UnitsNet.Tests/BaseDimensionsTests.cs +++ b/UnitsNet.Tests/BaseDimensionsTests.cs @@ -734,6 +734,9 @@ 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()); }