public void TestSpeedConstructor() { var uomsToPass1 = GetUnitOfMeasuresTypeFullNames <NGenericDimensions.Lengths.Length1DUnitOfMeasure>(true, true).ToArray(); var uomsToFail1 = GetUnitOfMeasuresTypeFullNames <NGenericDimensions.Lengths.Length1DUnitOfMeasure>(true, false).ToArray(); var uomsToPass2 = GetUnitOfMeasuresTypeFullNames <DurationUnitOfMeasure>(true, true).ToArray(); var uomsToFail2 = GetUnitOfMeasuresTypeFullNames <DurationUnitOfMeasure>(true, false).ToArray(); // test valid and invalid units of measure for length Func <string, string, string> csharpCode = (l, d) => $@"_ = new NGenericDimensions.Speed<{l}, {d}, double>(4.4);"; foreach (var uomToPass in (from length in uomsToPass1 from duration in uomsToPass2 select new { length, duration })) { AssertCompilationPasses(csharpCode(uomToPass.length, uomToPass.duration)); } foreach (var uomToFail in uomsToFail1) { AssertCompilationFails("cannot be used as type parameter", csharpCode(uomToFail, "NGenericDimensions.Durations.Hours")); } foreach (var uomToFail in uomsToFail2) { AssertCompilationFails("cannot be used as type parameter", csharpCode("NGenericDimensions.Lengths.Uscs.Feet", uomToFail)); } // test common constructor tests TestConstructor(@"_ = new NGenericDimensions.Speed<NGenericDimensions.Lengths.Uscs.Yards, NGenericDimensions.Durations.Hours, {0});"); // test creating speed with a length and duration { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.Uscs.Miles, System.Int32>(60); var durationA = new NGenericDimensions.Duration <NGenericDimensions.Durations.Minutes, System.Byte>(30); var speedA = new NGenericDimensions.Speed <NGenericDimensions.Lengths.Uscs.Miles, NGenericDimensions.Durations.Minutes, System.Int32>(lengthA, durationA); Assert.Equal(2, speedA.SpeedValue); } { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.Uscs.Miles, System.Int32>(60); var durationA = System.TimeSpan.FromMinutes(30); var speedA = new NGenericDimensions.Speed <NGenericDimensions.Lengths.Uscs.Miles, NGenericDimensions.Durations.Minutes, System.Int32>(lengthA, durationA); Assert.Equal(2, speedA.SpeedValue); } // make sure value gets stored in member variable var speedB = new Speed <Miles, Hours, Int32>(3); Assert.Equal(3, speedB.SpeedValue); // make sure value can be constructed via its own kind of data type, and that it is an exact copy var speedC = new Speed <Miles, Hours, Int32>(speedB); Assert.Equal(speedB.SpeedValue, speedC.SpeedValue); Assert.Equal(3, speedC.SpeedValue); Assert.Same(speedB.LengthUnitOfMeasure, speedC.LengthUnitOfMeasure); Assert.Same(speedB.DurationUnitOfMeasure, speedC.DurationUnitOfMeasure); // make sure value of different unit converts propertly via constructor. Assert.Equal(8640, (new NGenericDimensions.Speed <NGenericDimensions.Lengths.Uscs.Inches, NGenericDimensions.Durations.Minutes, System.Int32>(new NGenericDimensions.Speed <NGenericDimensions.Lengths.Uscs.Feet, NGenericDimensions.Durations.Seconds, System.Double>(12))).SpeedValue); // test to make sure we can't use a dimension for the numeric datatype AssertCompilationFails("cannot be used as type parameter", @"_ = new NGenericDimensions.Speed<NGenericDimensions.Volumes.MetricNonSI.Litres, NGenericDimensions.Durations.Minutes, System.Int32>(44);"); AssertCompilationFails("cannot be used as type parameter", @"_ = new NGenericDimensions.Speed<NGenericDimensions.Lengths.Uscs.Inches, NGenericDimensions.Volumes.MetricNonSI.Litres, System.Int32>(44);"); }
public void TestLengthConstructor() { // test valid units of measure for length { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.MetricSI.Kilometres, double>(4.4); } { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.MetricSI.Metres, double>(4.4); } { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.MetricSI.Micrometres, double>(4.4); } { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.MetricSI.Millimetres, double>(4.4); } { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.MetricSI.Nanometres, double>(4.4); } { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.Uscs.Feet, double>(4.4); } { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.Uscs.Inches, double>(4.4); } { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.Uscs.Miles, double>(4.4); } { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.Uscs.Yards, double>(4.4); } // test invalid units of measure of length AssertCompilationFails("cannot be used as type parameter", @"var lengthA = new NGenericDimensions.Length<NGenericDimensions.Areas.MetricNonSI.Hectares, double>(4.4);"); AssertCompilationFails("cannot be used as type parameter", @"var lengthA = new NGenericDimensions.Length<NGenericDimensions.Durations.Days, double>(4.4);"); AssertCompilationFails("cannot be used as type parameter", @"var lengthA = new NGenericDimensions.Length<NGenericDimensions.Durations.Hours, double>(4.4);"); AssertCompilationFails("cannot be used as type parameter", @"var lengthA = new NGenericDimensions.Length<NGenericDimensions.Durations.Microseconds, double>(4.4);"); AssertCompilationFails("cannot be used as type parameter", @"var lengthA = new NGenericDimensions.Length<NGenericDimensions.Durations.Milliseconds, double>(4.4);"); AssertCompilationFails("cannot be used as type parameter", @"var lengthA = new NGenericDimensions.Length<NGenericDimensions.Durations.Minutes, double>(4.4);"); AssertCompilationFails("cannot be used as type parameter", @"var lengthA = new NGenericDimensions.Length<NGenericDimensions.Durations.Seconds, double>(4.4);"); AssertCompilationFails("cannot be used as type parameter", @"var lengthA = new NGenericDimensions.Length<NGenericDimensions.Durations.Ticks, double>(4.4);"); AssertCompilationFails("cannot be used as type parameter", @"var lengthA = new NGenericDimensions.Length<NGenericDimensions.Masses.MetricSI.Grams, double>(4.4);"); AssertCompilationFails("cannot be used as type parameter", @"var lengthA = new NGenericDimensions.Length<NGenericDimensions.Masses.MetricSI.Kilograms, double>(4.4);"); AssertCompilationFails("cannot be used as type parameter", @"var lengthA = new NGenericDimensions.Length<NGenericDimensions.Volumes.MetricNonSI.Litres, double>(4.4);"); AssertCompilationFails("cannot be used as type parameter", @"var lengthA = new NGenericDimensions.Length<NGenericDimensions.Lengths.Length1DUnitOfMeasure, double>(4.4);"); // test number data types { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.MetricSI.Kilometres, System.Double>(System.Convert.ToDouble(4.44444)); } { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.MetricSI.Kilometres, System.Double>(System.Convert.ToSingle(4.44444)); } { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.MetricSI.Kilometres, System.Single>(System.Convert.ToSingle(4.44444)); } { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.MetricSI.Kilometres, System.Decimal>(System.Convert.ToDecimal(4.44444)); } { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.MetricSI.Kilometres, System.Int64>(System.Convert.ToInt64(4)); } { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.MetricSI.Kilometres, System.Int32>(System.Convert.ToInt32(4)); } { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.MetricSI.Kilometres, System.Int16>(System.Convert.ToInt16(4)); } { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.MetricSI.Kilometres, System.Byte>(System.Convert.ToByte(4)); } { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.MetricSI.Kilometres, System.SByte>(System.Convert.ToSByte(4)); } { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.MetricSI.Kilometres, System.UInt16>(System.Convert.ToUInt16(4)); } { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.MetricSI.Kilometres, System.UInt32>(System.Convert.ToUInt32(4)); } { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.MetricSI.Kilometres, System.UInt64>(System.Convert.ToUInt64(4)); } AssertCompilationFails("cannot be used as type parameter", @"var lengthA = new NGenericDimensions.Length<NGenericDimensions.Lengths.MetricSI.Kilometres, System.Char>(System.Convert.ToChar(4));"); { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.MetricSI.Kilometres, System.DateTime>(new System.DateTime(1000)); } // can't stop this from being allowed AssertCompilationFails("cannot be used as type parameter", @"var lengthA = new NGenericDimensions.Length<NGenericDimensions.Lengths.MetricSI.Kilometres, System.Boolean>(System.Convert.ToBoolean(4));"); { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.MetricSI.Kilometres, System.Numerics.BigInteger>(new System.Numerics.BigInteger(4.4)); } // and prove it only allows compatible data types { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.MetricSI.Kilometres, System.Int32>(System.Convert.ToInt32(4)); } { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.MetricSI.Kilometres, System.Int32>(System.Convert.ToInt16(4)); } { var lengthA = new NGenericDimensions.Length <NGenericDimensions.Lengths.MetricSI.Kilometres, System.Int32>(System.Convert.ToByte(4)); } AssertCompilationFails("has some invalid arguments", @"var lengthA = new NGenericDimensions.Length<NGenericDimensions.Lengths.MetricSI.Kilometres, System.Int32>(System.Convert.ToInt64(4));"); // make sure value gets stored in member variable var lengthB = new Length <Kilometres, Int32>(3); Assert.AreEqual(3, lengthB.LengthValue); // make sure value can be constructed via its own kind of data type, and that it is an exact copy var lengthC = new Length <Kilometres, Int32>(lengthB); Assert.AreEqual(lengthB.LengthValue, lengthC.LengthValue); Assert.AreEqual(3, lengthC.LengthValue); Assert.AreSame(lengthB.UnitOfMeasure, lengthC.UnitOfMeasure); // make sure value of different unit converts propertly via constructor. Assert.AreEqual(5000, (new Length <Metres, Int32>(new Length <Kilometres, Int32>(5))).LengthValue); Assert.AreEqual(5000, (new Length <Metres, Int32>(new Length <Kilometres, Int64>(5))).LengthValue); Assert.AreEqual(5500, (new Length <Metres, Int32>(new Length <Kilometres, Decimal>(Convert.ToDecimal(5.5)))).LengthValue); Assert.AreEqual(5500, (new Length <Metres, Int32>(new Length <Kilometres, Double>(5.5))).LengthValue); // test to make sure we can't use a dimension for the numeric datatype AssertCompilationFails("cannot be used as type parameter", @"var lengthA = new NGenericDimensions.Length<NGenericDimensions.Lengths.MetricSI.Kilometres, NGenericDimensions.Length<NGenericDimensions.Lengths.MetricSI.Millimetres, System.Double>>(44.4);"); }