Move mdsal-binding-dom-codec tests
[mdsal.git] / binding / mdsal-binding-dom-codec / src / test / java / org / opendaylight / mdsal / binding / dom / codec / impl / AnyxmlLeafTest.java
diff --git a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/AnyxmlLeafTest.java b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/AnyxmlLeafTest.java
new file mode 100644 (file)
index 0000000..0d8ad95
--- /dev/null
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.mdsal.binding.dom.codec.impl;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertThat;
+
+import java.util.Map.Entry;
+import javax.xml.transform.dom.DOMSource;
+import org.junit.Test;
+import org.opendaylight.yang.gen.v1.mdsal437.norev.Cont;
+import org.opendaylight.yang.gen.v1.mdsal437.norev.ContBuilder;
+import org.opendaylight.yang.gen.v1.mdsal437.norev.cont.ContAny;
+import org.opendaylight.yangtools.util.xml.UntrustedXML;
+import org.opendaylight.yangtools.yang.binding.AbstractOpaqueData;
+import org.opendaylight.yangtools.yang.binding.AbstractOpaqueObject;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.OpaqueData;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public class AnyxmlLeafTest extends AbstractBindingCodecTest {
+    private static final NodeIdentifier CONT_NODE_ID = new NodeIdentifier(Cont.QNAME);
+
+    private DOMSource domSource;
+    private ContainerNode cont;
+
+    @Override
+    public void before() {
+        super.before();
+
+        final Document doc = UntrustedXML.newDocumentBuilder().newDocument();
+        final Element element = doc.createElement("foo");
+        domSource = new DOMSource(element);
+
+        cont = Builders.containerBuilder()
+                .withNodeIdentifier(CONT_NODE_ID)
+                .withChild(Builders.anyXmlBuilder()
+                    .withNodeIdentifier(new NodeIdentifier(ContAny.QNAME))
+                    .withValue(domSource)
+                    .build())
+                .build();
+    }
+
+    @Test
+    public void testAnyxmlToBinding() {
+        final Entry<InstanceIdentifier<?>, DataObject> entry = registry.fromNormalizedNode(
+            YangInstanceIdentifier.create(CONT_NODE_ID), cont);
+        assertEquals(InstanceIdentifier.create(Cont.class), entry.getKey());
+        final DataObject ldo = entry.getValue();
+        assertThat(ldo, instanceOf(Cont.class));
+
+        // So no... GrpAny should be null ..
+        final Cont contValue = (Cont) ldo;
+        assertNull(contValue.getGrpAny());
+
+        // ContAny is interesting
+        final ContAny anyCont = contValue.getContAny();
+        assertNotNull(anyCont);
+        assertEquals(ContAny.class, anyCont.implementedInterface());
+
+        final OpaqueData<?> value = anyCont.getValue();
+        assertNotNull(value);
+        assertEquals(DOMSource.class, value.getObjectModel());
+        assertSame(domSource, value.getData());
+
+        // Stable hashCode
+        final int hashOne = anyCont.hashCode();
+        final int hashTwo = anyCont.hashCode();
+        assertEquals(hashOne, hashTwo);
+
+        // Basic equality
+        assertNotEquals(anyCont, null);
+        assertEquals(anyCont, anyCont);
+        assertEquals(new FakeCont(), anyCont);
+        assertEquals(anyCont, new FakeCont());
+        assertNotEquals(anyCont, new TestNormalizedNodeCont());
+        assertNotEquals(new TestNormalizedNodeCont(), anyCont);
+    }
+
+    @Test
+    public void testAnyxmlFromBinding() {
+        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry = registry.toNormalizedNode(
+            InstanceIdentifier.create(Cont.class), new ContBuilder().setContAny(new FakeCont()).build());
+        assertEquals(YangInstanceIdentifier.create(CONT_NODE_ID), entry.getKey());
+        assertEquals(cont, entry.getValue());
+    }
+
+    private final class FakeData extends AbstractOpaqueData<DOMSource> {
+        @Override
+        public Class<DOMSource> getObjectModel() {
+            return DOMSource.class;
+        }
+
+        @Override
+        public DOMSource getData() {
+            return domSource;
+        }
+    }
+
+    private abstract static class AbstractTestCont extends AbstractOpaqueObject<ContAny> implements ContAny {
+
+    }
+
+    private final class FakeCont extends AbstractTestCont {
+        @Override
+        public OpaqueData<?> getValue() {
+            return new FakeData();
+        }
+    }
+
+    private final class TestNormalizedNodeCont extends AbstractTestCont {
+        @Override
+        public OpaqueData<?> getValue() {
+            return new AbstractOpaqueData<NormalizedNode>() {
+
+                @Override
+                public Class<NormalizedNode> getObjectModel() {
+                    return NormalizedNode.class;
+                }
+
+                @Override
+                public NormalizedNode getData() {
+                    return cont;
+                }
+            };
+        }
+    }
+}