< Summary

Information
Class: Trailblazer.Pathing.NavigationTokenLegend
Assembly: Trailblazer
File(s): /home/runner/work/Trailblazer/Trailblazer/src/Trailblazer/Pathing/Map/NavigationTokenLegend.cs
Line coverage
100%
Covered lines: 78
Uncovered lines: 0
Coverable lines: 78
Total lines: 130
Line coverage: 100%
Branch coverage
100%
Covered branches: 4
Total branches: 4
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor()100%11100%
CreateBuiltIn(...)100%11100%
Register(...)100%44100%
TryGetEntry(...)100%11100%
CreateEntry(...)100%11100%

File(s)

/home/runner/work/Trailblazer/Trailblazer/src/Trailblazer/Pathing/Map/NavigationTokenLegend.cs

#LineLine coverage
 1//=======================================================================
 2// NavigationTokenLegend.cs
 3//=======================================================================
 4// MIT License, Copyright (c) 2024-present David Oravsky (mrdav30)
 5// See LICENSE file in the project root for full license information.
 6//=======================================================================
 7
 8using System;
 9using FixedMathSharp;
 10using SwiftCollections;
 11
 12namespace Trailblazer.Pathing;
 13
 14/// <summary>
 15/// Maps trimmed authoring tokens to complete navigation-cell payloads.
 16/// </summary>
 17public sealed class NavigationTokenLegend
 18{
 2719    private readonly SwiftDictionary<string, NavigationTokenLegendEntry> _entries =
 2720        new(8, StringComparer.Ordinal);
 21
 22    /// <summary>
 23    /// Creates the built-in solid, volume, mixed-media, and climb token set.
 24    /// </summary>
 25    public static NavigationTokenLegend CreateBuiltIn(
 26        Fixed64 radiusClearance = default,
 27        Fixed64 heightClearance = default)
 28    {
 2229        SwiftThrowHelper.ThrowIfArgument(
 2230            radiusClearance < Fixed64.Zero,
 2231            nameof(radiusClearance),
 2232            "Radius clearance must be non-negative.");
 2233        SwiftThrowHelper.ThrowIfArgument(
 2234            heightClearance < Fixed64.Zero,
 2235            nameof(heightClearance),
 2236            "Height clearance must be non-negative.");
 37
 2238        var legend = new NavigationTokenLegend();
 2239        legend.Register(string.Empty, NavigationTokenLegendEntry.SkipCell());
 2240        legend.Register(".", NavigationTokenLegendEntry.SkipCell());
 2241        legend.Register("X", NavigationTokenLegendEntry.SkipCell());
 2242        legend.Register("S", CreateEntry(
 2243            TraversalMedia.Solid,
 2244            radiusClearance,
 2245            heightClearance,
 2246            NavigationCellFlags.None,
 2247            TraversalMedia.Solid));
 2248        legend.Register("SC", CreateEntry(
 2249            TraversalMedia.Solid,
 2250            radiusClearance,
 2251            heightClearance,
 2252            NavigationCellFlags.ClimbSurfaceHint));
 2253        legend.Register("G", CreateEntry(
 2254            TraversalMedia.Gas,
 2255            radiusClearance,
 2256            heightClearance,
 2257            NavigationCellFlags.None,
 2258            TraversalMedia.Gas));
 2259        legend.Register("L", CreateEntry(
 2260            TraversalMedia.Liquid,
 2261            radiusClearance,
 2262            heightClearance,
 2263            NavigationCellFlags.None,
 2264            TraversalMedia.Liquid));
 2265        legend.Register("LC", CreateEntry(
 2266            TraversalMedia.Solid | TraversalMedia.Liquid,
 2267            radiusClearance,
 2268            heightClearance,
 2269            NavigationCellFlags.ClimbSurfaceHint,
 2270            TraversalMedia.Solid | TraversalMedia.Liquid));
 2271        legend.Register("SG", CreateEntry(
 2272            TraversalMedia.Solid | TraversalMedia.Gas,
 2273            radiusClearance,
 2274            heightClearance,
 2275            NavigationCellFlags.None,
 2276            TraversalMedia.Solid | TraversalMedia.Gas));
 2277        legend.Register("SL", CreateEntry(
 2278            TraversalMedia.Solid | TraversalMedia.Liquid,
 2279            radiusClearance,
 2280            heightClearance,
 2281            NavigationCellFlags.None,
 2282            TraversalMedia.Solid | TraversalMedia.Liquid));
 2283        return legend;
 84    }
 85
 86    /// <summary>
 87    /// Registers one trimmed token. A duplicate token returns false without replacement.
 88    /// </summary>
 89    public bool Register(string token, NavigationTokenLegendEntry entry)
 90    {
 23391        SwiftThrowHelper.ThrowIfNull(token, nameof(token));
 23292        string normalizedToken = token.Trim();
 23293        SwiftThrowHelper.ThrowIfArgument(
 23294            normalizedToken.IndexOf('!') >= 0 || normalizedToken.IndexOf('_') >= 0,
 23295            nameof(token),
 23296            "Legend tokens cannot contain reserved marker or inline-cost characters.");
 97
 23098        if (_entries.ContainsKey(normalizedToken))
 199            return false;
 100
 229101        _entries.Add(normalizedToken, entry);
 229102        return true;
 103    }
 104
 105    /// <summary>
 106    /// Attempts to resolve one token after ordinal whitespace trimming.
 107    /// </summary>
 108    public bool TryGetEntry(string token, out NavigationTokenLegendEntry entry)
 109    {
 46110        SwiftThrowHelper.ThrowIfNull(token, nameof(token));
 45111        return _entries.TryGetValue(token.Trim(), out entry);
 112    }
 113
 114    private static NavigationTokenLegendEntry CreateEntry(
 115        TraversalMedia media,
 116        Fixed64 radiusClearance,
 117        Fixed64 heightClearance,
 118        NavigationCellFlags flags,
 119        TraversalMedia transitionMedia = TraversalMedia.None) =>
 154120        new(
 154121            new NavigationCell(
 154122                media,
 154123                TraversalCapability.None,
 154124                default,
 154125                Fixed64.Zero,
 154126                radiusClearance,
 154127                heightClearance,
 154128                flags),
 154129            transitionMedia);
 130}