public void AccountPositionModificationUpdatesPM()
        {
            var accountPositionService = new MockAccountPositionService();
            var marketFeedService      = new MockMarketFeedService();

            marketFeedService.SetPrice("FUND0", 20.00m);
            accountPositionService.AddPosition("FUND0", 150.00m, 100);
            ObservablePosition position = new ObservablePosition(accountPositionService, marketFeedService, CreateEventAggregator());

            bool itemUpdated = false;

            position.Items.First(p => p.TickerSymbol == "FUND0").PropertyChanged += delegate
            {
                itemUpdated = true;
            };

            AccountPosition accountPosition = accountPositionService.GetAccountPositions().First <AccountPosition>(p => p.TickerSymbol == "FUND0");

            accountPosition.Shares   += 11;
            accountPosition.CostBasis = 25.00m;

            Assert.IsTrue(itemUpdated);
            Assert.AreEqual(111, position.Items.First(p => p.TickerSymbol == "FUND0").Shares);
            Assert.AreEqual(25.00m, position.Items.First(p => p.TickerSymbol == "FUND0").CostBasis);
        }
        public void MarketUpdatesPositionUpdatesButCollectionDoesNot()
        {
            var accountPositionService   = new MockAccountPositionService();
            var marketFeedService        = new MockMarketFeedService();
            var eventAggregator          = CreateEventAggregator();
            var marketPricesUpdatedEvent = eventAggregator.GetEvent <MarketPricesUpdatedEvent>() as MockMarketPricesUpdatedEvent;

            marketFeedService.SetPrice("FUND1", 20.00m);
            accountPositionService.AddPosition("FUND1", 15.00m, 100);

            ObservablePosition position = new ObservablePosition(accountPositionService, marketFeedService, eventAggregator);

            bool itemsCollectionUpdated = false;

            position.Items.CollectionChanged += delegate
            {
                itemsCollectionUpdated = true;
            };

            bool itemUpdated = false;

            position.Items.First(p => p.TickerSymbol == "FUND1").PropertyChanged += delegate
            {
                itemUpdated = true;
            };

            marketPricesUpdatedEvent.SubscribeArgumentAction(new Dictionary <string, decimal> {
                { "FUND1", 50m }
            });

            Assert.IsFalse(itemsCollectionUpdated);
            Assert.IsTrue(itemUpdated);
        }
        public void GeneratesModelFromPositionAndMarketFeeds()
        {
            var accountPositionService = new MockAccountPositionService();
            var marketFeedService      = new MockMarketFeedService();

            accountPositionService.AddPosition(new AccountPosition("FUND0", 300m, 1000));
            accountPositionService.AddPosition(new AccountPosition("FUND1", 200m, 100));
            marketFeedService.SetPrice("FUND0", 30.00m);
            marketFeedService.SetPrice("FUND1", 20.00m);

            ObservablePosition position = new ObservablePosition(accountPositionService, marketFeedService, CreateEventAggregator());

            Assert.AreEqual <decimal>(30.00m, position.Items.First(x => x.TickerSymbol == "FUND0").CurrentPrice);
            Assert.AreEqual <long>(1000, position.Items.First(x => x.TickerSymbol == "FUND0").Shares);
            Assert.AreEqual <decimal>(20.00m, position.Items.First(x => x.TickerSymbol == "FUND1").CurrentPrice);
            Assert.AreEqual <long>(100, position.Items.First(x => x.TickerSymbol == "FUND1").Shares);
        }
        /// <inheritdoc />
        public override void Start()
        {
            base.Start();

            var observablePosition = new ObservablePosition()
            {
                ToggleEnabledKey = Keys.D1,
                IsEnabled        = true,
            };

            var camera = this.SceneSystem.SceneInstance.RootScene.Entities.First(entity => entity.Name == "Camera");

            camera.Add(observablePosition);
            ////camera.Transform.Position += new Vector3(0, 0, 0);
            camera.Transform.Position += new Vector3(0, 256, 0);

            this.stage = new InterestStage <ChunkKey, bool, Entity>(
                Factory.From((ChunkKey key) => new Entity()), SingleInterest.Merger);

            ////var meshFactory = StreamingStageMeshFactory.CreateCubes();
            ////var meshFactory = StreamingStageMeshFactory.CreateCubeOutlines();
            ////var meshFactory = StreamingStageMeshFactory.CreateNoise();
            var meshFactory = StreamingStageMeshFactory.CreateSkyIsland();

            var viewDiameter = meshFactory.ChunkLength * ViewDiameterInChunks;
            var converter    = new TwoWayTypeConverter <Index3D, ChunkKey>(
                index => new ChunkKey(index), key => key.Index);

            AreaOfInterest.CreateCenteredSpiral(
                new ConverterInterestMap <ChunkKey, Index3D, bool>(this.stage.Interests, converter),
                true,
                observablePosition.PositionChanged.ToMono(),
                new SphereMask <bool>(viewDiameter),
                meshFactory.ChunkLength);

            var stageEntity = new Entity("Stage");

            stageEntity.Add(new StreamingChunkGeneratorScript(this.stage.Chunks, meshFactory));
            this.SceneSystem.SceneInstance.RootScene.Entities.Add(stageEntity);
        }
        public void ShouldUpdateDataWithMarketUpdates()
        {
            var accountPositionService   = new MockAccountPositionService();
            var marketFeedService        = new MockMarketFeedService();
            var eventAggregator          = CreateEventAggregator();
            var marketPricesUpdatedEvent = eventAggregator.GetEvent <MarketPricesUpdatedEvent>() as MockMarketPricesUpdatedEvent;

            marketFeedService.SetPrice("FUND0", 30.00m);
            accountPositionService.AddPosition("FUND0", 25.00m, 1000);
            marketFeedService.SetPrice("FUND1", 20.00m);
            accountPositionService.AddPosition("FUND1", 15.00m, 100);
            ObservablePosition position = new ObservablePosition(accountPositionService, marketFeedService, eventAggregator);

            var updatedPriceList = new Dictionary <string, decimal> {
                { "FUND0", 50.00m }
            };

            Assert.IsNotNull(marketPricesUpdatedEvent.SubscribeArgumentAction);
            Assert.AreEqual(ThreadOption.UIThread, marketPricesUpdatedEvent.SubscribeArgumentThreadOption);

            marketPricesUpdatedEvent.SubscribeArgumentAction(updatedPriceList);

            Assert.AreEqual <decimal>(50.00m, position.Items.First(x => x.TickerSymbol == "FUND0").CurrentPrice);
        }