/**************************************************************************
OmegaT - Computer Assisted Translation (CAT) tool
with fuzzy matching, translation memory, keyword search,
glossaries, and translation leveraging into updated projects.
Copyright (C) 2015 Aaron Madlon-Kay
Home page: http://www.omegat.org/
Support center: http://groups.yahoo.com/group/OmegaT/
This file is part of OmegaT.
OmegaT is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OmegaT is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
**************************************************************************/
package org.omegat.gui.scripting;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.awt.GraphicsEnvironment;
import java.io.BufferedReader;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.script.Compilable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import org.apache.commons.io.FilenameUtils;
import org.junit.Assume;
import org.junit.Test;
import org.omegat.core.TestCore;
import org.omegat.util.Preferences;
import org.omegat.util.StaticUtils;
public class ScriptingTest extends TestCore {
/**
* Test for bug #775: Unresolvable scripting folder setting can cause an empty
* Scripting window
* <p>
* NPE while initializing quick script menu entries when the script folder path
* member is null (failed to be set because it was invalid).
*
* @see <a href="https://sourceforge.net/p/omegat/bugs/775/">Bug #775</a>
*/
@Test
public void testLoadScriptingWindow() throws Exception {
Assume.assumeFalse(GraphicsEnvironment.isHeadless());
// Set quick script
Preferences.setPreference(Preferences.SCRIPTS_QUICK_PREFIX + 1, "blah");
// Set bogus scripts folder (a file can't be a folder!)
File tmp = File.createTempFile("omegat", "tmp");
try {
Preferences.setPreference(Preferences.SCRIPTS_DIRECTORY, tmp.getAbsolutePath());
new ScriptingWindow();
} finally {
assertTrue(tmp.delete());
}
}
@Test
public void testCompileScripts() throws Exception {
File scriptDir = new File(StaticUtils.installDir(), ScriptingWindow.DEFAULT_SCRIPTS_DIR);
assertTrue(scriptDir.isDirectory());
for (File f : scriptDir.listFiles()) {
if (!f.isFile()) {
continue;
}
String ext = FilenameUtils.getExtension(f.getName());
ScriptEngine engine = ScriptRunner.MANAGER.getEngineByExtension(ext);
if (engine instanceof Compilable) {
Compilable cEngine = (Compilable) engine;
try (BufferedReader br = Files.newBufferedReader(f.toPath())) {
assertNotNull(cEngine.compile(br));
}
}
}
}
@Test
public void testScriptProperties() throws Exception {
File scriptDir = new File(StaticUtils.installDir(), ScriptingWindow.DEFAULT_SCRIPTS_DIR);
assertTrue(scriptDir.isDirectory());
File propsDir = new File(scriptDir, "properties");
assertTrue(propsDir.isDirectory());
List<String> scripts = Collections.emptyList();
try (Stream<Path> stream = Files.list(scriptDir.toPath())) {
scripts = stream.map(Path::toFile).filter(File::isFile).map(File::getName)
.map(FilenameUtils::removeExtension).filter(n -> !n.isEmpty()).collect(Collectors.toList());
}
assertFalse(scripts.isEmpty());
for (File f : propsDir.listFiles()) {
if (!f.isFile() || f.getName().equals(".DS_Store")) {
continue;
}
assertTrue("Script properties file appears to be orphaned: " + f,
scripts.stream().anyMatch(s -> f.getName().startsWith(s)));
}
}
/**
* Check that engines for OmegaT built-in scripting languages are available.
* Currently those are:
* <ul>
* <li>JavaScript
* <li>Groovy
* </ul>
* This is more a check on the test classpath than anything else
* ({@link #testCompileScripts()} won't indicate if Groovy goes missing, for
* instance), though presumably if an engine is available on the test
* runtime classpath then it will be available in the runtime classpath as
* well.
*/
@Test
public void testAvailableEngines() {
List<String> extensions = ScriptRunner.MANAGER.getEngineFactories().stream()
.map(ScriptEngineFactory::getExtensions).flatMap(List::stream).collect(Collectors.toList());
assertTrue(extensions.contains("js"));
assertTrue(extensions.contains("groovy"));
}
}