/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.jsp.ast;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.Test;
public class OpenTagRegisterTest {
private OpenTagRegister tagList;
private int elmId = 0;
@Before
public void newRegister() {
tagList = new OpenTagRegister();
}
/**
* <a> <b> </a>
*/
@Test
public void testSimpleNesting() {
ASTElement elm = element("a");
ASTElement elm2 = element("b");
tagList.openTag(elm);
tagList.openTag(elm2);
tagList.closeTag(elm);
assertFalse(elm.isUnclosed());
assertTrue(elm2.isUnclosed());
}
/**
* <a> <b> <b> </a>
*/
@Test
public void doubleNesting() {
ASTElement elm = element("a");
ASTElement elm2 = element("b");
ASTElement elm3 = element("b");
tagList.openTag(elm);
tagList.openTag(elm2);
tagList.openTag(elm3);
tagList.closeTag(elm);
assertFalse(elm.isUnclosed());
assertTrue(elm2.isUnclosed());
assertTrue(elm3.isUnclosed());
}
/**
* <x> <a> <b> <b> </x> </a> </x>
*/
@Test
public void unopenedTags() {
ASTElement elm = element("x");
ASTElement elm2 = element("a");
ASTElement elm3 = element("b");
ASTElement elm4 = element("b");
tagList.openTag(elm);
tagList.openTag(elm2);
tagList.openTag(elm3);
tagList.openTag(elm4);
tagList.closeTag(elm);
tagList.closeTag(elm2);
tagList.closeTag(elm3);
tagList.closeTag(elm);
assertFalse(elm.isUnclosed());
assertTrue(elm2.isUnclosed());
assertTrue(elm3.isUnclosed());
assertTrue(elm4.isUnclosed());
}
/**
* <x> <a> <b> <b> </z> </a> </x>
*
*/
@Test
public void interleavedTags() {
ASTElement elm = element("x");
ASTElement elm2 = element("a");
ASTElement elm3 = element("b");
ASTElement elm4 = element("b");
ASTElement elm5 = element("z");
tagList.openTag(elm);
tagList.openTag(elm2);
tagList.openTag(elm3);
tagList.openTag(elm4); // open b
tagList.closeTag(elm5); // close z
tagList.closeTag(elm2); // close a
tagList.closeTag(elm); // close x
assertFalse(elm.isUnclosed()); // x is closed
assertFalse(elm2.isUnclosed()); // a is closed
assertTrue(elm3.isUnclosed());
assertTrue(elm4.isUnclosed());
// elm5 ???
}
/**
* <a> <x> <a> <b> <b> </z> </a> </x>
*/
@Test
public void openedIsolatedTag() {
ASTElement a = element("a");
ASTElement x = element("x");
ASTElement a2 = element("a");
ASTElement b = element("b");
ASTElement b2 = element("b");
ASTElement z = element("z");
tagList.openTag(a);
tagList.openTag(x);
tagList.openTag(a2);
tagList.openTag(b);
tagList.openTag(b2);
tagList.closeTag(z); // close z
tagList.closeTag(a2); // close second a
tagList.closeTag(x); // close x
assertTrue(a.isUnclosed()); // first a is unclosed
assertFalse(x.isUnclosed()); // x is closed
assertFalse(a2.isUnclosed()); // a is closed
assertTrue(b.isUnclosed());
assertTrue(b2.isUnclosed());
}
private ASTElement element(String name) {
ASTElement elm = new ASTElement(elmId++);
elm.setName(name);
return elm;
}
}