| /******************************************************************************* |
| * Copyright (c) 2018 christian and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * Contributors: |
| * christian - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.ease.testhelper; |
| |
| import static org.junit.jupiter.api.Assertions.assertEquals; |
| import static org.junit.jupiter.api.Assertions.assertNotNull; |
| import static org.junit.jupiter.api.Assertions.assertNull; |
| import static org.junit.jupiter.api.Assertions.assertTrue; |
| import static org.mockito.ArgumentMatchers.any; |
| import static org.mockito.Mockito.mock; |
| import static org.mockito.Mockito.times; |
| import static org.mockito.Mockito.verify; |
| import static org.mockito.Mockito.when; |
| |
| import java.lang.reflect.Method; |
| import java.util.concurrent.ExecutionException; |
| |
| import org.eclipse.ease.ICodeFactory; |
| import org.eclipse.ease.IReplEngine; |
| import org.eclipse.ease.ScriptResult; |
| import org.eclipse.ease.modules.EnvironmentModule; |
| import org.eclipse.ease.modules.IEnvironment; |
| import org.eclipse.ease.modules.IModuleCallbackProvider; |
| import org.eclipse.ease.service.ScriptService; |
| import org.junit.jupiter.api.AfterEach; |
| import org.junit.jupiter.api.BeforeEach; |
| import org.junit.jupiter.api.Test; |
| |
| /** |
| * Tests basic environment loading and functionality. |
| */ |
| public abstract class AbstractEnvironmentTest { |
| private IReplEngine fEngine; |
| |
| @BeforeEach |
| public void setUp() throws Exception { |
| // we need to retrieve the service singleton as the workspace is not available in headless tests |
| fEngine = createScriptEngine(); |
| fEngine.setTerminateOnIdle(false); |
| } |
| |
| protected abstract IReplEngine createScriptEngine(); |
| |
| private String createComment(String text) { |
| final ICodeFactory codeFactory = ScriptService.getCodeFactory(fEngine); |
| return codeFactory.createCommentedString(text, false); |
| } |
| |
| @AfterEach |
| public void tearDown() { |
| fEngine.terminate(); |
| } |
| |
| @Test |
| public void bootstrappedEnvironment() throws ExecutionException { |
| fEngine.schedule(); |
| |
| // execute some code to synchronize startup sequence |
| fEngine.execute(createComment("sync execution")).get(); |
| |
| final Object environment = fEngine.getVariable(EnvironmentModule.getWrappedVariableName(new EnvironmentModule())); |
| |
| assertTrue(environment instanceof IEnvironment); |
| assertEquals(environment, ((IEnvironment) environment).getModule(IEnvironment.class)); |
| } |
| |
| @Test |
| public void reloadEnvironment() throws ExecutionException { |
| fEngine.schedule(); |
| |
| // execute some code to synchronize startup sequence |
| fEngine.execute(createComment("sync execution")).get(); |
| |
| final Object environment = fEngine.getVariable(EnvironmentModule.getWrappedVariableName(new EnvironmentModule())); |
| |
| final ScriptResult result = fEngine.execute("loadModule(\"" + EnvironmentModule.MODULE_NAME + "\")"); |
| |
| assertEquals(environment, result.get()); |
| } |
| |
| @Test |
| public void preMethodCallback() throws ExecutionException { |
| fEngine.schedule(); |
| |
| // execute some code to synchronize startup sequence |
| fEngine.execute(createComment("sync execution")).get(); |
| |
| final EnvironmentModule environment = (EnvironmentModule) fEngine.getVariable(EnvironmentModule.getWrappedVariableName(new EnvironmentModule())); |
| |
| final IModuleCallbackProvider callbackProvider = mock(IModuleCallbackProvider.class); |
| |
| when(callbackProvider.hasPreExecutionCallback(any(Method.class))).thenReturn(true); |
| when(callbackProvider.hasPostExecutionCallback(any(Method.class))).thenReturn(false); |
| environment.addModuleCallback(callbackProvider); |
| |
| fEngine.execute("getModule('" + EnvironmentModule.MODULE_NAME + "');").get(); |
| |
| verify(callbackProvider, times(1)).preExecutionCallback(any(Method.class), any()); |
| verify(callbackProvider, times(0)).postExecutionCallback(any(Method.class), any()); |
| } |
| |
| @Test |
| public void postMethodCallback() throws ExecutionException { |
| fEngine.schedule(); |
| |
| // execute some code to synchronize startup sequence |
| fEngine.execute(createComment("sync execution")).get(); |
| |
| final EnvironmentModule environment = (EnvironmentModule) fEngine.getVariable(EnvironmentModule.getWrappedVariableName(new EnvironmentModule())); |
| |
| final IModuleCallbackProvider callbackProvider = mock(IModuleCallbackProvider.class); |
| |
| when(callbackProvider.hasPreExecutionCallback(any(Method.class))).thenReturn(false); |
| when(callbackProvider.hasPostExecutionCallback(any(Method.class))).thenReturn(true); |
| environment.addModuleCallback(callbackProvider); |
| |
| fEngine.execute("getModule('" + EnvironmentModule.MODULE_NAME + "');").get(); |
| |
| verify(callbackProvider, times(0)).preExecutionCallback(any(Method.class), any()); |
| verify(callbackProvider, times(1)).postExecutionCallback(any(Method.class), any()); |
| } |
| |
| @Test |
| public void reloadFunctionDefinitions() throws ExecutionException { |
| fEngine.schedule(); |
| |
| // execute some code to synchronize startup sequence |
| ScriptResult result = fEngine.execute("getModule('" + EnvironmentModule.MODULE_NAME + "');"); |
| assertNotNull(result.get()); |
| |
| fEngine.execute("function getModule(name) { return null; }"); |
| result = fEngine.execute("getModule('" + EnvironmentModule.MODULE_NAME + "');"); |
| assertNull(result.get()); |
| |
| fEngine.execute("loadModule('" + EnvironmentModule.MODULE_NAME + "');"); |
| result = fEngine.execute("getModule('" + EnvironmentModule.MODULE_NAME + "');"); |
| assertNotNull(result.get()); |
| } |
| } |