public void FullScan()
        {
            var sampleDataStream = TestUtils.LoadResourceStream("TestData.MapBuilder_PartialMapRead.txt");
            var dataRoot         = new DefReader().LoadDataFromStream(sampleDataStream, CancellationToken.None);
            var mapResult        = new TradeMapBuilder().Build(dataRoot, CancellationToken.None);

            var routeScanner = new RouteScanner();

            routeScanner.SetLogging(TestUtils.GetTraceLogger());
            var scanResult = routeScanner.Scan(mapResult, new RouteScannerOptions(), CancellationToken.None);
        }
 public void MapBuilder_FullRead()
 {
     var sampleDataStream = TestUtils.LoadResourceStream("TestData.MapBuilder_FullMapRead.txt");
     var dataRoot         = new DefReader().LoadDataFromStream(sampleDataStream);
     var mapResult        = new TradeMapBuilder().Build(dataRoot, CancellationToken.None);
 }
        public void MapBuilder_SimpleRead()
        {
            var sampleDataRoot = new DefNode();

            var sampleDataSystem1 = new DefNode();

            sampleDataRoot.ChildNodes.Add(sampleDataSystem1);
            sampleDataSystem1.Tokens.Add("system").Add("Tarazed");
            sampleDataSystem1.ChildNodes.Add(new DefNode()
            {
                Tokens = new DefTokenCollection().Add("belt").Add("1169")
            });
            sampleDataSystem1.ChildNodes.Add(new DefNode()
            {
                Tokens = new DefTokenCollection().Add("link").Add("Enif")
            });
            sampleDataSystem1.ChildNodes.Add(new DefNode()
            {
                Tokens = new DefTokenCollection().Add("trade").Add("Clothing").Add("305")
            });
            sampleDataSystem1.ChildNodes.Add(new DefNode()
            {
                Tokens = new DefTokenCollection().Add("trade").Add("Electronics").Add("761")
            });
            sampleDataSystem1.ChildNodes.Add(new DefNode()
            {
                Tokens = new DefTokenCollection().Add("trade").Add("Equipment").Add("395")
            });
            sampleDataSystem1.ChildNodes.Add(new DefNode()
            {
                Tokens = new DefTokenCollection().Add("trade").Add("Food").Add("238")
            });

            var sampleDataSystem2 = new DefNode();

            sampleDataRoot.ChildNodes.Add(sampleDataSystem2);
            sampleDataSystem2.Tokens.Add("system").Add("Enif");
            sampleDataSystem2.ChildNodes.Add(new DefNode()
            {
                Tokens = new DefTokenCollection().Add("belt").Add("1169")
            });
            sampleDataSystem2.ChildNodes.Add(new DefNode()
            {
                Tokens = new DefTokenCollection().Add("link").Add("Tarazed")
            });
            sampleDataSystem2.ChildNodes.Add(new DefNode()
            {
                Tokens = new DefTokenCollection().Add("link").Add("Sadalmelik")
            });
            sampleDataSystem2.ChildNodes.Add(new DefNode()
            {
                Tokens = new DefTokenCollection().Add("trade").Add("Clothing").Add("361")
            });
            sampleDataSystem2.ChildNodes.Add(new DefNode()
            {
                Tokens = new DefTokenCollection().Add("trade").Add("Electronics").Add("800")
            });
            sampleDataSystem2.ChildNodes.Add(new DefNode()
            {
                Tokens = new DefTokenCollection().Add("trade").Add("Equipment").Add("485")
            });
            sampleDataSystem2.ChildNodes.Add(new DefNode()
            {
                Tokens = new DefTokenCollection().Add("trade").Add("Food").Add("335")
            });

            var sampleDataSystem3 = new DefNode();

            sampleDataRoot.ChildNodes.Add(sampleDataSystem3);
            sampleDataSystem3.Tokens.Add("system").Add("Sadalmelik");
            sampleDataSystem3.ChildNodes.Add(new DefNode()
            {
                Tokens = new DefTokenCollection().Add("belt").Add("1169")
            });
            sampleDataSystem3.ChildNodes.Add(new DefNode()
            {
                Tokens = new DefTokenCollection().Add("link").Add("Enif")
            });
            sampleDataSystem3.ChildNodes.Add(new DefNode()
            {
                Tokens = new DefTokenCollection().Add("trade").Add("Clothing").Add("361")
            });
            sampleDataSystem3.ChildNodes.Add(new DefNode()
            {
                Tokens = new DefTokenCollection().Add("trade").Add("Electronics").Add("800")
            });
            sampleDataSystem3.ChildNodes.Add(new DefNode()
            {
                Tokens = new DefTokenCollection().Add("trade").Add("Equipment").Add("485")
            });
            sampleDataSystem3.ChildNodes.Add(new DefNode()
            {
                Tokens = new DefTokenCollection().Add("trade").Add("Food").Add("335")
            });

            var resultMap = new TradeMapBuilder().Build(sampleDataRoot, CancellationToken.None);

            var expectedMap = new TradeMap();

            var tradeSystem1 = new TradeMapSystem();

            expectedMap.Systems.Add(tradeSystem1);
            tradeSystem1.Name = "Tarazed";
            tradeSystem1.Comodities.Add(new TradeMapComodity {
                Name = "Clothing", Price = 305
            });
            tradeSystem1.Comodities.Add(new TradeMapComodity {
                Name = "Electronics", Price = 761
            });
            tradeSystem1.Comodities.Add(new TradeMapComodity {
                Name = "Equipment", Price = 395
            });
            tradeSystem1.Comodities.Add(new TradeMapComodity {
                Name = "Food", Price = 238
            });

            var tradeSystem2 = new TradeMapSystem();

            expectedMap.Systems.Add(tradeSystem2);
            tradeSystem2.Name = "Enif";
            tradeSystem2.Comodities.Add(new TradeMapComodity {
                Name = "Clothing", Price = 361
            });
            tradeSystem2.Comodities.Add(new TradeMapComodity {
                Name = "Electronics", Price = 800
            });
            tradeSystem2.Comodities.Add(new TradeMapComodity {
                Name = "Equipment", Price = 485
            });
            tradeSystem2.Comodities.Add(new TradeMapComodity {
                Name = "Food", Price = 335
            });

            var tradeSystem3 = new TradeMapSystem();

            expectedMap.Systems.Add(tradeSystem3);
            tradeSystem3.Name = "Sadalmelik";
            tradeSystem3.Comodities.Add(new TradeMapComodity {
                Name = "Clothing", Price = 361
            });
            tradeSystem3.Comodities.Add(new TradeMapComodity {
                Name = "Electronics", Price = 800
            });
            tradeSystem3.Comodities.Add(new TradeMapComodity {
                Name = "Equipment", Price = 485
            });
            tradeSystem3.Comodities.Add(new TradeMapComodity {
                Name = "Food", Price = 335
            });

            tradeSystem1.Links.Add(new TradeMapSystemLink()
            {
                Name = "Enif", System = tradeSystem2
            });
            tradeSystem2.Links.Add(new TradeMapSystemLink()
            {
                Name = "Tarazed", System = tradeSystem1
            });
            tradeSystem2.Links.Add(new TradeMapSystemLink()
            {
                Name = "Sadalmelik", System = tradeSystem3
            });
            tradeSystem3.Links.Add(new TradeMapSystemLink()
            {
                Name = "Enif", System = tradeSystem2
            });

            // TODO assert
        }
        //public Task<RouteScannerResults> Scan(CancellationToken ct)
        public RouteScannerResults Scan(CancellationToken ct)
        {
            State = ScanWorkerState.Working;
            try
            {
                ct.ThrowIfCancellationRequested();

                // Make the root node
                var rootNode = new DefNode();

                // Read def files
                var defReader = new DefReader();
                defReader.ProgressEvents.ProgressEvent += new EventHandler <ProgressEventArgs>((sender, args) => {
                    DoProgressEvent(sender, args);
                });
                foreach (var filepath in _defFiles)
                {
                    ct.ThrowIfCancellationRequested();
                    defReader.LoadDataFromFile(filepath, rootNode, ct);
                }


                // Build map
                var mapBuilder = new TradeMapBuilder();
                mapBuilder.ProgressEvents.ProgressEvent += new EventHandler <ProgressEventArgs>((sender, args) => {
                    DoProgressEvent(sender, args);
                });
                ct.ThrowIfCancellationRequested();
                var map = mapBuilder.Build(rootNode, ct);

                // Check that there are systems in the map
                if (map.Systems.Count == 0)
                {
                    DoProgressEvent(this, new ProgressEventArgs(ProgressEventStatus.Error, "No systems were found. Are the correct def files selected?"));
                    //return Task.FromResult(new RouteScannerResults() { Successful = false });
                    return(new RouteScannerResults()
                    {
                        Successful = false
                    });
                }

                // Scan for runs & routes
                var tradeScanner = new RouteScanner();
                tradeScanner.ProgressEvents.ProgressEvent += new EventHandler <ProgressEventArgs>((sender, args) => {
                    DoProgressEvent(sender, args);
                });
                ct.ThrowIfCancellationRequested();
                var results = tradeScanner.Scan(map, _options, ct);

                DoProgressEvent(this, new ProgressEventArgs(ProgressEventStatus.Complete, "Route scanning complete"));

                // Done
                //return Task.FromResult(results);
                return(results);
            }
            catch (OperationCanceledException)
            {
                // Operation was cancelled. Stop gracefully.

                DoProgressEvent(this, new ProgressEventArgs(ProgressEventStatus.Complete, "Cancelled"));
                //return Task.FromResult(new RouteScannerResults() { Successful = false });
                return(new RouteScannerResults()
                {
                    Successful = false
                });
            }
            catch (Exception ex)
            {
                DoProgressEvent(this, new ProgressEventArgs(ProgressEventStatus.Error, $"An error occurred: {ex.GetType().ToString()}\n{ex.Message}"));
                //return Task.FromResult(new RouteScannerResults() { Successful = false });
                return(new RouteScannerResults()
                {
                    Successful = false
                });
            }
            finally
            {
                State = ScanWorkerState.Idle;
            }
        }