public async Task HandlerShouldFulfillShipment()
        {
            // Arrange
            var expectedItemId   = Guid.NewGuid().ToString();
            var expectedQuantity = new Random().Next();
            var expectedPlayer   = new BrokerPlayer {
                PlayerId = Guid.NewGuid(), Inventory = CreateInventory(expectedItemId, expectedQuantity)
            };
            var initialShipment = new BrokerShipment
            {
                ShipmentId         = Guid.NewGuid(),
                FactoryId          = Guid.NewGuid(),
                State              = ShipmentState.Requested,
                Owner              = expectedPlayer,
                WaitConditions     = CreateWaitConditions(),
                DestinationStation = Guid.NewGuid().ToString(),
                Carts              = CreateCartContents(expectedItemId, expectedQuantity),
            };

            _state.Shipments.Add(initialShipment.ShipmentId, initialShipment);

            // Act
            await _handler.Handle(new ShipmentFulfilledEvent(initialShipment.ShipmentId, initialShipment.FactoryId, expectedPlayer));

            // Assert
            Assert.Equal(ShipmentState.Fulfilled, initialShipment.State);
            Assert.Equal(0, expectedPlayer.Inventory.Values.Single().Quantity);
        }
Exemplo n.º 2
0
        private bool TryUpdateInventory(BrokerPlayer player, BrokerShipment shipment)
        {
            LuaItemStack[] totalInventory;
            try
            {
                totalInventory = shipment.Carts.Reduce();
            } catch (InvalidOperationException e)
            {
                _logger.Error(e, $"Could not read inventory for shipment {shipment.ShipmentId}!");
                return(false);
            }

            foreach (var stack in totalInventory)
            {
                if (!player.Inventory.ContainsKey(stack.Name) || player.Inventory[stack.Name].Quantity < stack.Count)
                {
                    return(false);
                }
            }

            foreach (var stack in totalInventory)
            {
                player.Inventory[stack.Name].Quantity -= stack.Count;
            }

            return(true);
        }
        public async Task HandlerShouldAddShipment()
        {
            // Arrange
            var expectedItemId   = Guid.NewGuid().ToString();
            var expectedQuantity = new Random().Next();
            var expectedPlayer   = new BrokerPlayer {
                PlayerId = Guid.NewGuid()
            };
            var expectedShipment = new BrokerShipment
            {
                ShipmentId         = Guid.NewGuid(),
                FactoryId          = Guid.NewGuid(),
                OwnerId            = expectedPlayer.PlayerId,
                WaitConditions     = CreateWaitConditions(),
                DestinationStation = Guid.NewGuid().ToString(),
                Carts = CreateCartContents(expectedItemId, expectedQuantity),
            };

            _state.Players.Add(expectedPlayer.PlayerId, expectedPlayer);

            // Act
            await _handler.Handle(new ShipmentRequestedEvent(expectedShipment.ShipmentId, expectedShipment.FactoryId, expectedPlayer)
            {
                Carts              = expectedShipment.Carts.ToArray(),
                WaitConditions     = expectedShipment.WaitConditions.ToArray(),
                DestinationStation = expectedShipment.DestinationStation,
                OwnerId            = expectedShipment.OwnerId,
            });

            // Assert
            Assert.Equal(expectedShipment.ShipmentId, _state.Shipments.Values.Single().ShipmentId);
            Assert.Equal(expectedShipment.FactoryId, _state.Shipments.Values.Single().FactoryId);
            Assert.Equal(ShipmentState.Requested, _state.Shipments.Values.Single().State);
            Assert.Same(expectedPlayer, _state.Shipments.Values.Single().Owner);
        }
Exemplo n.º 4
0
        public async Task EvaluatorShouldFulfillShipments()
        {
            // Arrange
            var rng              = new Random();
            var givenState       = new State();
            var expectedQuantity = rng.Next(1, 100);
            var expectedItem     = Guid.NewGuid().ToString();
            var owner            = new BrokerPlayer
            {
                Inventory = new Dictionary <string, WarehouseInventory>
                {
                    { expectedItem, new WarehouseInventory {
                          Quantity = expectedQuantity
                      } }
                }
            };
            var shipment = new BrokerShipment
            {
                Owner      = owner,
                ShipmentId = Guid.NewGuid(),
                FactoryId  = Guid.NewGuid(),
                State      = ShipmentState.Requested,
                Carts      = new[]
                {
                    new Cart
                    {
                        CartType  = CartType.Cargo,
                        Inventory = new[]
                        {
                            new LuaItemStack
                            {
                                Name  = expectedItem,
                                Count = expectedQuantity,
                            },
                        },
                    },
                },
            };

            givenState.Shipments.Add(shipment.ShipmentId, shipment);

            // Act
            var result = await _evaluator.Evaluate(givenState);

            // Assert
            Assert.NotEmpty(result);

            // Inventory reduced?
            Assert.Equal(0, owner.Inventory[expectedItem].Quantity);
            Assert.Equal(-expectedQuantity, result.OfType <PlayerInventoryChangedEvent>().Single().InventoryChange.Single().Count);

            // Shipment fulfilled?
            var evnt = result.OfType <ShipmentFulfilledEvent>().Single();

            Assert.Equal(shipment.ShipmentId, evnt.EntityId);
            Assert.Equal(shipment.FactoryId, evnt.FactoryId);
        }