Person Containers Inner Groups

This commit is contained in:
Mike Phares 2023-04-19 17:42:35 -07:00
parent b97a939c58
commit e5484bdcc5
4 changed files with 152 additions and 93 deletions

View File

@ -114,12 +114,13 @@ internal abstract class GenealogicalDataCommunication
internal static List<string> GetMappedLines(string genealogicalDataCommunicationFile, bool requireNickName) internal static List<string> GetMappedLines(string genealogicalDataCommunicationFile, bool requireNickName)
{ {
List<string> results = new(); List<string> results = new();
Models.PersonBirthday personBirthday = new(DateTime.Now);
GenealogicalDataCommunicationLines genealogicalDataCommunicationLines; GenealogicalDataCommunicationLines genealogicalDataCommunicationLines;
(string[] headerLines, Dictionary<string, List<string>> individuals, string[] footerLines) = GetIndividuals(genealogicalDataCommunicationFile, requireNickName); (string[] headerLines, Dictionary<string, List<string>> individuals, string[] footerLines) = GetIndividuals(genealogicalDataCommunicationFile, requireNickName);
results.AddRange(headerLines); results.AddRange(headerLines);
foreach (KeyValuePair<string, List<string>> keyValuePair in individuals) foreach (KeyValuePair<string, List<string>> keyValuePair in individuals)
{ {
genealogicalDataCommunicationLines = GetGenealogicalDataCommunicationLines(keyValuePair.Value); genealogicalDataCommunicationLines = GetGenealogicalDataCommunicationLines(personBirthday, keyValuePair.Value);
if (!string.IsNullOrEmpty(genealogicalDataCommunicationLines.Id)) if (!string.IsNullOrEmpty(genealogicalDataCommunicationLines.Id))
results.Add(genealogicalDataCommunicationLines.Id); results.Add(genealogicalDataCommunicationLines.Id);
if (!string.IsNullOrEmpty(genealogicalDataCommunicationLines.UId)) if (!string.IsNullOrEmpty(genealogicalDataCommunicationLines.UId))
@ -142,7 +143,7 @@ internal abstract class GenealogicalDataCommunication
return results; return results;
} }
internal static GenealogicalDataCommunicationLines GetGenealogicalDataCommunicationLines(List<string> individualsLines) internal static GenealogicalDataCommunicationLines GetGenealogicalDataCommunicationLines(Models.PersonBirthday personBirthday, List<string> individualsLines)
{ {
GenealogicalDataCommunicationLines result; GenealogicalDataCommunicationLines result;
string? idLine = null; 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); result = new(idLine, uIdLine, nameLine, givenNameLine, surNameLine, suffixLine, nickNameLine, sexLine, birthLines, deathLines, changedLines);
return result; return result;
} }
internal static Models.GenealogicalDataCommunication GetGenealogicalDataCommunication(Models.PersonBirthday personBirthday, GenealogicalDataCommunicationLines genealogicalDataCommunicationLines) internal static Models.GenealogicalDataCommunication GetGenealogicalDataCommunication(GenealogicalDataCommunicationLines genealogicalDataCommunicationLines)
{ {
Models.GenealogicalDataCommunication result; Models.GenealogicalDataCommunication result;
DateTime? birth; DateTime? birth;
@ -245,47 +251,20 @@ internal abstract class GenealogicalDataCommunication
birth = birth.Value.AddHours(hours); birth = birth.Value.AddHours(hours);
if (age < 1) if (age < 1)
birth = null; birth = null;
if (death is null && (!alive || age > 110)) if (death is null && (!alive || (age > 110 && !IPersonBirthday.IsCounterPersonBirthday(new(birth.Value)))))
death = birth; 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); result = new(id, uId, name, givenName, surName, suffix, nickName, sex, birth, death, changed);
return result; return result;
} }
internal static void WriteFile(string personKeyFormatted, Models.PersonBirthday personBirthday, Models.PersonName personName, List<string>? individualsLines, bool isDefaultName, string directory, Models.GenealogicalDataCommunication? genealogicalDataCommunication, bool verify) internal static void WriteFile(string personKeyFormatted, Models.PersonName personName, List<string>? individualsLines, bool isDefaultName, string directory, Models.GenealogicalDataCommunication genealogicalDataCommunication, bool verify, bool first)
{ {
char sex; if (verify)
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 (genealogicalDataCommunication.SurName != personName.Last.Value) if (genealogicalDataCommunication.SurName != personName.Last.Value)
throw new Exception($"{genealogicalDataCommunication.Name} - {personKeyFormatted}"); 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; string jrOrSr;
if (string.IsNullOrEmpty(personName.Alias.Value)) if (string.IsNullOrEmpty(personName.Alias.Value))
@ -299,7 +278,7 @@ internal abstract class GenealogicalDataCommunication
else else
jrOrSr = string.Empty; 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")) if (directory.EndsWith("00"))
directory = string.Concat(directory[..^2], code); directory = string.Concat(directory[..^2], code);
else if (directory.EndsWith("01")) else if (directory.EndsWith("01"))
@ -325,13 +304,17 @@ internal abstract class GenealogicalDataCommunication
if (!string.IsNullOrEmpty(jrOrSr)) if (!string.IsNullOrEmpty(jrOrSr))
pGedLines.Add($"2 NSFX {jrOrSr.Trim()}"); pGedLines.Add($"2 NSFX {jrOrSr.Trim()}");
pGedLines.Add($"2 NICK {personKeyFormatted}"); pGedLines.Add($"2 NICK {personKeyFormatted}");
pGedLines.Add($"1 SEX {sex}"); pGedLines.Add($"1 SEX {genealogicalDataCommunication.Sex}");
if (!IPersonBirthday.IsCounterPersonBirthday(personBirthday)) if (genealogicalDataCommunication.Birth is not null)
{ {
pGedLines.Add("1 BIRT"); Models.PersonBirthday personBirthday = new(genealogicalDataCommunication.Birth.Value);
pGedLines.Add($"2 DATE {personBirthday.Value:dd MMM yyyy}"); 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))) if (genealogicalDataCommunication?.Death is null || genealogicalDataCommunication.Death == genealogicalDataCommunication.Birth || IPersonBirthday.IsCounterPersonBirthday(new(genealogicalDataCommunication.Death.Value)))
pGedLines.Add("1 DEAT Y"); pGedLines.Add("1 DEAT Y");

View File

@ -5,25 +5,25 @@ public interface IGenealogicalDataCommunication
// ... // ...
void TestStatic_WriteFile(string personKeyFormatted, Models.PersonBirthday personBirthday, Models.PersonName personName, List<string>? individualsLines, bool isDefaultName, string directory, Models.GenealogicalDataCommunication? genealogicalDataCommunication, bool verify) => void TestStatic_WriteFile(string personKeyFormatted, Models.PersonName personName, List<string>? individualsLines, bool isDefaultName, string directory, Models.GenealogicalDataCommunication genealogicalDataCommunication, bool verify, bool first) =>
WriteFile(personKeyFormatted, personBirthday, personName, individualsLines, isDefaultName, directory, genealogicalDataCommunication, verify); WriteFile(personKeyFormatted, personName, individualsLines, isDefaultName, directory, genealogicalDataCommunication, verify, first);
static void WriteFile(string personKeyFormatted, Models.PersonBirthday personBirthday, Models.PersonName personName, List<string>? individualsLines, bool isDefaultName, string directory, Models.GenealogicalDataCommunication? genealogicalDataCommunication, bool verify) => static void WriteFile(string personKeyFormatted, Models.PersonName personName, List<string>? individualsLines, bool isDefaultName, string directory, Models.GenealogicalDataCommunication genealogicalDataCommunication, bool verify, bool first) =>
GenealogicalDataCommunication.WriteFile(personKeyFormatted, personBirthday, personName, individualsLines, isDefaultName, directory, genealogicalDataCommunication, verify); GenealogicalDataCommunication.WriteFile(personKeyFormatted, personName, individualsLines, isDefaultName, directory, genealogicalDataCommunication, verify, first);
List<string> TestStatic_GetMappedLines(string genealogicalDataCommunicationFile, bool requireNickName) => List<string> TestStatic_GetMappedLines(string genealogicalDataCommunicationFile, bool requireNickName) =>
GetMappedLines(genealogicalDataCommunicationFile, requireNickName); GetMappedLines(genealogicalDataCommunicationFile, requireNickName);
static List<string> GetMappedLines(string genealogicalDataCommunicationFile, bool requireNickName) => static List<string> GetMappedLines(string genealogicalDataCommunicationFile, bool requireNickName) =>
GenealogicalDataCommunication.GetMappedLines(genealogicalDataCommunicationFile, requireNickName); GenealogicalDataCommunication.GetMappedLines(genealogicalDataCommunicationFile, requireNickName);
GenealogicalDataCommunicationLines TestStatic_GetGenealogicalDataCommunicationLines(List<string> individualsLines) => GenealogicalDataCommunicationLines TestStatic_GetGenealogicalDataCommunicationLines(Models.PersonBirthday personBirthday, List<string> individualsLines) =>
GetGenealogicalDataCommunicationLines(individualsLines); GetGenealogicalDataCommunicationLines(individualsLines);
static GenealogicalDataCommunicationLines GetGenealogicalDataCommunicationLines(List<string> individualsLines) => static GenealogicalDataCommunicationLines GetGenealogicalDataCommunicationLines(List<string> individualsLines) =>
GenealogicalDataCommunication.GetGenealogicalDataCommunicationLines(individualsLines); GenealogicalDataCommunication.GetGenealogicalDataCommunicationLines(new(DateTime.Now), individualsLines);
Models.GenealogicalDataCommunication TestStatic_GetGenealogicalDataCommunication(Models.PersonBirthday personBirthday, GenealogicalDataCommunicationLines genealogicalDataCommunicationLines) => Models.GenealogicalDataCommunication TestStatic_GetGenealogicalDataCommunication(GenealogicalDataCommunicationLines genealogicalDataCommunicationLines) =>
GetGenealogicalDataCommunication(personBirthday, genealogicalDataCommunicationLines); GetGenealogicalDataCommunication(genealogicalDataCommunicationLines);
static Models.GenealogicalDataCommunication GetGenealogicalDataCommunication(Models.PersonBirthday personBirthday, GenealogicalDataCommunicationLines genealogicalDataCommunicationLines) => static Models.GenealogicalDataCommunication GetGenealogicalDataCommunication(GenealogicalDataCommunicationLines genealogicalDataCommunicationLines) =>
GenealogicalDataCommunication.GetGenealogicalDataCommunication(personBirthday, genealogicalDataCommunicationLines); GenealogicalDataCommunication.GetGenealogicalDataCommunication(genealogicalDataCommunicationLines);
(string[] headerLines, Dictionary<string, List<string>> individuals, string[] footerLines) TestStatic_GetIndividuals(string genealogicalDataCommunicationFile, bool requireNickName) => (string[] headerLines, Dictionary<string, List<string>> individuals, string[] footerLines) TestStatic_GetIndividuals(string genealogicalDataCommunicationFile, bool requireNickName) =>
GetIndividuals(genealogicalDataCommunicationFile, requireNickName); GetIndividuals(genealogicalDataCommunicationFile, requireNickName);

View File

@ -90,19 +90,26 @@ internal abstract class PersonContainer
return results; return results;
} }
private static List<Models.PersonContainer> GetPersonContainersCollections(string mappingDefaultName, string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, Dictionary<string, List<string>> individuals, char @char, char numberSign, string personDisplayDirectory, string personDisplayDirectoryName, bool isDefaultName, int? approximateYears, List<(string PersonKeyFormatted, Models.PersonBirthday PersonBirthday)> collection) private static List<Models.PersonContainer> GetPersonContainersCollections(string mappingDefaultName, string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, Dictionary<string, List<string>> individuals, char @char, string innerGroupDirectory, char numberSign, string personDisplayDirectory, string personDisplayDirectoryName, bool isDefaultName, int? approximateYears, List<(string PersonKeyFormatted, Models.PersonBirthday PersonBirthday)> collection)
{ {
List<Models.PersonContainer> results = new(); List<Models.PersonContainer> results = new();
char sex;
bool first;
bool? male;
bool? alive;
long personKey; long personKey;
string[] matches; string[] matches;
string? directory; string? directory;
const int zero = 0; string[] segments;
bool verify = true; bool verify = true;
const int zero = 0;
Models.Person person; Models.Person person;
string innerGroupDirectoryName;
const char exclamationPoint = '!';
List<string>? individualsLines = null; List<string>? individualsLines = null;
Models.PersonContainer personContainer; Models.PersonContainer personContainer;
Models.PersonBirthday[] orderedPersonBirthdays; Models.PersonBirthday[] orderedPersonBirthdays;
Models.GenealogicalDataCommunication? genealogicalDataCommunication; Models.GenealogicalDataCommunication genealogicalDataCommunication;
GenealogicalDataCommunicationLines? genealogicalDataCommunicationLines; GenealogicalDataCommunicationLines? genealogicalDataCommunicationLines;
string[] personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory, isDefaultName); string[] personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory, isDefaultName);
foreach ((string personKeyFormatted, Models.PersonBirthday personBirthday) in collection) foreach ((string personKeyFormatted, Models.PersonBirthday personBirthday) in collection)
@ -129,9 +136,52 @@ internal abstract class PersonContainer
directory = Path.GetDirectoryName(matches[zero]); directory = Path.GetDirectoryName(matches[zero]);
if (directory is null) if (directory is null)
continue; continue;
genealogicalDataCommunicationLines = individualsLines is null ? null : GenealogicalDataCommunication.GetGenealogicalDataCommunicationLines(individualsLines); if (@char == exclamationPoint)
genealogicalDataCommunication = genealogicalDataCommunicationLines is null ? null : GenealogicalDataCommunication.GetGenealogicalDataCommunication(personBirthday, genealogicalDataCommunicationLines); (sex, alive, male, first) = ('U', null, null, true);
GenealogicalDataCommunication.WriteFile(personKeyFormatted, personBirthday, person.Name, individualsLines, isDefaultName, directory, genealogicalDataCommunication, verify); 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; return results;
} }
@ -167,7 +217,7 @@ internal abstract class PersonContainer
return result; return result;
} }
private static List<Models.PersonContainer> GetPersonContainersGroup(string mappingDefaultName, string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, Dictionary<string, List<string>> individuals, char @char, string[] personDisplayDirectories) private static List<Models.PersonContainer> GetPersonContainersGroup(string mappingDefaultName, string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, Dictionary<string, List<string>> individuals, char @char, string innerGroupDirectory, string[] personDisplayDirectories)
{ {
List<Models.PersonContainer> results = new(); List<Models.PersonContainer> results = new();
string? minusOne; string? minusOne;
@ -199,7 +249,7 @@ internal abstract class PersonContainer
if (changes.Any(l => l is not null)) if (changes.Any(l => l is not null))
continue; continue;
if (collection.Any()) 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 else
{ {
personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory, isDefaultName); personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory, isDefaultName);
@ -212,12 +262,27 @@ internal abstract class PersonContainer
return results; return results;
} }
private static List<Models.PersonContainer> GetPersonContainersInnerGroups(string mappingDefaultName, string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, Dictionary<string, List<string>> individuals, string groupDirectory, string groupDirectoryName)
{
List<Models.PersonContainer> results = new();
const int zero = 0;
string[] personDisplayDirectories;
List<Models.PersonContainer> 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<string, List<string>> individuals, string[] groupDirectories) private static Models.PersonContainer[] GetPersonContainersGroups(string mappingDefaultName, string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, Dictionary<string, List<string>> individuals, string[] groupDirectories)
{ {
Models.PersonContainer[] results; Models.PersonContainer[] results;
const int zero = 0; const int zero = 0;
string groupDirectoryName; string groupDirectoryName;
string[] personDisplayDirectories;
List<Models.PersonContainer> collection; List<Models.PersonContainer> collection;
List<Models.PersonContainer> personContainers = new(); List<Models.PersonContainer> personContainers = new();
foreach (string groupDirectory in groupDirectories) foreach (string groupDirectory in groupDirectories)
@ -225,8 +290,7 @@ internal abstract class PersonContainer
groupDirectoryName = Path.GetFileName(groupDirectory); groupDirectoryName = Path.GetFileName(groupDirectory);
if (!personCharacters.Contains(groupDirectoryName[zero])) if (!personCharacters.Contains(groupDirectoryName[zero]))
continue; continue;
personDisplayDirectories = Directory.GetDirectories(groupDirectory, "*", SearchOption.TopDirectoryOnly); collection = GetPersonContainersInnerGroups(mappingDefaultName, personBirthdayFormat, facesFileNameExtension, personCharacters, individuals, groupDirectory, groupDirectoryName);
collection = GetPersonContainersGroup(mappingDefaultName, personBirthdayFormat, facesFileNameExtension, personCharacters, individuals, groupDirectoryName[zero], personDisplayDirectories);
personContainers.AddRange(collection); personContainers.AddRange(collection);
} }
results = (from l in personContainers orderby l.Key is not null, l.Key select l).ToArray(); results = (from l in personContainers orderby l.Key is not null, l.Key select l).ToArray();

