public void TestAddCondition_CreateNewCondition()
        {
            //set up environment
            IPolicy policy = PolicyFactory.CreatePolicy("TestPolicy", m_policySet, PolicyStatus.Active, "None");
            IConditionGroup rootConditionGroup = (IConditionGroup)policy.Conditions[0];
            DynamicMock conditionsResourceSelectForm = new DynamicMock(typeof(IConditionsResourceSelectorForm));

            //set up test object
            AddConditionState state1 = new AddConditionStateTester();
            state1.Policy = policy;
            state1.StateMachine = (IStateMachine)m_stateMachine.MockInstance;
            state1.ConditionGroup = rootConditionGroup;
            //state1.ConditionMethodDisplay = new ConditionDisplayContentInFileContext();
            state1.Source = AddConditionState.ConditionSource.New;
            state1.SelectionUI = conditionsResourceSelectForm.MockInstance;

            IPolicyObjectCollection<IPolicyObject> selectedConditions = new PolicyObjectCollection<IPolicyObject>();
            ICondition condition1 = ConditionUnitFactory.CreateCondition(ConditionUnitFactory.PreDefinedConditionType.ContentInFileContext);
            selectedConditions.Add(condition1);
            conditionsResourceSelectForm.ExpectAndReturn("get_SelectedConditions", selectedConditions, new object[0]);

            //test conditions group is empty
            Assert.AreEqual(0, rootConditionGroup.Conditions.Count, "Unexpected number of conditions in conditionGroup.Conditions");

            //add new condition
            IState showConditionsState = new ShowConditionsState();
            m_stateMachine.ExpectAndReturn("GetState", showConditionsState, StateTypeEnum.ShowConditions);
            m_stateMachine.Expect("SetState", showConditionsState);
            state1.Enter();

            //test condition group
            Assert.AreEqual(1, rootConditionGroup.Conditions.Count, "Unexpected number of conditions in conditionGroup.Conditions");

            //test condition
            ICondition condition = rootConditionGroup.Conditions[0] as ICondition;
            Assert.IsNotNull(condition, "unexpected object type in condition");
            Assert.AreSame(rootConditionGroup, condition.Parent, "Unexpected object in condition.Parent");
            Assert.AreEqual("", condition.Name.Value, "unexpected condition name");
            Assert.AreEqual(OperatorType.GreaterThan, condition.Operator, "unexpected name in condition");
            Assert.AreEqual("IDataLengthComparer", condition.Class, "unexpected class in condition");
            Assert.AreEqual(Guid.Empty, condition["Ignore"].Identifier, "unexpected identifier on Ignore attribute on condition");
            Assert.AreEqual(Boolean.FalseString, condition["Ignore"].Value, "unexpected value on Ignore attribute on condition");

            //condition.dataleft
            IDataElement dataElement = condition.DataLeft as IDataElement;
            Assert.IsNotNull(dataElement, "unexpected object type in condition.dataleft");
            Assert.AreEqual(Guid.Empty, dataElement.DisplayName.Identifier, "unexpected displayname identifier in condition.dataleft");
            Assert.AreEqual("", dataElement.DisplayName.Value, "unexpected display name in condition.dataleft");
            Assert.AreEqual(Guid.Empty, dataElement.Name.Identifier, "unexpected name identifier in condition.dataleft");
            Assert.AreEqual("contentInFileContext", dataElement.Name.Value, "unexpected name in condition.dataleft");
            Assert.AreEqual(false, dataElement.ReadOnly, "unexpected readonly in condition.dataleft");
            Assert.AreEqual(DataType.Object, dataElement.Type, "unexpected type in condition.dataleft");

            //condition.dataleft.data 
            IDataSource dataSource = dataElement.Data as IDataSource;
            Assert.IsNotNull(dataSource, "unexpected object type in condition.dataleft.data");
            Assert.AreEqual("Workshare.Policy.Condition.ContentAnalysis.dll", dataSource.Assembly, "unexpected assembly in condition.dataleft.data");
            Assert.AreEqual("Workshare.Policy.Condition.ContentAnalysis", dataSource.Class, "unexpected class in condition.dataleft.data");
            Assert.AreEqual(Guid.Empty, dataSource.Name.Identifier, "unexpected name identifier in condition.dataleft.data");
            Assert.AreEqual("Workshare.Policy.Condition.ContentAnalysis", dataSource.Name.Value, "unexpected name in condition.dataleft.data");

            //condition.dataleft.data.method 
            IDataMethod dataMethod = dataSource.Method as IDataMethod;
            Assert.IsNotNull(dataMethod, "unexpected object type in condition.dataleft.data.method");
            Assert.AreEqual(Guid.Empty, dataMethod.Name.Identifier, "unexpected name identifier in condition.dataleft.data.method");
            Assert.AreEqual("TextLookupInFileType", dataMethod.Name.Value, "unexpected name in condition.dataleft.data.method");
            Assert.AreEqual(5, dataMethod.Parameters.Count, "unexpected number of parameters in condition.dataleft.data.method");

            //condition.dataleft.data.method.parameters[0]
            IParameter parameter = dataMethod.Parameters[0];
            Assert.AreEqual(Guid.Empty, parameter.Name.Identifier, "unexpected name identifier in condition.dataleft.data.method.parameters[0]");
            Assert.AreEqual("file", parameter.Name.Value, "unexpected name in condition.dataleft.data.method.parameters[0]");

            //condition.dataleft.data.method.parameters[0].value
            dataElement = dataMethod.Parameters[0].Value as IDataElement;
            Assert.IsNotNull(dataElement, "unexpected object type in condition.dataleft.data.method.parameters[0].value");
            Assert.AreEqual(Guid.Empty, dataElement.Name.Identifier, "unexpected name identifier in condition.dataleft.data.method.parameters[0].value");
            Assert.AreEqual("file", dataElement.Name.Value, "unexpected name in condition.dataleft.data.method.parameters[0].value");
            Assert.AreEqual(Guid.Empty, dataElement.DisplayName.Identifier, "unexpected displayname identifier in condition.dataleft.data.method.parameters[0].value");
            Assert.AreEqual("", dataElement.DisplayName.Value, "unexpected displayname in condition.dataleft.data.method.parameters[0].value");
            Assert.AreEqual(false, dataElement.ReadOnly, "unexpected readonly in condition.dataleft.data.method.parameters[0].value");
            Assert.AreEqual(DataType.Object, dataElement.Type, "unexpected datatype in condition.dataleft.data.method.parameters[0].value");

            //condition.dataleft.data.method.parameters[0].value.data
            dataSource = dataElement.Data as IDataSource;
            Assert.IsNotNull(dataSource, "unexpected object type in condition.dataleft.data.method.parameters[0].value.data");
            Assert.AreEqual("this", dataSource.Assembly, "unexpected assembly in condition.dataleft.data.method.parameters[0].value.data");
            Assert.AreEqual("this", dataSource.Class, "unexpected class in condition.dataleft.data.method.parameters[0].value.data");
            Assert.AreEqual(Guid.Empty, dataSource.Name.Identifier, "unexpected name identifier in condition.dataleft.data.method.parameters[0].value.data");
            Assert.AreEqual("this", dataSource.Name.Value, "unexpected name in condition.dataleft.data.method.parameters[0].value.data");

            //condition.dataleft.data.method.parameters[0].value.data.method
            IDataMethod fileDataMethod = dataSource.Method as IDataMethod;
            Assert.IsNotNull(fileDataMethod, "unexpected object type in condition.dataleft.data.method.parameters[0].value.data.method");
            Assert.AreEqual(Guid.Empty, fileDataMethod.Name.Identifier, "unexpected name identifier in condition.dataleft.data.method.parameters[0].value.data.method");
            Assert.AreEqual("CurrentFile", fileDataMethod.Name.Value, "unexpected name in condition.dataleft.data.method.parameters[0].value.data.method");
            Assert.AreEqual(0, fileDataMethod.Parameters.Count, "unexpected number of parameters in condition.dataleft.data.method.parameters[0].value.data.method");

            //condition1copy.dataleft.data.method.parameters[1]
            parameter = dataMethod.Parameters[1];
            Assert.AreEqual(Guid.Empty, parameter.Name.Identifier, "unexpected name identifier in condition1copy.dataleft.data.method.parameters[1]");
            Assert.AreEqual("fileTypes", parameter.Name.Value, "unexpected name in condition1copy.dataleft.data.method.parameters[1]");

            //condition1copy.dataleft.data.method.parameters[1].value
            dataElement = dataMethod.Parameters[1].Value as IDataElement;
            Assert.IsNotNull(dataElement, "unexpected object type in condition1copy.dataleft.data.method.parameters[1].value");
            Assert.AreEqual(Guid.Empty, dataElement.Name.Identifier, "unexpected name identifier in condition1copy.dataleft.data.method.parameters[1].value");
            Assert.AreEqual("fileTypes", dataElement.Name.Value, "unexpected name in condition1copy.dataleft.data.method.parameters[1].value");
            Assert.AreEqual(Guid.Empty, dataElement.DisplayName.Identifier, "unexpected displayname identifier in condition1copy.dataleft.data.method.parameters[1].value");
            Assert.AreEqual("", dataElement.DisplayName.Value, "unexpected displayname in condition1copy.dataleft.data.method.parameters[1].value");
            Assert.AreEqual(false, dataElement.ReadOnly, "unexpected readonly in condition1copy.dataleft.data.method.parameters[1].value");
            Assert.AreEqual(DataType.StringArray, dataElement.Type, "unexpected datatype in condition1copy.dataleft.data.method.parameters[1].value");

            //condition.dataleft.data.method.parameters[1].value.data
            IPolicyObjectCollection<IDataItem> collection = dataElement.Data as IPolicyObjectCollection<IDataItem>;
            Assert.IsNotNull(collection, "unexpected object type in condition.dataleft.data.method.parameters[1].value.data");
            Assert.AreEqual(5, collection.Count, "unexpected number of items in condition.dataleft.data.method.parameters[1].value.data");

            //condition.dataleft.data.method.parameters[1].value.data[0]
            IDataItem dataItem = collection[0] as IDataItem;
            Assert.IsNotNull(dataItem, "unexpected object type in condition.dataleft.data.method.parameters[1].value.data[0]");
            Assert.AreEqual(Guid.Empty, dataItem.Name.Identifier, "unexpected displayname identifier in condition.dataleft.data.method.parameters[1].value");
            Assert.AreEqual("", dataItem.Name.Value, "unexpected name in condition.dataleft.data.method.parameters[1].value.data[0]");
            Assert.AreEqual(false, dataItem.ReadOnly, "unexpected readonly in condition.dataleft.data.method.parameters[1].value.data[0]");
            Assert.AreEqual(Enum.GetName(typeof(Workshare.Policy.FileType), Workshare.Policy.FileType.WordDocument), dataItem.Value, "unexpected value in condition.dataleft.data.method.parameters[1].value.data[0]");

            //condition.dataleft.data.method.parameters[2]
            parameter = dataMethod.Parameters[2];
            Assert.AreEqual(Guid.Empty, parameter.Name.Identifier, "unexpected name identifier in condition.dataleft.data.method.parameters[2]");
            Assert.AreEqual("content", parameter.Name.Value, "unexpected name in condition.dataleft.data.method.parameters[2]");

            //condition.dataleft.data.method.parameters[2].value
            dataElement = dataMethod.Parameters[2].Value as IDataElement;
            Assert.IsNotNull(dataElement, "unexpected object type in condition.dataleft.data.method.parameters[2].value");
            Assert.AreEqual(Guid.Empty, dataElement.Name.Identifier, "unexpected name identifier in condition.dataleft.data.method.parameters[2].value");
            Assert.AreEqual("content", dataElement.Name.Value, "unexpected name in condition.dataleft.data.method.parameters[2].value");
            Assert.AreEqual(Guid.Empty, dataElement.DisplayName.Identifier, "unexpected displayname identifier in condition.dataleft.data.method.parameters[2].value");
            Assert.AreEqual("word or phrase", dataElement.DisplayName.Value, "unexpected displayname in condition.dataleft.data.method.parameters[2].value");
            Assert.AreEqual(false, dataElement.ReadOnly, "unexpected readonly in condition.dataleft.data.method.parameters[2].value");
            Assert.AreEqual(DataType.StringArray, dataElement.Type, "unexpected datatype in condition.dataleft.data.method.parameters[2].value");

            //condition.dataleft.data.method.parameters[2].value.data
            collection = dataElement.Data as IPolicyObjectCollection<IDataItem>;
            Assert.IsNotNull(collection, "unexpected object type in condition.dataleft.data.method.parameters[2].value.data");
            Assert.AreEqual(0, collection.Count, "unexpected number of items in condition.dataleft.data.method.parameters[2].value.data");

            //condition.dataleft.data.method.parameters[3]
            parameter = dataMethod.Parameters[3];
            Assert.AreEqual(Guid.Empty, parameter.Name.Identifier, "unexpected name identifier in condition.dataleft.data.method.parameters[3]");
            Assert.AreEqual("context", parameter.Name.Value, "unexpected name in condition.dataleft.data.method.parameters[3]");

            //condition.dataleft.data.method.parameters[3].value
            dataElement = dataMethod.Parameters[3].Value as IDataElement;
            Assert.IsNotNull(dataElement, "unexpected object type in condition.dataleft.data.method.parameters[3].value");
            Assert.AreEqual(Guid.Empty, dataElement.Name.Identifier, "unexpected name identifier in condition.dataleft.data.method.parameters[3].value");
            Assert.AreEqual("context", dataElement.Name.Value, "unexpected name in condition.dataleft.data.method.parameters[3].value");
            Assert.AreEqual(Guid.Empty, dataElement.DisplayName.Identifier, "unexpected displayname identifier in condition.dataleft.data.method.parameters[3].value");
            Assert.AreEqual("", dataElement.DisplayName.Value, "unexpected displayname in condition.dataleft.data.method.parameters[3].value");
            Assert.AreEqual(false, dataElement.ReadOnly, "unexpected readonly in condition.dataleft.data.method.parameters[3].value");
            Assert.AreEqual(DataType.StringArray, dataElement.Type, "unexpected datatype in condition.dataleft.data.method.parameters[3].value");

            //condition.dataleft.data.method.parameters[3].value.data
            collection = dataElement.Data as IPolicyObjectCollection<IDataItem>;
            Assert.IsNotNull(collection, "unexpected object type in condition.dataleft.data.method.parameters[3].value.data");
            Assert.AreEqual(1, collection.Count, "unexpected number of items in condition.dataleft.data.method.parameters[3].value.data");

            //condition.dataleft.data.method.parameters[3].value.data[0]
            dataItem = collection[0] as IDataItem;
            Assert.IsNotNull(dataItem, "unexpected object type in condition.dataleft.data.method.parameters[3].value.data[0]");
            Assert.AreEqual(Guid.Empty, dataItem.Name.Identifier, "unexpected name identifier in condition.dataleft.data.method.parameters[3].value.data[0]");
            Assert.AreEqual("", dataItem.Name.Value, "unexpected name in condition.dataleft.data.method.parameters[3].value.data[0]");
            Assert.AreEqual(false, dataItem.ReadOnly, "unexpected readonly in condition.dataleft.data.method.parameters[3].value.data[0]");
            Assert.AreEqual("Paragraph", dataItem.Value, "unexpected value in condition.dataleft.data.method.parameters[3].value.data[0]");

            //condition.dataleft.data.method.parameters[4].value
            dataElement = dataMethod.Parameters[4].Value as IDataElement;
            Assert.IsNotNull(dataElement, "unexpected object type in condition.dataleft.data.method.parameters[4].value");
            Assert.AreEqual(Guid.Empty, dataElement.Name.Identifier, "unexpected name identifier in condition.dataleft.data.method.parameters[4].value");
            Assert.AreEqual("matchWholeWords", dataElement.Name.Value, "unexpected name in condition.dataleft.data.method.parameters[4].value");
            Assert.AreEqual(Guid.Empty, dataElement.DisplayName.Identifier, "unexpected displayname identifier in condition.dataleft.data.method.parameters[4].value");
            Assert.AreEqual("", dataElement.DisplayName.Value, "unexpected displayname in condition.dataleft.data.method.parameters[4].value");
            Assert.AreEqual(false, dataElement.ReadOnly, "unexpected readonly in condition.dataleft.data.method.parameters[4].value");
            Assert.AreEqual(DataType.BooleanArray, dataElement.Type, "unexpected datatype in condition.dataleft.data.method.parameters[4].value");

            //condition.dataleft.data.method.parameters[4].value.data
            collection = dataElement.Data as IPolicyObjectCollection<IDataItem>;
            Assert.IsNotNull(collection, "unexpected object type in condition.dataleft.data.method.parameters[4].value.data");
            Assert.AreEqual(1, collection.Count, "unexpected number of items in condition.dataleft.data.method.parameters[4].value.data");

            //condition.dataleft.data.method.parameters[4].value.data[0]
            dataItem = collection[0] as IDataItem;
            Assert.IsNotNull(dataItem, "unexpected object type in condition.dataleft.data.method.parameters[4].value.data[0]");
            Assert.AreEqual(Guid.Empty, dataItem.Name.Identifier, "unexpected name identifier in condition.dataleft.data.method.parameters[4].value.data[0]");
            Assert.AreEqual("", dataItem.Name.Value, "unexpected name in condition.dataleft.data.method.parameters[4].value.data[0]");
            Assert.AreEqual(false, dataItem.ReadOnly, "unexpected readonly in condition.dataleft.data.method.parameters[4].value.data[0]");
            Assert.AreEqual(true, dataItem.Value, "unexpected value in condition.dataleft.data.method.parameters[4].value.data[0]");

            //condition.dataright
            dataElement = condition.DataRight as IDataElement;
            Assert.IsNotNull(dataElement, "unexpected object type in condition.dataright");
            Assert.AreEqual(Guid.Empty, dataElement.Name.Identifier, "unexpected name identifier in condition.dataright");
            Assert.AreEqual("", dataElement.DisplayName.Value, "unexpected display name in condition.dataright");
            Assert.AreEqual(Guid.Empty, dataElement.Name.Identifier, "unexpected name identifier in condition.dataright");
            Assert.AreEqual("numberOfOccurrences", dataElement.Name.Value, "unexpected name in condition.dataright");
            Assert.AreEqual(false, dataElement.ReadOnly, "unexpected readonly in condition.dataright");
            Assert.AreEqual(DataType.Long, dataElement.Type, "unexpected type in condition.dataright");

            //condition.dataright.data
            dataItem = dataElement.Data as IDataItem;
            Assert.IsNotNull(dataItem, "unexpected object type in condition.dataright.data");
            Assert.AreEqual(Guid.Empty, dataItem.Name.Identifier, "unexpected name identifier in condition.dataright.data");
            Assert.AreEqual("", dataItem.Name.Value, "unexpected name in condition.dataright.data");
            Assert.AreEqual(false, dataItem.ReadOnly, "unexpected readonly in condition.dataright.data");
            Assert.AreEqual(0, dataItem.Value, "unexpected value in condition.dataright");

            //test state machine state
            m_stateMachine.Verify();
            conditionsResourceSelectForm.Verify();

            //set up another test object
            AddConditionState state2 = new AddConditionStateTester();
            state2.Policy = policy;
            state2.StateMachine = (IStateMachine)m_stateMachine.MockInstance;
            state2.ConditionGroup = rootConditionGroup;
            //state2.ConditionMethodDisplay = new ConditionDisplayFileSize();
            state2.SelectionUI = conditionsResourceSelectForm.MockInstance;
            state2.Source = AddConditionState.ConditionSource.New;

            condition1 = ConditionUnitFactory.CreateCondition(ConditionUnitFactory.PreDefinedConditionType.FileSize);
            selectedConditions.Add(condition1);
            conditionsResourceSelectForm.ExpectAndReturn("get_SelectedConditions", selectedConditions, new object[0]);

            //add another new condition
            m_stateMachine.ExpectAndReturn("GetState", showConditionsState, StateTypeEnum.ShowConditions);
            m_stateMachine.Expect("SetState", showConditionsState);
            state2.Enter();

            //test condition group
            Assert.AreEqual(2, rootConditionGroup.Conditions.Count, "Unexpected number of conditions in conditionGroup.Conditions");

            //test condition
            ICondition condition2 = rootConditionGroup.Conditions[1] as ICondition;
            Assert.IsNotNull(condition2, "Unexpected object type in condition");
            Assert.AreSame(rootConditionGroup, condition2.Parent, "Unexpected object in condition.Parent");

            //test state machine state
            m_stateMachine.Verify();
            conditionsResourceSelectForm.Verify();
        }
        public void TestAddCondition_AddFromCatalogue()
        {
            //set up environment
            IPolicy policy = PolicyFactory.CreatePolicy("TestPolicy", m_policySet, PolicyStatus.Active, "None");
            IConditionGroup rootConditionGroup = (IConditionGroup)policy.Conditions[0];
            DynamicMock conditionsCatalogueSelectForm = new DynamicMock(typeof(IConditionsCatalogueSelectorForm));

            //set up test object
            AddConditionState state = new AddConditionStateTester();
            state.Policy = policy;
            state.StateMachine = (IStateMachine)m_stateMachine.MockInstance;
            state.ConditionGroup = rootConditionGroup;
            //state.ConditionMethodDisplay = null;
            state.Source = AddConditionState.ConditionSource.FromCatalogue;
            state.SelectionUI = conditionsCatalogueSelectForm.MockInstance;

            //test conditions group is empty
            Assert.AreEqual(0, rootConditionGroup.Conditions.Count, "Unexpected number of conditions in conditionGroup.Conditions");

            //add new condition
            IState showConditionsState = new ShowConditionsState();
            m_stateMachine.ExpectAndReturn("GetState", showConditionsState, StateTypeEnum.ShowConditions);
            m_stateMachine.Expect("SetState", showConditionsState);

            IPolicyObjectCollection<IPolicyObject> selectedConditions = new PolicyObjectCollection<IPolicyObject>();
            ICondition condition1 = ConditionUnitFactory.CreateCondition(ConditionUnitFactory.PreDefinedConditionType.ContentInFileContext);
            ICondition condition2 = ConditionUnitFactory.CreateCondition(ConditionUnitFactory.PreDefinedConditionType.ContentInFileName);
            ICondition condition3 = ConditionUnitFactory.CreateCondition(ConditionUnitFactory.PreDefinedConditionType.FileSize);
            selectedConditions.Add(condition1);
            selectedConditions.Add(condition2);
            selectedConditions.Add(condition3);
            conditionsCatalogueSelectForm.ExpectAndReturn("get_SelectedConditions", selectedConditions, new object[0]);

            state.Enter();

            //test root condition group
            Assert.AreEqual(3, rootConditionGroup.Conditions.Count, "Unexpected number of conditions in conditionGroup.Conditions");

            //test conditions
            ICondition condition1Copy = rootConditionGroup.Conditions[0] as ICondition;
            ICondition condition2Copy = rootConditionGroup.Conditions[1] as ICondition;
            ICondition condition3Copy = rootConditionGroup.Conditions[2] as ICondition;

            //condition1
            Assert.IsNotNull(condition1Copy, "unexpected object type in condition");
            Assert.AreEqual(condition1.Name.Value, condition1Copy.Name.Value, "unexpected condition name");
            Assert.AreEqual(condition1.Operator, condition1Copy.Operator, "unexpected name in condition");
            Assert.AreEqual(condition1.Class, condition1Copy.Class, "unexpected class in condition");
            Assert.AreEqual(condition1["preDefinedConditionType"].Identifier, condition1Copy["preDefinedConditionType"].Identifier, "unexpected pre-defined condition type");
            Assert.AreEqual(condition1["preDefinedConditionType"].Value, condition1Copy["preDefinedConditionType"].Value, "unexpected pre-defined condition type");
            Assert.AreEqual(condition1["Ignore"].Identifier, condition1Copy["Ignore"].Identifier, "unexpected identifier on Ignore attribute on condition1");
            Assert.AreEqual(condition1["Ignore"].Value, condition1Copy["Ignore"].Value, "unexpected value on Ignore attribute on condition1");

            //condition1copy.dataleft
            IDataElement dataLeft = condition1.DataLeft as IDataElement;
            IDataElement dataLeftCopy = condition1Copy.DataLeft as IDataElement;
            Assert.AreEqual(dataLeft.DisplayName.Identifier, dataLeftCopy.DisplayName.Identifier, "unexpected displayname identifier in condition1copy.dataleft");
            Assert.AreEqual(dataLeft.DisplayName.Value, dataLeftCopy.DisplayName.Value, "unexpected display name in condition1copy.dataleft");
            Assert.AreEqual(dataLeft.Name.Identifier, dataLeftCopy.Name.Identifier, "unexpected name identifier in condition1copy.dataleft");
            Assert.AreEqual(dataLeft.Name.Value, dataLeftCopy.Name.Value, "unexpected name in condition1copy.dataleft");
            Assert.AreEqual(dataLeft.ReadOnly, dataLeftCopy.ReadOnly, "unexpected readonly in condition1copy.dataleft");
            Assert.AreEqual(dataLeft.Type, dataLeftCopy.Type, "unexpected type in condition1copy.dataleft");

            //condition1copy.dataleft.data 
            IDataSource dataSource = dataLeft.Data as IDataSource;
            IDataSource dataSourceCopy = dataLeftCopy.Data as IDataSource;
            Assert.AreEqual(dataSource.Assembly, dataSourceCopy.Assembly, "unexpected assembly in condition1copy.dataleft.data");
            Assert.AreEqual(dataSource.Class, dataSourceCopy.Class, "unexpected class in condition1copy.dataleft.data");
            Assert.AreEqual(dataSource.Name.Identifier, dataSourceCopy.Name.Identifier, "unexpected name identifier in condition1copy.dataleft.dataleft.data");
            Assert.AreEqual(dataSource.Name.Value, dataSourceCopy.Name.Value, "unexpected name in condition1copy.dataleft.data");

            //condition1copy.dataleft.data.method 
            IDataMethod dataMethod = dataSource.Method as IDataMethod;
            IDataMethod dataMethodCopy = dataSourceCopy.Method as IDataMethod;
            Assert.AreEqual(dataMethod.Name.Identifier, dataMethodCopy.Name.Identifier, "unexpected name identifier in condition1copy.dataleft.data.method");
            Assert.AreEqual(dataMethod.Name.Value, dataMethodCopy.Name.Value, "unexpected name in condition1copy.dataleft.data.method");
            Assert.AreEqual(dataMethod.Parameters.Count, dataMethodCopy.Parameters.Count, "unexpected number of parameters in condition1copy.dataleft.data.method");

            //condition1copy.dataleft.data.method.parameters[0]
            IParameter parameter = dataMethod.Parameters[0];
            IParameter parameterCopy = dataMethodCopy.Parameters[0];
            Assert.AreEqual(parameter.Name.Identifier, parameterCopy.Name.Identifier, "unexpected name identifier in condition1copy.dataleft.data.method.parameters[0]");
            Assert.AreEqual(parameter.Name.Value, parameterCopy.Name.Value, "unexpected name in condition1copy.dataleft.data.method.parameters[0]");

            //condition1copy.dataleft.data.method.parameters[0].value
            IDataElement dataElement = dataMethod.Parameters[0].Value as IDataElement;
            IDataElement dataElementCopy = dataMethodCopy.Parameters[0].Value as IDataElement;
            Assert.AreEqual(dataElement.Name.Identifier, dataElementCopy.Name.Identifier, "unexpected name identifier in condition1copy.dataleft.data.method.parameters[0].value");
            Assert.AreEqual(dataElement.Name.Value, dataElementCopy.Name.Value, "unexpected name in condition1copy.dataleft.data.method.parameters[0].value");
            Assert.AreEqual(dataElement.DisplayName.Identifier, dataElementCopy.DisplayName.Identifier, "unexpected displayname identifier in condition1copy.dataleft.data.method.parameters[0].value");
            Assert.AreEqual(dataElement.DisplayName.Value, dataElementCopy.DisplayName.Value, "unexpected displayname in condition1copy.dataleft.data.method.parameters[0].value");
            Assert.AreEqual(dataElement.ReadOnly, dataElementCopy.ReadOnly, "unexpected readonly in condition1copy.dataleft.data.method.parameters[0].value");
            Assert.AreEqual(dataElement.Type, dataElementCopy.Type, "unexpected datatype in condition1copy.dataleft.data.method.parameters[0].value");

            //condition1copy.dataleft.data.method.parameters[0].value.data
            dataSource = dataElement.Data as IDataSource;
            dataSourceCopy = dataElementCopy.Data as IDataSource;
            Assert.AreEqual(dataSource.Assembly, dataSourceCopy.Assembly, "unexpected assembly in condition1copy.dataleft.data.method.parameters[0].value.data");
            Assert.AreEqual(dataSource.Class, dataSourceCopy.Class, "unexpected class in condition1copy.dataleft.data.method.parameters[0].value.data");
            Assert.AreEqual(dataSource.Name.Identifier, dataSourceCopy.Name.Identifier, "unexpected name identifier in condition1copy.dataleft.data.method.parameters[0].value.data");
            Assert.AreEqual(dataSource.Name.Value, dataSourceCopy.Name.Value, "unexpected name in condition1copy.dataleft.data.method.parameters[0].value.data");

            //condition1copy.dataleft.data.method.parameters[0].value.data.method
            IDataMethod fileDataMethod = dataSource.Method as IDataMethod;
            IDataMethod fileDataMethodCopy = dataSourceCopy.Method as IDataMethod;
            Assert.AreEqual(fileDataMethod.Name.Identifier, fileDataMethodCopy.Name.Identifier, "unexpected name identifier in condition1copy.dataleft.data.method.parameters[0].value.method");
            Assert.AreEqual(fileDataMethod.Name.Value, fileDataMethodCopy.Name.Value, "unexpected name in condition1copy.dataleft.data.method.parameters[0].value.data.method");
            Assert.AreEqual(fileDataMethod.Parameters.Count, fileDataMethodCopy.Parameters.Count, "unexpected number of parameters in condition1copy.dataleft.data.method.parameters[0].value.data.method");

            //condition1copy.dataleft.data.method.parameters[1]
            parameter = dataMethod.Parameters[1];
            parameterCopy = dataMethodCopy.Parameters[1];
            Assert.AreEqual(parameter.Name.Identifier, parameterCopy.Name.Identifier, "unexpected name identifier in condition1copy.dataleft.data.method.parameters[1]");
            Assert.AreEqual(parameter.Name.Value, parameterCopy.Name.Value, "unexpected name in condition1copy.dataleft.data.method.parameters[1]");

            //condition1copy.dataleft.data.method.parameters[1].value
            dataElement = parameter.Value as IDataElement;
            dataElementCopy = parameterCopy.Value as IDataElement;
            Assert.IsNotNull(dataElementCopy, "unexpected object type in condition1copy.dataleft.data.method.parameters[1].value");
            Assert.AreEqual(dataElement.Name.Identifier, dataElementCopy.Name.Identifier, "unexpected name identifier in condition1copy.dataleft.data.method.parameters[1].value");
            Assert.AreEqual(dataElement.Name.Value, dataElementCopy.Name.Value, "unexpected name in condition1copy.dataleft.data.method.parameters[1].value");
            Assert.AreEqual(dataElement.DisplayName.Identifier, dataElementCopy.DisplayName.Identifier, "unexpected displayname identifier in condition1copy.dataleft.data.method.parameters[1].value");
            Assert.AreEqual(dataElement.DisplayName.Value, dataElementCopy.DisplayName.Value, "unexpected displayname in condition1copy.dataleft.data.method.parameters[1].value");
            Assert.AreEqual(dataElement.ReadOnly, dataElementCopy.ReadOnly, "unexpected readonly in condition1copy.dataleft.data.method.parameters[1].value");
            Assert.AreEqual(DataType.StringArray, dataElement.Type, "unexpected datatype in condition1copy.dataleft.data.method.parameters[1].value");

            //condition1copy.dataleft.data.method.parameters[1].value.data
            IPolicyObjectCollection<IDataItem> collection = dataElement.Data as IPolicyObjectCollection<IDataItem>;
            IPolicyObjectCollection<IDataItem> collectionCopy = dataElementCopy.Data as IPolicyObjectCollection<IDataItem>;
            Assert.IsNotNull(collectionCopy, "unexpected object type in condition1copy.dataleft.data.method.parameters[1].value.data");
            Assert.AreEqual(collection.Count, collectionCopy.Count, "unexpected number of items in condition1copy.dataleft.data.method.parameters[1].value.data");

            //condition1copy.dataleft.data.method.parameters[1].value.data[0]
            IDataItem dataItem = collection[0] as IDataItem;
            IDataItem dataItemCopy = collectionCopy[0] as IDataItem;
            Assert.IsNotNull(dataItemCopy, "unexpected object type in condition1copy.dataleft.data.method.parameters[1].value.data[0]");
            Assert.AreEqual(dataItem.Name.Identifier, dataItemCopy.Name.Identifier, "unexpected displayname identifier in condition1copy.dataleft.data.method.parameters[1].value");
            Assert.AreEqual(dataItem.Name.Value, dataItemCopy.Name.Value, "unexpected name in condition1copy.dataleft.data.method.parameters[1].value.data[0]");
            Assert.AreEqual(dataItem.ReadOnly, dataItemCopy.ReadOnly, "unexpected readonly in condition1copy.dataleft.data.method.parameters[1].value.data[0]");
            Assert.AreEqual(dataItem.Value, dataItemCopy.Value, "unexpected value in condition1copy.dataleft.data.method.parameters[1].value.data[0]");

            //condition1copy.dataleft.data.method.parameters[2]
            parameter = dataMethod.Parameters[2];
            parameterCopy = dataMethodCopy.Parameters[2];
            Assert.AreEqual(parameter.Name.Identifier, parameterCopy.Name.Identifier, "unexpected name identifier in condition1copy.dataleft.data.method.parameters[2]");
            Assert.AreEqual(parameter.Name.Value, parameterCopy.Name.Value, "unexpected name in condition1copy.dataleft.data.method.parameters[2]");

            //condition1copy.dataleft.data.method.parameters[2].value
            dataElement = parameter.Value as IDataElement;
            dataElementCopy = parameter.Value as IDataElement;
            Assert.IsNotNull(dataElementCopy, "unexpected object type in condition1copy.dataleft.data.method.parameters[2].value");
            Assert.AreEqual(dataElement.Name.Identifier, dataElementCopy.Name.Identifier, "unexpected name identifier in condition1copy.dataleft.data.method.parameters[2].value");
            Assert.AreEqual(dataElement.Name.Value, dataElementCopy.Name.Value, "unexpected name in condition1copy.dataleft.data.method.parameters[2].value");
            Assert.AreEqual(dataElement.DisplayName.Identifier, dataElementCopy.DisplayName.Identifier, "unexpected displayname identifier in condition1copy.dataleft.data.method.parameters[2].value");
            Assert.AreEqual(dataElement.DisplayName.Value, dataElementCopy.DisplayName.Value, "unexpected displayname in condition1copy.dataleft.data.method.parameters[2].value");
            Assert.AreEqual(dataElement.ReadOnly, dataElementCopy.ReadOnly, "unexpected readonly in condition1copy.dataleft.data.method.parameters[2].value");
            Assert.AreEqual(dataElement.Type, dataElementCopy.Type, "unexpected datatype in condition1copy.dataleft.data.method.parameters[2].value");

            //condition1copy.dataleft.data.method.parameters[2].value.data
            collection = dataElement.Data as IPolicyObjectCollection<IDataItem>;
            collectionCopy = dataElementCopy.Data as IPolicyObjectCollection<IDataItem>;
            Assert.IsNotNull(collectionCopy, "unexpected object type in condition1copy.dataleft.data.method.parameters[2].value.data");
            Assert.AreEqual(collection.Count, collectionCopy.Count, "unexpected number of items in condition1copy.dataleft.data.method.parameters[2].value.data");

            //condition1copy.dataleft.data.method.parameters[3]
            parameter = dataMethod.Parameters[3];
            parameterCopy = dataMethodCopy.Parameters[3];
            Assert.AreEqual(parameter.Name.Identifier, parameterCopy.Name.Identifier, "unexpected name identifier in condition1copy.dataleft.data.method.parameters[3]");
            Assert.AreEqual(parameter.Name.Value, parameterCopy.Name.Value, "unexpected name in condition1copy.dataleft.data.method.parameters[3]");

            //condition1copy.dataleft.data.method.parameters[3].value
            dataElement = parameter.Value as IDataElement;
            dataElementCopy = parameterCopy.Value as IDataElement;
            Assert.IsNotNull(dataElementCopy, "unexpected object type in condition1copy.dataleft.data.method.parameters[3].value");
            Assert.AreEqual(dataElement.Name.Identifier, dataElementCopy.Name.Identifier, "unexpected name identifier in condition1copy.dataleft.data.method.parameters[3].value");
            Assert.AreEqual(dataElement.Name.Value, dataElementCopy.Name.Value, "unexpected name in condition1copy.dataleft.data.method.parameters[3].value");
            Assert.AreEqual(dataElement.DisplayName.Identifier, dataElementCopy.DisplayName.Identifier, "unexpected displayname identifier in condition1copy.dataleft.data.method.parameters[3].value");
            Assert.AreEqual(dataElement.DisplayName.Value, dataElementCopy.DisplayName.Value, "unexpected displayname in condition1copy.dataleft.data.method.parameters[3].value");
            Assert.AreEqual(dataElement.ReadOnly, dataElementCopy.ReadOnly, "unexpected readonly in condition1copy.dataleft.data.method.parameters[3].value");
            Assert.AreEqual(dataElement.Type, dataElementCopy.Type, "unexpected datatype in condition1copy.dataleft.data.method.parameters[3].value");

            //condition1copy.dataleft.data.method.parameters[3].value.data
            collection = dataElement.Data as IPolicyObjectCollection<IDataItem>;
            collectionCopy = dataElementCopy.Data as IPolicyObjectCollection<IDataItem>;
            Assert.IsNotNull(collectionCopy, "unexpected object type in condition1copy.dataleft.data.method.parameters[3].value.data");
            Assert.AreEqual(collection.Count, collectionCopy.Count, "unexpected number of items in condition1copy.dataleft.data.method.parameters[3].value.data");

            //condition1copy.dataleft.data.method.parameters[3].value.data[0]
            dataItem = collection[0] as IDataItem;
            dataItemCopy = collectionCopy[0] as IDataItem;
            Assert.IsNotNull(dataItemCopy, "unexpected object type in condition1copy.dataleft.data.method.parameters[3].value.data[0]");
            Assert.AreEqual(dataItem.Name.Identifier, dataItemCopy.Name.Identifier, "unexpected name identifier in condition1copy.dataleft.data.method.parameters[3].value.data[0]");
            Assert.AreEqual(dataItem.Name.Value, dataItemCopy.Name.Value, "unexpected name in condition1copy.dataleft.data.method.parameters[3].value.data[0]");
            Assert.AreEqual(dataItem.ReadOnly, dataItemCopy.ReadOnly, "unexpected readonly in condition1copy.dataleft.data.method.parameters[3].value.data[0]");
            Assert.AreEqual(dataItem.Value, dataItemCopy.Value, "unexpected value in conditiongroup.conditions[1].dataleft.data.method.parameters[3].value.data[0]");

            //condition1copy.dataright
            IDataElement dataRight = condition1.DataRight as IDataElement;
            IDataElement dataRightCopy = condition1Copy.DataRight as IDataElement;
            Assert.AreEqual(Guid.Empty, dataRightCopy.DisplayName.Identifier, "unexpected displayname identifier in condition1copy.dataright");
            Assert.AreEqual(dataRight.DisplayName.Value, dataRightCopy.DisplayName.Value, "unexpected display name in condition1copy.dataright");
            Assert.AreEqual(dataRight.Name.Identifier, dataRightCopy.Name.Identifier, "unexpected name identifier in condition1copy.dataright");
            Assert.AreEqual(dataRight.Name.Value, dataRightCopy.Name.Value, "unexpected name in condition1copy.dataright");
            Assert.AreEqual(dataRight.ReadOnly, dataRightCopy.ReadOnly, "unexpected readonly in condition1copy.dataright");
            Assert.AreEqual(dataRight.Type, dataRightCopy.Type, "unexpected type in condition1copy.dataright");

            //condition1copy.dataright.data
            dataItem = dataRight.Data as IDataItem;
            dataItemCopy = dataRightCopy.Data as IDataItem;
            Assert.AreEqual(dataItem.Name.Identifier, dataItemCopy.Name.Identifier, "unexpected name identifier in condition1copy.dataright.data");
            Assert.AreEqual(dataItem.Name.Value, dataItemCopy.Name.Value, "unexpected name in condition1copy.dataright.data");
            Assert.AreEqual(dataItem.ReadOnly, dataItemCopy.ReadOnly, "unexpected readonly in condition1copy.dataright.data");
            Assert.AreEqual(dataItem.Value, dataItemCopy.Value, "unexpected value in condition1copy.dataright.data");                

            //condition2copy
            Assert.IsNotNull(condition2Copy, "unexpected object type in condition2copy");
            Assert.AreNotEqual(condition2.Identifier, condition2Copy.Identifier);
            Assert.AreEqual(condition2.Name.Value, condition2Copy.Name.Value);
            Assert.AreEqual(condition2.Class, condition2Copy.Class);
            Assert.AreEqual(condition2.Operator, condition2Copy.Operator);
            Assert.AreEqual(Guid.Empty, condition2Copy["preDefinedConditionType"].Identifier, "unexpected identifier on pre-defined condition type in conditiongroup");
            Assert.AreEqual(condition2["preDefinedConditionType"].Value, condition2Copy["preDefinedConditionType"].Value, "unexpected pre-defined condition type on condition2");
            Assert.AreEqual(Guid.Empty, condition2Copy["expressionEntity"].Identifier, "unexpected identifier on \"ExpressionEntity\" attribute in condition2");
            Assert.AreEqual(condition2["expressionEntity"].Value, condition2Copy["expressionEntity"].Value, "unexpected \"ExpressionEntity\" attribute in condition2");

            //condition2copy.dataleft
            dataElement = condition2.DataLeft as IDataElement;
            dataElementCopy = condition2Copy.DataLeft as IDataElement;
            Assert.AreNotEqual(dataElement.Identifier, dataElementCopy.Identifier, "unexpected identifier in condtion2copy.dataleft");
            Assert.AreEqual(dataElement.Name.Identifier, dataElementCopy.Name.Identifier, "unexpected name identifier in condtion2copy.dataleft"); //non-translatable
            Assert.AreEqual(dataElement.Name.Value, dataElementCopy.Name.Value, "unexpected name in condtion2copy.dataleft");
            Assert.AreEqual(dataElement.Type, dataElementCopy.Type, "unexpected type in condtion2copy.dataleft");
            Assert.AreEqual(dataElement.DisplayName.Identifier, dataElementCopy.DisplayName.Identifier, "unexpected displayname identifier in condtion2copy.dataleft"); //nontranslateable
            Assert.AreEqual(dataElement.DisplayName.Value, dataElementCopy.DisplayName.Value, "unexpected displayname in condtion2copy.dataleft");

            //condition2copy.dataleft.data 
            dataSource = dataElement.Data as IDataSource;
            dataSourceCopy = dataElementCopy.Data as IDataSource;
            Assert.IsNotNull(dataSourceCopy, "unexpected object type in condition2copy.dataleft.data");
            Assert.AreNotEqual(dataSource.Identifier, dataSourceCopy.Identifier, "unexpected identifier in condtion2copy.dataleft.data");
            Assert.AreEqual(dataSource.Assembly, dataSourceCopy.Assembly, "unexpected assembly in condition2copy.dataleft.data");
            Assert.AreEqual(dataSource.Class, dataSourceCopy.Class, "unexpected class in condition2copy.dataleft.data");
            Assert.AreEqual(dataSource.Name.Identifier, dataSourceCopy.Name.Identifier, "unexpected name identifier in condition2copy.dataleft.data"); //nontranslateable
            Assert.AreEqual(dataSource.Name.Value, dataSourceCopy.Name.Value, "unexpected name in condition2copy.dataleft.data");

            //assume that lower level copying is working, as we have already tested in condition 1 and it is covered in the 
            //object model tests

            //condition3Copy
            Assert.AreNotEqual(condition3.Identifier, condition3Copy.Identifier);
            Assert.AreEqual(condition3.Name.Value, condition3Copy.Name.Value);
            Assert.AreEqual(condition3.Class, condition3Copy.Class);
            Assert.AreEqual(condition3.Operator, condition3Copy.Operator);
            Assert.AreEqual(Guid.Empty, condition3Copy["preDefinedConditionType"].Identifier, "unexpected identifier on pre-defined condition type in condition3");
            Assert.AreEqual(condition3["preDefinedConditionType"].Value, condition3Copy["preDefinedConditionType"].Value, "unexpected pre-defined condition type on condition3");
            Assert.AreEqual(Guid.Empty, condition3Copy["expressionEntity"].Identifier, "unexpected identifier on \"ExpressionEntity\" attribute in condition3");
            Assert.AreEqual(condition3["expressionEntity"].Value, condition3Copy["expressionEntity"].Value, "unexpected \"ExpressionEntity\" attribute in condition3");

            //condition3copy.dataleft
            dataElement = condition3.DataLeft as IDataElement;
            dataElementCopy = condition3Copy.DataLeft as IDataElement;
            Assert.AreNotEqual(dataElement.Identifier, dataElementCopy.Identifier, "unexpected identifier in condtion3copy.dataleft");
            Assert.AreEqual(dataElement.Name.Identifier, dataElementCopy.Name.Identifier, "unexpected name identifier in condtion3copy.dataleft"); //non-translatable
            Assert.AreEqual(dataElement.Name.Value, dataElementCopy.Name.Value, "unexpected name in condtion3copy.dataleft");
            Assert.AreEqual(dataElement.Type, dataElementCopy.Type, "unexpected type in condtion3copy.dataleft");
            Assert.AreEqual(dataElement.DisplayName.Identifier, dataElementCopy.DisplayName.Identifier, "unexpected displayname identifier in condtion3copy.dataleft"); //nontranslateable
            Assert.AreEqual(dataElement.DisplayName.Value, dataElementCopy.DisplayName.Value, "unexpected displayname in condtion3copy.dataleft");

            //condition3copy.dataleft.data 
            dataSource = dataElement.Data as IDataSource;
            dataSourceCopy = dataElementCopy.Data as IDataSource;
            Assert.IsNotNull(dataSource, "unexpected object type in condition3copy.dataleft.data");
            Assert.AreNotEqual(dataSource.Identifier, dataSourceCopy.Identifier, "unexpected identifier in condtion3copy.dataleft.data");
            Assert.AreEqual(dataSource.Assembly, dataSourceCopy.Assembly, "unexpected assembly in condition3copy.dataleft.data");
            Assert.AreEqual(dataSource.Class, dataSourceCopy.Class, "unexpected class in condition3copy.dataleft.data");
            Assert.AreEqual(dataSource.Name.Identifier, dataSourceCopy.Name.Identifier, "unexpected name identifier in condition3copy.dataleft.data"); //nontranslateable
            Assert.AreEqual(dataSource.Name.Value, dataSourceCopy.Name.Value, "unexpected name in condition3copy.dataleft.data");

            //assume that lower level copying is working, as we have already tested in condition 1 and it is covered in the 
            //object model tests

            //test state machine state
            m_stateMachine.Verify();

        }