Order relationship review by first appearance
This commit is contained in:
parent
ae0552af90
commit
feed4549bf
@ -54,6 +54,7 @@ var tests = new (string Name, Action Test)[]
|
|||||||
("Relationship events preserve chronological story order", RelationshipEventsPreserveChronologicalStoryOrder),
|
("Relationship events preserve chronological story order", RelationshipEventsPreserveChronologicalStoryOrder),
|
||||||
("Relationship progression keeps chronological state", RelationshipProgressionKeepsChronologicalState),
|
("Relationship progression keeps chronological state", RelationshipProgressionKeepsChronologicalState),
|
||||||
("Relationship observations do not create event spam", RelationshipObservationsDoNotCreateEventSpam),
|
("Relationship observations do not create event spam", RelationshipObservationsDoNotCreateEventSpam),
|
||||||
|
("Relationship review orders by first story appearance", RelationshipReviewOrdersByFirstStoryAppearance),
|
||||||
("Knowledge signals map to existing knowledge states", KnowledgeSignalsMapToExistingStates),
|
("Knowledge signals map to existing knowledge states", KnowledgeSignalsMapToExistingStates),
|
||||||
("Knowledge recipient resolves narrator through POV", KnowledgeRecipientResolvesNarratorThroughPov),
|
("Knowledge recipient resolves narrator through POV", KnowledgeRecipientResolvesNarratorThroughPov),
|
||||||
("Knowledge identity reveal preserves subjective timing", KnowledgeIdentityRevealPreservesSubjectiveTiming),
|
("Knowledge identity reveal preserves subjective timing", KnowledgeIdentityRevealPreservesSubjectiveTiming),
|
||||||
@ -2200,6 +2201,14 @@ static void RelationshipObservationsDoNotCreateEventSpam()
|
|||||||
Assert(!IsMeaningfulRelationshipEvent("trust", "Nora and Imani exchange gifts after years of friendship."), "The non-event rule should hold for unrelated fixture names too.");
|
Assert(!IsMeaningfulRelationshipEvent("trust", "Nora and Imani exchange gifts after years of friendship."), "The non-event rule should hold for unrelated fixture names too.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void RelationshipReviewOrdersByFirstStoryAppearance()
|
||||||
|
{
|
||||||
|
var service = File.ReadAllText(Path.Combine(AppContext.BaseDirectory, "../../../../PlotLine/Services/StoryIntelligenceRelationshipImportService.cs"));
|
||||||
|
Assert(service.Contains(".OrderBy(CandidateFirstStoryOrder)", StringComparison.Ordinal), "Relationship review candidates should be ordered by first story appearance.");
|
||||||
|
Assert(service.Contains("private static (decimal ChapterNumber, decimal SceneNumber, int SortOrder, int SceneID) CandidateFirstStoryOrder", StringComparison.Ordinal), "Relationship review should calculate first appearance from chapter/scene order.");
|
||||||
|
Assert(!service.Contains(".OrderByDescending(candidate => candidate.Appearances.Select(appearance => appearance.SceneID).Distinct().Count())", StringComparison.Ordinal), "Relationship review should not prioritise frequent relationships ahead of earlier first appearances.");
|
||||||
|
}
|
||||||
|
|
||||||
static void KnowledgeSignalsMapToExistingStates()
|
static void KnowledgeSignalsMapToExistingStates()
|
||||||
{
|
{
|
||||||
var states = new List<KnowledgeState>
|
var states = new List<KnowledgeState>
|
||||||
|
|||||||
@ -306,7 +306,7 @@ public sealed class StoryIntelligenceRelationshipImportService(
|
|||||||
|
|
||||||
var candidates = groups.Values
|
var candidates = groups.Values
|
||||||
.Where(candidate => candidate.Appearances.Any(appearance => !appearance.AlreadyLinked))
|
.Where(candidate => candidate.Appearances.Any(appearance => !appearance.AlreadyLinked))
|
||||||
.OrderByDescending(candidate => candidate.Appearances.Select(appearance => appearance.SceneID).Distinct().Count())
|
.OrderBy(CandidateFirstStoryOrder)
|
||||||
.ThenBy(candidate => candidate.CharacterAName)
|
.ThenBy(candidate => candidate.CharacterAName)
|
||||||
.ThenBy(candidate => candidate.CharacterBName)
|
.ThenBy(candidate => candidate.CharacterBName)
|
||||||
.ToList();
|
.ToList();
|
||||||
@ -588,6 +588,15 @@ public sealed class StoryIntelligenceRelationshipImportService(
|
|||||||
private static (decimal ChapterNumber, decimal SceneNumber, int SortOrder, int SceneID) StoryOrder(RelationshipAppearanceImport appearance)
|
private static (decimal ChapterNumber, decimal SceneNumber, int SortOrder, int SceneID) StoryOrder(RelationshipAppearanceImport appearance)
|
||||||
=> (appearance.ChapterNumber, appearance.SceneNumber, appearance.SortOrder, appearance.SceneID);
|
=> (appearance.ChapterNumber, appearance.SceneNumber, appearance.SortOrder, appearance.SceneID);
|
||||||
|
|
||||||
|
private static (decimal ChapterNumber, decimal SceneNumber, int SortOrder, int SceneID) CandidateFirstStoryOrder(RelationshipCandidate candidate)
|
||||||
|
=> candidate.Appearances
|
||||||
|
.Select(StoryOrder)
|
||||||
|
.OrderBy(order => order.ChapterNumber)
|
||||||
|
.ThenBy(order => order.SceneNumber)
|
||||||
|
.ThenBy(order => order.SortOrder)
|
||||||
|
.ThenBy(order => order.SceneID)
|
||||||
|
.FirstOrDefault((decimal.MaxValue, decimal.MaxValue, int.MaxValue, int.MaxValue));
|
||||||
|
|
||||||
private static string RelationshipStateAtScene(
|
private static string RelationshipStateAtScene(
|
||||||
string initialState,
|
string initialState,
|
||||||
IEnumerable<(int SceneID, decimal ChapterNumber, decimal SceneNumber, int SortOrder, string StateName)> events,
|
IEnumerable<(int SceneID, decimal ChapterNumber, decimal SceneNumber, int SortOrder, string StateName)> events,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user