Skip to content

Commit ef739cd

Browse files
lipchevangularsen
andauthored
Update the UnitRelations.json (#1453)
As per my comments from #1200 here are the proposed modifications to the operators: - [x] adding an `Inverse` relation between `Density` and `SpecificVolume` (replacing the existing multiplication) - [x] adding standard multiplication for `MolarEnergy.JoulePerMole * AmountOfSubstance.Mole` (returning `Energy.Joule`) - [x] adding standard multiplication for `Illuminance.Lux * Area.SquareMeter` (returning `LuminousFlux.Lumen`) - [x] `TemperatureDelta.Kelvin * CoefficientOfThermalExpansion.PerKelvin` now returns a `Ratio` (instead of a `double`) - [x] added the `-- NoInferredDivision` to the `KinematicViscosity.SquareMeterPerSecond * Duration.Second` operator (as the opposite of the relation was `Area / Duration` -> `KinematicViscosity` 😏 ) - [x] added the `-- NoInferredDivision` to the `Area.SquareMeter * ReciprocalArea.InverseSquareMeter` operator (as the opposite of the relation was `Ratio / Area` -> `InverseArea` does not appear intuitive ) - [x] change the multiplication units (using the `BaseUnit`) for the `Mass.Kilogram = AmountOfSubstance.Mole * MolarMass.KilogramPerMole` - [x] change the multiplication units (using the `BaseUnit`) for the `AmountOfSubstance.Mole = MolarFlow.MolePerSecond * Duration.Second` I've included tests for **_all_** operators from the affected classes (_most operators, introduced with the `UnitRelations.json` were never covered by tests_). PS There are still many operators not covered by tests, but I'd rather finish them later (_hopefully once we no longer have to worry about rounding errors_). --------- Co-authored-by: Andreas Gullberg Larsen <[email protected]>
1 parent 17e3bfc commit ef739cd

30 files changed

+436
-129
lines changed

Diff for: Common/UnitRelations.json

+8-6
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
[
22
"1 = Area.SquareMeter * ReciprocalArea.InverseSquareMeter",
3+
"1 = Density.KilogramPerCubicMeter * SpecificVolume.CubicMeterPerKilogram",
34
"1 = ElectricResistivity.OhmMeter * ElectricConductivity.SiemensPerMeter",
45
"1 = Length.Meter * ReciprocalLength.InverseMeter",
56
"Acceleration.MeterPerSecondSquared = Jerk.MeterPerSecondCubed * Duration.Second",
6-
"AmountOfSubstance.Kilomole = MolarFlow.KilomolePerSecond * Duration.Second",
7+
"AmountOfSubstance.Mole = MolarFlow.MolePerSecond * Duration.Second",
78
"AmountOfSubstance.Mole = Molarity.MolePerCubicMeter * Volume.CubicMeter",
89
"Angle.Radian = RotationalSpeed.RadianPerSecond * Duration.Second",
9-
"Area.SquareMeter = KinematicViscosity.SquareMeterPerSecond * Duration.Second",
10+
"Area.SquareMeter = KinematicViscosity.SquareMeterPerSecond * Duration.Second -- NoInferredDivision",
1011
"Area.SquareMeter = Length.Meter * Length.Meter",
1112
"Area.SquareMeter = Volume.CubicMeter * ReciprocalLength.InverseMeter",
1213
"AreaMomentOfInertia.MeterToTheFourth = Volume.CubicMeter * Length.Meter",
13-
"double = Density.KilogramPerCubicMeter * SpecificVolume.CubicMeterPerKilogram",
1414
"double = SpecificEnergy.JoulePerKilogram * BrakeSpecificFuelConsumption.KilogramPerJoule",
15-
"double = TemperatureDelta.Kelvin * CoefficientOfThermalExpansion.PerKelvin",
1615
"DynamicViscosity.NewtonSecondPerMeterSquared = Density.KilogramPerCubicMeter * KinematicViscosity.SquareMeterPerSecond",
1716
"ElectricCharge.AmpereHour = ElectricCurrent.Ampere * Duration.Hour",
1817
"ElectricCurrent.Ampere = ElectricCurrentGradient.AmperePerSecond * Duration.Second",
1918
"ElectricPotential.Volt = ElectricCurrent.Ampere * ElectricResistance.Ohm",
2019
"Energy.Joule = ElectricPotential.Volt * ElectricCharge.Coulomb",
2120
"Energy.Joule = EnergyDensity.JoulePerCubicMeter * Volume.CubicMeter",
21+
"Energy.Joule = MolarEnergy.JoulePerMole * AmountOfSubstance.Mole",
2222
"Energy.Joule = Power.Watt * Duration.Second",
2323
"Energy.Joule = SpecificEnergy.JoulePerKilogram * Mass.Kilogram",
2424
"Energy.Joule = TemperatureDelta.Kelvin * Entropy.JoulePerKelvin",
@@ -35,8 +35,9 @@
3535
"Length.Meter = Speed.MeterPerSecond * Duration.Second",
3636
"Length.Meter = Volume.CubicMeter * ReciprocalArea.InverseSquareMeter",
3737
"LinearDensity.KilogramPerMeter = Area.SquareMeter * Density.KilogramPerCubicMeter",
38+
"LuminousFlux.Lumen = Illuminance.Lux * Area.SquareMeter",
3839
"LuminousIntensity.Candela = Luminance.CandelaPerSquareMeter * Area.SquareMeter",
39-
"Mass.Gram = AmountOfSubstance.Mole * MolarMass.GramPerMole",
40+
"Mass.Kilogram = AmountOfSubstance.Mole * MolarMass.KilogramPerMole",
4041
"Mass.Kilogram = AreaDensity.KilogramPerSquareMeter * Area.SquareMeter",
4142
"Mass.Kilogram = Density.KilogramPerCubicMeter * Volume.CubicMeter",
4243
"Mass.Kilogram = LinearDensity.KilogramPerMeter * Length.Meter",
@@ -62,7 +63,8 @@
6263
"Pressure.NewtonPerSquareMeter = ForcePerLength.NewtonPerMeter * ReciprocalLength.InverseMeter",
6364
"Pressure.Pascal = PressureChangeRate.PascalPerSecond * Duration.Second",
6465
"Pressure.Pascal = SpecificWeight.NewtonPerCubicMeter * Length.Meter",
65-
"Ratio.DecimalFraction = Area.SquareMeter * ReciprocalArea.InverseSquareMeter",
66+
"Ratio.DecimalFraction = Area.SquareMeter * ReciprocalArea.InverseSquareMeter -- NoInferredDivision",
67+
"Ratio.DecimalFraction = TemperatureDelta.Kelvin * CoefficientOfThermalExpansion.PerKelvin -- NoInferredDivision",
6668
"ReciprocalArea.InverseSquareMeter = ReciprocalLength.InverseMeter * ReciprocalLength.InverseMeter",
6769
"ReciprocalLength.InverseMeter = Length.Meter * ReciprocalArea.InverseSquareMeter",
6870
"RotationalStiffness.NewtonMeterPerRadian = RotationalStiffnessPerLength.NewtonMeterPerRadianPerMeter * Length.Meter",

Diff for: UnitsNet.Tests/CustomCode/AmountOfSubstanceTests.cs

+41-8
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ public void NumberOfParticlesInTwoMolesIsDoubleAvogadroConstant()
6666

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

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

105105
[Theory]
106106
[InlineData(5, MassUnit.Gram,
107-
KnownQuantities.MolarMassHClInGramsPerMole, MolarMassUnit.GramPerMole,
108-
0.1142805, MolarityUnit.MolePerLiter,
109-
1.2, VolumeUnit.Liter)] // 1.2 L of solution required for obtaining 0.1142805 Moles/L from 5g HCl
107+
KnownQuantities.MolarMassHClInGramsPerMole, MolarMassUnit.GramPerMole,
108+
0.1142805, MolarityUnit.MolePerLiter,
109+
1.2, VolumeUnit.Liter)] // 1.2 L of solution required for obtaining 0.1142805 Moles/L from 5g HCl
110110
public void VolumeSolutionFromComponentMassAndDesiredConcentration(
111111
double componentMassValue, MassUnit componentMassUnit,
112112
double componentMolarMassValue, MolarMassUnit componentMolarMassUnit,
@@ -122,5 +122,38 @@ public void VolumeSolutionFromComponentMassAndDesiredConcentration(
122122

123123
AssertEx.EqualTolerance(expectedSolutionVolumeValue, volumeSolution.As(expectedSolutionVolumeUnit), tolerence);
124124
}
125+
126+
[Fact]
127+
public void From_Mass_And_MolarMass_ReturnsTheMassDividedByTheMolarMass()
128+
{
129+
var mass = Mass.From(10, MassUnit.Gram);
130+
var molarMass = MolarMass.From(2, MolarMassUnit.GramPerMole);
131+
var expectedAmountOfSubstance = AmountOfSubstance.From(5, AmountOfSubstanceUnit.Mole);
132+
133+
var amountOfSubstance = AmountOfSubstance.FromMass(mass, molarMass);
134+
135+
Assert.Equal(expectedAmountOfSubstance, amountOfSubstance);
136+
}
137+
138+
[Fact]
139+
public void Multiplying_AmountOfSubstance_By_MolarEnergy_ReturnsEnergy()
140+
{
141+
Energy energy = AmountOfSubstance.FromMoles(5) * MolarEnergy.FromJoulesPerMole(10);
142+
Assert.Equal(Energy.FromJoules(50), energy);
143+
}
144+
145+
[Fact]
146+
public void Dividing_AmountOfSubstance_By_MolarFlow_Returns_Duration()
147+
{
148+
var duration = AmountOfSubstance.FromMoles(10) / MolarFlow.FromMolesPerSecond(2);
149+
Assert.Equal(Duration.FromSeconds(5), duration);
150+
}
151+
152+
[Fact]
153+
public void Dividing_AmountOfSubstance_By_Duration_Returns_MolarFlow()
154+
{
155+
MolarFlow molarFlow = AmountOfSubstance.FromMoles(10) / Duration.FromSeconds(5);
156+
Assert.Equal(MolarFlow.FromMolesPerSecond(2), molarFlow);
157+
}
125158
}
126159
}

