1 19 20 package org.netbeans.modules.xml.schema.core.undo; 21 22 import java.io.IOException ; 23 import javax.swing.text.AbstractDocument ; 24 import javax.swing.text.BadLocationException ; 25 import junit.framework.TestCase; 26 import org.netbeans.api.project.Project; 27 import org.netbeans.editor.BaseDocument; 28 import org.netbeans.modules.xml.retriever.catalog.Utilities; 29 import org.netbeans.modules.xml.schema.core.SchemaDataObject; 30 import org.netbeans.modules.xml.schema.core.SchemaEditorSupport; 31 import org.netbeans.modules.xml.schema.core.Util; 32 import org.netbeans.modules.xml.schema.model.GlobalElement; 33 import org.netbeans.modules.xml.schema.model.Schema; 34 import org.netbeans.modules.xml.schema.model.SchemaModel; 35 import org.netbeans.modules.xml.schema.model.SchemaModelFactory; 36 import org.netbeans.modules.xml.xam.ModelSource; 37 import org.netbeans.modules.xml.xam.ui.undo.QuietUndoManager; 38 import org.openide.cookies.SaveCookie; 39 import org.openide.filesystems.FileObject; 40 import org.openide.loaders.DataObject; 41 42 49 public class QuietUndoManagerTest extends TestCase { 50 public static final String XSD_PO = "PurchaseOrder.xsd"; 51 private Project project; 52 private SchemaModel model; 53 private FileObject purchaseOrderFO; 54 private AbstractDocument document; 55 private QuietUndoManager manager; 56 57 public QuietUndoManagerTest(String testName) { 58 super(testName); 59 } 60 61 @Override 62 protected void setUp() throws Exception { 63 project = Util.createJavaTestProject(); 64 purchaseOrderFO = Util.populateProject( 65 project, "resources/" + XSD_PO, "src/com/acme/schemas"); 66 ModelSource ms = Utilities.getModelSource(purchaseOrderFO, true); 67 model = SchemaModelFactory.getDefault().getModel(ms); 68 } 69 70 @Override 71 protected void tearDown() throws Exception { 72 deleteModelFile(purchaseOrderFO); 73 } 74 75 private static void deleteModelFile(FileObject fo) throws Exception { 76 if (fo == null) { 77 return; 78 } 79 SchemaDataObject sdo = (SchemaDataObject) DataObject.find(fo); 80 if (sdo != null) { 81 SaveCookie save = (SaveCookie) sdo.getCookie(SaveCookie.class); 82 if (save != null) { 83 save.save(); 84 } 85 } 86 fo.delete(); 87 } 88 89 92 private void endTestCase() { 93 manager.endCompound(); 94 document.removeUndoableEditListener(manager); 95 if (model != null) { 96 model.removeUndoableEditListener(manager); 97 } 98 manager.discardAllEdits(); 99 } 100 101 104 private void viewModel() { 105 manager.endCompound(); 106 document.removeUndoableEditListener(manager); 107 if (model != null) { 108 try { 109 model.sync(); 111 } catch (IOException ioe) { 112 fail(ioe.toString()); 113 } 114 model.removeUndoableEditListener(manager); 116 model.addUndoableEditListener(manager); 117 } 118 } 119 120 123 private void viewSource() { 124 if (model != null) { 125 model.removeUndoableEditListener(manager); 126 } 127 document.removeUndoableEditListener(manager); 129 document.addUndoableEditListener(manager); 130 manager.beginCompound(); 131 } 132 133 136 public void testIssue83963() { 137 try { 138 SchemaDataObject sdo = (SchemaDataObject) DataObject.find( 139 purchaseOrderFO); 140 SchemaEditorSupport ses = sdo.getSchemaEditorSupport(); 141 model = ses.getModel(); 142 manager = ses.getUndoManager(); 143 } catch (IOException ioe) { 144 fail(ioe.toString()); 145 } 146 147 assertNotNull("failed to acquire undo manager", manager); 148 assertNotNull("failed to load SchemaModel", model); 149 document = (AbstractDocument ) model.getModelSource().getLookup(). 150 lookup(AbstractDocument .class); 151 assertNotNull("ModelSource did not contain AbstractDocument", document); 152 assertTrue(document instanceof BaseDocument); 154 155 document.removeUndoableEditListener(manager); 158 manager.setDocument(document); 159 160 String original = null; 161 try { 162 original = document.getText(0, document.getLength()); 163 } catch (BadLocationException ble) { 164 fail(ble.toString()); 165 } 166 viewModel(); 167 assertFalse(manager.canUndo()); 168 assertFalse(manager.canRedo()); 169 model.startTransaction(); 170 GlobalElement elem = model.getFactory().createGlobalElement(); 171 elem.setName("element83963"); 172 model.getSchema().addElement(elem); 173 model.endTransaction(); 174 Schema schema = model.getSchema(); 175 boolean found = false; 176 for (GlobalElement ge : schema.getElements()) { 177 if (ge.getName().equals("element83963")) { 178 found = true; 179 break; 180 } 181 } 182 assertTrue("failed to add global element", found); 183 assertTrue(manager.canUndo()); 184 assertFalse(manager.canRedo()); 185 viewSource(); 186 assertTrue(manager.canUndo()); 187 assertFalse(manager.canRedo()); 188 try { 189 int length = document.getLength(); 190 String text = document.getText(0, length); 191 assertTrue(text.contains("element83963")); 192 int mark = text.lastIndexOf("element83963"); 193 assertTrue(mark > 0 && mark < length); 194 mark += "element83963\"/>".length(); 195 document.insertString(mark, "\n<!-- -->\n", null); 201 assertEquals(length + 10, document.getLength()); 202 } catch (BadLocationException ble) { 203 fail(ble.toString()); 204 } 205 assertTrue(manager.canUndo()); 206 assertFalse(manager.canRedo()); 207 manager.undo(); 208 assertTrue(manager.canUndo()); 209 assertTrue(manager.canRedo()); 210 manager.undo(); 211 assertFalse(manager.canUndo()); 212 assertTrue(manager.canRedo()); 213 String actual = null; 214 try { 215 actual = document.getText(0, document.getLength()); 216 } catch (BadLocationException ble) { 217 fail(ble.toString()); 218 } 219 assertTrue(actual.equals(original)); 220 manager.redo(); 221 assertTrue(manager.canUndo()); 222 assertTrue(manager.canRedo()); 223 assertTrue(manager.canUndo()); 226 String expected = 230 " <!-- etc. -->\n" + 231 " <element name=\"element83963\"/>\n" + 232 "</schema>"; 236 try { 237 actual = document.getText(0, document.getLength()); 238 assertTrue(actual.endsWith(expected)); 239 } catch (BadLocationException ble) { 240 fail(ble.toString()); 241 } 242 endTestCase(); 243 } 244 } 245 | Popular Tags |