You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vxquery.apache.org by sj...@apache.org on 2016/05/26 17:39:55 UTC

[38/50] [abbrv] vxquery git commit: Unit tests for the sequence data model: pointable and builder classes.

Unit tests for the sequence data model: pointable and builder classes.

* Includes changes for IBuilder interface to improve the code reuse and standardization.


Project: http://git-wip-us.apache.org/repos/asf/vxquery/repo
Commit: http://git-wip-us.apache.org/repos/asf/vxquery/commit/7d7ab007
Tree: http://git-wip-us.apache.org/repos/asf/vxquery/tree/7d7ab007
Diff: http://git-wip-us.apache.org/repos/asf/vxquery/diff/7d7ab007

Branch: refs/heads/site
Commit: 7d7ab007efc874f2612f976c88fb09387efb0155
Parents: 0891910
Author: Preston Carman <pr...@apache.org>
Authored: Mon May 16 17:32:50 2016 -0700
Committer: Preston Carman <pr...@apache.org>
Committed: Mon May 16 17:32:50 2016 -0700

----------------------------------------------------------------------
 .../builders/atomic/UTF8StringBuilder.java      |   9 +-
 .../builders/base/AbstractBuilder.java          |  14 +-
 .../datamodel/builders/base/IBuilder.java       |  27 ++++
 .../builders/nodes/AbstractNodeBuilder.java     |   8 +-
 .../builders/nodes/AttributeNodeBuilder.java    |  12 +-
 .../builders/nodes/CommentNodeBuilder.java      |  11 +-
 .../builders/nodes/DocumentNodeBuilder.java     |  12 +-
 .../builders/nodes/ElementNodeBuilder.java      |  17 ++-
 .../builders/nodes/NodeSubTreeBuilder.java      |  17 +--
 .../datamodel/builders/nodes/PINodeBuilder.java |  11 +-
 .../builders/nodes/TextNodeBuilder.java         |  11 +-
 .../builders/sequence/SequenceBuilder.java      |  11 +-
 .../comparison/ValueEqComparisonOperation.java  | 128 ++++++++--------
 .../runtime/functions/util/FunctionHelper.java  |  20 ++-
 .../datamodel/AbstractPointableTest.java        |  56 +++++++
 .../vxquery/datamodel/SequenceByteTest.java     | 147 +++++++++++++++++++
 16 files changed, 358 insertions(+), 153 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/atomic/UTF8StringBuilder.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/atomic/UTF8StringBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/atomic/UTF8StringBuilder.java
index 51c026b..a4d301d 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/atomic/UTF8StringBuilder.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/atomic/UTF8StringBuilder.java
@@ -20,17 +20,15 @@ import java.io.DataOutput;
 import java.io.IOException;
 import java.io.UTFDataFormatException;
 
-import org.apache.vxquery.datamodel.builders.base.AbstractBuilder;
-import org.apache.vxquery.runtime.functions.util.FunctionHelper;
-
 import org.apache.hyracks.data.std.api.IMutableValueStorage;
 import org.apache.hyracks.data.std.primitive.BytePointable;
+import org.apache.vxquery.datamodel.builders.base.IBuilder;
+import org.apache.vxquery.runtime.functions.util.FunctionHelper;
 
