feat: multidivert; more tests

This commit is contained in:
mattia
2025-03-01 18:03:42 +01:00
parent 6ee8051004
commit 43745e75e7
11 changed files with 276 additions and 212 deletions

View File

@@ -4,18 +4,8 @@ namespace InkBlot.ParseHierarchy;
[GenerateOneOf]
public partial class
MultiDivert : OneOfBase<ThreadDivert, DivertsListWithReturnFromTunnel, DivertsListWithoutReturnFromTunnel>,
IStoryNode
{
public override bool Equals(object? obj)
{
if (obj is OneOfBase<ThreadDivert, DivertsListWithReturnFromTunnel, DivertsListWithoutReturnFromTunnel> divert)
Console.WriteLine("it actually is fuck");
var rv = base.Equals(obj);
return rv;
}
}
MultiDivert : OneOfBase<ThreadDivert, TunnelsAndDivertsList>,
IStoryNode;
public record Identifier(string[] Elements /* TODO: expressions */)
{
@@ -44,14 +34,38 @@ public record ThreadDivert(Identifier Identifier) : IStoryNode
}
}
// -> ... ->-> // return from tunnel
// or
// -> ... ->-> tunnelReplacement // return from tunnel, but replace destination
public record DivertsListWithReturnFromTunnel(Identifier[] Identifiers, Identifier? TunnelReplacement)
: IStoryNode;
[GenerateOneOf]
public partial class TunnelListEnding : OneOfBase<TunnelListEndingDivert, TunnelListEndingReturnFromTunnel>;
// -> ... -> div // not a tunnel
// or
// -> ... -> div -> // is tunnel
public record DivertsListWithoutReturnFromTunnel(Identifier[] Identifiers, bool IsTunnel)
: IStoryNode;
public record TunnelListEndingDivert(Identifier? Divert);
public record TunnelListEndingReturnFromTunnel(Identifier? Divert);
/// <summary>
/// A sequence of zero or more tunnels, potentially ending in a divert, and potentially providing a tunnel replacement.
/// <code>
/// -> // [], divert(null)
/// ->-> // [], returnFromTunnel(null)
/// -> divertName // [], divert(divertName)
/// ->-> divertName // [], returnFromTunnel(divertName)
/// -> tunnelName -> // [tunnelName], divert(null)
/// -> tunnelName -> divertName // [tunnelName], divert(divertName)
/// -> tunnelName1 -> tunnelName2 -> // [tunnelName1, tunnelName2], divert(null)
/// -> tunnelName1 -> tunnelName2 ->-> // [tunnelName1, tunnelName2], returnFromTunnel(null)
/// -> tunnelName1 -> tunnelName2 ->-> divertName // [tunnelName1, tunnelName2], returnFromTunnel(divertName)
/// </code>
/// </summary>
public record TunnelsAndDivertsList(Identifier[] TunnelIdentifiers, TunnelListEnding Ending)
: IStoryNode
{
public virtual bool Equals(TunnelsAndDivertsList? other)
{
return other is not null && Ending.Equals(other.Ending) &&
TunnelIdentifiers.SequenceEqual(other.TunnelIdentifiers);
}
public override int GetHashCode()
{
return HashCode.Combine(TunnelIdentifiers, Ending);
}
}