< Summary

Class:Itinero.Routing.IRouterOneToOneExtensions
Assembly:Itinero
File(s):/home/runner/work/routing2/routing2/src/Itinero/Routing/IRouterOneToOneExtensions.cs
Covered lines:38
Uncovered lines:11
Coverable lines:49
Total lines:114
Line coverage:77.5% (38 of 49)
Covered branches:13
Total branches:22
Branch coverage:59% (13 of 22)
Tag:267_28791001112

Metrics

MethodBranch coverage Cyclomatic complexity Line coverage
PathAsync()66.66%6100%
CalculateAsync()100%2100%
CalculateAsync(...)100%10%
CalculateAsync()75%4100%
<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);
 6480        if (settings.CostFunctionWrapper != null) costFunction = settings.CostFunctionWrapper(costFunction);
 81
 6482        var maxBox = settings.MaxBoxFor(routingNetwork, [source, target]);
 83
 6484        var isMainN = routingNetwork.GetIsMainNFunc(profile);
 6485        var (result, _) = await BidirectionalDijkstra.Default.RunAsync(routingNetwork, source, target, costFunction,
 6486            async v =>
 151787            {
 151788                if (!routingNetwork.UsageNotifier.IsVertexDataReady(routingNetwork, v))
 089                {
 090                    await routingNetwork.UsageNotifier.NotifyVertex(routingNetwork, v, cancellationToken);
 091                }
 151792                if (cancellationToken.IsCancellationRequested) return false;
 151793                return CheckMaxDistance(v);
 158194            }, cancellationToken: cancellationToken, isMainN: isMainN);
 95
 7496        if (result == null) return new Result<Path>("Path not found");
 97
 5498        return result;
 99
 100        bool CheckMaxDistance(VertexId v)
 1517101        {
 1517102            if (routingNetwork == null) throw new Exception("Router cannot be null here.");
 3034103            if (maxBox == null) return false;
 104
 0105            var vertex = routingNetwork.GetVertex(v);
 0106            if (!maxBox.Value.Overlaps(vertex))
 0107            {
 0108                return true;
 109            }
 110
 0111            return false;
 1517112        }
 64113    }
 114}