/*
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.xwiki.gwt.dom.client;
import com.google.gwt.dom.client.Node;
/**
* Unit tests for {@link Range}.
*
* @version $Id: 8e8dd65ea3bceffe6ffc0d8d52ca53e88ecc7c81 $
*/
public class RangeTest extends DOMTestCase
{
/**
* Unit test for {@link Range#toHTML()}.
*/
public void testToHTML()
{
getContainer().setInnerHTML("<strong>aa</strong>b<em>cc</em>");
Range range = getDocument().createRange();
range.setStart(getContainer().getFirstChild().getFirstChild(), 1);
range.setEnd(getContainer().getLastChild().getFirstChild(), 1);
assertEquals("<strong>a</strong>b<em>c</em>", range.toHTML().toLowerCase());
}
/**
* Unit test for {@link Range#extractContents()}.
*/
public void testExtractContents()
{
getContainer().setInnerHTML("ab<em>c</em><span>d<del><!--x-->ef</del></span>");
Range range = getDocument().createRange();
range.setStart(getContainer().getFirstChild(), 1);
range.setEnd(getContainer().getLastChild().getLastChild().getLastChild(), 2);
Node span = getContainer().getLastChild();
Node em = getContainer().getChildNodes().getItem(1);
Node comment = getContainer().getLastChild().getLastChild().getFirstChild();
DocumentFragment extract = range.extractContents();
assertTrue(range.isCollapsed());
assertEquals("a<span><del></del></span>", getContainer().getInnerHTML().toLowerCase());
assertEquals("b<em>c</em><span>d<del><!--x-->ef</del></span>", extract.getInnerHTML().toLowerCase());
assertEquals(em, extract.getChildNodes().getItem(1));
assertEquals(comment, extract.getLastChild().getLastChild().getFirstChild());
assertEquals(span, getContainer().getLastChild());
}
/**
* Unit test for {@link Range#insertNode(Node)}.
*/
public void testInsertNode()
{
getContainer().setInnerHTML("ab<ins>c</ins><strong>d</strong>");
Range range = getDocument().createRange();
range.setStart(getContainer().getFirstChild(), 1);
range.setEnd(getContainer().getFirstChild(), 2);
range.insertNode(getDocument().createTextNode("#"));
assertEquals("#b", range.toString());
range.setEndBefore(getContainer().getLastChild());
assertEquals("#b<ins>c</ins>", range.toHTML().toLowerCase());
range.insertNode(getDocument().createImageElement());
assertEquals("<img>#b<ins>c</ins>", normalizeHTML(range.toHTML()));
}
/**
* Unit test for {@link Range#surroundContents(Node)}.
*/
public void testSurroundContents()
{
getContainer().setInnerHTML("ab<sub>cd</sub>e");
Range range = getDocument().createRange();
range.setStart(getContainer().getFirstChild(), 1);
range.setEnd(getContainer().getChildNodes().getItem(1).getFirstChild(), 1);
try {
range.surroundContents(getDocument().createSpanElement());
fail("The range partially selects a non-Text node.");
} catch (Throwable t) {
assertTrue(t instanceof IllegalStateException);
}
getContainer().setInnerHTML("ab<sup>c</sup>de");
// NOTE: we could reuse the range but IE breaks or throws InvalidArgument exception when we access the fields of
// a DOM node that became orphan/detached after we overwrite the inner HTML of one of its ancestors.
range = getDocument().createRange();
range.setStart(getContainer().getFirstChild(), 1);
range.setEnd(getContainer().getLastChild(), 1);
range.surroundContents(getDocument().createSpanElement());
assertEquals("<span>b<sup>c</sup>d</span>", range.toHTML().toLowerCase());
assertEquals("a<span>b<sup>c</sup>d</span>e", getContainer().getInnerHTML().toLowerCase());
}
}