public void BuyNotEnoughCargoSpace()
        {
            // Arrange
            SystemJumpDriveUpgrade upgrade  = this.CreateSystemJumpDriveUpgrade();
            Mock <User>            userMock = new Mock <User>();
            Mock <Ship>            shipMock = new Mock <Ship>();

            shipMock.Expect(s => s.BaseShip.Level)
            .Returns(1).Verifiable();

            JumpDrive currentUpgrade = new JumpDrive();

            // Trade value will be 80
            currentUpgrade.BasePrice = 100;
            currentUpgrade.CargoCost = 1;

            shipMock.Expect(s => s.JumpDrive)
            .Returns(currentUpgrade).Verifiable();

            // Cargo space free is 1
            shipMock.Expect(s => s.CargoSpaceFree)
            .Returns(1).AtMostOnce().Verifiable();

            // Cash on hand is 5000
            shipMock.Expect(s => s.Credits)
            .Returns(5000).AtMostOnce().Verifiable();

            // Act, should throw an exception
            upgrade.Buy(shipMock.Object);
        }
        public void BuyPlayerUpgradeAddedToSystem2()
        {
            // Arrange
            SystemJumpDriveUpgrade upgrade = this.CreateSystemJumpDriveUpgrade();

            BaseShip playerBaseShip = new BaseShip();

            playerBaseShip.Level = 1;

            JumpDrive currentUpgrade = new JumpDrive();

            // Trade value will be 160
            currentUpgrade.BasePrice = 200;
            currentUpgrade.CargoCost = 1;

            SystemJumpDriveUpgrade playerSystemUpgrade = new SystemJumpDriveUpgrade();

            playerSystemUpgrade.JumpDrive   = currentUpgrade;
            playerSystemUpgrade.CosmoSystem = upgrade.CosmoSystem;
            playerSystemUpgrade.Quantity    = 2;

            Mock <Ship> shipMock = new Mock <Ship>();

            // Setup player base upgrade model
            shipMock.Expect(s => s.BaseShip)
            .Returns(playerBaseShip).Verifiable();

            // Setup player base upgrade
            shipMock.Expect(s => s.JumpDrive)
            .Returns(currentUpgrade).Verifiable();

            shipMock.Expect(s => s.CargoSpaceFree)
            .Returns(25).Verifiable();

            // Cash on hand is 5000
            shipMock.Expect(s => s.Credits)
            .Returns(5000).Verifiable();

            // Act
            upgrade.Buy(shipMock.Object);

            // Assert
            shipMock.Verify();
            // Cost of the upgrade should be (750 - 160) credits
            shipMock.VerifySet(m => m.Credits, 5000 - (750 - 160));
            Assert.That(upgrade.Quantity, Is.EqualTo(0), "Should be no ships left in the system of this model");
            Assert.That(upgrade.CosmoSystem.SystemJumpDriveUpgrades.Where(m => m.JumpDrive == playerSystemUpgrade.JumpDrive && m.Quantity == 3).Any(), Is.True, "The players base ship should have been added to the system for sale");
        }
        public void BuyPlayerUpgradeAddedToSystem()
        {
            // Arrange
            SystemJumpDriveUpgrade upgrade = this.CreateSystemJumpDriveUpgrade();

            Mock <Ship> shipMock = new Mock <Ship>();

            shipMock.Expect(s => s.BaseShip.Level)
            .Returns(1).Verifiable();

            JumpDrive currentUpgrade = new JumpDrive();

            // Trade value will be 80
            currentUpgrade.BasePrice = 100;
            currentUpgrade.CargoCost = 1;

            shipMock.Expect(s => s.JumpDrive)
            .Returns(currentUpgrade).Verifiable();

            // Cargo space free is 10
            shipMock.Expect(s => s.CargoSpaceFree)
            .Returns(10).AtMostOnce().Verifiable();

            // Cash on hand is 5000
            shipMock.Expect(s => s.Credits)
            .Returns(5000).Verifiable();


            // Act
            upgrade.Buy(shipMock.Object);

            // Assert
            shipMock.Verify();
            // Cost of the upgrade should be (750 - 80) credits
            shipMock.VerifySet(m => m.Credits, 5000 - (750 - 80));
            Assert.That(upgrade.Quantity, Is.EqualTo(0), "Should be no upgrades left in the system of this model");
            Assert.That(upgrade.CosmoSystem.SystemJumpDriveUpgrades.Where(m => m.JumpDrive == currentUpgrade && m.Quantity == 1).Any(), Is.True, "The players upgrade should have been added to the system for sale");
        }
        public void BuyWithLevel2Ship()
        {
            // Arrange
            SystemJumpDriveUpgrade upgrade = this.CreateSystemJumpDriveUpgrade();

            Mock <Ship> shipMock = new Mock <Ship>();

            shipMock.Expect(s => s.BaseShip.Level)
            .Returns(2).Verifiable();

            JumpDrive currentUpgrade = new JumpDrive();

            currentUpgrade.JumpDriveId = 2;
            // Trade value will be 80
            currentUpgrade.BasePrice = 100;
            currentUpgrade.CargoCost = 1;

            shipMock.Expect(s => s.JumpDrive)
            .Returns(currentUpgrade).Verifiable();

            // Cargo space free is 10
            shipMock.Expect(s => s.CargoSpaceFree)
            .Returns(10).Verifiable();

            // Cash on hand is 5000
            shipMock.Expect(s => s.Credits)
            .Returns(5000).Verifiable();

            // Act
            upgrade.Buy(shipMock.Object);

            // Assert
            shipMock.Verify();
            // Cost of the upgrade should be (750*2 - 80*2) credits
            shipMock.VerifySet(s => s.Credits, 5000 - (750 * 2 - (80 * 2)));
            Assert.That(upgrade.Quantity, Is.EqualTo(0), "Should be no upgrades left in the system of this model");
        }