diff --git a/src/DocumentFormat.OpenXml.Framework/OpenXmlCompositeElement.cs b/src/DocumentFormat.OpenXml.Framework/OpenXmlCompositeElement.cs index 4d3ec8a5a..9a7312433 100644 --- a/src/DocumentFormat.OpenXml.Framework/OpenXmlCompositeElement.cs +++ b/src/DocumentFormat.OpenXml.Framework/OpenXmlCompositeElement.cs @@ -3,7 +3,6 @@ using DocumentFormat.OpenXml.Framework; using System; -using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; @@ -534,6 +533,32 @@ public override void RemoveAllChildren() #endregion + /// + /// Determines whether the specified is a valid child element + /// for this according to the schema definition. + /// + /// The to validate as a child. + /// + /// true if the specified element is a valid child; otherwise, false. + /// + public virtual bool IsValidChild(OpenXmlElement element) + { + if (element is null) + { + return false; + } + + foreach (var elem in Metadata.Children.Elements) + { + if (elem.Type.Name.Equals(element.Metadata.Type.Name)) + { + return true; + } + } + + return false; + } + /// /// Saves all of the current node's children to the specified XmlWriter. /// diff --git a/src/DocumentFormat.OpenXml.Framework/PublicAPI/PublicAPI.Shipped.txt b/src/DocumentFormat.OpenXml.Framework/PublicAPI/PublicAPI.Shipped.txt index c7d7da820..abbee3a8e 100644 --- a/src/DocumentFormat.OpenXml.Framework/PublicAPI/PublicAPI.Shipped.txt +++ b/src/DocumentFormat.OpenXml.Framework/PublicAPI/PublicAPI.Shipped.txt @@ -1009,3 +1009,4 @@ DocumentFormat.OpenXml.OpenXmlPartWriterSettings.Encoding.set -> void DocumentFormat.OpenXml.OpenXmlPartWriterSettings.OpenXmlPartWriterSettings() -> void DocumentFormat.OpenXml.OpenXmlPartWriter.OpenXmlPartWriter(DocumentFormat.OpenXml.Packaging.OpenXmlPart! openXmlPart, DocumentFormat.OpenXml.OpenXmlPartWriterSettings! settings) -> void DocumentFormat.OpenXml.OpenXmlPartWriter.OpenXmlPartWriter(System.IO.Stream! partStream, DocumentFormat.OpenXml.OpenXmlPartWriterSettings! settings) -> void +virtual DocumentFormat.OpenXml.OpenXmlCompositeElement.IsValidChild(DocumentFormat.OpenXml.OpenXmlElement! element) -> bool diff --git a/test/DocumentFormat.OpenXml.Tests/ofapiTest/OpenXmlElementTest2.cs b/test/DocumentFormat.OpenXml.Tests/ofapiTest/OpenXmlElementTest2.cs index e2c8caa91..5eb785b1c 100644 --- a/test/DocumentFormat.OpenXml.Tests/ofapiTest/OpenXmlElementTest2.cs +++ b/test/DocumentFormat.OpenXml.Tests/ofapiTest/OpenXmlElementTest2.cs @@ -8,7 +8,6 @@ using DocumentFormat.OpenXml.Wordprocessing; using System; using System.IO; -using System.Xml; using Xunit; namespace DocumentFormat.OpenXml.Tests @@ -198,21 +197,6 @@ public void CanSetNullValue() Assert.Null(cell.Child); } - /// - /// A test for OpenXmlElement.GetOrAddFirstChild. - /// - [Fact] - public void GetOrAddFirstChildTest() - { - Paragraph p = new(); - Run r = p.GetOrAddFirstChild(); - Assert.NotNull(r); - Assert.Same(r, p.GetFirstChild()); - - var r2 = p.GetOrAddFirstChild(); - Assert.Same(r, r2); - } - private class WithChildElement : OpenXmlCompositeElement { public ChildElement Child @@ -240,5 +224,61 @@ internal override void ConfigureMetadata(ElementMetadata.Builder builder) builder.SetSchema(ElementType); } } + + /// + /// A test for OpenXmlElement.GetOrAddFirstChild. + /// + [Fact] + public void GetOrAddFirstChildTest() + { + Paragraph p = new(); + Run r = p.GetOrAddFirstChild(); + Assert.NotNull(r); + Assert.Same(r, p.GetFirstChild()); + + var r2 = p.GetOrAddFirstChild(); + Assert.Same(r, r2); + } + + [Fact] + public void IsValidChild_ValidChild_ReturnsTrue() + { + // Arrange + Paragraph parentElement = new(); + Run validChild = new(); + + // Act + bool result = parentElement.IsValidChild(validChild); + + // Assert + Assert.True(result); + } + + [Fact] + public void IsValidChild_InvalidChild_ReturnsFalse() + { + // Arrange + Paragraph parentElement = new(); + Table invalidChild = new(); + + // Act + bool result = parentElement.IsValidChild(invalidChild); + + // Assert + Assert.False(result); + } + + [Fact] + public void IsValidChild_NullChild_ReturnsFalse() + { + // Arrange + Paragraph parentElement = new(); + + // Act + bool result = parentElement.IsValidChild(null); + + // Assert + Assert.False(result); + } } }