blob: ae29e7e42694bdf44e546c4879fb42598d02694f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.options.keymap;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.swing.Action;
import javax.swing.text.TextAction;
import org.netbeans.core.options.keymap.api.ShortcutAction;
import org.netbeans.junit.NbTestCase;
import org.netbeans.junit.RandomlyFails;
/**
* @author Jan Jancura
*/
public class KeymapViewModelTest extends NbTestCase {
public KeymapViewModelTest (String testName) {
super (testName);
}
public void testCancelCurrentProfile () {
MutableShortcutsModel model = new KeymapViewModel().getMutableModel();
String currentProfile = model.getCurrentProfile ();
model.setCurrentProfile ("mine");
assertEquals ("mine", model.getCurrentProfile ());
model.cancel ();
assertEquals (currentProfile, model.getCurrentProfile ());
assertEquals (currentProfile, new KeymapViewModel ().getMutableModel().getCurrentProfile ());
}
@RandomlyFails
public void testOkCurrentProfile () {
MutableShortcutsModel model = new KeymapViewModel().getMutableModel();
String currentProfile = model.getCurrentProfile ();
model.setCurrentProfile ("mine");
assertEquals ("mine", model.getCurrentProfile ());
assertEquals (currentProfile, new KeymapViewModel ().getMutableModel().getCurrentProfile ());
model.postApply().waitFinished();
assertEquals ("mine", model.getCurrentProfile ());
}
public void testChangeShortcuts () {
MutableShortcutsModel model = new KeymapViewModel().getMutableModel();
forAllActions (model, new R () {
public void run (MutableShortcutsModel model, ShortcutAction action) {
model.setShortcuts(action, Collections.<String>emptySet());
}
});
forAllActions (model, new R () {
public void run (MutableShortcutsModel model, ShortcutAction action) {
assertEquals (0, model.getShortcuts (action).length);
}
});
final Set<String> set = Collections.singleton ("Alt+K");
forAllActions (model, new R () {
public void run (MutableShortcutsModel model, ShortcutAction action) {
model.setShortcuts (action, set);
}
});
forAllActions (model, new R () {
public void run (MutableShortcutsModel model, ShortcutAction action) {
String[] s = model.getShortcuts (action);
assertEquals (1, s.length);
assertEquals ("Alt+K", s [0]);
}
});
}
/* XXX failing: #137748
public void testChangeShortcutsOk () {
KeymapViewModel model = new KeymapViewModel ();
Map<Set<String>,ShortcutAction> shortcuts = setRandomShortcuts (model);
System.out.println ("apply changes");
model.apply ();
System.gc ();
model.apply ();
System.gc ();
checkShortcuts (model, shortcuts, true);
}
*/
public void testChangeShortcutsCancel () {
MutableShortcutsModel model = new KeymapViewModel().getMutableModel();
Map<Set<String>,ShortcutAction> shortcuts = getShortcuts (model);
Map<Set<String>,ShortcutAction> shortcuts2 = setRandomShortcuts (model);
checkShortcuts (model, shortcuts2, false);
System.out.println ("cancel changes");
model.cancel ();
checkShortcuts (model, shortcuts, false);
checkShortcuts (new KeymapViewModel ().getMutableModel(), shortcuts, false);
}
public void testFindConflictingMultiKeyBinding0() {
MutableShortcutsModel model = new KeymapViewModel().getMutableModel();
ShortcutAction sa0 = model.findActionForShortcut("F5");
ShortcutAction sa1 = model.findActionForShortcut("F6");
model.addShortcut(sa1, "Ctrl+J A");
model.addShortcut(sa0, "Ctrl+J B");
Set<ShortcutAction> orig = new HashSet<ShortcutAction>(2);
orig.add(sa0);
orig.add(sa1);
Set<ShortcutAction> found = model.findActionForShortcutPrefix("Ctrl+J");
assertTrue(found.containsAll(orig)); //both sa0, sa1 conflict with 'Ctrl+J'
}
public void testFindConflictingMultiKeyBinding1() {
MutableShortcutsModel model = new KeymapViewModel().getMutableModel();
ShortcutAction sa0 = model.findActionForShortcut("F5");
model.addShortcut(sa0, "Ctrl+J");
Set<ShortcutAction> found = model.findActionForShortcutPrefix("Ctrl+J B");
assertTrue(found.contains(sa0)); //sa0 conflicts with 'Ctrl+J B'
}
public void testFindConflictingMultiKeyBinding2() {
MutableShortcutsModel model = new KeymapViewModel().getMutableModel();
ShortcutAction sa0 = model.findActionForShortcut("F5");
ShortcutAction sa1 = model.findActionForShortcut("F6");
model.addShortcut(sa1, "Ctrl+J A");
model.addShortcut(sa0, "Ctrl+J B");
Set<ShortcutAction> orig = new HashSet<ShortcutAction>(2);
orig.add(sa0);
orig.add(sa1);
Set<ShortcutAction> found = model.findActionForShortcutPrefix("Ctrl+J C");
assertFalse(found.contains(sa0)); //these three shouldn't conflict
assertFalse(found.contains(sa1));
}
public void testFindConflictingMultiKeyBinding3() {
MutableShortcutsModel model = new KeymapViewModel().getMutableModel();
ShortcutAction sa0 = model.findActionForShortcut("F5");
model.addShortcut(sa0, "Shift+Meta+F2");
Set<ShortcutAction> found = model.findActionForShortcutPrefix("Shift+Meta+F");
assertFalse(found.contains(sa0)); //these two shouldn't conflict
}
/**
* Sets random shortcuts and returns them in
* Map (Set (String (shortcut)) > String (action name)).
*/
private Map<Set<String>,ShortcutAction> setRandomShortcuts(final MutableShortcutsModel model) {
final int[] ii = {1};
final Map<Set<String>,ShortcutAction> result = new HashMap<Set<String>,ShortcutAction>();
System.out.println("set random shortcuts");
forAllActions (model, new R () {
public void run (MutableShortcutsModel model, ShortcutAction action) {
String shortcut = Integer.toString (ii [0], 36).toUpperCase ();
StringBuffer sb = new StringBuffer ();
int i, k = shortcut.length ();
for (i = 0; i < k; i++)
sb.append (shortcut.charAt (i)).append (' ');
shortcut = sb.toString ().trim ();
Set<String> s = Collections.singleton (shortcut);
model.setShortcuts (action, s);
result.put (s, action);
//System.out.println (s + " : " + action);
ii [0] ++;
}
});
return result;
}
/**
* Returns Map (Set (String (shortcut)) > String (action name)) containing
* all current shortcuts.
*/
private Map<Set<String>,ShortcutAction> getShortcuts(final MutableShortcutsModel model) {
final Map<Set<String>,ShortcutAction> result = new HashMap<Set<String>,ShortcutAction>();
System.out.println("get shortcuts");
forAllActions (model, new R () {
public void run (MutableShortcutsModel model, ShortcutAction action) {
String[] sh = model.getShortcuts (action);
if (sh.length == 0) return;
Set<String> shortcuts = new HashSet<String>(Arrays.asList(sh));
//System.out.println("sh: " + shortcuts + " : " + action);
assertFalse ("Same shortcuts assigned to two actions ", result.containsKey (shortcuts));
result.put (shortcuts, action);
}
});
return result;
}
private static String getName (Object action) {
if (action instanceof TextAction)
return (String) ((TextAction) action).getValue (Action.SHORT_DESCRIPTION);
if (action instanceof Action)
return (String) ((Action) action).getValue (Action.NAME);
return action.toString ();
}
private void checkShortcuts(final MutableShortcutsModel model, final Map<Set<String>,ShortcutAction> shortcuts, final boolean print) {
System.out.println("check shortcuts");
final Map<Set<String>,ShortcutAction> localCopy = new HashMap<Set<String>,ShortcutAction>(shortcuts);
forAllActions (model, new R () {
public void run (MutableShortcutsModel model, ShortcutAction action) {
String[] sh = model.getShortcuts (action);
if (sh.length == 0) return;
Set<String> s = new HashSet<String>(Arrays.asList(sh));
if (print)
System.out.println (s + " : " + action + " : " + localCopy.get (s));
assertEquals ("Shortcut changed: " + s + " : " + action, localCopy.get (s), action);
localCopy.remove (s);
}
});
assertTrue ("Some shortcuts found: " + localCopy, localCopy.isEmpty ());
}
private void forAllActions (MutableShortcutsModel model, R r) {
forAllActions (model, r, "");
}
private void forAllActions (MutableShortcutsModel model, R r, String folder) {
Iterator it = model.getItems (folder).iterator ();
while (it.hasNext ()) {
Object o = it.next ();
r.run (model, (ShortcutAction) o);
}
}
interface R {
void run (MutableShortcutsModel model, ShortcutAction action);
}
}