< Summary

Information
Class: Trailblazer.Pathing.NavigationDependencyStampWork
Assembly: Trailblazer
File(s): /home/runner/work/Trailblazer/Trailblazer/src/Trailblazer/Pathing/Search/AStar/NavigationDependencyStampWork.cs
Line coverage
100%
Covered lines: 77
Uncovered lines: 0
Coverable lines: 77
Total lines: 131
Line coverage: 100%
Branch coverage
100%
Covered branches: 26
Total branches: 26
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%
Advance(...)100%2424100%
CompleteInvalid()100%11100%
ComparePageAddresses(...)100%22100%

File(s)

/home/runner/work/Trailblazer/Trailblazer/src/Trailblazer/Pathing/Search/AStar/NavigationDependencyStampWork.cs

#LineLine coverage
 1//=======================================================================
 2// NavigationDependencyStampWork.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;
 9
 10namespace Trailblazer.Pathing;
 11
 12/// <summary>Captures one immutable dependency stamp with bounded graph reads.</summary>
 13internal sealed class NavigationDependencyStampWork
 14{
 15    private readonly NavigationWorldGraph _graph;
 16    private readonly NavigationAreaPolicyKey _areaPolicy;
 17    private readonly NavigationSurfaceComponentKey[] _componentAddresses;
 18    private readonly GraphPageDependencyAddress[] _pageAddresses;
 19    private readonly GraphComponentDependency[] _components;
 20    private readonly GraphPageDependency[] _pages;
 21    private readonly bool _includeTransitionRules;
 22    private int _componentOrdinal;
 23    private int _pageOrdinal;
 24
 92325    internal NavigationDependencyStampWork(
 92326        NavigationWorldGraph graph,
 92327        NavigationAreaPolicy areaPolicy,
 92328        NavigationSurfaceComponentKey[] componentAddresses,
 92329        int componentCount,
 92330        GraphPageDependencyAddress[] pageAddresses,
 92331        int pageCount,
 92332        bool includeTransitionRules = false)
 33    {
 92334        SwiftThrowHelper.ThrowIfNull(graph, nameof(graph));
 92335        SwiftThrowHelper.ThrowIfNull(areaPolicy, nameof(areaPolicy));
 92336        SwiftThrowHelper.ThrowIfNull(componentAddresses, nameof(componentAddresses));
 92337        SwiftThrowHelper.ThrowIfNull(pageAddresses, nameof(pageAddresses));
 92338        SwiftThrowHelper.ThrowIfArgumentOutOfRange(
 92339            (uint)componentCount > (uint)componentAddresses.Length,
 92340            componentCount,
 92341            nameof(componentCount));
 92342        SwiftThrowHelper.ThrowIfArgumentOutOfRange(
 92343            (uint)pageCount > (uint)pageAddresses.Length,
 92344            pageCount,
 92345            nameof(pageCount));
 92346        _graph = graph;
 92347        _areaPolicy = areaPolicy.Key;
 92348        _componentAddresses = componentAddresses;
 92349        _pageAddresses = pageAddresses;
 92350        _components = new GraphComponentDependency[componentCount];
 92351        _pages = new GraphPageDependency[pageCount];
 92352        _includeTransitionRules = includeTransitionRules;
 92353        IsValid = true;
 92354    }
 55
 56    internal bool IsComplete { get; private set; }
 57
 58    internal bool IsValid { get; private set; }
 59
 60    internal GraphDependencyStamp Result { get; private set; } = null!;
 61
 62    internal bool Advance(NavigationWorkMeter meter, int lookupStepLimit)
 63    {
 97664        SwiftThrowHelper.ThrowIfNull(meter, nameof(meter));
 97665        SwiftThrowHelper.ThrowIfNegative(lookupStepLimit, nameof(lookupStepLimit));
 97666        int remaining = Math.Min(lookupStepLimit, meter.RemainingLookupProbes);
 196767        while (_componentOrdinal < _components.Length)
 68        {
 101269            if (remaining == 0 || !meter.TryConsumeLookupProbes(1))
 1970                return false;
 99371            remaining--;
 99372            NavigationSurfaceComponentKey representative =
 99373                _componentAddresses[_componentOrdinal];
 99374            if ((_componentOrdinal > 0
 99375                    && _componentAddresses[_componentOrdinal - 1]
 99376                        .CompareTo(representative) >= 0)
 99377                || !_graph.TryGetComponentDependency(
 99378                    representative,
 99379                    out _components[_componentOrdinal]))
 80            {
 281                return CompleteInvalid();
 82            }
 99183            _componentOrdinal++;
 84        }
 192985        while (_pageOrdinal < _pages.Length)
 86        {
 101387            if (remaining == 0 || !meter.TryConsumeLookupProbes(1))
 3788                return false;
 97689            remaining--;
 97690            GraphPageDependencyAddress address = _pageAddresses[_pageOrdinal];
 97691            if ((_pageOrdinal > 0
 97692                    && ComparePageAddresses(
 97693                        _pageAddresses[_pageOrdinal - 1],
 97694                        address) >= 0)
 97695                || !_graph.TryGetPageDependency(
 97696                    address,
 97697                    _includeTransitionRules,
 97698                    out _pages[_pageOrdinal]))
 99            {
 2100                return CompleteInvalid();
 101            }
 974102            _pageOrdinal++;
 103        }
 916104        Result = new GraphDependencyStamp(
 916105            _areaPolicy,
 916106            _components,
 916107            _pages,
 916108            _includeTransitionRules,
 916109            _graph.TransitionRules.Version);
 916110        IsComplete = true;
 916111        return true;
 112    }
 113
 114    private bool CompleteInvalid()
 115    {
 4116        IsValid = false;
 4117        IsComplete = true;
 4118        Result = null!;
 4119        return true;
 120    }
 121
 122    private static int ComparePageAddresses(
 123        GraphPageDependencyAddress left,
 124        GraphPageDependencyAddress right)
 125    {
 58126        int mapComparison = string.CompareOrdinal(left.MapId, right.MapId);
 58127        return mapComparison != 0
 58128            ? mapComparison
 58129            : left.PageIndex.CompareTo(right.PageIndex);
 130    }
 131}