using System;
using System.Collections.Generic;
using Shouldly;
using Xunit;
namespace AggregateConsistencyBoundary
{
public class Tests
{
private readonly Shipment _shipment;
public Tests()
{
var stops = new List<Stop>
{
new PickupStop
{
StopId = 1,
Sequence = 1,
},
new DeliveryStop
{
StopId = 2,
Sequence = 2,
}
};
_shipment = new Shipment(stops);
}
[Fact]
public void CompleteShipment()
{
_shipment.Arrive(1);
_shipment.Pickup(1);
_shipment.Arrive(2);
_shipment.Deliver(2);
_shipment.IsComplete().ShouldBeTrue();
}
[Fact]
public void CannotPickupWithoutArriving()
{
Should.Throw<InvalidOperationException>(() => _shipment.Pickup(1), "Stop hasn't arrived yet.");
}
[Fact]
public void CannotDeliverWithoutArriving()
{
Should.Throw<InvalidOperationException>(() => _shipment.Deliver(2), "Stop hasn't arrived yet.");
}
[Fact]
public void CannotPickupAtDelivery()
{
Should.Throw<InvalidOperationException>(() => _shipment.Pickup(2), "Stop is not a delivery.");
}
[Fact]
public void CannotDeliverAtPickup()
{
Should.Throw<InvalidOperationException>(() => _shipment.Deliver(1), "Stop is not a pickup.");
}
[Fact]
public void ArriveStopDoesNotExist()
{
Should.Throw<InvalidOperationException>(() => _shipment.Arrive(0), "Stop does not exist.");
}
[Fact]
public void PickupStopDoesNotExist()
{
Should.Throw<InvalidOperationException>(() => _shipment.Pickup(0), "Stop does not exist.");
}
[Fact]
public void DeliverStopDoesNotExist()
{
Should.Throw<InvalidOperationException>(() => _shipment.Deliver(0), "Stop does not exist.");
}
[Fact]
public void ArriveNonDepartedStops()
{
_shipment.Arrive(1);
Should.Throw<InvalidOperationException>(() => _shipment.Arrive(2), "Previous stops have not departed.");
}
[Fact]
public void AlreadyArrived()
{
_shipment.Arrive(1);
Should.Throw<InvalidOperationException>(() => _shipment.Arrive(1), "Stop has already arrived.");
}
[Fact]
public void AlreadyPickedUp()
{
_shipment.Arrive(1);
_shipment.Pickup(1);
Should.Throw<InvalidOperationException>(() => _shipment.Pickup(1), "Stop has already departed.");
}
[Fact]
public void AlreadyDelivered()
{
_shipment.Arrive(1);
_shipment.Pickup(1);
_shipment.Arrive(2);
_shipment.Deliver(2);
Should.Throw<InvalidOperationException>(() => _shipment.Deliver(2), "Stop has already departed.");
}
}
}