Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update the UnitRelations.json #1453

Merged
merged 5 commits into from
Dec 15, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions Common/UnitRelations.json
Original file line number Diff line number Diff line change
@@ -1,24 +1,24 @@
[
"1 = Area.SquareMeter * ReciprocalArea.InverseSquareMeter",
"1 = Density.KilogramPerCubicMeter * SpecificVolume.CubicMeterPerKilogram",
"1 = ElectricResistivity.OhmMeter * ElectricConductivity.SiemensPerMeter",
"1 = Length.Meter * ReciprocalLength.InverseMeter",
"Acceleration.MeterPerSecondSquared = Jerk.MeterPerSecondCubed * Duration.Second",
"AmountOfSubstance.Kilomole = MolarFlow.KilomolePerSecond * Duration.Second",
"AmountOfSubstance.Mole = Molarity.MolePerCubicMeter * Volume.CubicMeter",
"Angle.Radian = RotationalSpeed.RadianPerSecond * Duration.Second",
"Area.SquareMeter = KinematicViscosity.SquareMeterPerSecond * Duration.Second",
"Area.SquareMeter = KinematicViscosity.SquareMeterPerSecond * Duration.Second -- NoInferredDivision",
"Area.SquareMeter = Length.Meter * Length.Meter",
"Area.SquareMeter = Volume.CubicMeter * ReciprocalLength.InverseMeter",
"AreaMomentOfInertia.MeterToTheFourth = Volume.CubicMeter * Length.Meter",
"double = Density.KilogramPerCubicMeter * SpecificVolume.CubicMeterPerKilogram",
"double = SpecificEnergy.JoulePerKilogram * BrakeSpecificFuelConsumption.KilogramPerJoule",
"double = TemperatureDelta.Kelvin * CoefficientOfThermalExpansion.PerKelvin",
"DynamicViscosity.NewtonSecondPerMeterSquared = Density.KilogramPerCubicMeter * KinematicViscosity.SquareMeterPerSecond",
"ElectricCharge.AmpereHour = ElectricCurrent.Ampere * Duration.Hour",
"ElectricCurrent.Ampere = ElectricCurrentGradient.AmperePerSecond * Duration.Second",
"ElectricPotential.Volt = ElectricCurrent.Ampere * ElectricResistance.Ohm",
"Energy.Joule = ElectricPotential.Volt * ElectricCharge.Coulomb",
"Energy.Joule = EnergyDensity.JoulePerCubicMeter * Volume.CubicMeter",
"Energy.Joule = MolarEnergy.JoulePerMole * AmountOfSubstance.Mole",
"Energy.Joule = Power.Watt * Duration.Second",
"Energy.Joule = SpecificEnergy.JoulePerKilogram * Mass.Kilogram",
"Energy.Joule = TemperatureDelta.Kelvin * Entropy.JoulePerKelvin",
Expand All @@ -35,8 +35,9 @@
"Length.Meter = Speed.MeterPerSecond * Duration.Second",
"Length.Meter = Volume.CubicMeter * ReciprocalArea.InverseSquareMeter",
"LinearDensity.KilogramPerMeter = Area.SquareMeter * Density.KilogramPerCubicMeter",
"LuminousFlux.Lumen = Illuminance.Lux * Area.SquareMeter",
"LuminousIntensity.Candela = Luminance.CandelaPerSquareMeter * Area.SquareMeter",
"Mass.Gram = AmountOfSubstance.Mole * MolarMass.GramPerMole",
"Mass.Kilogram = AmountOfSubstance.Mole * MolarMass.KilogramPerMole",
"Mass.Kilogram = AreaDensity.KilogramPerSquareMeter * Area.SquareMeter",
"Mass.Kilogram = Density.KilogramPerCubicMeter * Volume.CubicMeter",
"Mass.Kilogram = LinearDensity.KilogramPerMeter * Length.Meter",
Expand All @@ -62,7 +63,8 @@
"Pressure.NewtonPerSquareMeter = ForcePerLength.NewtonPerMeter * ReciprocalLength.InverseMeter",
"Pressure.Pascal = PressureChangeRate.PascalPerSecond * Duration.Second",
"Pressure.Pascal = SpecificWeight.NewtonPerCubicMeter * Length.Meter",
"Ratio.DecimalFraction = Area.SquareMeter * ReciprocalArea.InverseSquareMeter",
"Ratio.DecimalFraction = Area.SquareMeter * ReciprocalArea.InverseSquareMeter -- NoInferredDivision",
"Ratio.DecimalFraction = TemperatureDelta.Kelvin * CoefficientOfThermalExpansion.PerKelvin -- NoInferredDivision",
"ReciprocalArea.InverseSquareMeter = ReciprocalLength.InverseMeter * ReciprocalLength.InverseMeter",
"ReciprocalLength.InverseMeter = Length.Meter * ReciprocalArea.InverseSquareMeter",
"RotationalStiffness.NewtonMeterPerRadian = RotationalStiffnessPerLength.NewtonMeterPerRadianPerMeter * Length.Meter",
Expand Down
76 changes: 68 additions & 8 deletions UnitsNet.Tests/CustomCode/AmountOfSubstanceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,8 @@ public void NumberOfParticlesInTwoMolesIsDoubleAvogadroConstant()

[Theory]
[InlineData(10, AmountOfSubstanceUnit.Mole,
KnownQuantities.MolarMassOfOxygen, MolarMassUnit.GramPerMole,
10 * KnownQuantities.MolarMassOfOxygen, MassUnit.Gram)] // 10 Moles of Oxygen weight 10 times as much as 1 Mole of Oxygen (MolarMass)
KnownQuantities.MolarMassOfOxygen, MolarMassUnit.GramPerMole,
10 * KnownQuantities.MolarMassOfOxygen, MassUnit.Gram)] // 10 Moles of Oxygen weight 10 times as much as 1 Mole of Oxygen (MolarMass)
public void MassFromAmountOfSubstanceAndMolarMass(
double amountOfSubstanceValue, AmountOfSubstanceUnit amountOfSubstanceUnit,
double molarMassValue, MolarMassUnit molarMassUnit,
Expand All @@ -83,9 +83,9 @@ public void MassFromAmountOfSubstanceAndMolarMass(

[Theory]
[InlineData(5, MassUnit.Gram,
KnownQuantities.MolarMassHClInGramsPerMole, MolarMassUnit.GramPerMole,
1.2, VolumeUnit.Liter,
0.1142805, MolarityUnit.MolePerLiter)] // molarity(HCl) = 5g / (1.2L * 36.46) = 0.114 mol/l = 0.114 M
KnownQuantities.MolarMassHClInGramsPerMole, MolarMassUnit.GramPerMole,
1.2, VolumeUnit.Liter,
0.1142805, MolarityUnit.MolePerLiter)] // molarity(HCl) = 5g / (1.2L * 36.46) = 0.114 mol/l = 0.114 M
public void MolarityFromComponentMassAndSolutionVolume(
double componentMassValue, MassUnit componentMassUnit,
double componentMolarMassValue, MolarMassUnit componentMolarMassUnit,
Expand All @@ -104,9 +104,9 @@ public void MolarityFromComponentMassAndSolutionVolume(

[Theory]
[InlineData(5, MassUnit.Gram,
KnownQuantities.MolarMassHClInGramsPerMole, MolarMassUnit.GramPerMole,
0.1142805, MolarityUnit.MolePerLiter,
1.2, VolumeUnit.Liter)] // 1.2 L of solution required for obtaining 0.1142805 Moles/L from 5g HCl
KnownQuantities.MolarMassHClInGramsPerMole, MolarMassUnit.GramPerMole,
0.1142805, MolarityUnit.MolePerLiter,
1.2, VolumeUnit.Liter)] // 1.2 L of solution required for obtaining 0.1142805 Moles/L from 5g HCl
public void VolumeSolutionFromComponentMassAndDesiredConcentration(
double componentMassValue, MassUnit componentMassUnit,
double componentMolarMassValue, MolarMassUnit componentMolarMassUnit,
Expand All @@ -122,5 +122,65 @@ public void VolumeSolutionFromComponentMassAndDesiredConcentration(

AssertEx.EqualTolerance(expectedSolutionVolumeValue, volumeSolution.As(expectedSolutionVolumeUnit), tolerence);
}

[Fact]
public void From_Mass_And_MolarMass_ReturnsTheMassDividedByTheMolarMass()
{
var mass = Mass.From(10, MassUnit.Gram);
var molarMass = MolarMass.From(2, MolarMassUnit.GramPerMole);
var expectedAmountOfSubstance = AmountOfSubstance.From(5, AmountOfSubstanceUnit.Mole);

var amountOfSubstance = AmountOfSubstance.FromMass(mass, molarMass);

Assert.Equal(expectedAmountOfSubstance, amountOfSubstance);
}

[Theory]
[InlineData(5, AmountOfSubstanceUnit.Mole,
10, MolarEnergyUnit.JoulePerMole,
50, EnergyUnit.Joule)]
public void Multiplying_AmountOfSubstance_By_MolarEnergy_ReturnsEnergy(double amountOfSubstanceValue, AmountOfSubstanceUnit amountOfSubstanceUnit,
double molarEnergyValue, MolarEnergyUnit molarEnergyUnit, double expectedEnergyValue, EnergyUnit expectedEnergyUnit)
{
var amountOfSubstance = new AmountOfSubstance(amountOfSubstanceValue, amountOfSubstanceUnit);
var molarEnergy = new MolarEnergy(molarEnergyValue, molarEnergyUnit);
var expectedEnergy = new Energy(expectedEnergyValue, expectedEnergyUnit);

var energy = amountOfSubstance * molarEnergy;

Assert.Equal(expectedEnergy, energy);
}

[Theory]
[InlineData(5, AmountOfSubstanceUnit.Mole,
10, MolarFlowUnit.MolePerMinute,
30, DurationUnit.Second)]
public void Dividing_AmountOfSubstance_By_MolarFlow_Returns_Duration(double amountOfSubstanceValue, AmountOfSubstanceUnit amountOfSubstanceUnit,
double molarFlowValue, MolarFlowUnit molarFlowUnit, double expectedDurationValue, DurationUnit expecteDurationUnit)
{
var amountOfSubstance = new AmountOfSubstance(amountOfSubstanceValue, amountOfSubstanceUnit);
var molarFlow = new MolarFlow(molarFlowValue, molarFlowUnit);
var expectedDuration = new Duration(expectedDurationValue, expecteDurationUnit);

var duration = amountOfSubstance / molarFlow;

Assert.Equal(expectedDuration, duration);
}

[Theory]
[InlineData(5, AmountOfSubstanceUnit.Mole,
30, DurationUnit.Second,
10, MolarFlowUnit.MolePerMinute)]
public void Dividing_AmountOfSubstance_By_Duration_Returns_MolarFlow(double amountOfSubstanceValue, AmountOfSubstanceUnit amountOfSubstanceUnit,
double durationValue, DurationUnit durationUnit, double expectedMolarFlowValue, MolarFlowUnit expectedMolarFlowUnit)
{
var amountOfSubstance = new AmountOfSubstance(amountOfSubstanceValue, amountOfSubstanceUnit);
var duration = new Duration(durationValue, durationUnit);
var expectedMolarFlow = new MolarFlow(expectedMolarFlowValue, expectedMolarFlowUnit);

var molarFlow = amountOfSubstance / duration;

Assert.Equal(expectedMolarFlow.MolesPerHour, molarFlow.MolesPerHour, MolesTolerance);
}
}
}
56 changes: 56 additions & 0 deletions UnitsNet.Tests/CustomCode/AreaTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -145,5 +145,61 @@ public void AreaTimesReciprocalAreaEqualsRatio()
Ratio ratio = Area.FromSquareMeters(0.5) * ReciprocalArea.FromInverseSquareMeters(10);
Assert.Equal(5.0, ratio.Value);
}

