@Test public void getAutoCompletionHintsForScriptServiceProperty() throws Exception { MockitoComponentMockingRule cm = mocker.getInstance(ComponentManager.class); AutoCompletionMethodFinder scriptServiceFinder = cm.registerMockComponent(AutoCompletionMethodFinder.class, "services"); ScriptServiceManager scriptServiceManager = mock(ScriptServiceManager.class); setupMocks("$services.t", createTestVelocityContext("services", scriptServiceManager)); when(scriptServiceFinder.findMethods(scriptServiceManager.getClass(), "t")) .thenReturn(new Hints().withHints(new HintData("test", "test"))); String velocity = "{{velocity}}$services.t"; Hints hints = mocker .getComponentUnderTest() .getAutoCompletionHints(velocity.length(), "xwiki/2.0", velocity); assertEquals(1, hints.getHints().size()); assertTrue(hints.getHints().contains(new HintData("test", "test"))); }
@Test public void getAutoCompletionHintsForScriptServicePropertyWhenNestedCalls() throws Exception { MockitoComponentMockingRule cm = mocker.getInstance(ComponentManager.class); AutoCompletionMethodFinder scriptServiceFinder = cm.registerMockComponent(AutoCompletionMethodFinder.class, "services"); ScriptServiceManager scriptServiceManager = mock(ScriptServiceManager.class); setupMocks("$services.query.m", createTestVelocityContext("services", scriptServiceManager)); when(scriptServiceFinder.findMethodReturnTypes(scriptServiceManager.getClass(), "query")) .thenReturn(Arrays.asList((Class) TestClass.class)); AutoCompletionMethodFinder defaultMethodFinder = mocker.getInstance(AutoCompletionMethodFinder.class); when(defaultMethodFinder.findMethods(TestClass.class, "m")) .thenReturn(new Hints().withHints(new HintData("method", "method"))); String velocity = "{{velocity}}$services.query.m"; Hints hints = this.mocker .getComponentUnderTest() .getAutoCompletionHints(velocity.length(), "xwiki/2.0", velocity); assertEquals(1, hints.getHints().size()); assertTrue(hints.getHints().contains(new HintData("method", "method"))); }
/** * Get a sub script service related to wiki. (Note that we're voluntarily using an API name of * "get" to make it extra easy to access Script Services from Velocity (since in Velocity writing * <code>$services.wiki.name</code> is equivalent to writing <code>$services.wiki.get("name") * </code>). It also makes it a short and easy API name for other scripting languages. * * @param serviceName id of the script service * @return the service asked or null if none could be found */ public ScriptService get(String serviceName) { return scriptServiceManager.get(ROLEHINT + '.' + serviceName); }