View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  
20  package org.apache.myfaces.tobago.util;
21  
22  import org.apache.myfaces.tobago.internal.util.HtmlWriterHelper;
23  import org.junit.jupiter.api.Assertions;
24  import org.junit.jupiter.api.Test;
25  
26  import java.io.CharArrayWriter;
27  import java.io.IOException;
28  import java.nio.charset.StandardCharsets;
29  
30  public class HtmlWriterHelperUnitTest {
31  
32    // some chars must escaped in attribute values other than in text
33    // put them at beginning of raw texts and in both escaped texts
34  
35    // HTML 4.0, section B.7.1: ampersands followed by
36    // an open brace don't get escaped
37    private static final String[] RAW_TEXTS = {
38        "oeffnende spitze klammern werden in attributen doch escaped <tagname >",
39        "& followed by an { -> &{ don't get escaped in attributes",
40        "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",
41        "\u00a0\u00a1\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af",
42        "\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf",
43        "\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf",
44        "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u00dd\u00de\u00df",
45        "\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef",
46        "\u00f0\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u00fd\u00fe\u00ff"
47  
48    };
49    private static final String[] ESCAPED_TEXTS = {
50        "oeffnende spitze klammern werden in attributen doch escaped &lt;tagname &gt;",
51        "&amp; followed by an { -&gt; &amp;{ don&#x27;t get escaped in attributes",
52        RAW_TEXTS[2], // no escape needed
53        "&nbsp;&iexcl;&cent;&pound;&curren;&yen;&brvbar;&sect;&uml;&copy;&ordf;&laquo;&not;&shy;&reg;&macr;",
54        "&deg;&plusmn;&sup2;&sup3;&acute;&micro;&para;&middot;&cedil;&sup1;&ordm;&raquo;&frac14;&frac12;"
55            + "&frac34;&iquest;",
56        "&Agrave;&Aacute;&Acirc;&Atilde;&Auml;&Aring;&AElig;&Ccedil;&Egrave;&Eacute;&Ecirc;&Euml;&Igrave;&Iacute;"
57            + "&Icirc;&Iuml;",
58        "&ETH;&Ntilde;&Ograve;&Oacute;&Ocirc;&Otilde;&Ouml;&times;&Oslash;&Ugrave;&Uacute;&Ucirc;&Uuml;&Yacute;"
59            + "&THORN;&szlig;",
60        "&agrave;&aacute;&acirc;&atilde;&auml;&aring;&aelig;&ccedil;&egrave;&eacute;&ecirc;&euml;&igrave;&iacute;"
61            + "&icirc;&iuml;",
62        "&eth;&ntilde;&ograve;&oacute;&ocirc;&otilde;&ouml;&divide;&oslash;&ugrave;&uacute;&ucirc;&uuml;&yacute;"
63            + "&thorn;&yuml;"
64    };
65  
66    private static final String[] ESCAPED_ATTRIBUTES = {
67        ESCAPED_TEXTS[0], // same as in texts
68        "&amp; followed by an { -&gt; &{ don&#x27;t get escaped in attributes",
69        ESCAPED_TEXTS[2], // same as in texts
70        ESCAPED_TEXTS[3], // same as in texts
71        ESCAPED_TEXTS[4], // same as in texts
72        ESCAPED_TEXTS[5], // same as in texts
73        ESCAPED_TEXTS[6], // same as in texts
74        ESCAPED_TEXTS[7], // same as in texts
75        ESCAPED_TEXTS[8] // same as in texts
76    };
77  
78    @Test
79    public void testTexts() {
80      final CharArrayWriter writer = new CharArrayWriter();
81      final HtmlWriterHelper helper = new HtmlWriterHelper(writer, StandardCharsets.ISO_8859_1);
82  
83      for (int i = 0; i < ESCAPED_TEXTS.length; i++) {
84        testText(helper, writer, RAW_TEXTS[i], ESCAPED_TEXTS[i]);
85      }
86    }
87  
88    @Test
89    public void testAttributes() {
90      final CharArrayWriter writer = new CharArrayWriter();
91      final HtmlWriterHelper helper = new HtmlWriterHelper(writer, StandardCharsets.ISO_8859_1);
92  
93      for (int i = 0; i < ESCAPED_ATTRIBUTES.length; i++) {
94        testAttributeValue(helper, writer, RAW_TEXTS[i], ESCAPED_ATTRIBUTES[i]);
95      }
96    }
97  
98    private void testText(
99        final HtmlWriterHelper writerUtil, final CharArrayWriter writer, final String text, final String escaped) {
100     try {
101       writer.reset();
102       writerUtil.writeText(text);
103       final String result = String.valueOf(writer.toCharArray());
104       Assertions.assertEquals(escaped, result);
105 
106     } catch (final IOException e) {
107       // could not occur with CharArrayWriter
108     }
109   }
110 
111   private void testAttributeValue(
112       final HtmlWriterHelper writerUtil, final CharArrayWriter writer, final String text, final String escaped) {
113     try {
114       writer.reset();
115       writerUtil.writeAttributeValue(text);
116       final String result = String.valueOf(writer.toCharArray());
117       Assertions.assertEquals(escaped, result);
118 
119     } catch (final IOException e) {
120       // could not occur with CharArrayWriter
121     }
122   }
123 }