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); }
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); }
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); }