diff --git a/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMSourcedElementImpl.java b/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMSourcedElementImpl.java
index 7abc6ca..cd7eb74 100644
--- a/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMSourcedElementImpl.java
+++ b/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMSourcedElementImpl.java
@@ -315,14 +315,16 @@
                             readerLocalName + ", not the expected " + getLocalName());
                 }
             }
-            String readerURI = readerFromDS.getNamespaceURI();
-            readerURI = (readerURI == null) ? "" : readerURI;
-            String uri = (getNamespace() == null) ? "" : getNamespace().getNamespaceURI();
-            if (!readerURI.equals(uri)) {
-                log.error("forceExpand: expected element namespace " +
-                        getLocalName() + ", found " + uri);
-                throw new RuntimeException("Element namespace from data source is " +
-                        readerURI + ", not the expected " + uri);
+            if (definedNamespaceSet) {
+                String readerURI = readerFromDS.getNamespaceURI();
+                readerURI = (readerURI == null) ? "" : readerURI;
+                String uri = (getNamespace() == null) ? "" : getNamespace().getNamespaceURI();
+                if (!readerURI.equals(uri)) {
+                    log.error("forceExpand: expected element namespace " +
+                            getLocalName() + ", found " + uri);
+                    throw new RuntimeException("Element namespace from data source is " +
+                            readerURI + ", not the expected " + uri);
+                }
             }
 
             // Set the builder for this element. Note that the StAXOMBuilder constructor will also
diff --git a/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java b/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java
index 4d4aa9c..473eb7d 100644
--- a/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java
+++ b/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java
@@ -31,6 +31,7 @@
 import org.apache.axiom.ts.om.container.SerializeToOutputStream;
 import org.apache.axiom.ts.om.factory.CreateOMElementParentSupplier;
 import org.apache.axiom.ts.om.factory.CreateOMElementVariant;
+import org.apache.axiom.ts.om.sourcedelement.OMSourcedElementVariant;
 import org.apache.axiom.ts.om.xpath.AXIOMXPathTestCase;
 import org.apache.axiom.ts.om.xpath.TestAXIOMXPath;
 
@@ -44,6 +45,11 @@
         new SerializeToOutputStream(true),
         new SerializeToOutputStream(false) };
     
+    private static final QName[] qnames = {
+        new QName("root"),
+        new QName("urn:test", "root", "p"),
+        new QName("urn:test", "root") };
+    
     private final OMMetaFactory metaFactory;
     private final boolean supportsOMSourcedElement;
     