Diff for: UnitsNet.Tests/CustomCode/AreaTests.cs

+56
Original file line numberDiff line numberDiff line change
@@ -145,5 +145,61 @@ public void AreaTimesReciprocalAreaEqualsRatio()
145145
Ratio ratio = Area.FromSquareMeters(0.5) * ReciprocalArea.FromInverseSquareMeters(10);
146146
Assert.Equal(5.0, ratio.Value);
147147
}
148+
149+
[Fact]
150+
public void AreaTimesIlluminanceEqualsLuminousFlux()
151+
{
152+
LuminousFlux luminousFlux = Area.FromSquareMeters(5) * Illuminance.FromLux(10);
153+
Assert.Equal(LuminousFlux.FromLumens(50), luminousFlux);
154+
}
155+
156+
[Fact]
157+
public void AreaTimesLuminanceEqualsLuminousIntensity()
158+
{
159+
LuminousIntensity luminousIntensity = Area.FromSquareMeters(5) * Luminance.FromCandelasPerSquareMeter(10);
160+
Assert.Equal(LuminousIntensity.FromCandela(50), luminousIntensity);
161+
}
162+
163+
[Fact]
164+
public void AreaTimesSpecificWeightEqualsForcePerLength()
165+
{
166+
ForcePerLength forcePerLength = Area.FromSquareMeters(20) * SpecificWeight.FromNewtonsPerCubicMeter(2000);
167+
Assert.Equal(ForcePerLength.FromNewtonsPerMeter(40000), forcePerLength);
168+
}
169+
170+
[Fact]
171+
public void AreaTimesReciprocalLengthEqualsLength()
172+
{
173+
Length length = Area.FromSquareMeters(20) * ReciprocalLength.FromInverseMeters(5);
174+
Assert.Equal(Length.FromMeters(100), length);
175+
}
176+
177+
[Fact]
178+
public void AreaTimesAreaDensityEqualsMass()
179+
{
180+
Mass mass = Area.FromSquareMeters(2) * AreaDensity.FromKilogramsPerSquareMeter(10);
181+
Assert.Equal(Mass.FromKilograms(20), mass);
182+
}
183+
184+
[Fact]
185+
public void AreaTimesHeatFluxEqualsPower()
186+
{
187+
Power power = Area.FromSquareMeters(2) * HeatFlux.FromWattsPerSquareMeter(10);
188+
Assert.Equal(Power.FromWatts(20), power);
189+
}
190+
191+
[Fact]
192+
public void AreaTimesForcePerLengthEqualsEqualsTorque()
193+
{
194+
Torque torque = Area.FromSquareMeters(2) * ForcePerLength.FromNewtonsPerMeter(10);
195+
Assert.Equal(Torque.FromNewtonMeters(20), torque);
196+
}
197+
198+
[Fact]
199+
public void AreaDividedByReciprocalLengthEqualsVolume()
200+
{
201+
Volume volume = Area.FromSquareMeters(20) / ReciprocalLength.FromInverseMeters(5);
202+
Assert.Equal(Volume.FromCubicMeters(4), volume);
203+
}
148204
}
149205
}

