From 86ad4ade3a3178fad38417f98fbf7ef5fce8f887 Mon Sep 17 00:00:00 2001 From: JosVerburg Date: Fri, 17 May 2019 00:20:20 +0200 Subject: [PATCH] Determine the anyAttribute Namespace based on the NamespaceList (dotnet/corefx#37409) * Determine the anyAttribute Namespace based on the NamespaceList * Do not test the namespace attribute for full framework for intersection and union cases * Compare namespaces using string comparison in unit tests Commit migrated from https://github.com/dotnet/corefx/commit/2c22af8903522e54f71225c40ddd383b15632ae0 --- .../src/System/Xml/Schema/XmlSchemaAnyAttribute.cs | 2 +- .../XmlSchemaSet/TC_SchemaSet_AnyAttribute.cs | 82 ++++++++++++++++++---- 2 files changed, 71 insertions(+), 13 deletions(-) diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlSchemaAnyAttribute.cs b/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlSchemaAnyAttribute.cs index 9ed496b..7fb2547 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlSchemaAnyAttribute.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlSchemaAnyAttribute.cs @@ -17,7 +17,7 @@ namespace System.Xml.Schema [XmlAttribute("namespace")] public string Namespace { - get { return _ns; } + get { return _ns ?? NamespaceList.ToString(); } set { _ns = value; } } diff --git a/src/libraries/System.Private.Xml/tests/XmlSchema/XmlSchemaSet/TC_SchemaSet_AnyAttribute.cs b/src/libraries/System.Private.Xml/tests/XmlSchema/XmlSchemaSet/TC_SchemaSet_AnyAttribute.cs index 9b63d6e..5b8be30 100644 --- a/src/libraries/System.Private.Xml/tests/XmlSchema/XmlSchemaSet/TC_SchemaSet_AnyAttribute.cs +++ b/src/libraries/System.Private.Xml/tests/XmlSchema/XmlSchemaSet/TC_SchemaSet_AnyAttribute.cs @@ -5,6 +5,7 @@ using Xunit; using Xunit.Abstractions; using System.IO; +using System.Linq; using System.Xml.Schema; namespace System.Xml.Tests @@ -121,14 +122,28 @@ namespace System.Xml.Tests return XmlSchema.Read(new StringReader(xsd), null); } + public XmlSchema GetSimpleSchema(string ns, string attrNs) + { + var xsd = @" + + + + + + + "; + + return XmlSchema.Read(new StringReader(xsd), null); + } + //Intersection namespaces [Theory] //[Variation(Desc = "complextype Any ns - ##any, attrgroup Any ns2, allow ns2 attribute")] - [InlineData("##any", "ns2", "ns2", 0)] + [InlineData("##any", "ns2", "ns2", 0, "##targetNamespace")] //[Variation(Desc = "complextype Any ns - ##any, attrgroup Any ns2, not allow ns1 attribute")] [InlineData("##any", "ns2", "ns1", 1)] //[Variation(Desc = "complextype Any ns - ns2, attrgroup Any ##any, allow ns2 attribute")] - [InlineData("ns2", "##any", "ns2", 0)] + [InlineData("ns2", "##any", "ns2", 0, "##targetNamespace")] //[Variation(Desc = "complextype Any ns - ns2, attrgroup Any ##any, not allow ns1 attribute")] [InlineData("ns2", "##any", "ns1", 1)] //[Variation(Desc = "complextype Any ns - ns1 ns2, attrgroup Any ##other, not allow ns1 attribute")] @@ -148,10 +163,10 @@ namespace System.Xml.Tests //[Variation(Desc = "complextype Any ns - ns1 ns3, attrgroup Any ns1 ns2, not allow ns2 attribute")] [InlineData("ns1 ns3", "ns1 ns2", "ns2", 1)] //[Variation(Desc = "complextype Any ns - ns1 ns3, attrgroup Any ns1 ns2, allow ns1 attribute")] - [InlineData("ns1 ns3", "ns1 ns2", "ns1", 0)] + [InlineData("ns1 ns3", "ns1 ns2", "ns1", 0, "ns1")] //[Variation(Desc = "complextype Any ns - ##other, attrgroup Any ##other, not allow ns1 attribute")] [InlineData("##other", "##other", "ns1", 1)] - public void v1(string ns1, string ns2, string attrNs, int expectedError) + public void v1(string ns1, string ns2, string attrNs, int expectedError, string expectedNs = null) { XmlSchemaSet xss = new XmlSchemaSet(); xss.XmlResolver = new XmlUrlResolver(); @@ -160,26 +175,33 @@ namespace System.Xml.Tests xss.Compile(); Assert.Equal(expectedError, _errorCount); + + // Full framework does not set the namespace property for intersections and unions + if (!PlatformDetection.IsFullFramework && expectedNs != null) + { + XmlSchemaAnyAttribute attributeWildcard = ((XmlSchemaComplexType)xss.GlobalTypes[new XmlQualifiedName("t", attrNs)]).AttributeWildcard; + CompareWildcardNamespaces(expectedNs, attributeWildcard.Namespace); + } } [Theory] //[Variation(Desc = "basetype Any ns - ##any, derivedType Any ns - ns1, allow ns2 attribute")] - [InlineData("##any", "ns1", "ns2", 0)] + [InlineData("##any", "ns1", "ns2", 0, "##any")] //[Variation(Desc = "basetype Any ns - ns1, derivedType Any ns - ##any, allow ns2 attribute")] - [InlineData("ns1", "##any", "ns2", 0)] + [InlineData("ns1", "##any", "ns2", 0, "##any")] //[Variation(Desc = "basetype Any ns - ns1 ns2, derivedType Any ns - ns2 ns3 , allow ns3 attribute")] - [InlineData("ns1 ns2", "ns2 ns3", "ns3", 0)] + [InlineData("ns1 ns2", "ns2 ns3", "ns3", 0, "ns1 ns2 ##targetNamespace")] //[Variation(Desc = "basetype Any ns - ##other, derivedType Any ns - ##other , not allow current ns")] [InlineData("##other", "##other", "ns1", 1)] //[Variation(Desc = "basetype Any ns - ns1 ns2, derivedType Any ns - ##other , allow ns1")] - [InlineData("ns1 ns2", "##other", "ns1", 0)] + [InlineData("ns1 ns2", "##other", "ns1", 0, "##other")] //[Variation(Desc = "basetype Any ns - ns1 ns2, derivedType Any ns - ##other , allow ns2")] - [InlineData("ns1 ns2", "##other", "ns2", 0)] + [InlineData("ns1 ns2", "##other", "ns2", 0, "##other")] //[Variation(Desc = "basetype Any ns - ##other, derivedType Any ns - ns1 ns2 , allow ns2")] - [InlineData("##other", "ns1 ns2", "ns1", 0)] + [InlineData("##other", "ns1 ns2", "ns1", 0, "##other")] //[Variation(Desc = "basetype Any ns - ##other, derivedType Any ns - ns1 ns2 , allow ns2")] - [InlineData("##other", "ns1 ns2", "ns2", 0)] - public void v2(string ns1, string ns2, string attrNs, int expectedError) + [InlineData("##other", "ns1 ns2", "ns2", 0, "##other")] + public void v2(string ns1, string ns2, string attrNs, int expectedError, string expectedNs = null) { XmlSchemaSet xss = new XmlSchemaSet(); xss.XmlResolver = new XmlUrlResolver(); @@ -188,6 +210,42 @@ namespace System.Xml.Tests xss.Compile(); Assert.Equal(expectedError, _errorCount); + + // Full framework does not set the namespace property for intersections and unions + if (!PlatformDetection.IsFullFramework && expectedNs != null) + { + XmlSchemaAnyAttribute attributeWildcard = ((XmlSchemaComplexType)xss.GlobalTypes[new XmlQualifiedName("t1", attrNs)]).AttributeWildcard; + CompareWildcardNamespaces(expectedNs, attributeWildcard.Namespace); + } + } + + [Theory] + //[Variation(Desc = "ns - ##any, allow any attribute")] + [InlineData("##any", "ns1", "##any")] + //[Variation(Desc = "ns - ##other, not allow ns1 attribute")] + [InlineData("##other", "ns1", "##other")] + //[Variation(Desc = "ns - ns1 ns2, allow ns1 and ns2 attribute")] + [InlineData("ns1 ns2", "ns1", "ns1 ns2")] + //[Variation(Desc = "##targetNamespace, allow current ns")] + [InlineData("##targetNamespace", "ns1", "##targetNamespace")] + public void v3(string ns, string attrNs, string expectedNs) + { + XmlSchemaSet xss = new XmlSchemaSet(); + xss.XmlResolver = new XmlUrlResolver(); + xss.ValidationEventHandler += new ValidationEventHandler(ValidationCallback); + xss.Add(GetSimpleSchema(ns, attrNs)); + xss.Compile(); + + XmlSchemaAnyAttribute attributeWildcard = ((XmlSchemaComplexType)xss.GlobalTypes[new XmlQualifiedName("t", attrNs)]).AttributeWildcard; + CompareWildcardNamespaces(expectedNs, attributeWildcard.Namespace); + } + + private static void CompareWildcardNamespaces(string expected, string actual) + { + var orderedExpected = string.Join(" ", expected.Split(' ').OrderBy(ns => ns)); + var orderedActual = string.Join(" ", actual.Split(' ').OrderBy(ns => ns)); + + Assert.Equal(orderedExpected, orderedActual); } } } -- 2.7.4