public void SchEd_WriterCalling_ModifyNodeType_ChangeParent() { Test(() => { SchemaEditor ed1 = new SchemaEditor(); SchemaEditor ed2 = new SchemaEditor(); SchemaEditorAccessor ed2Acc = new SchemaEditorAccessor(ed2); TestSchemaWriter wr = new TestSchemaWriter(); //-- create original ed1.CreatePropertyType("PT1", DataType.String); SetSchemaItemId(ed1.PropertyTypes["PT1"], 1); ed1.CreatePropertyType("PT2", DataType.String); SetSchemaItemId(ed1.PropertyTypes["PT1"], 2); ed1.CreatePropertyType("PT3", DataType.String); SetSchemaItemId(ed1.PropertyTypes["PT1"], 3); NodeType nt1 = ed1.CreateNodeType(null, "NT1", "T1"); SetSchemaItemId(ed1.NodeTypes["NT1"], 1); NodeType nt2 = ed1.CreateNodeType(null, "NT2", "T2"); SetSchemaItemId(ed1.NodeTypes["NT2"], 2); NodeType nt3 = ed1.CreateNodeType(nt1, "NT3", "T3"); SetSchemaItemId(ed1.NodeTypes["NT3"], 3); ed1.AddPropertyTypeToPropertySet(ed1.PropertyTypes["PT1"], ed1.NodeTypes["NT1"]); ed1.AddPropertyTypeToPropertySet(ed1.PropertyTypes["PT2"], ed1.NodeTypes["NT2"]); ed1.AddPropertyTypeToPropertySet(ed1.PropertyTypes["PT3"], ed1.NodeTypes["NT3"]); //-- create current ed2.CreatePropertyType("PT1", DataType.String); SetSchemaItemId(ed2.PropertyTypes["PT1"], 1); ed2.CreatePropertyType("PT2", DataType.String); SetSchemaItemId(ed2.PropertyTypes["PT1"], 2); ed2.CreatePropertyType("PT3", DataType.String); SetSchemaItemId(ed2.PropertyTypes["PT1"], 3); nt1 = ed2.CreateNodeType(null, "NT1", "T1"); SetSchemaItemId(ed2.NodeTypes["NT1"], 1); nt2 = ed2.CreateNodeType(null, "NT2", "T2"); SetSchemaItemId(ed2.NodeTypes["NT2"], 2); nt3 = ed2.CreateNodeType(nt1, "NT3", "T3"); SetSchemaItemId(ed2.NodeTypes["NT3"], 3); ed2.AddPropertyTypeToPropertySet(ed2.PropertyTypes["PT1"], ed2.NodeTypes["NT1"]); ed2.AddPropertyTypeToPropertySet(ed2.PropertyTypes["PT2"], ed2.NodeTypes["NT2"]); ed2.AddPropertyTypeToPropertySet(ed2.PropertyTypes["PT3"], ed2.NodeTypes["NT3"]); //-- edit ed2.ModifyNodeType(ed2.NodeTypes["NT3"], ed2.NodeTypes["NT2"]); //-- register ed2Acc.RegisterSchema(ed1, wr); //-- test string expectedLog = @" Open(); ModifyNodeType(nodeType=<NT3>, parent=<NT2>, className=<T3>); RemovePropertyTypeFromPropertySet(propertyType=<PT1>, owner=<NT3>); AddPropertyTypeToPropertySet(propertyType=<PT2>, owner=<NT3>, isDeclared=<True>); Close(); " .Replace("\r\n", "").Replace("\t", "").Replace(" ", ""); string log = wr.Log.Replace("\r\n", "").Replace(" ", ""); Assert.IsTrue(log == expectedLog, "#1"); Assert.IsNull(nt1.Parent, "#2"); Assert.IsNull(nt2.Parent, "#3"); Assert.IsTrue(nt3.Parent == nt2, "#4"); Assert.IsTrue(nt1.PropertyTypes.Count == 1, "#5"); Assert.IsTrue(nt2.PropertyTypes.Count == 1, "#6"); Assert.IsTrue(nt3.PropertyTypes.Count == 2, "#7"); Assert.IsNotNull(nt1.PropertyTypes["PT1"], "#8"); Assert.IsNotNull(nt2.PropertyTypes["PT2"], "#9"); Assert.IsNotNull(nt3.PropertyTypes["PT3"], "#10"); Assert.IsNull(nt3.PropertyTypes["PT1"], "#11"); Assert.IsNotNull(nt3.PropertyTypes["PT2"], "#12"); }); }
public void SchemaEditor_ModifyNodeType_Circular() { SchemaEditor editor = new SchemaEditor(); NodeType nt = editor.CreateNodeType(null, "NT1", "T1"); editor.ModifyNodeType(nt, nt); }
public void SchemaWriter_ModifyNodeType() { IntegrationTest(() => { var ed = new SchemaEditor(); ed.Load(); var nodeTypeName = "NT1-" + Guid.NewGuid(); ed.CreateNodeType(null, nodeTypeName, "NT1Class"); ed.Register(); var nodeTypeCountBefore = StorageSchema.NodeTypes.Count; var nodeTypeId = StorageSchema.NodeTypes[nodeTypeName].Id; // ACTION ed = new SchemaEditor(); ed.Load(); var nt = ed.NodeTypes[nodeTypeName]; ed.ModifyNodeType(nt, "NT1Class_modified"); ed.Register(); // ASSERT Assert.AreEqual(nodeTypeCountBefore, StorageSchema.NodeTypes.Count); var nodeType = StorageSchema.NodeTypes[nodeTypeName]; Assert.AreEqual(nodeTypeId, nodeType.Id); Assert.AreEqual(nodeTypeName, nodeType.Name); Assert.AreEqual("NT1Class_modified", nodeType.ClassName); }); }
public void SchEd_WriterCalling_ModifyNodeType() { Test(() => { SchemaEditor ed1 = new SchemaEditor(); SchemaEditor ed2 = new SchemaEditor(); SchemaEditorAccessor ed2Acc = new SchemaEditorAccessor(ed2); TestSchemaWriter wr = new TestSchemaWriter(); //-- create original ed1.CreatePropertyType("PT1", DataType.String); SetSchemaItemId(ed1.PropertyTypes["PT1"], 1); ed1.CreateNodeType(null, "NT1", "T1"); SetSchemaItemId(ed1.NodeTypes["NT1"], 1); ed1.AddPropertyTypeToPropertySet(ed1.PropertyTypes["PT1"], ed1.NodeTypes["NT1"]); //-- create current ed2.CreatePropertyType("PT1", DataType.String); SetSchemaItemId(ed2.PropertyTypes["PT1"], 1); ed2.CreateNodeType(null, "NT1", "T1"); SetSchemaItemId(ed2.NodeTypes["NT1"], 1); ed2.AddPropertyTypeToPropertySet(ed2.PropertyTypes["PT1"], ed2.NodeTypes["NT1"]); //-- edit ed2.ModifyNodeType(ed2.NodeTypes["NT1"], "ClassName2"); //-- register ed2Acc.RegisterSchema(ed1, wr); //-- test string log = wr.Log.Replace("\r\n", ""); Assert.IsTrue(log == "Open();ModifyNodeType(nodeType=<NT1>, parent=<[null]>, className=<ClassName2>);Close();"); }); }
public void SchemaEditor_ModifyNodeType_WrongContxt() { //-- wrong context SchemaEditor editor1 = new SchemaEditor(); SchemaEditor editor2 = new SchemaEditor(); NodeType nt = editor1.CreateNodeType(null, "NT", "T"); editor2.ModifyNodeType(nt, (string)null); }
public void SchemaEditor_ModifyNodeType() { SchemaEditor editor = new SchemaEditor(); NodeType nt = editor.CreateNodeType(null, "NT1", "T1"); Assert.IsTrue(nt.Name == "NT1" && nt.ClassName == "T1", "#1"); editor.ModifyNodeType(nt, "class1"); Assert.IsTrue(nt.ClassName == "class1", "#2"); Assert.IsTrue(nt.Id == 0, "Id was not 0"); }
internal static void ApplyChangesInEditor(ContentType contentType, SchemaEditor editor) { //-- Find ContentHandler Type handlerType = TypeHandler.GetType(contentType.HandlerName); if (handlerType == null) throw new RegistrationException(String.Concat( SR.Exceptions.Registration.Msg_ContentHandlerNotFound, ": ", contentType.HandlerName)); //-- parent type NodeType parentNodeType = null; if (contentType.ParentTypeName != null) { parentNodeType = editor.NodeTypes[contentType.ParentTypeName]; if (parentNodeType == null) throw new ContentRegistrationException(SR.Exceptions.Registration.Msg_UnknownParentContentType, contentType.Name); } //-- handler type NodeType nodeType = editor.NodeTypes[contentType.Name]; if (nodeType == null) nodeType = editor.CreateNodeType(parentNodeType, contentType.Name, contentType.HandlerName); if (nodeType.ClassName != contentType.HandlerName) editor.ModifyNodeType(nodeType, contentType.HandlerName); if (nodeType.Parent != parentNodeType) editor.ModifyNodeType(nodeType, parentNodeType); //-- 1: ContentHandler properties NodeTypeRegistration ntReg = ParseAttributes(handlerType); if (ntReg == null) throw new ContentRegistrationException( SR.Exceptions.Registration.Msg_DefinedHandlerIsNotAContentHandler, contentType.Name); //-- 2: Field properties foreach (FieldSetting fieldSetting in contentType.FieldSettings) { Type[][] slots = fieldSetting.HandlerSlots; int fieldSlotCount = slots.GetLength(0); if (fieldSetting.Bindings.Count != fieldSlotCount) throw new ContentRegistrationException(String.Format(CultureInfo.InvariantCulture, SR.Exceptions.Registration.Msg_FieldBindingsCount_1, fieldSlotCount), contentType.Name, fieldSetting.Name); for (int i = 0; i < fieldSetting.Bindings.Count; i++) { string propName = fieldSetting.Bindings[i]; var dataType = fieldSetting.DataTypes[i]; CheckDataType(propName, dataType, contentType.Name, editor); PropertyInfo propInfo = handlerType.GetProperty(propName); if (propInfo != null) { //-- #1: there is a property under the slot: bool ok = false; for (int j = 0; j < slots[i].Length; j++) { //if (slots[i][j] == propInfo.PropertyType) if (slots[i][j].IsAssignableFrom(propInfo.PropertyType)) { PropertyTypeRegistration propReg = ntReg.PropertyTypeRegistrationByName(propName); if (propInfo.DeclaringType != handlerType) { if (propReg == null) { object[] attrs = propInfo.GetCustomAttributes(typeof(RepositoryPropertyAttribute), false); if (attrs.Length > 0) { propReg = new PropertyTypeRegistration(propInfo, (RepositoryPropertyAttribute)attrs[0]); ntReg.PropertyTypeRegistrations.Add(propReg); } } } if (propReg != null && propReg.DataType != fieldSetting.DataTypes[i]) throw new ContentRegistrationException(String.Concat( "The data type of the field in the content type definition does not match the data type of its content handler's property. ", "Please modify the field type in the content type definition. ", "ContentTypeDefinition: '", contentType.Name, "', FieldName: '", fieldSetting.Name, "', DataType of Field's binding: '", fieldSetting.DataTypes[i], "', ContentHandler: '", handlerType.FullName, "', PropertyName: '", propReg.Name, "', DataType of property: '", propReg.DataType, "'")); ok = true; fieldSetting.HandlerSlotIndices[i] = j; fieldSetting.PropertyIsReadOnly = !PropertyHasPublicSetter(propInfo); break; } } if (!ok) { //if (fieldSetting.ShortName != "Reference") // if (fieldSetting.DataTypes[i] != RepositoryDataType.Reference) // throw new ContentRegistrationException(SR.Exceptions.Registration.Msg_PropertyAndFieldAreNotConnectable, // contentType.Name, fieldSetting.Name); //CheckReference(propInfo, slots[i], contentType, fieldSetting); if (fieldSetting.ShortName == "Reference" || fieldSetting.DataTypes[i] == RepositoryDataType.Reference) CheckReference(propInfo, slots[i], contentType, fieldSetting); //else if (fieldSetting.ShortName == "Choice") // CheckChoice(propInfo, slots[i], contentType, fieldSetting); else throw new ContentRegistrationException(SR.Exceptions.Registration.Msg_PropertyAndFieldAreNotConnectable, contentType.Name, fieldSetting.Name); } } else { //-- #2: there is not a property under the slot: PropertyTypeRegistration propReg = new PropertyTypeRegistration(propName, dataType); ntReg.PropertyTypeRegistrations.Add(propReg); } } } //-- Collect deletables. Check equals foreach (PropertyType propType in nodeType.PropertyTypes.ToArray()) { PropertyTypeRegistration propReg = ntReg.PropertyTypeRegistrationByName(propType.Name); if (propReg == null) { editor.RemovePropertyTypeFromPropertySet(propType, nodeType); } } //-- Register foreach (PropertyTypeRegistration ptReg in ntReg.PropertyTypeRegistrations) { PropertyType propType = nodeType.PropertyTypes[ptReg.Name]; if (propType == null) { propType = editor.PropertyTypes[ptReg.Name]; if (propType == null) propType = editor.CreatePropertyType(ptReg.Name, ConvertDataType(ptReg.DataType)); editor.AddPropertyTypeToPropertySet(propType, nodeType); } } }
internal static void ApplyChangesInEditor(ContentType contentType, SchemaEditor editor) { // Find ContentHandler var handlerType = TypeResolver.GetType(contentType.HandlerName, false); if (handlerType == null) { throw new RegistrationException(string.Concat( SR.Exceptions.Registration.Msg_ContentHandlerNotFound, ": ", contentType.HandlerName)); } // parent type NodeType parentNodeType = null; if (contentType.ParentTypeName != null) { parentNodeType = editor.NodeTypes[contentType.ParentTypeName]; if (parentNodeType == null) { throw new ContentRegistrationException(SR.Exceptions.Registration.Msg_UnknownParentContentType, contentType.Name); } // make sure that all content handlers defined on the parent chain exist var pnt = parentNodeType; while (pnt != null) { var ht = TypeResolver.GetType(pnt.ClassName, false); if (ht == null) { throw new RegistrationException($"Unknown content handler: {pnt.ClassName}"); } pnt = pnt.Parent; } } // handler type NodeType nodeType = editor.NodeTypes[contentType.Name]; if (nodeType == null) { nodeType = editor.CreateNodeType(parentNodeType, contentType.Name, contentType.HandlerName); } if (nodeType.ClassName != contentType.HandlerName) { editor.ModifyNodeType(nodeType, contentType.HandlerName); } if (nodeType.Parent != parentNodeType) { editor.ModifyNodeType(nodeType, parentNodeType); } // 1: ContentHandler properties NodeTypeRegistration ntReg = ParseAttributes(handlerType); if (ntReg == null) { throw new ContentRegistrationException( SR.Exceptions.Registration.Msg_DefinedHandlerIsNotAContentHandler, contentType.Name); } // 2: Field properties foreach (FieldSetting fieldSetting in contentType.FieldSettings) { Type[][] slots = fieldSetting.HandlerSlots; int fieldSlotCount = slots.GetLength(0); if (fieldSetting.Bindings.Count != fieldSlotCount) { throw new ContentRegistrationException(String.Format(CultureInfo.InvariantCulture, SR.Exceptions.Registration.Msg_FieldBindingsCount_1, fieldSlotCount), contentType.Name, fieldSetting.Name); } for (int i = 0; i < fieldSetting.Bindings.Count; i++) { string propName = fieldSetting.Bindings[i]; var dataType = fieldSetting.DataTypes[i]; CheckDataType(propName, dataType, contentType.Name, editor); PropertyInfo propInfo = handlerType.GetProperty(propName); if (propInfo != null) { // #1: there is a property under the slot: bool ok = false; for (int j = 0; j < slots[i].Length; j++) { if (slots[i][j].IsAssignableFrom(propInfo.PropertyType)) { PropertyTypeRegistration propReg = ntReg.PropertyTypeRegistrationByName(propName); if (propInfo.DeclaringType != handlerType) { if (propReg == null) { object[] attrs = propInfo.GetCustomAttributes(typeof(RepositoryPropertyAttribute), false); if (attrs.Length > 0) { propReg = new PropertyTypeRegistration(propInfo, (RepositoryPropertyAttribute)attrs[0]); ntReg.PropertyTypeRegistrations.Add(propReg); } } } if (propReg != null && propReg.DataType != fieldSetting.DataTypes[i]) { throw new ContentRegistrationException(String.Concat( "The data type of the field in the content type definition does not match the data type of its content handler's property. ", "Please modify the field type in the content type definition. ", "ContentTypeDefinition: '", contentType.Name, "', FieldName: '", fieldSetting.Name, "', DataType of Field's binding: '", fieldSetting.DataTypes[i], "', ContentHandler: '", handlerType.FullName, "', PropertyName: '", propReg.Name, "', DataType of property: '", propReg.DataType, "'")); } ok = true; fieldSetting.HandlerSlotIndices[i] = j; fieldSetting.PropertyIsReadOnly = !PropertyHasPublicSetter(propInfo); break; } } if (!ok) { if (fieldSetting.ShortName == "Reference" || fieldSetting.DataTypes[i] == RepositoryDataType.Reference) { CheckReference(propInfo, slots[i], contentType, fieldSetting); } else { throw new ContentRegistrationException(SR.Exceptions.Registration.Msg_PropertyAndFieldAreNotConnectable, contentType.Name, fieldSetting.Name); } } } else { // #2: there is not a property under the slot: PropertyTypeRegistration propReg = new PropertyTypeRegistration(propName, dataType); ntReg.PropertyTypeRegistrations.Add(propReg); } } } // Collect deletables. Check equals foreach (PropertyType propType in nodeType.PropertyTypes.ToArray()) { PropertyTypeRegistration propReg = ntReg.PropertyTypeRegistrationByName(propType.Name); if (propReg == null) { editor.RemovePropertyTypeFromPropertySet(propType, nodeType); } } // Register foreach (PropertyTypeRegistration ptReg in ntReg.PropertyTypeRegistrations) { PropertyType propType = nodeType.PropertyTypes[ptReg.Name]; if (propType == null) { propType = editor.PropertyTypes[ptReg.Name]; if (propType == null) { propType = editor.CreatePropertyType(ptReg.Name, ConvertDataType(ptReg.DataType)); } editor.AddPropertyTypeToPropertySet(propType, nodeType); } } }
public void SchemaEditor_ModifyNodeType_Circular() { SchemaEditor editor = new SchemaEditor(); NodeType nt = editor.CreateNodeType(null, "NT1"); editor.ModifyNodeType(nt, nt); }
public void SchemaEditor_ModifyNodeType() { SchemaEditor editor = new SchemaEditor(); NodeType nt = editor.CreateNodeType(null, "NT1"); Assert.IsTrue(nt.Name == "NT1" && nt.ClassName == null, "#1"); editor.ModifyNodeType(nt, "class1"); Assert.IsTrue(nt.ClassName == "class1", "#2"); Assert.IsTrue(nt.Id == 0, "Id was not 0"); }
public void SchemaEditor_ModifyNodeType_WrongContxt() { //-- hiba: rossz context SchemaEditor editor1 = new SchemaEditor(); SchemaEditor editor2 = new SchemaEditor(); NodeType nt = editor1.CreateNodeType(null, "NT"); editor2.ModifyNodeType(nt, (string)null); }
public void SchEd_WriterCalling_ModifyNodeType_ChangeParent() { SchemaEditor ed1 = new SchemaEditor(); SchemaEditor ed2 = new SchemaEditor(); SchemaEditorAccessor ed2Acc = new SchemaEditorAccessor(ed2); TestSchemaWriter wr = new TestSchemaWriter(); //-- create original ed1.CreatePropertyType("PT1", DataType.String); SetSchemaItemId(ed1.PropertyTypes["PT1"], 1); ed1.CreatePropertyType("PT2", DataType.String); SetSchemaItemId(ed1.PropertyTypes["PT1"], 2); ed1.CreatePropertyType("PT3", DataType.String); SetSchemaItemId(ed1.PropertyTypes["PT1"], 3); NodeType nt1 = ed1.CreateNodeType(null, "NT1"); SetSchemaItemId(ed1.NodeTypes["NT1"], 1); NodeType nt2 = ed1.CreateNodeType(null, "NT2"); SetSchemaItemId(ed1.NodeTypes["NT2"], 2); NodeType nt3 = ed1.CreateNodeType(nt1, "NT3"); SetSchemaItemId(ed1.NodeTypes["NT3"], 3); ed1.AddPropertyTypeToPropertySet(ed1.PropertyTypes["PT1"], ed1.NodeTypes["NT1"]); ed1.AddPropertyTypeToPropertySet(ed1.PropertyTypes["PT2"], ed1.NodeTypes["NT2"]); ed1.AddPropertyTypeToPropertySet(ed1.PropertyTypes["PT3"], ed1.NodeTypes["NT3"]); //-- create current ed2.CreatePropertyType("PT1", DataType.String); SetSchemaItemId(ed2.PropertyTypes["PT1"], 1); ed2.CreatePropertyType("PT2", DataType.String); SetSchemaItemId(ed2.PropertyTypes["PT1"], 2); ed2.CreatePropertyType("PT3", DataType.String); SetSchemaItemId(ed2.PropertyTypes["PT1"], 3); nt1 = ed2.CreateNodeType(null, "NT1"); SetSchemaItemId(ed2.NodeTypes["NT1"], 1); nt2 = ed2.CreateNodeType(null, "NT2"); SetSchemaItemId(ed2.NodeTypes["NT2"], 2); nt3 = ed2.CreateNodeType(nt1, "NT3"); SetSchemaItemId(ed2.NodeTypes["NT3"], 3); ed2.AddPropertyTypeToPropertySet(ed2.PropertyTypes["PT1"], ed2.NodeTypes["NT1"]); ed2.AddPropertyTypeToPropertySet(ed2.PropertyTypes["PT2"], ed2.NodeTypes["NT2"]); ed2.AddPropertyTypeToPropertySet(ed2.PropertyTypes["PT3"], ed2.NodeTypes["NT3"]); //-- edit ed2.ModifyNodeType(ed2.NodeTypes["NT3"], ed2.NodeTypes["NT2"]); //-- register ed2Acc.RegisterSchema(ed1, wr); //-- test string expectedLog = @" Open(); ModifyNodeType(nodeType=<NT3>, parent=<NT2>, className=<>); RemovePropertyTypeFromPropertySet(propertyType=<PT1>, owner=<NT3>); AddPropertyTypeToPropertySet(propertyType=<PT2>, owner=<NT3>, isDeclared=<True>); Close(); ".Replace("\r\n", "").Replace("\t", "").Replace(" ", ""); string log = wr.Log.Replace("\r\n", "").Replace(" ", ""); Assert.IsTrue(log == expectedLog, "#1"); Assert.IsNull(nt1.Parent, "#2"); Assert.IsNull(nt2.Parent, "#3"); Assert.IsTrue(nt3.Parent == nt2, "#4"); Assert.IsTrue(nt1.PropertyTypes.Count == 1, "#5"); Assert.IsTrue(nt2.PropertyTypes.Count == 1, "#6"); Assert.IsTrue(nt3.PropertyTypes.Count == 2, "#7"); Assert.IsNotNull(nt1.PropertyTypes["PT1"], "#8"); Assert.IsNotNull(nt2.PropertyTypes["PT2"], "#9"); Assert.IsNotNull(nt3.PropertyTypes["PT3"], "#10"); Assert.IsNull(nt3.PropertyTypes["PT1"], "#11"); Assert.IsNotNull(nt3.PropertyTypes["PT2"], "#12"); }
public void SchEd_WriterCalling_ModifyNodeType() { SchemaEditor ed1 = new SchemaEditor(); SchemaEditor ed2 = new SchemaEditor(); SchemaEditorAccessor ed2Acc = new SchemaEditorAccessor(ed2); TestSchemaWriter wr = new TestSchemaWriter(); //-- create original ed1.CreatePropertyType("PT1", DataType.String); SetSchemaItemId(ed1.PropertyTypes["PT1"], 1); ed1.CreateNodeType(null, "NT1"); SetSchemaItemId(ed1.NodeTypes["NT1"], 1); ed1.AddPropertyTypeToPropertySet(ed1.PropertyTypes["PT1"], ed1.NodeTypes["NT1"]); //-- create current ed2.CreatePropertyType("PT1", DataType.String); SetSchemaItemId(ed2.PropertyTypes["PT1"], 1); ed2.CreateNodeType(null, "NT1"); SetSchemaItemId(ed2.NodeTypes["NT1"], 1); ed2.AddPropertyTypeToPropertySet(ed2.PropertyTypes["PT1"], ed2.NodeTypes["NT1"]); //-- edit ed2.ModifyNodeType(ed2.NodeTypes["NT1"], "ClassName2"); //-- register ed2Acc.RegisterSchema(ed1, wr); //-- test string log = wr.Log.Replace("\r\n", ""); Assert.IsTrue(log == "Open();ModifyNodeType(nodeType=<NT1>, parent=<[null]>, className=<ClassName2>);Close();"); }