/**************************************************************************
OmegaT - Computer Assisted Translation (CAT) tool
with fuzzy matching, translation memory, keyword search,
glossaries, and translation leveraging into updated projects.
Copyright (C) 2015-2016 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.util;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.File;
import java.io.PrintWriter;
import java.nio.file.Files;
import org.apache.commons.io.FileUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.omegat.filters.TestFilterBase;
import org.omegat.util.Preferences.IPreferences;
/**
* @author Aaron Madlon-Kay
*/
public class PreferencesTest {
private File tmpDir;
@Before
public final void setUp() throws Exception {
tmpDir = Files.createTempDirectory("oemgat").toFile();
assertTrue(tmpDir.isDirectory());
}
@After
public final void tearDown() throws Exception {
FileUtils.deleteDirectory(tmpDir);
}
/**
* Test that if an error is encountered when loading the
* preferences file, the original file is backed up.
*/
@Test
public void testPreferencesBackup() throws Exception {
File prefsFile = new File(tmpDir, Preferences.FILE_PREFERENCES);
// Write anything that is malformed XML, to force a parsing error.
PrintWriter out = new PrintWriter(prefsFile, "UTF-8");
out.println("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
out.println("<omegat>");
out.println("<preference version=\"1.0\">");
out.close();
assertFalse(out.checkError());
// Load bad prefs file.
new PreferencesImpl(new PreferencesXML(prefsFile, null));
// The actual backup file will have a timestamp in the filename,
// so we have to loop through looking for it.
File backup = null;
for (File f : tmpDir.listFiles()) {
String name = f.getName();
if (name.startsWith(prefsFile.getName()) && name.endsWith(".bak")) {
backup = f;
break;
}
}
assertNotNull(backup);
assertTrue(backup.isFile());
TestFilterBase.compareBinary(prefsFile, backup);
}
enum TestEnum {
BAR, BAZ, BAZINGA;
public String toString() {
if (this == BAZINGA) {
return "!";
} else {
return super.toString();
}
};
}
@Test
public void testPreferencesLoadStore() throws Exception {
File prefsFile = new File(tmpDir, Preferences.FILE_PREFERENCES);
IPreferences prefs = new PreferencesImpl(new PreferencesXML(null, prefsFile));
// Set values normally
assertEquals(null, prefs.setPreference("MyString", "foo"));
assertEquals(null, prefs.setPreference("MyBoolean", true));
assertEquals(null, prefs.setPreference("MyInt", 5));
assertEquals(null, prefs.setPreference("MyEnum", TestEnum.BAR));
assertEquals(null, prefs.setPreference("MyEmptyString", ""));
// Check values normally
assertEquals("foo", prefs.getPreference("MyString"));
assertEquals(true, prefs.isPreference("MyBoolean"));
assertEquals(TestEnum.BAR, TestEnum.valueOf(prefs.getPreference("MyEnum")));
assertEquals(5, Integer.parseInt(prefs.getPreference("MyInt")));
// Check empty string behavior
assertEquals("", prefs.getPreference("MyEmptyString"));
assertTrue(prefs.existsPreference("MyEmptyString"));
assertEquals("", prefs.getPreference("MyNonexistentString"));
assertFalse(prefs.existsPreference("MyNonexistentString"));
// Check that defaults are not used for already-set values
assertEquals("foo", prefs.getPreferenceDefault("MyString", "bar"));
assertEquals(true, prefs.isPreferenceDefault("MyBoolean", false));
assertEquals(5, prefs.getPreferenceDefault("MyInt", 0));
assertEquals(TestEnum.BAR, prefs.getPreferenceEnumDefault("MyEnum", TestEnum.BAZ));
// Persist prefs
prefs.save();
// Load prefs from persisted version
prefs = new PreferencesImpl(new PreferencesXML(prefsFile, null));
// Check values
assertEquals("foo", prefs.getPreference("MyString"));
assertEquals(true, prefs.isPreference("MyBoolean"));
assertEquals(5, Integer.parseInt(prefs.getPreference("MyInt")));
assertEquals(TestEnum.BAR, TestEnum.valueOf(prefs.getPreference("MyEnum")));
assertEquals("", prefs.getPreference("MyEmptyString"));
assertTrue(prefs.existsPreference("MyEmptyString"));
assertEquals("", prefs.getPreference("MyNonexistentString"));
assertFalse(prefs.existsPreference("MyNonexistentString"));
assertEquals("foo", prefs.getPreferenceDefault("MyString", "bar"));
assertEquals(true, prefs.isPreferenceDefault("MyBoolean", false));
assertEquals(5, prefs.getPreferenceDefault("MyInt", 0));
assertEquals(TestEnum.BAR, prefs.getPreferenceEnumDefault("MyEnum", TestEnum.BAZ));
// Check setting values via *Default methods
assertEquals("bar", prefs.getPreferenceDefault("MyStringDefault", "bar"));
assertEquals("bar", prefs.getPreference("MyStringDefault"));
assertEquals(false, prefs.isPreferenceDefault("MyBoolDefault", false));
assertEquals(false, prefs.isPreference("MyBoolDefault"));
assertEquals(77, prefs.getPreferenceDefault("MyIntDefault", 77));
assertEquals(77, Integer.parseInt(prefs.getPreference("MyIntDefault")));
assertEquals(TestEnum.BAZ, prefs.getPreferenceEnumDefault("MyEnumDefault", TestEnum.BAZ));
assertEquals(TestEnum.BAZ, TestEnum.valueOf(prefs.getPreference("MyEnumDefault")));
// Check writing new value
assertEquals("bar", prefs.setPreference("MyStringDefault", "baz"));
// Check bad enum
try {
prefs.setPreference("Bad!", TestEnum.BAZINGA);
fail();
} catch (IllegalArgumentException ex) {
// Can't store enum where toString() gives a different result than
// name()
}
// Check null behvaior
assertEquals(null, prefs.setPreference(null, null));
assertEquals(null, prefs.setPreference("", null));
assertEquals(null, prefs.setPreference("blah", null));
assertEquals("", prefs.getPreference(null));
assertEquals("", prefs.getPreference(""));
}
}