diff --git a/PKHeX.Core/Legality/BulkGenerator.cs b/PKHeX.Core/Legality/BulkGenerator.cs new file mode 100644 index 000000000..6c3dacc3f --- /dev/null +++ b/PKHeX.Core/Legality/BulkGenerator.cs @@ -0,0 +1,34 @@ +using System.Collections.Generic; +using System.Linq; + +namespace PKHeX.Core +{ + /// + /// Logic for generating a large amount of data. + /// + public static class BulkGenerator + { + public static IList GetLivingDex(SaveFile sav) + { + var bd = sav.BoxData; + var tr = sav; + for (int i = 1; i <= sav.MaxSpeciesID; i++) // should really get a list of valid species IDs + { + var pk = sav.BlankPKM; + pk.Species = i; + pk.Gender = pk.GetSaneGender(); + if (i == (int)Species.Meowstic) + pk.AltForm = pk.Gender; + + var f = EncounterMovesetGenerator.GeneratePKMs(pk, tr).FirstOrDefault(); + if (f == null) + continue; + + var converted = PKMConverter.ConvertToType(f, sav.PKMType, out _); + if (converted != null) + bd[i] = converted; + } + return bd; + } + } +} diff --git a/PKHeX.Core/PKM/PKM.cs b/PKHeX.Core/PKM/PKM.cs index fad6669ba..443cd2e73 100644 --- a/PKHeX.Core/PKM/PKM.cs +++ b/PKHeX.Core/PKM/PKM.cs @@ -912,7 +912,7 @@ namespace PKHeX.Core /// /// /// If a originated in a generation prior to Generation 6, the is updated. - /// If a is in the format, it will update the instead. + /// If a is in the format, it will update the instead. /// public virtual void SetShiny() { diff --git a/PKHeX.Core/Saves/SAV3.cs b/PKHeX.Core/Saves/SAV3.cs index fc979b06b..1538ea887 100644 --- a/PKHeX.Core/Saves/SAV3.cs +++ b/PKHeX.Core/Saves/SAV3.cs @@ -914,21 +914,7 @@ namespace PKHeX.Core IsEBerryChecksumValid = EBerryChecksum == chk; } #endregion - - // RTC - public sealed class RTC3 - { - public readonly byte[] Data; - public const int Size = 8; - - public RTC3(byte[] data) => Data = data; - - public int Day { get => BitConverter.ToUInt16(Data, 0x00); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x00); } - public int Hour { get => Data[2]; set => Data[2] = (byte)value; } - public int Minute { get => Data[3]; set => Data[3] = (byte)value; } - public int Second { get => Data[4]; set => Data[4] = (byte)value; } - } - + public RTC3 ClockInitial { get @@ -1040,4 +1026,18 @@ namespace PKHeX.Core return true; } } + + // RTC + public sealed class RTC3 + { + public readonly byte[] Data; + public const int Size = 8; + + public RTC3(byte[] data) => Data = data; + + public int Day { get => BitConverter.ToUInt16(Data, 0x00); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x00); } + public int Hour { get => Data[2]; set => Data[2] = (byte)value; } + public int Minute { get => Data[3]; set => Data[3] = (byte)value; } + public int Second { get => Data[4]; set => Data[4] = (byte)value; } + } } diff --git a/PKHeX.Core/Saves/SAV3Colosseum.cs b/PKHeX.Core/Saves/SAV3Colosseum.cs index 276710ab3..9b0771b47 100644 --- a/PKHeX.Core/Saves/SAV3Colosseum.cs +++ b/PKHeX.Core/Saves/SAV3Colosseum.cs @@ -112,7 +112,7 @@ namespace PKHeX.Core private byte[] GetInnerData() { - StrategyMemo.FinalData.CopyTo(Data, Memo); + StrategyMemo.Write().CopyTo(Data, Memo); SetChecksums(); // Get updated save slot data diff --git a/PKHeX.Core/Saves/SAV3XD.cs b/PKHeX.Core/Saves/SAV3XD.cs index c71207677..f59a4d554 100644 --- a/PKHeX.Core/Saves/SAV3XD.cs +++ b/PKHeX.Core/Saves/SAV3XD.cs @@ -132,8 +132,8 @@ namespace PKHeX.Core private byte[] GetInnerData() { // Set Memo Back - StrategyMemo.FinalData.CopyTo(Data, Memo); - ShadowInfo.FinalData.CopyTo(Data, Shadow); + StrategyMemo.Write().CopyTo(Data, Memo); + ShadowInfo.Write().CopyTo(Data, Shadow); SetChecksums(); // Get updated save slot data diff --git a/PKHeX.Core/Saves/SAV5.cs b/PKHeX.Core/Saves/SAV5.cs index 0d2bd796f..dfd6a03ee 100644 --- a/PKHeX.Core/Saves/SAV5.cs +++ b/PKHeX.Core/Saves/SAV5.cs @@ -203,7 +203,7 @@ namespace PKHeX.Core public abstract PlayerData5 PlayerData { get; } public abstract BattleSubway5 BattleSubway { get; } - public int GetMailOffset(int index) => (index * Mail5.SIZE) + 0x1DD00; + public static int GetMailOffset(int index) => (index * Mail5.SIZE) + 0x1DD00; public byte[] GetMailData(int offset) => GetData(offset, Mail5.SIZE); } } diff --git a/PKHeX.Core/Saves/Substructures/Battle Videos/BV6.cs b/PKHeX.Core/Saves/Substructures/Battle Videos/BV6.cs index 6eb8576ff..ed9d6f4fb 100644 --- a/PKHeX.Core/Saves/Substructures/Battle Videos/BV6.cs +++ b/PKHeX.Core/Saves/Substructures/Battle Videos/BV6.cs @@ -39,7 +39,7 @@ namespace PKHeX.Core public ulong RNGSeed2 { get => BitConverter.ToUInt64(Data, 0x1B0); set => BitConverter.GetBytes(value).CopyTo(Data, 0x1B0); } public int Background { get => BitConverter.ToInt32(Data, 0x1BC); set => BitConverter.GetBytes(value).CopyTo(Data, 0x1BC); } - public int _1CE { get => BitConverter.ToUInt16(Data, 0x1CE); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x1CE); } + public int Unk1CE { get => BitConverter.ToUInt16(Data, 0x1CE); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x1CE); } public int IntroID { get => BitConverter.ToUInt16(Data, 0x1E4); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x1E4); } public int MusicID { get => BitConverter.ToUInt16(Data, 0x1F0); set => BitConverter.GetBytes((ushort)value).CopyTo(Data, 0x1F0); } diff --git a/PKHeX.Core/Saves/Substructures/Gen3/ShadowInfo.cs b/PKHeX.Core/Saves/Substructures/Gen3/ShadowInfo.cs index 3e50878aa..127c1cd60 100644 --- a/PKHeX.Core/Saves/Substructures/Gen3/ShadowInfo.cs +++ b/PKHeX.Core/Saves/Substructures/Gen3/ShadowInfo.cs @@ -34,7 +34,7 @@ namespace PKHeX.Core return entry; } - public byte[] FinalData => Entries.SelectMany(entry => entry.Data).Take(MaxLength).ToArray(); + public byte[] Write() => Entries.SelectMany(entry => entry.Data).Take(MaxLength).ToArray(); public ShadowInfoEntryXD GetEntry(int Species, uint PID) { diff --git a/PKHeX.Core/Saves/Substructures/Gen3/StrategyMemo.cs b/PKHeX.Core/Saves/Substructures/Gen3/StrategyMemo.cs index 8df837c65..627e05380 100644 --- a/PKHeX.Core/Saves/Substructures/Gen3/StrategyMemo.cs +++ b/PKHeX.Core/Saves/Substructures/Gen3/StrategyMemo.cs @@ -7,7 +7,7 @@ namespace PKHeX.Core public sealed class StrategyMemo { private readonly bool XD; - private const int SIZE_ENTRY = 12; + public const int SIZE_ENTRY = 12; private readonly List Entries = new List(); public const int MAX_COUNT = 500; public const int MAX_SIZE = MAX_COUNT * SIZE_ENTRY; @@ -38,7 +38,7 @@ namespace PKHeX.Core return new StrategyMemoEntry(XD, data); } - public byte[] FinalData => BigEndian.GetBytes((short)Entries.Count).Concat(_unk) // count followed by populated entries + public byte[] Write() => BigEndian.GetBytes((short)Entries.Count).Concat(_unk) // count followed by populated entries .Concat(Entries.SelectMany(entry => entry.Data)).ToArray(); public StrategyMemoEntry GetEntry(int Species) @@ -54,75 +54,75 @@ namespace PKHeX.Core else Entries.Add(entry); } + } - public sealed class StrategyMemoEntry + public sealed class StrategyMemoEntry + { + public readonly byte[] Data; + private readonly bool XD; + + public StrategyMemoEntry(bool xd) : this(xd, new byte[StrategyMemo.SIZE_ENTRY]) { } + + public StrategyMemoEntry(bool xd, byte[] data) { - public readonly byte[] Data; - private readonly bool XD; - - public StrategyMemoEntry(bool xd) : this(xd, new byte[SIZE_ENTRY]) { } - - public StrategyMemoEntry(bool xd, byte[] data) - { - Data = data; - XD = xd; - } - - public int Species - { - get - { - int val = BigEndian.ToUInt16(Data, 0) & 0x1FF; - return SpeciesConverter.GetG4Species(val); - } - set - { - value = SpeciesConverter.GetG3Species(value); - int cval = BigEndian.ToUInt16(Data, 0); - cval &= 0xE00; value &= 0x1FF; cval |= value; - BigEndian.GetBytes((ushort)cval).CopyTo(Data, 0); - } - } - - private bool Flag0 { get => Data[0] >> 6 == 1; set { Data[0] &= 0xBF; if (value) Data[0] |= 0x40; } } // Unused - private bool Flag1 { get => Data[0] >> 7 == 1; set { Data[0] &= 0x7F; if (value) Data[0] |= 0x80; } } // Complete Entry - public int SID { get => BigEndian.ToUInt16(Data, 4); set => BigEndian.GetBytes((ushort)value).CopyTo(Data, 4); } - public int TID { get => BigEndian.ToUInt16(Data, 6); set => BigEndian.GetBytes((ushort)value).CopyTo(Data, 6); } - public uint PID { get => BigEndian.ToUInt32(Data, 8); set => BigEndian.GetBytes(value).CopyTo(Data, 8); } - - public bool Seen - { - get - { - if (XD) return !Flag1; - return Species != 0; - } - set - { - if (XD) - Flag1 = !value; - else if (!value) - new byte[SIZE_ENTRY].CopyTo(Data, 0); - } - } - - public bool Owned - { - get - { - if (XD) return false; - return Flag0 || !Flag1; - } - set - { - if (XD) return; - if (!value) - Flag1 = true; - } - } - - public bool IsEmpty => Species == 0; - public bool Matches(int species, uint pid, int tid, int sid) => Species == species && PID == pid && TID == tid && SID == sid; + Data = data; + XD = xd; } + + public int Species + { + get + { + int val = BigEndian.ToUInt16(Data, 0) & 0x1FF; + return SpeciesConverter.GetG4Species(val); + } + set + { + value = SpeciesConverter.GetG3Species(value); + int cval = BigEndian.ToUInt16(Data, 0); + cval &= 0xE00; value &= 0x1FF; cval |= value; + BigEndian.GetBytes((ushort)cval).CopyTo(Data, 0); + } + } + + private bool Flag0 { get => Data[0] >> 6 == 1; set { Data[0] &= 0xBF; if (value) Data[0] |= 0x40; } } // Unused + private bool Flag1 { get => Data[0] >> 7 == 1; set { Data[0] &= 0x7F; if (value) Data[0] |= 0x80; } } // Complete Entry + public int SID { get => BigEndian.ToUInt16(Data, 4); set => BigEndian.GetBytes((ushort)value).CopyTo(Data, 4); } + public int TID { get => BigEndian.ToUInt16(Data, 6); set => BigEndian.GetBytes((ushort)value).CopyTo(Data, 6); } + public uint PID { get => BigEndian.ToUInt32(Data, 8); set => BigEndian.GetBytes(value).CopyTo(Data, 8); } + + public bool Seen + { + get + { + if (XD) return !Flag1; + return Species != 0; + } + set + { + if (XD) + Flag1 = !value; + else if (!value) + new byte[StrategyMemo.SIZE_ENTRY].CopyTo(Data, 0); + } + } + + public bool Owned + { + get + { + if (XD) return false; + return Flag0 || !Flag1; + } + set + { + if (XD) return; + if (!value) + Flag1 = true; + } + } + + public bool IsEmpty => Species == 0; + public bool Matches(int species, uint pid, int tid, int sid) => Species == species && PID == pid && TID == tid && SID == sid; } } diff --git a/PKHeX.WinForms/Controls/PKM Editor/DrawConfig.cs b/PKHeX.WinForms/Controls/PKM Editor/DrawConfig.cs index baebfca91..bf6b89d2a 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/DrawConfig.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/DrawConfig.cs @@ -108,27 +108,6 @@ namespace PKHeX.WinForms public void Dispose() => Brushes.Dispose(); - public sealed class BrushSet : IDisposable - { - public Brush Text { get; set; } - public Brush BackLegal { get; set; } - public Brush BackDefault { get; set; } - public Brush TextHighlighted { get; set; } - public Brush BackHighlighted { get; set; } - - public Brush GetText(bool highlight) => highlight ? TextHighlighted : Text; - public Brush GetBackground(bool legal, bool highlight) => highlight ? BackHighlighted : (legal ? BackLegal : BackDefault); - - public void Dispose() - { - Text.Dispose(); - BackLegal.Dispose(); - BackDefault.Dispose(); - TextHighlighted.Dispose(); - BackHighlighted.Dispose(); - } - } - public override string ToString() { var props = ReflectUtil.GetAllPropertyInfoCanWritePublic(typeof(DrawConfig)); @@ -139,11 +118,7 @@ namespace PKHeX.WinForms continue; var name = p.Name; - object value; - if (p.PropertyType == typeof(Color)) - value = ((Color)p.GetValue(this)).ToArgb(); - else - value = p.GetValue(this); + var value = p.PropertyType == typeof(Color) ? ((Color)p.GetValue(this)).ToArgb() : p.GetValue(this); lines.Add($"{name}\t{value}"); } return string.Join("\n", lines); @@ -189,4 +164,25 @@ namespace PKHeX.WinForms } } } + + public sealed class BrushSet : IDisposable + { + public Brush Text { get; set; } + public Brush BackLegal { get; set; } + public Brush BackDefault { get; set; } + public Brush TextHighlighted { get; set; } + public Brush BackHighlighted { get; set; } + + public Brush GetText(bool highlight) => highlight ? TextHighlighted : Text; + public Brush GetBackground(bool legal, bool highlight) => highlight ? BackHighlighted : (legal ? BackLegal : BackDefault); + + public void Dispose() + { + Text.Dispose(); + BackLegal.Dispose(); + BackDefault.Dispose(); + TextHighlighted.Dispose(); + BackHighlighted.Dispose(); + } + } } diff --git a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs index 94dece9c1..bab5e5286 100644 --- a/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs +++ b/PKHeX.WinForms/Controls/SAV Editor/SAVEditor.cs @@ -422,7 +422,14 @@ namespace PKHeX.WinForms.Controls return; } if (M.Boxes.Count > 1) // subview open - { var z = M.Boxes[1].ParentForm; z.CenterToForm(ParentForm); z.BringToFront(); return; } + { + var z = M.Boxes[1].ParentForm; + if (z == null) + return; + z.CenterToForm(ParentForm); + z.BringToFront(); + return; + } new SAV_BoxViewer(this, M).Show(); } @@ -1198,12 +1205,6 @@ namespace PKHeX.WinForms.Controls ResetParty(); } - private void GenerateLivingDex() - { - SAV.BoxData = GetLivingDex(SAV); - ReloadSlots(); - } - private static PKMImportSetting GetPKMSetOverride(bool currentSetting) { var yn = currentSetting ? MsgYes : MsgNo; @@ -1219,23 +1220,5 @@ namespace PKHeX.WinForms.Controls _ => PKMImportSetting.UseDefault }; } - - private static IList GetLivingDex(SaveFile SAV) - { - var bd = SAV.BoxData; - var tr = SAV; - for (int i = 1; i <= 807; i++) - { - var pk = SAV.BlankPKM; - pk.Species = i; - pk.Gender = pk.GetSaneGender(); - if (i == 678) - pk.AltForm = pk.Gender; - var f = EncounterMovesetGenerator.GeneratePKMs(pk, tr).FirstOrDefault(); - if (f != null) - bd[i] = PKMConverter.ConvertToType(f, SAV.PKMType, out _); - } - return bd; - } } } diff --git a/PKHeX.WinForms/MainWindow/Main.cs b/PKHeX.WinForms/MainWindow/Main.cs index a61f817b8..7caa4ae8b 100644 --- a/PKHeX.WinForms/MainWindow/Main.cs +++ b/PKHeX.WinForms/MainWindow/Main.cs @@ -479,8 +479,10 @@ namespace PKHeX.WinForms private void MainMenuFolder(object sender, EventArgs e) { - if (!this.OpenWindowExists()) - new SAV_FolderList(s => OpenSAV(SaveUtil.GetVariantSAV(s.FilePath), s.FilePath)).Show(); + if (this.OpenWindowExists()) + return; + var form = new SAV_FolderList(s => OpenSAV(SaveUtil.GetVariantSAV(s.FilePath), s.FilePath)); + form.Show(); } // Misc Options diff --git a/PKHeX.WinForms/Subforms/Save Editors/Gen3/SAV_RTC3.cs b/PKHeX.WinForms/Subforms/Save Editors/Gen3/SAV_RTC3.cs index ae5436125..7c108a957 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/Gen3/SAV_RTC3.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/Gen3/SAV_RTC3.cs @@ -20,8 +20,8 @@ namespace PKHeX.WinForms LoadData(); } - private readonly SAV3.RTC3 ClockInitial; - private readonly SAV3.RTC3 ClockElapsed; + private readonly RTC3 ClockInitial; + private readonly RTC3 ClockElapsed; private void LoadData() { diff --git a/PKHeX.WinForms/Subforms/Save Editors/SAV_MailBox.cs b/PKHeX.WinForms/Subforms/Save Editors/SAV_MailBox.cs index df14ff892..40928c754 100644 --- a/PKHeX.WinForms/Subforms/Save Editors/SAV_MailBox.cs +++ b/PKHeX.WinForms/Subforms/Save Editors/SAV_MailBox.cs @@ -99,7 +99,7 @@ namespace PKHeX.WinForms m[i] = new Mail5(((PK5)p[i]).HeldMailData); for (int i = p.Count, j = 0; i < m.Length; i++, j++) { - int ofs = sav5.GetMailOffset(j); + int ofs = SAV5.GetMailOffset(j); var data = sav5.GetMailData(ofs); m[i] = new Mail5(data, ofs); } diff --git a/Tests/PKHeX.Core.Tests/PKM/PKMTests.cs b/Tests/PKHeX.Core.Tests/PKM/PKMTests.cs index d3d68c946..2e9d2e1ce 100644 --- a/Tests/PKHeX.Core.Tests/PKM/PKMTests.cs +++ b/Tests/PKHeX.Core.Tests/PKM/PKMTests.cs @@ -6,17 +6,15 @@ using Xunit; namespace PKHeX.Tests.PKM { - public static class PKMTests + public class StringTests { - public class StringTests + [Fact] + public void EncodesOTNameCorrectly() { - [Fact] - public void EncodesOTNameCorrectly() + const string name_fabian = "Fabian♂"; + var pkm = new PK7 { OT_Name = name_fabian }; + var byte_fabian = new byte[] { - const string name_fabian = "Fabian♂"; - var pkm = new PK7 { OT_Name = name_fabian }; - var byte_fabian = new byte[] - { 0x46, 0x00, // F 0x61, 0x00, // a 0x62, 0x00, // b @@ -25,189 +23,188 @@ namespace PKHeX.Tests.PKM 0x6E, 0x00, // n 0x8E, 0xE0, // ♂ 0x00, 0x00, // \0 terminator - }; - CheckStringGetSet(nameof(pkm.OT_Name), name_fabian, pkm.OT_Name, byte_fabian, pkm.OT_Trash); - } + }; + CheckStringGetSet(nameof(pkm.OT_Name), name_fabian, pkm.OT_Name, byte_fabian, pkm.OT_Trash); + } - [Fact] - public void EncodesNicknameCorrectly() + [Fact] + public void EncodesNicknameCorrectly() + { + const string name_nidoran = "ニドラン♀"; + var pkm = new PK7 { Nickname = name_nidoran }; + var byte_nidoran = new byte[] { - const string name_nidoran = "ニドラン♀"; - var pkm = new PK7 { Nickname = name_nidoran }; - var byte_nidoran = new byte[] - { 0xCB, 0x30, // ニ 0xC9, 0x30, // ド 0xE9, 0x30, // ラ 0xF3, 0x30, // ン 0x40, 0x26, // ♀ 0x00, 0x00, // \0 terminator - }; - CheckStringGetSet(nameof(pkm.Nickname), name_nidoran, pkm.Nickname, byte_nidoran, pkm.Nickname_Trash); - } - - private static void CheckStringGetSet(string check, string instr, string outstr, byte[] indata, - byte[] outdata) - { - instr.Should().BeEquivalentTo(outstr); - - outdata = outdata.Take(indata.Length).ToArray(); - - indata.SequenceEqual(outdata).Should() - .BeTrue($"expected {check} to set properly, instead got {string.Join(", ", outdata.Select(z => $"{z:X2}"))}"); - } + }; + CheckStringGetSet(nameof(pkm.Nickname), name_nidoran, pkm.Nickname, byte_nidoran, pkm.Nickname_Trash); } - public class MetDateTests + private static void CheckStringGetSet(string check, string instr, string outstr, byte[] indata, + byte[] outdata) { - [Fact] - public void MetDateNullWhenDateComponentsAreAllZero() + instr.Should().BeEquivalentTo(outstr); + + outdata = outdata.Take(indata.Length).ToArray(); + + indata.SequenceEqual(outdata).Should() + .BeTrue($"expected {check} to set properly, instead got {string.Join(", ", outdata.Select(z => $"{z:X2}"))}"); + } + } + + public class MetDateTests + { + [Fact] + public void MetDateNullWhenDateComponentsAreAllZero() + { + var pk = new PK7 { - var pk = new PK7 - { - Met_Day = 0, - Met_Month = 0, - Met_Year = 0 - }; + Met_Day = 0, + Met_Month = 0, + Met_Year = 0 + }; - pk.MetDate.HasValue.Should().BeFalse(); - } - - [Fact] - public void MetDateReturnsCorrectDate() - { - var pk = new PK7 - { - Met_Day = 10, - Met_Month = 8, - Met_Year = 16 - }; - - pk.MetDate.GetValueOrDefault().Should().Be(new DateTime(2016, 8, 10).Date); - } - - [Fact] - public void MetDateCalculatesYear0Correctly() - { - var pk = new PK7 - { - Met_Day = 1, - Met_Month = 1, - Met_Year = 0 - }; - - pk.MetDate.GetValueOrDefault().Date.Year.Should().Be(2000); - } - - [Fact] - public void SettingToNullZerosComponents() - { - var pk = new PK7 - { - Met_Day = 12, - Met_Month = 12, - Met_Year = 12 - }; - - pk.MetDate = null; - - pk.Met_Day.Should().Be(0); - pk.Met_Month.Should().Be(0); - pk.Met_Year.Should().Be(0); - } - - [Fact] - public void SettingMetDateSetsComponents() - { - var pk = new PK7 - { - Met_Day = 12, - Met_Month = 12, - Met_Year = 12 - }; - - pk.MetDate = new DateTime(2005, 5, 5); - - pk.Met_Day.Should().Be(5); - pk.Met_Month.Should().Be(5); - pk.Met_Year.Should().Be(5); - } + pk.MetDate.HasValue.Should().BeFalse(); } - public class EggMetDateTests + [Fact] + public void MetDateReturnsCorrectDate() { - [Fact] - public void EggMetDateNullWhenDateComponentsAreAllZero() + var pk = new PK7 { - var pk = new PK7 - { - Egg_Day = 0, - Egg_Month = 0, - Egg_Year = 0 - }; + Met_Day = 10, + Met_Month = 8, + Met_Year = 16 + }; - pk.EggMetDate.HasValue.Should().BeFalse(); - } + pk.MetDate.GetValueOrDefault().Should().Be(new DateTime(2016, 8, 10).Date); + } - [Fact] - public void EggMetDateReturnsCorrectDate() + [Fact] + public void MetDateCalculatesYear0Correctly() + { + var pk = new PK7 { - var pk = new PK7 - { - Egg_Day = 10, - Egg_Month = 8, - Egg_Year = 16 - }; + Met_Day = 1, + Met_Month = 1, + Met_Year = 0 + }; - pk.EggMetDate.GetValueOrDefault().Should().Be(new DateTime(2016, 8, 10).Date); - } + pk.MetDate.GetValueOrDefault().Date.Year.Should().Be(2000); + } - [Fact] - public void EggMetDateCalculatesYear0Correctly() + [Fact] + public void SettingToNullZerosComponents() + { + var pk = new PK7 { - var pk = new PK7 - { - Egg_Day = 1, - Egg_Month = 1, - Egg_Year = 0 - }; + Met_Day = 12, + Met_Month = 12, + Met_Year = 12 + }; - pk.EggMetDate.GetValueOrDefault().Date.Year.Should().Be(2000); - } + pk.MetDate = null; - [Fact] - public void SettingEggMetDateToNullZerosComponents() + pk.Met_Day.Should().Be(0); + pk.Met_Month.Should().Be(0); + pk.Met_Year.Should().Be(0); + } + + [Fact] + public void SettingMetDateSetsComponents() + { + var pk = new PK7 { - var pk = new PK7 - { - Egg_Day = 12, - Egg_Month = 12, - Egg_Year = 12 - }; + Met_Day = 12, + Met_Month = 12, + Met_Year = 12 + }; - pk.EggMetDate = null; + pk.MetDate = new DateTime(2005, 5, 5); - pk.Egg_Day.Should().Be(0); - pk.Egg_Month.Should().Be(0); - pk.Egg_Year.Should().Be(0); - } + pk.Met_Day.Should().Be(5); + pk.Met_Month.Should().Be(5); + pk.Met_Year.Should().Be(5); + } + } - [Fact] - public void SettingEggMetDateSetsComponents() + public class EggMetDateTests + { + [Fact] + public void EggMetDateNullWhenDateComponentsAreAllZero() + { + var pk = new PK7 { - var pk = new PK7 - { - Egg_Day = 12, - Egg_Month = 12, - Egg_Year = 12 - }; + Egg_Day = 0, + Egg_Month = 0, + Egg_Year = 0 + }; - pk.EggMetDate = new DateTime(2005, 5, 5); + pk.EggMetDate.HasValue.Should().BeFalse(); + } - pk.Egg_Day.Should().Be(5); - pk.Egg_Month.Should().Be(5); - pk.Egg_Year.Should().Be(5); - } + [Fact] + public void EggMetDateReturnsCorrectDate() + { + var pk = new PK7 + { + Egg_Day = 10, + Egg_Month = 8, + Egg_Year = 16 + }; + + pk.EggMetDate.GetValueOrDefault().Should().Be(new DateTime(2016, 8, 10).Date); + } + + [Fact] + public void EggMetDateCalculatesYear0Correctly() + { + var pk = new PK7 + { + Egg_Day = 1, + Egg_Month = 1, + Egg_Year = 0 + }; + + pk.EggMetDate.GetValueOrDefault().Date.Year.Should().Be(2000); + } + + [Fact] + public void SettingEggMetDateToNullZerosComponents() + { + var pk = new PK7 + { + Egg_Day = 12, + Egg_Month = 12, + Egg_Year = 12 + }; + + pk.EggMetDate = null; + + pk.Egg_Day.Should().Be(0); + pk.Egg_Month.Should().Be(0); + pk.Egg_Year.Should().Be(0); + } + + [Fact] + public void SettingEggMetDateSetsComponents() + { + var pk = new PK7 + { + Egg_Day = 12, + Egg_Month = 12, + Egg_Year = 12 + }; + + pk.EggMetDate = new DateTime(2005, 5, 5); + + pk.Egg_Day.Should().Be(5); + pk.Egg_Month.Should().Be(5); + pk.Egg_Year.Should().Be(5); } } }