Diff for: UnitsNet.Tests/CustomCode/CoefficientOfThermalExpansionTests.cs

+2-15
Original file line numberDiff line numberDiff line change
@@ -44,21 +44,8 @@ public class CoefficientOfThermalExpansionTests : CoefficientOfThermalExpansionT
4444
[Fact]
4545
public void CoefficientOfThermalExpansionTimesTemperatureDelta()
4646
{
47-
double temperatureDeltaDegC = 2.0;
48-
double ctePerDegC = 0.001;
49-
CoefficientOfThermalExpansion cte = CoefficientOfThermalExpansion.FromPerDegreeCelsius(ctePerDegC);
50-
TemperatureDelta dT = TemperatureDelta.FromDegreesCelsius(temperatureDeltaDegC);
51-
AssertEx.EqualTolerance(cte * dT, ctePerDegC * temperatureDeltaDegC, 1e-10);
52-
}
53-
54-
[Fact]
55-
public void TemperatureDeltaTimesCoefficientOfThermalExpansion()
56-
{
57-
double temperatureDeltaDegC = 2.0;
58-
double ctePerDegC = 0.001;
59-
CoefficientOfThermalExpansion cte = CoefficientOfThermalExpansion.FromPerDegreeCelsius(ctePerDegC);
60-
TemperatureDelta dT = TemperatureDelta.FromDegreesCelsius(temperatureDeltaDegC);
61-
AssertEx.EqualTolerance(dT * cte, temperatureDeltaDegC * ctePerDegC, 1e-10);
47+
Ratio expansionRatio = CoefficientOfThermalExpansion.FromPerDegreeCelsius(2) * TemperatureDelta.FromDegreesCelsius(0.001);
48+
Assert.Equal(Ratio.FromDecimalFractions(0.002), expansionRatio);
6249
}
6350
}
6451
}

