public void CreateDistance()
        {
            #region UsageDistance

            // Extension method for the distance base unit (Meters).
            var meters = 4.Meters();

            // Extension method with a unit selector for selecting any unit.
            var kilometers = 5.ToDistance(x => x.Kilo.Meters);

            // Same as above, but as a direct call to the constructor.
            var micrometers = new Distance(6, x => x.Micro.Meters);

            // Constructor, which accepts any IUnit (Primarily used by serialization).
            var millimeters = new Distance(7, UnitSystem.GetUnitFrom("mm", ParseSettings.DefaultInvariantCulture).Value);

            this.output.WriteLine(meters);
            this.output.WriteLine(kilometers);
            this.output.WriteLine(micrometers);
            this.output.WriteLine(millimeters);

            // 4 [m]
            // 5 [km]
            // 6 [μm]
            // 7 [mm]

            #endregion
        }
        public void Distance_Division_Then_ResultShouldBeExpected(double lhs, double rhs, double expected)
        {
            var testee1 = new Distance(lhs, x => x.Meters);
            var testee2 = new Distance(rhs, x => x.Meters);

            var result = testee1 / testee2;

            result.Should().Be(expected);
        }
        public void Distance_CompareTo_Then_ResultShouldBeExpected(double lhs, double rhs, int expected)
        {
            var testee1 = new Distance(lhs, x => x.Centi.Meters);
            var testee2 = new Distance(rhs, x => x.Centi.Meters);

            var result = testee1.CompareTo(testee2);

            result.Should().Be(expected);
        }
        public void Distance_CompareTo_Then_ResultShouldBeAsExpected()
        {
            var testee1 = 1000.Meters();
            var testee2 = new Distance(1, x => x.Kilo.Meters);

            var result = testee1.CompareTo(testee2);

            result.Should().Be(0);
        }
        public void Distance_Multiplication_Then_ResultShouldBeExpected(double lhs, double rhs, double expected)
        {
            var testee1 = new Distance(lhs, x => x.Meters);
            var testee2 = new Distance(rhs, x => x.Meters);

            var result = testee1 * testee2;

            result.Should().Be(expected, "m²");
        }
        public void Distance_Equals_Then_ResultShouldBeAsExpected(double lhs, double rhs, bool expected)
        {
            var testee1 = new Distance(lhs, x => x.Miles);
            var testee2 = new Distance(rhs, x => x.Miles);

            var result = testee1.Equals(testee2);

            result.Should().Be(expected);
        }
        public void Distance_Subtraction_Then_ResultShouldBeExpected(double lhs, double rhs, double expected)
        {
            var testee1 = new Distance(lhs, x => x.Meters);
            var testee2 = new Distance(rhs, x => x.Centi.Meters);

            var result = testee1 - testee2;

            result.Should().Be(expected, "m");
        }
        public void Distance_ToUnit_When_ConvertingFromMilliMeterToMile_Then_ResultShouldBeAsExpected(
            double length,
            double expected)
        {
            var testee = new Distance(length, x => x.Milli.Meters);

            IQuantity result = testee.ToUnit(x => x.Miles);

            result.Value.Should().BeApproximately(expected, TestHelper.DefaultAssertPrecision);
        }
        public void Distance_Subtraction_When_SubtractingAnyNumber_Then_ResultShouldBeExpected(
            double lhs,
            double rhs,
            double expected)
        {
            var testee = new Distance(lhs, x => x.Meters);

            var result = testee - rhs;

            result.Should().Be(expected, "m");
        }
        public void Distance_Multiplication_When_MultiplyingWithAnyNumber_Then_ResultShouldBeExpected(
            double lhs,
            double rhs,
            double expected)
        {
            var testee1 = new Distance(lhs, x => x.Meters);

            var result = testee1 * rhs;

            result.Should().Be(expected, "m");
        }
        public void Distance_Division_When_DividingWithAnyNumber_Then_ResultShouldBeExpected(
            double lhs,
            double rhs,
            double expected)
        {
            var testee = new Distance(lhs, x => x.Meters);

            var result = testee / rhs;

            result.Should().Be(expected, "m");
        }
        public void Distance_Division_When_RhsIsVelocity_Then_ResultShouldBeExpected(
            double lhs,
            double rhs,
            double expected)
        {
            var testee1 = new Distance(lhs, x => x.Meters);
            var testee2 = new Velocity(rhs, selector => selector.Meters / selector.Seconds);

            var result = testee1 / testee2;

            result.Should().BeApproximately(expected, "s");
        }
        public void Distance_Division_When_RhsIsVelocityAndPrefixesAreDifferent_Then_ResultShouldBeExpected(
            double lhs,
            double rhs,
            double expected)
        {
            var testee1 = new Distance(lhs, x => x.Centi.Meters);
            var testee2 = new Velocity(rhs, selector => selector.Meters / selector.Seconds);

            var result = testee1 / testee2;

            result.Should().BeApproximately(expected, "s", TestHelper.DefaultAssertPrecision);
        }
        public void Distance_Addition_When_PrefixesAreDifferent_Then_ResultShouldBeExpected(
            double lhs,
            double rhs,
            double expected)
        {
            var testee1 = new Distance(lhs, x => x.Kilo.Meters);
            var testee2 = new Distance(rhs, x => x.Meters);

            var result = testee1 + testee2;

            result.Should().Be(expected, "km");
        }
        public void Distance_Multiplication_When_UnitsAndPrefixesAreDifferent_Then_ResultShouldBeExpected(
            double lhs,
            double rhs,
            double expected)
        {
            var testee1 = new Distance(lhs, x => x.Deci.Meters);
            var testee2 = new Distance(rhs, x => x.Centi.Meters);

            var result = testee1 * testee2;

            result.Should().BeApproximately(expected, "dm²", TestHelper.DefaultAssertPrecision);
        }
        public void Area_Multiplication_When_MultiplyingWithAnyLength_Then_ResultShouldBeExpected(
            double lhs,
            double rhs,
            double expected)
        {
            var testee = new Area(lhs, x => x.Square.Meters);
            var length = new Distance(rhs, x => x.Miles);

            var result = testee * length;

            result.Should().Be(expected, "m³");
        }
        public void Distance_Addition_When_UnitsAreDifferent_Then_ResultShouldBeAsExpected(
            double lhs,
            double rhs,
            double expected)
        {
            var testee1 = new Distance(lhs, x => x.Miles);
            var testee2 = new Distance(rhs, x => x.Kilo.Meters);

            var result = testee1 + testee2;

            result.Should().BeApproximately(expected, "mi", TestHelper.DefaultAssertPrecision);
        }
        public void Volume_Division_When_DividingWithLength_Then_ResultShouldBeExpected(
            double lhs,
            double rhs,
            double expected)
        {
            var testee1 = new Volume(lhs, x => x.Cubic.Meters);
            var testee2 = new Distance(rhs, x => x.Meters);

            var result = testee1 / testee2;

            result.Should().Be(expected, "m" + Constants.Exponent2);
        }
        public void Distance_Equals_When_PrefixesAreDifferent_Then_ResultShouldBeAsExpected(
            double lhs,
            double lhsPrefix,
            double rhs,
            double rhsPrefix,
            bool expected)
        {
            var testee1 = new Distance(lhs, x => x.By(lhsPrefix).Meters);
            var testee2 = new Distance(rhs, x => x.By(rhsPrefix).Meters);

            var result = testee1.Equals(testee2);

            result.Should().Be(expected);
        }
        public void Distance_Division_When_RhsIsTime_Then_ResultShouldBeExpected(
            double lhs,
            double rhs,
            double expected)
        {
            var testee1 = new Distance(lhs, x => x.Meters);
            var testee2 = new Time(rhs, x => x.Seconds);

            var result = testee1 / testee2;

            result.Should().BeApproximately(expected, "m/s");
        }