WebCore:
[WebKit-https.git] / LayoutTests / fast / dom / Node / normalize.html
1 <html>
2
3 <head>
4
5 <title>Test of DOM Node.normalize()</title>
6
7 <script>
8
9 function logLine(message)
10 {
11     var console = document.getElementById("console");
12     console.appendChild(document.createTextNode(message));
13     console.appendChild(document.createElement('br'));
14 }
15
16 function log(message)
17 {
18     var console = document.getElementById("console");
19     console.appendChild(document.createTextNode(message));
20 }
21
22
23 function prepare_test1(testDiv)
24 {
25     testDiv.firstChild.splitText(4);
26     return testDiv.childNodes.length == 2;
27 }
28 function check_test1(testDiv)
29 {
30     return testDiv.childNodes.length == 1;
31 }
32
33 function prepare_test2(testDiv)
34 {
35     testDiv.firstChild.splitText(9);
36     testDiv.firstChild.splitText(4);
37     return testDiv.childNodes.length == 3;
38 }
39 function check_test2(testDiv)
40 {
41     return testDiv.childNodes.length == 1;
42 }
43
44 function prepare_test3(testDiv)
45 {
46     testDiv.childNodes[1].splitText(4);
47     testDiv.childNodes[4].splitText(3);
48     return testDiv.childNodes.length == 6;
49 }
50 function check_test3(testDiv)
51 {
52     return testDiv.childNodes.length == 4;
53 }
54
55 function prepare_test4(testDiv)
56 {
57     testDiv.childNodes[0].data = "";
58     return testDiv.childNodes.length == 1;
59 }
60 function check_test4(testDiv)
61 {
62     return testDiv.childNodes.length == 0;
63 }
64
65 function prepare_test5(testDiv)
66 {
67     testDiv.childNodes[1].data = "";
68     return testDiv.childNodes.length == 3;
69 }
70 function check_test5(testDiv)
71 {
72     return testDiv.childNodes.length == 2;
73 }
74
75 function prepare_test6(testDiv)
76 {
77     testDiv.childNodes[0].splitText(0);
78     testDiv.childNodes[0].splitText(0);
79     return testDiv.childNodes.length == 3;
80 }
81 function check_test6(testDiv)
82 {
83     return testDiv.childNodes.length == 1;
84 }
85
86 function prepare_test7(testDiv)
87 {
88     testDiv.childNodes[0].splitText(4);
89     testDiv.childNodes[0].splitText(4);
90     testDiv.childNodes[0].splitText(4);
91     return testDiv.childNodes.length == 4;
92 }
93 function check_test7(testDiv)
94 {
95     return testDiv.childNodes.length == 1;
96 }
97
98 function prepare_test8(testDiv)
99 {
100     testDiv.childNodes[0].splitText(4);
101     testDiv.childNodes[0].splitText(4);
102     return testDiv.childNodes.length == 3;
103 }
104 function check_test8(testDiv)
105 {
106     return testDiv.childNodes.length == 1;
107 }
108
109 function prepare_test9(testDiv)
110 {
111     testDiv.childNodes[1].splitText(4);
112     testDiv.childNodes[1].splitText(0);    // empty text node before other text nodes
113     testDiv.childNodes[5].splitText(3);
114     testDiv.childNodes[5].splitText(3);    // empty text node between other text nodes
115     testDiv.childNodes[7].splitText(2);    // empty text node after other text nodes
116     return testDiv.childNodes.length == 9;
117 }
118 function check_test9(testDiv)
119 {
120     return testDiv.childNodes.length == 4;
121 }
122
123 function prepare_test10(testDiv)
124 {
125     testDiv.childNodes[0].childNodes[0].splitText(2);
126     testDiv.childNodes[1].splitText(4);
127     testDiv.childNodes[3].childNodes[0].data = "";    // empty first text node of the second bold node
128     testDiv.childNodes[3].childNodes[1].childNodes[0].data = "";    // empty text node of the italic node
129     testDiv.childNodes[4].splitText(1);
130     return testDiv.childNodes.length == 6;
131 }
132 function check_test10(testDiv)
133 {
134     return testDiv.childNodes.length == 4
135         && testDiv.childNodes[0].childNodes.length == 1        // first bold node must have single text node child
136         && testDiv.childNodes[2].childNodes.length == 1        // first bold node must have single italic node child
137         && testDiv.childNodes[2].childNodes[0].childNodes.length == 0;    // italic node must be empty
138 }
139
140 function runTest(testDiv, testName)
141 {
142     if (self["prepare_"+testName](testDiv)) {
143         var oldHTML = testDiv.innerHTML;
144         testDiv.normalize();
145         if (testDiv.innerHTML != oldHTML) {
146             log("FAILED: innerHTML changed from \"" + oldHTML + "\" to \"" + testDiv.innerHTML + "\"");
147         } else {
148             if (self["check_"+testName](testDiv))
149                 log("PASSED");
150             else
151                 log("FAILED");
152         }        
153     } else {
154         log("FAILED in test preparation");
155     }
156 }
157
158 function runTests()
159 {
160     if (window.layoutTestController)
161         layoutTestController.dumpAsText();
162
163     try {
164         var tests = document.getElementById("tests").childNodes;
165         for (i = 0; i < tests.length; i++) {
166             var testDiv = tests[i];
167             // Skip formatting text nodes
168             if (testDiv.nodeType == Node.ELEMENT_NODE) {
169                 var testName = testDiv.getAttribute("name");
170                 
171                 log(testName + " (" + testDiv.getAttribute("description") + "): ");
172                 
173                 try {
174                     runTest(testDiv, testName);
175                 } catch(e) {
176                     log("FAILED with exception: " + e);
177                 }
178                 
179                 logLine("")
180             }
181         }
182
183     } catch(e) {
184         logLine("FAILED, exception thrown during tests: " + e);
185     }
186 }
187
188 </script>
189
190 </head>
191
192 <body onload="runTests()">
193
194 <div id="description">Several tests of the DOM normalize() function.</div>
195
196 <div id="tests" style="display:none">
197     <div name="test1" description="two non-empty text nodes">some text</div>
198     <div name="test2" description="three non-empty text nodes">some more text</div>
199     <div name="test3" description="non-empty text nodes mixed with elements"><b></b>some more<b></b> text</div>
200     <div name="test4" description="single empty text node">text</div>
201     <div name="test5" description="empty text node between elements"><b></b>text<i></i></div>
202     <div name="test6" description="empty text nodes before non-empty node">text</div>
203     <div name="test7" description="empty text nodes after non-empty node">text</div>
204     <div name="test8" description="empty text nodes between non-empty nodes">some text</div>
205     <div name="test9" description="empty and non-empty text nodes mixed with elements"><b></b>some more<b></b> text</div>
206     <div name="test10" description="mixed cases including deeper nested text nodes"><b>text</b>text <b>text<i>text</i></b> text</div>
207 </div>
208
209 <div id="console"></div>
210
211 </body>
212
213 </html>