< Summary

Class:Itinero.Routing.IRouterOneToOneExtensions
Assembly:Itinero
File(s):/home/runner/work/routing2/routing2/src/Itinero/Routing/IRouterOneToOneExtensions.cs
Covered lines:35
Uncovered lines:12
Coverable lines:47
Total lines:112
Line coverage:74.4% (35 of 47)
Covered branches:11
Total branches:20
Branch coverage:55% (11 of 20)
Tag:251_23667616543

Metrics

MethodBranch coverage Cyclomatic complexity Line coverage
PathAsync()50%687.5%
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.Bidirectional;
 10using Itinero.Snapping;
 11
 12namespace Itinero.Routing;
 13
 14/// <summary>
 15/// One to one extensions.
 16/// </summary>
 17public static class IRouterOneToOneExtensions
 18{
 19    /// <summary>
 20    /// Calculates the path.
 21    /// </summary>
 22    /// <param name="oneToOneRouter">The router.</param>
 23    /// <param name="cancellationToken"></param>
 24    /// <returns>The path.</returns>
 25    public static async Task<Result<Path>> PathAsync(this IRouterOneToOne oneToOneRouter,
 26        CancellationToken cancellationToken = default)
 5727    {
 5728        if (oneToOneRouter.Source.direction == null && oneToOneRouter.Target.direction == null &&
 5729            !oneToOneRouter.Settings.Profile.TurnCostFactorEnabled)
 5730        {
 5731            return await oneToOneRouter.CalculateAsync(oneToOneRouter.Source.sp, oneToOneRouter.Target.sp,
 5732                cancellationToken);
 33        }
 34
 035        return (await oneToOneRouter.CalculateAsync([oneToOneRouter.Source], [oneToOneRouter.Target]))[0][0];
 5736    }
 37
 38    /// <summary>
 39    /// Calculates the route.
 40    /// </summary>
 41    /// <param name="oneToOneRouter">The router.</param>
 42    /// <param name="cancellationToken"></param>
 43    /// <returns>The route.</returns>
 44    public static async Task<Result<Route>> CalculateAsync(this IRouterOneToOne oneToOneRouter,
 45        CancellationToken cancellationToken = default)
 1946    {
 1947        var path = await oneToOneRouter.PathAsync(cancellationToken);
 1948        if (path.IsError)
 349        {
 350            return new Result<Route>(path.ErrorMessage);
 51        }
 52
 1653        return oneToOneRouter.Settings.RouteBuilder.Build(oneToOneRouter.Network, oneToOneRouter.Settings.Profile,
 1654            path.Value);
 1955    }
 56
 57    /// <summary>
 58    /// Calculates the weights.
 59    /// </summary>
 60    /// <param name="oneToOneWeightRouter">The router.</param>
 61    /// <returns>The weight</returns>
 62    public static Task<Result<double?>> CalculateAsync(this IRouterWeights<IRouterOneToOne> oneToOneWeightRouter)
 063    {
 064        return Task.FromResult(new Result<double?>("Not implemented"));
 65
 66        // var profileHandler = oneToOneWeightRouter.Router.Network.GetCostFunctionFor(
 67        //     oneToOneWeightRouter.Router.Settings.Profile);
 68        // return oneToOneWeightRouter.Router.Path().Weight(profileHandler.GetForwardWeight);
 069    }
 70
 71    internal static async Task<Result<Path>> CalculateAsync(this IRouterOneToOne oneToOneRouter,
 72        SnapPoint source, SnapPoint target, CancellationToken cancellationToken)
 5773    {
 5774        var settings = oneToOneRouter.Settings;
 5775        var routingNetwork = oneToOneRouter.Network;
 76
 5777        var profile = settings.Profile;
 5778        var costFunction = routingNetwork.GetCostFunctionFor(profile);
 79
 5780        var maxBox = settings.MaxBoxFor(routingNetwork, [source, target]);
 81
 5782        var bidirectionalDijkstra = BidirectionalDijkstra.ForNetwork(routingNetwork);
 83
 5784        var (result, _) = await bidirectionalDijkstra.RunAsync(source, target, costFunction, async v =>
 60885        {
 60886            if (!routingNetwork.UsageNotifier.IsVertexDataReady(routingNetwork, v))
 087            {
 088                await routingNetwork.UsageNotifier.NotifyVertex(routingNetwork, v, cancellationToken);
 089            }
 60890            if (cancellationToken.IsCancellationRequested) return false;
 60891            return CheckMaxDistance(v);
 66592        }, cancellationToken: cancellationToken);
 93
 6094        if (result == null) return new Result<Path>("Path not found");
 95
 5496        return result;
 97
 98        bool CheckMaxDistance(VertexId v)
 60899        {
 608100            if (routingNetwork == null) throw new Exception("Router cannot be null here.");
 1216101            if (maxBox == null) return false;
 102
 0103            var vertex = routingNetwork.GetVertex(v);
 0104            if (!maxBox.Value.Overlaps(vertex))
 0105            {
 0106                return true;
 107            }
 108
 0109            return false;
 608110        }
 57111    }
 112}