@@ -324,16 +330,18 @@
         addTest(new org.apache.axiom.ts.om.node.TestInsertSiblingBeforeOnOrphan(metaFactory));
         addTest(new org.apache.axiom.ts.om.node.TestInsertSiblingBeforeOnSelf(metaFactory));
         if (supportsOMSourcedElement) {
+            for (int i=0; i<OMSourcedElementVariant.INSTANCES.length; i++) {
+                OMSourcedElementVariant variant = OMSourcedElementVariant.INSTANCES[i];
+                for (int j=0; j<qnames.length; j++) {
+                    QName qname = qnames[j];
+                    addTest(new org.apache.axiom.ts.om.sourcedelement.TestGetLocalName(metaFactory, variant, qname));
+                    addTest(new org.apache.axiom.ts.om.sourcedelement.TestGetNamespace(metaFactory, variant, qname));
+                    addTest(new org.apache.axiom.ts.om.sourcedelement.TestGetPrefix(metaFactory, variant, qname));
+                    addTest(new org.apache.axiom.ts.om.sourcedelement.TestGetNamespaceURI(metaFactory, variant, qname));
+                }
+            }
             addTest(new org.apache.axiom.ts.om.sourcedelement.TestComplete(metaFactory));
             addTest(new org.apache.axiom.ts.om.sourcedelement.TestExpand(metaFactory));
-            addTest(new org.apache.axiom.ts.om.sourcedelement.TestGetLocalNameFromExpansion(metaFactory));
-            addTest(new org.apache.axiom.ts.om.sourcedelement.TestGetLocalNameFromQNameAwareOMDataSource(metaFactory));
-            addTest(new org.apache.axiom.ts.om.sourcedelement.TestGetNamespaceFromExpansion(metaFactory, new QName("root")));
-            addTest(new org.apache.axiom.ts.om.sourcedelement.TestGetNamespaceFromExpansion(metaFactory, new QName("urn:test", "root", "p")));
-            addTest(new org.apache.axiom.ts.om.sourcedelement.TestGetNamespaceFromExpansion(metaFactory, new QName("urn:test", "root")));
-            addTest(new org.apache.axiom.ts.om.sourcedelement.TestGetNamespaceFromQNameAwareOMDataSource(metaFactory, new QName("root")));
-            addTest(new org.apache.axiom.ts.om.sourcedelement.TestGetNamespaceFromQNameAwareOMDataSource(metaFactory, new QName("urn:test", "root", "p")));
-            addTest(new org.apache.axiom.ts.om.sourcedelement.TestGetNamespaceFromQNameAwareOMDataSource(metaFactory, new QName("urn:test", "root")));
             addTest(new org.apache.axiom.ts.om.sourcedelement.TestGetNamespaceNormalized(metaFactory));
             addTest(new org.apache.axiom.ts.om.sourcedelement.TestGetNamespaceNormalized2(metaFactory));
             addTest(new org.apache.axiom.ts.om.sourcedelement.TestGetTextAsStreamWithNonDestructiveOMDataSource(metaFactory));
diff --git a/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/LazyNameTestCase.java b/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/LazyNameTestCase.java
new file mode 100644
index 0000000..d114be9
--- /dev/null
+++ b/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/LazyNameTestCase.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axiom.ts.om.sourcedelement;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.om.OMMetaFactory;
+import org.apache.axiom.om.OMSourcedElement;
+import org.apache.axiom.ts.AxiomTestCase;
+
+public abstract class LazyNameTestCase extends AxiomTestCase {
+    protected final OMSourcedElementVariant variant;
+    protected final QName qname;
+    
+    public LazyNameTestCase(OMMetaFactory metaFactory, OMSourcedElementVariant variant, QName qname) {
+        super(metaFactory);
+        this.variant = variant;
+        this.qname = qname;
+        addTestProperty("variant", variant.getName());
+        addTestProperty("prefix", qname.getPrefix());
+        addTestProperty("uri", qname.getNamespaceURI());
+    }
+    
+    protected final void runTest() throws Throwable {
+        runTest(variant.createOMSourcedElement(metaFactory.getOMFactory(), qname));
+    }
+
+    protected abstract void runTest(OMSourcedElement element) throws Throwable;
+}
diff --git a/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/OMSourcedElementVariant.java b/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/OMSourcedElementVariant.java
new file mode 100644
index 0000000..114a845
--- /dev/null
+++ b/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/OMSourcedElementVariant.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axiom.ts.om.sourcedelement;
+
+import java.io.StringReader;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMSourcedElement;
+import org.apache.axiom.om.ds.WrappedTextNodeOMDataSourceFromReader;
+
+public abstract class OMSourcedElementVariant {
+    public static final OMSourcedElementVariant[] INSTANCES = {
+        new OMSourcedElementVariant("qname-aware-source", false, false, false) {
+            public OMSourcedElement createOMSourcedElement(OMFactory factory, QName qname) {
+                return factory.createOMElement(new WrappedTextNodeOMDataSourceFromReader(qname, new StringReader("test")));
+            }
+        },
+        new OMSourcedElementVariant("unknown-name", true, true, true) {
+            public OMSourcedElement createOMSourcedElement(OMFactory factory, QName qname) {
+                // TODO: can't use createOMElement(QName) here because it would generate a prefix if the prefix in the QName is empty
+                OMElement orgElement = factory.createOMElement(qname.getLocalPart(), qname.getNamespaceURI(), qname.getPrefix());
+                return factory.createOMElement(new TestDataSource(orgElement.toString()));
+            }
+        }
+    };
+    
+    private final String name;
+    private final boolean localNameRequiresExpansion;
+    private final boolean namespaceURIRequiresExpansion;
+    private final boolean prefixRequiresExpansion;
+
+    public OMSourcedElementVariant(String name, boolean localNameRequiresExpansion,
+            boolean namespaceURIRequiresExpansion,
+            boolean prefixRequiresExpansion) {
+        this.name = name;
+        this.localNameRequiresExpansion = localNameRequiresExpansion;
+        this.namespaceURIRequiresExpansion = namespaceURIRequiresExpansion;
+        this.prefixRequiresExpansion = prefixRequiresExpansion;
+    }
+
+    public String getName() {
+        return name;
+    }
+    
+    public boolean isLocalNameRequiresExpansion() {
+        return localNameRequiresExpansion;
+    }
+
+    public boolean isNamespaceURIRequiresExpansion() {
+        return namespaceURIRequiresExpansion;
+    }
+
+    public boolean isPrefixRequiresExpansion() {
+        return prefixRequiresExpansion;
+    }
+
+    public abstract OMSourcedElement createOMSourcedElement(OMFactory factory, QName qname);
+}
diff --git a/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestGetLocalName.java b/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestGetLocalName.java
new file mode 100644
index 0000000..0ff06cc
--- /dev/null
+++ b/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestGetLocalName.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axiom.ts.om.sourcedelement;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.om.OMMetaFactory;
+import org.apache.axiom.om.OMSourcedElement;
+
+public class TestGetLocalName extends LazyNameTestCase {
+    public TestGetLocalName(OMMetaFactory metaFactory, OMSourcedElementVariant variant, QName qname) {
+        super(metaFactory, variant, qname);
+    }
+
+    protected void runTest(OMSourcedElement element) throws Throwable {
+        assertEquals(qname.getLocalPart(), element.getLocalName());
+        if (variant.isLocalNameRequiresExpansion()) {
+            assertTrue(element.isExpanded());
+        } else {
+            assertFalse(element.isExpanded());
+        }
+    }
+}
diff --git a/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestGetLocalNameFromExpansion.java b/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestGetLocalNameFromExpansion.java
deleted file mode 100644
index b5bc5fe..0000000
--- a/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestGetLocalNameFromExpansion.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.axiom.ts.om.sourcedelement;
-
-import org.apache.axiom.om.OMFactory;
-import org.apache.axiom.om.OMMetaFactory;
-import org.apache.axiom.om.OMNamedInformationItem;
-import org.apache.axiom.om.OMSourcedElement;
-import org.apache.axiom.ts.AxiomTestCase;
-
-/**
- * Tests that {@link OMNamedInformationItem#getLocalName()} expands the element if the local name is
- * not known in advance.
- */
-public class TestGetLocalNameFromExpansion extends AxiomTestCase {
-    public TestGetLocalNameFromExpansion(OMMetaFactory metaFactory) {
-        super(metaFactory);
-    }
-
-    protected void runTest() throws Throwable {
-        OMFactory factory = metaFactory.getOMFactory();
-        OMSourcedElement element = factory.createOMElement(new TestDataSource("<root ns='urn:test'/>"));
-        assertEquals("root", element.getLocalName());
-        assertTrue(element.isExpanded());
-    }
-}
diff --git a/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestGetLocalNameFromQNameAwareOMDataSource.java b/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestGetLocalNameFromQNameAwareOMDataSource.java
deleted file mode 100644
index 00e9b42..0000000
--- a/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestGetLocalNameFromQNameAwareOMDataSource.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.axiom.ts.om.sourcedelement;
-
-import java.io.StringReader;
-
-import javax.xml.namespace.QName;
-
-import org.apache.axiom.om.OMFactory;
-import org.apache.axiom.om.OMMetaFactory;
-import org.apache.axiom.om.OMNamedInformationItem;
-import org.apache.axiom.om.OMSourcedElement;
-import org.apache.axiom.om.QNameAwareOMDataSource;
-import org.apache.axiom.om.ds.WrappedTextNodeOMDataSourceFromReader;
-import org.apache.axiom.ts.AxiomTestCase;
-
-/**
- * Tests that {@link OMNamedInformationItem#getLocalName()} behaves correctly on a
- * {@link OMSourcedElement} backed by a {@link QNameAwareOMDataSource}.
- */
-public class TestGetLocalNameFromQNameAwareOMDataSource extends AxiomTestCase {
-    public TestGetLocalNameFromQNameAwareOMDataSource(OMMetaFactory metaFactory) {
-        super(metaFactory);
-    }
-
-    protected void runTest() throws Throwable {
-        OMFactory factory = metaFactory.getOMFactory();
-        OMSourcedElement element = factory.createOMElement(
-                new WrappedTextNodeOMDataSourceFromReader(new QName("root"), new StringReader("test")));
-        assertEquals("root", element.getLocalName());
-        assertFalse(element.isExpanded());
-    }
-}
diff --git a/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestGetNamespace.java b/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestGetNamespace.java
new file mode 100644
index 0000000..05019e7
--- /dev/null
+++ b/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestGetNamespace.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axiom.ts.om.sourcedelement;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.om.OMMetaFactory;
+import org.apache.axiom.om.OMNamespace;
+import org.apache.axiom.om.OMSourcedElement;
+
+public class TestGetNamespace extends LazyNameTestCase {
+    public TestGetNamespace(OMMetaFactory metaFactory, OMSourcedElementVariant variant, QName qname) {
+        super(metaFactory, variant, qname);
+    }
+
+    protected void runTest(OMSourcedElement element) throws Throwable {
+        OMNamespace ns = element.getNamespace();
+        if (qname.getNamespaceURI().length() == 0) {
+            assertNull(ns);
+        } else {
+            assertEquals(qname.getNamespaceURI(), ns.getNamespaceURI());
+            assertEquals(qname.getPrefix(), ns.getPrefix());
+        }
+        if (variant.isNamespaceURIRequiresExpansion() || variant.isPrefixRequiresExpansion()) {
+            assertTrue(element.isExpanded());
+        } else {
+            assertFalse(element.isExpanded());
+        }
+    }
+}
diff --git a/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestGetNamespaceFromExpansion.java b/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestGetNamespaceFromExpansion.java
deleted file mode 100644
index ff8be64..0000000
--- a/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestGetNamespaceFromExpansion.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.axiom.ts.om.sourcedelement;
-
-import javax.xml.namespace.QName;
-
-import org.apache.axiom.om.OMElement;
-import org.apache.axiom.om.OMFactory;
-import org.apache.axiom.om.OMMetaFactory;
-import org.apache.axiom.om.OMNamedInformationItem;
-import org.apache.axiom.om.OMNamespace;
-import org.apache.axiom.om.OMSourcedElement;
-import org.apache.axiom.ts.AxiomTestCase;
-
-/**
- * Tests that {@link OMNamedInformationItem#getNamespace()} expands the element if the namespace is
- * not known in advance.
- */
-public class TestGetNamespaceFromExpansion extends AxiomTestCase {
-    private final QName qname;
-
-    public TestGetNamespaceFromExpansion(OMMetaFactory metaFactory, QName qname) {
-        super(metaFactory);
-        this.qname = qname;
-        addTestProperty("qname", qname.toString());
-    }
-
-    protected void runTest() throws Throwable {
-        OMFactory factory = metaFactory.getOMFactory();
-        OMElement orgElement = factory.createOMElement(qname);
-        OMSourcedElement element = factory.createOMElement(new TestDataSource(orgElement.toString()));
-        OMNamespace ns = element.getNamespace();
-        if (qname.getNamespaceURI().length() == 0) {
-            assertNull(ns);
-        } else {
-            assertEquals(qname.getNamespaceURI(), ns.getNamespaceURI());
-            assertEquals(qname.getPrefix(), ns.getPrefix());
-        }
-        assertTrue(element.isExpanded());
-    }
-}
diff --git a/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestGetNamespaceFromQNameAwareOMDataSource.java b/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestGetNamespaceFromQNameAwareOMDataSource.java
deleted file mode 100644
index 270fcb3..0000000
--- a/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestGetNamespaceFromQNameAwareOMDataSource.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.axiom.ts.om.sourcedelement;
-
-import java.io.StringReader;
-
-import javax.xml.namespace.QName;
-
-import org.apache.axiom.om.OMFactory;
-import org.apache.axiom.om.OMMetaFactory;
-import org.apache.axiom.om.OMNamedInformationItem;
-import org.apache.axiom.om.OMNamespace;
-import org.apache.axiom.om.OMSourcedElement;
-import org.apache.axiom.om.QNameAwareOMDataSource;
-import org.apache.axiom.om.ds.WrappedTextNodeOMDataSourceFromReader;
-import org.apache.axiom.ts.AxiomTestCase;
-
-/**
- * Tests that {@link OMNamedInformationItem#getNamespace()} behaves correctly on a
- * {@link OMSourcedElement} backed by a {@link QNameAwareOMDataSource}.
- */
-public class TestGetNamespaceFromQNameAwareOMDataSource extends AxiomTestCase {
-    private final QName qname;
-    
-    public TestGetNamespaceFromQNameAwareOMDataSource(OMMetaFactory metaFactory, QName qname) {
-        super(metaFactory);
-        this.qname = qname;
-        addTestProperty("qname", qname.toString());
-    }
-
-    protected void runTest() throws Throwable {
-        OMFactory factory = metaFactory.getOMFactory();
-        OMSourcedElement element = factory.createOMElement(
-                new WrappedTextNodeOMDataSourceFromReader(qname, new StringReader("test")));
-        OMNamespace ns = element.getNamespace();
-        if (qname.getNamespaceURI().length() == 0) {
-            assertNull(ns);
-        } else {
-            assertEquals(qname.getNamespaceURI(), ns.getNamespaceURI());
-            assertEquals(qname.getPrefix(), ns.getPrefix());
-        }
-        assertFalse(element.isExpanded());
-    }
-}
diff --git a/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestGetNamespaceURI.java b/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestGetNamespaceURI.java
new file mode 100644
index 0000000..15498a7
--- /dev/null
+++ b/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestGetNamespaceURI.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axiom.ts.om.sourcedelement;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.om.OMMetaFactory;
+import org.apache.axiom.om.OMSourcedElement;
+
+public class TestGetNamespaceURI extends LazyNameTestCase {
+    public TestGetNamespaceURI(OMMetaFactory metaFactory, OMSourcedElementVariant variant, QName qname) {
+        super(metaFactory, variant, qname);
+    }
+
+    protected void runTest(OMSourcedElement element) throws Throwable {
+        String uri = qname.getNamespaceURI();
+        if (uri.length() == 0) {
+            assertNull(element.getNamespaceURI());
+        } else {
+            assertEquals(uri, element.getNamespaceURI());
+        }
+        if (variant.isNamespaceURIRequiresExpansion()) {
+            assertTrue(element.isExpanded());
+        } else {
+            assertFalse(element.isExpanded());
+        }
+    }
+}
diff --git a/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestGetPrefix.java b/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestGetPrefix.java
new file mode 100644
index 0000000..15f477c
--- /dev/null
+++ b/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/sourcedelement/TestGetPrefix.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axiom.ts.om.sourcedelement;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.om.OMMetaFactory;
+import org.apache.axiom.om.OMSourcedElement;
+
+public class TestGetPrefix extends LazyNameTestCase {
+    public TestGetPrefix(OMMetaFactory metaFactory, OMSourcedElementVariant variant, QName qname) {
+        super(metaFactory, variant, qname);
+    }
+
+    protected void runTest(OMSourcedElement element) throws Throwable {
+        String prefix = qname.getPrefix();
+        if (prefix.length() == 0) {
+            assertNull(element.getPrefix());
+        } else {
+            assertEquals(prefix, element.getPrefix());
+        }
+        if (variant.isPrefixRequiresExpansion()) {
+            assertTrue(element.isExpanded());
+        } else {
+            assertFalse(element.isExpanded());
+        }
+    }
+}