[Fact]
public void AreaTimesIlluminanceEqualsLuminousFlux()
{
LuminousFlux luminousFlux = Area.FromSquareMeters(5) * Illuminance.FromLux(10);
Assert.Equal(LuminousFlux.FromLumens(50), luminousFlux);
}

[Fact]
public void AreaTimesLuminanceEqualsLuminousIntensity()
{
LuminousIntensity luminousIntensity = Area.FromSquareMeters(5) * Luminance.FromCandelasPerSquareMeter(10);
Assert.Equal(LuminousIntensity.FromCandela(50), luminousIntensity);
}

[Fact]
public void AreaTimesSpecificWeightEqualsForcePerLength()
{
ForcePerLength forcePerLength = Area.FromSquareMeters(20) * SpecificWeight.FromNewtonsPerCubicMeter(2000);
Assert.Equal(ForcePerLength.FromNewtonsPerMeter(40000), forcePerLength);
}

[Fact]
public void AreaTimesReciprocalLengthEqualsLength()
{
Length length = Area.FromSquareMeters(20) * ReciprocalLength.FromInverseMeters(5);
Assert.Equal(Length.FromMeters(100), length);
}

[Fact]
public void AreaTimesAreaDensityEqualsMass()
{
Mass mass = Area.FromSquareMeters(2) * AreaDensity.FromKilogramsPerSquareMeter(10);
Assert.Equal(Mass.FromKilograms(20), mass);
}