View File

@ -249,7 +249,6 @@ public partial class UnitTestHardCoded
{ {
List<string> mappedLines; List<string> mappedLines;
Dictionary<string, List<string>> individuals; Dictionary<string, List<string>> individuals;
PersonBirthday personBirthday = new(DateTime.Now);
GenealogicalDataCommunication genealogicalDataCommunication; GenealogicalDataCommunication genealogicalDataCommunication;
GenealogicalDataCommunicationLines genealogicalDataCommunicationLines; GenealogicalDataCommunicationLines genealogicalDataCommunicationLines;
List<(bool, string)> genealogicalDataCommunicationFiles = new() List<(bool, string)> genealogicalDataCommunicationFiles = new()
@ -272,7 +271,7 @@ public partial class UnitTestHardCoded
{ {
genealogicalDataCommunicationLines = IGenealogicalDataCommunication.GetGenealogicalDataCommunicationLines(keyValuePair.Value); genealogicalDataCommunicationLines = IGenealogicalDataCommunication.GetGenealogicalDataCommunicationLines(keyValuePair.Value);
Assert.IsNotNull(genealogicalDataCommunicationLines.Name); Assert.IsNotNull(genealogicalDataCommunicationLines.Name);
genealogicalDataCommunication = IGenealogicalDataCommunication.GetGenealogicalDataCommunication(personBirthday, genealogicalDataCommunicationLines); genealogicalDataCommunication = IGenealogicalDataCommunication.GetGenealogicalDataCommunication(genealogicalDataCommunicationLines);
Assert.IsNotNull(genealogicalDataCommunication.Name); Assert.IsNotNull(genealogicalDataCommunication.Name);
} }
mappedLines = IGenealogicalDataCommunication.GetMappedLines(genealogicalDataCommunicationFile, requireNickName); mappedLines = IGenealogicalDataCommunication.GetMappedLines(genealogicalDataCommunicationFile, requireNickName);
@ -290,10 +289,10 @@ public partial class UnitTestHardCoded
string ageGroup; string ageGroup;
string fileName; string fileName;
string? directory; string? directory;
bool first = true;
PersonName? personName; PersonName? personName;
string personKeyFormatted; string personKeyFormatted;
bool isDefaultName = false; bool isDefaultName = false;
PersonBirthday personBirthday;
DateTime dateTime = DateTime.Now; DateTime dateTime = DateTime.Now;
Dictionary<string, List<string>> individuals; Dictionary<string, List<string>> individuals;
GenealogicalDataCommunication genealogicalDataCommunication; GenealogicalDataCommunication genealogicalDataCommunication;
@ -318,18 +317,16 @@ public partial class UnitTestHardCoded
(_, individuals, _) = IGenealogicalDataCommunication.GetIndividuals(genealogicalDataCommunicationFile, requireNickName); (_, individuals, _) = IGenealogicalDataCommunication.GetIndividuals(genealogicalDataCommunicationFile, requireNickName);
foreach (KeyValuePair<string, List<string>> keyValuePair in individuals) foreach (KeyValuePair<string, List<string>> keyValuePair in individuals)
{ {
personBirthday = new(dateTime);
genealogicalDataCommunicationLines = IGenealogicalDataCommunication.GetGenealogicalDataCommunicationLines(keyValuePair.Value); genealogicalDataCommunicationLines = IGenealogicalDataCommunication.GetGenealogicalDataCommunicationLines(keyValuePair.Value);
Assert.IsNotNull(genealogicalDataCommunicationLines.Name); Assert.IsNotNull(genealogicalDataCommunicationLines.Name);
genealogicalDataCommunication = IGenealogicalDataCommunication.GetGenealogicalDataCommunication(personBirthday, genealogicalDataCommunicationLines); genealogicalDataCommunication = IGenealogicalDataCommunication.GetGenealogicalDataCommunication(genealogicalDataCommunicationLines);
Assert.IsNotNull(genealogicalDataCommunication.Name); Assert.IsNotNull(genealogicalDataCommunication.Name);
if (genealogicalDataCommunication.Birth is null) if (genealogicalDataCommunication.Birth is null)
continue; continue;
personName = IPersonName.GetPersonName(genealogicalDataCommunication); personName = IPersonName.GetPersonName(genealogicalDataCommunication);
if (personName is null) if (personName is null)
continue; continue;
personBirthday = new(genealogicalDataCommunication.Birth.Value); personKey = genealogicalDataCommunication.Birth.Value.Ticks;
personKey = personBirthday.Value.Ticks;
(age, _) = IAge.GetAge(dateTime.Ticks, personKey); (age, _) = IAge.GetAge(dateTime.Ticks, personKey);
personKeyFormatted = IPersonBirthday.GetFormatted(_PropertyConfiguration.PersonBirthdayFormat, personKey); personKeyFormatted = IPersonBirthday.GetFormatted(_PropertyConfiguration.PersonBirthdayFormat, personKey);
if (age < 25) 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); directory = Path.Combine(saveDirectory, fileName, ageGroup, $"{personName.First.Value} {personName.Last.Value}^{age}", personKeyFormatted);
if (!Directory.Exists(directory)) if (!Directory.Exists(directory))
_ = Directory.CreateDirectory(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(); NonThrowTryCatch();
} }
private string[] GetFamily() => new string[]{ private static string[] GetFamily() => new string[]{
"UBertha Scott (Barry Scott) 10/2/1900-8/19/1993", "UBertha Scott (Barry Scott) 10/2/1900-8/19/1993",
"MEarl Daniel Herman 1/5/1918-10/19/1962", "MEarl Daniel Herman 1/5/1918-10/19/1962",
"FGlendola Koch 8/10/1919-5/16/1910", "FGlendola Koch 8/10/1919-5/16/1910",
@ -645,12 +642,11 @@ public partial class UnitTestHardCoded
public void TestMethodFamily() public void TestMethodFamily()
{ {
int age; int age;
char sex;
int hours;
bool alive;
string name; string name;
long personKey; long personKey;
DateTime? death;
string ageGroup; string ageGroup;
bool first = true;
string? directory; string? directory;
bool verify = false; bool verify = false;
string[] dateSegments; string[] dateSegments;
@ -658,17 +654,14 @@ public partial class UnitTestHardCoded
PersonName? personName; PersonName? personName;
string[] spaceSegments; string[] spaceSegments;
string personKeyFormatted; string personKeyFormatted;
List<string> lines = new();
bool isDefaultName = false; bool isDefaultName = false;
PersonBirthday personBirthday; PersonBirthday personBirthday;
string[] family = GetFamily(); string[] family = GetFamily();
DateTime dateTime = DateTime.Now; DateTime dateTime = DateTime.Now;
GenealogicalDataCommunication genealogicalDataCommunication;
string saveDirectory = $"D:/1) Images A/Images-9b89679-Results/A2) People/9b89679/([])/Norman-{dateTime.Ticks}"; string saveDirectory = $"D:/1) Images A/Images-9b89679-Results/A2) People/9b89679/([])/Norman-{dateTime.Ticks}";
foreach (string familyMember in family) foreach (string familyMember in family)
{ {
sex = familyMember[0];
if (sex is not 'U' and not 'F' and not 'M')
continue;
spaceSegments = familyMember[1..].Split(' '); spaceSegments = familyMember[1..].Split(' ');
dateSegments = spaceSegments[^1].Split('-'); dateSegments = spaceSegments[^1].Split('-');
name = string.Join(' ', spaceSegments[..^1]); name = string.Join(' ', spaceSegments[..^1]);
@ -678,22 +671,17 @@ public partial class UnitTestHardCoded
if (personName is null) if (personName is null)
continue; continue;
personBirthday = new(parseDateTime); personBirthday = new(parseDateTime);
if (dateSegments.Length == 1) personKey = personBirthday.Value.Ticks;
{
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;
personKeyFormatted = IPersonBirthday.GetFormatted(_PropertyConfiguration.PersonBirthdayFormat, personKey); personKeyFormatted = IPersonBirthday.GetFormatted(_PropertyConfiguration.PersonBirthdayFormat, personKey);
(age, _) = IAge.GetAge(dateTime.Ticks, 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) if (age < 25)
ageGroup = "1) Less-25"; ageGroup = "1) Less-25";
else if (age < 50) 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); directory = Path.Combine(saveDirectory, "Norman", ageGroup, $"{personName.First.Value} {personName.Last.Value}^{age}", personKeyFormatted);
if (!Directory.Exists(directory)) if (!Directory.Exists(directory))
_ = Directory.CreateDirectory(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(); NonThrowTryCatch();
} }