-public class UTF8StringBuilder extends AbstractBuilder {
+public class UTF8StringBuilder implements IBuilder {
     private IMutableValueStorage mvs;
     private DataOutput out;
 
-    @Override
     public void reset(IMutableValueStorage mvs) throws IOException {
         this.mvs = mvs;
         out = mvs.getDataOutput();
@@ -38,7 +36,6 @@ public class UTF8StringBuilder extends AbstractBuilder {
         out.write(0);
     }
 
-    @Override
     public void finish() throws IOException {
         int utflen = mvs.getLength() - 2;
         BytePointable.setByte(mvs.getByteArray(), 0, (byte) ((utflen >>> 8) & 0xFF));

http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/base/AbstractBuilder.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/base/AbstractBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/base/AbstractBuilder.java
index bacad26..c360eed 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/base/AbstractBuilder.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/base/AbstractBuilder.java
@@ -16,12 +16,20 @@
  */
 package org.apache.vxquery.datamodel.builders.base;
 
+import java.io.DataOutput;
 import java.io.IOException;
 
 import org.apache.hyracks.data.std.api.IMutableValueStorage;
 
-public abstract class AbstractBuilder {
-    public abstract void reset(IMutableValueStorage mvs) throws IOException;
+public abstract class AbstractBuilder implements IBuilder {
+
+    protected DataOutput out;
+
+    public void reset(IMutableValueStorage mvs) throws IOException {
+        out = mvs.getDataOutput();
+        out.write(getValueTag());
+    }
+
+    public abstract int getValueTag();
 
-    public abstract void finish() throws IOException;
 }

http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/base/IBuilder.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/base/IBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/base/IBuilder.java
new file mode 100644
index 0000000..49df178
--- /dev/null
+++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/base/IBuilder.java
@@ -0,0 +1,27 @@
+/*
+ * 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.vxquery.datamodel.builders.base;
+
+import java.io.IOException;
+
+import org.apache.hyracks.data.std.api.IMutableValueStorage;
+
+public interface IBuilder {
+    public abstract void reset(IMutableValueStorage mvs) throws IOException;
+
+    public abstract void finish() throws IOException;
+}

http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/AbstractNodeBuilder.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/AbstractNodeBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/AbstractNodeBuilder.java
index 955668f..eefa834 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/AbstractNodeBuilder.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/AbstractNodeBuilder.java
@@ -16,12 +16,8 @@
  */
 package org.apache.vxquery.datamodel.builders.nodes;
 
-import java.io.IOException;
+import org.apache.vxquery.datamodel.builders.base.AbstractBuilder;
 
-import org.apache.hyracks.data.std.api.IMutableValueStorage;
+public abstract class AbstractNodeBuilder extends AbstractBuilder {
 
-public abstract class AbstractNodeBuilder {
-    public abstract void reset(IMutableValueStorage mvs) throws IOException;
-
-    public abstract void finish() throws IOException;
 }

http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/AttributeNodeBuilder.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/AttributeNodeBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/AttributeNodeBuilder.java
index 7743cd8..6d7e0f5 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/AttributeNodeBuilder.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/AttributeNodeBuilder.java
@@ -16,21 +16,16 @@
  */
 package org.apache.vxquery.datamodel.builders.nodes;
 
-import java.io.DataOutput;
 import java.io.IOException;
 
-import org.apache.vxquery.datamodel.values.ValueTag;
-
-import org.apache.hyracks.data.std.api.IMutableValueStorage;
 import org.apache.hyracks.data.std.api.IValueReference;
+import org.apache.vxquery.datamodel.values.ValueTag;
 
 public class AttributeNodeBuilder extends AbstractNodeBuilder {
-    private DataOutput out;
 
     @Override
-    public void reset(IMutableValueStorage mvs) throws IOException {
-        out = mvs.getDataOutput();
-        out.write(ValueTag.ATTRIBUTE_NODE_TAG);
+    public int getValueTag() {
+        return ValueTag.ATTRIBUTE_NODE_TAG;
     }
 
     @Override
@@ -56,4 +51,5 @@ public class AttributeNodeBuilder extends AbstractNodeBuilder {
     public void setValue(IValueReference value) throws IOException {
         out.write(value.getByteArray(), value.getStartOffset(), value.getLength());
     }
+
 }

http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/CommentNodeBuilder.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/CommentNodeBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/CommentNodeBuilder.java
index d79bb88..d596c3d 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/CommentNodeBuilder.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/CommentNodeBuilder.java
@@ -16,21 +16,16 @@
  */
 package org.apache.vxquery.datamodel.builders.nodes;
 
-import java.io.DataOutput;
 import java.io.IOException;
 
-import org.apache.vxquery.datamodel.values.ValueTag;
-
-import org.apache.hyracks.data.std.api.IMutableValueStorage;
 import org.apache.hyracks.data.std.api.IValueReference;
+import org.apache.vxquery.datamodel.values.ValueTag;
 
 public class CommentNodeBuilder extends AbstractNodeBuilder {
-    private DataOutput out;
 
     @Override
-    public void reset(IMutableValueStorage mvs) throws IOException {
-        out = mvs.getDataOutput();
-        out.write(ValueTag.COMMENT_NODE_TAG);
+    public int getValueTag() {
+        return ValueTag.COMMENT_NODE_TAG;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/DocumentNodeBuilder.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/DocumentNodeBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/DocumentNodeBuilder.java
index 47c811c..be2cb93 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/DocumentNodeBuilder.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/DocumentNodeBuilder.java
@@ -16,22 +16,17 @@
  */
 package org.apache.vxquery.datamodel.builders.nodes;
 
-import java.io.DataOutput;
 import java.io.IOException;
 
+import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 import org.apache.vxquery.datamodel.values.ValueTag;
 import org.apache.vxquery.util.GrowableIntArray;
 
-import org.apache.hyracks.data.std.api.IMutableValueStorage;
-import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
-
 public class DocumentNodeBuilder extends AbstractNodeBuilder {
     private final GrowableIntArray childrenSlots;
 
     private final ArrayBackedValueStorage childrenDataArea;
 
-    private DataOutput out;
-
     private int childrenCount;
 
     public DocumentNodeBuilder() {
@@ -40,9 +35,8 @@ public class DocumentNodeBuilder extends AbstractNodeBuilder {
     }
 
     @Override
-    public void reset(IMutableValueStorage mvs) throws IOException {
-        out = mvs.getDataOutput();
-        out.write(ValueTag.DOCUMENT_NODE_TAG);
+    public int getValueTag() {
+        return ValueTag.DOCUMENT_NODE_TAG;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/ElementNodeBuilder.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/ElementNodeBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/ElementNodeBuilder.java
index 89aaddc..dcb4b79 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/ElementNodeBuilder.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/ElementNodeBuilder.java
@@ -16,18 +16,16 @@
  */
 package org.apache.vxquery.datamodel.builders.nodes;
 
-import java.io.DataOutput;
 import java.io.IOException;
 
-import org.apache.vxquery.datamodel.accessors.nodes.ElementNodePointable;
-import org.apache.vxquery.datamodel.values.ValueTag;
-import org.apache.vxquery.util.GrowableIntArray;
-
 import org.apache.hyracks.data.std.api.IMutableValueStorage;
 import org.apache.hyracks.data.std.api.IValueReference;
 import org.apache.hyracks.data.std.primitive.BytePointable;
 import org.apache.hyracks.data.std.primitive.IntegerPointable;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
+import org.apache.vxquery.datamodel.accessors.nodes.ElementNodePointable;
+import org.apache.vxquery.datamodel.values.ValueTag;
+import org.apache.vxquery.util.GrowableIntArray;
 
 public class ElementNodeBuilder extends AbstractNodeBuilder {
     private final GrowableIntArray attrSlots;
@@ -40,8 +38,6 @@ public class ElementNodeBuilder extends AbstractNodeBuilder {
 
     private IMutableValueStorage mvs;
 
-    private DataOutput out;
-
     private int headerOffset;
 
     private int nsChunkStart;
@@ -60,10 +56,15 @@ public class ElementNodeBuilder extends AbstractNodeBuilder {
     }
 
     @Override
+    public int getValueTag() {
+        return ValueTag.ELEMENT_NODE_TAG;
+    }
+
+    @Override
     public void reset(IMutableValueStorage mvs) throws IOException {
         this.mvs = mvs;
         out = mvs.getDataOutput();
-        out.write(ValueTag.ELEMENT_NODE_TAG);
+        out.write(getValueTag());
         headerOffset = mvs.getLength();
         out.write(0);
     }

http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/NodeSubTreeBuilder.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/NodeSubTreeBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/NodeSubTreeBuilder.java
index 5eb08df..a746492 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/NodeSubTreeBuilder.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/NodeSubTreeBuilder.java
@@ -16,22 +16,17 @@
  */
 package org.apache.vxquery.datamodel.builders.nodes;
 
-import java.io.DataOutput;
 import java.io.IOException;
 
 import org.apache.vxquery.datamodel.accessors.TaggedValuePointable;
 import org.apache.vxquery.datamodel.accessors.nodes.NodeTreePointable;
 import org.apache.vxquery.datamodel.values.ValueTag;
 
-import org.apache.hyracks.data.std.api.IMutableValueStorage;
-
 public class NodeSubTreeBuilder extends AbstractNodeBuilder {
-    private DataOutput mainOut;
 
     @Override
-    public void reset(IMutableValueStorage mvs) throws IOException {
-        mainOut = mvs.getDataOutput();
-        mainOut.write(ValueTag.NODE_TREE_TAG);
+    public int getValueTag() {
+        return ValueTag.NODE_TREE_TAG;
     }
 
     @Override
@@ -46,14 +41,14 @@ public class NodeSubTreeBuilder extends AbstractNodeBuilder {
         if (hasNodeIds) {
             header |= NodeTreePointable.HEADER_NODEID_EXISTS_MASK;
         }
-        mainOut.write(header);
+        out.write(header);
         if (hasNodeIds) {
-            mainOut.writeInt(ntp.getRootNodeId());
+            out.writeInt(ntp.getRootNodeId());
         }
         if (hasDictionary) {
-            mainOut.write(ntp.getByteArray(), ntp.getDictionaryOffset(), ntp.getDictionarySize());
+            out.write(ntp.getByteArray(), ntp.getDictionaryOffset(), ntp.getDictionarySize());
         }
-        mainOut.write(itemTvp.getByteArray(), itemTvp.getStartOffset(), itemTvp.getLength());
+        out.write(itemTvp.getByteArray(), itemTvp.getStartOffset(), itemTvp.getLength());
     }
 
     private boolean hasDictionary(byte tag) {

http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/PINodeBuilder.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/PINodeBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/PINodeBuilder.java
index ee37511..0e62762 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/PINodeBuilder.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/PINodeBuilder.java
@@ -16,21 +16,16 @@
  */
 package org.apache.vxquery.datamodel.builders.nodes;
 
-import java.io.DataOutput;
 import java.io.IOException;
 
-import org.apache.vxquery.datamodel.values.ValueTag;
-
-import org.apache.hyracks.data.std.api.IMutableValueStorage;
 import org.apache.hyracks.data.std.api.IValueReference;
+import org.apache.vxquery.datamodel.values.ValueTag;
 
 public class PINodeBuilder extends AbstractNodeBuilder {
-    private DataOutput out;
 
     @Override
-    public void reset(IMutableValueStorage mvs) throws IOException {
-        out = mvs.getDataOutput();
-        out.write(ValueTag.PI_NODE_TAG);
+    public int getValueTag() {
+        return ValueTag.PI_NODE_TAG;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/TextNodeBuilder.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/TextNodeBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/TextNodeBuilder.java
index 84ee20e..67aa487 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/TextNodeBuilder.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/nodes/TextNodeBuilder.java
@@ -16,21 +16,16 @@
  */
 package org.apache.vxquery.datamodel.builders.nodes;
 
-import java.io.DataOutput;
 import java.io.IOException;
 
-import org.apache.vxquery.datamodel.values.ValueTag;
-
-import org.apache.hyracks.data.std.api.IMutableValueStorage;
 import org.apache.hyracks.data.std.api.IValueReference;
+import org.apache.vxquery.datamodel.values.ValueTag;
 
 public class TextNodeBuilder extends AbstractNodeBuilder {
-    private DataOutput out;
 
     @Override
-    public void reset(IMutableValueStorage mvs) throws IOException {
-        out = mvs.getDataOutput();
-        out.write(ValueTag.TEXT_NODE_TAG);
+    public int getValueTag() {
+        return ValueTag.TEXT_NODE_TAG;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/sequence/SequenceBuilder.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/sequence/SequenceBuilder.java b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/sequence/SequenceBuilder.java
index 12f4ad7..fbea148 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/sequence/SequenceBuilder.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/datamodel/builders/sequence/SequenceBuilder.java
@@ -19,21 +19,18 @@ package org.apache.vxquery.datamodel.builders.sequence;
 import java.io.DataOutput;
 import java.io.IOException;
 
-import org.apache.vxquery.datamodel.values.ValueTag;
-import org.apache.vxquery.util.GrowableIntArray;
-
 import org.apache.hyracks.data.std.api.IMutableValueStorage;
 import org.apache.hyracks.data.std.api.IValueReference;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
+import org.apache.vxquery.datamodel.builders.base.IBuilder;
+import org.apache.vxquery.datamodel.values.ValueTag;
+import org.apache.vxquery.util.GrowableIntArray;
 
-public class SequenceBuilder {
+public class SequenceBuilder implements IBuilder {
     private final GrowableIntArray slots = new GrowableIntArray();
     private final ArrayBackedValueStorage dataArea = new ArrayBackedValueStorage();
     private IMutableValueStorage mvs;
 
-    public SequenceBuilder() {
-    }
-
     public void reset(IMutableValueStorage mvs) {
         this.mvs = mvs;
         slots.clear();

http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/ValueEqComparisonOperation.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/ValueEqComparisonOperation.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/ValueEqComparisonOperation.java
index f4eb340..fd7bc31 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/ValueEqComparisonOperation.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/comparison/ValueEqComparisonOperation.java
@@ -29,7 +29,7 @@ import org.apache.vxquery.datamodel.accessors.atomic.XSQNamePointable;
 import org.apache.vxquery.datamodel.accessors.atomic.XSTimePointable;
 import org.apache.vxquery.datamodel.util.DateTime;
 import org.apache.vxquery.exceptions.SystemException;
-
+import org.apache.vxquery.runtime.functions.util.FunctionHelper;
 import org.apache.hyracks.data.std.primitive.BooleanPointable;
 import org.apache.hyracks.data.std.primitive.DoublePointable;
 import org.apache.hyracks.data.std.primitive.FloatPointable;
@@ -52,13 +52,12 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation
     @Override
     public boolean operateBase64BinaryBase64Binary(XSBinaryPointable binaryp1, XSBinaryPointable binaryp2)
             throws SystemException, IOException {
-        return arraysEqual(binaryp1.getByteArray(), binaryp1.getStartOffset(), binaryp1.getLength(),
-                binaryp2.getByteArray(), binaryp2.getStartOffset(), binaryp2.getLength());
+        return FunctionHelper.arraysEqual(binaryp1, binaryp2);
     }
 
     @Override
-    public boolean operateBooleanBoolean(BooleanPointable boolp1, BooleanPointable boolp2) throws SystemException,
-            IOException {
+    public boolean operateBooleanBoolean(BooleanPointable boolp1, BooleanPointable boolp2)
+            throws SystemException, IOException {
         return (boolp1.compareTo(boolp2) == 0);
     }
 
@@ -73,8 +72,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation
         int startOffset2 = startOffset1 + 1 + XSDateTimePointable.TYPE_TRAITS.getFixedLength();
         if (XSDateTimePointable.getYearMonth(abvsInner.getByteArray(), startOffset1) == XSDateTimePointable
                 .getYearMonth(abvsInner.getByteArray(), startOffset2)
-                && XSDateTimePointable.getDay(abvsInner.getByteArray(), startOffset1) == XSDateTimePointable.getDay(
-                        abvsInner.getByteArray(), startOffset2)) {
+                && XSDateTimePointable.getDay(abvsInner.getByteArray(), startOffset1) == XSDateTimePointable
+                        .getDay(abvsInner.getByteArray(), startOffset2)) {
             return true;
         }
         return false;
@@ -99,14 +98,14 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation
     }
 
     @Override
-    public boolean operateDecimalDecimal(XSDecimalPointable decp1, XSDecimalPointable decp2) throws SystemException,
-            IOException {
+    public boolean operateDecimalDecimal(XSDecimalPointable decp1, XSDecimalPointable decp2)
+            throws SystemException, IOException {
         return (decp1.compareTo(decp2) == 0);
     }
 
     @Override
-    public boolean operateDecimalDouble(XSDecimalPointable decp1, DoublePointable doublep2) throws SystemException,
-            IOException {
+    public boolean operateDecimalDouble(XSDecimalPointable decp1, DoublePointable doublep2)
+            throws SystemException, IOException {
         double double1 = decp1.doubleValue();
         double double2 = doublep2.doubleValue();
         if (Double.isNaN(doublep2.getDouble())) {
@@ -116,8 +115,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation
     }
 
     @Override
-    public boolean operateDecimalFloat(XSDecimalPointable decp1, FloatPointable floatp2) throws SystemException,
-            IOException {
+    public boolean operateDecimalFloat(XSDecimalPointable decp1, FloatPointable floatp2)
+            throws SystemException, IOException {
         float float1 = decp1.floatValue();
         float float2 = floatp2.floatValue();
         if (Float.isNaN(floatp2.getFloat())) {
@@ -127,18 +126,19 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation
     }
 
     @Override
-    public boolean operateDecimalInteger(XSDecimalPointable decp1, LongPointable longp2) throws SystemException,
-            IOException {
+    public boolean operateDecimalInteger(XSDecimalPointable decp1, LongPointable longp2)
+            throws SystemException, IOException {
         abvsInner.reset();
         XSDecimalPointable decp2 = (XSDecimalPointable) XSDecimalPointable.FACTORY.createPointable();
-        decp2.set(abvsInner.getByteArray(), abvsInner.getStartOffset(), XSDecimalPointable.TYPE_TRAITS.getFixedLength());
+        decp2.set(abvsInner.getByteArray(), abvsInner.getStartOffset(),
+                XSDecimalPointable.TYPE_TRAITS.getFixedLength());
         decp2.setDecimal(longp2.getLong(), (byte) 0);
         return (decp1.compareTo(decp2) == 0);
     }
 
     @Override
-    public boolean operateDoubleDecimal(DoublePointable doublep1, XSDecimalPointable decp2) throws SystemException,
-            IOException {
+    public boolean operateDoubleDecimal(DoublePointable doublep1, XSDecimalPointable decp2)
+            throws SystemException, IOException {
         double double1 = doublep1.doubleValue();
         double double2 = decp2.doubleValue();
         if (Double.isNaN(doublep1.getDouble())) {
@@ -148,8 +148,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation
     }
 
     @Override
-    public boolean operateDoubleDouble(DoublePointable doublep1, DoublePointable doublep2) throws SystemException,
-            IOException {
+    public boolean operateDoubleDouble(DoublePointable doublep1, DoublePointable doublep2)
+            throws SystemException, IOException {
         if (Double.isNaN(doublep1.getDouble()) || Double.isNaN(doublep2.getDouble())) {
             return false;
         }
@@ -157,8 +157,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation
     }
 
     @Override
-    public boolean operateDoubleFloat(DoublePointable doublep1, FloatPointable floatp2) throws SystemException,
-            IOException {
+    public boolean operateDoubleFloat(DoublePointable doublep1, FloatPointable floatp2)
+            throws SystemException, IOException {
         double double1 = doublep1.doubleValue();
         double double2 = floatp2.doubleValue();
         if (Double.isNaN(doublep1.getDouble()) || Float.isNaN(floatp2.getFloat())) {
@@ -168,8 +168,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation
     }
 
     @Override
-    public boolean operateDoubleInteger(DoublePointable doublep1, LongPointable longp2) throws SystemException,
-            IOException {
+    public boolean operateDoubleInteger(DoublePointable doublep1, LongPointable longp2)
+            throws SystemException, IOException {
         double double1 = doublep1.doubleValue();
         double double2 = longp2.doubleValue();
         if (Double.isNaN(doublep1.getDouble())) {
@@ -179,8 +179,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation
     }
 
     @Override
-    public boolean operateDTDurationDTDuration(LongPointable longp1, LongPointable longp2) throws SystemException,
-            IOException {
+    public boolean operateDTDurationDTDuration(LongPointable longp1, LongPointable longp2)
+            throws SystemException, IOException {
         return (longp1.compareTo(longp2) == 0);
     }
 
@@ -194,8 +194,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation
     }
 
     @Override
-    public boolean operateDTDurationYMDuration(LongPointable longp1, IntegerPointable intp2) throws SystemException,
-            IOException {
+    public boolean operateDTDurationYMDuration(LongPointable longp1, IntegerPointable intp2)
+            throws SystemException, IOException {
         if (longp1.getLong() == 0 && intp2.getInteger() == 0) {
             return true;
         }
@@ -214,8 +214,7 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation
     @Override
     public boolean operateDurationDuration(XSDurationPointable durationp1, XSDurationPointable durationp2)
             throws SystemException, IOException {
-        return arraysEqual(durationp1.getByteArray(), durationp1.getStartOffset(), durationp1.getLength(),
-                durationp2.getByteArray(), durationp2.getStartOffset(), durationp2.getLength());
+        return FunctionHelper.arraysEqual(durationp1, durationp2);
     }
 
     @Override
@@ -228,8 +227,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation
     }
 
     @Override
-    public boolean operateFloatDecimal(FloatPointable floatp1, XSDecimalPointable decp2) throws SystemException,
-            IOException {
+    public boolean operateFloatDecimal(FloatPointable floatp1, XSDecimalPointable decp2)
+            throws SystemException, IOException {
         float float1 = floatp1.floatValue();
         float float2 = decp2.floatValue();
         if (Float.isNaN(floatp1.getFloat())) {
@@ -239,8 +238,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation
     }
 
     @Override
-    public boolean operateFloatDouble(FloatPointable floatp1, DoublePointable doublep2) throws SystemException,
-            IOException {
+    public boolean operateFloatDouble(FloatPointable floatp1, DoublePointable doublep2)
+            throws SystemException, IOException {
         double double1 = floatp1.doubleValue();
         double double2 = doublep2.doubleValue();
         if (Float.isNaN(floatp1.getFloat()) || Double.isNaN(double2)) {
@@ -250,8 +249,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation
     }
 
     @Override
-    public boolean operateFloatFloat(FloatPointable floatp1, FloatPointable floatp2) throws SystemException,
-            IOException {
+    public boolean operateFloatFloat(FloatPointable floatp1, FloatPointable floatp2)
+            throws SystemException, IOException {
         if (Float.isNaN(floatp1.getFloat()) || Float.isNaN(floatp2.getFloat())) {
             return false;
         }
@@ -259,8 +258,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation
     }
 
     @Override
-    public boolean operateFloatInteger(FloatPointable floatp1, LongPointable longp2) throws SystemException,
-            IOException {
+    public boolean operateFloatInteger(FloatPointable floatp1, LongPointable longp2)
+            throws SystemException, IOException {
         float float1 = floatp1.floatValue();
         float float2 = longp2.floatValue();
         if (Float.isNaN(floatp1.getFloat())) {
@@ -302,23 +301,23 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation
     @Override
     public boolean operateHexBinaryHexBinary(XSBinaryPointable binaryp1, XSBinaryPointable binaryp2)
             throws SystemException, IOException {
-        return arraysEqual(binaryp1.getByteArray(), binaryp1.getStartOffset(), binaryp1.getLength(),
-                binaryp2.getByteArray(), binaryp2.getStartOffset(), binaryp2.getLength());
+        return FunctionHelper.arraysEqual(binaryp1, binaryp2);
     }
 
     @Override
-    public boolean operateIntegerDecimal(LongPointable longp1, XSDecimalPointable decp2) throws SystemException,
-            IOException {
+    public boolean operateIntegerDecimal(LongPointable longp1, XSDecimalPointable decp2)
+            throws SystemException, IOException {
         abvsInner.reset();
         XSDecimalPointable decp1 = (XSDecimalPointable) XSDecimalPointable.FACTORY.createPointable();
-        decp1.set(abvsInner.getByteArray(), abvsInner.getStartOffset(), XSDecimalPointable.TYPE_TRAITS.getFixedLength());
+        decp1.set(abvsInner.getByteArray(), abvsInner.getStartOffset(),
+                XSDecimalPointable.TYPE_TRAITS.getFixedLength());
         decp1.setDecimal(longp1.getLong(), (byte) 0);
         return (decp1.compareTo(decp2) == 0);
     }
 
     @Override
-    public boolean operateIntegerDouble(LongPointable longp1, DoublePointable doublep2) throws SystemException,
-            IOException {
+    public boolean operateIntegerDouble(LongPointable longp1, DoublePointable doublep2)
+            throws SystemException, IOException {
         double double1 = longp1.doubleValue();
         double double2 = doublep2.doubleValue();
         if (Double.isNaN(double2)) {
@@ -328,8 +327,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation
     }
 
     @Override
-    public boolean operateIntegerFloat(LongPointable longp1, FloatPointable floatp2) throws SystemException,
-            IOException {
+    public boolean operateIntegerFloat(LongPointable longp1, FloatPointable floatp2)
+            throws SystemException, IOException {
         float float1 = longp1.floatValue();
         float float2 = floatp2.floatValue();
         if (Float.isNaN(float2)) {
@@ -339,8 +338,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation
     }
 
     @Override
-    public boolean operateIntegerInteger(LongPointable longp1, LongPointable longp2) throws SystemException,
-            IOException {
+    public boolean operateIntegerInteger(LongPointable longp1, LongPointable longp2)
+            throws SystemException, IOException {
         return (longp1.compareTo(longp2) == 0);
     }
 
@@ -351,15 +350,16 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation
     }
 
     @Override
-    public boolean operateQNameQName(XSQNamePointable qnamep1, XSQNamePointable qnamep2) throws SystemException,
-            IOException {
+    public boolean operateQNameQName(XSQNamePointable qnamep1, XSQNamePointable qnamep2)
+            throws SystemException, IOException {
         int startOffsetLocalName1 = qnamep1.getStartOffset() + qnamep1.getUriLength() + qnamep1.getPrefixLength();
         int startOffsetLocalName2 = qnamep2.getStartOffset() + qnamep2.getUriLength() + qnamep2.getPrefixLength();
         // Only compare URI and LocalName.
-        return arraysEqual(qnamep1.getByteArray(), qnamep1.getStartOffset(), qnamep1.getUriLength(),
+        return FunctionHelper.arraysEqual(qnamep1.getByteArray(), qnamep1.getStartOffset(), qnamep1.getUriLength(),
                 qnamep2.getByteArray(), qnamep2.getStartOffset(), qnamep2.getUriLength())
-                && arraysEqual(qnamep1.getByteArray(), startOffsetLocalName1, qnamep1.getLocalNameLength(),
-                        qnamep2.getByteArray(), startOffsetLocalName2, qnamep2.getLocalNameLength());
+                && FunctionHelper.arraysEqual(qnamep1.getByteArray(), startOffsetLocalName1,
+                        qnamep1.getLocalNameLength(), qnamep2.getByteArray(), startOffsetLocalName2,
+                        qnamep2.getLocalNameLength());
     }
 
     @Override
@@ -387,8 +387,8 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation
     }
 
     @Override
-    public boolean operateYMDurationDTDuration(IntegerPointable intp1, LongPointable longp2) throws SystemException,
-            IOException {
+    public boolean operateYMDurationDTDuration(IntegerPointable intp1, LongPointable longp2)
+            throws SystemException, IOException {
         if (intp1.getInteger() == 0 && longp2.getLong() == 0) {
             return true;
         }
@@ -405,21 +405,9 @@ public class ValueEqComparisonOperation extends AbstractValueComparisonOperation
     }
 
     @Override
-    public boolean operateYMDurationYMDuration(IntegerPointable intp1, IntegerPointable intp2) throws SystemException,
-            IOException {
+    public boolean operateYMDurationYMDuration(IntegerPointable intp1, IntegerPointable intp2)
+            throws SystemException, IOException {
         return (intp1.compareTo(intp2) == 0);
     }
 
-    private boolean arraysEqual(byte[] bytes1, int offset1, int length1, byte[] bytes2, int offset2, int length2) {
-        if (length1 != length2) {
-            return false;
-        }
-        for (int i = 0; i < length1; ++i) {
-            if (bytes1[offset1 + i] != bytes2[offset2 + i]) {
-                return false;
-            }
-        }
-        return true;
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/util/FunctionHelper.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/util/FunctionHelper.java b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/util/FunctionHelper.java
index a57bf72..d8c4e68 100644
--- a/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/util/FunctionHelper.java
+++ b/vxquery-core/src/main/java/org/apache/vxquery/runtime/functions/util/FunctionHelper.java
@@ -456,9 +456,27 @@ public class FunctionHelper {
         throw new SystemException(ErrorCode.XPTY0004);
     }
 
+    public static boolean arraysEqual(IPointable p1, IPointable p2) {
+        return arraysEqual(p1.getByteArray(), p1.getStartOffset(), p1.getLength(), p2.getByteArray(),
+                p2.getStartOffset(), p2.getLength());
+    }
+
+    public static boolean arraysEqual(byte[] bytes1, int offset1, int length1, byte[] bytes2, int offset2,
+            int length2) {
+        if (length1 != length2) {
+            return false;
+        }
+        for (int i = 0; i < length1; ++i) {
+            if (bytes1[offset1 + i] != bytes2[offset2 + i]) {
+                return false;
+            }
+        }
+        return true;
+    }
+
     public static boolean compareTaggedValues(AbstractValueComparisonOperation aOp, TaggedValuePointable tvp1,
             TaggedValuePointable tvp2, DynamicContext dCtx, TypedPointables tp1, TypedPointables tp2)
-                    throws SystemException {
+            throws SystemException {
         int tid1 = getBaseTypeForComparisons(tvp1.getTag());
         int tid2 = getBaseTypeForComparisons(tvp2.getTag());
 

http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/test/java/org/apache/vxquery/datamodel/AbstractPointableTest.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/test/java/org/apache/vxquery/datamodel/AbstractPointableTest.java b/vxquery-core/src/test/java/org/apache/vxquery/datamodel/AbstractPointableTest.java
new file mode 100644
index 0000000..9343465
--- /dev/null
+++ b/vxquery-core/src/test/java/org/apache/vxquery/datamodel/AbstractPointableTest.java
@@ -0,0 +1,56 @@
+/*
+ * 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.vxquery.datamodel;
+
+import java.io.DataOutput;
+import java.io.IOException;
+
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
+import org.apache.vxquery.datamodel.builders.atomic.StringValueBuilder;
+import org.apache.vxquery.datamodel.values.ValueTag;
+
+public class AbstractPointableTest {
+    private final ArrayBackedValueStorage abvsInput = new ArrayBackedValueStorage();
+    private final StringValueBuilder svb = new StringValueBuilder();
+
+    protected void getTaggedValuePointable(Object value, IPointable result) throws IOException {
+        int start = abvsInput.getLength();
+        if (value instanceof java.lang.Long) {
+            writeLong((Long) value, abvsInput.getDataOutput());
+        } else if (value instanceof java.lang.Double) {
+            writeDouble((Double) value, abvsInput.getDataOutput());
+        } else if (value instanceof java.lang.String) {
+            writeString((String) value, abvsInput.getDataOutput());
+        }
+        result.set(abvsInput.getByteArray(), start, abvsInput.getLength() - start);
+    }
+
+    protected void writeLong(Long value, DataOutput dOut) throws IOException {
+        dOut.write(ValueTag.XS_LONG_TAG);
+        dOut.writeLong(value);
+    }
+
+    protected void writeDouble(Double value, DataOutput dOut) throws IOException {
+        dOut.write(ValueTag.XS_DOUBLE_TAG);
+        dOut.writeDouble(value);
+    }
+
+    protected void writeString(String value, DataOutput dOut) throws IOException {
+        dOut.write(ValueTag.XS_STRING_TAG);
+        svb.write(value, dOut);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/vxquery/blob/7d7ab007/vxquery-core/src/test/java/org/apache/vxquery/datamodel/SequenceByteTest.java
----------------------------------------------------------------------
diff --git a/vxquery-core/src/test/java/org/apache/vxquery/datamodel/SequenceByteTest.java b/vxquery-core/src/test/java/org/apache/vxquery/datamodel/SequenceByteTest.java
new file mode 100644
index 0000000..776b97a
--- /dev/null
+++ b/vxquery-core/src/test/java/org/apache/vxquery/datamodel/SequenceByteTest.java
@@ -0,0 +1,147 @@
+/*
+ * 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.vxquery.datamodel;
+
+import java.io.IOException;
+
+import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
+import org.apache.vxquery.datamodel.accessors.SequencePointable;
+import org.apache.vxquery.datamodel.accessors.TaggedValuePointable;
+import org.apache.vxquery.datamodel.builders.sequence.SequenceBuilder;
+import org.apache.vxquery.datamodel.values.ValueTag;
+import org.apache.vxquery.datamodel.values.XDMConstants;
+import org.apache.vxquery.runtime.functions.util.FunctionHelper;
+import org.junit.Test;
+
+import junit.framework.Assert;
+
+/**
+ * The sequence byte test covers empty sequences, single items and multi-item sequences.
+ *
+ * 1. Empty sequence constant
+ * 2. Empty sequence - {}
+ * 3. Single item - "one" (XQuery single item sequences are just the item.)
+ * 4. Many items - {1, 2.0, "three"}
+ */
+public class SequenceByteTest extends AbstractPointableTest {
+    private final ArrayBackedValueStorage abvsResult = new ArrayBackedValueStorage();
+    private final SequenceBuilder sb = new SequenceBuilder();
+    private final TaggedValuePointable tvp = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable();
+    private final TaggedValuePointable tvp1 = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable();
+    private final TaggedValuePointable tvp2 = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable();
+    private final TaggedValuePointable tvp3 = (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable();
+    private final SequencePointable sp = (SequencePointable) SequencePointable.FACTORY.createPointable();
+
+    @Test
+    public void testEmptySequenceConstant() {
+        // Build test sequence
+        XDMConstants.setEmptySequence(tvp);
+
+        // Check results.
+        if (tvp.getTag() != ValueTag.SEQUENCE_TAG) {
+            Assert.fail("Type tag is incorrect. Expected: " + ValueTag.SEQUENCE_TAG + " Got: " + tvp.getTag());
+        }
+        tvp.getValue(sp);
+        if (sp.getEntryCount() != 0) {
+            Assert.fail("Sequence size is incorrect. Expected: 0 Got: " + sp.getEntryCount());
+        }
+    }
+
+    @Test
+    public void testEmptySequence() {
+        // Build test sequence
+        try {
+            sb.reset(abvsResult);
+            sb.finish();
+        } catch (IOException e) {
+            Assert.fail("Test failed to write the sequence pointable.");
+        }
+        tvp.set(abvsResult);
+
+        // Check results.
+        if (tvp.getTag() != ValueTag.SEQUENCE_TAG) {
+            Assert.fail("Type tag is incorrect. Expected: " + ValueTag.SEQUENCE_TAG + " Got: " + tvp.getTag());
+        }
+        tvp.getValue(sp);
+        if (sp.getEntryCount() != 0) {
+            Assert.fail("Sequence size is incorrect. Expected: 0 Got: " + sp.getEntryCount());
+        }
+    }
+
+    @Test
+    public void testSingleItemSequence() {
+        // Build test sequence
+        try {
+            sb.reset(abvsResult);
+            getTaggedValuePointable("one", tvp1);
+            sb.addItem(tvp1);
+            sb.finish();
+        } catch (IOException e) {
+            Assert.fail("Test failed to write the sequence pointable.");
+        }
+        tvp.set(abvsResult);
+
+        // Check results.
+        if (tvp.getTag() != ValueTag.XS_STRING_TAG) {
+            Assert.fail("Type tag is incorrect. Expected: " + ValueTag.XS_STRING_TAG + " Got: " + tvp.getTag());
+        }
+        if (!FunctionHelper.arraysEqual(tvp, tvp1)) {
+            Assert.fail("Item value is incorrect.");
+        }
+    }
+
+    @Test
+    public void testManyItemSequence() {
+        // Build test sequence
+        try {
+            // Add three items
+            sb.reset(abvsResult);
+            getTaggedValuePointable(1, tvp1);
+            sb.addItem(tvp1);
+            getTaggedValuePointable(2.0, tvp2);
+            sb.addItem(tvp2);
+            getTaggedValuePointable("three", tvp3);
+            sb.addItem(tvp3);
+            sb.finish();
+        } catch (IOException e) {
+            Assert.fail("Test failed to write the sequence pointable.");
+        }
+        tvp.set(abvsResult);
+
+        // Check results.
+        if (tvp.getTag() != ValueTag.SEQUENCE_TAG) {
+            Assert.fail("Sequence tag is incorrect. Expected: " + ValueTag.SEQUENCE_TAG + " Got: " + tvp.getTag());
+        }
+        tvp.getValue(sp);
+        if (sp.getEntryCount() != 3) {
+            Assert.fail("Sequence size is incorrect. Expected: 3 Got: " + sp.getEntryCount());
+        }
+        sp.getEntry(0, tvp);
+        if (!FunctionHelper.arraysEqual(tvp, tvp1)) {
+            Assert.fail("Sequence item one is incorrect. Expected: " + ValueTag.XS_LONG_TAG + " Got: " + tvp.getTag());
+        }
+        sp.getEntry(1, tvp);
+        if (!FunctionHelper.arraysEqual(tvp, tvp2)) {
+            Assert.fail(
+                    "Sequence item two is incorrect. Expected: " + ValueTag.XS_DOUBLE_TAG + " Got: " + tvp.getTag());
+        }
+        sp.getEntry(2, tvp);
+        if (!FunctionHelper.arraysEqual(tvp, tvp3)) {
+            Assert.fail(
+                    "Sequence item three is incorrect. Expected: " + ValueTag.XS_STRING_TAG + " Got: " + tvp.getTag());
+        }
+    }
+
+}