You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ke...@apache.org on 2024/08/20 00:19:52 UTC
(tinkerpop) 01/03: Update io Model to reflect v4 serialization types
This is an automated email from the ASF dual-hosted git repository.
kenhuuu pushed a commit to branch v4-io-test
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 7c4f1137fbd874f3a89d53776a963b8c72a2f31e
Author: Ken Hu <10...@users.noreply.github.com>
AuthorDate: Tue Jul 23 10:14:49 2024 -0700
Update io Model to reflect v4 serialization types
Additionally, added testing to gremlin-python based on the model.
---
docs/src/reference/gremlin-variants.asciidoc | 19 +-
.../main/python/gremlin_python/structure/graph.py | 2 +-
.../gremlin_python/structure/io/graphbinaryV4.py | 1 +
.../src/main/python/tests/structure/io/model.py | 140 ++++
.../tests/structure/io/test_graphbinaryv4model.py | 294 ++++++++
.../structure/graphbinary/GraphBinaryAccess.java | 22 +
.../gremlin/structure/graphson/GraphSONAccess.java | 22 +
.../io/graphbinary/bulked-traverser-v4.gbin | Bin 0 -> 81 bytes
.../structure/io/graphbinary/edge-property-v4.gbin | Bin 0 -> 19 bytes
.../structure/io/graphbinary/empty-binary-v4.gbin | Bin 0 -> 6 bytes
.../structure/io/graphbinary/empty-bulkset-v4.gbin | Bin 0 -> 6 bytes
.../structure/io/graphbinary/empty-list-v4.gbin | Bin 0 -> 6 bytes
.../structure/io/graphbinary/empty-map-v4.gbin | Bin 0 -> 6 bytes
.../structure/io/graphbinary/empty-path-v4.gbin | Bin 0 -> 14 bytes
.../structure/io/graphbinary/empty-set-v4.gbin | Bin 0 -> 6 bytes
.../io/graphbinary/empty-traverser-v4.gbin | Bin 0 -> 12 bytes
.../structure/io/graphbinary/false-boolean-v4.gbin | Bin 0 -> 3 bytes
.../io/graphbinary/forever-duration-v4.gbin | Bin 0 -> 14 bytes
.../gremlin/structure/io/graphbinary/id-t-v4.gbin | Bin 0 -> 10 bytes
.../structure/io/graphbinary/max-byte-v4.gbin | Bin 0 -> 3 bytes
.../structure/io/graphbinary/max-date-v4.gbin | Bin 0 -> 10 bytes
.../structure/io/graphbinary/max-double-v4.gbin | Bin 0 -> 10 bytes
.../structure/io/graphbinary/max-float-v4.gbin | Bin 0 -> 6 bytes
.../structure/io/graphbinary/max-int-v4.gbin | Bin 0 -> 6 bytes
.../structure/io/graphbinary/max-long-v4.gbin | Bin 0 -> 10 bytes
.../io/graphbinary/max-offsetdatetime-v4.gbin | Bin 0 -> 20 bytes
.../structure/io/graphbinary/max-short-v4.gbin | Bin 0 -> 4 bytes
.../io/graphbinary/meta-vertexproperty-v4.gbin | Bin 0 -> 55 bytes
.../structure/io/graphbinary/min-byte-v4.gbin | Bin 0 -> 3 bytes
.../structure/io/graphbinary/min-date-v4.gbin | Bin 0 -> 10 bytes
.../structure/io/graphbinary/min-double-v4.gbin | Bin 0 -> 10 bytes
.../structure/io/graphbinary/min-float-v4.gbin | Bin 0 -> 6 bytes
.../structure/io/graphbinary/min-int-v4.gbin | Bin 0 -> 6 bytes
.../structure/io/graphbinary/min-long-v4.gbin | Bin 0 -> 10 bytes
.../io/graphbinary/min-offsetdatetime-v4.gbin | Bin 0 -> 20 bytes
.../structure/io/graphbinary/min-short-v4.gbin | Bin 0 -> 4 bytes
.../structure/io/graphbinary/mixed-string-v4.gbin | Bin 0 -> 15 bytes
.../io/graphbinary/multi-byte-char-v4.gbin | Bin 0 -> 4 bytes
.../structure/io/graphbinary/nan-double-v4.gbin | Bin 0 -> 10 bytes
.../structure/io/graphbinary/nan-float-v4.gbin | Bin 0 -> 6 bytes
.../io/graphbinary/neg-bigdecimal-v4.gbin | Bin 0 -> 25 bytes
.../io/graphbinary/neg-biginteger-v4.gbin | Bin 0 -> 21 bytes
.../io/graphbinary/neg-inf-double-v4.gbin | Bin 0 -> 10 bytes
.../structure/io/graphbinary/neg-inf-float-v4.gbin | Bin 0 -> 6 bytes
.../io/graphbinary/neg-max-double-v4.gbin | Bin 0 -> 10 bytes
.../structure/io/graphbinary/neg-max-float-v4.gbin | Bin 0 -> 6 bytes
.../io/graphbinary/neg-min-double-v4.gbin | Bin 0 -> 10 bytes
.../structure/io/graphbinary/neg-min-float-v4.gbin | Bin 0 -> 6 bytes
.../io/graphbinary/neg-zero-double-v4.gbin | Bin 0 -> 10 bytes
.../io/graphbinary/neg-zero-float-v4.gbin | Bin 0 -> 6 bytes
.../structure/io/graphbinary/nil-uuid-v4.gbin | Bin 0 -> 18 bytes
.../structure/io/graphbinary/no-prop-edge-v4.gbin | Bin 0 -> 62 bytes
.../io/graphbinary/no-prop-vertex-v4.gbin | Bin 0 -> 24 bytes
.../structure/io/graphbinary/null-property-v4.gbin | Bin 0 -> 10 bytes
.../structure/io/graphbinary/out-direction-v4.gbin | Bin 0 -> 11 bytes
.../io/graphbinary/pos-bigdecimal-v4.gbin | Bin 0 -> 25 bytes
.../io/graphbinary/pos-biginteger-v4.gbin | Bin 0 -> 21 bytes
.../io/graphbinary/pos-inf-double-v4.gbin | Bin 0 -> 10 bytes
.../structure/io/graphbinary/pos-inf-float-v4.gbin | Bin 0 -> 6 bytes
.../io/graphbinary/precision-date-v4.gbin | Bin 0 -> 10 bytes
.../structure/io/graphbinary/prop-path-v4.gbin | Bin 0 -> 575 bytes
.../set-cardinality-vertexproperty-v4.gbin | Bin 0 -> 72 bytes
.../io/graphbinary/single-byte-char-v4.gbin | Bin 0 -> 3 bytes
.../io/graphbinary/single-byte-string-v4.gbin | Bin 0 -> 9 bytes
.../io/graphbinary/specified-uuid-v4.gbin | Bin 0 -> 18 bytes
.../structure/io/graphbinary/str-binary-v4.gbin | Bin 0 -> 24 bytes
.../structure/io/graphbinary/tinker-graph-v4.gbin | Bin 0 -> 2264 bytes
.../io/graphbinary/traversal-edge-v4.gbin | Bin 0 -> 81 bytes
.../io/graphbinary/traversal-path-v4.gbin | Bin 0 -> 108 bytes
.../io/graphbinary/traversal-tree-v4.gbin | Bin 0 -> 152 bytes
.../io/graphbinary/traversal-vertex-v4.gbin | Bin 0 -> 405 bytes
.../graphbinary/traversal-vertexproperty-v4.gbin | Bin 0 -> 39 bytes
.../structure/io/graphbinary/true-boolean-v4.gbin | Bin 0 -> 3 bytes
.../io/graphbinary/unspecified-null-v4.gbin | 1 +
.../structure/io/graphbinary/var-bulkset-v4.gbin | Bin 0 -> 43 bytes
.../structure/io/graphbinary/var-type-list-v4.gbin | Bin 0 -> 29 bytes
.../structure/io/graphbinary/var-type-map-v4.gbin | Bin 0 -> 79 bytes
.../structure/io/graphbinary/var-type-set-v4.gbin | Bin 0 -> 29 bytes
.../io/graphbinary/vertex-traverser-v4.gbin | Bin 0 -> 415 bytes
.../structure/io/graphbinary/zero-date-v4.gbin | Bin 0 -> 10 bytes
.../structure/io/graphbinary/zero-duration-v4.gbin | Bin 0 -> 14 bytes
.../structure/io/graphson/bulked-traverser-v4.json | 32 +
.../structure/io/graphson/edge-property-v4.json | 10 +
.../structure/io/graphson/empty-binary-v4.json | 4 +
.../structure/io/graphson/empty-bulkset-v4.json | 4 +
.../structure/io/graphson/empty-list-v4.json | 4 +
.../structure/io/graphson/empty-map-v4.json | 4 +
.../structure/io/graphson/empty-path-v4.json | 13 +
.../structure/io/graphson/empty-set-v4.json | 4 +
.../structure/io/graphson/empty-traverser-v4.json | 10 +
.../structure/io/graphson/false-boolean-v4.json | 1 +
.../structure/io/graphson/forever-duration-v4.json | 4 +
.../gremlin/structure/io/graphson/id-t-v4.json | 4 +
.../gremlin/structure/io/graphson/max-byte-v4.json | 4 +
.../gremlin/structure/io/graphson/max-date-v4.json | 4 +
.../structure/io/graphson/max-double-v4.json | 4 +
.../structure/io/graphson/max-float-v4.json | 4 +
.../gremlin/structure/io/graphson/max-int-v4.json | 4 +
.../gremlin/structure/io/graphson/max-long-v4.json | 4 +
.../io/graphson/max-offsetdatetime-v4.json | 4 +
.../structure/io/graphson/max-short-v4.json | 4 +
.../io/graphson/meta-vertexproperty-v4.json | 14 +
.../gremlin/structure/io/graphson/min-byte-v4.json | 4 +
.../gremlin/structure/io/graphson/min-date-v4.json | 4 +
.../structure/io/graphson/min-double-v4.json | 4 +
.../structure/io/graphson/min-float-v4.json | 4 +
.../gremlin/structure/io/graphson/min-int-v4.json | 4 +
.../gremlin/structure/io/graphson/min-long-v4.json | 4 +
.../io/graphson/min-offsetdatetime-v4.json | 4 +
.../structure/io/graphson/min-short-v4.json | 4 +
.../structure/io/graphson/mixed-string-v4.json | 1 +
.../structure/io/graphson/multi-byte-char-v4.json | 4 +
.../structure/io/graphson/nan-double-v4.json | 4 +
.../structure/io/graphson/nan-float-v4.json | 4 +
.../structure/io/graphson/neg-bigdecimal-v4.json | 4 +
.../structure/io/graphson/neg-biginteger-v4.json | 4 +
.../structure/io/graphson/neg-inf-double-v4.json | 4 +
.../structure/io/graphson/neg-inf-float-v4.json | 4 +
.../structure/io/graphson/neg-max-double-v4.json | 4 +
.../structure/io/graphson/neg-max-float-v4.json | 4 +
.../structure/io/graphson/neg-min-double-v4.json | 4 +
.../structure/io/graphson/neg-min-float-v4.json | 4 +
.../structure/io/graphson/neg-zero-double-v4.json | 4 +
.../structure/io/graphson/neg-zero-float-v4.json | 4 +
.../gremlin/structure/io/graphson/nil-uuid-v4.json | 4 +
.../structure/io/graphson/no-prop-edge-v4.json | 20 +
.../structure/io/graphson/no-prop-vertex-v4.json | 10 +
.../structure/io/graphson/null-property-v4.json | 7 +
.../structure/io/graphson/out-direction-v4.json | 4 +
.../structure/io/graphson/pos-bigdecimal-v4.json | 4 +
.../structure/io/graphson/pos-biginteger-v4.json | 4 +
.../structure/io/graphson/pos-inf-double-v4.json | 4 +
.../structure/io/graphson/pos-inf-float-v4.json | 4 +
.../structure/io/graphson/precision-date-v4.json | 4 +
.../structure/io/graphson/prop-path-v4.json | 165 ++++
.../set-cardinality-vertexproperty-v4.json | 17 +
.../structure/io/graphson/single-byte-char-v4.json | 4 +
.../io/graphson/single-byte-string-v4.json | 1 +
.../structure/io/graphson/specified-uuid-v4.json | 4 +
.../structure/io/graphson/str-binary-v4.json | 4 +
.../structure/io/graphson/tinker-graph-v4.json | 829 ++++++++++++++++++++
.../structure/io/graphson/traversal-edge-v4.json | 32 +
.../structure/io/graphson/traversal-path-v4.json | 49 ++
.../structure/io/graphson/traversal-tree-v4.json | 60 ++
.../structure/io/graphson/traversal-vertex-v4.json | 100 +++
.../io/graphson/traversal-vertexproperty-v4.json | 11 +
.../structure/io/graphson/true-boolean-v4.json | 1 +
.../structure/io/graphson/unspecified-null-v4.json | 1 +
.../structure/io/graphson/var-bulkset-v4.json | 10 +
.../structure/io/graphson/var-type-list-v4.json | 7 +
.../structure/io/graphson/var-type-map-v4.json | 25 +
.../structure/io/graphson/var-type-set-v4.json | 7 +
.../structure/io/graphson/vertex-traverser-v4.json | 109 +++
.../structure/io/graphson/zero-date-v4.json | 4 +
.../structure/io/graphson/zero-duration-v4.json | 4 +
.../io/AbstractTypedCompatibilityTest.java | 836 +++++++++++++--------
.../io/AbstractUntypedCompatibilityTest.java | 69 +-
.../tinkerpop/gremlin/structure/io/Model.java | 273 +++----
.../graphbinary/GraphBinaryCompatibilityTest.java | 9 +-
.../graphson/GraphSONTypedCompatibilityTest.java | 24 +-
.../graphson/GraphSONUntypedCompatibilityTest.java | 22 +-
161 files changed, 2874 insertions(+), 594 deletions(-)
diff --git a/docs/src/reference/gremlin-variants.asciidoc b/docs/src/reference/gremlin-variants.asciidoc
index 777cbfe81b..e5c90fb29a 100644
--- a/docs/src/reference/gremlin-variants.asciidoc
+++ b/docs/src/reference/gremlin-variants.asciidoc
@@ -2586,8 +2586,23 @@ results within a collection across different languages. If a `Set` is needed the
to `Set` manually.
* Gremlin is capable of returning `Dictionary` results that use non-hashable keys (e.g. Dictionary as a key) and Python
does not support that at a language level. Using GraphSON 3.0 or GraphBinary (after 3.5.0) makes it possible to return
-such results. In all other cases, Gremlin that returns such results will need to be re-written to avoid that sort of
-key.
+such results. However, it may not be possible to serialize these maps so they can't be re-inserted (or round tripped).
+In all other cases, Gremlin that returns such results will need to be re-written to avoid that sort of key.
+* The `float` type in Python is a double precision floating point number which is commonly referred to in other
+languages as a `double`. This means that single precision floating point values will be deserialized into a double, so
+there will be a precision difference.
+* Gremlin supports multiple fixed-width integers such as byte (1-byte), short (2-byte), and long (8-byte). These are
+deserialized into Python's variable size `int` type. These numbers can't be exactly round tripped because the original
+type information is lost during deserialization. During serialization, these numbers will try to be converted into a
+4-byte integer which may throw exceptions if the value is too large or waste space if the value is very small.
+* The Gremlin Char type is deserialized as a string and therefore can't be round tripped as it will it will attempt to
+be serialized as a string.
+* Date and Duration types in Gremlin are deserialized as `datetime.datetime` and `datetime.timedelta` respectively in
+`gremlin-python`. This can lead to errors for large values because they exceed the maximum size allowed for `datetime`
+and `timedelta`.
+* In Gremlin, 1 isn't equal to the boolean true value and 0 isn't equal to the boolean false value, but they are equal
+in Python. This means that in `gremlin-python` if these values are in a `Set`, you will get a different behavior than
+what is intended by Gremlin, since it follows Python's behavior.
* The `subgraph()`-step is not supported by any variant that is not running on the Java Virtual Machine as there is
no `Graph` instance to deserialize a result into on the client-side. A workaround is to replace the step with
`aggregate(local)` and then convert those results to something the client can use locally.
diff --git a/gremlin-python/src/main/python/gremlin_python/structure/graph.py b/gremlin-python/src/main/python/gremlin_python/structure/graph.py
index 1825855705..8c628ebf27 100644
--- a/gremlin-python/src/main/python/gremlin_python/structure/graph.py
+++ b/gremlin-python/src/main/python/gremlin_python/structure/graph.py
@@ -27,7 +27,7 @@ class Graph(object):
class Element(object):
- def __init__(self, id, label, properties=None):
+ def __init__(self, id, label, properties=[]):
self.id = id
self.label = label
self.properties = properties
diff --git a/gremlin-python/src/main/python/gremlin_python/structure/io/graphbinaryV4.py b/gremlin-python/src/main/python/gremlin_python/structure/io/graphbinaryV4.py
index ef86445458..9a771f9cec 100644
--- a/gremlin-python/src/main/python/gremlin_python/structure/io/graphbinaryV4.py
+++ b/gremlin-python/src/main/python/gremlin_python/structure/io/graphbinaryV4.py
@@ -590,6 +590,7 @@ class EdgeIO(_GraphBinaryTypeIO):
StringIO.dictify(obj.outV.label, writer, to_extend, True, False)
to_extend.extend(NULL_BYTES)
to_extend.extend(NULL_BYTES)
+ #writer.to_dict([], to_extend)
return to_extend
diff --git a/gremlin-python/src/main/python/tests/structure/io/model.py b/gremlin-python/src/main/python/tests/structure/io/model.py
new file mode 100644
index 0000000000..1e04de404d
--- /dev/null
+++ b/gremlin-python/src/main/python/tests/structure/io/model.py
@@ -0,0 +1,140 @@
+import datetime
+import uuid
+from gremlin_python.statics import short, long, bigint, BigDecimal, SingleByte, ByteBufferType
+from gremlin_python.structure.graph import Vertex, Edge, Property, VertexProperty, Path
+from gremlin_python.process.traversal import Direction, Traverser, T
+
+"""
+The following models aren't supported.
+tinker-graph Graph type not implemented
+max-offsetdatetime Too large for datetime
+min-offsetdatetime Too small for datetime
+min-date Too large for datetime
+max-date Too small for datetime
+forever-duration Too large for duration
+max-float single precision float not supported in Python
+min-float single precision float not supported in Python
+neg-max-float single precision float not supported in Python
+neg-min-float single precision float not supported in Python
+nan-float single precision float not supported in Python
+pos-inf-float single precision float not supported in Python
+neg-inf-float single precision float not supported in Python
+neg-zero-float single precision float not supported in Python
+traversal-tree Tree type not implemented
+"""
+
+model = {}
+
+model["pos-bigdecimal"] = BigDecimal(33, 123456789987654321123456789987654321)
+model["neg-bigdecimal"] = BigDecimal(33, -123456789987654321123456789987654321)
+model["pos-biginteger"] = bigint(123456789987654321123456789987654321)
+model["neg-biginteger"] = bigint(-123456789987654321123456789987654321)
+model["min-byte"] = SingleByte(-128)
+model["max-byte"] = SingleByte(127)
+model["empty-binary"] = ByteBufferType("", "utf8")
+model["str-binary"] = ByteBufferType("some bytes for you", "utf8")
+model["max-double"] = 1.7976931348623157E308
+model["min-double"] = 4.9E-324
+model["neg-max-double"] = -1.7976931348623157E308
+model["neg-min-double"] = -4.9E-324
+model["nan-double"] = float('nan')
+model["pos-inf-double"] = float('inf')
+model["neg-inf-double"] = float('-inf')
+model["neg-zero-double"] = -0.0
+model["single-byte-char"] = 'a'
+model["multi-byte-char"] = '\u03A9'
+model["unspecified-null"] = None
+model["true-boolean"] = True
+model["false-boolean"] = False
+model["single-byte-string"] = "abc"
+model["mixed-string"] = "abc\u0391\u0392\u0393"
+model["var-bulkset"] = ["marko", "josh", "josh"]
+model["empty-bulkset"] = []
+model["zero-duration"] = datetime.timedelta()
+model["traversal-edge"] = Edge(
+ 13,
+ Vertex(1, 'person'),
+ "develops",
+ Vertex(10, "software"),
+ [Property("since", 2009, None)]
+)
+model["no-prop-edge"] = Edge(
+ 13,
+ Vertex(1, 'person'),
+ "develops",
+ Vertex(10, "software")
+)
+model["max-int"] = 2147483647
+model["min-int"] = -2**31
+model["max-long"] = long(2**63-1)
+model["min-long"] = long(-2**63)
+model["var-type-list"] = [1, "person", True, None]
+model["empty-list"] = []
+model["var-type-map"] = {
+ "test": 123,
+ datetime.datetime(1970, 1, 1, 0, 24, 41, 295000): "red",
+ (1,2,3): datetime.datetime(1970, 1, 1, 0, 24, 41, 295000),
+ None: None
+}
+model["empty-map"] = {}
+model["traversal-path"] = Path(
+ [set(), set(), set()],
+ [Vertex(1, "person"), Vertex(10, "software"), Vertex(11, "software")]
+)
+model["empty-path"] = Path([], [])
+model["prop-path"] = Path(
+ [set(), set(), set()],
+ [
+ Vertex(1, "person", VertexProperty(
+ 123,
+ "name",
+ "stephen",
+ [
+ VertexProperty(0, "name", "marko", None),
+ VertexProperty(6, "location", [], None)
+ ]
+ )),
+ Vertex(10, "software"),
+ Vertex(11, "software")
+ ]
+)
+model["edge-property"] = Property("since", 2009, None)
+model["null-property"] = Property("", None, None)
+model["var-type-set"] = {2, "person", True, None}
+model["empty-set"] = set()
+model["max-short"] = short(32767)
+model["min-short"] = short(-32768)
+model["specified-uuid"] = uuid.UUID("41d2e28a-20a4-4ab0-b379-d810dede3786")
+model["nil-uuid"] = uuid.UUID(int = 0)
+model["no-prop-vertex"] = Vertex(1, "person")
+model["traversal-vertexproperty"] = VertexProperty(0, "name", "marko", None)
+model["meta-vertexproperty"] = VertexProperty(1, "person", "stephen", None, [Property("a", "b", None)])
+model["set-cardinality-vertexproperty"] = VertexProperty(1, "person", {"stephen", "marko"}, None, [Property("a", "b", None)])
+model["id-t"] = T.id
+model["out-direction"] = Direction.OUT
+model["zero-date"] = datetime.datetime(1970, 1, 1)
+model["precision-date"] = datetime.datetime(1970, 1, 1, 3, 5, 11, 111000)
+
+santa_fe = VertexProperty(
+ 9, "location", "santa fe", None,
+ [Property("startTime", 2005, None)]
+)
+brussels = VertexProperty(
+ 8, "location", "brussels", None,
+ [Property("startTime", 2005, None), Property("endTime", 2005, None)]
+)
+santa_cruz = VertexProperty(
+ 7, "location", "santa cruz", None,
+ [Property("startTime", 2001, None), Property("endTime", 2004, None)]
+)
+san_diego = VertexProperty(
+ 6, "location", "san diego", None,
+ [Property("startTime", 1997, None), Property("endTime", 2001, None)]
+)
+name = VertexProperty(0, "name", "marko", None)
+
+model["traversal-vertex"] = Vertex(1, "person", [
+ Property("name", name, None), Property("location", [
+ san_diego, santa_cruz, brussels, santa_fe
+ ], None)])
+model["vertex-traverser"] = Traverser(model["traversal-vertex"], 1)
diff --git a/gremlin-python/src/main/python/tests/structure/io/test_graphbinaryv4model.py b/gremlin-python/src/main/python/tests/structure/io/test_graphbinaryv4model.py
new file mode 100644
index 0000000000..62e3498abf
--- /dev/null
+++ b/gremlin-python/src/main/python/tests/structure/io/test_graphbinaryv4model.py
@@ -0,0 +1,294 @@
+"""
+Round trip testing of GraphBinaryV4 compared to a correct "model".
+
+Set the IO_TEST_DIRECTORY environment variable to the directory where
+the .gbin files that represent the serialized "model" are located.
+"""
+
+from gremlin_python.structure.io.graphbinaryV4 import GraphBinaryWriter, GraphBinaryReader
+import math
+import os
+
+from .model import model
+
+gremlin_test_dir = "gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/"
+directory_search_pattern = "gremlin-python" + os.sep + "src" + os.sep + "main"
+default_dir = __file__[:__file__.find(directory_search_pattern)]
+test_resource_directory = os.environ.get('IO_TEST_DIRECTORY', default_dir + gremlin_test_dir)
+writer = GraphBinaryWriter()
+reader = GraphBinaryReader()
+
+def get_entry(title):
+ return model[title]
+
+def read_file_by_name(resource_name):
+ full_name = test_resource_directory + resource_name + "-" + "v4" + ".gbin"
+ with open(full_name, 'rb') as resource_file:
+ return bytearray(resource_file.read())
+
+def test_pos_bigdecimal():
+ def decimal_cmp(x, y):
+ if x.scale == y.scale and x.unscaled_value == y.unscaled_value:
+ return True
+ else:
+ return False
+
+ # gremlin-python adds an extra 0 byte to the value.
+ run_writeread("pos-bigdecimal", decimal_cmp)
+
+def test_neg_bigdecimal():
+ def decimal_cmp(x, y):
+ if x.scale == y.scale and x.unscaled_value == y.unscaled_value:
+ return True
+ else:
+ return False
+
+ # gremlin-python adds an extra 0 byte to the value.
+ run_writeread("neg-bigdecimal", decimal_cmp)
+
+def test_pos_biginteger():
+ # gremlin-python adds an extra 0 byte to the value.
+ run_writeread("pos-biginteger")
+
+def test_neg_biginteger():
+ # gremlin-python adds an extra 0 byte to the value.
+ run_writeread("neg-biginteger")
+
+def test_min_byte():
+ run("min-byte")
+
+def test_max_byte():
+ run("max-byte")
+
+def test_empty_binary():
+ run("empty-binary")
+
+def test_str_binary():
+ run("str-binary")
+
+def test_max_double():
+ run("max-double")
+
+def test_min_double():
+ run("min-double")
+
+def test_neg_max_double():
+ run("neg-max-double")
+
+def test_neg_min_double():
+ run("neg-min-double")
+
+def test_nan_double():
+ def nan_cmp(x, y):
+ if math.isnan(x) and math.isnan(y):
+ return True
+ else:
+ return False
+ run("nan-double", nan_cmp)
+
+def test_pos_inf_double():
+ run("pos-inf-double")
+
+def test_neg_inf_double():
+ run("neg-inf-double")
+
+def test_neg_zero_double():
+ run("neg-zero-double")
+
+def test_zero_duration():
+ run("zero-duration")
+
+def test_traversal_edge():
+ # properties aren't serialized in gremlin-python
+ run_writeread("traversal-edge")
+
+def test_no_prop_edge():
+ # gremlin-python serializes/deserializes "null" for props not empty list
+ run_writeread("no-prop-edge")
+
+def test_max_int():
+ run("max-int")
+
+def test_min_int():
+ run("min-int")
+
+def test_max_long():
+ # attempts to serialize a long as an int
+ run_writeread("max-long")
+
+def test_min_long():
+ # attempts to serialize a long as an int
+ run_writeread("min-long")
+
+def test_var_type_list():
+ run("var-type-list")
+
+def test_empty_list():
+ run("empty-list")
+
+def test_var_type_map():
+ # can't write tuple
+ run_read("var-type-map")
+
+def test_empty_map():
+ run("empty-map")
+
+def test_traversal_path():
+ # gremlin-python serializes/deserializes "null" for props not empty list
+ run_writeread("traversal-path")
+
+def test_empty_path():
+ run("empty-path")
+
+def test_prop_path():
+ # gremlin-python doesn't serialize properties
+ run_writeread("prop-path")
+
+def test_zero_date():
+ run("zero-date")
+
+def test_edge_property():
+ run("edge-property")
+
+def test_null_property():
+ run("null-property")
+
+def test_var_type_set():
+ # ordering within set might be different
+ run_writeread("var-type-set")
+
+def test_empty_set():
+ run("empty-set")
+
+def test_max_short():
+ # short deserialized to int
+ run_writeread("max-short")
+
+def test_min_short():
+ # short deserialized to int
+ run_writeread("min-short")
+
+def test_specified_uuid():
+ run("specified-uuid")
+
+def test_nil_uuid():
+ run("nil-uuid")
+
+def test_no_prop_vertex():
+ # gremlin-python serializes/deserializes "null" for props not empty list
+ run_writeread("no-prop-vertex")
+
+def test_traversal_vertexproperty():
+ # properties aren't serialized in gremlin-python
+ run_writeread("traversal-vertexproperty")
+
+def test_meta_vertexproperty():
+ # properties aren't serialized in gremlin-python
+ run_writeread("meta-vertexproperty")
+
+def test_set_cardinality_vertexproperty():
+ # properties aren't serialized in gremlin-python
+ run_writeread("set-cardinality-vertexproperty")
+
+def test_id_t():
+ run("id-t")
+
+def test_out_direction():
+ run("out-direction")
+
+def test_var_bulkset():
+ # no serializer for BulkSet
+ run_read("var-bulkset")
+
+def test_empty_bulkset():
+ # no serializer for BulkSet
+ run_read("empty-bulkset")
+
+def test_precision_date():
+ run("precision-date")
+
+def test_single_byte_char():
+ # char is serialized as string
+ run_writeread("single-byte-char")
+
+def test_multi_byte_char():
+ # char is serialized as string
+ run_writeread("multi-byte-char")
+
+def test_unspecified_null():
+ # no serializer for plain null
+ run_writeread("unspecified-null")
+
+def test_true_boolean():
+ run("true-boolean")
+
+def test_false_boolean():
+ run("false-boolean")
+
+def test_single_byte_string():
+ run("single-byte-string")
+
+def test_mixed_string():
+ run("mixed-string")
+
+def run(resource_name, comparator = None):
+ """
+ Runs the regular set of tests for the type which is
+ 1. model to deserialized object
+ 2. written bytes to read bytes
+ 3. round tripped (read then written) bytes to read bytes
+
+ Optionally takes in a comparator that used for comparison 1.
+ """
+ resource_bytes = read_file_by_name(resource_name)
+
+ model = get_entry(resource_name)
+ read = reader.read_object(resource_bytes)
+ if comparator is not None:
+ assert comparator(model, read)
+ else:
+ assert model == read
+
+ written = writer.write_object(model)
+ assert resource_bytes == written
+
+ round_tripped = writer.write_object(reader.read_object(resource_bytes))
+ assert resource_bytes == round_tripped
+
+def run_read(resource_name):
+ """
+ Runs the read test which compares the model to deserialized object
+
+ This should only be used in cases where there is only a deserializer
+ but no serializer for the same type.
+ """
+ resource_bytes = read_file_by_name(resource_name)
+
+ model = get_entry(resource_name)
+ read = reader.read_object(resource_bytes)
+ assert model == read
+
+def run_writeread(resource_name, comparator = None):
+ """
+ Runs a reduced set of tests for the type which is
+ 1. model to deserialized object
+ 2. model to round tripped (written then read) object
+
+ Optionally takes in a comparator that used for comparison 1.
+
+ Use this in cases where the regular run() function in too stringent.
+ E.g. when ordering doesn't matter like for sets. Ideally, a type
+ should be tested with run() instead when possible.
+ """
+ resource_bytes = read_file_by_name(resource_name)
+
+ model = get_entry(resource_name)
+ read = reader.read_object(resource_bytes)
+ round_tripped = reader.read_object(writer.write_object(model))
+
+ if comparator is not None:
+ assert comparator(model, read)
+ assert comparator(model, round_tripped)
+ else:
+ assert model == read
+ assert model == round_tripped
\ No newline at end of file
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/graphbinary/GraphBinaryAccess.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/graphbinary/GraphBinaryAccess.java
new file mode 100644
index 0000000000..1eb973eab8
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/graphbinary/GraphBinaryAccess.java
@@ -0,0 +1,22 @@
+/*
+ * 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.tinkerpop.gremlin.structure.graphbinary;
+
+public class GraphBinaryAccess {
+}
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/graphson/GraphSONAccess.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/graphson/GraphSONAccess.java
new file mode 100644
index 0000000000..7414abaa56
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/graphson/GraphSONAccess.java
@@ -0,0 +1,22 @@
+/*
+ * 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.tinkerpop.gremlin.structure.graphson;
+
+public class GraphSONAccess {
+}
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/bulked-traverser-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/bulked-traverser-v4.gbin
new file mode 100644
index 0000000000..ec0a589053
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/bulked-traverser-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/edge-property-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/edge-property-v4.gbin
new file mode 100644
index 0000000000..ddc34e5ae6
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/edge-property-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/empty-binary-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/empty-binary-v4.gbin
new file mode 100644
index 0000000000..bb44d2bb50
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/empty-binary-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/empty-bulkset-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/empty-bulkset-v4.gbin
new file mode 100644
index 0000000000..2f23c6bd4d
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/empty-bulkset-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/empty-list-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/empty-list-v4.gbin
new file mode 100644
index 0000000000..541fdf3033
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/empty-list-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/empty-map-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/empty-map-v4.gbin
new file mode 100644
index 0000000000..671d59ff44
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/empty-map-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/empty-path-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/empty-path-v4.gbin
new file mode 100644
index 0000000000..4f9b5b6f7d
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/empty-path-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/empty-set-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/empty-set-v4.gbin
new file mode 100644
index 0000000000..3426f04e7d
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/empty-set-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/empty-traverser-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/empty-traverser-v4.gbin
new file mode 100644
index 0000000000..c5f3d9af99
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/empty-traverser-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/false-boolean-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/false-boolean-v4.gbin
new file mode 100644
index 0000000000..d33346d466
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/false-boolean-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/forever-duration-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/forever-duration-v4.gbin
new file mode 100644
index 0000000000..3b1ba9218f
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/forever-duration-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/id-t-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/id-t-v4.gbin
new file mode 100644
index 0000000000..8a9235d39d
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/id-t-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/max-byte-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/max-byte-v4.gbin
new file mode 100644
index 0000000000..c817f1332c
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/max-byte-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/max-date-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/max-date-v4.gbin
new file mode 100644
index 0000000000..eb7bf90046
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/max-date-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/max-double-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/max-double-v4.gbin
new file mode 100644
index 0000000000..b768fbbd4c
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/max-double-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/max-float-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/max-float-v4.gbin
new file mode 100644
index 0000000000..82c30942b1
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/max-float-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/max-int-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/max-int-v4.gbin
new file mode 100644
index 0000000000..9577d1fb1d
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/max-int-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/max-long-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/max-long-v4.gbin
new file mode 100644
index 0000000000..f30240c34e
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/max-long-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/max-offsetdatetime-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/max-offsetdatetime-v4.gbin
new file mode 100644
index 0000000000..620169668a
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/max-offsetdatetime-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/max-short-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/max-short-v4.gbin
new file mode 100644
index 0000000000..a7d7c33b69
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/max-short-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/meta-vertexproperty-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/meta-vertexproperty-v4.gbin
new file mode 100644
index 0000000000..f06f76cbc4
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/meta-vertexproperty-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/min-byte-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/min-byte-v4.gbin
new file mode 100644
index 0000000000..e51d9ad444
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/min-byte-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/min-date-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/min-date-v4.gbin
new file mode 100644
index 0000000000..860ed36c2c
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/min-date-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/min-double-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/min-double-v4.gbin
new file mode 100644
index 0000000000..a68796faa1
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/min-double-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/min-float-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/min-float-v4.gbin
new file mode 100644
index 0000000000..6637c5056d
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/min-float-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/min-int-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/min-int-v4.gbin
new file mode 100644
index 0000000000..089e2791f1
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/min-int-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/min-long-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/min-long-v4.gbin
new file mode 100644
index 0000000000..c0c1ffac4e
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/min-long-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/min-offsetdatetime-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/min-offsetdatetime-v4.gbin
new file mode 100644
index 0000000000..b915bea8ca
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/min-offsetdatetime-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/min-short-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/min-short-v4.gbin
new file mode 100644
index 0000000000..f4ba58f825
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/min-short-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/mixed-string-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/mixed-string-v4.gbin
new file mode 100644
index 0000000000..d5e21d3b7f
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/mixed-string-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/multi-byte-char-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/multi-byte-char-v4.gbin
new file mode 100644
index 0000000000..2f2570aa04
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/multi-byte-char-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/nan-double-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/nan-double-v4.gbin
new file mode 100644
index 0000000000..8a0314418e
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/nan-double-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/nan-float-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/nan-float-v4.gbin
new file mode 100644
index 0000000000..7d2d01379e
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/nan-float-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-bigdecimal-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-bigdecimal-v4.gbin
new file mode 100644
index 0000000000..3fda5009e2
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-bigdecimal-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-biginteger-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-biginteger-v4.gbin
new file mode 100644
index 0000000000..464792bbd2
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-biginteger-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-inf-double-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-inf-double-v4.gbin
new file mode 100644
index 0000000000..b60a57f278
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-inf-double-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-inf-float-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-inf-float-v4.gbin
new file mode 100644
index 0000000000..a84b7436ca
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-inf-float-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-max-double-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-max-double-v4.gbin
new file mode 100644
index 0000000000..db658bfcfe
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-max-double-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-max-float-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-max-float-v4.gbin
new file mode 100644
index 0000000000..e6bf5c3074
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-max-float-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-min-double-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-min-double-v4.gbin
new file mode 100644
index 0000000000..7d6b5cf326
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-min-double-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-min-float-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-min-float-v4.gbin
new file mode 100644
index 0000000000..583801e7d7
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-min-float-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-zero-double-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-zero-double-v4.gbin
new file mode 100644
index 0000000000..f76a022bab
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-zero-double-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-zero-float-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-zero-float-v4.gbin
new file mode 100644
index 0000000000..cfd00ec653
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/neg-zero-float-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/nil-uuid-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/nil-uuid-v4.gbin
new file mode 100644
index 0000000000..828e057cf2
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/nil-uuid-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/no-prop-edge-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/no-prop-edge-v4.gbin
new file mode 100644
index 0000000000..201264742c
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/no-prop-edge-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/no-prop-vertex-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/no-prop-vertex-v4.gbin
new file mode 100644
index 0000000000..cb85436422
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/no-prop-vertex-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/null-property-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/null-property-v4.gbin
new file mode 100644
index 0000000000..12b81db1d5
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/null-property-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/out-direction-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/out-direction-v4.gbin
new file mode 100644
index 0000000000..3caaba3c97
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/out-direction-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/pos-bigdecimal-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/pos-bigdecimal-v4.gbin
new file mode 100644
index 0000000000..a855c662b5
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/pos-bigdecimal-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/pos-biginteger-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/pos-biginteger-v4.gbin
new file mode 100644
index 0000000000..d841fbe39c
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/pos-biginteger-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/pos-inf-double-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/pos-inf-double-v4.gbin
new file mode 100644
index 0000000000..6ccb17151d
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/pos-inf-double-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/pos-inf-float-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/pos-inf-float-v4.gbin
new file mode 100644
index 0000000000..e17e136094
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/pos-inf-float-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/precision-date-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/precision-date-v4.gbin
new file mode 100644
index 0000000000..2591cbbfc7
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/precision-date-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/prop-path-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/prop-path-v4.gbin
new file mode 100644
index 0000000000..9306df5aa8
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/prop-path-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/set-cardinality-vertexproperty-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/set-cardinality-vertexproperty-v4.gbin
new file mode 100644
index 0000000000..133922bb45
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/set-cardinality-vertexproperty-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/single-byte-char-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/single-byte-char-v4.gbin
new file mode 100644
index 0000000000..3c39167c7f
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/single-byte-char-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/single-byte-string-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/single-byte-string-v4.gbin
new file mode 100644
index 0000000000..86e87d5a0c
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/single-byte-string-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/specified-uuid-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/specified-uuid-v4.gbin
new file mode 100644
index 0000000000..7f1775d996
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/specified-uuid-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/str-binary-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/str-binary-v4.gbin
new file mode 100644
index 0000000000..39793d2360
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/str-binary-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/tinker-graph-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/tinker-graph-v4.gbin
new file mode 100644
index 0000000000..a0a76d1396
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/tinker-graph-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/traversal-edge-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/traversal-edge-v4.gbin
new file mode 100644
index 0000000000..f5404427d4
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/traversal-edge-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/traversal-path-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/traversal-path-v4.gbin
new file mode 100644
index 0000000000..5a0a2e5ef3
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/traversal-path-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/traversal-tree-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/traversal-tree-v4.gbin
new file mode 100644
index 0000000000..5e589e15f7
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/traversal-tree-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/traversal-vertex-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/traversal-vertex-v4.gbin
new file mode 100644
index 0000000000..4347734a13
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/traversal-vertex-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/traversal-vertexproperty-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/traversal-vertexproperty-v4.gbin
new file mode 100644
index 0000000000..8ddbebdefc
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/traversal-vertexproperty-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/true-boolean-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/true-boolean-v4.gbin
new file mode 100644
index 0000000000..a4575b9a58
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/true-boolean-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/unspecified-null-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/unspecified-null-v4.gbin
new file mode 100644
index 0000000000..b3edade43b
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/unspecified-null-v4.gbin
@@ -0,0 +1 @@
+�
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/var-bulkset-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/var-bulkset-v4.gbin
new file mode 100644
index 0000000000..4542906626
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/var-bulkset-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/var-type-list-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/var-type-list-v4.gbin
new file mode 100644
index 0000000000..273766eaa5
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/var-type-list-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/var-type-map-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/var-type-map-v4.gbin
new file mode 100644
index 0000000000..e2d511ef03
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/var-type-map-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/var-type-set-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/var-type-set-v4.gbin
new file mode 100644
index 0000000000..55e78f60e7
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/var-type-set-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/vertex-traverser-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/vertex-traverser-v4.gbin
new file mode 100644
index 0000000000..2448b5c74f
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/vertex-traverser-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/zero-date-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/zero-date-v4.gbin
new file mode 100644
index 0000000000..d8f5a59290
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/zero-date-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/zero-duration-v4.gbin b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/zero-duration-v4.gbin
new file mode 100644
index 0000000000..2e103d7370
Binary files /dev/null and b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphbinary/zero-duration-v4.gbin differ
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/bulked-traverser-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/bulked-traverser-v4.json
new file mode 100644
index 0000000000..d1f4f33ab8
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/bulked-traverser-v4.json
@@ -0,0 +1,32 @@
+{
+ "@type" : "g:Traverser",
+ "@value" : {
+ "bulk" : {
+ "@type" : "g:Int64",
+ "@value" : 7
+ },
+ "value" : {
+ "@type" : "g:Vertex",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 11
+ },
+ "label" : "software",
+ "properties" : {
+ "name" : [ {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 5
+ },
+ "value" : "tinkergraph",
+ "label" : "name"
+ }
+ } ]
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/edge-property-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/edge-property-v4.json
new file mode 100644
index 0000000000..296fe3230c
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/edge-property-v4.json
@@ -0,0 +1,10 @@
+{
+ "@type" : "g:Property",
+ "@value" : {
+ "key" : "since",
+ "value" : {
+ "@type" : "g:Int32",
+ "@value" : 2009
+ }
+ }
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/empty-binary-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/empty-binary-v4.json
new file mode 100644
index 0000000000..3fe0ec48bc
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/empty-binary-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "gx:ByteBuffer",
+ "@value" : ""
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/empty-bulkset-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/empty-bulkset-v4.json
new file mode 100644
index 0000000000..f9fb4a5eed
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/empty-bulkset-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:BulkSet",
+ "@value" : [ ]
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/empty-list-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/empty-list-v4.json
new file mode 100644
index 0000000000..aacbd803fb
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/empty-list-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:List",
+ "@value" : [ ]
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/empty-map-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/empty-map-v4.json
new file mode 100644
index 0000000000..2856adc6e7
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/empty-map-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Map",
+ "@value" : [ ]
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/empty-path-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/empty-path-v4.json
new file mode 100644
index 0000000000..9cb13f2327
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/empty-path-v4.json
@@ -0,0 +1,13 @@
+{
+ "@type" : "g:Path",
+ "@value" : {
+ "labels" : {
+ "@type" : "g:List",
+ "@value" : [ ]
+ },
+ "objects" : {
+ "@type" : "g:List",
+ "@value" : [ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/empty-set-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/empty-set-v4.json
new file mode 100644
index 0000000000..76789a41ed
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/empty-set-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Set",
+ "@value" : [ ]
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/empty-traverser-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/empty-traverser-v4.json
new file mode 100644
index 0000000000..08298d82f3
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/empty-traverser-v4.json
@@ -0,0 +1,10 @@
+{
+ "@type" : "g:Traverser",
+ "@value" : {
+ "bulk" : {
+ "@type" : "g:Int64",
+ "@value" : 0
+ },
+ "value" : null
+ }
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/false-boolean-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/false-boolean-v4.json
new file mode 100644
index 0000000000..02e4a84d62
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/false-boolean-v4.json
@@ -0,0 +1 @@
+false
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/forever-duration-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/forever-duration-v4.json
new file mode 100644
index 0000000000..ad8ff76989
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/forever-duration-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "gx:Duration",
+ "@value" : "PT2562047788015215H30M7.999999999S"
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/id-t-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/id-t-v4.json
new file mode 100644
index 0000000000..7f2e178463
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/id-t-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:T",
+ "@value" : "id"
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-byte-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-byte-v4.json
new file mode 100644
index 0000000000..b004ec57b7
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-byte-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "gx:Byte",
+ "@value" : 127
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-date-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-date-v4.json
new file mode 100644
index 0000000000..3adcbd2ed3
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-date-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Date",
+ "@value" : 9223372036854775807
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-double-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-double-v4.json
new file mode 100644
index 0000000000..37e607b85f
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-double-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Double",
+ "@value" : 1.7976931348623157E308
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-float-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-float-v4.json
new file mode 100644
index 0000000000..b008f1dd77
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-float-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Float",
+ "@value" : 3.4028235E38
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-int-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-int-v4.json
new file mode 100644
index 0000000000..f3bc62c071
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-int-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Int32",
+ "@value" : 2147483647
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-long-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-long-v4.json
new file mode 100644
index 0000000000..9bc12dc9d0
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-long-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Int64",
+ "@value" : 9223372036854775807
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-offsetdatetime-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-offsetdatetime-v4.json
new file mode 100644
index 0000000000..552963b081
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-offsetdatetime-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "gx:OffsetDateTime",
+ "@value" : "+999999999-12-31T23:59:59.999999999-18:00"
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-short-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-short-v4.json
new file mode 100644
index 0000000000..82decf22ad
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/max-short-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "gx:Int16",
+ "@value" : 32767
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/meta-vertexproperty-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/meta-vertexproperty-v4.json
new file mode 100644
index 0000000000..3dfb5842d3
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/meta-vertexproperty-v4.json
@@ -0,0 +1,14 @@
+{
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 1
+ },
+ "value" : "stephen",
+ "label" : "person",
+ "properties" : {
+ "a" : "b"
+ }
+ }
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-byte-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-byte-v4.json
new file mode 100644
index 0000000000..fedaea0d48
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-byte-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "gx:Byte",
+ "@value" : -128
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-date-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-date-v4.json
new file mode 100644
index 0000000000..e062710a8d
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-date-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Date",
+ "@value" : -9223372036854775808
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-double-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-double-v4.json
new file mode 100644
index 0000000000..689fe38b61
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-double-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Double",
+ "@value" : 4.9E-324
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-float-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-float-v4.json
new file mode 100644
index 0000000000..aa97eff785
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-float-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Float",
+ "@value" : 1.4E-45
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-int-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-int-v4.json
new file mode 100644
index 0000000000..6e43d75fcd
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-int-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Int32",
+ "@value" : -2147483648
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-long-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-long-v4.json
new file mode 100644
index 0000000000..1f41b9c3b0
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-long-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Int64",
+ "@value" : -9223372036854775808
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-offsetdatetime-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-offsetdatetime-v4.json
new file mode 100644
index 0000000000..40d58e3cc8
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-offsetdatetime-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "gx:OffsetDateTime",
+ "@value" : "-999999999-01-01T00:00+18:00"
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-short-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-short-v4.json
new file mode 100644
index 0000000000..065cafa4e6
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/min-short-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "gx:Int16",
+ "@value" : -32768
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/mixed-string-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/mixed-string-v4.json
new file mode 100644
index 0000000000..6c4ca64f10
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/mixed-string-v4.json
@@ -0,0 +1 @@
+"abcΑΒΓ"
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/multi-byte-char-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/multi-byte-char-v4.json
new file mode 100644
index 0000000000..b9f7ba2a62
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/multi-byte-char-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "gx:Char",
+ "@value" : "Ω"
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/nan-double-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/nan-double-v4.json
new file mode 100644
index 0000000000..7b10376544
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/nan-double-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Double",
+ "@value" : "NaN"
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/nan-float-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/nan-float-v4.json
new file mode 100644
index 0000000000..b831121e2f
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/nan-float-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Float",
+ "@value" : "NaN"
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-bigdecimal-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-bigdecimal-v4.json
new file mode 100644
index 0000000000..31622f7a8d
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-bigdecimal-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "gx:BigDecimal",
+ "@value" : -123.456789987654321123456789987654321
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-biginteger-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-biginteger-v4.json
new file mode 100644
index 0000000000..3cda554ad2
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-biginteger-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "gx:BigInteger",
+ "@value" : -123456789987654321123456789987654321
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-inf-double-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-inf-double-v4.json
new file mode 100644
index 0000000000..1c8db0fefd
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-inf-double-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Double",
+ "@value" : "-Infinity"
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-inf-float-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-inf-float-v4.json
new file mode 100644
index 0000000000..7eeef1151c
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-inf-float-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Float",
+ "@value" : "-Infinity"
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-max-double-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-max-double-v4.json
new file mode 100644
index 0000000000..22ee62b946
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-max-double-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Double",
+ "@value" : -1.7976931348623157E308
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-max-float-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-max-float-v4.json
new file mode 100644
index 0000000000..a1fb83b266
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-max-float-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Float",
+ "@value" : -3.4028235E38
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-min-double-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-min-double-v4.json
new file mode 100644
index 0000000000..d71c0c4883
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-min-double-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Double",
+ "@value" : -4.9E-324
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-min-float-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-min-float-v4.json
new file mode 100644
index 0000000000..49925406e2
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-min-float-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Float",
+ "@value" : -1.4E-45
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-zero-double-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-zero-double-v4.json
new file mode 100644
index 0000000000..92df6fc46a
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-zero-double-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Double",
+ "@value" : -0.0
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-zero-float-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-zero-float-v4.json
new file mode 100644
index 0000000000..fb673f61a2
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/neg-zero-float-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Float",
+ "@value" : -0.0
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/nil-uuid-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/nil-uuid-v4.json
new file mode 100644
index 0000000000..a016ec298d
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/nil-uuid-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:UUID",
+ "@value" : "00000000-0000-0000-0000-000000000000"
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/no-prop-edge-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/no-prop-edge-v4.json
new file mode 100644
index 0000000000..8712885cee
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/no-prop-edge-v4.json
@@ -0,0 +1,20 @@
+{
+ "@type" : "g:Edge",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 13
+ },
+ "label" : "develops",
+ "inVLabel" : "software",
+ "outVLabel" : "person",
+ "inV" : {
+ "@type" : "g:Int32",
+ "@value" : 10
+ },
+ "outV" : {
+ "@type" : "g:Int32",
+ "@value" : 1
+ }
+ }
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/no-prop-vertex-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/no-prop-vertex-v4.json
new file mode 100644
index 0000000000..2d7fc68651
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/no-prop-vertex-v4.json
@@ -0,0 +1,10 @@
+{
+ "@type" : "g:Vertex",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 1
+ },
+ "label" : "person"
+ }
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/null-property-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/null-property-v4.json
new file mode 100644
index 0000000000..bc62d63804
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/null-property-v4.json
@@ -0,0 +1,7 @@
+{
+ "@type" : "g:Property",
+ "@value" : {
+ "key" : "",
+ "value" : null
+ }
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/out-direction-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/out-direction-v4.json
new file mode 100644
index 0000000000..78cb7e4160
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/out-direction-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Direction",
+ "@value" : "OUT"
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/pos-bigdecimal-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/pos-bigdecimal-v4.json
new file mode 100644
index 0000000000..fcf7fd8c77
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/pos-bigdecimal-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "gx:BigDecimal",
+ "@value" : 123.456789987654321123456789987654321
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/pos-biginteger-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/pos-biginteger-v4.json
new file mode 100644
index 0000000000..58e6114369
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/pos-biginteger-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "gx:BigInteger",
+ "@value" : 123456789987654321123456789987654321
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/pos-inf-double-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/pos-inf-double-v4.json
new file mode 100644
index 0000000000..7c025113c5
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/pos-inf-double-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Double",
+ "@value" : "Infinity"
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/pos-inf-float-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/pos-inf-float-v4.json
new file mode 100644
index 0000000000..61923d9e73
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/pos-inf-float-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Float",
+ "@value" : "Infinity"
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/precision-date-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/precision-date-v4.json
new file mode 100644
index 0000000000..b94ebbb11d
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/precision-date-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Date",
+ "@value" : 11111111
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/prop-path-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/prop-path-v4.json
new file mode 100644
index 0000000000..a4edc99eae
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/prop-path-v4.json
@@ -0,0 +1,165 @@
+{
+ "@type" : "g:Path",
+ "@value" : {
+ "labels" : {
+ "@type" : "g:List",
+ "@value" : [ {
+ "@type" : "g:Set",
+ "@value" : [ ]
+ }, {
+ "@type" : "g:Set",
+ "@value" : [ ]
+ }, {
+ "@type" : "g:Set",
+ "@value" : [ ]
+ } ]
+ },
+ "objects" : {
+ "@type" : "g:List",
+ "@value" : [ {
+ "@type" : "g:Vertex",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 1
+ },
+ "label" : "person",
+ "properties" : {
+ "name" : [ {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 0
+ },
+ "value" : "marko",
+ "label" : "name"
+ }
+ } ],
+ "location" : [ {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 6
+ },
+ "value" : "san diego",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 1997
+ },
+ "endTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2001
+ }
+ }
+ }
+ }, {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 7
+ },
+ "value" : "santa cruz",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2001
+ },
+ "endTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2004
+ }
+ }
+ }
+ }, {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 8
+ },
+ "value" : "brussels",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2004
+ },
+ "endTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2005
+ }
+ }
+ }
+ }, {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 9
+ },
+ "value" : "santa fe",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2005
+ }
+ }
+ }
+ } ]
+ }
+ }
+ }, {
+ "@type" : "g:Vertex",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 10
+ },
+ "label" : "software",
+ "properties" : {
+ "name" : [ {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 4
+ },
+ "value" : "gremlin",
+ "label" : "name"
+ }
+ } ]
+ }
+ }
+ }, {
+ "@type" : "g:Vertex",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 11
+ },
+ "label" : "software",
+ "properties" : {
+ "name" : [ {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 5
+ },
+ "value" : "tinkergraph",
+ "label" : "name"
+ }
+ } ]
+ }
+ }
+ } ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/set-cardinality-vertexproperty-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/set-cardinality-vertexproperty-v4.json
new file mode 100644
index 0000000000..f768cd84f2
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/set-cardinality-vertexproperty-v4.json
@@ -0,0 +1,17 @@
+{
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 1
+ },
+ "value" : {
+ "@type" : "g:Set",
+ "@value" : [ "stephen", "marko" ]
+ },
+ "label" : "person",
+ "properties" : {
+ "a" : "b"
+ }
+ }
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/single-byte-char-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/single-byte-char-v4.json
new file mode 100644
index 0000000000..eb3dd7663f
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/single-byte-char-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "gx:Char",
+ "@value" : "a"
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/single-byte-string-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/single-byte-string-v4.json
new file mode 100644
index 0000000000..4f44a21051
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/single-byte-string-v4.json
@@ -0,0 +1 @@
+"abc"
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/specified-uuid-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/specified-uuid-v4.json
new file mode 100644
index 0000000000..1cf09f07ac
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/specified-uuid-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:UUID",
+ "@value" : "41d2e28a-20a4-4ab0-b379-d810dede3786"
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/str-binary-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/str-binary-v4.json
new file mode 100644
index 0000000000..57241159a3
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/str-binary-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "gx:ByteBuffer",
+ "@value" : "c29tZSBieXRlcyBmb3IgeW91"
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/tinker-graph-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/tinker-graph-v4.json
new file mode 100644
index 0000000000..24e95ed6af
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/tinker-graph-v4.json
@@ -0,0 +1,829 @@
+{
+ "@type" : "tinker:graph",
+ "@value" : {
+ "vertices" : [ {
+ "@type" : "g:Vertex",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 1
+ },
+ "label" : "person",
+ "properties" : {
+ "name" : [ {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 0
+ },
+ "value" : "marko",
+ "label" : "name"
+ }
+ } ],
+ "location" : [ {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 6
+ },
+ "value" : "san diego",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 1997
+ },
+ "endTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2001
+ }
+ }
+ }
+ }, {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 7
+ },
+ "value" : "santa cruz",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2001
+ },
+ "endTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2004
+ }
+ }
+ }
+ }, {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 8
+ },
+ "value" : "brussels",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2004
+ },
+ "endTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2005
+ }
+ }
+ }
+ }, {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 9
+ },
+ "value" : "santa fe",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2005
+ }
+ }
+ }
+ } ]
+ }
+ }
+ }, {
+ "@type" : "g:Vertex",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 7
+ },
+ "label" : "person",
+ "properties" : {
+ "name" : [ {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 1
+ },
+ "value" : "stephen",
+ "label" : "name"
+ }
+ } ],
+ "location" : [ {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 10
+ },
+ "value" : "centreville",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 1990
+ },
+ "endTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2000
+ }
+ }
+ }
+ }, {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 11
+ },
+ "value" : "dulles",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2000
+ },
+ "endTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2006
+ }
+ }
+ }
+ }, {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 12
+ },
+ "value" : "purcellville",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2006
+ }
+ }
+ }
+ } ]
+ }
+ }
+ }, {
+ "@type" : "g:Vertex",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 8
+ },
+ "label" : "person",
+ "properties" : {
+ "name" : [ {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 2
+ },
+ "value" : "matthias",
+ "label" : "name"
+ }
+ } ],
+ "location" : [ {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 13
+ },
+ "value" : "bremen",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2004
+ },
+ "endTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2007
+ }
+ }
+ }
+ }, {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 14
+ },
+ "value" : "baltimore",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2007
+ },
+ "endTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2011
+ }
+ }
+ }
+ }, {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 15
+ },
+ "value" : "oakland",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2011
+ },
+ "endTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2014
+ }
+ }
+ }
+ }, {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 16
+ },
+ "value" : "seattle",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2014
+ }
+ }
+ }
+ } ]
+ }
+ }
+ }, {
+ "@type" : "g:Vertex",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 9
+ },
+ "label" : "person",
+ "properties" : {
+ "name" : [ {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 3
+ },
+ "value" : "daniel",
+ "label" : "name"
+ }
+ } ],
+ "location" : [ {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 17
+ },
+ "value" : "spremberg",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 1982
+ },
+ "endTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2005
+ }
+ }
+ }
+ }, {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 18
+ },
+ "value" : "kaiserslautern",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2005
+ },
+ "endTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2009
+ }
+ }
+ }
+ }, {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 19
+ },
+ "value" : "aachen",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2009
+ }
+ }
+ }
+ } ]
+ }
+ }
+ }, {
+ "@type" : "g:Vertex",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 10
+ },
+ "label" : "software",
+ "properties" : {
+ "name" : [ {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 4
+ },
+ "value" : "gremlin",
+ "label" : "name"
+ }
+ } ]
+ }
+ }
+ }, {
+ "@type" : "g:Vertex",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 11
+ },
+ "label" : "software",
+ "properties" : {
+ "name" : [ {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 5
+ },
+ "value" : "tinkergraph",
+ "label" : "name"
+ }
+ } ]
+ }
+ }
+ } ],
+ "edges" : [ {
+ "@type" : "g:Edge",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 13
+ },
+ "label" : "develops",
+ "inVLabel" : "software",
+ "outVLabel" : "person",
+ "inV" : {
+ "@type" : "g:Int32",
+ "@value" : 10
+ },
+ "outV" : {
+ "@type" : "g:Int32",
+ "@value" : 1
+ },
+ "properties" : {
+ "since" : {
+ "@type" : "g:Property",
+ "@value" : {
+ "key" : "since",
+ "value" : {
+ "@type" : "g:Int32",
+ "@value" : 2009
+ }
+ }
+ }
+ }
+ }
+ }, {
+ "@type" : "g:Edge",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 14
+ },
+ "label" : "develops",
+ "inVLabel" : "software",
+ "outVLabel" : "person",
+ "inV" : {
+ "@type" : "g:Int32",
+ "@value" : 11
+ },
+ "outV" : {
+ "@type" : "g:Int32",
+ "@value" : 1
+ },
+ "properties" : {
+ "since" : {
+ "@type" : "g:Property",
+ "@value" : {
+ "key" : "since",
+ "value" : {
+ "@type" : "g:Int32",
+ "@value" : 2010
+ }
+ }
+ }
+ }
+ }
+ }, {
+ "@type" : "g:Edge",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 15
+ },
+ "label" : "uses",
+ "inVLabel" : "software",
+ "outVLabel" : "person",
+ "inV" : {
+ "@type" : "g:Int32",
+ "@value" : 10
+ },
+ "outV" : {
+ "@type" : "g:Int32",
+ "@value" : 1
+ },
+ "properties" : {
+ "skill" : {
+ "@type" : "g:Property",
+ "@value" : {
+ "key" : "skill",
+ "value" : {
+ "@type" : "g:Int32",
+ "@value" : 4
+ }
+ }
+ }
+ }
+ }
+ }, {
+ "@type" : "g:Edge",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 16
+ },
+ "label" : "uses",
+ "inVLabel" : "software",
+ "outVLabel" : "person",
+ "inV" : {
+ "@type" : "g:Int32",
+ "@value" : 11
+ },
+ "outV" : {
+ "@type" : "g:Int32",
+ "@value" : 1
+ },
+ "properties" : {
+ "skill" : {
+ "@type" : "g:Property",
+ "@value" : {
+ "key" : "skill",
+ "value" : {
+ "@type" : "g:Int32",
+ "@value" : 5
+ }
+ }
+ }
+ }
+ }
+ }, {
+ "@type" : "g:Edge",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 17
+ },
+ "label" : "develops",
+ "inVLabel" : "software",
+ "outVLabel" : "person",
+ "inV" : {
+ "@type" : "g:Int32",
+ "@value" : 10
+ },
+ "outV" : {
+ "@type" : "g:Int32",
+ "@value" : 7
+ },
+ "properties" : {
+ "since" : {
+ "@type" : "g:Property",
+ "@value" : {
+ "key" : "since",
+ "value" : {
+ "@type" : "g:Int32",
+ "@value" : 2010
+ }
+ }
+ }
+ }
+ }
+ }, {
+ "@type" : "g:Edge",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 18
+ },
+ "label" : "develops",
+ "inVLabel" : "software",
+ "outVLabel" : "person",
+ "inV" : {
+ "@type" : "g:Int32",
+ "@value" : 11
+ },
+ "outV" : {
+ "@type" : "g:Int32",
+ "@value" : 7
+ },
+ "properties" : {
+ "since" : {
+ "@type" : "g:Property",
+ "@value" : {
+ "key" : "since",
+ "value" : {
+ "@type" : "g:Int32",
+ "@value" : 2011
+ }
+ }
+ }
+ }
+ }
+ }, {
+ "@type" : "g:Edge",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 19
+ },
+ "label" : "uses",
+ "inVLabel" : "software",
+ "outVLabel" : "person",
+ "inV" : {
+ "@type" : "g:Int32",
+ "@value" : 10
+ },
+ "outV" : {
+ "@type" : "g:Int32",
+ "@value" : 7
+ },
+ "properties" : {
+ "skill" : {
+ "@type" : "g:Property",
+ "@value" : {
+ "key" : "skill",
+ "value" : {
+ "@type" : "g:Int32",
+ "@value" : 5
+ }
+ }
+ }
+ }
+ }
+ }, {
+ "@type" : "g:Edge",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 20
+ },
+ "label" : "uses",
+ "inVLabel" : "software",
+ "outVLabel" : "person",
+ "inV" : {
+ "@type" : "g:Int32",
+ "@value" : 11
+ },
+ "outV" : {
+ "@type" : "g:Int32",
+ "@value" : 7
+ },
+ "properties" : {
+ "skill" : {
+ "@type" : "g:Property",
+ "@value" : {
+ "key" : "skill",
+ "value" : {
+ "@type" : "g:Int32",
+ "@value" : 4
+ }
+ }
+ }
+ }
+ }
+ }, {
+ "@type" : "g:Edge",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 21
+ },
+ "label" : "develops",
+ "inVLabel" : "software",
+ "outVLabel" : "person",
+ "inV" : {
+ "@type" : "g:Int32",
+ "@value" : 10
+ },
+ "outV" : {
+ "@type" : "g:Int32",
+ "@value" : 8
+ },
+ "properties" : {
+ "since" : {
+ "@type" : "g:Property",
+ "@value" : {
+ "key" : "since",
+ "value" : {
+ "@type" : "g:Int32",
+ "@value" : 2012
+ }
+ }
+ }
+ }
+ }
+ }, {
+ "@type" : "g:Edge",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 22
+ },
+ "label" : "uses",
+ "inVLabel" : "software",
+ "outVLabel" : "person",
+ "inV" : {
+ "@type" : "g:Int32",
+ "@value" : 10
+ },
+ "outV" : {
+ "@type" : "g:Int32",
+ "@value" : 8
+ },
+ "properties" : {
+ "skill" : {
+ "@type" : "g:Property",
+ "@value" : {
+ "key" : "skill",
+ "value" : {
+ "@type" : "g:Int32",
+ "@value" : 3
+ }
+ }
+ }
+ }
+ }
+ }, {
+ "@type" : "g:Edge",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 23
+ },
+ "label" : "uses",
+ "inVLabel" : "software",
+ "outVLabel" : "person",
+ "inV" : {
+ "@type" : "g:Int32",
+ "@value" : 11
+ },
+ "outV" : {
+ "@type" : "g:Int32",
+ "@value" : 8
+ },
+ "properties" : {
+ "skill" : {
+ "@type" : "g:Property",
+ "@value" : {
+ "key" : "skill",
+ "value" : {
+ "@type" : "g:Int32",
+ "@value" : 3
+ }
+ }
+ }
+ }
+ }
+ }, {
+ "@type" : "g:Edge",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 24
+ },
+ "label" : "uses",
+ "inVLabel" : "software",
+ "outVLabel" : "person",
+ "inV" : {
+ "@type" : "g:Int32",
+ "@value" : 10
+ },
+ "outV" : {
+ "@type" : "g:Int32",
+ "@value" : 9
+ },
+ "properties" : {
+ "skill" : {
+ "@type" : "g:Property",
+ "@value" : {
+ "key" : "skill",
+ "value" : {
+ "@type" : "g:Int32",
+ "@value" : 5
+ }
+ }
+ }
+ }
+ }
+ }, {
+ "@type" : "g:Edge",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 25
+ },
+ "label" : "uses",
+ "inVLabel" : "software",
+ "outVLabel" : "person",
+ "inV" : {
+ "@type" : "g:Int32",
+ "@value" : 11
+ },
+ "outV" : {
+ "@type" : "g:Int32",
+ "@value" : 9
+ },
+ "properties" : {
+ "skill" : {
+ "@type" : "g:Property",
+ "@value" : {
+ "key" : "skill",
+ "value" : {
+ "@type" : "g:Int32",
+ "@value" : 3
+ }
+ }
+ }
+ }
+ }
+ }, {
+ "@type" : "g:Edge",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 26
+ },
+ "label" : "traverses",
+ "inVLabel" : "software",
+ "outVLabel" : "software",
+ "inV" : {
+ "@type" : "g:Int32",
+ "@value" : 11
+ },
+ "outV" : {
+ "@type" : "g:Int32",
+ "@value" : 10
+ }
+ }
+ } ]
+ }
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-edge-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-edge-v4.json
new file mode 100644
index 0000000000..ba1c52eb1e
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-edge-v4.json
@@ -0,0 +1,32 @@
+{
+ "@type" : "g:Edge",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 13
+ },
+ "label" : "develops",
+ "inVLabel" : "software",
+ "outVLabel" : "person",
+ "inV" : {
+ "@type" : "g:Int32",
+ "@value" : 10
+ },
+ "outV" : {
+ "@type" : "g:Int32",
+ "@value" : 1
+ },
+ "properties" : {
+ "since" : {
+ "@type" : "g:Property",
+ "@value" : {
+ "key" : "since",
+ "value" : {
+ "@type" : "g:Int32",
+ "@value" : 2009
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-path-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-path-v4.json
new file mode 100644
index 0000000000..216b39354d
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-path-v4.json
@@ -0,0 +1,49 @@
+{
+ "@type" : "g:Path",
+ "@value" : {
+ "labels" : {
+ "@type" : "g:List",
+ "@value" : [ {
+ "@type" : "g:Set",
+ "@value" : [ ]
+ }, {
+ "@type" : "g:Set",
+ "@value" : [ ]
+ }, {
+ "@type" : "g:Set",
+ "@value" : [ ]
+ } ]
+ },
+ "objects" : {
+ "@type" : "g:List",
+ "@value" : [ {
+ "@type" : "g:Vertex",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 1
+ },
+ "label" : "person"
+ }
+ }, {
+ "@type" : "g:Vertex",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 10
+ },
+ "label" : "software"
+ }
+ }, {
+ "@type" : "g:Vertex",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 11
+ },
+ "label" : "software"
+ }
+ } ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-tree-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-tree-v4.json
new file mode 100644
index 0000000000..25b1f99d17
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-tree-v4.json
@@ -0,0 +1,60 @@
+{
+ "@type" : "g:Tree",
+ "@value" : [ {
+ "key" : {
+ "@type" : "g:Vertex",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 10
+ },
+ "label" : "software",
+ "properties" : {
+ "name" : [ {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 4
+ },
+ "value" : "gremlin",
+ "label" : "name"
+ }
+ } ]
+ }
+ }
+ },
+ "value" : {
+ "@type" : "g:Tree",
+ "@value" : [ {
+ "key" : {
+ "@type" : "g:Vertex",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 11
+ },
+ "label" : "software",
+ "properties" : {
+ "name" : [ {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 5
+ },
+ "value" : "tinkergraph",
+ "label" : "name"
+ }
+ } ]
+ }
+ }
+ },
+ "value" : {
+ "@type" : "g:Tree",
+ "@value" : [ ]
+ }
+ } ]
+ }
+ } ]
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-vertex-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-vertex-v4.json
new file mode 100644
index 0000000000..f10223032f
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-vertex-v4.json
@@ -0,0 +1,100 @@
+{
+ "@type" : "g:Vertex",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 1
+ },
+ "label" : "person",
+ "properties" : {
+ "name" : [ {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 0
+ },
+ "value" : "marko",
+ "label" : "name"
+ }
+ } ],
+ "location" : [ {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 6
+ },
+ "value" : "san diego",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 1997
+ },
+ "endTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2001
+ }
+ }
+ }
+ }, {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 7
+ },
+ "value" : "santa cruz",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2001
+ },
+ "endTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2004
+ }
+ }
+ }
+ }, {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 8
+ },
+ "value" : "brussels",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2004
+ },
+ "endTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2005
+ }
+ }
+ }
+ }, {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 9
+ },
+ "value" : "santa fe",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2005
+ }
+ }
+ }
+ } ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-vertexproperty-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-vertexproperty-v4.json
new file mode 100644
index 0000000000..af184b1766
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/traversal-vertexproperty-v4.json
@@ -0,0 +1,11 @@
+{
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 0
+ },
+ "value" : "marko",
+ "label" : "name"
+ }
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/true-boolean-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/true-boolean-v4.json
new file mode 100644
index 0000000000..f32a5804e2
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/true-boolean-v4.json
@@ -0,0 +1 @@
+true
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/unspecified-null-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/unspecified-null-v4.json
new file mode 100644
index 0000000000..ec747fa47d
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/unspecified-null-v4.json
@@ -0,0 +1 @@
+null
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/var-bulkset-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/var-bulkset-v4.json
new file mode 100644
index 0000000000..c216a36171
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/var-bulkset-v4.json
@@ -0,0 +1,10 @@
+{
+ "@type" : "g:BulkSet",
+ "@value" : [ "marko", {
+ "@type" : "g:Int64",
+ "@value" : 1
+ }, "josh", {
+ "@type" : "g:Int64",
+ "@value" : 2
+ } ]
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/var-type-list-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/var-type-list-v4.json
new file mode 100644
index 0000000000..a940634beb
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/var-type-list-v4.json
@@ -0,0 +1,7 @@
+{
+ "@type" : "g:List",
+ "@value" : [ {
+ "@type" : "g:Int32",
+ "@value" : 1
+ }, "person", true, null ]
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/var-type-map-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/var-type-map-v4.json
new file mode 100644
index 0000000000..5f551eb5d4
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/var-type-map-v4.json
@@ -0,0 +1,25 @@
+{
+ "@type" : "g:Map",
+ "@value" : [ null, null, {
+ "@type" : "g:List",
+ "@value" : [ {
+ "@type" : "g:Int32",
+ "@value" : 1
+ }, {
+ "@type" : "g:Int32",
+ "@value" : 2
+ }, {
+ "@type" : "g:Int32",
+ "@value" : 3
+ } ]
+ }, {
+ "@type" : "g:Date",
+ "@value" : 1481295
+ }, "test", {
+ "@type" : "g:Int32",
+ "@value" : 123
+ }, {
+ "@type" : "g:Date",
+ "@value" : 1481295
+ }, "red" ]
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/var-type-set-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/var-type-set-v4.json
new file mode 100644
index 0000000000..afb8f93dc9
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/var-type-set-v4.json
@@ -0,0 +1,7 @@
+{
+ "@type" : "g:Set",
+ "@value" : [ null, {
+ "@type" : "g:Int32",
+ "@value" : 2
+ }, "person", true ]
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/vertex-traverser-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/vertex-traverser-v4.json
new file mode 100644
index 0000000000..a59a29e9da
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/vertex-traverser-v4.json
@@ -0,0 +1,109 @@
+{
+ "@type" : "g:Traverser",
+ "@value" : {
+ "bulk" : {
+ "@type" : "g:Int64",
+ "@value" : 1
+ },
+ "value" : {
+ "@type" : "g:Vertex",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int32",
+ "@value" : 1
+ },
+ "label" : "person",
+ "properties" : {
+ "name" : [ {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 0
+ },
+ "value" : "marko",
+ "label" : "name"
+ }
+ } ],
+ "location" : [ {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 6
+ },
+ "value" : "san diego",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 1997
+ },
+ "endTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2001
+ }
+ }
+ }
+ }, {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 7
+ },
+ "value" : "santa cruz",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2001
+ },
+ "endTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2004
+ }
+ }
+ }
+ }, {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 8
+ },
+ "value" : "brussels",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2004
+ },
+ "endTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2005
+ }
+ }
+ }
+ }, {
+ "@type" : "g:VertexProperty",
+ "@value" : {
+ "id" : {
+ "@type" : "g:Int64",
+ "@value" : 9
+ },
+ "value" : "santa fe",
+ "label" : "location",
+ "properties" : {
+ "startTime" : {
+ "@type" : "g:Int32",
+ "@value" : 2005
+ }
+ }
+ }
+ } ]
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/zero-date-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/zero-date-v4.json
new file mode 100644
index 0000000000..14f354ddf4
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/zero-date-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "g:Date",
+ "@value" : 0
+}
\ No newline at end of file
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/zero-duration-v4.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/zero-duration-v4.json
new file mode 100644
index 0000000000..e14db84027
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/zero-duration-v4.json
@@ -0,0 +1,4 @@
+{
+ "@type" : "gx:Duration",
+ "@value" : "PT0S"
+}
\ No newline at end of file
diff --git a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/AbstractTypedCompatibilityTest.java b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/AbstractTypedCompatibilityTest.java
index e495b3a80c..7bd3980904 100644
--- a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/AbstractTypedCompatibilityTest.java
+++ b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/AbstractTypedCompatibilityTest.java
@@ -29,6 +29,8 @@ import org.apache.tinkerpop.gremlin.process.traversal.SackFunctions;
import org.apache.tinkerpop.gremlin.process.traversal.Scope;
import org.apache.tinkerpop.gremlin.process.traversal.TextP;
import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
import org.apache.tinkerpop.gremlin.process.traversal.util.Metrics;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
import org.apache.tinkerpop.gremlin.structure.Column;
@@ -87,20 +89,21 @@ import static org.junit.Assume.assumeThat;
public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibilityTest {
@Test
- public void shouldReadWriteBarrier() throws Exception {
- final String resourceName = "barrier";
+ public void shouldReadWritePositiveBigDecimal() throws Exception {
+ final String resourceName = "pos-bigdecimal";
- final SackFunctions.Barrier resource = findModelEntryObject(resourceName);
- final SackFunctions.Barrier fromStatic = read(readFromResource(resourceName), SackFunctions.Barrier.class);
- final SackFunctions.Barrier recycled = read(write(fromStatic, SackFunctions.Barrier.class, resourceName), SackFunctions.Barrier.class);
+ final BigDecimal resource = findModelEntryObject(resourceName);
+ final BigDecimal fromStatic = read(readFromResource(resourceName), BigDecimal.class);
+ final BigDecimal recycled = read(write(fromStatic, BigDecimal.class, resourceName), BigDecimal.class);
+ assertNotSame(fromStatic, recycled);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
}
@Test
- public void shouldReadWriteBigDecimal() throws Exception {
- final String resourceName = "bigdecimal";
+ public void shouldReadWriteNegativeBigDecimal() throws Exception {
+ final String resourceName = "neg-bigdecimal";
final BigDecimal resource = findModelEntryObject(resourceName);
final BigDecimal fromStatic = read(readFromResource(resourceName), BigDecimal.class);
@@ -112,8 +115,8 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
}
@Test
- public void shouldReadWriteBigInteger() throws Exception {
- final String resourceName = "biginteger";
+ public void shouldReadWritePositiveBigInteger() throws Exception {
+ final String resourceName = "pos-biginteger";
final BigInteger resource = findModelEntryObject(resourceName);
final BigInteger fromStatic = read(readFromResource(resourceName), BigInteger.class);
@@ -125,8 +128,21 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
}
@Test
- public void shouldReadWriteByte() throws Exception {
- final String resourceName = "byte";
+ public void shouldReadWriteNegativeBigInteger() throws Exception {
+ final String resourceName = "neg-biginteger";
+
+ final BigInteger resource = findModelEntryObject(resourceName);
+ final BigInteger fromStatic = read(readFromResource(resourceName), BigInteger.class);
+ final BigInteger recycled = read(write(fromStatic, BigInteger.class, resourceName), BigInteger.class);
+ assertNotSame(fromStatic, recycled);
+ assertEquals(fromStatic, recycled);
+ assertEquals(resource, fromStatic);
+ assertEquals(resource, recycled);
+ }
+
+ @Test
+ public void shouldReadWriteMinByte() throws Exception {
+ final String resourceName = "min-byte";
final Byte resource = findModelEntryObject(resourceName);
final Byte fromStatic = read(readFromResource(resourceName), Byte.class);
@@ -137,8 +153,20 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
}
@Test
- public void shouldReadWriteByteBuffer() throws Exception {
- final String resourceName = "bytebuffer";
+ public void shouldReadWriteMaxByte() throws Exception {
+ final String resourceName = "max-byte";
+
+ final Byte resource = findModelEntryObject(resourceName);
+ final Byte fromStatic = read(readFromResource(resourceName), Byte.class);
+ final Byte recycled = read(write(fromStatic, Byte.class, resourceName), Byte.class);
+ assertEquals(fromStatic, recycled);
+ assertEquals(resource, fromStatic);
+ assertEquals(resource, recycled);
+ }
+
+ @Test
+ public void shouldReadWriteEmptyByteBuffer() throws Exception {
+ final String resourceName = "empty-binary";
final ByteBuffer resource = findModelEntryObject(resourceName);
final ByteBuffer fromStatic = read(readFromResource(resourceName), ByteBuffer.class);
@@ -154,60 +182,81 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
}
@Test
- public void shouldReadWriteCardinality() throws Exception {
- final String resourceName = "cardinality";
+ public void shouldReadWriteStringByteBuffer() throws Exception {
+ final String resourceName = "str-binary";
- final VertexProperty.Cardinality resource = findModelEntryObject(resourceName);
- final VertexProperty.Cardinality fromStatic = read(readFromResource(resourceName), VertexProperty.Cardinality.class);
- final VertexProperty.Cardinality recycled = read(write(fromStatic, VertexProperty.Cardinality.class, resourceName), VertexProperty.Cardinality.class);
+ final ByteBuffer resource = findModelEntryObject(resourceName);
+ final ByteBuffer fromStatic = read(readFromResource(resourceName), ByteBuffer.class);
+ // have to re-read because once the bytebuffer is flushed to array it will be emptied
+ final ByteBuffer recycled = read(write(read(readFromResource(resourceName), ByteBuffer.class), ByteBuffer.class, resourceName), ByteBuffer.class);
+ assertNotSame(fromStatic, recycled);
+ final byte[] resourceArray = resource.array();
+ final byte[] fromStaticArray = fromStatic.array();
+ final byte[] recycledArray = recycled.array();
+ assertThat(Arrays.equals(fromStaticArray, recycledArray), is(true));
+ assertThat(Arrays.equals(resourceArray, fromStaticArray), is(true));
+ assertThat(Arrays.equals(resourceArray, recycledArray), is(true));
+ }
+
+ @Test
+ public void shouldReadWriteMaxDouble() throws Exception {
+ final String resourceName = "max-double";
+
+ final Double resource = findModelEntryObject(resourceName);
+ final Double fromStatic = read(readFromResource(resourceName), Double.class);
+ final Double recycled = read(write(fromStatic, Double.class, resourceName), Double.class);
+ assertNotSame(fromStatic, recycled);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
}
@Test
- public void shouldReadWriteChar() throws Exception {
- final String resourceName = "char";
+ public void shouldReadWriteMinDouble() throws Exception {
+ final String resourceName = "min-double";
- final Character resource = findModelEntryObject(resourceName);
- final Character fromStatic = read(readFromResource(resourceName), Character.class);
- final Character recycled = read(write(fromStatic, Character.class, resourceName), Character.class);
+ final Double resource = findModelEntryObject(resourceName);
+ final Double fromStatic = read(readFromResource(resourceName), Double.class);
+ final Double recycled = read(write(fromStatic, Double.class, resourceName), Double.class);
+ assertNotSame(fromStatic, recycled);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
}
@Test
- public void shouldReadWriteClass() throws Exception {
- final String resourceName = "class";
+ public void shouldReadWriteMaxNegativeDouble() throws Exception {
+ final String resourceName = "neg-max-double";
- final Class resource = findModelEntryObject(resourceName);
- final Class fromStatic = read(readFromResource(resourceName), Class.class);
- final Class recycled = read(write(fromStatic, Class.class, resourceName), Class.class);
+ final Double resource = findModelEntryObject(resourceName);
+ final Double fromStatic = read(readFromResource(resourceName), Double.class);
+ final Double recycled = read(write(fromStatic, Double.class, resourceName), Double.class);
+ assertNotSame(fromStatic, recycled);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
}
@Test
- public void shouldReadWriteColumn() throws Exception {
- final String resourceName = "column";
+ public void shouldReadWriteMinNegativeDouble() throws Exception {
+ final String resourceName = "neg-min-double";
- final Column resource = findModelEntryObject(resourceName);
- final Column fromStatic = read(readFromResource(resourceName), Column.class);
- final Column recycled = read(write(fromStatic, Column.class, resourceName), Column.class);
+ final Double resource = findModelEntryObject(resourceName);
+ final Double fromStatic = read(readFromResource(resourceName), Double.class);
+ final Double recycled = read(write(fromStatic, Double.class, resourceName), Double.class);
+ assertNotSame(fromStatic, recycled);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
}
@Test
- public void shouldReadWriteDate() throws Exception {
- final String resourceName = "date";
+ public void shouldReadWriteNanDouble() throws Exception {
+ final String resourceName = "nan-double";
- final Date resource = findModelEntryObject(resourceName);
- final Date fromStatic = read(readFromResource(resourceName), Date.class);
- final Date recycled = read(write(fromStatic, Date.class, resourceName), Date.class);
+ final Double resource = findModelEntryObject(resourceName);
+ final Double fromStatic = read(readFromResource(resourceName), Double.class);
+ final Double recycled = read(write(fromStatic, Double.class, resourceName), Double.class);
assertNotSame(fromStatic, recycled);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
@@ -215,20 +264,34 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
}
@Test
- public void shouldReadWriteDirection() throws Exception {
- final String resourceName = "direction";
+ public void shouldReadWritePositiveInfinityDouble() throws Exception {
+ final String resourceName = "pos-inf-double";
- final Direction resource = findModelEntryObject(resourceName);
- final Direction fromStatic = read(readFromResource(resourceName), Direction.class);
- final Direction recycled = read(write(fromStatic, Direction.class, resourceName), Direction.class);
+ final Double resource = findModelEntryObject(resourceName);
+ final Double fromStatic = read(readFromResource(resourceName), Double.class);
+ final Double recycled = read(write(fromStatic, Double.class, resourceName), Double.class);
+ assertNotSame(fromStatic, recycled);
+ assertEquals(fromStatic, recycled);
+ assertEquals(resource, fromStatic);
+ assertEquals(resource, recycled);
+ }
+
+ @Test
+ public void shouldReadWriteNegativeInfinityDouble() throws Exception {
+ final String resourceName = "neg-inf-double";
+
+ final Double resource = findModelEntryObject(resourceName);
+ final Double fromStatic = read(readFromResource(resourceName), Double.class);
+ final Double recycled = read(write(fromStatic, Double.class, resourceName), Double.class);
+ assertNotSame(fromStatic, recycled);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
}
@Test
- public void shouldReadWriteDouble() throws Exception {
- final String resourceName = "double";
+ public void shouldReadWriteNegativeZeroDouble() throws Exception {
+ final String resourceName = "neg-zero-double";
final Double resource = findModelEntryObject(resourceName);
final Double fromStatic = read(readFromResource(resourceName), Double.class);
@@ -240,8 +303,20 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
}
@Test
- public void shouldReadWriteDuration() throws Exception {
- final String resourceName = "duration";
+ public void shouldReadWriteZeroDuration() throws Exception {
+ final String resourceName = "zero-duration";
+
+ final Duration resource = findModelEntryObject(resourceName);
+ final Duration fromStatic = read(readFromResource(resourceName), Duration.class);
+ final Duration recycled = read(write(fromStatic, Duration.class, resourceName), Duration.class);
+ assertEquals(fromStatic, recycled);
+ assertEquals(resource, fromStatic);
+ assertEquals(resource, recycled);
+ }
+
+ @Test
+ public void shouldReadWriteForeverDuration() throws Exception {
+ final String resourceName = "forever-duration";
final Duration resource = findModelEntryObject(resourceName);
final Duration fromStatic = read(readFromResource(resourceName), Duration.class);
@@ -254,7 +329,7 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
@Test
public void shouldReadWriteEdge() throws Exception {
- final String resourceName = "edge";
+ final String resourceName = "traversal-edge";
final Edge resource = findModelEntryObject(resourceName);
final Edge fromStatic = read(readFromResource(resourceName), Edge.class);
@@ -268,37 +343,40 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
}
@Test
- public void shouldReadWriteFloat() throws Exception {
- final String resourceName = "float";
+ public void shouldReadWriteNoPropertyEdge() throws Exception {
+ final String resourceName = "no-prop-edge";
- final Float resource = findModelEntryObject(resourceName);
- final Float fromStatic = read(readFromResource(resourceName), Float.class);
- final Float recycled = read(write(fromStatic, Float.class, resourceName), Float.class);
+ final Edge resource = findModelEntryObject(resourceName);
+ final Edge fromStatic = read(readFromResource(resourceName), Edge.class);
+ final Edge recycled = read(write(fromStatic, Edge.class, resourceName), Edge.class);
assertNotSame(fromStatic, recycled);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
+ assertEdge(resource, fromStatic);
+ assertEdge(resource, recycled);
}
@Test
- public void shouldReadWriteINetAddress() throws Exception {
- final String resourceName = "inetaddress";
+ public void shouldReadWriteMaxFloat() throws Exception {
+ final String resourceName = "max-float";
- final InetAddress resource = findModelEntryObject(resourceName);
- final InetAddress fromStatic = read(readFromResource(resourceName), InetAddress.class);
- final InetAddress recycled = read(write(fromStatic, Float.class, resourceName), InetAddress.class);
+ final Float resource = findModelEntryObject(resourceName);
+ final Float fromStatic = read(readFromResource(resourceName), Float.class);
+ final Float recycled = read(write(fromStatic, Float.class, resourceName), Float.class);
+ assertNotSame(fromStatic, recycled);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
}
@Test
- public void shouldReadWriteInstant() throws Exception {
- final String resourceName = "instant";
+ public void shouldReadWriteMinFloat() throws Exception {
+ final String resourceName = "min-float";
- final Instant resource = findModelEntryObject(resourceName);
- final Instant fromStatic = read(readFromResource(resourceName), Instant.class);
- final Instant recycled = read(write(fromStatic, Instant.class, resourceName), Instant.class);
+ final Float resource = findModelEntryObject(resourceName);
+ final Float fromStatic = read(readFromResource(resourceName), Float.class);
+ final Float recycled = read(write(fromStatic, Float.class, resourceName), Float.class);
assertNotSame(fromStatic, recycled);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
@@ -306,24 +384,25 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
}
@Test
- public void shouldReadWriteInteger() throws Exception {
- final String resourceName = "integer";
+ public void shouldReadWriteMaxNegativeFloat() throws Exception {
+ final String resourceName = "neg-max-float";
- final Integer resource = findModelEntryObject(resourceName);
- final Integer fromStatic = read(readFromResource(resourceName), Integer.class);
- final Integer recycled = read(write(fromStatic, Integer.class, resourceName), Integer.class);
+ final Float resource = findModelEntryObject(resourceName);
+ final Float fromStatic = read(readFromResource(resourceName), Float.class);
+ final Float recycled = read(write(fromStatic, Float.class, resourceName), Float.class);
+ assertNotSame(fromStatic, recycled);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
}
@Test
- public void shouldReadWriteLambda() throws Exception {
- final String resourceName = "lambda";
+ public void shouldReadWriteMinNegativeFloat() throws Exception {
+ final String resourceName = "neg-min-float";
- final Lambda resource = findModelEntryObject(resourceName);
- final Lambda fromStatic = read(readFromResource(resourceName), Lambda.class);
- final Lambda recycled = read(write(fromStatic, Lambda.class, resourceName), Lambda.class);
+ final Float resource = findModelEntryObject(resourceName);
+ final Float fromStatic = read(readFromResource(resourceName), Float.class);
+ final Float recycled = read(write(fromStatic, Float.class, resourceName), Float.class);
assertNotSame(fromStatic, recycled);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
@@ -331,12 +410,12 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
}
@Test
- public void shouldReadWriteLocalDate() throws Exception {
- final String resourceName = "localdate";
+ public void shouldReadWriteNanFloat() throws Exception {
+ final String resourceName = "nan-float";
- final LocalDate resource = findModelEntryObject(resourceName);
- final LocalDate fromStatic = read(readFromResource(resourceName), LocalDate.class);
- final LocalDate recycled = read(write(fromStatic, LocalDate.class, resourceName), LocalDate.class);
+ final Float resource = findModelEntryObject(resourceName);
+ final Float fromStatic = read(readFromResource(resourceName), Float.class);
+ final Float recycled = read(write(fromStatic, Float.class, resourceName), Float.class);
assertNotSame(fromStatic, recycled);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
@@ -344,12 +423,12 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
}
@Test
- public void shouldReadWriteLocalDateTime() throws Exception {
- final String resourceName = "localdatetime";
+ public void shouldReadWritePositiveInfinityFloat() throws Exception {
+ final String resourceName = "pos-inf-float";
- final LocalDateTime resource = findModelEntryObject(resourceName);
- final LocalDateTime fromStatic = read(readFromResource(resourceName), LocalDateTime.class);
- final LocalDateTime recycled = read(write(fromStatic, LocalDateTime.class, resourceName), LocalDateTime.class);
+ final Float resource = findModelEntryObject(resourceName);
+ final Float fromStatic = read(readFromResource(resourceName), Float.class);
+ final Float recycled = read(write(fromStatic, Float.class, resourceName), Float.class);
assertNotSame(fromStatic, recycled);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
@@ -357,12 +436,12 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
}
@Test
- public void shouldReadWriteLocalTime() throws Exception {
- final String resourceName = "localtime";
+ public void shouldReadWriteNegativeInfinityFloat() throws Exception {
+ final String resourceName = "neg-inf-float";
- final LocalTime resource = findModelEntryObject(resourceName);
- final LocalTime fromStatic = read(readFromResource(resourceName), LocalTime.class);
- final LocalTime recycled = read(write(fromStatic, LocalTime.class, resourceName), LocalTime.class);
+ final Float resource = findModelEntryObject(resourceName);
+ final Float fromStatic = read(readFromResource(resourceName), Float.class);
+ final Float recycled = read(write(fromStatic, Float.class, resourceName), Float.class);
assertNotSame(fromStatic, recycled);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
@@ -370,144 +449,136 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
}
@Test
- public void shouldReadWriteLong() throws Exception {
- final String resourceName = "long";
+ public void shouldReadWriteNegativeZeroFloat() throws Exception {
+ final String resourceName = "neg-zero-float";
- final Long resource = findModelEntryObject(resourceName);
- final Long fromStatic = read(readFromResource(resourceName), Long.class);
- final Long recycled = read(write(fromStatic, Long.class, resourceName), Long.class);
+ final Float resource = findModelEntryObject(resourceName);
+ final Float fromStatic = read(readFromResource(resourceName), Float.class);
+ final Float recycled = read(write(fromStatic, Float.class, resourceName), Float.class);
+ assertNotSame(fromStatic, recycled);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
}
@Test
- public void shouldReadWriteList() throws Exception {
- final String resourceName = "list";
-
- assumeThat("GraphSON v2 didn't explicitly have List as a type",
- is(this.getClass().equals(GraphSONTypedCompatibilityTest.class) && getCompatibility().equals("v2")));
+ public void shouldReadWriteMaxInteger() throws Exception {
+ final String resourceName = "max-int";
- final List resource = findModelEntryObject(resourceName);
- final List fromStatic = read(readFromResource(resourceName), List.class);
- final List recycled = read(write(fromStatic, List.class, resourceName), List.class);
+ final Integer resource = findModelEntryObject(resourceName);
+ final Integer fromStatic = read(readFromResource(resourceName), Integer.class);
+ final Integer recycled = read(write(fromStatic, Integer.class, resourceName), Integer.class);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
}
@Test
- public void shouldReadWriteMap() throws Exception {
- final String resourceName = "map";
+ public void shouldReadWriteMinInteger() throws Exception {
+ final String resourceName = "min-int";
- assumeThat("GraphSON v2 didn't explicitly have Map as a type",
- is(this.getClass().equals(GraphSONTypedCompatibilityTest.class) && getCompatibility().equals("v2")));
-
- final Map resource = findModelEntryObject(resourceName);
- final Map fromStatic = read(readFromResource(resourceName), Map.class);
- final Map recycled = read(write(fromStatic, Map.class, resourceName), Map.class);
+ final Integer resource = findModelEntryObject(resourceName);
+ final Integer fromStatic = read(readFromResource(resourceName), Integer.class);
+ final Integer recycled = read(write(fromStatic, Integer.class, resourceName), Integer.class);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
}
@Test
- public void shouldReadWriteMetrics() throws Exception {
- final String resourceName = "metrics";
+ public void shouldReadWriteMaxLong() throws Exception {
+ final String resourceName = "max-long";
- final Metrics fromStatic = read(readFromResource(resourceName), Metrics.class);
- final Metrics recycled = read(write(fromStatic, Metrics.class, resourceName), Metrics.class);
- assertNotSame(fromStatic, recycled);
- // have to do compares on the object read from resources because it has statically calculated values. the
- // "new" one from Model is generated dynamically from a traversal and thus has variations in properties that
- // are based on time
- assertEquals(fromStatic.getAnnotations(), recycled.getAnnotations());
- assertEquals(fromStatic.getCounts(), recycled.getCounts());
- assertEquals(fromStatic.getDuration(TimeUnit.MILLISECONDS), recycled.getDuration(TimeUnit.MILLISECONDS));
+ final Long resource = findModelEntryObject(resourceName);
+ final Long fromStatic = read(readFromResource(resourceName), Long.class);
+ final Long recycled = read(write(fromStatic, Long.class, resourceName), Long.class);
+ assertEquals(fromStatic, recycled);
+ assertEquals(resource, fromStatic);
+ assertEquals(resource, recycled);
}
@Test
- public void shouldReadWriteMonthDay() throws Exception {
- final String resourceName = "monthday";
+ public void shouldReadWriteMinLong() throws Exception {
+ final String resourceName = "min-long";
- final MonthDay resource = findModelEntryObject(resourceName);
- final MonthDay fromStatic = read(readFromResource(resourceName), MonthDay.class);
- final MonthDay recycled = read(write(fromStatic, MonthDay.class, resourceName), MonthDay.class);
- assertNotSame(fromStatic, recycled);
+ final Long resource = findModelEntryObject(resourceName);
+ final Long fromStatic = read(readFromResource(resourceName), Long.class);
+ final Long recycled = read(write(fromStatic, Long.class, resourceName), Long.class);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
}
@Test
- public void shouldReadWriteOffsetDateTime() throws Exception {
- final String resourceName = "offsetdatetime";
+ public void shouldReadWriteMultiTypeList() throws Exception {
+ final String resourceName = "var-type-list";
- final OffsetDateTime resource = findModelEntryObject(resourceName);
- final OffsetDateTime fromStatic = read(readFromResource(resourceName), OffsetDateTime.class);
- final OffsetDateTime recycled = read(write(fromStatic, OffsetDateTime.class, resourceName), OffsetDateTime.class);
- assertNotSame(fromStatic, recycled);
+ final List resource = findModelEntryObject(resourceName);
+ final List fromStatic = read(readFromResource(resourceName), List.class);
+ final List recycled = read(write(fromStatic, List.class, resourceName), List.class);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
}
@Test
- public void shouldReadWriteOffsetTime() throws Exception {
- final String resourceName = "offsettime";
+ public void shouldReadWriteEmptyList() throws Exception {
+ final String resourceName = "empty-list";
- final OffsetTime resource = findModelEntryObject(resourceName);
- final OffsetTime fromStatic = read(readFromResource(resourceName), OffsetTime.class);
- final OffsetTime recycled = read(write(fromStatic, OffsetTime.class, resourceName), OffsetTime.class);
- assertNotSame(fromStatic, recycled);
+ final List resource = findModelEntryObject(resourceName);
+ final List fromStatic = read(readFromResource(resourceName), List.class);
+ final List recycled = read(write(fromStatic, List.class, resourceName), List.class);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
}
@Test
- public void shouldReadWriteOperator() throws Exception {
- final String resourceName = "operator";
+ public void shouldReadWriteMultiTypeMap() throws Exception {
+ final String resourceName = "var-type-map";
- final Operator resource = findModelEntryObject(resourceName);
- final Operator fromStatic = read(readFromResource(resourceName), Operator.class);
- final Operator recycled = read(write(fromStatic, Operator.class, resourceName), Operator.class);
+ final Map resource = findModelEntryObject(resourceName);
+ final Map fromStatic = read(readFromResource(resourceName), Map.class);
+ final Map recycled = read(write(fromStatic, Map.class, resourceName), Map.class);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
}
@Test
- public void shouldReadWriteOrder() throws Exception {
- final String resourceName = "order";
+ public void shouldReadWriteEmptyMap() throws Exception {
+ final String resourceName = "empty-map";
- final Order resource = findModelEntryObject(resourceName);
- final Order fromStatic = read(readFromResource(resourceName), Order.class);
- final Order recycled = read(write(fromStatic, Order.class, resourceName), Order.class);
+ final Map resource = findModelEntryObject(resourceName);
+ final Map fromStatic = read(readFromResource(resourceName), Map.class);
+ final Map recycled = read(write(fromStatic, Map.class, resourceName), Map.class);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
}
+
@Test
- public void shouldReadWriteP() throws Exception {
- final String resourceName = "p";
+ public void shouldReadWriteMaxOffsetDateTime() throws Exception {
+ final String resourceName = "max-offsetdatetime";
- final P resource = findModelEntryObject(resourceName);
- final P fromStatic = read(readFromResource(resourceName), P.class);
- final P recycled = read(write(fromStatic, P.class, resourceName), P.class);
+ final OffsetDateTime resource = findModelEntryObject(resourceName);
+ final OffsetDateTime fromStatic = read(readFromResource(resourceName), OffsetDateTime.class);
+ final OffsetDateTime recycled = read(write(fromStatic, OffsetDateTime.class, resourceName), OffsetDateTime.class);
+ assertNotSame(fromStatic, recycled);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
}
@Test
- public void shouldReadWritePAnd() throws Exception {
- final String resourceName = "pand";
+ public void shouldReadWriteMinOffsetDateTime() throws Exception {
+ final String resourceName = "min-offsetdatetime";
- final P resource = findModelEntryObject(resourceName);
- final P fromStatic = read(readFromResource(resourceName), P.class);
- final P recycled = read(write(fromStatic, P.class, resourceName), P.class);
+ final OffsetDateTime resource = findModelEntryObject(resourceName);
+ final OffsetDateTime fromStatic = read(readFromResource(resourceName), OffsetDateTime.class);
+ final OffsetDateTime recycled = read(write(fromStatic, OffsetDateTime.class, resourceName), OffsetDateTime.class);
+ assertNotSame(fromStatic, recycled);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
@@ -515,7 +586,7 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
@Test
public void shouldReadWritePath() throws Exception {
- final String resourceName = "path";
+ final String resourceName = "traversal-path";
final Path resource = findModelEntryObject(resourceName);
final Path fromStatic = read(readFromResource(resourceName), Path.class);
@@ -527,45 +598,46 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
}
@Test
- public void shouldReadWritePeriod() throws Exception {
- final String resourceName = "period";
+ public void shouldReadWriteEmptyPath() throws Exception {
+ final String resourceName = "empty-path";
- final Period resource = findModelEntryObject(resourceName);
- final Period fromStatic = read(readFromResource(resourceName), Period.class);
- final Period recycled = read(write(fromStatic, Period.class, resourceName), Period.class);
+ final Path resource = findModelEntryObject(resourceName);
+ final Path fromStatic = read(readFromResource(resourceName), Path.class);
+ final Path recycled = read(write(fromStatic, Path.class, resourceName), Path.class);
assertNotSame(fromStatic, recycled);
assertEquals(fromStatic, recycled);
- assertEquals(resource, fromStatic);
- assertEquals(resource, recycled);
+ assertEquals(fromStatic, resource);
+ assertEquals(recycled, resource);
}
@Test
- public void shouldReadWritePop() throws Exception {
- final String resourceName = "pop";
+ public void shouldReadWritePathWithProperties() throws Exception {
+ final String resourceName = "prop-path";
- final Pop resource = findModelEntryObject(resourceName);
- final Pop fromStatic = read(readFromResource(resourceName), Pop.class);
- final Pop recycled = read(write(fromStatic, Pop.class, resourceName), Pop.class);
+ final Path resource = findModelEntryObject(resourceName);
+ final Path fromStatic = read(readFromResource(resourceName), Path.class);
+ final Path recycled = read(write(fromStatic, Path.class, resourceName), Path.class);
+ assertNotSame(fromStatic, recycled);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
}
@Test
- public void shouldReadWritePOr() throws Exception {
- final String resourceName = "por";
+ public void shouldReadWriteEdgeProperty() throws Exception {
+ final String resourceName = "edge-property";
- final P resource = findModelEntryObject(resourceName);
- final P fromStatic = read(readFromResource(resourceName), P.class);
- final P recycled = read(write(fromStatic, P.class, resourceName), P.class);
- assertEquals(fromStatic, recycled);
- assertEquals(resource, fromStatic);
- assertEquals(resource, recycled);
+ final Property resource = findModelEntryObject(resourceName);
+ final Property fromStatic = read(readFromResource(resourceName), Property.class);
+ final Property recycled = read(write(fromStatic, Property.class, resourceName), Property.class);
+ assertNotSame(fromStatic, recycled);
+ assertProperty(resource, fromStatic);
+ assertProperty(resource, recycled);
}
@Test
- public void shouldReadWriteProperty() throws Exception {
- final String resourceName = "property";
+ public void shouldReadWriteNullProperty() throws Exception {
+ final String resourceName = "null-property";
final Property resource = findModelEntryObject(resourceName);
final Property fromStatic = read(readFromResource(resourceName), Property.class);
@@ -576,23 +648,20 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
}
@Test
- public void shouldReadWriteScope() throws Exception {
- final String resourceName = "scope";
+ public void shouldReadWriteMultiTypeSet() throws Exception {
+ final String resourceName = "var-type-set";
- final Scope resource = findModelEntryObject(resourceName);
- final Scope fromStatic = read(readFromResource(resourceName), Scope.class);
- final Scope recycled = read(write(fromStatic, Scope.class, resourceName), Scope.class);
+ final Set resource = findModelEntryObject(resourceName);
+ final Set fromStatic = read(readFromResource(resourceName), Set.class);
+ final Set recycled = read(write(fromStatic, Set.class, resourceName), Set.class);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
}
@Test
- public void shouldReadWriteSet() throws Exception {
- final String resourceName = "set";
-
- assumeThat("GraphSON v2 didn't explicitly have Set as a type",
- is(this.getClass().equals(GraphSONTypedCompatibilityTest.class) && getCompatibility().equals("v2")));
+ public void shouldReadWriteEmptySet() throws Exception {
+ final String resourceName = "empty-set";
final Set resource = findModelEntryObject(resourceName);
final Set fromStatic = read(readFromResource(resourceName), Set.class);
@@ -603,8 +672,8 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
}
@Test
- public void shouldReadWriteShort() throws Exception {
- final String resourceName = "short";
+ public void shouldReadWriteMaxShort() throws Exception {
+ final String resourceName = "max-short";
final Short resource = findModelEntryObject(resourceName);
final Short fromStatic = read(readFromResource(resourceName), Short.class);
@@ -615,96 +684,12 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
}
@Test
- public void shouldReadWriteStandardRequestMessage() throws Exception {
- final String resourceName = "standardrequest";
-
- assumeThat("GraphBinary does not test this because Request/ResponseMessage are not actual GraphBinary types",
- this.getClass().equals(GraphBinaryCompatibilityTest.class),
- is(false));
- assumeThat("RequestMessage was supported starting in GraphSONv4",
- getCompatibility(),
- is("v4"));
-
- final RequestMessage resource = findModelEntryObject(resourceName);
- final RequestMessage fromStatic = read(readFromResource(resourceName), RequestMessage.class);
- final RequestMessage recycled = read(write(fromStatic, RequestMessage.class, resourceName), RequestMessage.class);
- assertNotSame(fromStatic, recycled);
- assertRequestMessage(resource, fromStatic, recycled);
- }
-
- @Test
- public void shouldReadWriteStandardExceptionResult() throws Exception {
- final String resourceName = "standardexceptionresult";
-
- assumeThat("GraphBinary does not test this because Request/ResponseMessage are not actual GraphBinary types",
- this.getClass().equals(GraphBinaryCompatibilityTest.class),
- is(false));
- assumeThat("ResponseMessage was supported starting in GraphSONv4",
- getCompatibility(),
- is("v4"));
-
- final GraphSONMessageSerializerV4 gsSerializer = new GraphSONMessageSerializerV4();
- final ByteBuf resourceInBytes = gsSerializer.writeHeader(findModelEntryObject(resourceName), new UnpooledByteBufAllocator(false));
- final ResponseMessage resource = read(resourceInBytes.array(), ResponseMessage.class);
- final ResponseMessage fromStatic = read(readFromResource(resourceName), ResponseMessage.class);
- final ResponseMessage recycled = read(write(fromStatic, HashMap.class, resourceName), ResponseMessage.class);
- assertNotSame(fromStatic, recycled);
- assertResponseMessage(resource, fromStatic, recycled);
- resourceInBytes.release();
- }
-
- @Test
- public void shouldReadWriteStandardResult() throws Exception {
- final String resourceName = "standardresult";
-
- assumeThat("GraphBinary does not test this because Request/ResponseMessage are not actual GraphBinary types",
- this.getClass().equals(GraphBinaryCompatibilityTest.class),
- is(false));
- assumeThat("ResponseMessage was supported starting in GraphSONv4",
- getCompatibility(),
- is("v4"));
-
- final GraphSONMessageSerializerV4 gsSerializer = new GraphSONMessageSerializerV4();
- final ByteBuf resourceInBytes = gsSerializer.writeHeader(findModelEntryObject(resourceName), new UnpooledByteBufAllocator(false));
- final ResponseMessage resource = read(resourceInBytes.array(), ResponseMessage.class);
- final ResponseMessage fromStatic = read(readFromResource(resourceName), ResponseMessage.class);
- final ResponseMessage recycled = read(write(fromStatic, HashMap.class, resourceName), ResponseMessage.class);
- assertNotSame(fromStatic, recycled);
- assertResponseMessage(resource, fromStatic, recycled);
- }
-
- @Test
- public void shouldReadWriteT() throws Exception {
- final String resourceName = "t";
-
- final T resource = findModelEntryObject(resourceName);
- final T fromStatic = read(readFromResource(resourceName), T.class);
- final T recycled = read(write(fromStatic, T.class, resourceName), T.class);
- assertEquals(fromStatic, recycled);
- assertEquals(resource, fromStatic);
- assertEquals(resource, recycled);
- }
-
- @Test
- public void shouldReadWriteTextP() throws Exception {
- final String resourceName = "textp";
+ public void shouldReadWriteMinShort() throws Exception {
+ final String resourceName = "min-short";
- final TextP resource = findModelEntryObject(resourceName);
- final TextP fromStatic = read(readFromResource(resourceName), TextP.class);
- final TextP recycled = read(write(fromStatic, TextP.class, resourceName), TextP.class);
- assertEquals(fromStatic, recycled);
- assertEquals(resource, fromStatic);
- assertEquals(resource, recycled);
- }
-
- @Test
- public void shouldReadWriteTimestamp() throws Exception {
- final String resourceName = "timestamp";
-
- final Timestamp resource = findModelEntryObject(resourceName);
- final Timestamp fromStatic = read(readFromResource(resourceName), Timestamp.class);
- final Timestamp recycled = read(write(fromStatic, Timestamp.class, resourceName), Timestamp.class);
- assertNotSame(fromStatic, recycled);
+ final Short resource = findModelEntryObject(resourceName);
+ final Short fromStatic = read(readFromResource(resourceName), Short.class);
+ final Short recycled = read(write(fromStatic, Short.class, resourceName), Short.class);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
@@ -712,7 +697,7 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
@Test
public void shouldReadWriteTinkerGraph() throws Exception {
- final String resourceName = "tinkergraph";
+ final String resourceName = "tinker-graph";
final TinkerGraph fromStatic = read(readFromResource(resourceName), TinkerGraph.class);
final TinkerGraph recycled = read(write(fromStatic, TinkerGraph.class, resourceName), TinkerGraph.class);
@@ -723,28 +708,24 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
}
@Test
- public void shouldReadWriteTraversalMetrics() throws Exception {
- final String resourceName = "traversalmetrics";
+ public void shouldReadWriteVertexTraverser() throws Exception {
+ final String resourceName = "vertex-traverser";
- final TraversalMetrics resource = findModelEntryObject(resourceName);
- final TraversalMetrics fromStatic = read(readFromResource(resourceName), TraversalMetrics.class);
- final TraversalMetrics recycled = read(write(fromStatic, TraversalMetrics.class, resourceName), TraversalMetrics.class);
+ final Traverser resource = findModelEntryObject(resourceName);
+ final Traverser fromStatic = read(readFromResource(resourceName), Traverser.class);
+ final Traverser recycled = read(write(fromStatic, Traverser.class, resourceName), Traverser.class);
assertNotSame(fromStatic, recycled);
-
- // need to assert against each other since the model version can change between test runs as it is dynamically
- // generated
- assertEquals(recycled.getDuration(TimeUnit.MILLISECONDS), fromStatic.getDuration(TimeUnit.MILLISECONDS));
- final Collection<? extends Metrics> resourceMetrics = resource.getMetrics();
- resourceMetrics.forEach(m -> {
- assertEquals(recycled.getMetrics(m.getId()).getAnnotations(), fromStatic.getMetrics(m.getId()).getAnnotations());
- assertEquals(recycled.getMetrics(m.getId()).getName(), fromStatic.getMetrics(m.getId()).getName());
- assertEquals(recycled.getMetrics(m.getId()).getCounts(), fromStatic.getMetrics(m.getId()).getCounts());
- });
+ assertEquals(resource.bulk(), recycled.bulk());
+ assertEquals(resource.bulk(), fromStatic.bulk());
+ assertEquals(resource.get(), recycled.get());
+ assertEquals(resource.get(), fromStatic.get());
+ assertVertex((Vertex) resource.get(), (Vertex) recycled.get());
+ assertVertex((Vertex) resource.get(), (Vertex) fromStatic.get());
}
@Test
- public void shouldReadWriteTraverser() throws Exception {
- final String resourceName = "traverser";
+ public void shouldReadWriteBulkedTraverser() throws Exception {
+ final String resourceName = "bulked-traverser";
final Traverser resource = findModelEntryObject(resourceName);
final Traverser fromStatic = read(readFromResource(resourceName), Traverser.class);
@@ -758,9 +739,38 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
assertVertex((Vertex) resource.get(), (Vertex) fromStatic.get());
}
+ @Test
+ public void shouldReadWriteEmptyTraverser() throws Exception {
+ final String resourceName = "empty-traverser";
+
+ final Traverser resource = findModelEntryObject(resourceName);
+ final Traverser fromStatic = read(readFromResource(resourceName), Traverser.class);
+ final Traverser recycled = read(write(fromStatic, Traverser.class, resourceName), Traverser.class);
+ assertNotSame(fromStatic, recycled);
+ assertEquals(resource.bulk(), recycled.bulk());
+ assertEquals(resource.bulk(), fromStatic.bulk());
+ assertEquals(resource.get(), recycled.get());
+ assertEquals(resource.get(), fromStatic.get());
+ assertEquals(recycled.bulk(), fromStatic.bulk());
+ assertEquals(recycled.get(), fromStatic.get());
+ }
+
@Test
public void shouldReadWriteUUID() throws Exception {
- final String resourceName = "uuid";
+ final String resourceName = "specified-uuid";
+
+ final UUID resource = findModelEntryObject(resourceName);
+ final UUID fromStatic = read(readFromResource(resourceName), UUID.class);
+ final UUID recycled = read(write(fromStatic, UUID.class, resourceName), UUID.class);
+ assertNotSame(fromStatic, recycled);
+ assertEquals(fromStatic, recycled);
+ assertEquals(resource, fromStatic);
+ assertEquals(resource, recycled);
+ }
+
+ @Test
+ public void shouldReadWriteNilUUID() throws Exception {
+ final String resourceName = "nil-uuid";
final UUID resource = findModelEntryObject(resourceName);
final UUID fromStatic = read(readFromResource(resourceName), UUID.class);
@@ -773,7 +783,22 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
@Test
public void shouldReadWriteVertex() throws Exception {
- final String resourceName = "vertex";
+ final String resourceName = "traversal-vertex";
+
+ final Vertex resource = findModelEntryObject(resourceName);
+ final Vertex fromStatic = read(readFromResource(resourceName), Vertex.class);
+ final Vertex recycled = read(write(fromStatic, Vertex.class, resourceName), Vertex.class);
+ assertNotSame(fromStatic, recycled);
+ assertEquals(fromStatic, recycled);
+ assertEquals(resource, fromStatic);
+ assertEquals(resource, recycled);
+ assertVertex(resource, fromStatic);
+ assertVertex(resource, recycled);
+ }
+
+ @Test
+ public void shouldReadWriteNoPropertyVertex() throws Exception {
+ final String resourceName = "no-prop-vertex";
final Vertex resource = findModelEntryObject(resourceName);
final Vertex fromStatic = read(readFromResource(resourceName), Vertex.class);
@@ -788,7 +813,7 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
@Test
public void shouldReadWriteVertexProperty() throws Exception {
- final String resourceName = "vertexproperty";
+ final String resourceName = "traversal-vertexproperty";
final VertexProperty resource = findModelEntryObject(resourceName);
final VertexProperty fromStatic = read(readFromResource(resourceName), VertexProperty.class);
@@ -802,57 +827,210 @@ public abstract class AbstractTypedCompatibilityTest extends AbstractCompatibili
}
@Test
- public void shouldReadWriteYear() throws Exception {
- final String resourceName = "year";
+ public void shouldReadWriteMetapropertyVertexProperty() throws Exception {
+ final String resourceName = "meta-vertexproperty";
- final Year resource = findModelEntryObject(resourceName);
- final Year fromStatic = read(readFromResource(resourceName), Year.class);
- final Year recycled = read(write(fromStatic, Year.class, resourceName), Year.class);
+ final VertexProperty resource = findModelEntryObject(resourceName);
+ final VertexProperty fromStatic = read(readFromResource(resourceName), VertexProperty.class);
+ final VertexProperty recycled = read(write(fromStatic, VertexProperty.class, resourceName), VertexProperty.class);
assertNotSame(fromStatic, recycled);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
+ assertVertexProperty(resource, recycled);
+ assertVertexProperty(resource, fromStatic);
}
@Test
- public void shouldReadWriteYearMonth() throws Exception {
- final String resourceName = "yearmonth";
+ public void shouldReadWriteSetVertexProperty() throws Exception {
+ final String resourceName = "set-cardinality-vertexproperty";
- final YearMonth resource = findModelEntryObject(resourceName);
- final YearMonth fromStatic = read(readFromResource(resourceName), YearMonth.class);
- final YearMonth recycled = read(write(fromStatic, YearMonth.class, resourceName), YearMonth.class);
+ final VertexProperty resource = findModelEntryObject(resourceName);
+ final VertexProperty fromStatic = read(readFromResource(resourceName), VertexProperty.class);
+ final VertexProperty recycled = read(write(fromStatic, VertexProperty.class, resourceName), VertexProperty.class);
assertNotSame(fromStatic, recycled);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
+ assertVertexProperty(resource, recycled);
+ assertVertexProperty(resource, fromStatic);
}
@Test
- public void shouldReadWriteZoneDateTime() throws Exception {
- final String resourceName = "zoneddatetime";
+ public void shouldReadWriteIdT() throws Exception {
+ final String resourceName = "id-t";
- // seem to recall this was a known issue for GraphBinary. not going to fuss with it though since the
- // longer term plan is to likely drop these jvm only types.
- assumeThat("GraphBinary doesn't quite serialize ZoneDateTime for a perfect round trip",
- is(getClass().equals(GraphBinaryCompatibilityTest.class)));
+ final T resource = findModelEntryObject(resourceName);
+ final T fromStatic = read(readFromResource(resourceName), T.class);
+ final T recycled = read(write(fromStatic, T.class, resourceName), T.class);
+ assertEquals(fromStatic, recycled);
+ assertEquals(resource, fromStatic);
+ assertEquals(resource, recycled);
+ }
- final ZonedDateTime resource = findModelEntryObject(resourceName);
- final ZonedDateTime fromStatic = read(readFromResource(resourceName), ZonedDateTime.class);
- final ZonedDateTime recycled = read(write(fromStatic, ZonedDateTime.class, resourceName), ZonedDateTime.class);
- assertNotSame(fromStatic, recycled);
+ @Test
+ public void shouldReadWriteOutDirection() throws Exception {
+ final String resourceName = "out-direction";
+
+ final Direction resource = findModelEntryObject(resourceName);
+ final Direction fromStatic = read(readFromResource(resourceName), Direction.class);
+ final Direction recycled = read(write(fromStatic, Direction.class, resourceName), Direction.class);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
}
@Test
- public void shouldReadWriteZoneOffset() throws Exception {
- final String resourceName = "zoneoffset";
+ public void shouldReadWriteZeroDate() throws Exception {
+ final String resourceName = "zero-date";
- final ZoneOffset resource = findModelEntryObject(resourceName);
- final ZoneOffset fromStatic = read(readFromResource(resourceName), ZoneOffset.class);
- final ZoneOffset recycled = read(write(fromStatic, ZoneOffset.class, resourceName), ZoneOffset.class);
- assertNotSame(fromStatic, recycled);
+ final Date resource = findModelEntryObject(resourceName);
+ final Date fromStatic = read(readFromResource(resourceName), Date.class);
+ final Date recycled = read(write(fromStatic, Date.class, resourceName), Date.class);
+ assertEquals(fromStatic, recycled);
+ assertEquals(resource, fromStatic);
+ assertEquals(resource, recycled);
+ }
+
+ @Test
+ public void shouldReadWriteMaxDate() throws Exception {
+ final String resourceName = "max-date";
+
+ final Date resource = findModelEntryObject(resourceName);
+ final Date fromStatic = read(readFromResource(resourceName), Date.class);
+ final Date recycled = read(write(fromStatic, Date.class, resourceName), Date.class);
+ assertEquals(fromStatic, recycled);
+ assertEquals(resource, fromStatic);
+ assertEquals(resource, recycled);
+ }
+
+ @Test
+ public void shouldReadWriteMinDate() throws Exception {
+ final String resourceName = "min-date";
+
+ final Date resource = findModelEntryObject(resourceName);
+ final Date fromStatic = read(readFromResource(resourceName), Date.class);
+ final Date recycled = read(write(fromStatic, Date.class, resourceName), Date.class);
+ assertEquals(fromStatic, recycled);
+ assertEquals(resource, fromStatic);
+ assertEquals(resource, recycled);
+ }
+
+ @Test
+ public void shouldReadWriteVarBulkSet() throws Exception {
+ final String resourceName = "var-bulkset";
+
+ final BulkSet resource = findModelEntryObject(resourceName);
+ final BulkSet fromStatic = read(readFromResource(resourceName), BulkSet.class);
+ final BulkSet recycled = read(write(fromStatic, BulkSet.class, resourceName), BulkSet.class);
+ assertEquals(fromStatic, recycled);
+ assertEquals(resource, fromStatic);
+ assertEquals(resource, recycled);
+ }
+
+ @Test
+ public void shouldReadWriteEmptyBulkSet() throws Exception {
+ final String resourceName = "empty-bulkset";
+
+ final BulkSet resource = findModelEntryObject(resourceName);
+ final BulkSet fromStatic = read(readFromResource(resourceName), BulkSet.class);
+ final BulkSet recycled = read(write(fromStatic, BulkSet.class, resourceName), BulkSet.class);
+ assertEquals(fromStatic, recycled);
+ assertEquals(resource, fromStatic);
+ assertEquals(resource, recycled);
+ }
+
+ @Test
+ public void shouldReadWriteSingleByteChar() throws Exception {
+ final String resourceName = "single-byte-char";
+
+ final Character resource = findModelEntryObject(resourceName);
+ final Character fromStatic = read(readFromResource(resourceName), Character.class);
+ final Character recycled = read(write(fromStatic, Character.class, resourceName), Character.class);
+ assertEquals(fromStatic, recycled);
+ assertEquals(resource, fromStatic);
+ assertEquals(resource, recycled);
+ }
+
+ @Test
+ public void shouldReadWriteMultiByteChar() throws Exception {
+ final String resourceName = "multi-byte-char";
+
+ final Character resource = findModelEntryObject(resourceName);
+ final Character fromStatic = read(readFromResource(resourceName), Character.class);
+ final Character recycled = read(write(fromStatic, Character.class, resourceName), Character.class);
+ assertEquals(fromStatic, recycled);
+ assertEquals(resource, fromStatic);
+ assertEquals(resource, recycled);
+ }
+
+ @Test
+ public void shouldReadWriteNull() throws Exception {
+ final String resourceName = "unspecified-null";
+
+ final Character resource = findModelEntryObject(resourceName);
+ final Character fromStatic = read(readFromResource(resourceName), Character.class);
+ final Character recycled = read(write(fromStatic, Character.class, resourceName), Character.class);
+ assertEquals(fromStatic, recycled);
+ assertEquals(resource, fromStatic);
+ assertEquals(resource, recycled);
+ }
+
+ @Test
+ public void shouldReadWriteTrueBoolean() throws Exception {
+ final String resourceName = "true-boolean";
+
+ final Boolean resource = findModelEntryObject(resourceName);
+ final Boolean fromStatic = read(readFromResource(resourceName), Boolean.class);
+ final Boolean recycled = read(write(fromStatic, Boolean.class, resourceName), Boolean.class);
+ assertEquals(fromStatic, recycled);
+ assertEquals(resource, fromStatic);
+ assertEquals(resource, recycled);
+ }
+
+ @Test
+ public void shouldReadWriteFalseBoolean() throws Exception {
+ final String resourceName = "false-boolean";
+
+ final Boolean resource = findModelEntryObject(resourceName);
+ final Boolean fromStatic = read(readFromResource(resourceName), Boolean.class);
+ final Boolean recycled = read(write(fromStatic, Boolean.class, resourceName), Boolean.class);
+ assertEquals(fromStatic, recycled);
+ assertEquals(resource, fromStatic);
+ assertEquals(resource, recycled);
+ }
+
+ @Test
+ public void shouldReadWriteSingleByteString() throws Exception {
+ final String resourceName = "single-byte-string";
+
+ final String resource = findModelEntryObject(resourceName);
+ final String fromStatic = read(readFromResource(resourceName), String.class);
+ final String recycled = read(write(fromStatic, String.class, resourceName), String.class);
+ assertEquals(fromStatic, recycled);
+ assertEquals(resource, fromStatic);
+ assertEquals(resource, recycled);
+ }
+
+ @Test
+ public void shouldReadWriteMixedString() throws Exception {
+ final String resourceName = "mixed-string";
+
+ final String resource = findModelEntryObject(resourceName);
+ final String fromStatic = read(readFromResource(resourceName), String.class);
+ final String recycled = read(write(fromStatic, String.class, resourceName), String.class);
+ assertEquals(fromStatic, recycled);
+ assertEquals(resource, fromStatic);
+ assertEquals(resource, recycled);
+ }
+
+ @Test
+ public void shouldReadWriteTraversalTree() throws Exception {
+ final String resourceName = "traversal-tree";
+
+ final Tree resource = findModelEntryObject(resourceName);
+ final Tree fromStatic = read(readFromResource(resourceName), Tree.class);
+ final Tree recycled = read(write(fromStatic, Tree.class, resourceName), Tree.class);
assertEquals(fromStatic, recycled);
assertEquals(resource, fromStatic);
assertEquals(resource, recycled);
diff --git a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/AbstractUntypedCompatibilityTest.java b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/AbstractUntypedCompatibilityTest.java
index a786886c04..15cf3c5a29 100644
--- a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/AbstractUntypedCompatibilityTest.java
+++ b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/AbstractUntypedCompatibilityTest.java
@@ -48,7 +48,7 @@ public abstract class AbstractUntypedCompatibilityTest extends AbstractCompatibi
@Test
public void shouldReadWriteEdge() throws Exception {
- final String resourceName = "edge";
+ final String resourceName = "traversal-edge";
final Edge resource = findModelEntryObject(resourceName);
final byte[] bytes = write(resource, Edge.class, resourceName);
@@ -90,7 +90,7 @@ public abstract class AbstractUntypedCompatibilityTest extends AbstractCompatibi
@Test
public void shouldReadWritePath() throws Exception {
- final String resourceName = "path";
+ final String resourceName = "traversal-path";
final Path resource = findModelEntryObject(resourceName);
final byte[] bytes = write(resource, Path.class, resourceName);
@@ -123,7 +123,7 @@ public abstract class AbstractUntypedCompatibilityTest extends AbstractCompatibi
@Test
public void shouldReadWriteProperty() throws Exception {
- final String resourceName = "property";
+ final String resourceName = "edge-property";
final Property resource = findModelEntryObject(resourceName);
final byte[] bytes = write(resource, Property.class, resourceName);
@@ -138,68 +138,9 @@ public abstract class AbstractUntypedCompatibilityTest extends AbstractCompatibi
assertEquals(resource.value(), recycled.get("value"));
}
- @Test
- public void shouldReadWriteStandardRequestMessage() throws Exception {
- final String resourceName = "standardrequest";
-
- assumeThat("GraphBinary does not test this because Request/ResponseMessage are not actual GraphBinary types",
- this.getClass().equals(GraphBinaryCompatibilityTest.class),
- is(false));
- assumeThat("RequestMessage was supported starting in GraphSONv4",
- getCompatibility(),
- is("v4-no-types"));
-
- final RequestMessage resource = findModelEntryObject(resourceName);
- final RequestMessage fromStatic = read(readFromResource(resourceName), RequestMessage.class);
- final RequestMessage recycled = read(write(fromStatic, RequestMessage.class, resourceName), RequestMessage.class);
- assertNotSame(fromStatic, recycled);
- assertRequestMessage(resource, fromStatic, recycled);
- }
-
- @Test
- public void shouldReadWriteStandardExceptionResult() throws Exception {
- final String resourceName = "standardexceptionresult";
-
- assumeThat("GraphBinary does not test this because Request/ResponseMessage are not actual GraphBinary types",
- this.getClass().equals(GraphBinaryCompatibilityTest.class),
- is(false));
- assumeThat("ResponseMessage was supported starting in GraphSONv4",
- getCompatibility(),
- is("v4-no-types"));
-
- final GraphSONUntypedMessageSerializerV4 gsSerializer = new GraphSONUntypedMessageSerializerV4();
- final ByteBuf resourceInBytes = gsSerializer.writeHeader(findModelEntryObject(resourceName), new UnpooledByteBufAllocator(false));
- final ResponseMessage resource = read(resourceInBytes.array(), ResponseMessage.class);
- final ResponseMessage fromStatic = read(readFromResource(resourceName), ResponseMessage.class);
- final ResponseMessage recycled = read(write(fromStatic, HashMap.class, resourceName), ResponseMessage.class);
- assertNotSame(fromStatic, recycled);
- assertResponseMessage(resource, fromStatic, recycled);
- resourceInBytes.release();
- }
-
- @Test
- public void shouldReadWriteStandardResult() throws Exception {
- final String resourceName = "standardresult";
-
- assumeThat("GraphBinary does not test this because Request/ResponseMessage are not actual GraphBinary types",
- this.getClass().equals(GraphBinaryCompatibilityTest.class),
- is(false));
- assumeThat("ResponseMessage was supported starting in GraphSONv4",
- getCompatibility(),
- is("v4-no-types"));
-
- final GraphSONUntypedMessageSerializerV4 gsSerializer = new GraphSONUntypedMessageSerializerV4();
- final ByteBuf resourceInBytes = gsSerializer.writeHeader(findModelEntryObject(resourceName), new UnpooledByteBufAllocator(false));
- final ResponseMessage resource = read(resourceInBytes.array(), ResponseMessage.class);
- final ResponseMessage fromStatic = read(readFromResource(resourceName), ResponseMessage.class);
- final ResponseMessage recycled = read(write(fromStatic, HashMap.class, resourceName), ResponseMessage.class);
- assertNotSame(fromStatic, recycled);
- assertResponseMessage(resource, fromStatic, recycled);
- }
-
@Test
public void shouldReadWriteVertex() throws Exception {
- final String resourceName = "vertex";
+ final String resourceName = "traversal-vertex";
final Vertex resource = findModelEntryObject(resourceName);
final byte[] bytes = write(resource, Vertex.class, resourceName);
@@ -245,7 +186,7 @@ public abstract class AbstractUntypedCompatibilityTest extends AbstractCompatibi
@Test
public void shouldReadWriteVertexProperty() throws Exception {
- final String resourceName = "vertexproperty";
+ final String resourceName = "traversal-vertexproperty";
final VertexProperty resource = findModelEntryObject(resourceName);
final byte[] bytes = write(resource, VertexProperty.class, resourceName);
diff --git a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/Model.java b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/Model.java
index df3cd3c807..986a7abbd0 100644
--- a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/Model.java
+++ b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/Model.java
@@ -18,50 +18,28 @@
*/
package org.apache.tinkerpop.gremlin.structure.io;
-import io.netty.handler.codec.http.HttpResponseStatus;
import org.apache.commons.configuration2.BaseConfiguration;
import org.apache.commons.configuration2.Configuration;
-import org.apache.tinkerpop.gremlin.process.traversal.Operator;
-import org.apache.tinkerpop.gremlin.process.traversal.Order;
-import org.apache.tinkerpop.gremlin.process.traversal.P;
-import org.apache.tinkerpop.gremlin.process.traversal.Pick;
-import org.apache.tinkerpop.gremlin.process.traversal.Pop;
-import org.apache.tinkerpop.gremlin.process.traversal.SackFunctions;
-import org.apache.tinkerpop.gremlin.process.traversal.Scope;
-import org.apache.tinkerpop.gremlin.process.traversal.TextP;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
-import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalMetrics;
-import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
-import org.apache.tinkerpop.gremlin.structure.Column;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyPath;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.EmptyTraverser;
import org.apache.tinkerpop.gremlin.structure.Direction;
import org.apache.tinkerpop.gremlin.structure.T;
import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedProperty;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertexProperty;
import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory;
import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
-import org.apache.tinkerpop.gremlin.util.Tokens;
-import org.apache.tinkerpop.gremlin.util.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
-import java.io.File;
import java.math.BigDecimal;
import java.math.BigInteger;
-import java.net.InetAddress;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
import java.time.Duration;
-import java.time.Instant;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.time.MonthDay;
import java.time.OffsetDateTime;
-import java.time.OffsetTime;
-import java.time.Period;
-import java.time.Year;
-import java.time.YearMonth;
-import java.time.ZoneId;
-import java.time.ZoneOffset;
-import java.time.ZonedDateTime;
+import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -74,10 +52,11 @@ import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
-import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;
import java.util.stream.Collectors;
+import static org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory.detach;
+
/**
* Defines the supported types for IO and the versions (and configurations) to which they apply and are tested.
*
@@ -98,144 +77,122 @@ public class Model {
// IMPORTANT - the "title" or name of the Entry needs to be unique
- addCoreEntry(File.class, "Class", "");
- addCoreEntry(new Date(1481750076295L), "Date");
- addCoreEntry(100.00d, "Double");
- addCoreEntry(100.00f, "Float", "");
- addCoreEntry(100, "Integer");
- addCoreEntry(Arrays.asList(1,"person", true), "List", "List is used to distinguish between different collection types as JSON is not explicit enough for all of Gremlin's requirements.");
- addCoreEntry(100L, "Long", "");
+ addCoreEntry(new Date(0L), "zero-date");
+ addCoreEntry(new Date(11111111L), "precision-date");
+ addCoreEntry(new Date(Long.MAX_VALUE), "max-date");
+ addCoreEntry(new Date(Long.MIN_VALUE), "min-date");
+
+ addCoreEntry(Double.MAX_VALUE, "max-double");
+ addCoreEntry(Double.MIN_VALUE, "min-double");
+ addCoreEntry(-Double.MAX_VALUE, "neg-max-double");
+ addCoreEntry(-Double.MIN_VALUE, "neg-min-double");
+ addCoreEntry(Double.NaN, "nan-double");
+ addCoreEntry(Double.POSITIVE_INFINITY, "pos-inf-double");
+ addCoreEntry(Double.NEGATIVE_INFINITY, "neg-inf-double");
+ addCoreEntry(-0.0, "neg-zero-double");
+
+ addCoreEntry(Float.MAX_VALUE, "max-float");
+ addCoreEntry(Float.MIN_VALUE, "min-float");
+ addCoreEntry(-Float.MAX_VALUE, "neg-max-float");
+ addCoreEntry(-Float.MIN_VALUE, "neg-min-float");
+ addCoreEntry(Float.NaN, "nan-float");
+ addCoreEntry(Float.POSITIVE_INFINITY, "pos-inf-float");
+ addCoreEntry(Float.NEGATIVE_INFINITY, "neg-inf-float");
+ addCoreEntry(-0.0f, "neg-zero-float");
+
+ addCoreEntry(Integer.MAX_VALUE, "max-int");
+ addCoreEntry(Integer.MIN_VALUE, "min-int");
+
+ addCoreEntry(Long.MAX_VALUE, "max-long");
+ addCoreEntry(Long.MIN_VALUE, "min-long");
+
+ addCoreEntry(Arrays.asList(1, "person", true, null), "var-type-list", "List is used to distinguish between different collection types as JSON is not explicit enough for all of Gremlin's requirements.");
+ addCoreEntry(Collections.EMPTY_LIST, "empty-list");
final Map<Object,Object> map = new HashMap<>();
map.put("test", 123);
- map.put(new Date(1481750076295L), "red");
- map.put(Arrays.asList(1,2,3), new Date(1481750076295L));
- addCoreEntry(map, "Map", "Map is redefined so that to provide the ability to allow for non-String keys, which is not possible in JSON.");
+ map.put(new Date(1481295L), "red");
+ map.put(Arrays.asList(1,2,3), new Date(1481295L));
+ map.put(null, null);
+ addCoreEntry(map, "var-type-map", "Map is redefined so that to provide the ability to allow for non-String keys, which is not possible in JSON.");
+ addCoreEntry(Collections.EMPTY_MAP, "empty-map");
+
+ addCoreEntry(new HashSet<>(Arrays.asList(2, "person", true, null)), "var-type-set", "Allows a JSON collection to behave as a Set.");
+ addCoreEntry(Collections.EMPTY_SET, "empty-set");
+
+ addCoreEntry(UUID.fromString("41d2e28a-20a4-4ab0-b379-d810dede3786"), "specified-uuid");
+ addCoreEntry(new UUID(0, 0), "nil-uuid");
+
+ addCoreEntry(Direction.OUT, "out-direction", "");
+ addCoreEntry(T.id, "id-t", "");
+
+ addCoreEntry('a', "single-byte-char", "");
+ addCoreEntry('\u03A9', "multi-byte-char", "");
+
+ addEntry("Core", () -> null, "unspecified-null", "");
+
+ addCoreEntry(true, "true-boolean", "");
+ addCoreEntry(false, "false-boolean", "");
+
+ addCoreEntry("abc", "single-byte-string", "");
+ addCoreEntry("abc\u0391\u0392\u0393", "mixed-string", "");
+
+ addCoreEntry(g.V(10).out().tree().next(), "traversal-tree", "");
+
+ addGraphStructureEntry(graph.edges().next(), "traversal-edge", "");
+ addGraphStructureEntry(DetachedFactory.detach(graph.edges().next(), false), "no-prop-edge", "");
+
+ addGraphStructureEntry(detach(g.V().out().out().path().next(), false), "traversal-path", "");
+ addGraphStructureEntry(EmptyPath.instance(), "empty-path", "");
+ addGraphStructureEntry(detach(g.V().out().out().path().next(), true), "prop-path", "");
- addCoreEntry(new HashSet<>(Arrays.asList(1,"person", true)), "Set", "Allows a JSON collection to behave as a Set.");
- addCoreEntry(new java.sql.Timestamp(1481750076295L), "Timestamp", "");
- addCoreEntry(UUID.fromString("41d2e28a-20a4-4ab0-b379-d810dede3786"), "UUID");
+ addGraphStructureEntry(graph.edges().next().properties().next(), "edge-property", "");
+ addGraphStructureEntry(new DetachedProperty<>("", null), "null-property", "");
- addGraphStructureEntry(graph.edges().next(), "Edge", "");
- addGraphStructureEntry(g.V().out().out().path().next(), "Path", "");
- addGraphStructureEntry(graph.edges().next().properties().next(), "Property", "");
- addGraphStructureEntry(graph, "TinkerGraph", "`TinkerGraph` has a custom serializer that is registered as part of the `TinkerIoRegistry`.");
- addGraphStructureEntry(graph.vertices().next(), "Vertex", "");
- addGraphStructureEntry(graph.vertices().next().properties().next(), "VertexProperty", "");
+ addGraphStructureEntry(graph, "tinker-graph", "`TinkerGraph` has a custom serializer that is registered as part of the `TinkerIoRegistry`.");
- addGraphProcessEntry(SackFunctions.Barrier.normSack, "Barrier", "");
+ addGraphStructureEntry(graph.vertices().next(), "traversal-vertex", "");
+ addGraphStructureEntry(DetachedFactory.detach(graph.vertices().next(), false), "no-prop-vertex", "");
+
+ addGraphStructureEntry(graph.vertices().next().properties().next(), "traversal-vertexproperty", "");
+ final Map<String,Object> metaProperties = new HashMap<>();
+ metaProperties.put("a", "b");
+ addGraphStructureEntry(new DetachedVertexProperty<>(1, "person", "stephen", metaProperties), "meta-vertexproperty", "");
+ final Set<Object> setProperty = new HashSet<>();
+ setProperty.add("stephen");
+ setProperty.add("marko");
+ addGraphStructureEntry(new DetachedVertexProperty<>(1, "person", setProperty, metaProperties), "set-cardinality-vertexproperty", "");
final BulkSet<String> bulkSet = new BulkSet<>();
bulkSet.add("marko", 1);
bulkSet.add("josh", 2);
- addGraphProcessEntry(bulkSet, "BulkSet", "");
-
- addGraphProcessEntry(g.V().hasLabel("person").out().in().tree().asAdmin().getGremlinLang(), "Bytecode", "The following `Bytecode` example represents the traversal of `g.V().hasLabel('person').out().in().tree()`. Obviously the serialized `Bytecode` woudl be quite different for the endless variations of commands that could be used together in the Gremlin language.");
- addGraphProcessEntry(VertexProperty.Cardinality.list, "Cardinality", "");
- addGraphProcessEntry(Column.keys, "Column", "");
- addGraphProcessEntry(Direction.OUT, "Direction", "");
- addGraphProcessEntry(Operator.sum, "Operator", "");
- addGraphProcessEntry(Order.shuffle, "Order", "");
- addGraphProcessEntry(Pick.any, "Pick", "");
- addGraphProcessEntry(Pop.all, "Pop", "");
- addGraphProcessEntry(org.apache.tinkerpop.gremlin.util.function.Lambda.function("{ it.get() }"), "Lambda", "");
- final TraversalMetrics tm = createStaticTraversalMetrics();
- final MutableMetrics metrics = new MutableMetrics(tm.getMetrics("7.0.0()"));
- metrics.addNested(new MutableMetrics(tm.getMetrics("3.0.0()")));
- addGraphProcessEntry(metrics, "Metrics", "");
- addGraphProcessEntry(P.gt(0), "P", "");
- addGraphProcessEntry(P.within(1), "P within", "");
- addGraphProcessEntry(P.without(1,2), "P without", "");
- addGraphProcessEntry(P.gt(0).and(P.lt(10)), "P and", "");
- addGraphProcessEntry(P.gt(0).or(P.within(-1, -10, -100)), "P or", "");
- addGraphProcessEntry(Scope.local, "Scope", "");
- addGraphProcessEntry(T.label, "T", "");
- // TextP was only added at 3.4.0 and is not supported with untyped GraphSON of any sort
- addGraphProcessEntry(TextP.containing("ark"), "TextP", "");
- addGraphProcessEntry(createStaticTraversalMetrics(), "TraversalMetrics", "");
- addGraphProcessEntry(g.V().hasLabel("person").asAdmin().nextTraverser(), "Traverser", "");
-
- final Map<String,Object> requestBindings = new HashMap<>();
- requestBindings.put("x", 1);
-
- RequestMessage requestMessage = RequestMessage.build("social.V(x)").
- addBindings(requestBindings).
- addLanguage("gremlin-groovy").
- addG("social").
- addTimeoutMillis(100).
- addMaterializeProperties(Tokens.MATERIALIZE_PROPERTIES_ALL).create();
- addRequestMessageEntry(requestMessage, "Standard Request", "The following `RequestMessage` is an example of a request for a script evaluation with an alias that binds the `TraversalSource` of \"g\" to \"social\".");
-
- ResponseMessage responseMessage;
- responseMessage = ResponseMessage.build().
- code(HttpResponseStatus.OK).
- result(Collections.singletonList(graph.vertices().next())).create();
- addResponseMessageEntry(responseMessage, "Standard Result", "The following `ResponseMessage` is a typical example of the typical successful response Gremlin Server will return when returning results from a script.");
- responseMessage = ResponseMessage.build().
- code(HttpResponseStatus.INTERNAL_SERVER_ERROR).
- statusMessage("some error").
- exception("ServerFailStepException").
- result(Collections.emptyList()).create();
- addResponseMessageEntry(responseMessage, "Standard Exception Result", "The following `ResponseMessage` is a typical example of the typical unsuccessful response Gremlin Server will return when returning results from a script.");
-
- addExtendedEntry(new BigDecimal(new BigInteger("123456789987654321123456789987654321")), "BigDecimal", "");
- addExtendedEntry(new BigInteger("123456789987654321123456789987654321"), "BigInteger", "");
- addExtendedEntry(new Byte("1"), "Byte", "");
- addEntry("Extended", () -> java.nio.ByteBuffer.wrap("some bytes for you".getBytes()), "ByteBuffer", "");
- addExtendedEntry("x".charAt(0), "Char", "");
- addExtendedEntry(Duration.ofDays(5), "Duration","The following example is a `Duration` of five days.");
- try {
- addEntry("Extended", InetAddress.getByName("localhost"), "InetAddress", "");
- } catch (Exception ex) {
- throw new RuntimeException(ex);
- }
- addExtendedEntry(Instant.parse("2016-12-14T16:39:19.349Z"), "Instant", "");
- addExtendedEntry(LocalDate.of(2016, 1, 1), "LocalDate", "");
- addExtendedEntry(LocalDateTime.of(2016, 1, 1, 12, 30), "LocalDateTime", "");
- addExtendedEntry(LocalTime.of(12, 30, 45), "LocalTime", "");
- addExtendedEntry(MonthDay.of(1, 1), "MonthDay", "");
- addExtendedEntry(OffsetDateTime.parse("2007-12-03T10:15:30+01:00"), "OffsetDateTime", "");
- addExtendedEntry(OffsetTime.parse("10:15:30+01:00"), "OffsetTime", "");
- addExtendedEntry(Period.of(1, 6, 15), "Period", "The following example is a `Period` of one year, six months and fifteen days.");
- addExtendedEntry(new Short("100"), "Short", "");
- addExtendedEntry(Year.of(2016), "Year", "The following example is of the `Year` \"2016\".");
- addExtendedEntry(YearMonth.of(2016, 6), "YearMonth", "The following example is a `YearMonth` of \"June 2016\"");
- addExtendedEntry(ZonedDateTime.of(2016, 12, 23, 12, 12, 24, 36, ZoneId.of("GMT+2")), "ZonedDateTime", "");
- addExtendedEntry(ZoneOffset.ofHoursMinutesSeconds(3, 6, 9), "ZoneOffset", "The following example is a `ZoneOffset` of three hours, six minutes, and nine seconds.");
- }
+ addGraphProcessEntry(bulkSet, "var-bulkset", "");
+ addGraphProcessEntry(new BulkSet(), "empty-bulkset", "");
+
+ addGraphProcessEntry(g.V().hasLabel("person").asAdmin().nextTraverser(), "vertex-traverser", "");
+ addGraphProcessEntry(g.V().both().barrier().asAdmin().nextTraverser(), "bulked-traverser", "");
+ addGraphProcessEntry(EmptyTraverser.instance(), "empty-traverser", "");
+
+ addExtendedEntry(new BigDecimal("123.456789987654321123456789987654321"), "pos-bigdecimal", "");
+ addExtendedEntry(new BigDecimal("-123.456789987654321123456789987654321"), "neg-bigdecimal", "");
+
+ addExtendedEntry(new BigInteger("123456789987654321123456789987654321"), "pos-biginteger", "");
+ addExtendedEntry(new BigInteger("-123456789987654321123456789987654321"), "neg-biginteger", "");
+
+ addExtendedEntry(Byte.MAX_VALUE, "max-byte", "");
+ addExtendedEntry(Byte.MIN_VALUE, "min-byte", "");
+
+ addExtendedEntry(ByteBuffer.wrap(new byte[0]), "empty-binary", "");
+ addEntry("Extended", () -> java.nio.ByteBuffer.wrap("some bytes for you".getBytes(StandardCharsets.UTF_8)), "str-binary", "");
+
+ addExtendedEntry(Duration.ZERO, "zero-duration","The following example is a zero `Duration`");
+ addExtendedEntry(ChronoUnit.FOREVER.getDuration(), "forever-duration","");
+
+ addExtendedEntry(OffsetDateTime.MAX, "max-offsetdatetime", "");
+ addExtendedEntry(OffsetDateTime.MIN, "min-offsetdatetime", "");
- private static DefaultTraversalMetrics createStaticTraversalMetrics() {
- // based on g.V().hasLabel("person").out().out().tree().profile().next()
- final List<MutableMetrics> traversalMutableMetrics = new ArrayList<>();
- final MutableMetrics m7 = new MutableMetrics("7.0.0()", "TinkerGraphStep(vertex,[~label.eq(person)])");
- m7.setDuration(100, TimeUnit.MILLISECONDS);
- m7.setCount("traverserCount", 4);
- m7.setCount("elementCount", 4);
- m7.setAnnotation("percentDur", 25.0d);
- traversalMutableMetrics.add(m7);
-
- final MutableMetrics m2 = new MutableMetrics("2.0.0()", "VertexStep(OUT,vertex)");
- m2.setDuration(100, TimeUnit.MILLISECONDS);
- m2.setCount("traverserCount", 13);
- m2.setCount("elementCount", 13);
- m2.setAnnotation("percentDur", 25.0d);
- traversalMutableMetrics.add(m2);
-
- final MutableMetrics m3 = new MutableMetrics("3.0.0()", "VertexStep(OUT,vertex)");
- m3.setDuration(100, TimeUnit.MILLISECONDS);
- m3.setCount("traverserCount", 7);
- m3.setCount("elementCount", 7);
- m3.setAnnotation("percentDur", 25.0d);
- traversalMutableMetrics.add(m3);
-
- final MutableMetrics m4 = new MutableMetrics("4.0.0()", "TreeStep");
- m4.setDuration(100, TimeUnit.MILLISECONDS);
- m4.setCount("traverserCount", 1);
- m4.setCount("elementCount", 1);
- m4.setAnnotation("percentDur", 25.0d);
- traversalMutableMetrics.add(m4);
-
- return new DefaultTraversalMetrics(4000, traversalMutableMetrics);
+ addExtendedEntry(Short.MIN_VALUE, "min-short", "");
+ addExtendedEntry(Short.MAX_VALUE, "max-short", "");
}
public static Model instance() {
diff --git a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphbinary/GraphBinaryCompatibilityTest.java b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphbinary/GraphBinaryCompatibilityTest.java
index bc1fc271ab..77b92cf5d7 100644
--- a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphbinary/GraphBinaryCompatibilityTest.java
+++ b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphbinary/GraphBinaryCompatibilityTest.java
@@ -19,7 +19,6 @@
package org.apache.tinkerpop.gremlin.structure.io.graphbinary;
import io.netty.buffer.ByteBufAllocator;
-import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.tinkerpop.gremlin.structure.io.AbstractTypedCompatibilityTest;
@@ -42,8 +41,8 @@ import java.util.Arrays;
public class GraphBinaryCompatibilityTest extends AbstractTypedCompatibilityTest {
private static final ByteBufAllocator allocator = ByteBufAllocator.DEFAULT;
- private static final GraphBinaryWriter writerV1 = new GraphBinaryWriter();
- private static final GraphBinaryReader readerV1 = new GraphBinaryReader();
+ private static final GraphBinaryWriter writerV4 = new GraphBinaryWriter();
+ private static final GraphBinaryReader readerV4 = new GraphBinaryReader();
private static final NettyBufferFactory bufferFactory = new NettyBufferFactory();
private static final String testCaseDataPath = root.getPath() + File.separator + "test-case-data" + File.separator
@@ -56,7 +55,7 @@ public class GraphBinaryCompatibilityTest extends AbstractTypedCompatibilityTest
@Parameterized.Parameters(name = "expect({0})")
public static Iterable<Object[]> data() {
return Arrays.asList(new Object[][]{
- {"v1", readerV1, writerV1 },
+ {"v4", readerV4, writerV4 },
});
}
@@ -77,7 +76,7 @@ public class GraphBinaryCompatibilityTest extends AbstractTypedCompatibilityTest
@Override
protected byte[] readFromResource(final String resource) throws IOException {
final String testResource = resource + "-" + compatibility + ".gbin";
- return IOUtils.toByteArray(getClass().getResourceAsStream(testResource));
+ return IOUtils.toByteArray(GraphBinaryResourceAccess.class.getResourceAsStream(testResource));
}
@Override
diff --git a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTypedCompatibilityTest.java b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTypedCompatibilityTest.java
index 643e118bcd..435425e491 100644
--- a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTypedCompatibilityTest.java
+++ b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTypedCompatibilityTest.java
@@ -19,7 +19,10 @@
package org.apache.tinkerpop.gremlin.structure.io.graphson;
import org.apache.commons.io.IOUtils;
+import org.apache.tinkerpop.gremlin.TestHelper;
+import org.apache.tinkerpop.gremlin.structure.graphson.GraphSONAccess;
import org.apache.tinkerpop.gremlin.structure.io.AbstractTypedCompatibilityTest;
+import org.apache.tinkerpop.gremlin.structure.io.IoTest;
import org.apache.tinkerpop.gremlin.structure.io.Model;
import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2;
import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3;
@@ -40,17 +43,6 @@ import java.util.Arrays;
@RunWith(Parameterized.class)
public class GraphSONTypedCompatibilityTest extends AbstractTypedCompatibilityTest {
- private static ObjectMapper mapperV2 = GraphSONMapper.build().
- addRegistry(TinkerIoRegistryV2.instance()).
- typeInfo(TypeInfo.PARTIAL_TYPES).
- addCustomModule(GraphSONXModuleV2.build()).
- version(GraphSONVersion.V2_0).create().createMapper();
-
- private static ObjectMapper mapperV3 = GraphSONMapper.build().
- addRegistry(TinkerIoRegistryV3.instance()).
- addCustomModule(GraphSONXModuleV3.build()).
- version(GraphSONVersion.V3_0).create().createMapper();
-
private static ObjectMapper mapperV4 = GraphSONMapper.build().
addRegistry(TinkerIoRegistryV3.instance()).
addCustomModule(GraphSONXModuleV3.build()).
@@ -67,8 +59,6 @@ public class GraphSONTypedCompatibilityTest extends AbstractTypedCompatibilityTe
@Parameterized.Parameters(name = "expect({0})")
public static Iterable<Object[]> data() {
return Arrays.asList(new Object[][]{
- {"v2", mapperV2 },
- {"v3", mapperV3 },
{"v4", mapperV4 },
});
}
@@ -87,7 +77,7 @@ public class GraphSONTypedCompatibilityTest extends AbstractTypedCompatibilityTe
@Override
protected byte[] readFromResource(final String resource) throws IOException {
final String testResource = resource + "-" + compatibility + ".json";
- return IOUtils.toByteArray(getClass().getResourceAsStream(testResource));
+ return IOUtils.toByteArray(GraphSONResourceAccess.class.getResourceAsStream(testResource));
}
@Override
@@ -108,4 +98,10 @@ public class GraphSONTypedCompatibilityTest extends AbstractTypedCompatibilityTe
return bytes;
}
+
+ @Override
+ public void shouldReadWriteTraversalTree() throws Exception {
+ // Tree deserialization from GraphSON doesn't seem to work.
+ return;
+ }
}
diff --git a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONUntypedCompatibilityTest.java b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONUntypedCompatibilityTest.java
index 48f2e741a1..23c89fede4 100644
--- a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONUntypedCompatibilityTest.java
+++ b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONUntypedCompatibilityTest.java
@@ -39,23 +39,6 @@ import java.util.Arrays;
@RunWith(Parameterized.class)
public class GraphSONUntypedCompatibilityTest extends AbstractUntypedCompatibilityTest {
- private static final ObjectMapper mapperV1 = GraphSONMapper.build().
- addRegistry(TinkerIoRegistryV1.instance()).
- typeInfo(TypeInfo.NO_TYPES).
- version(GraphSONVersion.V1_0).create().createMapper();
-
- private static final ObjectMapper mapperV2 = GraphSONMapper.build().
- addRegistry(TinkerIoRegistryV2.instance()).
- typeInfo(TypeInfo.NO_TYPES).
- addCustomModule(GraphSONXModuleV2.build()).
- version(GraphSONVersion.V2_0).create().createMapper();
-
- private static final ObjectMapper mapperV3 = GraphSONMapper.build().
- addRegistry(TinkerIoRegistryV3.instance()).
- typeInfo(TypeInfo.NO_TYPES).
- addCustomModule(GraphSONXModuleV3.build()).
- version(GraphSONVersion.V3_0).create().createMapper();
-
private static final ObjectMapper mapperV4 = GraphSONMapper.build().
addRegistry(TinkerIoRegistryV3.instance()).
typeInfo(TypeInfo.NO_TYPES).
@@ -73,9 +56,6 @@ public class GraphSONUntypedCompatibilityTest extends AbstractUntypedCompatibili
@Parameterized.Parameters(name = "expect({0})")
public static Iterable<Object[]> data() {
return Arrays.asList(new Object[][]{
- {"v1-no-types", mapperV1 },
- {"v2-no-types", mapperV2 },
- {"v3-no-types", mapperV3 },
{"v4-no-types", mapperV4 },
});
}
@@ -94,7 +74,7 @@ public class GraphSONUntypedCompatibilityTest extends AbstractUntypedCompatibili
@Override
protected byte[] readFromResource(final String resource) throws IOException {
final String testResource = resource + "-" + compatibility + ".json";
- return IOUtils.toByteArray(getClass().getResourceAsStream(testResource));
+ return IOUtils.toByteArray(GraphSONResourceAccess.class.getResourceAsStream(testResource));
}
@Override