public async Task CalculateAsync_WhenCalled_AssertCalculateAsyncWasCalledOnEachAccount()
        {
            IAccountCollectionBase <IAccount, Sut> sut = CreateSut();

            IEnumerable <Mock <IAccount> > accountMockCollection = new List <Mock <IAccount> >
            {
                _fixture.BuildAccountMock(),
                                           _fixture.BuildAccountMock(),
                                           _fixture.BuildAccountMock(),
                                           _fixture.BuildAccountMock(),
                                           _fixture.BuildAccountMock(),
                                           _fixture.BuildAccountMock(),
                                           _fixture.BuildAccountMock()
            };

            sut.Add(accountMockCollection.Select(accountMock => accountMock.Object).ToArray());

            DateTime statusDate = DateTime.Now.AddDays(_random.Next(1, 365) * -1);
            await sut.CalculateAsync(statusDate);

            foreach (Mock <IAccount> accountMock in accountMockCollection)
            {
                accountMock.Verify(m => m.CalculateAsync(It.Is <DateTime>(value => value == statusDate.Date)), Times.Once);
            }
        }
        public void Add_WhenAccountCollectionIsNotNullAndOneAccountDoesExistWithinCollection_ThrowsIntranetSystemException()
        {
            IAccountCollectionBase <IAccount, Sut> sut = CreateSut();

            IList <IAccount> accountCollection = new List <IAccount>
            {
                _fixture.BuildAccountMock().Object,
                             _fixture.BuildAccountMock().Object,
                             _fixture.BuildAccountMock().Object,
                             _fixture.BuildAccountMock().Object,
                             _fixture.BuildAccountMock().Object,
                             _fixture.BuildAccountMock().Object,
                             _fixture.BuildAccountMock().Object
            };

            IAccount existingAccount = accountCollection[_random.Next(0, accountCollection.Count - 1)];

            sut.Add(existingAccount);

            IntranetSystemException result = Assert.Throws <IntranetSystemException>(() => sut.Add(accountCollection));

            // ReSharper disable PossibleNullReferenceException
            Assert.That(result.Message.Contains(existingAccount.GetType().Name), Is.True);
            Assert.That(result.ErrorCode, Is.EqualTo(ErrorCode.ObjectAlreadyExists));
            Assert.That(result.InnerException, Is.Null);
            // ReSharper restore PossibleNullReferenceException
        }
        public async Task CalculateAsync_WhenCalled_AssertCalculateWasCalledOnSut()
        {
            IAccountCollectionBase <IAccount, Sut> sut = CreateSut();

            Sut result = await sut.CalculateAsync(DateTime.Now.AddDays(_random.Next(1, 365) * -1));

            Assert.That(result.CalculateWasCalled, Is.True);
        }
        public async Task CalculateAsync_WhenCalled_ReturnsSameAccountCollectionBase()
        {
            IAccountCollectionBase <IAccount, Sut> sut = CreateSut();

            IAccountCollectionBase <IAccount, Sut> result = await sut.CalculateAsync(DateTime.Now.AddDays(_random.Next(1, 365) * -1));

            Assert.That(result, Is.SameAs(sut));
        }
        public async Task CalculateAsync_WhenCalled_AssertCalculateWasCalledWithSameStatusDate()
        {
            IAccountCollectionBase <IAccount, Sut> sut = CreateSut();

            DateTime statusDate = DateTime.Now.AddDays(_random.Next(1, 365) * -1);
            Sut      result     = await sut.CalculateAsync(statusDate);

            Assert.That(result.CalculateCalledWithStatusDate, Is.EqualTo(statusDate.Date));
        }
        public async Task CalculateAsync_WhenCalledMultipleTimesWithSameStatusDate_ReturnsSameAccountCollectionBase()
        {
            IAccountCollectionBase <IAccount, Sut> sut = CreateSut();

            DateTime statusDate = DateTime.Now.AddDays(_random.Next(1, 365) * -1);
            IAccountCollectionBase <IAccount, Sut> result = await((IAccountCollectionBase <IAccount, Sut>)await((IAccountCollectionBase <IAccount, Sut>) await sut.CalculateAsync(statusDate)).CalculateAsync(statusDate)).CalculateAsync(statusDate);

            Assert.That(result, Is.SameAs(sut));
        }
        public async Task CalculateAsync_WhenCalledMultipleTimesWithSameStatusDate_AssertAlreadyCalculatedWasCalledTwiceOnSut()
        {
            IAccountCollectionBase <IAccount, Sut> sut = CreateSut();

            DateTime statusDate = DateTime.Now.AddDays(_random.Next(1, 365) * -1);
            Sut      result     = await((IAccountCollectionBase <IAccount, Sut>)await((IAccountCollectionBase <IAccount, Sut>) await sut.CalculateAsync(statusDate)).CalculateAsync(statusDate)).CalculateAsync(statusDate);

            Assert.That(result.AlreadyCalculatedWasCalledTimes, Is.EqualTo(2));
        }
        public async Task CalculateAsync_WhenCalled_ReturnsSameAccountCollectionBaseWhereStatusDateEqualDateFromCall()
        {
            IAccountCollectionBase <IAccount, Sut> sut = CreateSut();

            DateTime statusDate = DateTime.Now.AddDays(_random.Next(1, 365) * -1);
            IAccountCollectionBase <IAccount, Sut> result = await sut.CalculateAsync(statusDate);

            Assert.That(result.StatusDate, Is.EqualTo(statusDate.Date));
        }
        public void Add_WhenAccountCollectionIsNull_ThrowsArgumentNullException()
        {
            IAccountCollectionBase <IAccount, Sut> sut = CreateSut();

            ArgumentNullException result = Assert.Throws <ArgumentNullException>(() => sut.Add((IEnumerable <IAccount>)null));

            // ReSharper disable PossibleNullReferenceException
            Assert.That(result.ParamName, Is.EqualTo("accountCollection"));
            // ReSharper restore PossibleNullReferenceException
        }
        public void Add_WhenAccountIsNotNullAndDoesNotExistWithinCollection_AddsAccountToCollection()
        {
            IAccountCollectionBase <IAccount, Sut> sut = CreateSut();

            IAccount account = _fixture.BuildAccountMock().Object;

            sut.Add(account);

            Assert.That(sut.Contains(account), Is.True);
        }
        public void Add_WhenAccountIsNotNullAndDoesExistWithinCollection_ThrowsIntranetSystemException()
        {
            IAccountCollectionBase <IAccount, Sut> sut = CreateSut();

            IAccount account = _fixture.BuildAccountMock().Object;

            sut.Add(account);

            IntranetSystemException result = Assert.Throws <IntranetSystemException>(() => sut.Add(account));

            // ReSharper disable PossibleNullReferenceException
            Assert.That(result.Message.Contains(account.GetType().Name), Is.True);
            Assert.That(result.ErrorCode, Is.EqualTo(ErrorCode.ObjectAlreadyExists));
            Assert.That(result.InnerException, Is.Null);
            // ReSharper restore PossibleNullReferenceException
        }
        public void Add_WhenAccountCollectionIsNotNullAndEachAccountDoesNotExistWithinCollection_AddsEachAccountToCollection()
        {
            IAccountCollectionBase <IAccount, Sut> sut = CreateSut();

            IEnumerable <IAccount> accountCollection = new List <IAccount>
            {
                _fixture.BuildAccountMock().Object,
                                   _fixture.BuildAccountMock().Object,
                                   _fixture.BuildAccountMock().Object,
                                   _fixture.BuildAccountMock().Object,
                                   _fixture.BuildAccountMock().Object,
                                   _fixture.BuildAccountMock().Object,
                                   _fixture.BuildAccountMock().Object
            };

            sut.Add(accountCollection);

            Assert.That(accountCollection.All(account => sut.Contains(account)), Is.True);
        }
        public async Task CalculateAsync_WhenCalled_AssertCalculateWasCalledWithCalculatedAccountCollection()
        {
            IAccountCollectionBase <IAccount, Sut> sut = CreateSut();

            IEnumerable <IAccount> calculatedAccountCollection = new List <IAccount>
            {
                _fixture.BuildAccountMock().Object,
                                   _fixture.BuildAccountMock().Object,
                                   _fixture.BuildAccountMock().Object,
                                   _fixture.BuildAccountMock().Object,
                                   _fixture.BuildAccountMock().Object,
                                   _fixture.BuildAccountMock().Object,
                                   _fixture.BuildAccountMock().Object
            };

            sut.Add(calculatedAccountCollection.Select(calculatedAccount => _fixture.BuildAccountMock(calculatedAccount: calculatedAccount).Object).ToArray());

            DateTime statusDate = DateTime.Now.AddDays(_random.Next(1, 365) * -1);
            Sut      result     = await sut.CalculateAsync(statusDate);

            Assert.That(result.CalculateCalledWithCalculatedAccountCollection.All(calculatedAccount => calculatedAccountCollection.Contains(calculatedAccount)), Is.True);
        }