[Fact]
public void AreaTimesHeatFluxEqualsPower()
{
Power power = Area.FromSquareMeters(2) * HeatFlux.FromWattsPerSquareMeter(10);
Assert.Equal(Power.FromWatts(20), power);
}

[Fact]
public void AreaTimesForcePerLengthEqualsEqualsTorque()
{
Torque torque = Area.FromSquareMeters(2) * ForcePerLength.FromNewtonsPerMeter(10);
Assert.Equal(Torque.FromNewtonMeters(20), torque);
}

[Fact]
public void AreaDividedByReciprocalLengthEqualsVolume()
{
Volume volume = Area.FromSquareMeters(20) / ReciprocalLength.FromInverseMeters(5);
Assert.Equal(Volume.FromCubicMeters(4), volume);
}
}
}
22 changes: 12 additions & 10 deletions UnitsNet.Tests/CustomCode/CoefficientOfThermalExpansionTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,21 +44,23 @@ public class CoefficientOfThermalExpansionTests : CoefficientOfThermalExpansionT
[Fact]
public void CoefficientOfThermalExpansionTimesTemperatureDelta()
{
double temperatureDeltaDegC = 2.0;
double ctePerDegC = 0.001;
CoefficientOfThermalExpansion cte = CoefficientOfThermalExpansion.FromPerDegreeCelsius(ctePerDegC);
TemperatureDelta dT = TemperatureDelta.FromDegreesCelsius(temperatureDeltaDegC);
AssertEx.EqualTolerance(cte * dT, ctePerDegC * temperatureDeltaDegC, 1e-10);
CoefficientOfThermalExpansion cte = CoefficientOfThermalExpansion.FromPerDegreeCelsius(2);
TemperatureDelta dT = TemperatureDelta.FromDegreesCelsius(0.001);

Ratio expansionRatio = cte * dT;

Assert.Equal(Ratio.FromDecimalFractions(0.002), expansionRatio);
}

