private static Expression <Func <ITaxonNamePart, bool> > MatchResolved(SpeciesPartType rank) => p => (p.Rank == rank) && (p.IsResolved || !p.IsAbbreviated);
public void TaxonNamePart_WithValidNodeParameterInConstructor_ShouldReturnValidObject(string nodeString, SpeciesPartType taxonRank, string fullName, string taxonName, string id, bool abbreviated) { // Arrange var document = new XmlDocument(); document.LoadXml(nodeString); // Act var taxonNamePart = new TaxonNamePart(document.DocumentElement); // Assert Assert.IsNotNull(taxonNamePart, "Object should not be null."); Assert.AreEqual(abbreviated, taxonNamePart.IsAbbreviated, "Taxon name part should " + (abbreviated ? "not " : string.Empty) + "be abbreviated."); Assert.AreEqual(taxonRank, taxonNamePart.Rank, $"Rank should be '{taxonRank}'."); Assert.AreEqual(taxonName, taxonNamePart.Name, $"Name should be '{taxonName}'."); Assert.AreEqual(fullName, taxonNamePart.FullName, $"Full Name should be '{fullName}'."); Assert.AreEqual(id, taxonNamePart.Id, $"Id should be '{id}'."); }
private void ResolveSubgenericByGenusAndLowerMatches(IQueryable <ITaxonName> taxonNames, SpeciesPartType rank) { if (rank <= SpeciesPartType.Genus) { return; } var matchResolved = MatchResolved(rank); var matchNotResolved = MatchNotResolved(rank); var taxaWithResolvedPart = taxonNames.Where(t => t.Parts.Any(this.matchResolvedGenera) && t.Parts.Any(matchResolved)) .ToList(); var taxaWithNotResolvedPart = taxonNames.Where(t => t.Parts.Any(this.matchResolvedGenera) && t.Parts.Any(matchNotResolved) && t.Parts.Any(p => p.Rank > rank)); var messageBag = new StringBuilder(); foreach (var taxon in taxaWithNotResolvedPart) { messageBag.Append(taxon); messageBag.AppendLine(); try { string genus = taxon.Parts.First(p => p.Rank == SpeciesPartType.Genus).FullName; var query = taxaWithResolvedPart.Where(t => t.Parts.Single(p => p.Rank == SpeciesPartType.Genus).FullName == genus); foreach (var part in taxon.Parts.Where(p => p.Rank > rank)) { if (!part.IsAbbreviated || part.IsResolved) { query = query.Where(t => t.Parts.FirstOrDefault(p => p.Rank == part.Rank)?.FullName == part.FullName); } } var matches = query.Distinct(new TaxonNameContentEqualityComparer()).ToArray(); if (matches.Length == 1) { var match = matches[0]; var taxonNamePartValue = match.Parts.First(p => p.Rank == rank).FullName; foreach (var taxonNamePart in taxon.Parts) { if (taxonNamePart.Rank == rank) { taxonNamePart.FullName = taxonNamePartValue; taxonNamePart.IsModified = true; messageBag.AppendFormat("\tSubstitution ({0}):", taxonNamePart.Rank); messageBag.AppendFormat("\t\t{0}", taxonNamePartValue); messageBag.AppendLine(); break; } } } } catch { } messageBag.AppendLine(); } this.logger?.Log(messageBag?.ToString()); }
public static string ToRankString(this SpeciesPartType type) { return(type.ToString().ToLower()); }