< Summary

Class:Itinero.Routing.IRouterOneToOneExtensions
Assembly:Itinero
File(s):/home/runner/work/routing2/routing2/src/Itinero/Routing/IRouterOneToOneExtensions.cs
Covered lines:37
Uncovered lines:11
Coverable lines:48
Total lines:113
Line coverage:77% (37 of 48)
Covered branches:12
Total branches:20
Branch coverage:60% (12 of 20)
Tag:263_26948838820

Metrics

MethodBranch coverage Cyclomatic complexity Line coverage
PathAsync()66.66%6100%
CalculateAsync()100%2100%
CalculateAsync(...)100%10%
CalculateAsync()100%2100%
<CalculateAsync()50%462.5%

File(s)

/home/runner/work/routing2/routing2/src/Itinero/Routing/IRouterOneToOneExtensions.cs

#LineLine coverage
 1using System;
 2using System.Linq;
 3using System.Threading;
 4using System.Threading.Tasks;
 5using Itinero.Geo;
 6using Itinero.Network;
 7using Itinero.Routes;
 8using Itinero.Routes.Paths;
 9using Itinero.Routing.Flavours.Dijkstra;
 10using Itinero.Routing.Flavours.Dijkstra.Bidirectional;
 11using Itinero.Snapping;
 12
 13namespace Itinero.Routing;
 14
 15/// <summary>
 16/// One to one extensions.
 17/// </summary>
 18public static class IRouterOneToOneExtensions
 19{
 20    /// <summary>
 21    /// Calculates the path.
 22    /// </summary>
 23    /// <param name="oneToOneRouter">The router.</param>
 24    /// <param name="cancellationToken"></param>
 25    /// <returns>The path.</returns>
 26    public static async Task<Result<Path>> PathAsync(this IRouterOneToOne oneToOneRouter,
 27        CancellationToken cancellationToken = default)
 6928    {
 6929        if (oneToOneRouter.Source.direction == null && oneToOneRouter.Target.direction == null &&
 6930            !oneToOneRouter.Settings.Profile.TurnCostFactorEnabled)
 6431        {
 6432            return await oneToOneRouter.CalculateAsync(oneToOneRouter.Source.sp, oneToOneRouter.Target.sp,
 6433                cancellationToken);
 34        }
 35
 536        return (await oneToOneRouter.CalculateAsync([oneToOneRouter.Source], [oneToOneRouter.Target]))[0][0];
 6937    }
 38
 39    /// <summary>
 40    /// Calculates the route.
 41    /// </summary>
 42    /// <param name="oneToOneRouter">The router.</param>
 43    /// <param name="cancellationToken"></param>
 44    /// <returns>The route.</returns>
 45    public static async Task<Result<Route>> CalculateAsync(this IRouterOneToOne oneToOneRouter,
 46        CancellationToken cancellationToken = default)
 3147    {
 3148        var path = await oneToOneRouter.PathAsync(cancellationToken);
 3149        if (path.IsError)
 1550        {
 1551            return new Result<Route>(path.ErrorMessage);
 52        }
 53
 1654        return oneToOneRouter.Settings.RouteBuilder.Build(oneToOneRouter.Network, oneToOneRouter.Settings.Profile,
 1655            path.Value);
 3156    }
 57
 58    /// <summary>
 59    /// Calculates the weights.
 60    /// </summary>
 61    /// <param name="oneToOneWeightRouter">The router.</param>
 62    /// <returns>The weight</returns>
 63    public static Task<Result<double?>> CalculateAsync(this IRouterWeights<IRouterOneToOne> oneToOneWeightRouter)
 064    {
 065        return Task.FromResult(new Result<double?>("Not implemented"));
 66
 67        // var profileHandler = oneToOneWeightRouter.Router.Network.GetCostFunctionFor(
 68        //     oneToOneWeightRouter.Router.Settings.Profile);
 69        // return oneToOneWeightRouter.Router.Path().Weight(profileHandler.GetForwardWeight);
 070    }
 71
 72    internal static async Task<Result<Path>> CalculateAsync(this IRouterOneToOne oneToOneRouter,
 73        SnapPoint source, SnapPoint target, CancellationToken cancellationToken)
 6474    {
 6475        var settings = oneToOneRouter.Settings;
 6476        var routingNetwork = oneToOneRouter.Network;
 77
 6478        var profile = settings.Profile;
 6479        var costFunction = routingNetwork.GetCostFunctionFor(profile);
 80
 6481        var maxBox = settings.MaxBoxFor(routingNetwork, [source, target]);
 82
 6483        var isMainN = routingNetwork.GetIsMainNFunc(profile);
 6484        var (result, _) = await BidirectionalDijkstra.Default.RunAsync(routingNetwork, source, target, costFunction,
 6485            async v =>
 151786            {
 151787                if (!routingNetwork.UsageNotifier.IsVertexDataReady(routingNetwork, v))
 088                {
 089                    await routingNetwork.UsageNotifier.NotifyVertex(routingNetwork, v, cancellationToken);
 090                }
 151791                if (cancellationToken.IsCancellationRequested) return false;
 151792                return CheckMaxDistance(v);
 158193            }, cancellationToken: cancellationToken, isMainN: isMainN);
 94
 7495        if (result == null) return new Result<Path>("Path not found");
 96
 5497        return result;
 98
 99        bool CheckMaxDistance(VertexId v)
 1517100        {
 1517101            if (routingNetwork == null) throw new Exception("Router cannot be null here.");
 3034102            if (maxBox == null) return false;
 103
 0104            var vertex = routingNetwork.GetVertex(v);
 0105            if (!maxBox.Value.Overlaps(vertex))
 0106            {
 0107                return true;
 108            }
 109
 0110            return false;
 1517111        }
 64112    }
 113}