[Fact]
public void TemperatureDeltaTimesCoefficientOfThermalExpansion()
{
double temperatureDeltaDegC = 2.0;
double ctePerDegC = 0.001;
CoefficientOfThermalExpansion cte = CoefficientOfThermalExpansion.FromPerDegreeCelsius(ctePerDegC);
TemperatureDelta dT = TemperatureDelta.FromDegreesCelsius(temperatureDeltaDegC);
AssertEx.EqualTolerance(dT * cte, temperatureDeltaDegC * ctePerDegC, 1e-10);
CoefficientOfThermalExpansion cte = CoefficientOfThermalExpansion.FromPerDegreeCelsius(2);
TemperatureDelta dT = TemperatureDelta.FromDegreesCelsius(0.001);

Ratio expansionRatio = dT * cte;

Assert.Equal(Ratio.FromDecimalFractions(0.002), expansionRatio);
}
}
}
14 changes: 14 additions & 0 deletions UnitsNet.Tests/CustomCode/DensityTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -162,5 +162,19 @@ public void DensityTimesAreaEqualsLinearDensity()
LinearDensity linearDensity = Density.FromGramsPerCubicCentimeter(10) * Area.FromSquareCentimeters(2);
Assert.Equal(20, linearDensity.GramsPerCentimeter);
}

