blob: 3a76a8442374b74638e6f119d3f4ac4dd30ab080 [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.Generic;
using Gremlin.Net.Process.Traversal;
using Gremlin.Net.Process.Traversal.Strategy.Decoration;
using Gremlin.Net.Process.Traversal.Strategy.Finalization;
using Gremlin.Net.Process.Traversal.Strategy.Optimization;
using Gremlin.Net.Process.Traversal.Strategy.Verification;
using Xunit;
namespace Gremlin.Net.IntegrationTest.Process.Traversal.BytecodeGeneration
{
public class StrategiesTests
{
[Fact]
public void TraversalWithoutStrategies_AfterWithStrategiesWasCalled_WithStrategiesNotAffected()
{
var g = AnonymousTraversalSource.Traversal().WithStrategies(new ReadOnlyStrategy(), new IncidentToAdjacentStrategy());
var bytecode = g.WithoutStrategies(typeof(ReadOnlyStrategy)).Bytecode;
Assert.Equal(2, bytecode.SourceInstructions.Count);
Assert.Equal("withStrategies", bytecode.SourceInstructions[0].OperatorName);
Assert.Equal(2, bytecode.SourceInstructions[0].Arguments.Length);
Assert.Equal(new ReadOnlyStrategy(), bytecode.SourceInstructions[0].Arguments[0]);
Assert.Equal(new IncidentToAdjacentStrategy(), bytecode.SourceInstructions[0].Arguments[1]);
Assert.Equal("withoutStrategies", bytecode.SourceInstructions[1].OperatorName);
Assert.Single(bytecode.SourceInstructions[1].Arguments);
Assert.Equal(typeof(ReadOnlyStrategy), bytecode.SourceInstructions[1].Arguments[0]);
}
[Fact]
public void ShouldIncludeMultipleStrategiesInBytecodeWhenGivenToWithoutStrategies()
{
var g = AnonymousTraversalSource.Traversal();
var bytecode = g.WithoutStrategies(typeof(ReadOnlyStrategy), typeof(LazyBarrierStrategy)).Bytecode;
Assert.Single(bytecode.SourceInstructions);
Assert.Equal(2, bytecode.SourceInstructions[0].Arguments.Length);
Assert.Equal("withoutStrategies", bytecode.SourceInstructions[0].OperatorName);
Assert.Equal(typeof(ReadOnlyStrategy), bytecode.SourceInstructions[0].Arguments[0]);
Assert.Equal(typeof(LazyBarrierStrategy), bytecode.SourceInstructions[0].Arguments[1]);
}
[Fact]
public void ShouldIncludeOneStrategyInBytecodeWhenGivenToWithoutStrategies()
{
var g = AnonymousTraversalSource.Traversal();
var bytecode = g.WithoutStrategies(typeof(ReadOnlyStrategy)).Bytecode;
Assert.Single(bytecode.SourceInstructions);
Assert.Single(bytecode.SourceInstructions[0].Arguments);
Assert.Equal("withoutStrategies", bytecode.SourceInstructions[0].OperatorName);
Assert.Equal(typeof(ReadOnlyStrategy), bytecode.SourceInstructions[0].Arguments[0]);
}
[Fact]
public void ShouldIncludeConfigurationInBytecodeWhenGivenToWithStrategies()
{
var g = AnonymousTraversalSource.Traversal();
var bytecode = g.WithStrategies(new MatchAlgorithmStrategy("greedy")).Bytecode;
Assert.Single(bytecode.SourceInstructions);
Assert.Single(bytecode.SourceInstructions[0].Arguments);
Assert.Equal("withStrategies", bytecode.SourceInstructions[0].OperatorName);
Assert.Equal(new MatchAlgorithmStrategy(), bytecode.SourceInstructions[0].Arguments[0]);
Assert.Contains("greedy",
((MatchAlgorithmStrategy) bytecode.SourceInstructions[0].Arguments[0]).Configuration.Values);
}
[Fact]
public void ShouldIncludeMultipleStrategiesInBytecodeWhenGivenToWithStrategies()
{
var g = AnonymousTraversalSource.Traversal();
var bytecode = g.WithStrategies(new ReadOnlyStrategy(), new IncidentToAdjacentStrategy()).Bytecode;
Assert.Single(bytecode.SourceInstructions);
Assert.Equal(2, bytecode.SourceInstructions[0].Arguments.Length);
Assert.Equal("withStrategies", bytecode.SourceInstructions[0].OperatorName);
Assert.Equal(new ReadOnlyStrategy(), bytecode.SourceInstructions[0].Arguments[0]);
Assert.Equal(new IncidentToAdjacentStrategy(), bytecode.SourceInstructions[0].Arguments[1]);
}
[Fact]
public void ShouldIncludeOneStrategyInBytecodeWhenGivenToWithStrategies()
{
var g = AnonymousTraversalSource.Traversal();
var bytecode = g.WithStrategies(new ReadOnlyStrategy()).Bytecode;
Assert.Single(bytecode.SourceInstructions);
Assert.Single(bytecode.SourceInstructions[0].Arguments);
Assert.Equal("withStrategies", bytecode.SourceInstructions[0].OperatorName);
Assert.Equal(new ReadOnlyStrategy(), bytecode.SourceInstructions[0].Arguments[0]);
Assert.Equal("ReadOnlyStrategy", bytecode.SourceInstructions[0].Arguments[0].ToString());
Assert.Equal(new ReadOnlyStrategy().GetHashCode(), bytecode.SourceInstructions[0].Arguments[0].GetHashCode());
Assert.Equal(0, g.TraversalStrategies.Count);
}
[Fact]
public void TraversalWithStrategies_Strategies_ApplyToReusedGraphTraversalSource()
{
var g = AnonymousTraversalSource.Traversal().WithStrategies(new ReadOnlyStrategy(), new IncidentToAdjacentStrategy());
var bytecode = g.V().Bytecode;
Assert.Single(bytecode.SourceInstructions);
Assert.Equal(2, bytecode.SourceInstructions[0].Arguments.Length);
Assert.Equal("withStrategies", bytecode.SourceInstructions[0].OperatorName);
Assert.Equal(new ReadOnlyStrategy(), bytecode.SourceInstructions[0].Arguments[0]);
Assert.Equal(new IncidentToAdjacentStrategy(), bytecode.SourceInstructions[0].Arguments[1]);
Assert.Single(bytecode.StepInstructions);
Assert.Equal("V", bytecode.StepInstructions[0].OperatorName);
}
[Fact]
public void TraversalWithStrategies_StrategyWithTraversalInConfig_IncludeTraversalInInConfigInBytecode()
{
var g = AnonymousTraversalSource.Traversal();
var bytecode = g.WithStrategies(new SubgraphStrategy(__.Has("name", "marko"), checkAdjacentVertices: false)).Bytecode;
Assert.Single(bytecode.SourceInstructions);
Assert.Single(bytecode.SourceInstructions[0].Arguments);
Assert.Equal("withStrategies", bytecode.SourceInstructions[0].OperatorName);
Assert.Equal(new SubgraphStrategy(), bytecode.SourceInstructions[0].Arguments[0]);
SubgraphStrategy strategy = bytecode.SourceInstructions[0].Arguments[0];
Assert.Equal(typeof(GraphTraversal<object, object>), strategy.Configuration["vertices"].GetType());
ITraversal traversal = strategy.Configuration["vertices"];
Assert.Equal("has", traversal.Bytecode.StepInstructions[0].OperatorName);
Assert.Equal(new List<string> {"name", "marko"}, traversal.Bytecode.StepInstructions[0].Arguments);
Assert.Equal(false, strategy.Configuration["checkAdjacentVertices"]);
}
}
}