blob: f0fc45aba535c074cfabb1cfa75714417d58fc9b [file] [log] [blame]
/*
* 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.process.util;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DropStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.FilterStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.LambdaFilterStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.TraversalFilterStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.IdentityStep;
import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import org.apache.tinkerpop.gremlin.structure.PropertyType;
import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
import org.junit.Test;
import org.mockito.Mockito;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.*;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
* @author Stephen Mallette (http://stephen.genoprime.com)
*/
public class TraversalHelperTest {
@Test
public void shouldNotFindStepOfClassInTraversal() {
final Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
traversal.asAdmin().addStep(0, new HasStep(traversal));
traversal.asAdmin().addStep(0, new HasStep(traversal));
traversal.asAdmin().addStep(0, new HasStep(traversal));
assertThat(TraversalHelper.hasStepOfClass(FilterStep.class, traversal), is(false));
}
@Test
public void shouldFindStepOfClassInTraversal() {
final Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
traversal.asAdmin().addStep(0, new HasStep(traversal));
traversal.asAdmin().addStep(0, new IdentityStep<>(traversal));
traversal.asAdmin().addStep(0, new HasStep(traversal));
assertThat(TraversalHelper.hasStepOfClass(IdentityStep.class, traversal), is(true));
}
@Test
public void shouldNotFindStepOfAssignableClassInTraversal() {
final Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
traversal.asAdmin().addStep(0, new HasStep(traversal));
traversal.asAdmin().addStep(0, new HasStep(traversal));
traversal.asAdmin().addStep(0, new HasStep(traversal));
assertThat(TraversalHelper.hasStepOfAssignableClass(IdentityStep.class, traversal), is(false));
}
@Test
public void shouldFindStepOfAssignableClassInTraversal() {
final Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
traversal.asAdmin().addStep(0, new HasStep(traversal));
traversal.asAdmin().addStep(0, new HasStep(traversal));
traversal.asAdmin().addStep(0, new HasStep(traversal));
assertThat(TraversalHelper.hasStepOfAssignableClass(FilterStep.class, traversal), is(true));
}
@Test
public void shouldGetTheStepIndex() {
final Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
final HasStep hasStep = new HasStep(traversal);
traversal.asAdmin().addStep(0, new HasStep(traversal));
traversal.asAdmin().addStep(0, hasStep);
traversal.asAdmin().addStep(0, new HasStep(traversal));
assertEquals(1, TraversalHelper.stepIndex(hasStep, traversal));
}
@Test
public void shouldNotFindTheStepIndex() {
final Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
final IdentityStep identityStep = new IdentityStep(traversal);
traversal.asAdmin().addStep(0, new HasStep(traversal));
traversal.asAdmin().addStep(0, new HasStep(traversal));
traversal.asAdmin().addStep(0, new HasStep(traversal));
assertEquals(-1, TraversalHelper.stepIndex(identityStep, traversal));
}
@Test
public void shouldInsertBeforeStep() {
final Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
final HasStep hasStep = new HasStep(traversal);
final IdentityStep identityStep = new IdentityStep(traversal);
traversal.asAdmin().addStep(0, new HasStep(traversal));
traversal.asAdmin().addStep(0, hasStep);
traversal.asAdmin().addStep(0, new HasStep(traversal));
TraversalHelper.insertBeforeStep(identityStep, hasStep, traversal);
assertEquals(traversal.asAdmin().getSteps().get(1), identityStep);
assertEquals(4, traversal.asAdmin().getSteps().size());
}
@Test
public void shouldInsertAfterStep() {
final Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
final HasStep hasStep = new HasStep(traversal);
final IdentityStep identityStep = new IdentityStep(traversal);
traversal.asAdmin().addStep(0, new HasStep(traversal));
traversal.asAdmin().addStep(0, hasStep);
traversal.asAdmin().addStep(0, new HasStep(traversal));
TraversalHelper.insertAfterStep(identityStep, hasStep, traversal);
assertEquals(traversal.asAdmin().getSteps().get(2), identityStep);
assertEquals(4, traversal.asAdmin().getSteps().size());
}
@Test
public void shouldReplaceStep() {
final Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
final HasStep hasStep = new HasStep(traversal);
final IdentityStep identityStep = new IdentityStep(traversal);
traversal.asAdmin().addStep(0, new HasStep(traversal));
traversal.asAdmin().addStep(0, hasStep);
traversal.asAdmin().addStep(0, new HasStep(traversal));
TraversalHelper.replaceStep(hasStep, identityStep, traversal);
assertEquals(traversal.asAdmin().getSteps().get(1), identityStep);
assertEquals(3, traversal.asAdmin().getSteps().size());
}
@Test
public void shouldChainTogetherStepsWithNextPreviousInALinkedListStructure() {
final Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
traversal.asAdmin().addStep(new IdentityStep(traversal));
traversal.asAdmin().addStep(new HasStep(traversal));
traversal.asAdmin().addStep(new LambdaFilterStep(traversal, traverser -> true));
validateToyTraversal(traversal);
}
@Test
public void shouldAddStepsCorrectly() {
Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
traversal.asAdmin().addStep(0, new LambdaFilterStep(traversal, traverser -> true));
traversal.asAdmin().addStep(0, new HasStep(traversal));
traversal.asAdmin().addStep(0, new IdentityStep(traversal));
validateToyTraversal(traversal);
traversal = new DefaultTraversal<>(EmptyGraph.instance());
traversal.asAdmin().addStep(0, new IdentityStep(traversal));
traversal.asAdmin().addStep(1, new HasStep(traversal));
traversal.asAdmin().addStep(2, new LambdaFilterStep(traversal, traverser -> true));
validateToyTraversal(traversal);
}
@Test
public void shouldRemoveStepsCorrectly() {
final Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
traversal.asAdmin().addStep(new IdentityStep(traversal));
traversal.asAdmin().addStep(new HasStep(traversal));
traversal.asAdmin().addStep(new LambdaFilterStep(traversal, traverser -> true));
traversal.asAdmin().addStep(new PropertiesStep(traversal, PropertyType.VALUE, "marko"));
traversal.asAdmin().removeStep(3);
validateToyTraversal(traversal);
traversal.asAdmin().addStep(0, new PropertiesStep(traversal, PropertyType.PROPERTY, "marko"));
traversal.asAdmin().removeStep(0);
validateToyTraversal(traversal);
traversal.asAdmin().removeStep(1);
traversal.asAdmin().addStep(1, new HasStep(traversal));
validateToyTraversal(traversal);
}
private static void validateToyTraversal(final Traversal traversal) {
assertEquals(traversal.asAdmin().getSteps().size(), 3);
assertEquals(IdentityStep.class, traversal.asAdmin().getSteps().get(0).getClass());
assertEquals(HasStep.class, traversal.asAdmin().getSteps().get(1).getClass());
assertEquals(LambdaFilterStep.class, traversal.asAdmin().getSteps().get(2).getClass());
// IDENTITY STEP
assertEquals(EmptyStep.class, ((Step) traversal.asAdmin().getSteps().get(0)).getPreviousStep().getClass());
assertEquals(HasStep.class, ((Step) traversal.asAdmin().getSteps().get(0)).getNextStep().getClass());
assertEquals(LambdaFilterStep.class, ((Step) traversal.asAdmin().getSteps().get(0)).getNextStep().getNextStep().getClass());
assertEquals(EmptyStep.class, ((Step) traversal.asAdmin().getSteps().get(0)).getNextStep().getNextStep().getNextStep().getClass());
// HAS STEP
assertEquals(IdentityStep.class, ((Step) traversal.asAdmin().getSteps().get(1)).getPreviousStep().getClass());
assertEquals(EmptyStep.class, ((Step) traversal.asAdmin().getSteps().get(1)).getPreviousStep().getPreviousStep().getClass());
assertEquals(LambdaFilterStep.class, ((Step) traversal.asAdmin().getSteps().get(1)).getNextStep().getClass());
assertEquals(EmptyStep.class, ((Step) traversal.asAdmin().getSteps().get(1)).getNextStep().getNextStep().getClass());
// FILTER STEP
assertEquals(HasStep.class, ((Step) traversal.asAdmin().getSteps().get(2)).getPreviousStep().getClass());
assertEquals(IdentityStep.class, ((Step) traversal.asAdmin().getSteps().get(2)).getPreviousStep().getPreviousStep().getClass());
assertEquals(EmptyStep.class, ((Step) traversal.asAdmin().getSteps().get(2)).getPreviousStep().getPreviousStep().getPreviousStep().getClass());
assertEquals(EmptyStep.class, ((Step) traversal.asAdmin().getSteps().get(2)).getNextStep().getClass());
assertEquals(3, traversal.asAdmin().getSteps().size());
}
@Test
public void shouldTruncateLongName() {
Step s = Mockito.mock(Step.class);
Mockito.when(s.toString()).thenReturn("0123456789");
assertEquals("0123...", TraversalHelper.getShortName(s, 7));
}
}