namespace QWERTYkez.Mensura.Tests { public class CollectionsDivideExtensionsTest { private const double Tolerance = 1e-12; private static readonly Length scalarUnit = Length.Meter; // 1000 mm private static readonly double scalarDouble = 2.0; // Коллекции для тестирования: два элемента private static readonly Length[] unitsArray = [Length.Meter, Length._MilliMeter]; private static readonly Length?[] nullableUnitsArray = [Length.Meter, null, Length._MilliMeter]; private static readonly List unitsList = [Length.Meter, Length._MilliMeter]; private static readonly List nullableUnitsList = [Length.Meter, null, Length._MilliMeter]; private static readonly double[] doubleArray = [2.0, 3.0]; private static readonly double?[] nullableDoubleArray = [2.0, null, 3.0]; // ====================== 1. T[] / double ====================== [Fact] public void Div_TArray_Double_Returns_TArray() { var result = unitsArray.Div(scalarDouble); Assert.Equal(2, result.Length); Assert.Equal(1000 / 2.0, (double)result[0], Tolerance); Assert.Equal(1 / 2.0, (double)result[1], Tolerance); } // ====================== 2. T?[] / double ====================== [Fact] public void Div_NullableTArray_Double_Returns_NullableTArray() { var result = nullableUnitsArray.Div(scalarDouble); Assert.Equal(3, result.Length); Assert.Equal(1000 / 2.0, (double)result[0]!, Tolerance); Assert.Equal(0 / 2.0, (double)result[1]!, Tolerance); Assert.Equal(1 / 2.0, (double)result[2]!, Tolerance); } // ====================== 3. double / T[] ====================== [Fact] public void Div_Double_TArray_Returns_TArray() { var result = scalarDouble.Div(unitsArray); Assert.Equal(2, result.Length); Assert.Equal(2.0 / 1000, (double)result[0], Tolerance); Assert.Equal(2.0 / 1, (double)result[1], Tolerance); } // ====================== 4. double / T?[] ====================== [Fact] public void Div_Double_NullableTArray_Returns_NullableTArray() { var result = scalarDouble.Div(nullableUnitsArray); Assert.Equal(3, result.Length); Assert.Equal(2.0 / 1000, (double)result[0]!, Tolerance); Assert.Equal(2.0 / 0, (double)result[1]!, Tolerance); Assert.Equal(2.0 / 1, (double)result[2]!, Tolerance); } // ====================== 5. List / double ====================== [Fact] public void Div_ListT_Double_Returns_ListT() { var result = unitsList.Div(scalarDouble); Assert.Equal(2, result.Count); Assert.Equal(1000 / 2.0, (double)result[0], Tolerance); Assert.Equal(1 / 2.0, (double)result[1], Tolerance); } // ====================== 6. List / double ====================== [Fact] public void Div_ListNullableT_Double_Returns_ListNullableT() { var result = nullableUnitsList.Div(scalarDouble); Assert.Equal(3, result.Count); Assert.Equal(1000 / 2.0, (double)result[0]!, Tolerance); Assert.Equal(0 / 2.0, (double)result[1]!, Tolerance); Assert.Equal(1 / 2.0, (double)result[2]!, Tolerance); } // ====================== 7. double / List ====================== [Fact] public void Div_Double_ListT_Returns_ListT() { var result = scalarDouble.Div(unitsList); Assert.Equal(2, result.Count); Assert.Equal(2.0 / 1000, (double)result[0], Tolerance); Assert.Equal(2.0 / 1, (double)result[1], Tolerance); } // ====================== 8. double / List ====================== [Fact] public void Div_Double_ListNullableT_Returns_ListNullableT() { var result = scalarDouble.Div(nullableUnitsList); Assert.Equal(3, result.Count); Assert.Equal(2.0 / 1000, (double)result[0]!, Tolerance); Assert.Equal(2.0 / 0, (double)result[1]!, Tolerance); Assert.Equal(2.0 / 1, (double)result[2]!, Tolerance); } // ====================== 9. IReadOnlyCollection / double (Span) ====================== [Fact] public void Div_IReadOnlyCollectionT_Double_Span() { Span dest = new Length[2]; ((IReadOnlyCollection)unitsArray).Div(scalarDouble, dest); Assert.Equal(1000 / 2.0, (double)dest[0], Tolerance); Assert.Equal(1 / 2.0, (double)dest[1], Tolerance); } // ====================== 10. IReadOnlyCollection / double (Span) ====================== [Fact] public void Div_IReadOnlyCollectionNullableT_Double_Span() { Span dest = new Length?[3]; ((IReadOnlyCollection)nullableUnitsArray).Div(scalarDouble, dest); Assert.Equal(1000 / 2.0, (double)dest[0]!, Tolerance); Assert.Equal(0 / 2.0, (double)dest[1]!, Tolerance); Assert.Equal(1 / 2.0, (double)dest[2]!, Tolerance); } // ====================== 11. double / IReadOnlyCollection (Span) ====================== [Fact] public void Div_Double_IReadOnlyCollectionT_Span() { Span dest = new Length[2]; scalarDouble.Div((IReadOnlyCollection)unitsArray, dest); Assert.Equal(2.0 / 1000, (double)dest[0], Tolerance); Assert.Equal(2.0 / 1, (double)dest[1], Tolerance); } // ====================== 12. double / IReadOnlyCollection (Span) ====================== [Fact] public void Div_Double_IReadOnlyCollectionNullableT_Span() { Span dest = new Length?[3]; scalarDouble.Div((IReadOnlyCollection)nullableUnitsArray, dest); Assert.Equal(2.0 / 1000, (double)dest[0]!, Tolerance); Assert.Equal(2.0 / 0, (double)dest[1]!, Tolerance); Assert.Equal(2.0 / 1, (double)dest[2]!, Tolerance); } // ====================== 13. IEnumerable / double ====================== [Fact] public void Div_IEnumerableT_Double_Returns_IEnumerableT() { var result = ((IEnumerable)unitsArray).Div(scalarDouble).ToList(); Assert.Equal(2, result.Count); Assert.Equal(1000 / 2.0, (double)result[0], Tolerance); Assert.Equal(1 / 2.0, (double)result[1], Tolerance); } // ====================== 14. IEnumerable / double ====================== [Fact] public void Div_IEnumerableNullableT_Double_Returns_IEnumerableNullableT() { var result = ((IEnumerable)nullableUnitsArray).Div(scalarDouble).ToList(); Assert.Equal(3, result.Count); Assert.Equal(1000 / 2.0, (double)result[0]!, Tolerance); Assert.Equal(0 / 2.0, (double)result[1]!, Tolerance); Assert.Equal(1 / 2.0, (double)result[2]!, Tolerance); } // ====================== 15. double / IEnumerable ====================== [Fact] public void Div_Double_IEnumerableT_Returns_IEnumerableT() { var result = scalarDouble.Div((IEnumerable)unitsArray).ToList(); Assert.Equal(2, result.Count); Assert.Equal(2.0 / 1000, (double)result[0], Tolerance); Assert.Equal(2.0 / 1, (double)result[1], Tolerance); } // ====================== 16. double / IEnumerable ====================== [Fact] public void Div_Double_IEnumerableNullableT_Returns_IEnumerableNullableT() { var result = scalarDouble.Div((IEnumerable)nullableUnitsArray).ToList(); Assert.Equal(3, result.Count); Assert.Equal(2.0 / 1000, (double)result[0]!, Tolerance); Assert.Equal(2.0 / 0, (double)result[1]!, Tolerance); Assert.Equal(2.0 / 1, (double)result[2]!, Tolerance); } // ====================== 17. double[] / T ====================== [Fact] public void Div_DoubleArray_T_Returns_TArray() { var result = doubleArray.Div(scalarUnit); Assert.Equal(2, result.Length); Assert.Equal(2.0 / 1000, (double)result[0], Tolerance); Assert.Equal(3.0 / 1000, (double)result[1], Tolerance); } // ====================== 18. double?[] / T ====================== [Fact] public void Div_NullableDoubleArray_T_Returns_NullableTArray() { var result = nullableDoubleArray.Div(scalarUnit); Assert.Equal(3, result.Length); Assert.Equal(2.0 / 1000, (double)result[0]!, Tolerance); Assert.Equal(0 / 1000, (double)result[1]!, Tolerance); Assert.Equal(3.0 / 1000, (double)result[2]!, Tolerance); } // ====================== 19. T / double[] ====================== [Fact] public void Div_T_DoubleArray_Returns_TArray() { var result = scalarUnit.Div(doubleArray); Assert.Equal(2, result.Length); Assert.Equal(1000 / 2.0, (double)result[0], Tolerance); Assert.Equal(1000 / 3.0, (double)result[1], Tolerance); } // ====================== 20. T / double?[] ====================== [Fact] public void Div_T_NullableDoubleArray_Returns_NullableTArray() { var result = scalarUnit.Div(nullableDoubleArray); Assert.Equal(3, result.Length); Assert.Equal(1000 / 2.0, (double)result[0]!, Tolerance); Assert.Equal(1000 / 0.0, (double)result[1]!, Tolerance); Assert.Equal(1000 / 3.0, (double)result[2]!, Tolerance); } // ====================== 21. List / T ====================== [Fact] public void Div_ListDouble_T_Returns_ListT() { var list = new List { 2.0, 3.0 }; var result = list.Div(scalarUnit); Assert.Equal(2, result.Count); Assert.Equal(2.0 / 1000, (double)result[0], Tolerance); Assert.Equal(3.0 / 1000, (double)result[1], Tolerance); } // ====================== 22. List / T ====================== [Fact] public void Div_ListNullableDouble_T_Returns_ListNullableT() { var list = new List { 2.0, null, 3.0 }; var result = list.Div(scalarUnit); Assert.Equal(3, result.Count); Assert.Equal(2.0 / 1000, (double)result[0]!, Tolerance); Assert.Equal(0 / 1000, (double)result[1]!, Tolerance); Assert.Equal(3.0 / 1000, (double)result[2]!, Tolerance); } // ====================== 23. T / List ====================== [Fact] public void Div_T_ListDouble_Returns_ListT() { var list = new List { 2.0, 3.0 }; var result = scalarUnit.Div(list); Assert.Equal(2, result.Count); Assert.Equal(1000 / 2.0, (double)result[0], Tolerance); Assert.Equal(1000 / 3.0, (double)result[1], Tolerance); } // ====================== 24. T / List ====================== [Fact] public void Div_T_ListNullableDouble_Returns_ListNullableT() { var list = new List { 2.0, null, 3.0 }; var result = scalarUnit.Div(list); Assert.Equal(3, result.Count); Assert.Equal(1000 / 2.0, (double)result[0]!, Tolerance); Assert.Equal(1000 / 0.0, (double)result[1]!, Tolerance); Assert.Equal(1000 / 3.0, (double)result[2]!, Tolerance); } // ====================== 25. T / T[] -> double[] ====================== [Fact] public void Div_T_TArray_Returns_DoubleArray() { var result = scalarUnit.Div(unitsArray); Assert.Equal(2, result.Length); Assert.Equal(1000 / 1000.0, result[0], Tolerance); Assert.Equal(1000 / 1.0, result[1], Tolerance); } // ====================== Дополнительно: пустые коллекции, null аргументы ====================== [Fact] public void Div_EmptyArray_ReturnsEmptyArray() { var empty = Array.Empty(); var result = empty.Div(2.0); Assert.Empty(result); } } }