Diff for: UnitsNet.Tests/CustomCode/DensityTests.cs

+14
Original file line numberDiff line numberDiff line change
@@ -162,5 +162,19 @@ public void DensityTimesAreaEqualsLinearDensity()
162162
LinearDensity linearDensity = Density.FromGramsPerCubicCentimeter(10) * Area.FromSquareCentimeters(2);
163163
Assert.Equal(20, linearDensity.GramsPerCentimeter);
164164
}
165+
166+
[Fact]
167+
public static void DensityTimesVolumeConcentrationEqualsMassConcentration()
168+
{
169+
MassConcentration massConcentration = Density.FromKilogramsPerCubicMeter(20) * VolumeConcentration.FromPercent(50);
170+
Assert.Equal(massConcentration, MassConcentration.FromKilogramsPerCubicMeter(10));
171+
}
172+
173+
[Fact]
174+
public static void InverseDensityEqualsSpecificVolume()
175+
{
176+
SpecificVolume specificVolume = Density.FromKilogramsPerCubicMeter(4).Inverse();
177+
Assert.Equal(specificVolume, SpecificVolume.FromCubicMetersPerKilogram(0.25));
178+
}
165179
}
166180
}

Diff for: UnitsNet.Tests/CustomCode/EnergyTests.cs

+29-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Licensed under MIT No Attribution, see LICENSE file at the root.
1+
// Licensed under MIT No Attribution, see LICENSE file at the root.
22
// Copyright 2013 Andreas Gullberg Larsen ([email protected]). Maintained at https://github.com/angularsen/UnitsNet.
33

