< Summary

Class:Itinero.Routing.IRouterOneToOneExtensions
Assembly:Itinero
File(s):/home/runner/work/routing2/routing2/src/Itinero/Routing/IRouterOneToOneExtensions.cs
Covered lines:32
Uncovered lines:11
Coverable lines:43
Total lines:108
Line coverage:74.4% (32 of 43)
Covered branches:7
Total branches:16
Branch coverage:43.7% (7 of 16)
Tag:232_15462506344

Metrics

MethodBranch coverage Cyclomatic complexity Line coverage
PathAsync()50%485.71%
CalculateAsync()50%275%
CalculateAsync(...)100%10%
CalculateAsync()50%2100%
<CalculateAsync()50%2100%

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)
 727    {
 728        if (oneToOneRouter.Source.direction == null && oneToOneRouter.Target.direction == null)
 729        {
 730            return await oneToOneRouter.CalculateAsync(oneToOneRouter.Source.sp, oneToOneRouter.Target.sp,
 731                cancellationToken);
 32        }
 33
 034        return (await oneToOneRouter.CalculateAsync([oneToOneRouter.Source], [oneToOneRouter.Target]))[0][0];
 735    }
 36
 37    /// <summary>
 38    /// Calculates the route.
 39    /// </summary>
 40    /// <param name="oneToOneRouter">The router.</param>
 41    /// <param name="cancellationToken"></param>
 42    /// <returns>The route.</returns>
 43    public static async Task<Result<Route>> CalculateAsync(this IRouterOneToOne oneToOneRouter,
 44        CancellationToken cancellationToken = default)
 745    {
 746        var path = await oneToOneRouter.PathAsync(cancellationToken);
 747        if (path.IsError)
 048        {
 049            return new Result<Route>(path.ErrorMessage);
 50        }
 51
 752        return oneToOneRouter.Settings.RouteBuilder.Build(oneToOneRouter.Network, oneToOneRouter.Settings.Profile,
 753            path.Value);
 754    }
 55
 56    /// <summary>
 57    /// Calculates the weights.
 58    /// </summary>
 59    /// <param name="oneToOneWeightRouter">The router.</param>
 60    /// <returns>The weight</returns>
 61    public static Task<Result<double?>> CalculateAsync(this IRouterWeights<IRouterOneToOne> oneToOneWeightRouter)
 062    {
 063        return Task.FromResult(new Result<double?>("Not implemented"));
 64
 65        // var profileHandler = oneToOneWeightRouter.Router.Network.GetCostFunctionFor(
 66        //     oneToOneWeightRouter.Router.Settings.Profile);
 67        // return oneToOneWeightRouter.Router.Path().Weight(profileHandler.GetForwardWeight);
 068    }
 69
 70    internal static async Task<Result<Path>> CalculateAsync(this IRouterOneToOne oneToOneRouter,
 71        SnapPoint source, SnapPoint target, CancellationToken cancellationToken)
 772    {
 773        var settings = oneToOneRouter.Settings;
 774        var routingNetwork = oneToOneRouter.Network;
 75
 776        var profile = settings.Profile;
 777        var costFunction = routingNetwork.GetCostFunctionFor(profile);
 78
 779        var maxBox = settings.MaxBoxFor(routingNetwork, [source, target]);
 80
 781        var bidirectionalDijkstra = BidirectionalDijkstra.ForNetwork(routingNetwork);
 82
 783        var (result, _) = await bidirectionalDijkstra.RunAsync(source, target, costFunction, async v =>
 3084        {
 3085            await routingNetwork.UsageNotifier.NotifyVertex(routingNetwork, v, cancellationToken);
 3086            if (cancellationToken.IsCancellationRequested) return false;
 3087            return CheckMaxDistance(v);
 3788        }, cancellationToken: cancellationToken);
 89
 790        if (result == null) return new Result<Path>("Path not found");
 91
 792        return result;
 93
 94        bool CheckMaxDistance(VertexId v)
 3095        {
 3096            if (routingNetwork == null) throw new Exception("Router cannot be null here.");
 6097            if (maxBox == null) return false;
 98
 099            var vertex = routingNetwork.GetVertex(v);
 0100            if (!maxBox.Value.Overlaps(vertex))
 0101            {
 0102                return true;
 103            }
 104
 0105            return false;
 30106        }
 7107    }
 108}