diff --git a/tests/FSharp.Data.Core.Tests/FSharp.Data.Core.Tests.fsproj b/tests/FSharp.Data.Core.Tests/FSharp.Data.Core.Tests.fsproj index 94f0b2e9b..cbf4056b0 100644 --- a/tests/FSharp.Data.Core.Tests/FSharp.Data.Core.Tests.fsproj +++ b/tests/FSharp.Data.Core.Tests/FSharp.Data.Core.Tests.fsproj @@ -41,6 +41,8 @@ + + diff --git a/tests/FSharp.Data.Core.Tests/XmlRuntime.fs b/tests/FSharp.Data.Core.Tests/XmlRuntime.fs new file mode 100644 index 000000000..ad0854f6e --- /dev/null +++ b/tests/FSharp.Data.Core.Tests/XmlRuntime.fs @@ -0,0 +1,67 @@ +module FSharp.Data.Tests.XmlRuntime + +open FsUnit +open NUnit.Framework +open System +open System.IO +open System.Xml.Linq +open System.Reflection +open FSharp.Data.Runtime.BaseTypes + +// These tests use reflection to test the XmlElement methods that are marked as "generated code only" +// This approach allows us to test the functionality while respecting the compiler constraints + +[] +let ``XmlElement.Create via reflection creates proper element from XElement`` () = + let xelem = XElement(XName.Get("test"), "content") + let createMethod = typeof.GetMethod("Create", [| typeof |]) + let xmlElement = createMethod.Invoke(null, [| xelem |]) :?> XmlElement + xmlElement.XElement.Name.LocalName |> should equal "test" + xmlElement.XElement.Value |> should equal "content" + +[] +let ``XmlElement.Create via reflection from TextReader parses XML correctly`` () = + let xml = "value" + use reader = new StringReader(xml) + let createMethod = typeof.GetMethod("Create", [| typeof |]) + let xmlElement = createMethod.Invoke(null, [| reader |]) :?> XmlElement + xmlElement.XElement.Name.LocalName |> should equal "root" + xmlElement.XElement.Element(XName.Get("child")).Value |> should equal "value" + +[] +let ``XmlElement.CreateList via reflection parses multiple elements correctly`` () = + let xml = "12" + use reader = new StringReader(xml) + let createListMethod = typeof.GetMethod("CreateList", [| typeof |]) + let elements = createListMethod.Invoke(null, [| reader |]) :?> XmlElement[] + elements.Length |> should equal 2 + elements.[0].XElement.Value |> should equal "1" + elements.[1].XElement.Value |> should equal "2" + +[] +let ``XmlElement ToString returns XElement string representation`` () = + let xelem = XElement(XName.Get("test"), "content") + let createMethod = typeof.GetMethod("Create", [| typeof |]) + let xmlElement = createMethod.Invoke(null, [| xelem |]) :?> XmlElement + xmlElement.ToString() |> should contain "content" + +[] +let ``XmlElement _Print property truncates long strings`` () = + let longContent = String.replicate 600 "a" + let xelem = XElement(XName.Get("test"), longContent) + let createMethod = typeof.GetMethod("Create", [| typeof |]) + let xmlElement = createMethod.Invoke(null, [| xelem |]) :?> XmlElement + let printProperty = typeof.GetProperty("_Print") + let printed = printProperty.GetValue(xmlElement) :?> string + printed.Length |> should equal 512 + printed |> should endWith "..." + +[] +let ``XmlElement _Print property handles short strings`` () = + let xelem = XElement(XName.Get("test"), "short") + let createMethod = typeof.GetMethod("Create", [| typeof |]) + let xmlElement = createMethod.Invoke(null, [| xelem |]) :?> XmlElement + let printProperty = typeof.GetProperty("_Print") + let printed = printProperty.GetValue(xmlElement) :?> string + printed |> should not' (endWith "...") + printed |> should contain "short" \ No newline at end of file diff --git a/tests/FSharp.Data.Core.Tests/XmlSchema.fs b/tests/FSharp.Data.Core.Tests/XmlSchema.fs new file mode 100644 index 000000000..5ecf0fb5b --- /dev/null +++ b/tests/FSharp.Data.Core.Tests/XmlSchema.fs @@ -0,0 +1,91 @@ +module FSharp.Data.Tests.XmlSchema + +open FsUnit +open NUnit.Framework +open System +open System.IO +open FSharp.Data.Runtime.XmlSchema + +[] +let ``ResolutionFolderResolver.ResolveUri handles absolute web URIs`` () = + let resolver = ResolutionFolderResolver("") + let baseUri = Uri("http://example.com/") + let relativeUri = "schema.xsd" + let result = resolver.ResolveUri(baseUri, relativeUri) + result.ToString() |> should equal "http://example.com/schema.xsd" + +[] +let ``ResolutionFolderResolver.ResolveUri uses resolution folder when base is null`` () = + let resolver = ResolutionFolderResolver("http://example.com/schemas/") + let result = resolver.ResolveUri(null, "schema.xsd") + result.ToString() |> should equal "http://example.com/schemas/schema.xsd" + +[] +let ``ResolutionFolderResolver.ResolveUri handles empty resolution folder`` () = + let resolver = ResolutionFolderResolver("") + let baseUri = Uri("http://example.com/") + let result = resolver.ResolveUri(baseUri, "schema.xsd") + result.ToString() |> should equal "http://example.com/schema.xsd" + +[] +let ``ResolutionFolderResolver.ResolveUri adds trailing slash when needed`` () = + let resolver = ResolutionFolderResolver("http://example.com/schemas") + let result = resolver.ResolveUri(null, "schema.xsd") + result.ToString() |> should equal "http://example.com/schemas/schema.xsd" + +[] +let ``parseSchema creates XmlSchemaSet from XSD text`` () = + let xsdText = """ + + +""" + let schemaSet = parseSchema "" xsdText + schemaSet.Count |> should equal 1 + +[] +let ``parseSchema handles resolution folder parameter`` () = + let xsdText = """ + + +""" + let schemaSet = parseSchema "http://example.com/schemas/" xsdText + schemaSet.Count |> should equal 1 + +[] +let ``parseSchemaFromTextReader creates XmlSchemaSet from TextReader`` () = + let xsdText = """ + + +""" + use reader = new StringReader(xsdText) + let schemaSet = parseSchemaFromTextReader "" reader + schemaSet.Count |> should equal 1 + +[] +let ``parseSchemaFromTextReader handles complex schema`` () = + let xsdText = """ + + + + + + + + + +""" + use reader = new StringReader(xsdText) + let schemaSet = parseSchemaFromTextReader "" reader + schemaSet.Count |> should equal 1 + +[] +let ``parseSchema throws for invalid XSD`` () = + let invalidXsd = "not a schema" + (fun () -> parseSchema "" invalidXsd |> ignore) |> should throw typeof + +[] +let ``ResolutionFolderResolver handles relative URIs correctly`` () = + let resolver = ResolutionFolderResolver("./schemas/") + let baseUri = Uri("http://example.com/base/") + let result = resolver.ResolveUri(baseUri, "test.xsd") + result.ToString() |> should equal "http://example.com/base/test.xsd" \ No newline at end of file