blob: 2c33a1e0343536d9b1cb863febbdd96b544f1c69 [file] [log] [blame]
#region License
/*
* 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.
*/
#endregion
using System;
using System.Collections.Generic;
using System.Numerics;
using System.Text.Json;
using Gremlin.Net.Process.Traversal;
using Gremlin.Net.Structure;
using Gremlin.Net.Structure.IO.GraphSON;
using Moq;
using Xunit;
namespace Gremlin.Net.UnitTest.Structure.IO.GraphSON
{
public class GraphSONReaderTests
{
/// <summary>
/// Parameters for each test supporting multiple versions of GraphSON
/// </summary>
public static IEnumerable<object[]> Versions => new []
{
new object[] { 2 },
new object[] { 3 }
};
/// <summary>
/// Parameters for each collections test supporting multiple versions of GraphSON
/// </summary>
public static IEnumerable<object[]> VersionsSupportingCollections => new []
{
new object[] { 3 }
};
private GraphSONReader CreateStandardGraphSONReader(int version)
{
if (version == 3)
{
return new GraphSON3Reader();
}
return new GraphSON2Reader();
}
[Fact]
public void ShouldDeserializeWithCustomDeserializerForNewType()
{
var deserializerByGraphSONType = new Dictionary<string, IGraphSONDeserializer>
{
{"NS:TestClass", new TestGraphSONDeserializer()}
};
var reader = new GraphSON2Reader(deserializerByGraphSONType);
const string graphSON = "{\"@type\":\"NS:TestClass\",\"@value\":\"test\"}";
var jsonElement = JsonSerializer.Deserialize<JsonElement>(graphSON);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal("test", deserializedValue.Value);
}
[Fact]
public void ShouldDeserializeWithCustomDeserializerForCommonType()
{
var customSerializerMock = new Mock<IGraphSONDeserializer>();
const string overrideTypeString = "g:Int64";
var customSerializerByType = new Dictionary<string, IGraphSONDeserializer>
{
{overrideTypeString, customSerializerMock.Object}
};
var reader = new GraphSON2Reader(customSerializerByType);
var jsonElement =
JsonSerializer.Deserialize<JsonElement>($"{{\"@type\":\"{overrideTypeString}\",\"@value\":12}}");
var deserializedValue = reader.ToObject(jsonElement);
customSerializerMock.Verify(m => m.Objectify(It.IsAny<JsonElement>(), It.IsAny<GraphSONReader>()));
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeDateToDateTimeOffset(int version)
{
const string graphSon = "{\"@type\":\"g:Date\",\"@value\":1475583442552}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(graphSon);
var deserializedValue = reader.ToObject(jsonElement);
var expectedDateTimeOffset = TestUtils.FromJavaTime(1475583442552);
Assert.Equal(expectedDateTimeOffset, deserializedValue);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeDictionary(int version)
{
const string serializedDict = "{\"age\":[{\"@type\":\"g:Int32\", \"@value\":29}], \"name\":[\"marko\"], " +
"\"gender\": null}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(serializedDict);
var deserializedValue = reader.ToObject(jsonElement);
var expectedDict = new Dictionary<string, dynamic>
{
{"age", new List<object> {29}},
{"name", new List<object> {"marko"}},
{"gender", null}
};
Assert.Equal(expectedDict, deserializedValue);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeEdge(int version)
{
const string graphSon = "{\"@type\":\"g:Edge\", \"@value\":{\"id\":{\"@type\":\"g:Int64\", \"@value\":17}, " +
"\"label\":\"knows\", \"inV\":\"x\", \"outV\":\"y\", \"inVLabel\":\"xLab\", " +
"\"properties\":{\"aKey\":\"aValue\", \"bKey\":true}}}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(graphSon);
Edge readEdge = reader.ToObject(jsonElement);
Assert.Equal((long) 17, readEdge.Id);
Assert.Equal("knows", readEdge.Label);
Assert.Equal(new Vertex("x", "xLabel"), readEdge.InV);
Assert.Equal(new Vertex("y"), readEdge.OutV);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeInt(int version)
{
var serializedValue = "{\"@type\":\"g:Int32\",\"@value\":5}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(serializedValue);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal(5, deserializedValue);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeLong(int version)
{
const string serializedValue = "{\"@type\":\"g:Int64\",\"@value\":5}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(serializedValue);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal((long) 5, deserializedValue);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeFloat(int version)
{
const string serializedValue = "{\"@type\":\"g:Float\",\"@value\":31.3}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(serializedValue);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal((float) 31.3, deserializedValue);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeDouble(int version)
{
const string serializedValue = "{\"@type\":\"g:Double\",\"@value\":31.2}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(serializedValue);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal(31.2, deserializedValue);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeNaN(int version)
{
const string serializedValue = "{\"@type\":\"g:Double\",\"@value\":\"NaN\"}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(serializedValue);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal(Double.NaN, deserializedValue);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializePositiveInfinity(int version)
{
const string serializedValue = "{\"@type\":\"g:Double\",\"@value\":\"Infinity\"}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(serializedValue);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal(double.PositiveInfinity, deserializedValue);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeNegativeInfinity(int version)
{
const string serializedValue = "{\"@type\":\"g:Double\",\"@value\":\"-Infinity\"}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(serializedValue);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal(double.NegativeInfinity, deserializedValue);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeDecimal(int version)
{
const string serializedValue = "{\"@type\":\"gx:BigDecimal\",\"@value\":-8.201}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(serializedValue);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal(-8.201M, deserializedValue);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeDecimalValueAsString(int version)
{
const string serializedValue = "{\"@type\":\"gx:BigDecimal\",\"@value\":\"7.50\"}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(serializedValue);
decimal deserializedValue = reader.ToObject(jsonElement);
Assert.Equal(7.5M, deserializedValue);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeByte(int version)
{
const string serializedValue = "{\"@type\":\"gx:Byte\",\"@value\":1}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(serializedValue);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal(1, deserializedValue);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeChar(int version)
{
const string serializedValue = "{\"@type\":\"gx:Char\",\"@value\":\"x\"}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(serializedValue);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal('x', deserializedValue);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeList(int version)
{
const string serializedValue = "[{\"@type\":\"g:Int32\", \"@value\":5}, {\"@type\":\"g:Int32\", " +
"\"@value\":6}, null]";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(serializedValue);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal(new List<object> {5, 6, null}, deserializedValue);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeT(int version)
{
const string graphSon = "{\"@type\":\"g:T\",\"@value\":\"label\"}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(graphSon);
T readT = reader.ToObject(jsonElement);
Assert.Equal(T.Label, readT);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeDirection(int version)
{
const string serializedValue = "{\"@type\":\"g:Direction\",\"@value\":\"OUT\"}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(serializedValue);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal(Direction.Out, deserializedValue);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeMerge(int version)
{
const string serializedValue = "{\"@type\":\"g:Merge\",\"@value\":\"onMatch\"}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(serializedValue);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal(Merge.OnMatch, deserializedValue);
}
[Fact]
public void ShouldDeserializePathFromGraphSON2()
{
const string graphSon =
"{\"@type\":\"g:Path\",\"@value\":{\"labels\":[[\"a\"],[\"b\",\"c\"],[]],\"objects\":[{\"@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\"}}],\"age\":[{\"@type\":\"g:VertexProperty\",\"@value\":{\"id\":{\"@type\":\"g:Int64\",\"@value\":1},\"value\":{\"@type\":\"g:Int32\",\"@value\":29},\"label\":\"age\"}}]}}},{\"@type\":\"g:Vertex\",\"@value\":{\"id\":{\"@type\":\"g:Int32\",\"@value\":3},\"label\":\"software\",\"properties\":{\"name\":[{\"@type\":\"g:VertexProperty\",\"@value\":{\"id\":{\"@type\":\"g:Int64\",\"@value\":4},\"value\":\"lop\",\"label\":\"name\"}}],\"lang\":[{\"@type\":\"g:VertexProperty\",\"@value\":{\"id\":{\"@type\":\"g:Int64\",\"@value\":5},\"value\":\"java\",\"label\":\"lang\"}}]}}},\"lop\"]}}";
var reader = CreateStandardGraphSONReader(2);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(graphSon);
Path readPath = reader.ToObject(jsonElement);
Assert.Equal("path[v[1], v[3], lop]", readPath.ToString());
Assert.Equal(new Vertex(1), readPath[0]);
Assert.Equal(new Vertex(1), readPath["a"]);
Assert.Equal("lop", readPath[2]);
Assert.Equal(3, readPath.Count);
}
[Fact]
public void ShouldDeserializePathFromGraphSON3()
{
const string graphSon = "{\"@type\":\"g:Path\",\"@value\":{" +
"\"labels\":{\"@type\":\"g:List\",\"@value\":[{\"@type\":\"g:Set\",\"@value\":[\"z\"]}]}," +
"\"objects\":{\"@type\":\"g:List\",\"@value\":[{\"@type\":\"g:Vertex\",\"@value\":{\"id\":{\"@type\":\"g:Int64\",\"@value\":5},\"label\":\"\"}}]}}}";
var reader = CreateStandardGraphSONReader(3);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(graphSon);
Path readPath = reader.ToObject(jsonElement);
Assert.Equal("path[v[5]]", readPath.ToString());
Assert.Equal(new Vertex(5L), readPath[0]);
Assert.Equal(new Vertex(5L), readPath["z"]);
Assert.Single(readPath);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializePropertyWithEdgeElement(int version)
{
const string graphSon = "{\"@type\":\"g:Property\", \"@value\":{\"key\":\"aKey\", " +
"\"value\":{\"@type\":\"g:Int64\", \"@value\":17}, " +
"\"element\":{\"@type\":\"g:Edge\", \"@value\":{\"id\":{\"@type\":\"g:Int64\", " +
"\"@value\":122}, \"label\":\"knows\", \"inV\":\"x\", \"outV\":\"y\", " +
"\"inVLabel\":\"xLab\"}}}}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(graphSon);
Property readProperty = reader.ToObject(jsonElement);
Assert.Equal("aKey", readProperty.Key);
Assert.Equal((long) 17, readProperty.Value);
Assert.Equal(typeof(Edge), readProperty.Element.GetType());
var edge = readProperty.Element as Edge;
Assert.Equal((long) 122, edge.Id);
Assert.Equal("knows", edge.Label);
Assert.Equal("x", edge.InV.Id);
Assert.Equal("y", edge.OutV.Id);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeTimestampToDateTimeOffset(int version)
{
const string graphSon = "{\"@type\":\"g:Timestamp\",\"@value\":1475583442558}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(graphSon);
var deserializedValue = reader.ToObject(jsonElement);
var expectedDateTimeOffset = TestUtils.FromJavaTime(1475583442558);
Assert.Equal(expectedDateTimeOffset, deserializedValue);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeGuid(int version)
{
const string graphSon = "{\"@type\":\"g:UUID\",\"@value\":\"41d2e28a-20a4-4ab0-b379-d810dede3786\"}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(graphSon);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal(Guid.Parse("41d2e28a-20a4-4ab0-b379-d810dede3786"), deserializedValue);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeVertexProperty(int version)
{
const string graphSon = "{\"@type\":\"g:VertexProperty\", \"@value\":{\"id\":\"anId\", \"label\":\"aKey\", " +
"\"value\":true, \"vertex\":{\"@type\":\"g:Int32\", \"@value\":9}}}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(graphSon);
VertexProperty readVertexProperty = reader.ToObject(jsonElement);
Assert.Equal("anId", readVertexProperty.Id);
Assert.Equal("aKey", readVertexProperty.Label);
Assert.True(readVertexProperty.Value);
Assert.NotNull(readVertexProperty.Vertex);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeVertexPropertyWithLabel(int version)
{
const string graphSon = "{\"@type\":\"g:VertexProperty\", \"@value\":{\"id\":{\"@type\":\"g:Int32\", " +
"\"@value\":1}, \"label\":\"name\", \"value\":\"marko\"}}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(graphSon);
VertexProperty readVertexProperty = reader.ToObject(jsonElement);
Assert.Equal(1, readVertexProperty.Id);
Assert.Equal("name", readVertexProperty.Label);
Assert.Equal("marko", readVertexProperty.Value);
Assert.Null(readVertexProperty.Vertex);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeVertex(int version)
{
const string graphSon = "{\"@type\":\"g:Vertex\", \"@value\":{\"id\":{\"@type\":\"g:Float\", " +
"\"@value\":45.23}}}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(graphSon);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal(new Vertex(45.23f), deserializedValue);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeVertexWithLabel(int version)
{
const string graphSon = "{\"@type\":\"g:Vertex\", \"@value\":{\"id\":{\"@type\":\"g:Float\", " +
"\"@value\":45.23}, \"label\": \"person\"}}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(graphSon);
Vertex deserializedValue = reader.ToObject(jsonElement);
Assert.Equal("person", deserializedValue.Label);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeVertexWithEdges(int version)
{
const string graphSon =
"{\"@type\":\"g:Vertex\", \"@value\":{\"id\":{\"@type\":\"g:Int32\",\"@value\":1},\"label\":\"person\",\"outE\":{\"created\":[{\"id\":{\"@type\":\"g:Int32\",\"@value\":9},\"inV\":{\"@type\":\"g:Int32\",\"@value\":3},\"properties\":{\"weight\":{\"@type\":\"g:Double\",\"@value\":0.4}}}],\"knows\":[{\"id\":{\"@type\":\"g:Int32\",\"@value\":7},\"inV\":{\"@type\":\"g:Int32\",\"@value\":2},\"properties\":{\"weight\":{\"@type\":\"g:Double\",\"@value\":0.5}}},{\"id\":{\"@type\":\"g:Int32\",\"@value\":8},\"inV\":{\"@type\":\"g:Int32\",\"@value\":4},\"properties\":{\"weight\":{\"@type\":\"g:Double\",\"@value\":1.0}}}]},\"properties\":{\"name\":[{\"id\":{\"@type\":\"g:Int64\",\"@value\":0},\"value\":\"marko\"}],\"age\":[{\"id\":{\"@type\":\"g:Int64\",\"@value\":1},\"value\":{\"@type\":\"g:Int32\",\"@value\":29}}]}}}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(graphSon);
Vertex readVertex = reader.ToObject(jsonElement);
Assert.Equal(new Vertex(1), readVertex);
Assert.Equal("person", readVertex.Label);
Assert.Equal(typeof(int), readVertex.Id.GetType());
}
[Theory, MemberData(nameof(VersionsSupportingCollections))]
public void ShouldDeserializeEmptyGList(int version)
{
const string graphSon = "{\"@type\":\"g:List\", \"@value\": []}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(graphSon);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal(new object[0], deserializedValue);
}
[Theory, MemberData(nameof(VersionsSupportingCollections))]
public void ShouldDeserializeGList(int version)
{
const string json = "{\"@type\":\"g:List\", \"@value\": [{\"@type\": \"g:Int32\", \"@value\": 1}," +
"{\"@type\": \"g:Int32\", \"@value\": 2}, {\"@type\": \"g:Int32\", \"@value\": 3}]}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(json);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal((IList<object>)new object[] { 1, 2, 3}, deserializedValue);
}
[Theory, MemberData(nameof(VersionsSupportingCollections))]
public void ShouldDeserializeGSet(int version)
{
const string graphSon = "{\"@type\":\"g:Set\", \"@value\": [{\"@type\": \"g:Int32\", \"@value\": 1}," +
"{\"@type\": \"g:Int32\", \"@value\": 2}, {\"@type\": \"g:Int32\", \"@value\": 3}]}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(graphSon);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal((ISet<object>)new HashSet<object>{ 1, 2, 3}, deserializedValue);
}
[Theory, MemberData(nameof(VersionsSupportingCollections))]
public void ShouldDeserializeGMap(int version)
{
const string json = "{\"@type\":\"g:Map\", \"@value\": [\"a\",{\"@type\": \"g:Int32\", \"@value\": 1}, " +
"\"b\", {\"@type\": \"g:Int32\", \"@value\": 2}]}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(json);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal(new Dictionary<object, object>{ { "a", 1 }, { "b", 2 }}, deserializedValue);
}
[Theory, MemberData(nameof(VersionsSupportingCollections))]
public void ShouldDeserializeGMapWithNonStringKeys(int version)
{
const string json = "{\"@type\":\"g:Map\", \"@value\": [{\"@type\":\"g:Int32\", \"@value\":123}, \"red\"]}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(json);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal(new Dictionary<object, object>{ { 123, "red" }}, deserializedValue);
}
[Theory, MemberData(nameof(VersionsSupportingCollections))]
public void ShouldDeserializeBulkSet(int version)
{
const string graphSon = "{\"@type\": \"g:BulkSet\", \"@value\": [" +
"\"marko\", {\"@type\": \"g:Int64\", \"@value\": 1}, " +
"\"josh\", {\"@type\": \"g:Int64\", \"@value\": 3}]}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(graphSon);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal(new List<object>{ "marko", "josh", "josh", "josh" }, deserializedValue);
}
[Fact]
public void ShouldDeserializeBulkSetWithGraphSON3()
{
const string graphSon =
"{\"@type\":\"g:List\",\"@value\":[{\"@type\":\"g:Traverser\",\"@value\":{\"bulk\":{\"@type\":\"g:Int64\",\"@value\":1},\"value\":{\"@type\":\"g:BulkSet\",\"@value\":[{\"@type\":\"g:Int64\",\"@value\":1},{\"@type\":\"g:Int64\",\"@value\":2},{\"@type\":\"g:Int64\",\"@value\":0},{\"@type\":\"g:Int64\",\"@value\":3},{\"@type\":\"g:Int64\",\"@value\":2},{\"@type\":\"g:Int64\",\"@value\":1},{\"@type\":\"g:Double\",\"@value\":1.0},{\"@type\":\"g:Int64\",\"@value\":2}]}}}]}";
var reader = CreateStandardGraphSONReader(3);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(graphSon);
var deserializedValue = reader.ToObject(jsonElement);
}
[Theory, MemberData(nameof(VersionsSupportingCollections))]
public void ShouldDeserializeTraverser(int version)
{
const string json = "{\"@type\":\"g:Traverser\", \"@value\":{\"bulk\":{\"@type\":\"g:Int64\", " +
"\"@value\":10}, \"value\":{\"@type\":\"g:Int32\", \"@value\":1}}}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(json);
Traverser deserializedValue = reader.ToObject(jsonElement);
Assert.Equal(10, deserializedValue.Bulk);
Assert.Equal(1, deserializedValue.Object);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeDurationToTimeSpan(int version)
{
const string graphSon = "{\"@type\":\"gx:Duration\",\"@value\":\"PT120H\"}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(graphSon);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal(TimeSpan.FromDays(5), deserializedValue);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeBigInteger(int version)
{
var graphSon = "{\"@type\":\"gx:BigInteger\",\"@value\":123456789}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(graphSon);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal(BigInteger.Parse("123456789"), deserializedValue);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeBigIntegerValueAsString(int version)
{
var graphSon = "{\"@type\":\"gx:BigInteger\", \"@value\":\"123456789\"}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(graphSon);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal(BigInteger.Parse("123456789"), deserializedValue);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeReallyBigIntegerValue(int version)
{
const string graphSon = "{\"@type\":\"gx:BigInteger\", \"@value\":123456789987654321123456789987654321}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(graphSon);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal(BigInteger.Parse("123456789987654321123456789987654321"), deserializedValue);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeByteBuffer(int version)
{
const string graphSon = "{\"@type\":\"gx:ByteBuffer\", \"@value\":\"c29tZSBieXRlcyBmb3IgeW91\"}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(graphSon);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal(Convert.FromBase64String("c29tZSBieXRlcyBmb3IgeW91"), deserializedValue);
}
[Theory, MemberData(nameof(Versions))]
public void ShouldDeserializeInt16(int version)
{
const string graphSon = "{\"@type\":\"gx:Int16\", \"@value\":100}";
var reader = CreateStandardGraphSONReader(version);
var jsonElement = JsonSerializer.Deserialize<JsonElement>(graphSon);
var deserializedValue = reader.ToObject(jsonElement);
Assert.Equal(100, deserializedValue);
}
}
internal class TestGraphSONDeserializer : IGraphSONDeserializer
{
public dynamic Objectify(JsonElement graphsonObject, GraphSONReader reader)
{
return new TestClass {Value = graphsonObject.GetString()};
}
}
}