NavisworksTransport/UnitTests/Utils/UnitsConverterTests.cs
2025-10-21 18:48:27 +08:00

368 lines
13 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

namespace NavisworksTransport.UnitTests.Utils
{
/// <summary>
/// UnitsConverter工具类的纯逻辑测试
/// 测试单位转换计算功能不依赖Navisworks环境
/// </summary>
[TestClass]
public class UnitsConverterTests
{
private const double TOLERANCE = 0.000001; // 浮点数比较精度
#region
[TestMethod]
public void GetUnitsToMetersConversionFactor_Millimeters_ReturnsCorrectFactor()
{
// Arrange & Act
double result = UnitsConverter.GetUnitsToMetersConversionFactor(Units.Millimeters);
// Assert
Assert.AreEqual(0.001, result, TOLERANCE, "毫米到米的转换系数应该是0.001");
}
[TestMethod]
public void GetUnitsToMetersConversionFactor_Centimeters_ReturnsCorrectFactor()
{
// Arrange & Act
double result = UnitsConverter.GetUnitsToMetersConversionFactor(Units.Centimeters);
// Assert
Assert.AreEqual(0.01, result, TOLERANCE, "厘米到米的转换系数应该是0.01");
}
[TestMethod]
public void GetUnitsToMetersConversionFactor_Meters_ReturnsOne()
{
// Arrange & Act
double result = UnitsConverter.GetUnitsToMetersConversionFactor(Units.Meters);
// Assert
Assert.AreEqual(1.0, result, TOLERANCE, "米到米的转换系数应该是1.0");
}
[TestMethod]
public void GetUnitsToMetersConversionFactor_Inches_ReturnsCorrectFactor()
{
// Arrange & Act
double result = UnitsConverter.GetUnitsToMetersConversionFactor(Units.Inches);
// Assert
Assert.AreEqual(0.0254, result, TOLERANCE, "英寸到米的转换系数应该是0.0254");
}
[TestMethod]
public void GetUnitsToMetersConversionFactor_Feet_ReturnsCorrectFactor()
{
// Arrange & Act
double result = UnitsConverter.GetUnitsToMetersConversionFactor(Units.Feet);
// Assert
Assert.AreEqual(0.3048, result, TOLERANCE, "英尺到米的转换系数应该是0.3048");
}
[TestMethod]
public void GetUnitsToMetersConversionFactor_Kilometers_ReturnsCorrectFactor()
{
// Arrange & Act
double result = UnitsConverter.GetUnitsToMetersConversionFactor(Units.Kilometers);
// Assert
Assert.AreEqual(1000.0, result, TOLERANCE, "公里到米的转换系数应该是1000.0");
}
[TestMethod]
public void GetUnitsToMetersConversionFactor_Micrometers_ReturnsCorrectFactor()
{
// Arrange & Act
double result = UnitsConverter.GetUnitsToMetersConversionFactor(Units.Micrometers);
// Assert
Assert.AreEqual(0.000001, result, TOLERANCE, "微米到米的转换系数应该是0.000001");
}
[TestMethod]
public void GetUnitsToMetersConversionFactor_Yards_ReturnsCorrectFactor()
{
// Arrange & Act
double result = UnitsConverter.GetUnitsToMetersConversionFactor(Units.Yards);
// Assert
Assert.AreEqual(0.9144, result, TOLERANCE, "码到米的转换系数应该是0.9144");
}
[TestMethod]
public void GetUnitsToMetersConversionFactor_Miles_ReturnsCorrectFactor()
{
// Arrange & Act
double result = UnitsConverter.GetUnitsToMetersConversionFactor(Units.Miles);
// Assert
Assert.AreEqual(1609.43, result, TOLERANCE, "英里到米的转换系数应该是1609.43");
}
#endregion
#region
[TestMethod]
public void GetMetersToUnitsConversionFactor_Millimeters_ReturnsCorrectFactor()
{
// Arrange & Act
double result = UnitsConverter.GetMetersToUnitsConversionFactor(Units.Millimeters);
// Assert
Assert.AreEqual(1000.0, result, TOLERANCE, "米到毫米的转换系数应该是1000.0");
}
[TestMethod]
public void GetMetersToUnitsConversionFactor_Centimeters_ReturnsCorrectFactor()
{
// Arrange & Act
double result = UnitsConverter.GetMetersToUnitsConversionFactor(Units.Centimeters);
// Assert
Assert.AreEqual(100.0, result, TOLERANCE, "米到厘米的转换系数应该是100.0");
}
[TestMethod]
public void GetMetersToUnitsConversionFactor_Meters_ReturnsOne()
{
// Arrange & Act
double result = UnitsConverter.GetMetersToUnitsConversionFactor(Units.Meters);
// Assert
Assert.AreEqual(1.0, result, TOLERANCE, "米到米的转换系数应该是1.0");
}
[TestMethod]
public void GetMetersToUnitsConversionFactor_Inches_ReturnsCorrectFactor()
{
// Arrange & Act
double result = UnitsConverter.GetMetersToUnitsConversionFactor(Units.Inches);
// Assert
Assert.AreEqual(39.37, result, TOLERANCE, "米到英寸的转换系数应该是39.37");
}
[TestMethod]
public void GetMetersToUnitsConversionFactor_Feet_ReturnsCorrectFactor()
{
// Arrange & Act
double result = UnitsConverter.GetMetersToUnitsConversionFactor(Units.Feet);
// Assert
Assert.AreEqual(3.281, result, TOLERANCE, "米到英尺的转换系数应该是3.281");
}
[TestMethod]
public void GetMetersToUnitsConversionFactor_Kilometers_ReturnsCorrectFactor()
{
// Arrange & Act
double result = UnitsConverter.GetMetersToUnitsConversionFactor(Units.Kilometers);
// Assert
Assert.AreEqual(0.001, result, TOLERANCE, "米到公里的转换系数应该是0.001");
}
#endregion
#region
[TestMethod]
public void ConversionFactors_ShouldBeInverse()
{
// 测试各种单位的正向和反向转换系数是否互为倒数
Units[] testUnits =
{
Units.Millimeters, Units.Centimeters, Units.Meters,
Units.Inches, Units.Feet, Units.Kilometers,
Units.Micrometers, Units.Yards, Units.Miles
};
foreach (var unit in testUnits)
{
// Arrange & Act
double toMeters = UnitsConverter.GetUnitsToMetersConversionFactor(unit);
double fromMeters = UnitsConverter.GetMetersToUnitsConversionFactor(unit);
// Assert
double product = toMeters * fromMeters;
Assert.AreEqual(1.0, product, TOLERANCE,
$"{unit}的正向和反向转换系数应该互为倒数,但得到: {toMeters} * {fromMeters} = {product}");
}
}
#endregion
#region
[TestMethod]
public void GetUnitsToMetersConversionFactor_InvalidUnit_ReturnsDefaultValue()
{
// Arrange
var invalidUnit = (Units)999; // 不存在的单位值
// Act
double result = UnitsConverter.GetUnitsToMetersConversionFactor(invalidUnit);
// Assert
Assert.AreEqual(1.0, result, TOLERANCE, "无效单位应该返回默认值1.0");
}
[TestMethod]
public void GetMetersToUnitsConversionFactor_InvalidUnit_ReturnsDefaultValue()
{
// Arrange
var invalidUnit = (Units)999; // 不存在的单位值
// Act
double result = UnitsConverter.GetMetersToUnitsConversionFactor(invalidUnit);
// Assert
Assert.AreEqual(1.0, result, TOLERANCE, "无效单位应该返回默认值1.0");
}
#endregion
#region
[TestMethod]
public void ActualConversion_Millimeters_CalculatesCorrectly()
{
// 测试实际的距离转换计算
// 1000毫米应该等于1米
// Arrange
double millimeters = 1000.0;
double expectedMeters = 1.0;
// Act
double actualMeters = millimeters * UnitsConverter.GetUnitsToMetersConversionFactor(Units.Millimeters);
// Assert
Assert.AreEqual(expectedMeters, actualMeters, TOLERANCE,
"1000毫米应该转换为1米");
}
[TestMethod]
public void ActualConversion_Feet_CalculatesCorrectly()
{
// 测试实际的距离转换计算
// 1英尺应该约等于0.3048米
// Arrange
double feet = 1.0;
double expectedMeters = 0.3048;
// Act
double actualMeters = feet * UnitsConverter.GetUnitsToMetersConversionFactor(Units.Feet);
// Assert
Assert.AreEqual(expectedMeters, actualMeters, TOLERANCE,
"1英尺应该转换为0.3048米");
}
[TestMethod]
public void ActualConversion_MetersToFeet_CalculatesCorrectly()
{
// 测试实际的距离转换计算
// 1米应该约等于3.281英尺
// Arrange
double meters = 1.0;
double expectedFeet = 3.281;
// Act
double actualFeet = meters * UnitsConverter.GetMetersToUnitsConversionFactor(Units.Feet);
// Assert
Assert.AreEqual(expectedFeet, actualFeet, TOLERANCE,
"1米应该转换为3.281英尺");
}
[TestMethod]
public void RoundTripConversion_PreservesOriginalValue()
{
// 测试往返转换是否保持原始值
Units[] testUnits =
{
Units.Millimeters, Units.Centimeters, Units.Meters,
Units.Inches, Units.Feet, Units.Kilometers
};
double[] testValues = { 0.0, 1.0, 10.5, 100.0, 1000.0, 0.001 };
foreach (var unit in testUnits)
{
foreach (var originalValue in testValues)
{
// Arrange & Act
double toMeters = UnitsConverter.GetUnitsToMetersConversionFactor(unit);
double fromMeters = UnitsConverter.GetMetersToUnitsConversionFactor(unit);
double meters = originalValue * toMeters;
double backToOriginal = meters * fromMeters;
// Assert
Assert.AreEqual(originalValue, backToOriginal, TOLERANCE,
$"往返转换应该保持原始值 {originalValue} ({unit}),但得到 {backToOriginal}");
}
}
}
#endregion
#region
[TestMethod]
public void ConversionFactors_ShouldBeConsistent()
{
// 测试转换系数的一致性和精度
// 已知的精确转换关系
Assert.AreEqual(1000.0,
UnitsConverter.GetUnitsToMetersConversionFactor(Units.Kilometers),
TOLERANCE, "公里到米的转换应该精确");
Assert.AreEqual(0.001,
UnitsConverter.GetUnitsToMetersConversionFactor(Units.Millimeters),
TOLERANCE, "毫米到米的转换应该精确");
// 测试英制单位的标准换算
Assert.AreEqual(0.0254,
UnitsConverter.GetUnitsToMetersConversionFactor(Units.Inches),
TOLERANCE, "英寸到米的转换应该使用标准换算");
Assert.AreEqual(0.3048,
UnitsConverter.GetUnitsToMetersConversionFactor(Units.Feet),
TOLERANCE, "英尺到米的转换应该使用标准换算");
}
[TestMethod]
public void ZeroDistance_ConversionsHandleCorrectly()
{
// 测试零距离的转换
Units[] testUnits =
{
Units.Millimeters, Units.Centimeters, Units.Meters,
Units.Inches, Units.Feet, Units.Kilometers
};
foreach (var unit in testUnits)
{
// Arrange & Act
double zeroInMeters = 0.0 * UnitsConverter.GetUnitsToMetersConversionFactor(unit);
double zeroFromMeters = 0.0 * UnitsConverter.GetMetersToUnitsConversionFactor(unit);
// Assert
Assert.AreEqual(0.0, zeroInMeters, TOLERANCE,
$"零距离转换为米应该保持为零 ({unit})");
Assert.AreEqual(0.0, zeroFromMeters, TOLERANCE,
$"零米转换为{unit}应该保持为零");
}
}
#endregion
}
}