public void Aircraft_Clone_Copies_Every_Property_Correctly() { Dictionary <string, object> values = new Dictionary <string, object>(); int intValue = 1; float floatValue = 121.3414F; double doubleValue = 121.3414; long longValue = (long)int.MaxValue + 1L; DateTime dateTimeValue = new DateTime(2001, 1, 2); string stringValue = ""; var allBoolPropertyNames = typeof(IAircraft).GetProperties().Where(r => r.PropertyType == typeof(bool) || r.PropertyType == typeof(bool?)).Select(r => r.Name).ToList(); foreach (var trueBool in allBoolPropertyNames) { TestCleanup(); TestInitialise(); values.Clear(); for (int setChangedValues = 0; setChangedValues < 2; ++setChangedValues) { // Set the properties of the object to clone using reflection to make sure // we don't forget to update this test in the future... foreach (var property in typeof(IAircraft).GetProperties()) { if (property.Name == "DataVersion") { continue; } bool isChangedValue = property.Name.EndsWith("Changed"); if (setChangedValues == 0 && isChangedValue) { continue; } if (setChangedValues == 1 && !isChangedValue) { continue; } ++intValue; ++floatValue; ++longValue; dateTimeValue = dateTimeValue.AddDays(1); ++_Aircraft.DataVersion; stringValue = String.Format("A{0}", intValue); if (!values.ContainsKey("DataVersion")) { values.Add("DataVersion", _Aircraft.DataVersion); } else { values["DataVersion"] = _Aircraft.DataVersion; } object value = null; switch (property.Name) { case "UniqueId": value = _Aircraft.UniqueId = intValue; break; case "Icao24": value = _Aircraft.Icao24 = stringValue; break; case "Icao24Changed": value = _Aircraft.Icao24Changed; break; case "Icao24Invalid": value = _Aircraft.Icao24Invalid = property.Name == trueBool; break; case "Icao24InvalidChanged": value = _Aircraft.Icao24InvalidChanged; break; case "Callsign": value = _Aircraft.Callsign = stringValue; break; case "CallsignChanged": value = _Aircraft.CallsignChanged; break; case "CallsignIsSuspect": value = _Aircraft.CallsignIsSuspect = property.Name == trueBool; break; case "CallsignIsSuspectChanged": value = _Aircraft.CallsignIsSuspectChanged; break; case "CountMessagesReceived": value = _Aircraft.CountMessagesReceived = longValue; break; case "CountMessagesReceivedChanged": value = _Aircraft.CountMessagesReceivedChanged; break; case "Altitude": value = _Aircraft.Altitude = intValue; break; case "AltitudeChanged": value = _Aircraft.AltitudeChanged; break; case "GroundSpeed": value = _Aircraft.GroundSpeed = intValue; break; case "GroundSpeedChanged": value = _Aircraft.GroundSpeedChanged; break; case "Latitude": value = _Aircraft.Latitude = doubleValue; break; case "LatitudeChanged": value = _Aircraft.LatitudeChanged; break; case "Longitude": value = _Aircraft.Longitude = doubleValue; break; case "LongitudeChanged": value = _Aircraft.LongitudeChanged; break; case "PositionTime": value = _Aircraft.PositionTime = dateTimeValue; break; case "PositionTimeChanged": value = _Aircraft.PositionTimeChanged; break; case "Track": value = _Aircraft.Track = floatValue; break; case "TrackChanged": value = _Aircraft.TrackChanged; break; case "IsTransmittingTrack": value = _Aircraft.IsTransmittingTrack = property.Name == trueBool; break; case "VerticalRate": value = _Aircraft.VerticalRate = intValue; break; case "VerticalRateChanged": value = _Aircraft.VerticalRateChanged; break; case "Squawk": value = _Aircraft.Squawk = intValue; break; case "SquawkChanged": value = _Aircraft.SquawkChanged; break; case "Emergency": value = _Aircraft.Emergency = property.Name == trueBool; break; case "EmergencyChanged": value = _Aircraft.EmergencyChanged; break; case "Registration": value = _Aircraft.Registration = stringValue; break; case "RegistrationChanged": value = _Aircraft.RegistrationChanged; break; case "FirstSeen": value = _Aircraft.FirstSeen = dateTimeValue; break; case "FirstSeenChanged": value = _Aircraft.FirstSeenChanged; break; case "FlightsCount": value = _Aircraft.FlightsCount = intValue; break; case "FlightsCountChanged": value = _Aircraft.FlightsCountChanged; break; case "LastUpdate": value = _Aircraft.LastUpdate = dateTimeValue; break; case "Type": value = _Aircraft.Type = stringValue; break; case "TypeChanged": value = _Aircraft.TypeChanged; break; case "Manufacturer": value = _Aircraft.Manufacturer = stringValue; break; case "ManufacturerChanged": value = _Aircraft.ManufacturerChanged; break; case "Model": value = _Aircraft.Model = stringValue; break; case "ModelChanged": value = _Aircraft.ModelChanged; break; case "ConstructionNumber": value = _Aircraft.ConstructionNumber = stringValue; break; case "ConstructionNumberChanged": value = _Aircraft.ConstructionNumberChanged; break; case "Origin": value = _Aircraft.Origin = stringValue; break; case "OriginChanged": value = _Aircraft.OriginChanged; break; case "Destination": value = _Aircraft.Destination = stringValue; break; case "DestinationChanged": value = _Aircraft.DestinationChanged; break; case "Stopovers": value = stringValue; _Aircraft.Stopovers.Add(stringValue); break; case "StopoversChanged": value = _Aircraft.StopoversChanged = longValue; break; case "Operator": value = _Aircraft.Operator = stringValue; break; case "OperatorChanged": value = _Aircraft.OperatorChanged; break; case "OperatorIcao": value = _Aircraft.OperatorIcao = stringValue; break; case "OperatorIcaoChanged": value = _Aircraft.OperatorIcaoChanged; break; case "WakeTurbulenceCategory": value = _Aircraft.WakeTurbulenceCategory = WakeTurbulenceCategory.Light; break; case "WakeTurbulenceCategoryChanged": value = _Aircraft.WakeTurbulenceCategoryChanged; break; case "EngineType": value = _Aircraft.EngineType = EngineType.Electric; break; case "EngineTypeChanged": value = _Aircraft.EngineTypeChanged; break; case "NumberOfEngines": value = _Aircraft.NumberOfEngines = stringValue; break; case "NumberOfEnginesChanged": value = _Aircraft.NumberOfEnginesChanged; break; case "Species": value = _Aircraft.Species = Species.Gyrocopter; break; case "SpeciesChanged": value = _Aircraft.SpeciesChanged; break; case "IsMilitary": value = _Aircraft.IsMilitary = property.Name == trueBool; break; case "IsMilitaryChanged": value = _Aircraft.IsMilitaryChanged; break; case "Icao24Country": value = _Aircraft.Icao24Country = stringValue; break; case "Icao24CountryChanged": value = _Aircraft.Icao24CountryChanged; break; case "PictureFileName": value = _Aircraft.PictureFileName = stringValue; break; case "PictureFileNameChanged": value = _Aircraft.PictureFileNameChanged; break; case "FirstCoordinateChanged": value = _Aircraft.FirstCoordinateChanged = longValue; break; case "LastCoordinateChanged": value = _Aircraft.LastCoordinateChanged = longValue; break; case "LatestCoordinateTime": value = _Aircraft.LatestCoordinateTime = dateTimeValue; break; case "FullCoordinates": _Aircraft.FullCoordinates.Add(new Coordinate(1, 2, 3F, 4F, 5F)); value = _Aircraft.FullCoordinates[0]; break; case "ShortCoordinates": _Aircraft.ShortCoordinates.Add(new Coordinate(11, 12, 13F, 14F, 15F)); value = _Aircraft.ShortCoordinates[0]; break; case "IcaoCompliantRegistration": value = _Aircraft.Registration; break; case "IsInteresting": value = _Aircraft.IsInteresting = property.Name == trueBool; break; case "IsInterestingChanged": value = _Aircraft.IsInterestingChanged; break; case "OnGround": value = _Aircraft.OnGround = property.Name == trueBool; break; case "OnGroundChanged": value = _Aircraft.OnGroundChanged; break; case "SpeedType": value = _Aircraft.SpeedType = SpeedType.TrueAirSpeed; break; case "SpeedTypeChanged": value = _Aircraft.SpeedTypeChanged; break; case "UserTag": value = _Aircraft.UserTag = stringValue; break; case "UserTagChanged": value = _Aircraft.UserTagChanged; break; default: throw new NotImplementedException(); } Assert.IsNotNull(value, property.Name); values.Add(property.Name, value); } } var clone = (IAircraft)_Aircraft.Clone(); foreach (var property in typeof(IAircraft).GetProperties()) { var expected = values[property.Name]; switch (property.Name) { case "Stopovers": Assert.AreEqual(expected, clone.Stopovers.First(), property.Name); break; case "FullCoordinates": Assert.AreEqual(expected, clone.FullCoordinates[0], property.Name); break; case "ShortCoordinates": Assert.AreEqual(expected, clone.ShortCoordinates[0], property.Name); break; default: var actual = property.GetValue(clone, null); Assert.AreEqual(expected, actual, property.Name); break; } } } }