| //////////////////////////////////////////////////////////////////////////////// |
| // |
| // 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 UnitTest.Tests |
| { |
| import UnitTest.ExtendedClasses.VellumTestCase; |
| import UnitTest.Fixtures.TestConfig; |
| |
| import flash.text.engine.FontWeight; |
| |
| import flashx.textLayout.conversion.TextConverter; |
| import flashx.textLayout.edit.EditManager; |
| import flashx.textLayout.elements.DivElement; |
| import flashx.textLayout.elements.FlowGroupElement; |
| import flashx.textLayout.elements.LinkElement; |
| import flashx.textLayout.elements.ListElement; |
| import flashx.textLayout.elements.ParagraphElement; |
| import flashx.textLayout.elements.SpanElement; |
| import flashx.textLayout.elements.TextFlow; |
| import flashx.textLayout.formats.TextAlign; |
| import flashx.textLayout.formats.TextLayoutFormat; |
| import flashx.textLayout.operations.ApplyElementIDOperation; |
| import flashx.textLayout.operations.ApplyElementStyleNameOperation; |
| import flashx.textLayout.operations.ApplyElementTypeNameOperation; |
| import flashx.textLayout.operations.ApplyElementUserStyleOperation; |
| import flashx.textLayout.operations.ApplyFormatToElementOperation; |
| |
| import org.flexunit.asserts.assertTrue; |
| |
| public class ElementOperationTest extends VellumTestCase |
| { |
| private static const listItemMarkup:String = "<TextFlow xmlns='http://ns.adobe.com/textLayout/2008'><list listStylePosition='inside'><li><p textAlign='left'><span fontWeight='bold'>item</span></p></li></list></TextFlow>"; |
| private static const divTestMarkup:String = "<TextFlow whiteSpaceCollapse='preserve' xmlns='http://ns.adobe.com/textLayout/2008'><div><p><span>asd</span></p></div><p><span>asd</span></p></TextFlow>"; |
| |
| public function ElementOperationTest() |
| { |
| super("", "ElementOperationTests", TestConfig.getInstance()); |
| |
| metaData = {}; |
| // Note: These must correspond to a Watson product area (case-sensitive) |
| metaData.productArea = "Editing"; |
| } |
| |
| [Before] |
| override public function setUpTest():void |
| { |
| super.setUpTest(); |
| } |
| |
| [After] |
| override public function tearDownTest():void |
| { |
| super.tearDownTest(); |
| } |
| |
| [Test] |
| public function changeTextFlowIdTest():void |
| { |
| var tf:TextFlow = SelManager.textFlow; |
| var origId:String = tf.id; |
| var newId:String = "newTFId"; |
| |
| SelManager.doOperation(new ApplyElementIDOperation(SelManager.getSelectionState(), tf, newId)); |
| assertTrue("changeTextFlowIdTest doOperation error", tf.id == newId); |
| SelManager.undo(); |
| assertTrue("changeTextFlowIdTest undo error", tf.id == origId); |
| SelManager.redo(); |
| assertTrue("changeTextFlowIdTest redo error", tf.id == newId); |
| } |
| |
| [Test] |
| public function changeFirstParagraphIdTest():void |
| { |
| var p:ParagraphElement = SelManager.textFlow.getChildAt(0) as ParagraphElement; |
| var origId:String = p.id; |
| var newId:String = "newParaId"; |
| |
| SelManager.doOperation(new ApplyElementIDOperation(SelManager.getSelectionState(), p, newId)); |
| assertTrue("changeFirstParagraphIdTest doOperation error", p.id == newId); |
| SelManager.undo(); |
| assertTrue("changeFirstParagraphIdTest undo error", p.id == origId); |
| SelManager.redo(); |
| assertTrue("changeFirstParagraphIdTest redo error", p.id == newId); |
| } |
| |
| [Test] |
| public function changePartialParagraphIdTest():void |
| { |
| var tf:TextFlow = SelManager.textFlow; |
| var numParas:int = tf.numChildren; |
| var totalLength:int = tf.textLength; |
| |
| var p:ParagraphElement = tf.getChildAt(0) as ParagraphElement; |
| var origId:String = p.id; |
| var origTextLength:int = p.textLength; |
| var newId:String = "newParaId"; |
| |
| // creates two new paragraphs |
| SelManager.doOperation(new ApplyElementIDOperation(SelManager.getSelectionState(), p, newId, 10, 20)); |
| p = tf.findLeaf(11).getParagraph(); // prev para gets a terminator added |
| assertTrue("changePartialParagraphIdTest doOperation error p wrong size", p.textLength == 11 && p.parentRelativeStart == 11); |
| assertTrue("changePartialParagraphIdTest doOperation error id", p.id == newId); |
| assertTrue("changePartialParagraphIdTest doOperation error numParas", tf.numChildren == numParas + 2); |
| assertTrue("changePartialParagraphIdTest doOperation error totalLength", tf.textLength == totalLength + 2); |
| |
| SelManager.undo(); |
| p = tf.findLeaf(10).getParagraph(); |
| assertTrue("changePartialParagraphIdTest undo error", p.id == origId && p.textLength == origTextLength); |
| assertTrue("changePartialParagraphIdTest undo error numParas", tf.numChildren == numParas); |
| assertTrue("changePartialParagraphIdTest undo error totalLength", tf.textLength == totalLength); |
| |
| SelManager.redo(); |
| p = tf.findLeaf(11).getParagraph(); |
| assertTrue("changePartialParagraphIdTest redo error p wrong size", p.textLength == 11 && p.parentRelativeStart == 11); |
| assertTrue("changePartialParagraphIdTest redo error", p.id == newId); |
| assertTrue("changePartialParagraphIdTest redo error numParas", tf.numChildren == numParas + 2); |
| assertTrue("changePartialParagraphIdTest redo error totalLength", tf.textLength == totalLength + 2); |
| } |
| |
| [Test] |
| public function changePartialSpanIdTest():void |
| { |
| var tf:TextFlow = SelManager.textFlow; |
| var numParas:int = tf.numChildren; |
| var totalLength:int = tf.textLength; |
| |
| var span:SpanElement = tf.getLastLeaf() as SpanElement; |
| assertTrue("changePartialSpanIdTest span is too short for the test", span.textLength > 20); |
| var spanStart:int = span.getAbsoluteStart(); |
| |
| var origId:String = span.id; |
| var origSpanLength:int = span.textLength; |
| var newId:String = "newSpanId"; |
| |
| // splits the span |
| SelManager.doOperation(new ApplyElementIDOperation(SelManager.getSelectionState(), span, newId, 10, 20)); |
| |
| span = tf.findLeaf(spanStart + 10) as SpanElement; |
| assertTrue("changePartialSpanIdTest doOperation error span wrong size", span.textLength == 10 && span.parentRelativeStart == 10); |
| assertTrue("changePartialSpanIdTest doOperation error id", span.id == newId); |
| assertTrue("changePartialSpanIdTest doOperation error totalLength", tf.textLength == totalLength); |
| |
| SelManager.undo(); |
| span = tf.findLeaf(spanStart) as SpanElement; |
| assertTrue("changePartialSpanIdTest undo error", span.id == origId && span.textLength == origSpanLength); |
| assertTrue("changePartialSpanIdTest undo error totalLength", tf.textLength == totalLength); |
| |
| SelManager.redo(); |
| span = tf.findLeaf(spanStart + 10) as SpanElement; |
| assertTrue("changePartialSpanIdTest redo error span wrong size", span.textLength == 10 && span.parentRelativeStart == 10); |
| assertTrue("changePartialSpanIdTest redo error", span.id == newId); |
| assertTrue("changePartialSpanIdTest redo error totalLength", tf.textLength == totalLength); |
| } |
| |
| [Test] |
| public function changeTextFlowStyleNameTest():void |
| { |
| var tf:TextFlow = SelManager.textFlow; |
| var origStyleName:String = tf.styleName; |
| var newStyleName:String = "newTFStyleName"; |
| |
| // ApplyElementStyleNameOperation is deprecated |
| SelManager.doOperation(new ApplyElementStyleNameOperation(SelManager.getSelectionState(), tf, newStyleName)); |
| assertTrue("changeTextFlowStyleNameTest doOperation error", tf.styleName == newStyleName); |
| SelManager.undo(); |
| assertTrue("changeTextFlowStyleNameTest undo error", tf.styleName == origStyleName); |
| SelManager.redo(); |
| assertTrue("changeTextFlowStyleNameTest redo error", tf.styleName == newStyleName); |
| |
| SelManager.undo(); |
| assertTrue("changeTextFlowStyleNameTest undo error", tf.styleName == origStyleName); |
| |
| // test using the replacement class |
| SelManager.doOperation(new ApplyFormatToElementOperation(SelManager.getSelectionState(), tf, TextLayoutFormat.createTextLayoutFormat({styleName: newStyleName}))); |
| assertTrue("changeTextFlowStyleNameTest doOperation error", tf.styleName == newStyleName); |
| SelManager.undo(); |
| assertTrue("changeTextFlowStyleNameTest undo error", tf.styleName == origStyleName); |
| SelManager.redo(); |
| assertTrue("changeTextFlowStyleNameTest redo error", tf.styleName == newStyleName); |
| |
| } |
| |
| [Test] |
| public function changeFirstParagraphStyleNameTest():void |
| { |
| var p:ParagraphElement = SelManager.textFlow.getChildAt(0) as ParagraphElement; |
| var origStyleName:String = p.styleName; |
| var newStyleName:String = "newParaStyleName"; |
| |
| // ApplyElementStyleNameOperation is deprecated |
| SelManager.doOperation(new ApplyElementStyleNameOperation(SelManager.getSelectionState(), p, newStyleName)); |
| assertTrue("changeFirstParagraphStyleNameTest doOperation error", p.styleName == newStyleName); |
| SelManager.undo(); |
| assertTrue("changeFirstParagraphStyleNameTest undo error", p.styleName == origStyleName); |
| SelManager.redo(); |
| assertTrue("changeFirstParagraphStyleNameTest redo error", p.styleName == newStyleName); |
| |
| SelManager.undo(); |
| assertTrue("changeFirstParagraphStyleNameTest undo error", p.styleName == origStyleName); |
| |
| // test using the replacement class |
| SelManager.doOperation(new ApplyFormatToElementOperation(SelManager.getSelectionState(), p, TextLayoutFormat.createTextLayoutFormat({styleName: newStyleName}))); |
| assertTrue("changeFirstParagraphStyleNameTest doOperation error", p.styleName == newStyleName); |
| SelManager.undo(); |
| assertTrue("changeFirstParagraphStyleNameTest undo error", p.styleName == origStyleName); |
| SelManager.redo(); |
| assertTrue("changeFirstParagraphStyleNameTest redo error", p.styleName == newStyleName); |
| |
| } |
| |
| [Test] |
| public function changeTextFlowTypeNameTest():void |
| { |
| var tf:TextFlow = SelManager.textFlow; |
| var origTypeName:String = tf.typeName; |
| var newTypeName:String = "newTFTypeName"; |
| |
| SelManager.doOperation(new ApplyElementTypeNameOperation(SelManager.getSelectionState(), tf, newTypeName)); |
| assertTrue("changeTextFlowTypeNameTest doOperation error", tf.typeName == newTypeName); |
| SelManager.undo(); |
| assertTrue("changeTextFlowTypeNameTest undo error", tf.typeName == origTypeName); |
| SelManager.redo(); |
| assertTrue("changeTextFlowTypeNameTest redo error", tf.typeName == newTypeName); |
| } |
| |
| [Test] |
| public function changeFirstParagraphTypeNameTest():void |
| { |
| var p:ParagraphElement = SelManager.textFlow.getChildAt(0) as ParagraphElement; |
| var origTypeName:String = p.typeName; |
| var newTypeName:String = "newParaTypeName"; |
| |
| SelManager.doOperation(new ApplyElementTypeNameOperation(SelManager.getSelectionState(), p, newTypeName)); |
| assertTrue("changeFirstParagraphTypeNameTest doOperation error", p.typeName == newTypeName); |
| SelManager.undo(); |
| assertTrue("changeFirstParagraphTypeNameTest undo error", p.typeName == origTypeName); |
| SelManager.redo(); |
| assertTrue("changeFirstParagraphTypeNameTest redo error", p.typeName == newTypeName); |
| } |
| |
| [Test] |
| public function changePartialParagraphStyleNameTest():void |
| { |
| var tf:TextFlow = SelManager.textFlow; |
| var numParas:int = tf.numChildren; |
| var totalLength:int = tf.textLength; |
| |
| var p:ParagraphElement = tf.getChildAt(0) as ParagraphElement; |
| var origStyleName:String = p.styleName; |
| var origTextLength:int = p.textLength; |
| var newStyleName:String = "newParaStyleName"; |
| |
| // ApplyElementStyleNameOperation is deprecated |
| // creates two new paragraphs |
| SelManager.doOperation(new ApplyElementStyleNameOperation(SelManager.getSelectionState(), p, newStyleName, 10, 20)); |
| p = tf.findLeaf(11).getParagraph(); // prev para gets a terminator added |
| assertTrue("changePartialParagraphStyleNameTest doOperation error p wrong size", p.textLength == 11 && p.parentRelativeStart == 11); |
| assertTrue("changePartialParagraphStyleNameTest doOperation error", p.styleName == newStyleName); |
| assertTrue("changePartialParagraphStyleNameTest doOperation error numParas", tf.numChildren == numParas + 2); |
| assertTrue("changePartialParagraphStyleNameTest doOperation error totalLength", tf.textLength == totalLength + 2); |
| |
| SelManager.undo(); |
| p = tf.findLeaf(10).getParagraph(); |
| assertTrue("changePartialParagraphStyleNameTest undo error", p.styleName == origStyleName && p.textLength == origTextLength); |
| assertTrue("changePartialParagraphStyleNameTest undo error numParas", tf.numChildren == numParas); |
| assertTrue("changePartialParagraphStyleNameTest undo error totalLength", tf.textLength == totalLength); |
| |
| SelManager.redo(); |
| p = tf.findLeaf(11).getParagraph(); |
| assertTrue("changePartialParagraphStyleNameTest redo error p wrong size", p.textLength == 11 && p.parentRelativeStart == 11); |
| assertTrue("changePartialParagraphStyleNameTest redo error", p.styleName == newStyleName); |
| assertTrue("changePartialParagraphStyleNameTest redo error numParas", tf.numChildren == numParas + 2); |
| assertTrue("changePartialParagraphStyleNameTest redo error totalLength", tf.textLength == totalLength + 2); |
| |
| // cleanup |
| SelManager.undo(); |
| p = tf.findLeaf(10).getParagraph(); |
| assertTrue("changePartialParagraphStyleNameTest undo error", p.styleName == origStyleName && p.textLength == origTextLength); |
| assertTrue("changePartialParagraphStyleNameTest undo error numParas", tf.numChildren == numParas); |
| assertTrue("changePartialParagraphStyleNameTest undo error totalLength", tf.textLength == totalLength); |
| |
| // test using the replacement class |
| // creates two new paragraphs |
| SelManager.doOperation(new ApplyFormatToElementOperation(SelManager.getSelectionState(), p, TextLayoutFormat.createTextLayoutFormat({styleName: newStyleName}), 10, 20)); |
| p = tf.findLeaf(11).getParagraph(); // prev para gets a terminator added |
| assertTrue("changePartialParagraphStyleNameTest doOperation error p wrong size", p.textLength == 11 && p.parentRelativeStart == 11); |
| assertTrue("changePartialParagraphStyleNameTest doOperation error", p.styleName == newStyleName); |
| assertTrue("changePartialParagraphStyleNameTest doOperation error numParas", tf.numChildren == numParas + 2); |
| assertTrue("changePartialParagraphStyleNameTest doOperation error totalLength", tf.textLength == totalLength + 2); |
| |
| SelManager.undo(); |
| p = tf.findLeaf(10).getParagraph(); |
| assertTrue("changePartialParagraphStyleNameTest undo error", p.styleName == origStyleName && p.textLength == origTextLength); |
| assertTrue("changePartialParagraphStyleNameTest undo error numParas", tf.numChildren == numParas); |
| assertTrue("changePartialParagraphStyleNameTest undo error totalLength", tf.textLength == totalLength); |
| |
| SelManager.redo(); |
| p = tf.findLeaf(11).getParagraph(); |
| assertTrue("changePartialParagraphStyleNameTest redo error p wrong size", p.textLength == 11 && p.parentRelativeStart == 11); |
| assertTrue("changePartialParagraphStyleNameTest redo error", p.styleName == newStyleName); |
| assertTrue("changePartialParagraphStyleNameTest redo error numParas", tf.numChildren == numParas + 2); |
| assertTrue("changePartialParagraphStyleNameTest redo error totalLength", tf.textLength == totalLength + 2); |
| |
| } |
| |
| [Test] |
| public function changePartialSpanStyleNameTest():void |
| { |
| var tf:TextFlow = SelManager.textFlow; |
| var numParas:int = tf.numChildren; |
| var totalLength:int = tf.textLength; |
| |
| var span:SpanElement = tf.getLastLeaf() as SpanElement; |
| assertTrue("changePartialSpanStyleNameTest span is too short for the test", span.textLength > 20); |
| var spanStart:int = span.getAbsoluteStart(); |
| |
| var origStyleName:String = span.styleName; |
| var origSpanLength:int = span.textLength; |
| var newStyleName:String = "newSpanStyleName"; |
| |
| // ApplyElementStyleNameOperation is deprecated |
| // splits the span |
| SelManager.doOperation(new ApplyElementStyleNameOperation(SelManager.getSelectionState(), span, newStyleName, 10, 20)); |
| |
| span = tf.findLeaf(spanStart + 10) as SpanElement; |
| assertTrue("changePartialSpanStyleNameTest doOperation error span wrong size", span.textLength == 10 && span.parentRelativeStart == 10); |
| assertTrue("changePartialSpanStyleNameTest doOperation error id", span.styleName == newStyleName); |
| assertTrue("changePartialSpanStyleNameTest doOperation error totalLength", tf.textLength == totalLength); |
| |
| SelManager.undo(); |
| span = tf.findLeaf(spanStart) as SpanElement; |
| assertTrue("changePartialSpanStyleNameTest undo error", span.styleName == origStyleName && span.textLength == origSpanLength); |
| assertTrue("changePartialSpanStyleNameTest undo error totalLength", tf.textLength == totalLength); |
| |
| SelManager.redo(); |
| span = tf.findLeaf(spanStart + 10) as SpanElement; |
| assertTrue("changePartialSpanStyleNameTest redo error span wrong size", span.textLength == 10 && span.parentRelativeStart == 10); |
| assertTrue("changePartialSpanStyleNameTest redo error", span.styleName == newStyleName); |
| assertTrue("changePartialSpanStyleNameTest redo error totalLength", tf.textLength == totalLength); |
| |
| // cleanup |
| SelManager.undo(); |
| span = tf.findLeaf(spanStart) as SpanElement; |
| assertTrue("changePartialSpanStyleNameTest undo error", span.styleName == origStyleName && span.textLength == origSpanLength); |
| assertTrue("changePartialSpanStyleNameTest undo error totalLength", tf.textLength == totalLength); |
| |
| // test using the replacement function |
| |
| // splits the span |
| SelManager.doOperation(new ApplyFormatToElementOperation(SelManager.getSelectionState(), span, TextLayoutFormat.createTextLayoutFormat({styleName: newStyleName}), 10, 20)); |
| |
| span = tf.findLeaf(spanStart + 10) as SpanElement; |
| assertTrue("changePartialSpanStyleNameTest doOperation error span wrong size", span.textLength == 10 && span.parentRelativeStart == 10); |
| assertTrue("changePartialSpanStyleNameTest doOperation error id", span.styleName == newStyleName); |
| assertTrue("changePartialSpanStyleNameTest doOperation error totalLength", tf.textLength == totalLength); |
| |
| SelManager.undo(); |
| span = tf.findLeaf(spanStart) as SpanElement; |
| assertTrue("changePartialSpanStyleNameTest undo error", span.styleName == origStyleName && span.textLength == origSpanLength); |
| assertTrue("changePartialSpanStyleNameTest undo error totalLength", tf.textLength == totalLength); |
| |
| SelManager.redo(); |
| span = tf.findLeaf(spanStart + 10) as SpanElement; |
| assertTrue("changePartialSpanStyleNameTest redo error span wrong size", span.textLength == 10 && span.parentRelativeStart == 10); |
| assertTrue("changePartialSpanStyleNameTest redo error", span.styleName == newStyleName); |
| assertTrue("changePartialSpanStyleNameTest redo error totalLength", tf.textLength == totalLength); |
| } |
| |
| [Test] |
| public function changePartialParagraphTypeNameTest():void |
| { |
| var tf:TextFlow = SelManager.textFlow; |
| var numParas:int = tf.numChildren; |
| var totalLength:int = tf.textLength; |
| |
| var p:ParagraphElement = tf.getChildAt(0) as ParagraphElement; |
| var origTypeName:String = p.typeName; |
| var origTextLength:int = p.textLength; |
| var newTypeName:String = "newParaTypeName"; |
| |
| // creates two new paragraphs |
| SelManager.doOperation(new ApplyElementTypeNameOperation(SelManager.getSelectionState(), p, newTypeName, 10, 20)); |
| p = tf.findLeaf(11).getParagraph(); // prev para gets a terminator added |
| assertTrue("changePartialParagraphTypeNameTest doOperation error p wrong size", p.textLength == 11 && p.parentRelativeStart == 11); |
| assertTrue("changePartialParagraphTypeNameTest doOperation error", p.typeName == newTypeName); |
| assertTrue("changePartialParagraphTypeNameTest doOperation error numParas", tf.numChildren == numParas + 2); |
| assertTrue("changePartialParagraphTypeNameTest doOperation error totalLength", tf.textLength == totalLength + 2); |
| |
| SelManager.undo(); |
| p = tf.findLeaf(10).getParagraph(); |
| assertTrue("changePartialParagraphTypeNameTest undo error", p.typeName == origTypeName && p.textLength == origTextLength); |
| assertTrue("changePartialParagraphTypeNameTest undo error numParas", tf.numChildren == numParas); |
| assertTrue("changePartialParagraphTypeNameTest undo error totalLength", tf.textLength == totalLength); |
| |
| SelManager.redo(); |
| p = tf.findLeaf(11).getParagraph(); |
| assertTrue("changePartialParagraphTypeNameTest redo error p wrong size", p.textLength == 11 && p.parentRelativeStart == 11); |
| assertTrue("changePartialParagraphTypeNameTest redo error", p.typeName == newTypeName); |
| assertTrue("changePartialParagraphTypeNameTest redo error numParas", tf.numChildren == numParas + 2); |
| assertTrue("changePartialParagraphTypeNameTest redo error totalLength", tf.textLength == totalLength + 2); |
| } |
| |
| [Test] |
| public function changePartialSpanTypeNameTest():void |
| { |
| var tf:TextFlow = SelManager.textFlow; |
| var numParas:int = tf.numChildren; |
| var totalLength:int = tf.textLength; |
| |
| var span:SpanElement = tf.getLastLeaf() as SpanElement; |
| assertTrue("changePartialSpanTypeNameTest span is too short for the test", span.textLength > 20); |
| var spanStart:int = span.getAbsoluteStart(); |
| |
| var origTypeName:String = span.typeName; |
| var origSpanLength:int = span.textLength; |
| var newTypeName:String = "newSpanTypeName"; |
| |
| // splits the span |
| SelManager.doOperation(new ApplyElementTypeNameOperation(SelManager.getSelectionState(), span, newTypeName, 10, 20)); |
| |
| span = tf.findLeaf(spanStart + 10) as SpanElement; |
| assertTrue("changePartialSpanTypeNameTest doOperation error span wrong size", span.textLength == 10 && span.parentRelativeStart == 10); |
| assertTrue("changePartialSpanTypeNameTest doOperation error id", span.typeName == newTypeName); |
| assertTrue("changePartialSpanTypeNameTest doOperation error totalLength", tf.textLength == totalLength); |
| |
| SelManager.undo(); |
| span = tf.findLeaf(spanStart) as SpanElement; |
| assertTrue("changePartialSpanTypeNameTest undo error", span.typeName == origTypeName && span.textLength == origSpanLength); |
| assertTrue("changePartialSpanTypeNameTest undo error totalLength", tf.textLength == totalLength); |
| |
| SelManager.redo(); |
| span = tf.findLeaf(spanStart + 10) as SpanElement; |
| assertTrue("changePartialSpanTypeNameTest redo error span wrong size", span.textLength == 10 && span.parentRelativeStart == 10); |
| assertTrue("changePartialSpanTypeNameTest redo error", span.typeName == newTypeName); |
| assertTrue("changePartialSpanTypeNameTest redo error totalLength", tf.textLength == totalLength); |
| } |
| |
| [Test] |
| public function changeTextFlowUserStyleTest():void |
| { |
| var tf:TextFlow = SelManager.textFlow; |
| var styleName:String = "userStyleName"; |
| var origStyleValue:* = tf.getStyle(styleName); |
| var newStyleValue:String = "newTFStyleValue"; |
| |
| // ApplyElementUserStyleOperation is deprecated |
| SelManager.doOperation(new ApplyElementUserStyleOperation(SelManager.getSelectionState(), tf, styleName, newStyleValue)); |
| assertTrue("changeTextFlowUserStyleTest doOperation error", tf.getStyle(styleName) === newStyleValue); |
| SelManager.undo(); |
| assertTrue("changeTextFlowUserStyleTest undo error", tf.getStyle(styleName) === origStyleValue); |
| SelManager.redo(); |
| assertTrue("changeTextFlowUserStyleTest redo error", tf.getStyle(styleName) === newStyleValue); |
| |
| // cleanup |
| SelManager.undo(); |
| assertTrue("changeTextFlowUserStyleTest undo error", tf.getStyle(styleName) === origStyleValue); |
| |
| // test using the replacement class |
| var format:TextLayoutFormat = new TextLayoutFormat(); |
| format.setStyle(styleName, newStyleValue); |
| SelManager.doOperation(new ApplyFormatToElementOperation(SelManager.getSelectionState(), tf, format)); |
| assertTrue("changeTextFlowUserStyleTest doOperation error", tf.getStyle(styleName) === newStyleValue); |
| SelManager.undo(); |
| assertTrue("changeTextFlowUserStyleTest undo error", tf.getStyle(styleName) === origStyleValue); |
| SelManager.redo(); |
| assertTrue("changeTextFlowUserStyleTest redo error", tf.getStyle(styleName) === newStyleValue); |
| } |
| |
| [Test] |
| public function changeFirstParagraphUserStyleTest():void |
| { |
| var p:ParagraphElement = SelManager.textFlow.getChildAt(0) as ParagraphElement; |
| var styleName:String = "userStyleName"; |
| var origStyleValue:* = p.getStyle(styleName); |
| var newStyleValue:String = "newParaStyleValue"; |
| |
| // ApplyElementUserStyleOperation is deprecated |
| SelManager.doOperation(new ApplyElementUserStyleOperation(SelManager.getSelectionState(), p, styleName, newStyleValue)); |
| assertTrue("changeFirstParagraphUserStyleTest doOperation error", p.getStyle(styleName) === newStyleValue); |
| SelManager.undo(); |
| assertTrue("changeFirstParagraphUserStyleTest undo error", p.getStyle(styleName) === origStyleValue); |
| SelManager.redo(); |
| assertTrue("changeFirstParagraphUserStyleTest redo error", p.getStyle(styleName) === newStyleValue); |
| |
| // cleanup |
| SelManager.undo(); |
| assertTrue("changeFirstParagraphUserStyleTest undo error", p.getStyle(styleName) === origStyleValue); |
| |
| // test using the replacement class |
| var format:TextLayoutFormat = new TextLayoutFormat(); |
| format.setStyle(styleName, newStyleValue); |
| SelManager.doOperation(new ApplyFormatToElementOperation(SelManager.getSelectionState(), p, format)); |
| assertTrue("changeFirstParagraphUserStyleTest doOperation error", p.getStyle(styleName) === newStyleValue); |
| SelManager.undo(); |
| assertTrue("changeFirstParagraphUserStyleTest undo error", p.getStyle(styleName) === origStyleValue); |
| SelManager.redo(); |
| assertTrue("changeFirstParagraphUserStyleTest redo error", p.getStyle(styleName) === newStyleValue); |
| } |
| |
| [Test] |
| public function changePartialParagraphUserStyleTest():void |
| { |
| var tf:TextFlow = SelManager.textFlow; |
| var numParas:int = tf.numChildren; |
| var totalLength:int = tf.textLength; |
| |
| var p:ParagraphElement = tf.getChildAt(0) as ParagraphElement; |
| var origTextLength:int = p.textLength; |
| |
| var styleName:String = "userStyleName"; |
| var origStyleValue:* = p.getStyle(styleName); |
| var newStyleValue:String = "newParaStyleValue"; |
| |
| // ApplyElementUserStyleOperation is deprecated |
| // creates two new paragraphs |
| SelManager.doOperation(new ApplyElementUserStyleOperation(SelManager.getSelectionState(), p, styleName, newStyleValue, 10, 20)); |
| p = tf.findLeaf(11).getParagraph(); // prev para gets a terminator added |
| assertTrue("changePartialParagraphUserStyleTest doOperation error p wrong size", p.textLength == 11 && p.parentRelativeStart == 11); |
| assertTrue("changePartialParagraphUserStyleTest doOperation error", p.getStyle(styleName) === newStyleValue); |
| assertTrue("changePartialParagraphUserStyleTest doOperation error numParas", tf.numChildren == numParas + 2); |
| assertTrue("changePartialParagraphUserStyleTest doOperation error totalLength", tf.textLength == totalLength + 2); |
| |
| SelManager.undo(); |
| p = tf.findLeaf(10).getParagraph(); |
| assertTrue("changePartialParagraphUserStyleTest undo error", p.getStyle(styleName) === origStyleValue && p.textLength == origTextLength); |
| assertTrue("changePartialParagraphUserStyleTest undo error numParas", tf.numChildren == numParas); |
| assertTrue("changePartialParagraphUserStyleTest undo error totalLength", tf.textLength == totalLength); |
| |
| SelManager.redo(); |
| p = tf.findLeaf(11).getParagraph(); |
| assertTrue("changePartialParagraphStyleNameTest redo error p wrong size", p.textLength == 11 && p.parentRelativeStart == 11); |
| assertTrue("changePartialParagraphStyleNameTest redo error", p.getStyle(styleName) === newStyleValue); |
| assertTrue("changePartialParagraphStyleNameTest redo error numParas", tf.numChildren == numParas + 2); |
| assertTrue("changePartialParagraphStyleNameTest redo error totalLength", tf.textLength == totalLength + 2); |
| |
| // cleanup |
| SelManager.undo(); |
| p = tf.findLeaf(10).getParagraph(); |
| assertTrue("changePartialParagraphUserStyleTest undo error", p.getStyle(styleName) === origStyleValue && p.textLength == origTextLength); |
| assertTrue("changePartialParagraphUserStyleTest undo error numParas", tf.numChildren == numParas); |
| assertTrue("changePartialParagraphUserStyleTest undo error totalLength", tf.textLength == totalLength); |
| |
| // test using the replacement class |
| var format:TextLayoutFormat = new TextLayoutFormat(); |
| format.setStyle(styleName, newStyleValue); |
| SelManager.doOperation(new ApplyFormatToElementOperation(SelManager.getSelectionState(), p, format, 10, 20)); |
| p = tf.findLeaf(11).getParagraph(); // prev para gets a terminator added |
| assertTrue("changePartialParagraphUserStyleTest doOperation error p wrong size", p.textLength == 11 && p.parentRelativeStart == 11); |
| assertTrue("changePartialParagraphUserStyleTest doOperation error", p.getStyle(styleName) === newStyleValue); |
| assertTrue("changePartialParagraphUserStyleTest doOperation error numParas", tf.numChildren == numParas + 2); |
| assertTrue("changePartialParagraphUserStyleTest doOperation error totalLength", tf.textLength == totalLength + 2); |
| |
| SelManager.undo(); |
| p = tf.findLeaf(10).getParagraph(); |
| assertTrue("changePartialParagraphUserStyleTest undo error", p.getStyle(styleName) === origStyleValue && p.textLength == origTextLength); |
| assertTrue("changePartialParagraphUserStyleTest undo error numParas", tf.numChildren == numParas); |
| assertTrue("changePartialParagraphUserStyleTest undo error totalLength", tf.textLength == totalLength); |
| |
| SelManager.redo(); |
| p = tf.findLeaf(11).getParagraph(); |
| assertTrue("changePartialParagraphStyleNameTest redo error p wrong size", p.textLength == 11 && p.parentRelativeStart == 11); |
| assertTrue("changePartialParagraphStyleNameTest redo error", p.getStyle(styleName) === newStyleValue); |
| assertTrue("changePartialParagraphStyleNameTest redo error numParas", tf.numChildren == numParas + 2); |
| assertTrue("changePartialParagraphStyleNameTest redo error totalLength", tf.textLength == totalLength + 2); |
| |
| } |
| |
| [Test] |
| public function changePartialSpanUserStyleTest():void |
| { |
| var tf:TextFlow = SelManager.textFlow; |
| var numParas:int = tf.numChildren; |
| var totalLength:int = tf.textLength; |
| |
| var span:SpanElement = tf.getLastLeaf() as SpanElement; |
| assertTrue("changePartialSpanStyleNameTest span is too short for the test", span.textLength > 20); |
| var spanStart:int = span.getAbsoluteStart(); |
| var origSpanLength:int = span.textLength; |
| |
| var styleName:String = "userStyleName"; |
| var origStyleValue:* = span.getStyle(styleName); |
| var newStyleValue:String = "newSpanStyleValue"; |
| |
| // ApplyElementUserStyleOperation is deprecated |
| // splits the span |
| SelManager.doOperation(new ApplyElementUserStyleOperation(SelManager.getSelectionState(), span, styleName, newStyleValue, 10, 20)); |
| |
| span = tf.findLeaf(spanStart + 10) as SpanElement; |
| assertTrue("changePartialSpanUserStyleTest doOperation error span wrong size", span.textLength == 10 && span.parentRelativeStart == 10); |
| assertTrue("changePartialSpanUserStyleTest doOperation error", span.getStyle(styleName) === newStyleValue); |
| assertTrue("changePartialSpanUserStyleTest doOperation error totalLength", tf.textLength == totalLength); |
| |
| SelManager.undo(); |
| span = tf.findLeaf(spanStart) as SpanElement; |
| assertTrue("changePartialSpanUserStyleTest undo error", span.getStyle(styleName) === origStyleValue && span.textLength == origSpanLength); |
| assertTrue("changePartialSpanUserStyleTest undo error totalLength", tf.textLength == totalLength); |
| |
| SelManager.redo(); |
| span = tf.findLeaf(spanStart + 10) as SpanElement; |
| assertTrue("changePartialSpanUserStyleTest redo error span wrong size", span.textLength == 10 && span.parentRelativeStart == 10); |
| assertTrue("changePartialSpanUserStyleTest redo error", span.getStyle(styleName) === newStyleValue); |
| assertTrue("changePartialSpanUserStyleTest redo error totalLength", tf.textLength == totalLength); |
| |
| // cleanup |
| SelManager.undo(); |
| span = tf.findLeaf(spanStart) as SpanElement; |
| assertTrue("changePartialSpanUserStyleTest undo error", span.getStyle(styleName) === origStyleValue && span.textLength == origSpanLength); |
| assertTrue("changePartialSpanUserStyleTest undo error totalLength", tf.textLength == totalLength); |
| |
| // splits the span |
| var format:TextLayoutFormat = new TextLayoutFormat(); |
| format.setStyle(styleName, newStyleValue); |
| SelManager.doOperation(new ApplyFormatToElementOperation(SelManager.getSelectionState(), span, format, 10, 20)); |
| |
| span = tf.findLeaf(spanStart + 10) as SpanElement; |
| assertTrue("changePartialSpanUserStyleTest doOperation error span wrong size", span.textLength == 10 && span.parentRelativeStart == 10); |
| assertTrue("changePartialSpanUserStyleTest doOperation error", span.getStyle(styleName) === newStyleValue); |
| assertTrue("changePartialSpanUserStyleTest doOperation error totalLength", tf.textLength == totalLength); |
| |
| SelManager.undo(); |
| span = tf.findLeaf(spanStart) as SpanElement; |
| assertTrue("changePartialSpanUserStyleTest undo error", span.getStyle(styleName) === origStyleValue && span.textLength == origSpanLength); |
| assertTrue("changePartialSpanUserStyleTest undo error totalLength", tf.textLength == totalLength); |
| |
| SelManager.redo(); |
| span = tf.findLeaf(spanStart + 10) as SpanElement; |
| assertTrue("changePartialSpanUserStyleTest redo error span wrong size", span.textLength == 10 && span.parentRelativeStart == 10); |
| assertTrue("changePartialSpanUserStyleTest redo error", span.getStyle(styleName) === newStyleValue); |
| assertTrue("changePartialSpanUserStyleTest redo error totalLength", tf.textLength == totalLength); |
| } |
| |
| [Test] |
| public function deleteAcrossDivBoundaryTest():void |
| { |
| var tf:TextFlow = SelManager.textFlow; |
| var selectFlow:TextFlow = TextConverter.importToFlow(divTestMarkup, TextConverter.TEXT_LAYOUT_FORMAT); |
| |
| var div:DivElement = selectFlow.getChildAt(0) as DivElement; |
| var para:ParagraphElement = selectFlow.getChildAt(1) as ParagraphElement; |
| |
| // setup |
| tf.replaceChildren(0, tf.numChildren, div.deepCopy()); |
| tf.replaceChildren(1, tf.numChildren, para.deepCopy()); |
| tf.flowComposer.updateAllControllers(); |
| |
| var lenBefore:int = tf.textLength; |
| |
| SelManager.selectRange(3, 4); |
| EditManager(SelManager).deleteText(); |
| |
| assertTrue("length didn't change after delete across div boundary!", tf.textLength != lenBefore); |
| |
| } |
| |
| [Test] |
| /** |
| * //Test for bug#2948473, we will not copy the containerBreakAfter, containerBreakBefore |
| * columnBreakAfter, columnBreakBefore attribute to the new paragraph |
| */ |
| public function BreaksSplitTest():void |
| { |
| var tf:TextFlow = SelManager.textFlow; |
| |
| // a simple styled paragraph - always copy |
| var p:ParagraphElement = new ParagraphElement(); |
| p.textAlign = TextAlign.LEFT; |
| p.columnBreakAfter = 'always'; |
| p.columnBreakBefore = 'always'; |
| p.containerBreakAfter = 'always'; |
| p.containerBreakBefore = 'always'; |
| var s:SpanElement = new SpanElement(); |
| s.fontWeight = FontWeight.BOLD; |
| s.text = "Hello"; |
| p.addChild(s); |
| |
| // scratch objects |
| var p1:ParagraphElement; |
| var p2:ParagraphElement; |
| var s1:SpanElement; |
| var s2:SpanElement; |
| |
| |
| // BEGIN SPLIT AT BEGINNING TEST |
| |
| // setup |
| tf.replaceChildren(0, tf.numChildren, p.deepCopy(0, p.textLength)); |
| tf.flowComposer.updateAllControllers(); |
| |
| // split at beginning |
| SelManager.selectRange(0, 0); |
| EditManager(SelManager).splitParagraph(); |
| |
| assertTrue("BreaksSplitTest 1: incorrect number of children after split", tf.numChildren == 2); |
| p1 = tf.getChildAt(0) as ParagraphElement; |
| p2 = tf.getChildAt(1) as ParagraphElement; |
| |
| assertTrue("BreaksSplitTest 1: p1 is incorrect after split", p1 && TextLayoutFormat.isEqual(p.format, p1.format) && p1.numChildren == 1); |
| assertTrue("BreaksSplitTest 1: p2 is incorrect after split", p2 && !TextLayoutFormat.isEqual(p.format, p2.format) && p2.numChildren == 1 && |
| p2.columnBreakAfter == undefined && |
| p2.columnBreakBefore == undefined && |
| p2.containerBreakAfter == undefined && |
| p2.containerBreakBefore == undefined); |
| |
| s1 = p1.getChildAt(0) as SpanElement; |
| s2 = p2.getChildAt(0) as SpanElement; |
| |
| assertTrue("BreaksSplitTest 1: s1 is incorrect after split", s1 && TextLayoutFormat.isEqual(s.format, s1.format)); |
| assertTrue("BreaksSplitTest 1: s2 is incorrect after split", s2 && TextLayoutFormat.isEqual(s.format, s2.format)); |
| |
| // END SPLIT AT BEGINNING TEST |
| |
| // BEGIN SPLIT AT END TEST |
| |
| // setup |
| tf.replaceChildren(0, tf.numChildren, p.deepCopy(0, p.textLength)); |
| tf.flowComposer.updateAllControllers(); |
| |
| // split at end |
| SelManager.selectRange(tf.textLength - 1, tf.textLength - 1); |
| EditManager(SelManager).splitParagraph(); |
| |
| assertTrue("BreaksSplitTest 2: incorrect number of children after split", tf.numChildren == 2); |
| p1 = tf.getChildAt(0) as ParagraphElement; |
| p2 = tf.getChildAt(1) as ParagraphElement; |
| |
| assertTrue("BreaksSplitTest 2: p1 is incorrect after split", p1 && TextLayoutFormat.isEqual(p.format, p1.format) && p1.numChildren == 1); |
| assertTrue("BreaksSplitTest 2: p2 is incorrect after split", p2 && !TextLayoutFormat.isEqual(p.format, p2.format) && p2.numChildren == 1 && |
| p2.columnBreakAfter == undefined && |
| p2.columnBreakBefore == undefined && |
| p2.containerBreakAfter == undefined && |
| p2.containerBreakBefore == undefined); |
| |
| s1 = p1.getChildAt(0) as SpanElement; |
| s2 = p2.getChildAt(0) as SpanElement; |
| |
| assertTrue("BreaksSplitTest 2: s1 is incorrect after split", s1 && TextLayoutFormat.isEqual(s.format, s1.format)); |
| assertTrue("BreaksSplitTest 2: s2 is incorrect after split", s2 && TextLayoutFormat.isEqual(s.format, s2.format)); |
| |
| // END SPLIT AT END TEST |
| |
| // BEGIN SPLIT IN MIDDLE TEST |
| |
| // setup |
| tf.replaceChildren(0, tf.numChildren, p.deepCopy(0, p.textLength)); |
| tf.flowComposer.updateAllControllers(); |
| |
| // split at middle |
| SelManager.selectRange(2, 2); |
| EditManager(SelManager).splitParagraph(); |
| |
| assertTrue("BreaksSplitTest 3: incorrect number of children after split", tf.numChildren == 2); |
| p1 = tf.getChildAt(0) as ParagraphElement; |
| p2 = tf.getChildAt(1) as ParagraphElement; |
| |
| assertTrue("BreaksSplitTest 3: p1 is incorrect after split", p1 && TextLayoutFormat.isEqual(p.format, p1.format) && p1.numChildren == 1); |
| assertTrue("BreaksSplitTest 3: p2 is incorrect after split", p2 && !TextLayoutFormat.isEqual(p.format, p2.format) && p2.numChildren == 1 && |
| p2.columnBreakAfter == undefined && |
| p2.columnBreakBefore == undefined && |
| p2.containerBreakAfter == undefined && |
| p2.containerBreakBefore == undefined); |
| |
| s1 = p1.getChildAt(0) as SpanElement; |
| s2 = p2.getChildAt(0) as SpanElement; |
| |
| assertTrue("BreaksSplitTest 3: s1 is incorrect after split", s1 && TextLayoutFormat.isEqual(s.format, s1.format)); |
| assertTrue("BreaksSplitTest 3: s2 is incorrect after split", s2 && TextLayoutFormat.isEqual(s.format, s2.format)); |
| |
| // END SPLIT IN MIDDLE TEST |
| } |
| |
| [Test] |
| public function splitStyledParagraphTest():void |
| { |
| var tf:TextFlow = SelManager.textFlow; |
| |
| // a simple styled paragraph - always copy |
| var p:ParagraphElement = new ParagraphElement(); |
| p.textAlign = TextAlign.LEFT; |
| var s:SpanElement = new SpanElement(); |
| s.fontWeight = FontWeight.BOLD; |
| s.text = "Hello"; |
| p.addChild(s); |
| |
| // scratch objects |
| var p1:ParagraphElement; |
| var p2:ParagraphElement; |
| var s1:SpanElement; |
| var s2:SpanElement; |
| |
| |
| // BEGIN SPLIT AT BEGINNING TEST |
| |
| // setup |
| tf.replaceChildren(0, tf.numChildren, p.deepCopy(0, p.textLength)); |
| tf.flowComposer.updateAllControllers(); |
| |
| // split at beginning |
| SelManager.selectRange(0, 0); |
| EditManager(SelManager).splitParagraph(); |
| |
| assertTrue("splitStyledParagraphTest 1: incorrect number of children after split", tf.numChildren == 2); |
| p1 = tf.getChildAt(0) as ParagraphElement; |
| p2 = tf.getChildAt(1) as ParagraphElement; |
| |
| assertTrue("splitStyledParagraphTest 1: p1 is incorrect after split", p1 && TextLayoutFormat.isEqual(p.format, p1.format) && p1.numChildren == 1); |
| assertTrue("splitStyledParagraphTest 1: p2 is incorrect after split", p2 && TextLayoutFormat.isEqual(p.format, p2.format) && p2.numChildren == 1); |
| |
| s1 = p1.getChildAt(0) as SpanElement; |
| s2 = p2.getChildAt(0) as SpanElement; |
| |
| assertTrue("splitStyledParagraphTest 1: s1 is incorrect after split", s1 && TextLayoutFormat.isEqual(s.format, s1.format)); |
| assertTrue("splitStyledParagraphTest 1: s2 is incorrect after split", s2 && TextLayoutFormat.isEqual(s.format, s2.format)); |
| |
| // END SPLIT AT BEGINNING TEST |
| |
| // BEGIN SPLIT AT END TEST |
| |
| // setup |
| tf.replaceChildren(0, tf.numChildren, p.deepCopy(0, p.textLength)); |
| tf.flowComposer.updateAllControllers(); |
| |
| // split at end |
| SelManager.selectRange(tf.textLength - 1, tf.textLength - 1); |
| EditManager(SelManager).splitParagraph(); |
| |
| assertTrue("splitStyledParagraphTest 2: incorrect number of children after split", tf.numChildren == 2); |
| p1 = tf.getChildAt(0) as ParagraphElement; |
| p2 = tf.getChildAt(1) as ParagraphElement; |
| |
| assertTrue("splitStyledParagraphTest 2: p1 is incorrect after split", p1 && TextLayoutFormat.isEqual(p.format, p1.format) && p1.numChildren == 1); |
| assertTrue("splitStyledParagraphTest 2: p2 is incorrect after split", p2 && TextLayoutFormat.isEqual(p.format, p2.format) && p2.numChildren == 1); |
| |
| s1 = p1.getChildAt(0) as SpanElement; |
| s2 = p2.getChildAt(0) as SpanElement; |
| |
| assertTrue("splitStyledParagraphTest 2: s1 is incorrect after split", s1 && TextLayoutFormat.isEqual(s.format, s1.format)); |
| assertTrue("splitStyledParagraphTest 2: s2 is incorrect after split", s2 && TextLayoutFormat.isEqual(s.format, s2.format)); |
| |
| // END SPLIT AT END TEST |
| |
| // BEGIN SPLIT IN MIDDLE TEST |
| |
| // setup |
| tf.replaceChildren(0, tf.numChildren, p.deepCopy(0, p.textLength)); |
| tf.flowComposer.updateAllControllers(); |
| |
| // split at middle |
| SelManager.selectRange(2, 2); |
| EditManager(SelManager).splitParagraph(); |
| |
| assertTrue("splitStyledParagraphTest 3: incorrect number of children after split", tf.numChildren == 2); |
| p1 = tf.getChildAt(0) as ParagraphElement; |
| p2 = tf.getChildAt(1) as ParagraphElement; |
| |
| assertTrue("splitStyledParagraphTest 3: p1 is incorrect after split", p1 && TextLayoutFormat.isEqual(p.format, p1.format) && p1.numChildren == 1); |
| assertTrue("splitStyledParagraphTest 3: p2 is incorrect after split", p2 && TextLayoutFormat.isEqual(p.format, p2.format) && p2.numChildren == 1); |
| |
| s1 = p1.getChildAt(0) as SpanElement; |
| s2 = p2.getChildAt(0) as SpanElement; |
| |
| assertTrue("splitStyledParagraphTest 3: s1 is incorrect after split", s1 && TextLayoutFormat.isEqual(s.format, s1.format)); |
| assertTrue("splitStyledParagraphTest 3: s2 is incorrect after split", s2 && TextLayoutFormat.isEqual(s.format, s2.format)); |
| |
| // END SPLIT IN MIDDLE TEST |
| } |
| |
| [Test] |
| public function splitStyledAnchorTest():void |
| { |
| var tf:TextFlow = SelManager.textFlow; |
| |
| // a simple styled paragraph - always copy |
| var p:ParagraphElement = new ParagraphElement(); |
| p.textAlign = TextAlign.LEFT; |
| var s:SpanElement = new SpanElement(); |
| s.fontWeight = FontWeight.BOLD; |
| s.text = "Hello"; |
| var a:LinkElement = new LinkElement(); |
| a.fontSize = 18; |
| a.addChild(s); |
| p.addChild(a); |
| |
| // scratch objects |
| var p1:ParagraphElement; |
| var p2:ParagraphElement; |
| var s1:SpanElement; |
| var s2:SpanElement; |
| |
| |
| // BEGIN SPLIT AT BEGINNING TEST |
| |
| // setup |
| tf.replaceChildren(0, tf.numChildren, p.deepCopy(0, p.textLength)); |
| tf.flowComposer.updateAllControllers(); |
| |
| // split at beginning |
| SelManager.selectRange(0, 0); |
| EditManager(SelManager).splitParagraph(); |
| |
| assertTrue("splitStyledParagraphTest 1: incorrect number of children after split", tf.numChildren == 2); |
| p1 = tf.getChildAt(0) as ParagraphElement; |
| p2 = tf.getChildAt(1) as ParagraphElement; |
| |
| assertTrue("splitStyledParagraphTest 1: p1 is incorrect after split", p1 && TextLayoutFormat.isEqual(p.format, p1.format) && p1.numChildren == 1); |
| assertTrue("splitStyledParagraphTest 1: p2 is incorrect after split", p2 && TextLayoutFormat.isEqual(p.format, p2.format) && p2.numChildren == 1); |
| |
| s1 = p1.getChildAt(0) as SpanElement; |
| s2 = (p2.getChildAt(0) as FlowGroupElement).getChildAt(0) as SpanElement; |
| |
| assertTrue("splitStyledParagraphTest 1: s1 is incorrect after split", s1 && TextLayoutFormat.isEqual(s.format, s1.format)); |
| assertTrue("splitStyledParagraphTest 1: s2 is incorrect after split", s2 && TextLayoutFormat.isEqual(s.format, s2.format)); |
| |
| // END SPLIT AT BEGINNING TEST |
| |
| // BEGIN SPLIT AT END TEST |
| |
| // setup |
| tf.replaceChildren(0, tf.numChildren, p.deepCopy(0, p.textLength)); |
| tf.flowComposer.updateAllControllers(); |
| |
| // split at end |
| SelManager.selectRange(tf.textLength - 1, tf.textLength - 1); |
| EditManager(SelManager).splitParagraph(); |
| |
| assertTrue("splitStyledParagraphTest 2: incorrect number of children after split", tf.numChildren == 2); |
| p1 = tf.getChildAt(0) as ParagraphElement; |
| p2 = tf.getChildAt(1) as ParagraphElement; |
| |
| assertTrue("splitStyledParagraphTest 2: p1 is incorrect after split", p1 && TextLayoutFormat.isEqual(p.format, p1.format) && p1.numChildren == 1); |
| assertTrue("splitStyledParagraphTest 2: p2 is incorrect after split", p2 && TextLayoutFormat.isEqual(p.format, p2.format) && p2.numChildren == 1); |
| |
| s1 = (p1.getChildAt(0) as FlowGroupElement).getChildAt(0) as SpanElement; |
| s2 = p2.getChildAt(0) as SpanElement; |
| |
| assertTrue("splitStyledParagraphTest 2: s1 is incorrect after split", s1 && TextLayoutFormat.isEqual(s.format, s1.format)); |
| assertTrue("splitStyledParagraphTest 2: s2 is incorrect after split", s2 && TextLayoutFormat.isEqual(s.format, s2.format)); |
| |
| // END SPLIT AT END TEST |
| |
| // BEGIN SPLIT IN MIDDLE TEST |
| |
| // setup |
| tf.replaceChildren(0, tf.numChildren, p.deepCopy(0, p.textLength)); |
| tf.flowComposer.updateAllControllers(); |
| |
| // split at middle |
| SelManager.selectRange(2, 2); |
| EditManager(SelManager).splitParagraph(); |
| |
| assertTrue("splitStyledParagraphTest 3: incorrect number of children after split", tf.numChildren == 2); |
| p1 = tf.getChildAt(0) as ParagraphElement; |
| p2 = tf.getChildAt(1) as ParagraphElement; |
| |
| assertTrue("splitStyledParagraphTest 3: p1 is incorrect after split", p1 && TextLayoutFormat.isEqual(p.format, p1.format) && p1.numChildren == 1); |
| assertTrue("splitStyledParagraphTest 3: p2 is incorrect after split", p2 && TextLayoutFormat.isEqual(p.format, p2.format) && p2.numChildren == 1); |
| |
| s1 = (p1.getChildAt(0) as FlowGroupElement).getChildAt(0) as SpanElement; |
| s2 = (p2.getChildAt(0) as FlowGroupElement).getChildAt(0) as SpanElement; |
| |
| assertTrue("splitStyledParagraphTest 3: s1 is incorrect after split", s1 && TextLayoutFormat.isEqual(s.format, s1.format)); |
| assertTrue("splitStyledParagraphTest 3: s2 is incorrect after split", s2 && TextLayoutFormat.isEqual(s.format, s2.format)); |
| |
| // END SPLIT IN MIDDLE TEST |
| } |
| |
| [Test] |
| public function splitStyledListItemTest():void |
| { |
| var tf:TextFlow = SelManager.textFlow; |
| |
| var listFlow:TextFlow = TextConverter.importToFlow(listItemMarkup, TextConverter.TEXT_LAYOUT_FORMAT); |
| var list:ListElement = listFlow.getChildAt(0) as ListElement; |
| |
| var s:SpanElement = list.getFirstLeaf() as SpanElement; |
| var p:ParagraphElement = s.parent as ParagraphElement; |
| |
| // scratch objects |
| var p1:ParagraphElement; |
| var p2:ParagraphElement; |
| var s1:SpanElement; |
| var s2:SpanElement; |
| var listCopy:ListElement; |
| |
| |
| // BEGIN SPLIT AT BEGINNING TEST |
| |
| // setup |
| listCopy = list.deepCopy(0, list.textLength) as ListElement; |
| tf.replaceChildren(0, tf.numChildren, listCopy); |
| tf.flowComposer.updateAllControllers(); |
| |
| // split at beginning |
| SelManager.selectRange(0, 0); |
| EditManager(SelManager).splitElement(listCopy.getChildAt(0) as FlowGroupElement); |
| |
| assertTrue("splitStyledListItemTest 1: incorrect number of children after split", listCopy.numChildren == 2); |
| p1 = (listCopy.getChildAt(0) as FlowGroupElement).getChildAt(0) as ParagraphElement; |
| p2 = (listCopy.getChildAt(1) as FlowGroupElement).getChildAt(0) as ParagraphElement; |
| |
| assertTrue("splitStyledListItemTest 1: p1 is incorrect after split", p1 && TextLayoutFormat.isEqual(p.format, p1.format) && p1.numChildren == 1); |
| assertTrue("splitStyledListItemTest 1: p2 is incorrect after split", p2 && TextLayoutFormat.isEqual(p.format, p2.format) && p2.numChildren == 1); |
| |
| s1 = p1.getChildAt(0) as SpanElement; |
| s2 = p2.getChildAt(0) as SpanElement; |
| |
| assertTrue("splitStyledListItemTest 1: s1 is incorrect after split", s1 && TextLayoutFormat.isEqual(s.format, s1.format)); |
| assertTrue("splitStyledListItemTest 1: s2 is incorrect after split", s2 && TextLayoutFormat.isEqual(s.format, s2.format)); |
| |
| // END SPLIT AT BEGINNING TEST |
| |
| // BEGIN SPLIT AT END TEST |
| |
| // setup |
| listCopy = list.deepCopy(0, list.textLength) as ListElement; |
| tf.replaceChildren(0, tf.numChildren, listCopy); |
| tf.flowComposer.updateAllControllers(); |
| |
| |
| // split at end |
| SelManager.selectRange(tf.textLength - 1, tf.textLength - 1); |
| EditManager(SelManager).splitElement(listCopy.getChildAt(0) as FlowGroupElement); |
| |
| assertTrue("splitStyledListItemTest 2: incorrect number of children after split", listCopy.numChildren == 2); |
| p1 = (listCopy.getChildAt(0) as FlowGroupElement).getChildAt(0) as ParagraphElement; |
| p2 = (listCopy.getChildAt(1) as FlowGroupElement).getChildAt(0) as ParagraphElement; |
| |
| assertTrue("splitStyledListItemTest 2: p1 is incorrect after split", p1 && TextLayoutFormat.isEqual(p.format, p1.format) && p1.numChildren == 1); |
| assertTrue("splitStyledListItemTest 2: p2 is incorrect after split", p2 && TextLayoutFormat.isEqual(p.format, p2.format) && p2.numChildren == 1); |
| |
| s1 = p1.getChildAt(0) as SpanElement; |
| s2 = p2.getChildAt(0) as SpanElement; |
| |
| assertTrue("splitStyledListItemTest 2: s1 is incorrect after split", s1 && TextLayoutFormat.isEqual(s.format, s1.format)); |
| assertTrue("splitStyledListItemTest 2: s2 is incorrect after split", s2 && TextLayoutFormat.isEqual(s.format, s2.format)); |
| |
| // END SPLIT AT END TEST |
| |
| // BEGIN SPLIT IN MIDDLE TEST |
| |
| // setup |
| listCopy = list.deepCopy(0, list.textLength) as ListElement; |
| tf.replaceChildren(0, tf.numChildren, listCopy); |
| tf.flowComposer.updateAllControllers(); |
| |
| // split at middle |
| SelManager.selectRange(2, 2); |
| EditManager(SelManager).splitElement(listCopy.getChildAt(0) as FlowGroupElement); |
| |
| assertTrue("splitStyledListItemTest 3: incorrect number of children after split", listCopy.numChildren == 2); |
| p1 = (listCopy.getChildAt(0) as FlowGroupElement).getChildAt(0) as ParagraphElement; |
| p2 = (listCopy.getChildAt(1) as FlowGroupElement).getChildAt(0) as ParagraphElement; |
| |
| assertTrue("splitStyledListItemTest 3: p1 is incorrect after split", p1 && TextLayoutFormat.isEqual(p.format, p1.format) && p1.numChildren == 1); |
| assertTrue("splitStyledListItemTest 3: p2 is incorrect after split", p2 && TextLayoutFormat.isEqual(p.format, p2.format) && p2.numChildren == 1); |
| |
| s1 = p1.getChildAt(0) as SpanElement; |
| s2 = p2.getChildAt(0) as SpanElement; |
| |
| assertTrue("splitStyledListItemTest 3: s1 is incorrect after split", s1 && TextLayoutFormat.isEqual(s.format, s1.format)); |
| assertTrue("splitStyledListItemTest 3: s2 is incorrect after split", s2 && TextLayoutFormat.isEqual(s.format, s2.format)); |
| |
| // END SPLIT IN MIDDLE TEST |
| } |
| |
| [Test] |
| [Ignore] |
| public function spanElementReplaceTextInvalidPos():void |
| { |
| SelManager.selectAll(); |
| SelManager.deleteText(); |
| |
| var paragraph:ParagraphElement = new ParagraphElement(); |
| var span:SpanElement = new SpanElement; |
| |
| span.text = "Does this text flow need to be composed?"; |
| paragraph.addChild(span); |
| SelManager.textFlow.addChild(paragraph); |
| SelManager.textFlow.flowComposer.updateAllControllers(); |
| span.replaceText(5, 9, "your"); |
| if (SelManager.textFlow.flowComposer.getControllerAt(0).isDamaged()) |
| { |
| span.text += " Yes it does."; |
| } |
| |
| //try to replace text at start point <0, should return error |
| try |
| { |
| span.replaceText(-1, 2, "your"); |
| } catch (e:Error) |
| { |
| assertTrue("replaceText should return error.", e.message == "Invalid positions passed to SpanElement.replaceText"); |
| } |
| //try to replace text at end point > text Length, should return error |
| try |
| { |
| var len:int = SelManager.textFlow.textLength; |
| span.replaceText(5, len + 1, "your"); |
| } catch (e:Error) |
| { |
| assertTrue("replaceText should return error.", e.message == "Invalid positions passed to SpanElement.replaceText"); |
| } |
| //try to replace text when end point < start point, should return error |
| try |
| { |
| span.replaceText(5, 3, "your"); |
| } catch (e:Error) |
| { |
| assertTrue("replaceText should return error.", e.message == "Invalid positions passed to SpanElement.replaceText"); |
| } |
| SelManager.textFlow.flowComposer.updateAllControllers(); |
| } |
| |
| [Test] |
| public function copyErrorMassageTest():void |
| { |
| SelManager.selectAll(); |
| SelManager.deleteText(); |
| |
| var p:ParagraphElement = new ParagraphElement(); |
| var span1:SpanElement = new SpanElement(); |
| var span2:SpanElement = new SpanElement(); |
| span1.text = "1水z𝄞#####%23456789"; //character 水z𝄞 to make badSurrogatePairCopy error |
| |
| try |
| { |
| span2 = span1.shallowCopy(7, 6) as SpanElement; |
| } catch (e:Error) |
| { |
| assertTrue("Invalid error message for badShallowCopyRange", e.message = "Bad range in shallowCopy"); |
| } |
| try |
| { |
| span2 = span1.shallowCopy(2, 4) as SpanElement; |
| } catch (e:Error) |
| { |
| assertTrue("Invalid error message for badSurrogatePairCopy", e.message = "Copying only half of a surrogate pair in SpanElement.shallowCopy"); |
| } |
| p.fontSize = 20; |
| p.addChild(span1); |
| p.addChild(span2); |
| |
| SelManager.textFlow.addChild(p); |
| SelManager.textFlow.flowComposer.updateAllControllers(); |
| } |
| |
| [Test] |
| public function applyFormatToElementOperationFormatTest():void |
| { |
| var tf:TextFlow = SelManager.textFlow; |
| var styleName:String = "userStyleName"; |
| var newStyleValue:String = "newUserStyleValue"; |
| var format:TextLayoutFormat = new TextLayoutFormat(); |
| format.fontSize = 10; |
| format.setStyle(styleName, newStyleValue); |
| var op:ApplyFormatToElementOperation = new ApplyFormatToElementOperation(SelManager.getSelectionState(), tf, format); |
| //test format setter |
| format.fontSize = 20; |
| op.format = format; |
| SelManager.doOperation(op); |
| //test format getter |
| assertTrue("format font size is not set correctly", op.format.fontSize == 20 && |
| tf.getStyle(styleName) == "newUserStyleValue"); |
| } |
| |
| [Test] |
| public function typeNameSetGetTest():void |
| { |
| var tf:TextFlow = SelManager.textFlow; |
| var newTypeName:String = "newTFTypeName1"; |
| |
| var op:ApplyElementTypeNameOperation = new ApplyElementTypeNameOperation(SelManager.getSelectionState(), tf, newTypeName); |
| op.typeName = "newTFTypeName2"; |
| SelManager.doOperation(op); |
| assertTrue("ApplyElementTypeNameOperation doesn't set or get correct typeName", op.typeName == "newTFTypeName2"); |
| } |
| } |
| } |