// Copyright 2012 Google Inc. All Rights Reserved. // // Licensed 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 com.google.collide.client.editor; import static com.google.collide.client.code.autocomplete.TestUtils.createDocumentParser; import com.google.collide.client.autoindenter.Autoindenter; import com.google.collide.client.documentparser.DocumentParser; import com.google.collide.client.editor.input.TestSignalEvent; import com.google.collide.client.testing.MockAppContext; import com.google.collide.client.testutil.SynchronousTestCase; import com.google.collide.client.testutil.TestSchedulerImpl; import com.google.collide.client.util.PathUtil; import com.google.collide.client.util.input.ModifierKeys; import com.google.collide.json.shared.JsonArray; import com.google.collide.shared.document.Document; import com.google.collide.shared.document.LineFinder; import com.google.collide.shared.document.Position; import com.google.collide.shared.util.JsonCollections; import com.google.gwt.core.client.Scheduler; import org.waveprotocol.wave.client.common.util.SignalEvent; import elemental.events.KeyboardEvent; /** * Tests for {@link TextActions} and their bindings in * {@link com.google.collide.client.editor.input.DefaultScheme}. */ public class TextActionsTest extends SynchronousTestCase { @Override public String getModuleName() { return "com.google.collide.client.TestCode"; } public void testSplitLine() { final TestSignalEvent ctrlEnter = new TestSignalEvent(KeyboardEvent.KeyCode.ENTER, SignalEvent.KeySignalType.INPUT, ModifierKeys.ACTION); String text = " color: black;"; String expected = " color: \n black;"; checkAction(ctrlEnter, text, expected, 0, 9, 0, 9, 0, 9); } public void testSplitLineWithSelection() { final TestSignalEvent ctrlEnter = new TestSignalEvent(KeyboardEvent.KeyCode.ENTER, SignalEvent.KeySignalType.INPUT, ModifierKeys.ACTION); String text = " color: black;"; String expected = " color\n black;"; checkAction(ctrlEnter, text, expected, 0, 7, 0, 9, 0, 7); } public void testSplitLineWithReverseSelection() { final TestSignalEvent ctrlEnter = new TestSignalEvent(KeyboardEvent.KeyCode.ENTER, SignalEvent.KeySignalType.INPUT, ModifierKeys.ACTION); String text = " color: black;"; String expected = " color\n black;"; checkAction(ctrlEnter, text, expected, 0, 9, 0, 7, 0, 7); } public void testStartNewLine() { final TestSignalEvent shiftEnter = new TestSignalEvent(KeyboardEvent.KeyCode.ENTER, SignalEvent.KeySignalType.INPUT, ModifierKeys.SHIFT); String text = " color: black;"; String expected = " color: black;\n "; checkAction(shiftEnter, text, expected, 0, 8, 0, 8, 1, 2); } public void testStartNewLineWithSelection() { final TestSignalEvent shiftEnter = new TestSignalEvent(KeyboardEvent.KeyCode.ENTER, SignalEvent.KeySignalType.INPUT, ModifierKeys.SHIFT); String text = " color: black;"; String expected = " color: black;\n "; checkAction(shiftEnter, text, expected, 0, 0, 0, 8, 1, 2); } private void checkAction(final SignalEvent trigger, String text, String expected, int line1, int column1, int line2, int column2, int expectedLine, int expectedColumn) { Document document = Document.createFromString(text); final Editor editor = Editor.create(new MockAppContext()); editor.setDocument(document); editor.getInput().getActionExecutor().addDelegate(TextActions.INSTANCE); PathUtil path = new PathUtil("test.css"); DocumentParser documentParser = createDocumentParser(path); Autoindenter autoindenter = Autoindenter.create(documentParser, editor); LineFinder lineFinder = editor.getDocument().getLineFinder(); editor.getSelection().setSelection( lineFinder.findLine(line1), column1, lineFinder.findLine(line2), column2); final JsonArray<Scheduler.ScheduledCommand> scheduled = JsonCollections.createArray(); TestSchedulerImpl.AngryScheduler scheduler = new TestSchedulerImpl.AngryScheduler() { @Override public void scheduleDeferred(ScheduledCommand scheduledCommand) { // Do nothing } @Override public void scheduleFinally(ScheduledCommand scheduledCommand) { scheduled.add(scheduledCommand); } }; Runnable triggerClicker = new Runnable() { @Override public void run() { editor.getInput().processSignalEvent(trigger); } }; try { TestSchedulerImpl.runWithSpecificScheduler(triggerClicker, scheduler); } finally { autoindenter.teardown(); } if (scheduled.size() != 1) { fail("exactly 1 scheduled command expected"); } scheduled.get(0).execute(); String result = editor.getDocument().asText(); assertEquals("textual result", expected, result); Position[] selectionRange = editor.getSelection().getSelectionRange(false); assertFalse("no selection", editor.getSelection().hasSelection()); assertEquals("cursor line", expectedLine, selectionRange[0].getLineNumber()); assertEquals("cursor column", expectedColumn, selectionRange[0].getColumn()); } }