package com.crawljax.condition;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import com.crawljax.core.state.Identification;
/**
* Since many of the AbstractConditions override equals and hashcode, we provide some test cases for
* them.
*/
@RunWith(Parameterized.class)
public class ConditionTest {
Condition self;
Condition equivalent;
Condition different1;
Condition different2;
/**
* @param _self
* We compare equivalence against self.
* @param _equivalent
* This condition should be equivalent.
* @param _different1
* This one should be different -- typically different arguments
* @param _different2
* This one should be different -- same arguments, different constructor
*/
public ConditionTest(Condition _self, Condition _equivalent, Condition _different1,
Condition _different2) {
this.self = _self;
this.equivalent = _equivalent;
this.different1 = _different1;
this.different2 = _different2;
}
@Parameters(name = "c{index}, {1}")
public static Collection<Object[]> data() {
return Arrays
.asList(new Object[][] {
{
new RegexCondition("rx0"),
new RegexCondition("rx0"),
new RegexCondition("rx1"),
new UrlCondition("rx0")
},
{
new NotRegexCondition("nrx0"),
new NotRegexCondition("nrx0"),
new NotRegexCondition("nrx1"),
Logic.and(new RegexCondition("nrx0"))
},
{
new UrlCondition("u0"),
new UrlCondition("u0"),
new UrlCondition("u1"),
new JavaScriptCondition("u0")
},
{
new NotUrlCondition("u0"),
new NotUrlCondition("u0"),
new NotUrlCondition("u1"),
Logic.and(new UrlCondition("u0"))
},
{
new XPathCondition("x0"),
new XPathCondition("x0"),
new XPathCondition("x1"),
new JavaScriptCondition("x0")
},
{
new NotXPathCondition("x0"),
new NotXPathCondition("x0"),
new NotXPathCondition("x1"),
Logic.and(new XPathCondition("x0"))
},
{
new VisibleCondition(new Identification(Identification.How.xpath,
"xp0")),
new VisibleCondition(new Identification(Identification.How.xpath,
"xp0")),
new VisibleCondition(new Identification(Identification.How.tag,
"xp0")),
new VisibleCondition(new Identification(Identification.How.xpath,
"xp1"))
},
{
new NotVisibleCondition(new Identification(
Identification.How.xpath, "xp")),
new NotVisibleCondition(new Identification(
Identification.How.xpath, "xp")),
new NotVisibleCondition(new Identification(
Identification.How.tag, "xp")),
Logic.and(new VisibleCondition(new Identification(
Identification.How.xpath, "xp")))
},
{
new JavaScriptCondition("0"),
new JavaScriptCondition("0"),
new JavaScriptCondition("1"),
new UrlCondition("0")
},
{
Logic.not(new UrlCondition("u0")),
Logic.not(new UrlCondition("u0")),
Logic.not(new UrlCondition("u1")),
Logic.and(new UrlCondition("u0"))
},
{
Logic.and(new JavaScriptCondition("js0")),
Logic.and(new JavaScriptCondition("js0")),
Logic.and(new JavaScriptCondition("js1")),
Logic.not(new JavaScriptCondition("js0"))
},
{
Logic.nand(new JavaScriptCondition("js0")),
Logic.nand(new JavaScriptCondition("js0")),
Logic.nand(new JavaScriptCondition("js1")),
Logic.and(new JavaScriptCondition("js0"))
},
{
Logic.or(new JavaScriptCondition("js0")),
Logic.or(new JavaScriptCondition("js0")),
Logic.or(new JavaScriptCondition("js1")),
Logic.and(new JavaScriptCondition("js0"))
},
{
new CountCondition(2, new JavaScriptCondition("js0")),
new CountCondition(2, new JavaScriptCondition("js0")),
new CountCondition(2, new JavaScriptCondition("js1")),
new CountCondition(1, new JavaScriptCondition("js0"))
}
});
}
@Test
public void testEquality() {
// Structurally equivalent, symmetrical.
assertEquals(self, equivalent);
assertEquals(equivalent, self);
// Same type, different content, symmetrical.
assertNotEquals(self, different1);
assertNotEquals(different1, self);
// Different types
assertNotEquals(self, null);
assertNotEquals(self, different2);
// Reflexive.
assertEquals(self, self);
}
@Test
public void testToString() {
assertEquals(self.toString(), equivalent.toString());
assertNotEquals(self.toString(), different1.toString());
assertNotEquals(self.toString(), different2.toString());
}
@Test
public void testHashCode() {
assertEquals(self.hashCode(), equivalent.hashCode());
assertNotEquals(self.hashCode(), different1.hashCode());
assertNotEquals(self.hashCode(), different2.hashCode());
}
}