/// <summary>
 /// Converts the float input to the correct float value.
 /// </summary>
 /// <typeparam name="TInput"> The temperature type to be converted to. </typeparam>
 /// <param name="input"> The value to be converted. </param>
 /// <exception cref="ArgumentException"> The TInput type is not a valid type for this method. </exception>
 /// <returns>
 /// The result of the conversion.
 /// </returns>
 public static float To <TInput>(this FloatBase input)
     where TInput : TemperatureBase
 {
     return(typeof(TInput).Name switch
     {
         nameof(Celsius) when input is CelsiusFloat castInput => FloatParser(CelsiusConverter.CelsiusToCelsius(castInput.Temperature)),
         nameof(Celsius) when input is FahrenheitFloat castInput => FloatParser(FahrenheitConverter.FahrenheitToCelsius(castInput.Temperature)),
         nameof(Celsius) when input is KelvinFloat castInput => (float)Math.Round(FloatParser(KelvinConverter.KelvinToCelsius(castInput.Temperature)), 2),
         nameof(Celsius) when input is GasFloat castInput => FloatParser(GasConverter.GasToCelsius(castInput.Temperature)),
         nameof(Celsius) when input is RankineFloat castInput => (float)Math.Round(FloatParser(RankineConverter.RankineToCelsius(castInput.Temperature)), 2),
         nameof(Fahrenheit) when input is CelsiusFloat castInput => FloatParser(CelsiusConverter.CelsiusToFahrenheit(castInput.Temperature)),
         nameof(Fahrenheit) when input is FahrenheitFloat castInput => FloatParser(FahrenheitConverter.FahrenheitToFahrenheit(castInput.Temperature)),
         nameof(Fahrenheit) when input is KelvinFloat castInput => (float)Math.Round(FloatParser(KelvinConverter.KelvinToFahrenheit(castInput.Temperature)), 2),
         nameof(Fahrenheit) when input is GasFloat castInput => FloatParser(GasConverter.GasToFahrenheit(castInput.Temperature)),
         nameof(Fahrenheit) when input is RankineFloat castInput => FloatParser(RankineConverter.RankineToFahrenheit(castInput.Temperature)),
         nameof(Kelvin) when input is CelsiusFloat castInput => FloatParser(CelsiusConverter.CelsiusToKelvin(castInput.Temperature)),
         nameof(Kelvin) when input is FahrenheitFloat castInput => FloatParser(FahrenheitConverter.FahrenheitToKelvin(castInput.Temperature)),
         nameof(Kelvin) when input is KelvinFloat castInput => FloatParser(KelvinConverter.KelvinToKelvin(castInput.Temperature)),
         nameof(Kelvin) when input is GasFloat castInput => FloatParser(GasConverter.GasToKelvin(castInput.Temperature)),
         nameof(Kelvin) when input is RankineFloat castInput => FloatParser(RankineConverter.RankineToKelvin(castInput.Temperature)),
         nameof(Gas) when input is CelsiusFloat castInput => FloatParser(CelsiusConverter.CelsiusToGas(castInput.Temperature)),
         nameof(Gas) when input is FahrenheitFloat castInput => FloatParser(FahrenheitConverter.FahrenheitToGas(castInput.Temperature)),
         nameof(Gas) when input is KelvinFloat castInput => FloatParser(KelvinConverter.KelvinToGas(castInput.Temperature)),
         nameof(Gas) when input is GasFloat castInput => FloatParser(GasConverter.GasToGas(castInput.Temperature)),
         nameof(Gas) when input is RankineFloat castInput => FloatParser(RankineConverter.RankineToGas(castInput.Temperature)),
         nameof(Rankine) when input is CelsiusFloat castInput => FloatParser(CelsiusConverter.CelsiusToRankine(castInput.Temperature)),
         nameof(Rankine) when input is FahrenheitFloat castInput => FloatParser(FahrenheitConverter.FahrenheitToRankine(castInput.Temperature)),
         nameof(Rankine) when input is KelvinFloat castInput => FloatParser(KelvinConverter.KelvinToRankine(castInput.Temperature)),
         nameof(Rankine) when input is GasFloat castInput => FloatParser(GasConverter.GasToRankine(castInput.Temperature)),
         nameof(Rankine) when input is RankineFloat castInput => FloatParser(RankineConverter.RankineToRankine(castInput.Temperature)),
         _ => throw new ArgumentException($"Invalid type: {typeof(TInput).Name}")
     });
        public void Test_to_gas_generic_from_gas_with_invalid_parameters_throws_argument_out_of_range_exception(float input)
        {
            // Arrange.
            var inputGas = new GasFloat(input);

            // Act.
            var result = Assert.Throws <ArgumentOutOfRangeException>(() => inputGas.To <Gas>());

            // Assert.
            result.Message.Should().Contain("Temp too low or too high for gas mark!");
        }
        public void Test_to_gas_generic_from_gas_returns_same_value()
        {
            // Arrange.
            var input = new GasFloat(7);

            // Act.
            var result = input.To <Gas>();

            // Assert.
            result.Should().Be(input.Temperature);
        }
        public void Test_to_celsius_generic_from_gas_returns_correct_value(float input, float expected)
        {
            // Arrange.
            var inputGas = new GasFloat(input);

            // Act.
            var result = inputGas.To <Celsius>();

            // Assert.
            result.Should().Be(expected);
        }
        public void Test_to_rankine_generic_from_gas_returns_correct_value()
        {
            // Arrange.
            const float expected = 851.6699999999998f;
            var         input    = new GasFloat(6);

            // Act.
            var result = input.To <Rankine>();

            // Assert.
            result.Should().Be(expected);
        }
        public void Test_to_celsius_from_gas_returns_correct_value()
        {
            // Arrange.
            const float expected = 220f;
            var         input    = new GasFloat(7.0f);

            // Act.
            var result = input.ToCelsius();

            // Assert.
            result.Should().Be(expected);
        }
        public void Test_to_kelvin_generic_from_gas_returns_correct_value()
        {
            // Arrange.
            const float expected = 473.15f;
            var         input    = new GasFloat(6);

            // Act.
            var result = input.To <Kelvin>();

            // Assert.
            result.Should().Be(expected);
        }
        public void Test_to_fahrenheit_generic_from_gas_returns_correct_value()
        {
            // Arrange.
            const float expected = 428f;
            var         input    = new GasFloat(7);

            // Act.
            var result = input.To <Fahrenheit>();

            // Assert.
            result.Should().Be(expected);
        }
 /// <summary>
 /// Converts the GasConverter <paramref name="input"/> to Celsius
 /// </summary>
 /// <param name="input"> The value to be converted. </param>
 /// <exception cref="T:System.ArgumentOutOfRangeException">Temp too low or too high for gas mark!</exception>
 /// <returns>
 /// The Celsius <see langword="float"/> result.
 /// </returns>
 public static float ToCelsius(this GasFloat input)
 {
     return(FloatParser(GasConverter.GasToCelsius(input.Temperature)));
 }
 /// <summary>
 /// Converts the GasConverter <paramref name="input"/> to FahrenheitConverter
 /// </summary>
 /// <param name="input"> The value to be converted. </param>
 /// <exception cref="T:System.ArgumentOutOfRangeException">Temp too low or too high for gas mark!</exception>
 /// <returns>
 /// The FahrenheitConverter <see langword="float"/> result.
 /// </returns>
 public static float ToFahrenheit(this GasFloat input)
 {
     return(FloatParser(GasConverter.GasToFahrenheit(input.Temperature)));
 }