/** * Copyright (c) 2015 by Brainwy Software Ltda. All Rights Reserved. * Licensed under1 the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package org.python.pydev.shared_core.preferences; import java.io.File; import java.util.HashMap; import java.util.Map; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jface.preference.IPreferenceStore; import org.python.pydev.shared_core.io.FileUtils; import org.python.pydev.shared_core.resource_stubs.ProjectStub; import junit.framework.TestCase; public class ScopedPreferencesTest extends TestCase { private File baseDir; @Override protected void setUp() throws Exception { FileUtils.IN_TESTS = true; baseDir = new File(FileUtils.getFileAbsolutePath(new File("ScopedPreferencesTest.temporary_dir"))); try { FileUtils.deleteDirectoryTree(baseDir); } catch (Exception e) { //ignore } if (baseDir.exists()) { throw new AssertionError("Not expecting: " + baseDir + " to exist."); } baseDir.mkdirs(); ScopedPreferences.USER_HOME_IN_TESTS = baseDir.getAbsolutePath(); ScopedPreferences.WORKSPACE_DIR_IN_TESTS = new File(baseDir, "workspace").getAbsolutePath(); } @Override protected void tearDown() throws Exception { ScopedPreferences.USER_HOME_IN_TESTS = null; ScopedPreferences.WORKSPACE_DIR_IN_TESTS = null; try { FileUtils.deleteDirectoryTree(baseDir); } catch (Exception e) { //ignore } } public void testUserSettingsScopedPreferences() throws Exception { IScopedPreferences iScopedPreferences = ScopedPreferences.get("my.test"); File eclipsePrefs = new File(baseDir, ".eclipse"); assertTrue(eclipsePrefs.exists()); File userSettingsYamlFile = new File(eclipsePrefs, "my.test.yaml"); assertTrue(!userSettingsYamlFile.exists()); Map<String, Object> saveData = new HashMap<String, Object>(); saveData.put("foo", 1); iScopedPreferences.saveToUserSettings(saveData); assertTrue(userSettingsYamlFile.exists()); IAdaptable adaptable = new IAdaptable() { @Override public <T> T getAdapter(Class<T> adapter) { return null; } }; IPreferenceStore pluginPreferenceStore = new NullPrefsStore(); assertEquals(1, iScopedPreferences.getInt(pluginPreferenceStore, "foo", adaptable)); assertEquals("foo: 1\n", FileUtils.getFileContents(userSettingsYamlFile)); saveData = new HashMap<String, Object>(); saveData.put("bar", 2); iScopedPreferences.saveToUserSettings(saveData); assertEquals("bar: 2\nfoo: 1\n", FileUtils.getFileContents(userSettingsYamlFile)); assertEquals(2, iScopedPreferences.getInt(pluginPreferenceStore, "bar", adaptable)); waitABit(); FileUtils.writeStrToFile("bar: 1\nfoo: 1\n", userSettingsYamlFile); waitABit(); assertEquals(1, iScopedPreferences.getInt(pluginPreferenceStore, "bar", adaptable)); } private void waitABit() { synchronized (this) { try { this.wait(20); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void testProjectSettingsScopedPreferences() throws Exception { IScopedPreferences iScopedPreferences = ScopedPreferences.get("my.test"); File eclipsePrefs = new File(baseDir, ".eclipse"); File projectDir = new File(baseDir, "project"); File projectDirSettings = new File(projectDir, ".settings"); File projectDirYAMLFile = new File(projectDirSettings, "my.test.yaml"); eclipsePrefs.mkdirs(); projectDir.mkdirs(); projectDirSettings.mkdirs(); FileUtils.writeStrToFile("", projectDirYAMLFile); assertTrue(eclipsePrefs.exists()); File userSettingsYamlFile = new File(eclipsePrefs, "my.test.yaml"); assertTrue(!userSettingsYamlFile.exists()); final IProject project = new ProjectStub(projectDir, null); Map<String, Object> saveData = new HashMap<String, Object>(); saveData.put("foo", 1); iScopedPreferences.saveToProjectSettings(saveData, project); assertTrue(!userSettingsYamlFile.exists()); assertEquals("foo: 1\n", FileUtils.getFileContents(projectDirYAMLFile)); IAdaptable adaptable = new IAdaptable() { @Override public <T> T getAdapter(Class<T> adapter) { if (IProject.class == adapter) { return (T) project; } return null; } }; IPreferenceStore pluginPreferenceStore = new NullPrefsStore(); assertEquals(1, iScopedPreferences.getInt(pluginPreferenceStore, "foo", adaptable)); saveData = new HashMap<String, Object>(); saveData.put("bar", 2); waitABit(); iScopedPreferences.saveToProjectSettings(saveData, project); waitABit(); assertEquals("bar: 2\nfoo: 1\n", FileUtils.getFileContents(projectDirYAMLFile)); assertEquals(2, iScopedPreferences.getInt(pluginPreferenceStore, "bar", adaptable)); FileUtils.writeStrToFile("bar: 1\nfoo: 1\n", projectDirYAMLFile); assertEquals(1, iScopedPreferences.getInt(pluginPreferenceStore, "bar", adaptable)); waitABit(); FileUtils.writeStrToFile("foo: 1\n", projectDirYAMLFile); waitABit(); assertEquals(0, iScopedPreferences.getInt(pluginPreferenceStore, "bar", adaptable)); // default in NullPrefsStore pluginPreferenceStore.setValue("bar", 2); assertEquals(2, iScopedPreferences.getInt(pluginPreferenceStore, "bar", adaptable)); // default in NullPrefsStore } }