diff --git a/Shared/Models/Stateless/Methods/GenealogicalDataCommunication.cs b/Shared/Models/Stateless/Methods/GenealogicalDataCommunication.cs index c54c7eb..f050bfc 100644 --- a/Shared/Models/Stateless/Methods/GenealogicalDataCommunication.cs +++ b/Shared/Models/Stateless/Methods/GenealogicalDataCommunication.cs @@ -114,12 +114,13 @@ internal abstract class GenealogicalDataCommunication internal static List GetMappedLines(string genealogicalDataCommunicationFile, bool requireNickName) { List results = new(); + Models.PersonBirthday personBirthday = new(DateTime.Now); GenealogicalDataCommunicationLines genealogicalDataCommunicationLines; (string[] headerLines, Dictionary> individuals, string[] footerLines) = GetIndividuals(genealogicalDataCommunicationFile, requireNickName); results.AddRange(headerLines); foreach (KeyValuePair> keyValuePair in individuals) { - genealogicalDataCommunicationLines = GetGenealogicalDataCommunicationLines(keyValuePair.Value); + genealogicalDataCommunicationLines = GetGenealogicalDataCommunicationLines(personBirthday, keyValuePair.Value); if (!string.IsNullOrEmpty(genealogicalDataCommunicationLines.Id)) results.Add(genealogicalDataCommunicationLines.Id); if (!string.IsNullOrEmpty(genealogicalDataCommunicationLines.UId)) @@ -142,7 +143,7 @@ internal abstract class GenealogicalDataCommunication return results; } - internal static GenealogicalDataCommunicationLines GetGenealogicalDataCommunicationLines(List individualsLines) + internal static GenealogicalDataCommunicationLines GetGenealogicalDataCommunicationLines(Models.PersonBirthday personBirthday, List individualsLines) { GenealogicalDataCommunicationLines result; string? idLine = null; @@ -202,11 +203,16 @@ internal abstract class GenealogicalDataCommunication } } } + if (!birthLines.Any()) + { + birthLines.Add("1 BIRT"); + birthLines.Add($"2 DATE {personBirthday.Value:dd MMM yyyy}"); + } result = new(idLine, uIdLine, nameLine, givenNameLine, surNameLine, suffixLine, nickNameLine, sexLine, birthLines, deathLines, changedLines); return result; } - internal static Models.GenealogicalDataCommunication GetGenealogicalDataCommunication(Models.PersonBirthday personBirthday, GenealogicalDataCommunicationLines genealogicalDataCommunicationLines) + internal static Models.GenealogicalDataCommunication GetGenealogicalDataCommunication(GenealogicalDataCommunicationLines genealogicalDataCommunicationLines) { Models.GenealogicalDataCommunication result; DateTime? birth; @@ -245,47 +251,20 @@ internal abstract class GenealogicalDataCommunication birth = birth.Value.AddHours(hours); if (age < 1) birth = null; - if (death is null && (!alive || age > 110)) + if (death is null && (!alive || (age > 110 && !IPersonBirthday.IsCounterPersonBirthday(new(birth.Value))))) death = birth; } - death ??= !genealogicalDataCommunicationLines.Death.Any(l => l == "1 DEAT Y") ? null : birth is not null ? birth : personBirthday.Value; + death ??= !genealogicalDataCommunicationLines.Death.Any(l => l == "1 DEAT Y") ? null : birth; result = new(id, uId, name, givenName, surName, suffix, nickName, sex, birth, death, changed); return result; } - internal static void WriteFile(string personKeyFormatted, Models.PersonBirthday personBirthday, Models.PersonName personName, List? individualsLines, bool isDefaultName, string directory, Models.GenealogicalDataCommunication? genealogicalDataCommunication, bool verify) + internal static void WriteFile(string personKeyFormatted, Models.PersonName personName, List? individualsLines, bool isDefaultName, string directory, Models.GenealogicalDataCommunication genealogicalDataCommunication, bool verify, bool first) { - char sex; - bool alive; - bool first; - if (personKeyFormatted[^2..] is "15") - (sex, alive, first) = ('M', false, true); - else if (personKeyFormatted[^2..] is "14") - (sex, alive, first) = ('F', false, true); - else if (personKeyFormatted[^2..] is "05") - (sex, alive, first) = ('M', true, true); - else if (personKeyFormatted[^2..] is "04") - (sex, alive, first) = ('F', true, true); - else if (personKeyFormatted[^2..] is "23" or "21" or "19" or "17") - (sex, alive, first) = ('M', false, false); - else if (personKeyFormatted[^2..] is "22" or "20" or "18" or "16") - (sex, alive, first) = ('F', false, false); - else if (personKeyFormatted[^2..] is "13" or "11" or "09" or "07") - (sex, alive, first) = ('M', true, false); - else if (personKeyFormatted[^2..] is "12" or "10" or "08" or "06") - (sex, alive, first) = ('F', true, false); - else - (sex, alive, first) = ('U', true, false); - if (verify && genealogicalDataCommunication is not null) + if (verify) { if (genealogicalDataCommunication.SurName != personName.Last.Value) throw new Exception($"{genealogicalDataCommunication.Name} - {personKeyFormatted}"); - if (genealogicalDataCommunication.Sex != sex) - throw new Exception($"{genealogicalDataCommunication.Name} - {personKeyFormatted}"); - if (genealogicalDataCommunication.Death is not null && alive || genealogicalDataCommunication.Death is null && !alive) - throw new Exception($"{genealogicalDataCommunication.Name} - {personKeyFormatted}"); - if (genealogicalDataCommunication.Birth is not null && genealogicalDataCommunication.Birth.Value.ToString("yyyy-MM-dd") != personBirthday.Value.ToString("yyyy-MM-dd")) - throw new Exception($"{genealogicalDataCommunication.Name} - {personKeyFormatted}"); } string jrOrSr; if (string.IsNullOrEmpty(personName.Alias.Value)) @@ -299,7 +278,7 @@ internal abstract class GenealogicalDataCommunication else jrOrSr = string.Empty; } - string code = IPersonBirthday.GetHour(alive, sex).ToString("00"); + string code = IPersonBirthday.GetHour(genealogicalDataCommunication.Death is null, genealogicalDataCommunication.Sex).ToString("00"); if (directory.EndsWith("00")) directory = string.Concat(directory[..^2], code); else if (directory.EndsWith("01")) @@ -325,13 +304,17 @@ internal abstract class GenealogicalDataCommunication if (!string.IsNullOrEmpty(jrOrSr)) pGedLines.Add($"2 NSFX {jrOrSr.Trim()}"); pGedLines.Add($"2 NICK {personKeyFormatted}"); - pGedLines.Add($"1 SEX {sex}"); - if (!IPersonBirthday.IsCounterPersonBirthday(personBirthday)) + pGedLines.Add($"1 SEX {genealogicalDataCommunication.Sex}"); + if (genealogicalDataCommunication.Birth is not null) { - pGedLines.Add("1 BIRT"); - pGedLines.Add($"2 DATE {personBirthday.Value:dd MMM yyyy}"); + Models.PersonBirthday personBirthday = new(genealogicalDataCommunication.Birth.Value); + if (!IPersonBirthday.IsCounterPersonBirthday(personBirthday)) + { + pGedLines.Add("1 BIRT"); + pGedLines.Add($"2 DATE {genealogicalDataCommunication.Birth.Value:dd MMM yyyy}"); + } } - if (!alive) + if (genealogicalDataCommunication.Death is not null) { if (genealogicalDataCommunication?.Death is null || genealogicalDataCommunication.Death == genealogicalDataCommunication.Birth || IPersonBirthday.IsCounterPersonBirthday(new(genealogicalDataCommunication.Death.Value))) pGedLines.Add("1 DEAT Y"); diff --git a/Shared/Models/Stateless/Methods/IGenealogicalDataCommunication.cs b/Shared/Models/Stateless/Methods/IGenealogicalDataCommunication.cs index 7947953..b5ee030 100644 --- a/Shared/Models/Stateless/Methods/IGenealogicalDataCommunication.cs +++ b/Shared/Models/Stateless/Methods/IGenealogicalDataCommunication.cs @@ -5,25 +5,25 @@ public interface IGenealogicalDataCommunication // ... - void TestStatic_WriteFile(string personKeyFormatted, Models.PersonBirthday personBirthday, Models.PersonName personName, List? individualsLines, bool isDefaultName, string directory, Models.GenealogicalDataCommunication? genealogicalDataCommunication, bool verify) => - WriteFile(personKeyFormatted, personBirthday, personName, individualsLines, isDefaultName, directory, genealogicalDataCommunication, verify); - static void WriteFile(string personKeyFormatted, Models.PersonBirthday personBirthday, Models.PersonName personName, List? individualsLines, bool isDefaultName, string directory, Models.GenealogicalDataCommunication? genealogicalDataCommunication, bool verify) => - GenealogicalDataCommunication.WriteFile(personKeyFormatted, personBirthday, personName, individualsLines, isDefaultName, directory, genealogicalDataCommunication, verify); + void TestStatic_WriteFile(string personKeyFormatted, Models.PersonName personName, List? individualsLines, bool isDefaultName, string directory, Models.GenealogicalDataCommunication genealogicalDataCommunication, bool verify, bool first) => + WriteFile(personKeyFormatted, personName, individualsLines, isDefaultName, directory, genealogicalDataCommunication, verify, first); + static void WriteFile(string personKeyFormatted, Models.PersonName personName, List? individualsLines, bool isDefaultName, string directory, Models.GenealogicalDataCommunication genealogicalDataCommunication, bool verify, bool first) => + GenealogicalDataCommunication.WriteFile(personKeyFormatted, personName, individualsLines, isDefaultName, directory, genealogicalDataCommunication, verify, first); List TestStatic_GetMappedLines(string genealogicalDataCommunicationFile, bool requireNickName) => GetMappedLines(genealogicalDataCommunicationFile, requireNickName); static List GetMappedLines(string genealogicalDataCommunicationFile, bool requireNickName) => GenealogicalDataCommunication.GetMappedLines(genealogicalDataCommunicationFile, requireNickName); - GenealogicalDataCommunicationLines TestStatic_GetGenealogicalDataCommunicationLines(List individualsLines) => + GenealogicalDataCommunicationLines TestStatic_GetGenealogicalDataCommunicationLines(Models.PersonBirthday personBirthday, List individualsLines) => GetGenealogicalDataCommunicationLines(individualsLines); static GenealogicalDataCommunicationLines GetGenealogicalDataCommunicationLines(List individualsLines) => - GenealogicalDataCommunication.GetGenealogicalDataCommunicationLines(individualsLines); + GenealogicalDataCommunication.GetGenealogicalDataCommunicationLines(new(DateTime.Now), individualsLines); - Models.GenealogicalDataCommunication TestStatic_GetGenealogicalDataCommunication(Models.PersonBirthday personBirthday, GenealogicalDataCommunicationLines genealogicalDataCommunicationLines) => - GetGenealogicalDataCommunication(personBirthday, genealogicalDataCommunicationLines); - static Models.GenealogicalDataCommunication GetGenealogicalDataCommunication(Models.PersonBirthday personBirthday, GenealogicalDataCommunicationLines genealogicalDataCommunicationLines) => - GenealogicalDataCommunication.GetGenealogicalDataCommunication(personBirthday, genealogicalDataCommunicationLines); + Models.GenealogicalDataCommunication TestStatic_GetGenealogicalDataCommunication(GenealogicalDataCommunicationLines genealogicalDataCommunicationLines) => + GetGenealogicalDataCommunication(genealogicalDataCommunicationLines); + static Models.GenealogicalDataCommunication GetGenealogicalDataCommunication(GenealogicalDataCommunicationLines genealogicalDataCommunicationLines) => + GenealogicalDataCommunication.GetGenealogicalDataCommunication(genealogicalDataCommunicationLines); (string[] headerLines, Dictionary> individuals, string[] footerLines) TestStatic_GetIndividuals(string genealogicalDataCommunicationFile, bool requireNickName) => GetIndividuals(genealogicalDataCommunicationFile, requireNickName); diff --git a/Shared/Models/Stateless/Methods/PersonContainer.cs b/Shared/Models/Stateless/Methods/PersonContainer.cs index 40f4793..d05286d 100644 --- a/Shared/Models/Stateless/Methods/PersonContainer.cs +++ b/Shared/Models/Stateless/Methods/PersonContainer.cs @@ -90,19 +90,26 @@ internal abstract class PersonContainer return results; } - private static List GetPersonContainersCollections(string mappingDefaultName, string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, Dictionary> individuals, char @char, char numberSign, string personDisplayDirectory, string personDisplayDirectoryName, bool isDefaultName, int? approximateYears, List<(string PersonKeyFormatted, Models.PersonBirthday PersonBirthday)> collection) + private static List GetPersonContainersCollections(string mappingDefaultName, string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, Dictionary> individuals, char @char, string innerGroupDirectory, char numberSign, string personDisplayDirectory, string personDisplayDirectoryName, bool isDefaultName, int? approximateYears, List<(string PersonKeyFormatted, Models.PersonBirthday PersonBirthday)> collection) { List results = new(); + char sex; + bool first; + bool? male; + bool? alive; long personKey; string[] matches; string? directory; - const int zero = 0; + string[] segments; bool verify = true; + const int zero = 0; Models.Person person; + string innerGroupDirectoryName; + const char exclamationPoint = '!'; List? individualsLines = null; Models.PersonContainer personContainer; Models.PersonBirthday[] orderedPersonBirthdays; - Models.GenealogicalDataCommunication? genealogicalDataCommunication; + Models.GenealogicalDataCommunication genealogicalDataCommunication; GenealogicalDataCommunicationLines? genealogicalDataCommunicationLines; string[] personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory, isDefaultName); foreach ((string personKeyFormatted, Models.PersonBirthday personBirthday) in collection) @@ -129,9 +136,52 @@ internal abstract class PersonContainer directory = Path.GetDirectoryName(matches[zero]); if (directory is null) continue; - genealogicalDataCommunicationLines = individualsLines is null ? null : GenealogicalDataCommunication.GetGenealogicalDataCommunicationLines(individualsLines); - genealogicalDataCommunication = genealogicalDataCommunicationLines is null ? null : GenealogicalDataCommunication.GetGenealogicalDataCommunication(personBirthday, genealogicalDataCommunicationLines); - GenealogicalDataCommunication.WriteFile(personKeyFormatted, personBirthday, person.Name, individualsLines, isDefaultName, directory, genealogicalDataCommunication, verify); + if (@char == exclamationPoint) + (sex, alive, male, first) = ('U', null, null, true); + else + { + innerGroupDirectoryName = Path.GetFileName(innerGroupDirectory); + segments = innerGroupDirectoryName.Split('-'); + if (segments.Length != 3) + continue; + alive = segments[zero] switch + { + "Alive" => true, + "Dead" => false, + "Unknown" => null, + _ => throw new NotImplementedException() + }; + sex = segments[1] switch + { + "Male" => 'M', + "Female" => 'F', + "Unknown" => 'U', + _ => throw new NotImplementedException() + }; + male = segments[1] switch + { + "Male" => true, + "Female" => false, + "Unknown" => null, + _ => throw new NotImplementedException() + }; + first = segments[2] switch + { + "Yes" => true, + "No" => false, + "Unknown" => true, + _ => throw new NotImplementedException() + }; + } + if (alive is null) + continue; + genealogicalDataCommunicationLines = individualsLines is null ? null : GenealogicalDataCommunication.GetGenealogicalDataCommunicationLines(personBirthday, individualsLines); + if (genealogicalDataCommunicationLines is null) + continue; + genealogicalDataCommunication = GenealogicalDataCommunication.GetGenealogicalDataCommunication(genealogicalDataCommunicationLines); + if (genealogicalDataCommunication.Sex != sex) + continue; + GenealogicalDataCommunication.WriteFile(personKeyFormatted, person.Name, individualsLines, isDefaultName, directory, genealogicalDataCommunication, verify, first); } return results; } @@ -167,7 +217,7 @@ internal abstract class PersonContainer return result; } - private static List GetPersonContainersGroup(string mappingDefaultName, string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, Dictionary> individuals, char @char, string[] personDisplayDirectories) + private static List GetPersonContainersGroup(string mappingDefaultName, string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, Dictionary> individuals, char @char, string innerGroupDirectory, string[] personDisplayDirectories) { List results = new(); string? minusOne; @@ -199,7 +249,7 @@ internal abstract class PersonContainer if (changes.Any(l => l is not null)) continue; if (collection.Any()) - results.AddRange(GetPersonContainersCollections(mappingDefaultName, personBirthdayFormat, facesFileNameExtension, personCharacters, individuals, @char, numberSign, personDisplayDirectory, personDisplayDirectoryName, isDefaultName, approximateYears, collection)); + results.AddRange(GetPersonContainersCollections(mappingDefaultName, personBirthdayFormat, facesFileNameExtension, personCharacters, individuals, @char, innerGroupDirectory, numberSign, personDisplayDirectory, personDisplayDirectoryName, isDefaultName, approximateYears, collection)); else { personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory, isDefaultName); @@ -212,12 +262,27 @@ internal abstract class PersonContainer return results; } + private static List GetPersonContainersInnerGroups(string mappingDefaultName, string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, Dictionary> individuals, string groupDirectory, string groupDirectoryName) + { + List results = new(); + const int zero = 0; + string[] personDisplayDirectories; + List collection; + string[] innerGroupDirectories = Directory.GetDirectories(groupDirectory, "*", SearchOption.TopDirectoryOnly); + foreach (string innerGroupDirectory in innerGroupDirectories) + { + personDisplayDirectories = Directory.GetDirectories(innerGroupDirectory, "*", SearchOption.TopDirectoryOnly); + collection = GetPersonContainersGroup(mappingDefaultName, personBirthdayFormat, facesFileNameExtension, personCharacters, individuals, groupDirectoryName[zero], innerGroupDirectory, personDisplayDirectories); + results.AddRange(collection); + } + return results; + } + private static Models.PersonContainer[] GetPersonContainersGroups(string mappingDefaultName, string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, Dictionary> individuals, string[] groupDirectories) { Models.PersonContainer[] results; const int zero = 0; string groupDirectoryName; - string[] personDisplayDirectories; List collection; List personContainers = new(); foreach (string groupDirectory in groupDirectories) @@ -225,8 +290,7 @@ internal abstract class PersonContainer groupDirectoryName = Path.GetFileName(groupDirectory); if (!personCharacters.Contains(groupDirectoryName[zero])) continue; - personDisplayDirectories = Directory.GetDirectories(groupDirectory, "*", SearchOption.TopDirectoryOnly); - collection = GetPersonContainersGroup(mappingDefaultName, personBirthdayFormat, facesFileNameExtension, personCharacters, individuals, groupDirectoryName[zero], personDisplayDirectories); + collection = GetPersonContainersInnerGroups(mappingDefaultName, personBirthdayFormat, facesFileNameExtension, personCharacters, individuals, groupDirectory, groupDirectoryName); personContainers.AddRange(collection); } results = (from l in personContainers orderby l.Key is not null, l.Key select l).ToArray(); diff --git a/Tests/UnitTestHardCoded.cs b/Tests/UnitTestHardCoded.cs index 46fadea..0e3c395 100644 --- a/Tests/UnitTestHardCoded.cs +++ b/Tests/UnitTestHardCoded.cs @@ -249,7 +249,6 @@ public partial class UnitTestHardCoded { List mappedLines; Dictionary> individuals; - PersonBirthday personBirthday = new(DateTime.Now); GenealogicalDataCommunication genealogicalDataCommunication; GenealogicalDataCommunicationLines genealogicalDataCommunicationLines; List<(bool, string)> genealogicalDataCommunicationFiles = new() @@ -272,7 +271,7 @@ public partial class UnitTestHardCoded { genealogicalDataCommunicationLines = IGenealogicalDataCommunication.GetGenealogicalDataCommunicationLines(keyValuePair.Value); Assert.IsNotNull(genealogicalDataCommunicationLines.Name); - genealogicalDataCommunication = IGenealogicalDataCommunication.GetGenealogicalDataCommunication(personBirthday, genealogicalDataCommunicationLines); + genealogicalDataCommunication = IGenealogicalDataCommunication.GetGenealogicalDataCommunication(genealogicalDataCommunicationLines); Assert.IsNotNull(genealogicalDataCommunication.Name); } mappedLines = IGenealogicalDataCommunication.GetMappedLines(genealogicalDataCommunicationFile, requireNickName); @@ -290,10 +289,10 @@ public partial class UnitTestHardCoded string ageGroup; string fileName; string? directory; + bool first = true; PersonName? personName; string personKeyFormatted; bool isDefaultName = false; - PersonBirthday personBirthday; DateTime dateTime = DateTime.Now; Dictionary> individuals; GenealogicalDataCommunication genealogicalDataCommunication; @@ -318,18 +317,16 @@ public partial class UnitTestHardCoded (_, individuals, _) = IGenealogicalDataCommunication.GetIndividuals(genealogicalDataCommunicationFile, requireNickName); foreach (KeyValuePair> keyValuePair in individuals) { - personBirthday = new(dateTime); genealogicalDataCommunicationLines = IGenealogicalDataCommunication.GetGenealogicalDataCommunicationLines(keyValuePair.Value); Assert.IsNotNull(genealogicalDataCommunicationLines.Name); - genealogicalDataCommunication = IGenealogicalDataCommunication.GetGenealogicalDataCommunication(personBirthday, genealogicalDataCommunicationLines); + genealogicalDataCommunication = IGenealogicalDataCommunication.GetGenealogicalDataCommunication(genealogicalDataCommunicationLines); Assert.IsNotNull(genealogicalDataCommunication.Name); if (genealogicalDataCommunication.Birth is null) continue; personName = IPersonName.GetPersonName(genealogicalDataCommunication); if (personName is null) continue; - personBirthday = new(genealogicalDataCommunication.Birth.Value); - personKey = personBirthday.Value.Ticks; + personKey = genealogicalDataCommunication.Birth.Value.Ticks; (age, _) = IAge.GetAge(dateTime.Ticks, personKey); personKeyFormatted = IPersonBirthday.GetFormatted(_PropertyConfiguration.PersonBirthdayFormat, personKey); if (age < 25) @@ -345,13 +342,13 @@ public partial class UnitTestHardCoded directory = Path.Combine(saveDirectory, fileName, ageGroup, $"{personName.First.Value} {personName.Last.Value}^{age}", personKeyFormatted); if (!Directory.Exists(directory)) _ = Directory.CreateDirectory(directory); - IGenealogicalDataCommunication.WriteFile(personKeyFormatted, personBirthday, personName, keyValuePair.Value, isDefaultName, directory, genealogicalDataCommunication, verify); + IGenealogicalDataCommunication.WriteFile(personKeyFormatted, personName, keyValuePair.Value, isDefaultName, directory, genealogicalDataCommunication, verify, first); } } NonThrowTryCatch(); } - private string[] GetFamily() => new string[]{ + private static string[] GetFamily() => new string[]{ "UBertha Scott (Barry Scott) 10/2/1900-8/19/1993", "MEarl Daniel Herman 1/5/1918-10/19/1962", "FGlendola Koch 8/10/1919-5/16/1910", @@ -645,12 +642,11 @@ public partial class UnitTestHardCoded public void TestMethodFamily() { int age; - char sex; - int hours; - bool alive; string name; long personKey; + DateTime? death; string ageGroup; + bool first = true; string? directory; bool verify = false; string[] dateSegments; @@ -658,17 +654,14 @@ public partial class UnitTestHardCoded PersonName? personName; string[] spaceSegments; string personKeyFormatted; - List lines = new(); bool isDefaultName = false; PersonBirthday personBirthday; string[] family = GetFamily(); DateTime dateTime = DateTime.Now; + GenealogicalDataCommunication genealogicalDataCommunication; string saveDirectory = $"D:/1) Images A/Images-9b89679-Results/A2) People/9b89679/([])/Norman-{dateTime.Ticks}"; foreach (string familyMember in family) { - sex = familyMember[0]; - if (sex is not 'U' and not 'F' and not 'M') - continue; spaceSegments = familyMember[1..].Split(' '); dateSegments = spaceSegments[^1].Split('-'); name = string.Join(' ', spaceSegments[..^1]); @@ -678,22 +671,17 @@ public partial class UnitTestHardCoded if (personName is null) continue; personBirthday = new(parseDateTime); - if (dateSegments.Length == 1) - { - lines.Add($"{name}\t{sex}\t{personBirthday.Value:yyyy-MM-dd}\tnull"); - alive = true; - } - else - { - if (!DateTime.TryParse(dateSegments[1], out parseDateTime)) - continue; - alive = false; - lines.Add($"{name}\t{sex}\t{personBirthday.Value:yyyy-MM-dd}\t{parseDateTime:yyyy-MM-dd}"); - } - hours = IPersonBirthday.GetHour(alive, sex); - personKey = personBirthday.Value.AddHours(hours).Ticks; + personKey = personBirthday.Value.Ticks; personKeyFormatted = IPersonBirthday.GetFormatted(_PropertyConfiguration.PersonBirthdayFormat, personKey); (age, _) = IAge.GetAge(dateTime.Ticks, personKey); + if (dateSegments.Length == 1) + death = null; + else + { + if (!DateTime.TryParse(dateSegments[0], out parseDateTime)) + continue; + death = parseDateTime; + } if (age < 25) ageGroup = "1) Less-25"; else if (age < 50) @@ -707,9 +695,33 @@ public partial class UnitTestHardCoded directory = Path.Combine(saveDirectory, "Norman", ageGroup, $"{personName.First.Value} {personName.Last.Value}^{age}", personKeyFormatted); if (!Directory.Exists(directory)) _ = Directory.CreateDirectory(directory); - IGenealogicalDataCommunication.WriteFile(personKeyFormatted, personBirthday, personName, null, isDefaultName, directory, null, verify); + genealogicalDataCommunication = new(null, null, null, null, null, null, null, 'U', personBirthday.Value, death, null); + IGenealogicalDataCommunication.WriteFile(personKeyFormatted, personName, null, isDefaultName, directory, genealogicalDataCommunication, verify, first); } - File.WriteAllLines(Path.Combine(saveDirectory, "tsv.txt"), lines); + NonThrowTryCatch(); + } + + [TestMethod] + public void TestMethodGroup() + { + // const int Number = 0; + // const int Partial = 1; + // const int Approximate = 5; + // const int Exact = 9; + // // + // const int Alive = 0; + // const int Dead = 5; + // // + // const int Unknown = 0; + // const int Male = 5; + // const int Female = 9; + // foreach (var item in new string[] { "Number", "Partial", "Approximate", "Exact" }) + foreach (string status in new string[] { "Alive", "Dead" }) + { + foreach (string sex in new string[] { "Unknown", "Male", "Female" }) + _ = Directory.CreateDirectory($"D:/{status}-{sex}"); + } + NonThrowTryCatch(); }