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 = "- 1
- 2
"
+ 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