44
using System;
@@ -191,5 +191,33 @@ public void EnergyDividedBySpecificEnergyEqualsMass()
191191
Mass m = Energy.FromJoules(24) / SpecificEnergy.FromJoulesPerKilogram(8);
192192
Assert.Equal(Mass.FromKilograms(3), m);
193193
}
194+
195+
[Fact]
196+
public void EnergyDividedByMolarEnergyEqualsAmountOfSubstance()
197+
{
198+
AmountOfSubstance m = Energy.FromJoules(24) / MolarEnergy.FromJoulesPerMole(8);
199+
Assert.Equal(AmountOfSubstance.FromMoles(3), m);
200+
}
201+
202+
[Fact]
203+
public void EnergyDividedByAmountOfSubstanceEqualsMolarEnergy()
204+
{
205+
MolarEnergy m = Energy.FromJoules(24) / AmountOfSubstance.FromMoles(8);
206+
Assert.Equal(MolarEnergy.FromJoulesPerMole(3), m);
207+
}
208+
209+
[Fact]
210+
public void EnergyDividedByVolumeEqualsEnergyDensity()
211+
{
212+
EnergyDensity m = Energy.FromJoules(24) / Volume.FromCubicMeters(8);
213+
Assert.Equal(EnergyDensity.FromJoulesPerCubicMeter(3), m);
214+
}
215+
216+
[Fact]
217+
public void EnergyDividedByEnergyDensityEqualsVolume()
218+
{
219+
Volume m = Energy.FromJoules(24) / EnergyDensity.FromJoulesPerCubicMeter(8);
220+
Assert.Equal(Volume.FromCubicMeters(3), m);
221+
}
194222
}
195223
}

Diff for: UnitsNet.Tests/CustomCode/IlluminanceTests.cs

+8
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323

2424
using System;
25+
using Xunit;
2526

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

3738
protected override double MegaluxInOneLux => 1E-6;
39+
40+
[Fact]
41+
public void IlluminanceTimesAreaEqualsLuminousFlux()
42+
{
43+
LuminousFlux luminousFlux = Illuminance.FromLux(10) * Area.FromSquareMeters(5);
44+
Assert.Equal(LuminousFlux.FromLumens(50), luminousFlux);
45+
}
3846
}
3947
}

Diff for: UnitsNet.Tests/CustomCode/LuminousFluxTests.cs

+23
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,35 @@
2222

2323

2424
using System;
25+
using Xunit;
2526

2627
namespace UnitsNet.Tests.CustomCode
2728
{
2829
public class LuminousFluxTests : LuminousFluxTestsBase
2930
{
3031
protected override bool SupportsSIUnitSystem => false;
3132
protected override double LumensInOneLumen => 1;
33+
34+
[Fact]
35+
public void LuminousFluxDividedByAreaEqualsIlluminance()
36+
{
37+
var luminousFlux = LuminousFlux.FromLumens(100);
38+
var area = Area.FromSquareMeters(10);
39+
40+
var illuminance = luminousFlux / area;
41+
42+
Assert.Equal(Illuminance.FromLux(10), illuminance);
43+
}
44+
45+
[Fact]
46+
public void LuniousFluxDividedByIlluminanceEqualsArea()
47+
{
48+
var luminousFlux = LuminousFlux.FromLumens(100);
49+
var illuminance = Illuminance.FromLux(10);
50+
51+
var area = luminousFlux / illuminance;
52+
53+
Assert.Equal(Area.FromSquareMeters(10), area);
54+
}
3255
}
3356
}

