/* * 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.console.groovy.plugin; import org.apache.tinkerpop.gremlin.TestHelper; import org.apache.tinkerpop.gremlin.console.plugin.PluggedIn; import org.apache.tinkerpop.gremlin.jsr223.BindingsCustomizer; import org.apache.tinkerpop.gremlin.jsr223.Customizer; import org.apache.tinkerpop.gremlin.jsr223.DefaultBindingsCustomizer; import org.apache.tinkerpop.gremlin.jsr223.DefaultScriptCustomizer; import org.apache.tinkerpop.gremlin.jsr223.GremlinPlugin; import org.apache.tinkerpop.gremlin.jsr223.ImportGremlinPlugin; import org.apache.tinkerpop.gremlin.jsr223.ScriptCustomizer; import org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin; import org.junit.Test; import javax.script.Bindings; import javax.script.SimpleBindings; import java.io.File; import java.time.DayOfWeek; import java.time.temporal.TemporalAccessor; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.IsCollectionContaining.hasItems; import static org.junit.Assert.assertEquals; /** * @author Stephen Mallette (http://stephen.genoprime.com) */ public class GremlinPluginAdapterTest { @Test public void shouldAdaptForImportCustomizer() throws Exception { final ImportGremlinPlugin plugin = ImportGremlinPlugin.build() .classImports(java.awt.Color.class, java.sql.CallableStatement.class) .enumImports(DayOfWeek.SATURDAY, DayOfWeek.SUNDAY) .methodImports(DayOfWeek.class.getMethod("from", TemporalAccessor.class), DayOfWeek.class.getMethod("values")).create(); final PluggedIn.GremlinPluginAdapter adapter = new PluggedIn.GremlinPluginAdapter(plugin, null, null); assertEquals(plugin.getName(), adapter.getName()); final SpyPluginAcceptor spy = new SpyPluginAcceptor(); adapter.pluginTo(spy); final Set<String> imports = spy.getImports(); assertEquals(6, imports.size()); assertThat(imports, hasItems("import " + java.awt.Color.class.getCanonicalName())); assertThat(imports, hasItems("import " + java.sql.CallableStatement.class.getCanonicalName())); assertThat(imports, hasItems("import static " + DayOfWeek.class.getCanonicalName() + "." + DayOfWeek.SATURDAY.name())); assertThat(imports, hasItems("import static " + DayOfWeek.class.getCanonicalName() + "." + DayOfWeek.SUNDAY.name())); assertThat(imports, hasItems("import static " + DayOfWeek.class.getCanonicalName() + ".from")); assertThat(imports, hasItems("import static " + DayOfWeek.class.getCanonicalName() + ".values")); } @Test public void shouldAdaptForScriptCustomizer() throws Exception { final File scriptFile1 = TestHelper.generateTempFileFromResource(GremlinPluginAdapterTest.class, "script-customizer-1.groovy", ".groovy"); final File scriptFile2 = TestHelper.generateTempFileFromResource(GremlinPluginAdapterTest.class, "script-customizer-2.groovy", ".groovy"); final List<String> files = new ArrayList<>(); files.add(scriptFile1.getAbsolutePath()); files.add(scriptFile2.getAbsolutePath()); final ScriptFileGremlinPlugin plugin = ScriptFileGremlinPlugin.build().files(files).create(); final PluggedIn.GremlinPluginAdapter adapter = new PluggedIn.GremlinPluginAdapter(plugin, null, null); assertEquals(plugin.getName(), adapter.getName()); final List<String> evals = new ArrayList<>(); final SpyPluginAcceptor spy = new SpyPluginAcceptor(evals::add); adapter.pluginTo(spy); assertEquals("x = 1 + 1\n" + "y = 10 * x\n" + "z = 1 + x + y", evals.get(0)); assertEquals("l = g.V(z).out()\n" + " .group().by('name')", evals.get(1)); } @Test public void shouldAdaptForBindingsCustomizer() throws Exception { final Bindings bindings = new SimpleBindings(); bindings.put("x", 1); bindings.put("y", "yes"); bindings.put("z", true); final BindingsCustomizer bindingsCustomizer = new DefaultBindingsCustomizer(bindings); final GremlinPlugin plugin = new GremlinPlugin() { @Override public String getName() { return "anon-bindings"; } @Override public Optional<Customizer[]> getCustomizers(final String scriptEngineName) { return Optional.of(new Customizer[]{bindingsCustomizer}); } }; final PluggedIn.GremlinPluginAdapter adapter = new PluggedIn.GremlinPluginAdapter(plugin, null, null); assertEquals(plugin.getName(), adapter.getName()); final SpyPluginAcceptor spy = new SpyPluginAcceptor(); adapter.pluginTo(spy); final Map<String,Object> bindingsFromSpy = spy.getBindings(); assertEquals(1, bindingsFromSpy.get("x")); assertEquals("yes", bindingsFromSpy.get("y")); assertEquals(true, bindingsFromSpy.get("z")); } }