package com.crawljax.oracle; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.junit.Test; import com.crawljax.oraclecomparator.Comparator; import com.crawljax.oraclecomparator.comparators.AttributeComparator; import com.crawljax.oraclecomparator.comparators.DateComparator; import com.crawljax.oraclecomparator.comparators.EditDistanceComparator; import com.crawljax.oraclecomparator.comparators.PlainStructureComparator; import com.crawljax.oraclecomparator.comparators.RegexComparator; import com.crawljax.oraclecomparator.comparators.ScriptComparator; import com.crawljax.oraclecomparator.comparators.SimpleComparator; import com.crawljax.oraclecomparator.comparators.StyleComparator; import com.crawljax.oraclecomparator.comparators.XPathExpressionComparator; public class OracleTest { private void compareTwoDomsWithComparatorEqual(String original, String newDom, Comparator comparator) { assertTrue(comparator.isEquivalent(original, newDom)); } private void compareTwoDomsWithComparatorNotEqual(String original, String newDom, Comparator comparator) { assertFalse(comparator.isEquivalent(original, newDom)); } @Test public void testDateOracle() { Comparator oracle = new DateComparator(); /* dates with days */ compareTwoDomsWithComparatorEqual("<HTML>Monday 15 march 1998</HTML>", "<HTML>Tuesday 13 december 2005</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML>Monday 1 feb '98</HTML>", "<HTML>Wednesday 15 march '00</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML>Friday 10 february</HTML>", "<HTML>Wednesday 3 march</HTML>", oracle); /* dates only numeric */ compareTwoDomsWithComparatorEqual("<HTML>28-12-1983</HTML>", "<HTML>15-3-1986</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML>28.1.1976</HTML>", "<HTML>3.15.1986</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML>1/1/2001</HTML>", "<HTML>30/12/1988</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML>28-12-1983</HTML>", "<HTML>19-2-1986</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML>28.1.1976</HTML>", "<HTML>3.15.1986</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML>1/1/2001</HTML>", "<HTML>30/12/1988</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML>28-12-'83</HTML>", "<HTML>19-1-'86</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML>28.1.'76</HTML>", "<HTML>3.15.'86</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML>1/1/'01</HTML>", "<HTML>30/12/'88</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML>2003-16-03</HTML>", "<HTML>1986-3-3</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML>1993.12.12</HTML>", "<HTML>1997.13.09</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML>2013/1/3</HTML>", "<HTML>1986/3/3</HTML>", oracle); /* dates with long months */ compareTwoDomsWithComparatorEqual("<HTML>19 november 1986</HTML>", "<HTML>18 june 1973</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML>1th march 1986</HTML>", "<HTML>28th december 2005</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML>15th november</HTML>", "<HTML>3th july</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML>2003 March 15</HTML>", "<HTML>1978 july 5</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML>2003Apr15</HTML>", "<HTML>1978jul5</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML>March 2003</HTML>", "<HTML>October 1996</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML>April '02</HTML>", "<HTML>August '99</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML>April 19 2007</HTML>", "<HTML>January 1 1994</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML>April 19, 2007</HTML>", "<HTML>January 1, 1994</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML>April 4 '07</HTML>", "<HTML>January 1 '87</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML>April 19, '66</HTML>", "<HTML>January 1, '88</HTML>", oracle); /* time */ compareTwoDomsWithComparatorEqual("<HTML>4:47:00 am</HTML>", "<HTML>3:59:2PM</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML>2:13pm</HTML>", "<HTML>3:59am</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML>14:17:29</HTML>", "<HTML>7:34:26</HTML>", oracle); } @Test public void testStyleOracle() { Comparator oracle = new StyleComparator(); /* IGNORE_TAGS */ compareTwoDomsWithComparatorEqual("<HTML><B>foo</B></HTML>", "<HTML>foo</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML><PRE>foo</PRE></HTML>", "<HTML><STRONG>foo</STRONG></HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML><FONT color=\"red\">foo</FONT> bar</HTML>", "<HTML>foo bar</HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML><FONT color=\"red\">foo</FONT> bar</HTML>", "<HTML><FONT color=\"green\">foo</FONT> bar</HTML>", oracle); /* IGNORE_ATTRIBUTES */ compareTwoDomsWithComparatorEqual("<HTML><SPAN width=\"100px\">foo</SPAN></HTML>", "<HTML><SPAN>foo</SPAN></HTML>", oracle); compareTwoDomsWithComparatorEqual("<HTML><SPAN>foo</SPAN></HTML>", "<HTML><SPAN valign=\"top\">foo</SPAN></HTML>", oracle); /* STYLE ATTRIBUTES */ compareTwoDomsWithComparatorEqual( "<HTML><SPAN style=\"color: green;\">foo</SPAN></HTML>", "<HTML><SPAN style=\"color:red;\">foo</SPAN></HTML>", oracle); compareTwoDomsWithComparatorEqual( "<HTML><SPAN style=\"color: yellow\">foo</SPAN></HTML>", "<HTML><SPAN>foo</SPAN></HTML>", oracle); compareTwoDomsWithComparatorEqual( "<HTML><SPAN style=\"display:inline;color:red;\">foo</SPAN></HTML>", "<HTML><SPAN style=\"display:inline; color:green;\">foo</SPAN></HTML>", oracle); compareTwoDomsWithComparatorNotEqual( "<HTML><SPAN style=\"display:inline;color:red;\">foo</SPAN></HTML>", "<HTML><SPAN style=\"display:none; color:green;\">foo</SPAN></HTML>", oracle); } @Test public void testSimpleOracle() { Comparator oracle = new SimpleComparator(); compareTwoDomsWithComparatorEqual("<HTML>\n\n<SPAN>\n foo\n</SPAN></HTML>", "<HTML>\n<SPAN>\n foo \n\n</SPAN>\n</HTML>", oracle); } @Test public void testRegexOracle() { Comparator oracle = new RegexComparator("[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}"); compareTwoDomsWithComparatorEqual("<HTML>192.168.1.1</HTML>", "<HTML>10.0.0.138</HTML>", oracle); } @Test public void testAttributeOracle() { String control = "<HTML><A href=\"foo.html\" myattr=\"true\">foo</A><HTML>"; String test = "<HTML><A href=\"foo.html\" myattr=\"false\">foo</A><HTML>"; compareTwoDomsWithComparatorEqual(control, test, new AttributeComparator("myattr")); } @Test public void testPlainStructureOracle() { String control = "<HTML><A href=\"foo.html\" jquery12421421=\"bla\" myattr=\"true\">foo</A><HTML>"; String test = "<HTML><A></A><HTML>"; compareTwoDomsWithComparatorEqual(control, test, new PlainStructureComparator(true)); } @Test public void testScriptComparator() { String control = "<HTML><head><script>JavaScript();</script><title>Test</title></head><body><script>JavaScript23();</script>test</body><HTML>"; String test = "<HTML><head><title>Test</title></head><body>test</body><HTML>"; compareTwoDomsWithComparatorEqual(control, test, new ScriptComparator()); } @Test public void testEditDistanceComparator() { String control = "<HTML><head><title>Test</title></head><body>test</body><HTML>"; String test = "<HTML><head><title>Test</title></head><body>test</body><HTML>"; assertTrue(control.equals(test)); compareTwoDomsWithComparatorEqual(control, test, new EditDistanceComparator(0)); compareTwoDomsWithComparatorEqual(control, test, new EditDistanceComparator(1)); test = "TheIsAlotOfRubish"; compareTwoDomsWithComparatorNotEqual(control, test, new EditDistanceComparator(1)); compareTwoDomsWithComparatorEqual(control, test, new EditDistanceComparator(0)); // We miss the title test = "<HTML><head></head><body>test</body><HTML>"; Comparator oracle = new EditDistanceComparator(0.5); compareTwoDomsWithComparatorEqual(control, test, oracle); compareTwoDomsWithComparatorNotEqual(control, test, new EditDistanceComparator(1)); compareTwoDomsWithComparatorEqual(control, test, new EditDistanceComparator(0)); } @Test public void testXPathExpressionComparator() { String control = "<HTML><head><title>Test</title></head><body>test</body><HTML>"; String test = "<HTML><head><title>Test</title></head><body>test</body><HTML>"; assertTrue(control.equals(test)); XPathExpressionComparator oracle = new XPathExpressionComparator(); compareTwoDomsWithComparatorEqual(control, test, oracle); compareTwoDomsWithComparatorEqual(control, test, new XPathExpressionComparator()); test = "<HTML><head><title>Test</title></head><body>test<div id='ignoreme'>" + "ignoreme</div></body><HTML>"; compareTwoDomsWithComparatorNotEqual(control, test, oracle); compareTwoDomsWithComparatorNotEqual(control, test, new XPathExpressionComparator()); oracle = new XPathExpressionComparator("//*[@id='ignoreme']"); compareTwoDomsWithComparatorEqual(control, test, oracle); compareTwoDomsWithComparatorEqual(test, control, oracle); control = "<HTML><head><title>Test</title></head><body>test<div id='ignoreme'>" + "ignoreme123</div></body><HTML>"; compareTwoDomsWithComparatorEqual(control, test, oracle); compareTwoDomsWithComparatorEqual(test, control, oracle); } }