blob: d9ab4a7e69336de3099ae3d91e8c419042a1b98d [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.Collections;
using System.Collections.Generic;
using System.Linq;
using Gremlin.Net.Process.Traversal;
using Xunit;
namespace Gremlin.Net.UnitTest.Process.Traversal
{
public class BytecodeTests
{
[Fact]
public void ShouldUseBingingsForSimpleValueInStepArgument()
{
var bytecode = new Bytecode();
var bindings = Bindings.Instance;
bytecode.AddStep("hasLabel", bindings.Of("label", "testvalue"));
Assert.Equal(new Binding("label", "testvalue"), bytecode.StepInstructions[0].Arguments[0]);
}
[Fact]
public void ShouldUseBindingsInsideArrayInStepArgument()
{
var bytecode = new Bytecode();
var b = Bindings.Instance;
bytecode.AddStep("someStep", "test", new[] {b.Of("arrayVariable", "arrayValue")});
Assert.Equal(new Binding("arrayVariable", "arrayValue"), bytecode.StepInstructions[0].Arguments[1]);
}
[Fact]
public void ShouldUseBindingsInsideDictionaryValuesInStepArgument()
{
var bytecode = new Bytecode();
var b = Bindings.Instance;
bytecode.AddStep("someStep", new Dictionary<string, object> {{"someKey", b.Of("valVariable", "valValue")}});
var arg = bytecode.StepInstructions[0].Arguments[0] as IDictionary;
Assert.Equal(new Binding("valVariable", "valValue"), arg["someKey"]);
}
[Fact]
public void ShouldUseBindingsInsideDictionaryKeysInStepArgument()
{
var bytecode = new Bytecode();
var b = Bindings.Instance;
bytecode.AddStep("someStep", new Dictionary<string, object> {{b.Of("keyVariable", "keyValue"), 1234}});
var arg = bytecode.StepInstructions[0].Arguments[0];
var binding = ((Dictionary<object, object>) arg).Keys.First() as Binding;
Assert.Equal(new Binding("keyVariable", "keyValue"), binding);
}
[Fact]
public void ShouldUseBindingsInsideListInStepArgument()
{
var bytecode = new Bytecode();
var b = Bindings.Instance;
bytecode.AddStep("someStep", new List<string> {"test", b.Of("listVariable", "listValue")});
var arg = bytecode.StepInstructions[0].Arguments[0] as IList;
Assert.Equal(new Binding("listVariable", "listValue"), arg[1]);
}
[Fact]
public void ShouldUseBindingsInsideHashSetInStepArgument()
{
var bytecode = new Bytecode();
var b = Bindings.Instance;
bytecode.AddStep("someStep", new HashSet<string> { "test", b.Of("setVariable", "setValue") });
var arg = bytecode.StepInstructions[0].Arguments[0] as ISet<object>;
Assert.Equal(new Binding("setVariable", "setValue"), arg.ToList()[1]);
}
[Fact]
public void ShouldUseBingingsForSimpleValueInSourceArgument()
{
var bytecode = new Bytecode();
var bindings = Bindings.Instance;
bytecode.AddSource("hasLabel", bindings.Of("label", "testvalue"));
Assert.Equal(new Binding("label", "testvalue"), bytecode.SourceInstructions[0].Arguments[0]);
}
[Fact]
public void ShouldUseBindingsInsideArrayInSourceArgument()
{
var bytecode = new Bytecode();
var b = Bindings.Instance;
bytecode.AddSource("someSource", "test", new[] { b.Of("arrayVariable", "arrayValue") });
Assert.Equal(new Binding("arrayVariable", "arrayValue"), bytecode.SourceInstructions[0].Arguments[1]);
}
[Fact]
public void ShouldUseBindingsInsideDictionaryValuesInSourceArgument()
{
var bytecode = new Bytecode();
var b = Bindings.Instance;
bytecode.AddSource("someSource", new Dictionary<string, object> { { "someKey", b.Of("valVariable", "valValue") } });
var arg = bytecode.SourceInstructions[0].Arguments[0] as IDictionary;
Assert.Equal(new Binding("valVariable", "valValue"), arg["someKey"]);
}
[Fact]
public void ShouldUseBindingsInsideDictionaryKeysInSourceArgument()
{
var bytecode = new Bytecode();
var b = Bindings.Instance;
bytecode.AddSource("someSource", new Dictionary<string, object> { { b.Of("keyVariable", "keyValue"), 1234 } });
var arg = bytecode.SourceInstructions[0].Arguments[0];
var binding = ((Dictionary<object, object>)arg).Keys.First() as Binding;
Assert.Equal(new Binding("keyVariable", "keyValue"), binding);
}
[Fact]
public void ShouldUseBindingsInsideListInSourceArgument()
{
var bytecode = new Bytecode();
var b = Bindings.Instance;
bytecode.AddSource("someSource", new List<string> { "test", b.Of("listVariable", "listValue") });
var arg = bytecode.SourceInstructions[0].Arguments[0] as IList;
Assert.Equal(new Binding("listVariable", "listValue"), arg[1]);
}
[Fact]
public void ShouldUseBindingsInsideHashSetInSourceArgument()
{
var bytecode = new Bytecode();
var b = Bindings.Instance;
bytecode.AddSource("someSource", new HashSet<string> { "test", b.Of("setVariable", "setValue") });
var arg = bytecode.SourceInstructions[0].Arguments[0] as ISet<object>;
Assert.Equal(new Binding("setVariable", "setValue"), arg.ToList()[1]);
}
[Fact]
public void ShouldIncludeStepAndSourceInstructionsForToString()
{
var bytecode = new Bytecode();
bytecode.AddSource("source", 1, 2);
bytecode.AddStep("step1", 9, 8);
bytecode.AddStep("step2", 0);
bytecode.AddStep("step3", 0, null, 0d);
bytecode.AddStep("step4", "0), stepX(\"hello\"");
Assert.Equal("[[source(1, 2)], [step1(9, 8), step2(0), step3(0, null, 0), step4(0), stepX(\"hello\")]]",
bytecode.ToString());
}
}
}