// ReSharper disable InconsistentNaming
        public void ActivityCollectionDesignerViewModel_Constructor_OneBlankRow_OneBlankRowAdded()
        // ReSharper restore InconsistentNaming
        {
            //exe
            var vm = new TestActivityDesignerCollectionViewModelItemsInitialized(CreateModelItem(1));

            //assert
            VerifyCollection(vm, 2, allRowsBlank: true);
        }
        public void ActivityCollectionDesignerViewModel_InsertAt_AnyIndexWhenTwoRows_DoesNotInsertRow()
        {
            var items = CreateItemsList(2);
            var modelItem = CreateModelItem(items);
            var viewModel = new TestActivityDesignerCollectionViewModelItemsInitialized(modelItem);

            viewModel.InsertAt(1);
            Verify_CollectionUnchanged(items, viewModel);

            viewModel.InsertAt(2);
            Verify_CollectionUnchanged(items, viewModel);
        }
        void Verify_CanInsertAt(List<ActivityDTO> items, int indexNumber, bool expected)
        {
            //------------Setup for test--------------------------
            var modelItem = CreateModelItem(items);
            var viewModel = new TestActivityDesignerCollectionViewModelItemsInitialized(modelItem);

            //------------Execute Test---------------------------
            var result = viewModel.CanInsertAt(indexNumber);

            //------------Assert Results-------------------------
            Assert.AreEqual(expected, result);
        }
        // ReSharper disable InconsistentNaming
        public void ActivityCollectionDesignerViewModel_Constructor_NoBlankRows_BlankRowAdded()
        // ReSharper restore InconsistentNaming
        {
            var items = CreateItemsList(3);
            items.RemoveAt(2); // remove last blank row

            var modelItem = CreateModelItem(items);
            var expectedItemsByIndexNumber = items.ToDictionary(dto => dto.IndexNumber);

            //exe
            var vm = new TestActivityDesignerCollectionViewModelItemsInitialized(modelItem);

            //assert
            VerifyCollection(vm, 3, expectedItemsByIndexNumber);
        }
        void Verify_UpdateItem_MakesRowNotBlank(int startItemCount, int updatedIndexNumber, bool isNewBlankRowAdded)
        {
            //------------Setup for test--------------------------
            var items = CreateItemsList(startItemCount);
            var modelItem = CreateModelItem(items);
            var viewModel = new TestActivityDesignerCollectionViewModelItemsInitialized(modelItem);

            for(var i = 0; i < startItemCount; i++)
            {
                Assert.AreEqual(i == startItemCount - 1, items[i].CanRemove());
            }

            var idx = updatedIndexNumber - 1;

            //------------Execute Test---------------------------
            items[idx].FieldValue = idx == startItemCount - 1 ? "test value" : string.Empty; // if field is blank, put text otherwise clear it


            //------------Assert Results-------------------------
            Assert.IsFalse(items[idx].CanRemove());

            var expectedItemCount = isNewBlankRowAdded ? startItemCount + 1 : startItemCount;
            var expectedNonBlankItemCount = expectedItemCount - 1;
            Assert.AreEqual(expectedItemCount, viewModel.ItemCount);
            Assert.AreEqual(string.Format("Activity ({0})", expectedNonBlankItemCount), viewModel.ModelItem.GetProperty("DisplayName"));

            // ReSharper disable PossibleNullReferenceException
            var mic = viewModel.ModelItem.Properties[viewModel.CollectionName].Collection;

            for(int i = 0, j = 0; j < expectedItemCount; j++)
            {
                var dto = (ActivityDTO)mic[j].GetCurrentValue();
                if(j == expectedItemCount - 1 && isNewBlankRowAdded)
                {
                    Assert.AreEqual("", dto.FieldName);
                    Assert.AreEqual("", dto.FieldValue);
                }
                else
                {
                    Assert.AreSame(items[i++], dto);
                }
            }
            // ReSharper restore PossibleNullReferenceException
        }
        public void ActivityCollectionDesignerViewModel_UpdateItem_RowCountIsTwoBlanksAndMakesSecondRowNonBlank_NoRowsAddedOrRemoved()
        {
            //------------Setup for test--------------------------
            var items = new List<ActivityDTO>
            {
                new ActivityDTO("", "", 1),
                new ActivityDTO("", "", 2)
            };

            Assert.IsTrue(items[0].CanRemove());
            Assert.IsTrue(items[1].CanRemove());

            var modelItem = CreateModelItem(items);
            var viewModel = new TestActivityDesignerCollectionViewModelItemsInitialized(modelItem);

            const int Idx = 1;

            //------------Execute Test---------------------------
            items[Idx].FieldName = "test";   // CanRemove() checks this

            //------------Assert Results-------------------------
            Verify_CollectionUnchanged(items, viewModel);
        }
 public void ActivityCollectionDesignerViewModel_Validate_NoErrorsFound_IsValidIsTrue()
 {
     var collectionsViewModel = new TestActivityDesignerCollectionViewModelItemsInitialized(CreateModelItem(4));
     collectionsViewModel.Validate();
     Assert.IsTrue(collectionsViewModel.IsValid);
 }
 public void ActivityCollectionDesignerViewModel_Constructor_ValidModelItem_InstanceOfQuickVariableInputViewModelCreated()
 {
     var collectionsViewModel = new TestActivityDesignerCollectionViewModelItemsInitialized(CreateModelItem(0));
     Assert.IsNotNull(collectionsViewModel.QuickVariableInputViewModel);
 }
        void Verify_UpdateItem_MakesRowBlankAndIndexNumberInBounds_RowNotRemoved(int startItemCount, int indexNumber)
        {
            //------------Setup for test--------------------------
            var items = CreateItemsList(startItemCount);
            var modelItem = CreateModelItem(items);
            var viewModel = new TestActivityDesignerCollectionViewModelItemsInitialized(modelItem);

            for(var i = 0; i < startItemCount; i++)
            {
                Assert.AreEqual(i == startItemCount - 1, items[i].CanRemove());
            }

            var idx = indexNumber - 1;

            //------------Execute Test---------------------------
            items[idx].FieldName = string.Empty;  // CanRemove() checks this
            items[idx].FieldValue = string.Empty; // CanRemove() checks this


            //------------Assert Results-------------------------
            Assert.IsTrue(items[idx].CanRemove());

            var expectedItemCount = startItemCount;
            var expectedNonBlankItemCount = expectedItemCount - 1;
            Assert.AreEqual(expectedItemCount, viewModel.ItemCount);
            Assert.AreEqual(string.Format("Activity ({0})", expectedNonBlankItemCount), viewModel.ModelItem.GetProperty("DisplayName"));

            // ReSharper disable PossibleNullReferenceException
            var mic = viewModel.ModelItem.Properties[viewModel.CollectionName].Collection;

            for(int i = 0, j = 0; j < expectedItemCount; j++)
            {
                var dto = (ActivityDTO)mic[j].GetCurrentValue();
                Assert.AreSame(items[i++], dto);
                Assert.AreEqual(j + 1, dto.IndexNumber);
            }
            // ReSharper restore PossibleNullReferenceException
        }
        public void ActivityCollectionDesignerViewModel_ChangeDtoProperty_CausesCustomActionsToFire()
        {
            //------------Setup for test--------------------------
            const int ItemCount = 3;

            var modelItem = CreateModelItem(ItemCount);
            var viewModel = new TestActivityDesignerCollectionViewModelItemsInitialized(modelItem);

            const int ExpectedItemCount = 5;
            var source = new List<string>();
            for(var i = 0; i < ExpectedItemCount; i++)
            {
                source.Add("NewField" + i);
            }
            viewModel.TestAddToCollection(source, true);
            // ReSharper disable PossibleNullReferenceException
            var mic = viewModel.ModelItem.Properties[viewModel.CollectionName].Collection;
            var dto = (ActivityDTO)mic[0].GetCurrentValue();
            // ReSharper restore PossibleNullReferenceException
            //------------Execute Test---------------------------
            dto.FieldName = "Test";
            //------------Assert Results-------------------------
            Assert.IsTrue(viewModel.CustomActionCalled);
        }
        public void ActivityCollectionDesignerViewModel_AddToCollection_OverwriteFalseAndTwoBlankRows_ItemsAdded()
        {
            //------------Setup for test--------------------------
            var items = CreateItemsList(2);     // all blank rows
            var modelItem = CreateModelItem(items);
            var viewModel = new TestActivityDesignerCollectionViewModelItemsInitialized(modelItem);

            var source = new List<string>();
            for(var i = 0; i < 2; i++)
            {
                source.Add("NewField" + (i + 1));
            }

            const int ExpectedItemCount = 3;

            //------------Execute Test---------------------------
            viewModel.TestAddToCollection(source, false);

            //------------Assert Results-------------------------
            // ReSharper disable PossibleNullReferenceException
            var mic = viewModel.ModelItem.Properties[viewModel.CollectionName].Collection;

            // Extra blank row is also added
            Assert.AreEqual(ExpectedItemCount, viewModel.ItemCount);

            VerifyItem(mic[0], 1, "NewField1", "");
            VerifyItem(mic[1], 2, "NewField2", "");

            // check that the first blank row was not removed - just repositioned
            Assert.AreSame(items[0], mic[2].GetCurrentValue());
            VerifyItem(mic[2], 3, "", "");

            // ReSharper restore PossibleNullReferenceException

            Assert.AreEqual(string.Format("Activity ({0})", ExpectedItemCount - 1), viewModel.ModelItem.GetProperty("DisplayName"));
        }
        public void ActivityCollectionDesignerViewModel_AddToCollection_OverwriteTrue_CollectionClearedAndNewItemsAdded()
        {
            //------------Setup for test--------------------------
            const int ItemCount = 3;

            var modelItem = CreateModelItem(ItemCount);
            var viewModel = new TestActivityDesignerCollectionViewModelItemsInitialized(modelItem);

            const int ExpectedItemCount = 5;
            var source = new List<string>();
            for(var i = 0; i < ExpectedItemCount; i++)
            {
                source.Add("NewField" + i);
            }

            //------------Execute Test---------------------------
            viewModel.TestAddToCollection(source, true);

            //------------Assert Results-------------------------
            // ReSharper disable PossibleNullReferenceException
            var mic = viewModel.ModelItem.Properties[viewModel.CollectionName].Collection;
            // ReSharper restore PossibleNullReferenceException

            // Extra blank row is also added
            Assert.AreEqual(ExpectedItemCount + 1, viewModel.ItemCount);
            Assert.AreEqual(string.Format("Activity ({0})", ExpectedItemCount), viewModel.ModelItem.GetProperty("DisplayName"));

            System.Diagnostics.Debug.Assert(mic != null, "mic != null");
            for(var i = 0; i < mic.Count; i++)
            {
                var dto = (ActivityDTO)mic[i].GetCurrentValue();
                if(i == ExpectedItemCount)
                {
                    // last row is blank
                    Assert.IsTrue(dto.CanRemove());
                }
                else
                {
                    Assert.IsFalse(dto.CanRemove());
                    Assert.AreEqual("NewField" + i, dto.FieldName);
                }
            }
        }
        public void ActivityCollectionDesignerViewModel_UpdateDisplayName_OldDisplayNameHasOpeningAndClosingBrackets_BracketsRemovedAndReadded()
        {
            //------------Setup for test--------------------------
            const int ItemCount = 3;

            var modelItem = CreateModelItem(ItemCount);
            modelItem.SetProperty("DisplayName", "Activity (12)");
            var viewModel = new TestActivityDesignerCollectionViewModelItemsInitialized(modelItem);

            //------------Execute Test---------------------------
            viewModel.UpdateDisplayName();

            //------------Assert Results-------------------------
            var actual = viewModel.ModelItem.GetProperty("DisplayName");

            Assert.AreEqual(string.Format("Activity ({0})", ItemCount - 1), actual);
        }
        void Verify_CollectionUnchanged(List<ActivityDTO> items, TestActivityDesignerCollectionViewModelItemsInitialized viewModel)
        {
            var expectedItemCount = items.Count;
            var expectedNonBlankItemCount = expectedItemCount - 1;
            Assert.AreEqual(expectedItemCount, viewModel.ItemCount);
            Assert.AreEqual(string.Format("Activity ({0})", expectedNonBlankItemCount), viewModel.ModelItem.GetProperty("DisplayName"));

            // ReSharper disable PossibleNullReferenceException
            var mic = viewModel.ModelItem.Properties[viewModel.CollectionName].Collection;

            for(int i = 0, j = 0; i < expectedItemCount; i++, j++)
            {
                var expectedIndexNumber = i + 1;
                var dto = (ActivityDTO)mic[i].GetCurrentValue();
                Assert.AreEqual(expectedIndexNumber, dto.IndexNumber);
                Assert.AreSame(items[j], dto);
            }

            // ReSharper restore PossibleNullReferenceException
        }
        void Verify_InsertAt_LastIndex_DoesNotInsertRow(int itemCount)
        {
            var items = CreateItemsList(itemCount);
            var modelItem = CreateModelItem(items);
            var viewModel = new TestActivityDesignerCollectionViewModelItemsInitialized(modelItem);

            viewModel.InsertAt(itemCount);
            Verify_CollectionUnchanged(items, viewModel);
        }
        void Verify_UpdateItem_MakesRowBlankAndIndexNumberOutOfBounds_RowNotRemoved(int startItemCount, int indexNumber)
        {
            //------------Setup for test--------------------------
            var items = CreateItemsList(startItemCount);
            var modelItem = CreateModelItem(items);
            var viewModel = new TestActivityDesignerCollectionViewModelItemsInitialized(modelItem);

            Assert.IsFalse(items[0].CanRemove());
            Assert.IsFalse(items[1].CanRemove());
            Assert.IsTrue(items[2].CanRemove());

            const int Idx = 1;  // random row

            //------------Execute Test---------------------------
            items[Idx].IndexNumber = indexNumber;  // must be done first, so that the index number is correct before clearing the other fields
            items[Idx].FieldName = string.Empty;   // CanRemove() checks this
            items[Idx].FieldValue = string.Empty;  // CanRemove() checks this

            //------------Assert Results-------------------------
            Assert.IsTrue(items[Idx].CanRemove());

            var expectedItemCount = startItemCount;
            var expectedNonBlankItemCount = expectedItemCount - 1;
            Assert.AreEqual(expectedItemCount, viewModel.ItemCount);
            Assert.AreEqual(string.Format("Activity ({0})", expectedNonBlankItemCount), viewModel.ModelItem.GetProperty("DisplayName"));

            // ReSharper disable PossibleNullReferenceException
            var mic = viewModel.ModelItem.Properties[viewModel.CollectionName].Collection;

            Assert.AreSame(items[0], mic[0].GetCurrentValue());
            Assert.AreSame(items[1], mic[1].GetCurrentValue());
            Assert.AreSame(items[2], mic[2].GetCurrentValue());
            // ReSharper restore PossibleNullReferenceException
        }
        void Verify_InsertsAt_InsertsRow(int startItemCount, int indexNumber)
        {
            //------------Setup for test--------------------------
            var items = CreateItemsList(startItemCount);
            var modelItem = CreateModelItem(items);
            var viewModel = new TestActivityDesignerCollectionViewModelItemsInitialized(modelItem);

            //------------Execute Test---------------------------
            viewModel.InsertAt(indexNumber);

            //------------Assert Results-------------------------
            var expectedItemCount = startItemCount + 1;
            var expectedNonBlankItemCount = expectedItemCount - 1;
            Assert.AreEqual(expectedItemCount, viewModel.ItemCount);
            Assert.AreEqual(string.Format("Activity ({0})", expectedNonBlankItemCount), viewModel.ModelItem.GetProperty("DisplayName"));

            // ReSharper disable PossibleNullReferenceException
            var mic = viewModel.ModelItem.Properties[viewModel.CollectionName].Collection;

            for(int i = 0, j = 0; i < expectedItemCount; i++)
            {
                //var expectedIndexNumber = i + 1;
                var dto = (ActivityDTO)mic[i].GetCurrentValue();
                //Assert.AreEqual(expectedIndexNumber, dto.IndexNumber);

                if(i != indexNumber - 1)
                {
                    Assert.AreSame(items[j++], dto);
                }
                else
                {
                    Assert.IsTrue(dto.CanRemove());
                }
            }

            // ReSharper restore PossibleNullReferenceException
        }
        public void ActivityCollectionDesignerViewModel_UpdateItem_RowCountIsTwoAndMakesFirstRowBlank_RowNotRemoved()
        {
            //------------Setup for test--------------------------

            var items = new List<ActivityDTO>
            {
                new ActivityDTO("field1", "value1", 1),
                new ActivityDTO("", "", 2)
            };

            Assert.IsFalse(items[0].CanRemove());
            Assert.IsTrue(items[1].CanRemove());

            var modelItem = CreateModelItem(items);
            var viewModel = new TestActivityDesignerCollectionViewModelItemsInitialized(modelItem);

            const int Idx = 0;

            //------------Execute Test---------------------------
            items[Idx].FieldName = string.Empty;   // CanRemove() checks this
            items[Idx].FieldValue = string.Empty;  // CanRemove() checks this

            //------------Assert Results-------------------------
            Assert.IsTrue(items[Idx].CanRemove());

            const int ExpectedItemCount = 2;
            const int ExpectedNonBlankItemCount = ExpectedItemCount - 1;
            Assert.AreEqual(2, viewModel.ItemCount);
            Assert.AreEqual(string.Format("Activity ({0})", ExpectedNonBlankItemCount), viewModel.ModelItem.GetProperty("DisplayName"));

            // ReSharper disable PossibleNullReferenceException
            var mic = viewModel.ModelItem.Properties[viewModel.CollectionName].Collection;

            Assert.AreSame(items[0], mic[0].GetCurrentValue());
            Assert.AreSame(items[1], mic[1].GetCurrentValue());
            // ReSharper restore PossibleNullReferenceException
        }
        public void ActivityCollectionDesignerViewModel_OnDTOPropertyChanged_OnlyListensForCanRemoveProperty()
        {
            //------------Setup for test--------------------------
            var items = CreateItemsList(3);
            var modelItem = CreateModelItem(items);
            var viewModel = new TestActivityDesignerCollectionViewModelItemsInitialized(modelItem);

            //------------Execute Test---------------------------
            items[0].IsFieldNameFocused = true;

            //------------Assert Results-------------------------
            Verify_CollectionUnchanged(items, viewModel);
        }
        void Verify_OnSelectionChanged_OldRowIsNotBlank_RowNotRemoved(int startItemCount, int indexNumber)
        {
            //------------Setup for test--------------------------
            var items = CreateItemsList(startItemCount);
            var modelItem = CreateModelItem(items);
            var viewModel = new TestActivityDesignerCollectionViewModelItemsInitialized(modelItem);

            for(var i = 0; i < startItemCount; i++)
            {
                Assert.AreEqual(i == startItemCount - 1, items[i].CanRemove());
            }

            var idx = indexNumber - 1;

            //------------Execute Test---------------------------
            items[idx].FieldName = string.Empty;  // CanRemove() checks this
            viewModel.OnSelectionChanged(viewModel.ModelItemCollection[idx], viewModel.ModelItemCollection[idx + 1]);

            //------------Assert Results-------------------------
            Assert.IsFalse(items[idx].CanRemove());

            Verify_CollectionUnchanged(items, viewModel);
        }