[Fact]
public static void DensityTimesVolumeConcentrationEqualsMassConcentration()
{
MassConcentration massConcentration = Density.FromKilogramsPerCubicMeter(20) * VolumeConcentration.FromPercent(50);
Assert.Equal(massConcentration, MassConcentration.FromKilogramsPerCubicMeter(10));
}

[Fact]
public static void InverseDensityEqualsSpecificVolume()
{
SpecificVolume specificVolume = Density.FromKilogramsPerCubicMeter(4).Inverse();
Assert.Equal(specificVolume, SpecificVolume.FromCubicMetersPerKilogram(0.25));
}
}
}
30 changes: 29 additions & 1 deletion UnitsNet.Tests/CustomCode/EnergyTests.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Licensed under MIT No Attribution, see LICENSE file at the root.
// 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;
Expand Down Expand Up @@ -191,5 +191,33 @@ public void EnergyDividedBySpecificEnergyEqualsMass()
Mass m = Energy.FromJoules(24) / SpecificEnergy.FromJoulesPerKilogram(8);
Assert.Equal(Mass.FromKilograms(3), m);
}

[Fact]
public void EnergyDividedByMolarEnergyEqualsAmountOfSubstance()
{
AmountOfSubstance m = Energy.FromJoules(24) / MolarEnergy.FromJoulesPerMole(8);
Assert.Equal(AmountOfSubstance.FromMoles(3), m);
}

[Fact]
public void EnergyDividedByAmountOfSubstanceEqualsMolarEnergy()
{
MolarEnergy m = Energy.FromJoules(24) / AmountOfSubstance.FromMoles(8);
Assert.Equal(MolarEnergy.FromJoulesPerMole(3), m);
}

[Fact]
public void EnergyDividedByVolumeEqualsEnergyDensity()
{
EnergyDensity m = Energy.FromJoules(24) / Volume.FromCubicMeters(8);
Assert.Equal(EnergyDensity.FromJoulesPerCubicMeter(3), m);
}

[Fact]
public void EnergyDividedByEnergyDensityEqualsVolume()
{
Volume m = Energy.FromJoules(24) / EnergyDensity.FromJoulesPerCubicMeter(8);
Assert.Equal(Volume.FromCubicMeters(3), m);
}
}
}
8 changes: 8 additions & 0 deletions UnitsNet.Tests/CustomCode/IlluminanceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@


using System;
using Xunit;

namespace UnitsNet.Tests.CustomCode
{
Expand All @@ -35,5 +36,12 @@ public class IlluminanceTests : IlluminanceTestsBase
protected override double KiloluxInOneLux => 1E-3;

protected override double MegaluxInOneLux => 1E-6;

[Fact]
public void IlluminanceTimesAreaEqualsLuminousFlux()
{
LuminousFlux luminousFlux = Illuminance.FromLux(10) * Area.FromSquareMeters(5);
Assert.Equal(LuminousFlux.FromLumens(50), luminousFlux);
}
}
}
23 changes: 23 additions & 0 deletions UnitsNet.Tests/CustomCode/LuminousFluxTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,35 @@


using System;
using Xunit;

namespace UnitsNet.Tests.CustomCode
{
public class LuminousFluxTests : LuminousFluxTestsBase
{
protected override bool SupportsSIUnitSystem => false;
protected override double LumensInOneLumen => 1;

[Fact]
public void LuminousFluxDividedByAreaEqualsIlluminance()
{
var luminousFlux = LuminousFlux.FromLumens(100);
var area = Area.FromSquareMeters(10);

var illuminance = luminousFlux / area;

Assert.Equal(Illuminance.FromLux(10), illuminance);
}

[Fact]
public void LuniousFluxDividedByIlluminanceEqualsArea()
{
var luminousFlux = LuminousFlux.FromLumens(100);
var illuminance = Illuminance.FromLux(10);

var area = luminousFlux / illuminance;

Assert.Equal(Area.FromSquareMeters(10), area);
}
}
}
Loading
Loading