Diff for: UnitsNet.Tests/CustomCode/MassTests.cs

+64
Original file line numberDiff line numberDiff line change
@@ -164,5 +164,69 @@ public void AmountOfSubstanceFromMassAndMolarMass(
164164

165165
AssertEx.EqualTolerance(expectedAmountOfSubstanceValue, amountOfSubstance.As(expectedAmountOfSubstanceUnit), tolerence);
166166
}
167+
168+
[Theory]
169+
[InlineData(10, MassUnit.Kilogram,
170+
5, SpecificVolumeUnit.CubicMeterPerKilogram,
171+
50, VolumeUnit.CubicMeter)]
172+
public void Multiplying_Mass_By_SpecificVolume_ReturnsVolume(double massValue, MassUnit massUnit, double specificVolumeValue,
173+
SpecificVolumeUnit specificVolumeUnit, double expectedVolumeValue, VolumeUnit expectedVolumeUnit)
174+
{
175+
var mass = new Mass(massValue, massUnit);
176+
var specificVolume = new SpecificVolume(specificVolumeValue, specificVolumeUnit);
177+
var expectedVolume = new Volume(expectedVolumeValue, expectedVolumeUnit);
178+
179+
Volume volume = mass * specificVolume;
180+
181+
Assert.Equal(expectedVolume, volume);
182+
}
183+
184+
[Theory]
185+
[InlineData(10, MassUnit.Kilogram,
186+
5, MassFlowUnit.KilogramPerSecond,
187+
2, DurationUnit.Second)]
188+
public void Dividing_Mass_By_MassFlow_ReturnsDuration(double massValue, MassUnit massUnit, double massFlowValue,
189+
MassFlowUnit massFlowUnit, double expectedDurationValue, DurationUnit expectedDurationUnit)
190+
{
191+
var mass = new Mass(massValue, massUnit);
192+
var massFlow = new MassFlow(massFlowValue, massFlowUnit);
193+
var expectedDuration = new Duration(expectedDurationValue, expectedDurationUnit);
194+
195+
Duration duration = mass / massFlow;
196+
197+
Assert.Equal(expectedDuration, duration);
198+
}
199+
200+
[Theory]
201+
[InlineData(10, MassUnit.Kilogram,
202+
5, AmountOfSubstanceUnit.Mole,
203+
2, MolarMassUnit.KilogramPerMole)]
204+
public void Dividing_Mass_By_AmountOfSubstance_ReturnsMolarMass(double massValue, MassUnit massUnit, double amountOfSubstanceValue,
205+
AmountOfSubstanceUnit amountOfSubstanceUnit, double expectedMolarMassValue, MolarMassUnit expectedMolarMassUnit)
206+
{
207+
var mass = new Mass(massValue, massUnit);
208+
var amountOfSubstance = new AmountOfSubstance(amountOfSubstanceValue, amountOfSubstanceUnit);
209+
var expectedMolarMass = new MolarMass(expectedMolarMassValue, expectedMolarMassUnit);
210+
211+
MolarMass molarMass = mass / amountOfSubstance;
212+
213+
Assert.Equal(expectedMolarMass, molarMass);
214+
}
215+
216+
[Theory]
217+
[InlineData(10, MassUnit.Kilogram,
218+
5, DensityUnit.KilogramPerCubicMeter,
219+
2, VolumeUnit.CubicMeter)]
220+
public void Dividing_Mass_By_Density_ReturnsVolume(double massValue, MassUnit massUnit, double densityValue,
221+
DensityUnit densityUnit, double expectedVolumeValue, VolumeUnit expectedVolumeUnit)
222+
{
223+
var mass = new Mass(massValue, massUnit);
224+
var density = new Density(densityValue, densityUnit);
225+
var expectedVolume = new Volume(expectedVolumeValue, expectedVolumeUnit);
226+
227+
Volume volume = mass / density;
228+
229+
Assert.Equal(expectedVolume, volume);
230+
}
167231
}
168232
}

0 commit comments

Comments
 (0)