public void AddDestinationVersionFieldsTest()
        {
            // Arrange.
            var vm = new ExpressionDesignerWindowViewModelBase();
            var accessor = new PrivateAccessor(vm);

            var processInfo = Mock.Create<PublishedProcessInfo>();
            Mock.Arrange(() => processInfo.ProcessOption).Returns(ProcessOption.VersionEnabled);

            var destination = new DestinationFieldList();

            // Act.
            accessor.CallMethod("AddVersionFields", processInfo, destination);

            // Assert.
            Assert.AreEqual(3, destination.Fields.Count);

            var versionNumber = destination.Fields.FirstOrDefault(f => f.SystemName == Constants.VersionNumber);
            var versionDate = destination.Fields.FirstOrDefault(f => f.SystemName == Constants.VersionDate);
            var versionMasterId = destination.Fields.FirstOrDefault(f => f.SystemName == Constants.VersionMasterId);

            Assert.IsNotNull(versionNumber);
            Debug.Assert(versionNumber != null, "versionNumber != null");
            Assert.AreEqual(NodeDataType.String, versionNumber.DataType);
            Assert.AreEqual(Constants.VersionNumberName, versionNumber.Name);
            Assert.AreEqual(Constants.VersionNumber, versionNumber.InnerName);
            Assert.AreEqual(Constants.VersionNumber, versionNumber.SystemName);

            Assert.IsNotNull(versionDate);
            Debug.Assert(versionDate != null, "versionDate != null");
            Assert.AreEqual(NodeDataType.DateTime, versionDate.DataType);
            Assert.AreEqual("Version Date", versionDate.Name);
            Assert.AreEqual(Constants.VersionDate, versionDate.InnerName);
            Assert.AreEqual(Constants.VersionDate, versionDate.SystemName);

            Assert.IsNotNull(versionMasterId);
            Debug.Assert(versionMasterId != null, "versionMasterId != null");
            Assert.AreEqual(NodeDataType.Int, versionMasterId.DataType);
            Assert.AreEqual("Version Master Id", versionMasterId.Name);
            Assert.AreEqual(Constants.VersionMasterId, versionMasterId.InnerName);
            Assert.AreEqual(Constants.VersionMasterId, versionMasterId.SystemName);
        }
        public void AddSourceVersionFieldsFromPublishedProcessInfoTest()
        {
            // Arrange.
            const string ObjectName = "testObject";
            const string SetName = "TestItem";

            var vm = new ExpressionDesignerWindowViewModelBase();
            var accessor = new PrivateAccessor(vm);

            var process1 = Mock.Create<PublishedProcessInfo>();
            Mock.Arrange(() => process1.ProcessOption).Returns(ProcessOption.VersionEnabled);

            var process2 = Mock.Create<PublishedProcessInfo>();
            Mock.Arrange(() => process2.ProcessOption).Returns(ProcessOption.None);

            var source1 = new SourceFieldList();
            var source2 = new SourceFieldList();

            // Act.
            accessor.CallMethod("AddVersionFields", process1, source1, ObjectName, SetName);
            accessor.CallMethod("AddVersionFields", process2, source2, ObjectName, SetName);

            // Assert.
            Assert.AreEqual(3, source1.Fields.Count);

            var versionNumber = source1.Fields.FirstOrDefault(f => f.SystemName == Constants.VersionNumber);
            var versionDate = source1.Fields.FirstOrDefault(f => f.SystemName == Constants.VersionDate);
            var versionMasterId = source1.Fields.FirstOrDefault(f => f.SystemName == Constants.VersionMasterId);

            Assert.IsNotNull(versionNumber);
            Debug.Assert(versionNumber != null, "versionNumber != null");
            Assert.AreEqual(NodeDataType.String, versionNumber.DataType);
            Assert.AreEqual(Constants.VersionNumberName, versionNumber.Name);
            Assert.AreEqual(Constants.VersionNumber, versionNumber.InnerName);
            Assert.AreEqual(Constants.VersionNumber, versionNumber.SystemName);
            Assert.AreEqual(SetName, versionNumber.SetName);
            Assert.AreEqual(ObjectName, versionNumber.ObjectName);

            Assert.IsNotNull(versionDate);
            Debug.Assert(versionDate != null, "versionDate != null");
            Assert.AreEqual(NodeDataType.DateTime, versionDate.DataType);
            Assert.AreEqual("Version Date", versionDate.Name);
            Assert.AreEqual(Constants.VersionDate, versionDate.InnerName);
            Assert.AreEqual(Constants.VersionDate, versionDate.SystemName);
            Assert.AreEqual(SetName, versionDate.SetName);
            Assert.AreEqual(ObjectName, versionDate.ObjectName);

            Assert.IsNotNull(versionMasterId);
            Debug.Assert(versionMasterId != null, "versionMasterId != null");
            Assert.AreEqual(NodeDataType.Int, versionMasterId.DataType);
            Assert.AreEqual("Version Master Id", versionMasterId.Name);
            Assert.AreEqual(Constants.VersionMasterId, versionMasterId.InnerName);
            Assert.AreEqual(Constants.VersionMasterId, versionMasterId.SystemName);
            Assert.AreEqual(SetName, versionMasterId.SetName);
            Assert.AreEqual(ObjectName, versionMasterId.ObjectName);

            Assert.AreEqual(0, source2.Fields.Count);
        }
        public void AddLastModifiedOnField4()
        {
            var vm = new ExpressionDesignerWindowViewModelBase();
            var privateAccessor = new PrivateAccessor(vm);
            var source = new SourceFieldList();

            privateAccessor.CallMethod("AddLastModifiedOnField", source, "oldItem", SourceFieldSetNames.Item);

            var lastModifiedOnFieldIsAdded = source.Fields.Any(f => f.SystemName == Constants.LastModifiedOn);

            Assert.IsTrue(lastModifiedOnFieldIsAdded);
        }
        public void CreateSystemParametersItemAsyncTest()
        {
            // Arrange.
            const string UniqueName = "TestItem";
            var guid1 = new Guid("{E52FF2B3-1665-4975-92E6-80C80A441E89}");
            var guid2 = new Guid("{8F00D58C-9260-48F7-B2A9-1DC8340FB766}");

            var intParam = Mock.Create<SystemParametersEdit>();
            Mock.Arrange(() => intParam.Name).Returns("Int Param");
            Mock.Arrange(() => intParam.SystemName).Returns("IntParam");
            Mock.Arrange(() => intParam.Type).Returns(SystemParameterType.Int);
            Mock.Arrange(() => intParam.Guid).Returns(guid1);

            var stringParam = Mock.Create<SystemParametersEdit>();
            Mock.Arrange(() => stringParam.Name).Returns("String Param");
            Mock.Arrange(() => stringParam.SystemName).Returns("StringParam");
            Mock.Arrange(() => stringParam.Type).Returns(SystemParameterType.String);
            Mock.Arrange(() => stringParam.Guid).Returns(guid2);

            var parameterRetriever = Mock.Create<ISystemParameterList>(Behavior.Loose);
            Mock.Arrange(() => parameterRetriever.GetSystemParametersAsync())
                .Returns(TaskEx.FromResult<IList<SystemParametersEdit>>(new[] { intParam, stringParam }));

            var vm = new ExpressionDesignerWindowViewModelBase { SystemParametersList = parameterRetriever };
            var accessor = new PrivateAccessor(vm);

            // Act.
            var task = (Task<SourceFieldList>)accessor.CallMethod("CreateSystemParametersItemAsync", UniqueName);

            // Assert.
            Assert.IsNotNull(task);
            Assert.IsTrue(task.IsCompleted);

            var item = task.Result;

            Assert.IsNotNull(item);
            Assert.AreEqual(UniqueName, item.UniqueName);
            Assert.AreEqual("System Parameters", item.ExpressionName);
            Assert.AreEqual(2, item.Fields.Count);

            var intField = item.Fields.First(f => f.Name == "Int Param");

            Assert.AreEqual(NodeDataType.Int, intField.DataType);
            Assert.AreEqual("Int Param", intField.Name);
            Assert.AreEqual("Utils.SystemParameter<int?>(\"IntParam\")", intField.SystemName);
            Assert.AreEqual(guid1.ToString(), intField.UniqueName);

            var stringField = item.Fields.First(f => f.Name == "String Param");

            Assert.AreEqual(NodeDataType.String, stringField.DataType);
            Assert.AreEqual("String Param", stringField.Name);
            Assert.AreEqual("Utils.SystemParameter<string>(\"StringParam\")", stringField.SystemName);
            Assert.AreEqual(guid2.ToString(), stringField.UniqueName);
        }
        public void CreateUserInfoSourceItemTest()
        {
            // Arrange.
            const string UniqueName = "TestItem";

            var vm = new ExpressionDesignerWindowViewModelBase();
            var accessor = new PrivateAccessor(vm);

            // Act.
            var item = (SourceFieldList)accessor.CallMethod("CreateUserInfoSourceItem", UniqueName);

            // Assert.
            Assert.IsNotNull(item);
            Assert.AreEqual(UniqueName, item.UniqueName);
            Assert.AreEqual("Current User Information", item.ExpressionName);

            Assert.AreEqual(12, item.Fields.Count);

            var userNameField = item.Fields.First(f => f.SystemName == "Utils.CurrentUserName");

            Assert.AreEqual(NodeDataType.String, userNameField.DataType);
            Assert.AreEqual("User Name", userNameField.Name);
            Assert.AreEqual(SourceFieldSetNames.CurrentUserInfo, userNameField.SetName);
            Assert.AreEqual("Utils.CurrentUserName", userNameField.SystemName);

            var fullNameField = item.Fields.First(f => f.SystemName == "Utils.CurrentUserFullName");

            Assert.AreEqual(NodeDataType.String, fullNameField.DataType);
            Assert.AreEqual("Full Name", fullNameField.Name);
            Assert.AreEqual(SourceFieldSetNames.CurrentUserInfo, fullNameField.SetName);
            Assert.AreEqual("Utils.CurrentUserFullName", fullNameField.SystemName);

            var personIdField = item.Fields.First(f => f.SystemName == "Utils.CurrentUserPersonId");

            Assert.AreEqual(NodeDataType.Int, personIdField.DataType);
            Assert.AreEqual("Person ID", personIdField.Name);
            Assert.AreEqual(SourceFieldSetNames.CurrentUserInfo, personIdField.SetName);
            Assert.AreEqual("Utils.CurrentUserPersonId", personIdField.SystemName);

            var emailAddressField = item.Fields.First(f => f.SystemName == "Utils.CurrentUserEmailAddress");

            Assert.AreEqual(NodeDataType.String, emailAddressField.DataType);
            Assert.AreEqual("Email Address", emailAddressField.Name);
            Assert.AreEqual(SourceFieldSetNames.CurrentUserInfo, emailAddressField.SetName);
            Assert.AreEqual("Utils.CurrentUserEmailAddress", emailAddressField.SystemName);

            var firstNameField = item.Fields.First(f => f.SystemName == "Utils.CurrentUserFirstName");

            Assert.AreEqual(NodeDataType.String, firstNameField.DataType);
            Assert.AreEqual("First Name", firstNameField.Name);
            Assert.AreEqual(SourceFieldSetNames.CurrentUserInfo, firstNameField.SetName);
            Assert.AreEqual("Utils.CurrentUserFirstName", firstNameField.SystemName);

            var lastNameField = item.Fields.First(f => f.SystemName == "Utils.CurrentUserLastName");

            Assert.AreEqual(NodeDataType.String, lastNameField.DataType);
            Assert.AreEqual("Last Name", lastNameField.Name);
            Assert.AreEqual(SourceFieldSetNames.CurrentUserInfo, lastNameField.SetName);
            Assert.AreEqual("Utils.CurrentUserLastName", lastNameField.SystemName);

            var businessUnitIdField = item.Fields.First(f => f.SystemName == "Utils.CurrentUserBusinessUnitId");

            Assert.AreEqual(NodeDataType.Int, businessUnitIdField.DataType);
            Assert.AreEqual("Business Unit Id", businessUnitIdField.Name);
            Assert.AreEqual(SourceFieldSetNames.CurrentUserInfo, businessUnitIdField.SetName);
            Assert.AreEqual("Utils.CurrentUserBusinessUnitId", businessUnitIdField.SystemName);

            var businessUnitField = item.Fields.First(f => f.SystemName == "Utils.CurrentUserBusinessUnit");

            Assert.AreEqual(NodeDataType.String, businessUnitField.DataType);
            Assert.AreEqual("Business Unit", businessUnitField.Name);
            Assert.AreEqual(SourceFieldSetNames.CurrentUserInfo, businessUnitField.SetName);
            Assert.AreEqual("Utils.CurrentUserBusinessUnit", businessUnitField.SystemName);

            var localeField = item.Fields.First(f => f.SystemName == "Utils.CurrentUserLocale");

            Assert.AreEqual(NodeDataType.String, localeField.DataType);
            Assert.AreEqual("Locale", localeField.Name);
            Assert.AreEqual(SourceFieldSetNames.CurrentUserInfo, localeField.SetName);
            Assert.AreEqual("Utils.CurrentUserLocale", localeField.SystemName);
        }
        public void AddDestinationStateFieldsFromPublishedProcessInfoTest()
        {
            // Arrange.
            var process1 = Mock.Create<PublishedProcessInfo>();
            Mock.Arrange(() => process1.IsStateEnabled).Returns(false);

            var process2 = Mock.Create<PublishedProcessInfo>();
            Mock.Arrange(() => process2.IsStateEnabled).Returns(true);

            var fields1 = new DestinationFieldList();
            var fields2 = new DestinationFieldList();

            var vm = new ExpressionDesignerWindowViewModelBase();
            var accessor = new PrivateAccessor(vm);

            // Act.
            accessor.CallMethod("AddStateFields", process1, fields1);
            accessor.CallMethod("AddStateFields", process2, fields2);

            // Assert.
            Assert.AreEqual(0, fields1.Fields.Count);
            
            Assert.AreEqual(2, fields2.Fields.Count);

            var currentStateField = fields2.Fields.First(f => f.SystemName == Constants.CurrentStateColumnName);

            Assert.AreEqual(NodeDataType.String, currentStateField.DataType);
            Assert.AreEqual(Constants.CurrentStateDisplayName, currentStateField.Name);
            Assert.AreEqual(Constants.CurrentStateColumnName, currentStateField.SystemName);
            Assert.AreEqual(Constants.CurrentStateColumnName, currentStateField.InnerName);
            Assert.IsTrue(string.IsNullOrEmpty(currentStateField.SetName));

            var stateModifiedOnField = fields2.Fields.First(f => f.SystemName == Constants.StateModifiedColumnName);

            Assert.AreEqual(NodeDataType.DateTime, stateModifiedOnField.DataType);
            Assert.AreEqual(Constants.StateModifiedDisplayName, stateModifiedOnField.Name);
            Assert.AreEqual(Constants.StateModifiedColumnName, stateModifiedOnField.SystemName);
            Assert.AreEqual(Constants.StateModifiedColumnName, stateModifiedOnField.InnerName);
            Assert.IsTrue(string.IsNullOrEmpty(stateModifiedOnField.SetName));
        }
        public void AddIdFieldsFromPublishedProcessInfoTest()
        {
            // Arrange.
            const string ObjectName = "testObject";
            const string SetName = "TestItem";

            var vm = new ExpressionDesignerWindowViewModelBase();
            var accessor = new PrivateAccessor(vm);

            var baseProcess = Mock.Create<PublishedProcessInfo>();
            Mock.Arrange(() => baseProcess.BaseProcess).Returns((PublishedProcessInfo)null);

            var derivedProcess = Mock.Create<PublishedProcessInfo>();
            Mock.Arrange(() => derivedProcess.BaseProcess).Returns(baseProcess);

            var baseFields = new SourceFieldList();
            var derivedFields = new SourceFieldList();

            // Act.
            accessor.CallMethod("AddIdFields", baseProcess, baseFields, ObjectName, SetName);
            accessor.CallMethod("AddIdFields", derivedProcess, derivedFields, ObjectName, SetName);

            // Assert.
            //Assert.AreEqual(1, baseFields.Fields.Count);

            //var idField = baseFields.Fields.First(f => f.SystemName == Constants.IdColumnName);

            //Assert.AreEqual(NodeDataType.Int, idField.DataType);
            //Assert.AreEqual("Id", idField.Name);
            //Assert.AreEqual(Constants.IdColumnName, idField.SystemName);
            //Assert.AreEqual(Constants.IdColumnName, idField.InnerName);
            //Assert.AreEqual(SetName, idField.SetName);
            //Assert.AreEqual(ObjectName, idField.ObjectName);

            Assert.AreEqual(1, derivedFields.Fields.Count);
            //idField = derivedFields.Fields.First(f => f.SystemName == Constants.IdColumnName);
            var baseIdField = derivedFields.Fields.First(f => f.SystemName == Constants.BaseIdColumnName);

            //Assert.AreEqual(NodeDataType.Int, idField.DataType);
            //Assert.AreEqual("Id", idField.Name);
            //Assert.AreEqual(Constants.IdColumnName, idField.SystemName);
            //Assert.AreEqual(Constants.IdColumnName, idField.InnerName);
            //Assert.AreEqual(SetName, idField.SetName);
            //Assert.AreEqual(ObjectName, idField.ObjectName);

            Assert.AreEqual(NodeDataType.Int, baseIdField.DataType);
            Assert.AreEqual("Base Id", baseIdField.Name);
            Assert.AreEqual(Constants.BaseIdColumnName, baseIdField.SystemName);
            Assert.AreEqual(Constants.BaseIdColumnName, baseIdField.InnerName);
            Assert.AreEqual(SetName, baseIdField.SetName);
            Assert.AreEqual(ObjectName, baseIdField.ObjectName);
        }