/* * 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.validator; import java.io.ByteArrayInputStream; import java.io.InputStream; import org.junit.Before; import org.junit.Test; import org.xwiki.validator.ValidationError.Type; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; public class HTML5DutchWebGuidelinesValidatorTest { private HTML5DutchWebGuidelinesValidator validator; @Before public void setUp() throws Exception { this.validator = new HTML5DutchWebGuidelinesValidator(); } private void setValidatorDocument(InputStream document) throws Exception { this.validator.setHTML5Document(document); } private void setValidatorDocument(String content) throws Exception { this.validator.setHTML5Document(new ByteArrayInputStream(content.getBytes("UTF-8"))); if (this.validator.getHTML5Document() != null) { this.validator.clear(); } } private String getErrors(HTML5DutchWebGuidelinesValidator validator) { StringBuffer buffer = new StringBuffer(); for (ValidationError error : validator.getErrors()) { buffer.append(error + "\n"); } return buffer.toString(); } private boolean isValid(HTML5DutchWebGuidelinesValidator validator) { boolean isValid = true; for (ValidationError error : validator.getErrors()) { if (error.getType() != Type.WARNING) { isValid = false; } } return isValid; } // All @Test public void testValidate() throws Exception { setValidatorDocument(getClass().getResourceAsStream("/html5-valid.html")); this.validator.validate(); for (ValidationError error : this.validator.getErrors()) { System.err.println(error); } assertTrue(getErrors(this.validator), isValid(this.validator)); } // RPD 1s3 @Test public void testRpd1s3LinkValid() throws Exception { setValidatorDocument("<a href='test'>test</a>"); this.validator.validateRpd1s3(); assertTrue(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd1s3LinkJavascript() throws Exception { setValidatorDocument("<a href='javascript:'>test</a>"); this.validator.validateRpd1s3(); assertFalse(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd1s3LinkEventHandlers() throws Exception { setValidatorDocument("<a href='' onclick=''></a>"); this.validator.validateRpd1s3(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<a href='#' onclick=''></a>"); this.validator.validateRpd1s3(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<a href='test' onclick=''></a>"); this.validator.validateRpd1s3(); assertTrue(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd1s3FormValidInput() throws Exception { setValidatorDocument("<form><fieldset><input type='submit' /></fieldset></form>"); this.validator.validateRpd1s3(); assertTrue(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd1s3FormValidSubmitButton() throws Exception { setValidatorDocument("<form><fieldset><button type='submit'>Go</button></fieldset></form>"); this.validator.validateRpd1s3(); assertTrue(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<form><fieldset><button>Go</button></fieldset></form>"); this.validator.validateRpd1s3(); assertTrue(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd1s3FormInvalidImageInput() throws Exception { setValidatorDocument("<form><fieldset><input type='image' alt='' /></fieldset></form>"); this.validator.validateRpd1s3(); assertFalse(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd1s3FormValidImageInput() throws Exception { setValidatorDocument("<form><fieldset><input type='image' alt='submit' /></fieldset></form>"); this.validator.validateRpd1s3(); assertTrue(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd1s3FormNoSubmit() throws Exception { setValidatorDocument("<form></form>"); this.validator.validateRpd1s3(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<form><fieldset><input type='text' /></fieldset></form>"); this.validator.validateRpd1s3(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<form><fieldset><button type='reset'>Reset</button></fieldset></form>"); this.validator.validateRpd1s3(); assertFalse(getErrors(this.validator), isValid(this.validator)); } // RPD 2s3 @Test public void testRpd2s3NoDoctype() throws Exception { setValidatorDocument("<html></html>"); this.validator.validateRpd2s3(); // There is no doctype in HTML5 assertTrue(getErrors(this.validator), isValid(this.validator)); } // RPD 2s4 @Test public void testRpd2s4NoDoctype() throws Exception { setValidatorDocument("<html></html>"); this.validator.validateRpd2s4(); // Not valid in HTML5 assertTrue(getErrors(this.validator), isValid(this.validator)); } // RPD 2s5 @Test public void testRpd2s5ValidDoctype() throws Exception { setValidatorDocument("<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' " + "'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'><html></html>"); this.validator.validateRpd2s5(); assertTrue(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd2s5FramesetDoctype() throws Exception { // JSoup does not handle the doctype. } @Test public void testRpd2s5FramesetTag() throws Exception { // JSoup does not handle the <frameset> tag } @Test public void testRpd2s5FrameTag() throws Exception { // JSoup does not handle <frame> tags } // RPD 3s1 @Test public void testRpd3s1BoldMarkup() throws Exception { setValidatorDocument("<p><b></b></p>"); this.validator.validateRpd3s1(); assertFalse(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd3s1ItalicMarkup() throws Exception { setValidatorDocument("<p><i></i></p>"); this.validator.validateRpd3s1(); assertFalse(getErrors(this.validator), isValid(this.validator)); } // RPD 3s2 @Test public void testRpd3s2NoHeading() throws Exception { setValidatorDocument("<body></body>"); this.validator.validateRpd3s2(); assertFalse(getErrors(this.validator), isValid(this.validator)); } // RPD 3s3 @Test public void testRpd3s3HeadingsValid() throws Exception { setValidatorDocument("<body><h1></h1><h2></h2><h2></h2><h3></h3></body>"); this.validator.validateRpd3s3(); assertTrue(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd3s3HeadingsMissingLevel() throws Exception { setValidatorDocument("<body><h1></h1><h3></h3></body>"); this.validator.validateRpd3s3(); assertFalse(getErrors(this.validator), isValid(this.validator)); } // RPD 3s4 @Test public void testRpd3s4ValidParagraphs() throws Exception { setValidatorDocument("<body><p>content<br/>content<br/>content<br/></p>" + "<p>content<br/>content<br/>content<br/></p><p>content<br/>content<br/>content<br/></p></body>"); this.validator.validateRpd3s4(); assertTrue(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd3s4MissingParagraph() throws Exception { // Consecutive line breaks. setValidatorDocument("<body><p>content<br/><br/>content</p></body>"); this.validator.validateRpd3s4(); assertFalse(getErrors(this.validator), isValid(this.validator)); // Consecutive line breaks separated by white spaces. setValidatorDocument("<body><p>content<br/> <br/>content</p></body>"); this.validator.validateRpd3s4(); assertFalse(getErrors(this.validator), isValid(this.validator)); } // RPD 3s5 @Test public void testRpd3s5InvalidMarkup() throws Exception { setValidatorDocument("<body><p><b>bold</b></p></body>"); this.validator.validateRpd3s5(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body><p><i>italic</i></p></body>"); this.validator.validateRpd3s5(); assertFalse(getErrors(this.validator), isValid(this.validator)); } // RPD 3s9 @Test public void testRpd3s9Sub() throws Exception { setValidatorDocument("<body><p><sub>sub</sub></p></body>"); this.validator.validateRpd3s9(); assertFalse(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd3s9Sup() throws Exception { setValidatorDocument("<body><p><sup>sup</sup></p></body>"); this.validator.validateRpd3s9(); assertFalse(getErrors(this.validator), isValid(this.validator)); } // RPD 3s11 @Test public void testRpd3s11Quotation() throws Exception { setValidatorDocument("<body><p><q>quotation</q></p></body>"); this.validator.validateRpd3s11(); assertFalse(getErrors(this.validator), isValid(this.validator)); } // RPD 3s13 @Test public void testRpd3s13BulletList() throws Exception { //ToDo: difficult to do with JSoup /* setValidatorDocument("<body> * item1<br/> * item2 <br/> * item3</body>"); this.validator.validateRpd3s13(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body>*item1<br/>*item2<br/>*item3</body>"); this.validator.validateRpd3s13(); assertFalse(getErrors(this.validator), isValid(this.validator));*/ } @Test public void testRpd3s13DashList() throws Exception { //ToDo: difficult to do with JSoup /* setValidatorDocument("<body> - item1<br/> - item2 <br/> - item3</body>"); this.validator.validateRpd3s13(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body>-item1<br/>-item2 <br/>-item3</body>"); this.validator.validateRpd3s13(); assertFalse(getErrors(this.validator), isValid(this.validator)); */ } @Test public void testRpd3s13NumberedList() throws Exception { //ToDo: difficult to do with JSoup /* setValidatorDocument("<body> 1. item1<br/> 2. item2 <br/> 3. item3</body>"); this.validator.validateRpd3s13(); assertFalse(getErrors(validator), isValid(validator)); setValidatorDocument("<body>1.item1<br/>2.item2<br/>3.item3</body>"); this.validator.validateRpd3s13(); assertFalse(getErrors(this.validator), isValid(this.validator));*/ } @Test public void testRpd6s1Doctypes() throws Exception { setValidatorDocument("<!DOCTYPE html><html></html>"); this.validator.validateRpd6s1(); assertTrue(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' " + "'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'><html></html>"); this.validator.validateRpd6s1(); assertFalse(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd7s1ValidAlts() throws Exception { setValidatorDocument("<body><img alt='' /></body>"); this.validator.validateRpd7s1(); assertTrue(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body><area alt='' /></body>"); this.validator.validateRpd7s1(); assertTrue(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body><input alt='' type='image' /></body>"); this.validator.validateRpd7s1(); assertTrue(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd7s1MissingAlts() throws Exception { setValidatorDocument("<body><img /></body>"); this.validator.validateRpd7s1(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body><area /></body>"); this.validator.validateRpd7s1(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body><input type='image' /></body>"); this.validator.validateRpd7s1(); assertFalse(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd7s4ImagesInLinks() throws Exception { setValidatorDocument("<body><a><img alt=''/></a></body>"); this.validator.validateRpd7s4(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body><a><img alt=''/>text</a></body>"); this.validator.validateRpd7s4(); assertTrue(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body><a><img alt='text' /></a></body>"); this.validator.validateRpd7s4(); assertTrue(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd7s5ImageMaps() throws Exception { setValidatorDocument("<body><img alt='' usemap='#map' /></body>"); this.validator.validateRpd7s5(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body><img alt='text' usemap='#map' /><map name='map'><area alt='' /></map></body>"); this.validator.validateRpd7s5(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body><img alt='text' usemap='#map' /><map name='map'><area alt='text' /></map></body>"); this.validator.validateRpd7s5(); assertTrue(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd8s1Links() throws Exception { setValidatorDocument("<body><a>to get the resource, click here</a></body>"); this.validator.validateRpd8s1(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body><a>resource</a></body>"); this.validator.validateRpd8s1(); assertTrue(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd8s11Accesskeys() throws Exception { setValidatorDocument("<body><a accesskey='a'></a></body>"); this.validator.validateRpd8s11(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body><a accesskey='8'></a></body>"); this.validator.validateRpd8s11(); assertTrue(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd8s14Links() throws Exception { setValidatorDocument("<body><a target='any'></a></body>"); this.validator.validateRpd8s14(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body><a onclick='window.open'></a></body>"); this.validator.validateRpd8s14(); assertFalse(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd8s16Links() throws Exception { setValidatorDocument("<body><a href='mailto:text@text.com?subject=foobar'>text@text.com</a></body>"); this.validator.validateRpd8s16(); assertTrue(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body><a href='mailto:text@text.com'>mail</a></body>"); this.validator.validateRpd8s16(); assertFalse(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd8s17Links() throws Exception { setValidatorDocument("<body><a href='mailto:text@text.com?subject=foobar'>text@text.com</a></body>"); this.validator.validateRpd8s17(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body><a href='mailto:text@text.com'>text@text.com</a></body>"); this.validator.validateRpd8s17(); assertTrue(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd9s1StyleAttr() throws Exception { setValidatorDocument("<body><div style='test'></div></body>"); this.validator.validateRpd9s1(); assertFalse(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd9s1StyleTag() throws Exception { setValidatorDocument("<body><style></style></body>"); this.validator.validateRpd9s1(); assertFalse(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd11s2Table() throws Exception { setValidatorDocument("<body><table></table></body>"); this.validator.validateRpd11s2(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body><table><th/></table></body>"); this.validator.validateRpd11s2(); assertTrue(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd11s4Table() throws Exception { setValidatorDocument("<body><table><th/><th/></table></body>"); this.validator.validateRpd11s4(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body><table><th scope=''/></table></body>"); this.validator.validateRpd11s4(); assertTrue(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body><table><th id='a' /><td headers='a'/></table></body>"); this.validator.validateRpd11s4(); assertTrue(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd11s5Table() throws Exception { setValidatorDocument("<body><table><th/><th/></table></body>"); this.validator.validateRpd11s5(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body><table><th scope=''/></table></body>"); this.validator.validateRpd11s5(); assertTrue(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body><table><th id='a' /><td headers='a'/></table></body>"); this.validator.validateRpd11s5(); assertTrue(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd12s1Iframe() throws Exception { setValidatorDocument("<body><iframe/></body>"); this.validator.validateRpd12s1(); assertFalse(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd13s1Label() throws Exception { setValidatorDocument("<body><form><input name='test' /></form></body>"); this.validator.validateRpd13s1(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body><form><input name='test' id='test' /></form></body>"); this.validator.validateRpd13s1(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body><form><label /><input name='test' id='test' /></form></body>"); this.validator.validateRpd13s1(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body><form><label for='test' /><input name='test' id='test' /><input type='button'/></form></body>"); this.validator.validateRpd13s1(); assertTrue(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body><form><label for='test' /><input name='test' id='test' /><input type='button'/>" + "<input type='hidden' /><input type='image' /><input type='reset' /><input type='submit' /></form></body>"); this.validator.validateRpd13s1(); assertTrue(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd13s4Submits() throws Exception { setValidatorDocument("<body><form><input name='test' /></form></body>"); this.validator.validateRpd13s4(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body><form><fieldset><input name='test' /><input type='submit' /></fieldset></form></body>"); this.validator.validateRpd13s4(); assertTrue(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<body><form><input name='test' /></form></body>"); this.validator.validateRpd13s4(); assertFalse(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd13s18Reset() throws Exception { setValidatorDocument("<body><form><input type='reset' /></form></body>"); this.validator.validateRpd13s18(); assertFalse(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd15s6Language() throws Exception { setValidatorDocument("<html></html>"); this.validator.validateRpd15s6(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<html lang='en'></html>"); this.validator.validateRpd15s6(); assertTrue(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd16s1Charset() throws Exception { setValidatorDocument("<html><head></head></html>"); this.validator.validateRpd16s1(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<html><head><meta http-equiv='Content-Type' content='text/html; charset=foo' /></head></html>"); this.validator.validateRpd16s1(); assertTrue(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd16s2Charset() throws Exception { setValidatorDocument("<html><head></head></html>"); this.validator.validateRpd16s2(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<html><head>" + "<meta http-equiv='Content-Type' content='text/html; charset=foo' /></head></html>"); this.validator.validateRpd16s2(); assertFalse(getErrors(this.validator), isValid(this.validator)); } @Test public void testRpd16s4CharsetPosition() throws Exception { setValidatorDocument("<html><head><meta/>" + "<meta http-equiv='Content-Type' content='text/html; charset=foo' /></head></html>"); this.validator.validateRpd16s4(); assertFalse(getErrors(this.validator), isValid(this.validator)); setValidatorDocument("<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8' /><meta/></head></html>"); this.validator.validateRpd16s4(); assertTrue(getErrors(this.validator), isValid(this.validator)); } }