15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2006 Google Inc. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Licensed under the Apache License, Version 2.0 (the "License"); 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// you may not use this file except in compliance with the License. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// You may obtain a copy of the License at 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://www.apache.org/licenses/LICENSE-2.0 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Unless required by applicable law or agreed to in writing, software 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// distributed under the License is distributed on an "AS IS" BASIS, 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implied. See the License for the specific language governing 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// permissions and limitations under the License. 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @author Steffen Meschkat (mesch@google.com) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @fileoverview Unittest and examples for jstemplates. 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function jstWrap(data, template) { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return jstProcess(new JsEvalContext(data), template); 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testJstSelect() { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Template cardinality from jsselect. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var t = document.getElementById('t1'); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var d = { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) items: [ 'A', 'B', 'C', '' ] 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstWrap(d, t); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var h = t.innerHTML; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var clone = domCloneNode(t); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(/>A<\/div>/.test(h)); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(/>B<\/div>/.test(h)); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(/>C<\/div>/.test(h)); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(/><\/div>/.test(h)); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reprocessing with identical data. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstWrap(d, t); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertAttributesMatch(t, clone); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reprocessing with changed data. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.items[1] = 'BB'; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstWrap(d, t); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) h = t.innerHTML; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(/>A<\/div>/.test(h)); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertFalse(/>B<\/div>/.test(h)); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(/>BB<\/div>/.test(h)); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(/>C<\/div>/.test(h)); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reprocessing with dropped data. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.items.pop(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.items.pop(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstWrap(d, t); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) h = t.innerHTML; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(/>A<\/div>/.test(h)); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(/>BB<\/div>/.test(h)); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertFalse(/>C<\/div>/.test(h)); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertFalse(/><\/div>/.test(h)); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reprocessing with dropped data, once more. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.items.pop(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstWrap(d, t); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) h = t.innerHTML; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(/>A<\/div>/.test(h)); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertFalse(/>BB<\/div>/.test(h)); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertFalse(/>C<\/div>/.test(h)); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reprocessing with empty data -- the last template instance is 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // preserved, and only hidden. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.items.pop(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstWrap(d, t); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(/>A<\/div>/.test(h)); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertFalse(/>BB<\/div>/.test(h)); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertFalse(/>C<\/div>/.test(h)); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reprocessing with added data. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.items.push('D'); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstWrap(d, t); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) h = t.innerHTML; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertFalse(/>A<\/div>/.test(h)); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(/>D<\/div>/.test(h)); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testJstDisplay() { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var t = document.getElementById('t2'); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var d = { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display: true 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstWrap(d, t); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var h = t.innerHTML; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertFalse(/display:\s*none/.test(h)); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.display = false; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstWrap(d, t); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) h = t.innerHTML; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(/display:\s*none/.test(h)); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that 'this' within js expressions is the template node 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) t = document.getElementById('t2a'); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d = { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) showId: 'x' 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstWrap(d, t); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) h = t.innerHTML; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertFalse(/display:\s*none/.test(h)); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.showId = 'y'; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstWrap(d, t); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) h = t.innerHTML; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(/display:\s*none/.test(h)); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function stringContains(str, sub) { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return str.indexOf(sub) != -1; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testJseval() { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var data = {}; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var counter = 0; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var ctx = new JsEvalContext(data); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctx.setVariable("callback1", function() { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++counter; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctx.setVariable("callback2", function() { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) counter *= 2; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstProcess(ctx, document.getElementById('testJseval1')); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals("testJseval1", 1, counter); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstProcess(ctx, document.getElementById('testJseval2')); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals("testJseval2", 4, counter); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testJstValues() { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var t = document.getElementById('t3'); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var d = {}; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstWrap(d, t); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var h = t.innerHTML; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(stringContains(h, 'http://maps.google.com/')); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var t3a = document.getElementById('t3a'); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals('http://maps.google.com/', t3a.foo.bar.baz); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals('http://maps.google.com/', t3a.bar); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals('red', t3a.style.backgroundColor); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testJstTransclude() { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var t = document.getElementById('t4'); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var p = document.getElementById('parent'); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var d = {}; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstWrap(d, t); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var h = p.innerHTML; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(h, stringContains(h, 'http://maps.google.com/')); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function assertAttributesMatch(first, second) { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals('assertAttributesMatch: number of child nodes', 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jsLength(first.childNodes), jsLength(second.childNodes)); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var b = second.firstChild; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var a = first.firstChild; a; a = a.nextSibling) { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var att = a.attributes; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (att) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(b.attributes != null); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals('assertAttributesMatch: number of attribute nodes', 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) att.length, b.attributes.length); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var i = 0; i < jsLength(att); i++) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var a = att[i]; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals('assertAttributesMatch: value of attribute ' + a.name, 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a.value, b.getAttribute(a.name)); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertNull(b.attributes); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b = b.nextSibling; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testJsskip() { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var div = domCreateElement(document, "DIV"); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) div.innerHTML = [ 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) '<div jseval="outercallback()" jsskip="1">', 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) '<div jseval="innercallback()">', 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) '</div>', 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) '</div>' 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ].join(''); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var data = {}; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var ctx = new JsEvalContext(data); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var outerCalled = false; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctx.setVariable("outercallback", function() { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) outerCalled = true; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var innerCalled = false; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctx.setVariable("innercallback", function() { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) innerCalled = true; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstProcess(ctx, div); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(outerCalled); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertFalse(innerCalled); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testScalarContext() { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var t = document.getElementById('testScalarContext'); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstWrap(true, t); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(/>true</.test(t.innerHTML)); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstWrap(false, t); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(/>false</.test(t.innerHTML)); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstWrap(0, t); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(/>0</.test(t.innerHTML)); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstWrap("foo", t); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(/>foo</.test(t.innerHTML)); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstWrap(undefined, t); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(/>undefined</.test(t.innerHTML)); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstWrap(null, t); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(/>null</.test(t.innerHTML)); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testJstLoadTemplate() { 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var wrapperId = 'testJstLoadTemplateWrapper'; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var id = 'testJstLoadTemplate'; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstLoadTemplate_(document, '<div id="' + id + '">content</div>', wrapperId); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var wrapperElem = document.getElementById(wrapperId); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue('Expected wrapper element to be in document', 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !!wrapperElem); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var newTemplate = document.getElementById(id); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue('Expected newly loaded template to be in document', 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !!newTemplate); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue('Expected wrapper to be grandparent of template', 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newTemplate.parentNode.parentNode == wrapperElem); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the next template loaded with the same wrapper id re-uses the 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // wrapper element. 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var id2 = 'testJstLoadTemplate2'; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstLoadTemplate_(document, '<div id="' + id2 + '">content</div>', wrapperId); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var newTemplate2 = document.getElementById(id2); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue('Expected newly loaded template to be in document', 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !!newTemplate2); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue('Expected wrapper to be grandparent of template', 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newTemplate2.parentNode.parentNode == wrapperElem); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testJstGetTemplateFromDom() { 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var element; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get by id a template in the document 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Success 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element = jstGetTemplate('t1'); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue("Asserted jstGetTemplate('t1') to return a dom element", 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !!element); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Failure 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element = jstGetTemplate('asdf'); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertFalse("Asserted jstGetTemplate('asdf') to return null", 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !!element); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testJstGetTemplateFromFunction() { 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var element; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fetch a jstemplate by id from within a html string, passed via a function. 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function returnHtmlWithId(id) { 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var html = 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) '<div>' + 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) '<div id="' + id + '">Here is the template</div>' + 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) '</div>'; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return html; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Success 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element = jstGetTemplate('template', 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) partial(returnHtmlWithId, 'template')); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue("Expected jstGetTemplate('template') to return a dom element", 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !!element); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Failure 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element = jstGetTemplate('asdf', 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) partial(returnHtmlWithId, 'zxcv')); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertFalse("Expected jstGetTemplate('zxcv') to return null", 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !!element); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testPrepareNode() { 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var id, node; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset the cache so we're testing from a known state. 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JstProcessor.jstCache_ = {}; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JstProcessor.jstCache_[0] = {}; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Skip pre-processed nodes. Preprocessed nodes are those with a 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PROP_jstcache property. 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var t = document.getElementById('t1'); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var caches = []; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) caches.push(JstProcessor.prepareNode_(t)); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) caches.push(JstProcessor.prepareNode_(t)); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals('The same cache should be returned on each call to prepareNode', 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) caches[0], caches[1]); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Preprocessing a node with a jst attribute should return a valid struct 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id = 'testPrepareNodeWithAttributes'; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstLoadTemplate_(document, '<div id="' + id + '" jsskip="1"></div>'); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = document.getElementById(id); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var cache = JstProcessor.prepareNode_(node); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try { 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var jsskip = cache['jsskip']({}, {}); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } catch (e) { 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fail('Exception when evaluating jsskip from cache'); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals(1, jsskip); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testPrepareNodeWithNoAttributes() { 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Preprocessing a node with no jst attributes should return null 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var id = 'testPrepareNodeNoAttributes'; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstLoadTemplate_(document, '<div id="' + id + '"></div>'); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var node = document.getElementById(id); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals('prepareNode with no jst attributes should return default', 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JstProcessor.jstcache_[0], JstProcessor.prepareNode_(node)); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testJsVars() { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var template = document.createElement('div'); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document.body.appendChild(template); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template.innerHTML = '<div jsvars="foo:\'foo\';bar:true;$baz:1"></div>'; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var context = new JsEvalContext; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstProcess(context, template); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals('foo', context.getVariable('foo')); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals(1, context.getVariable('$baz')); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertTrue(context.getVariable('bar')); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertUndefined(context.getVariable('foobar')); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function testCacheReuse() { 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var template = document.createElement('div'); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document.body.appendChild(template); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template.innerHTML = 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) '<div jsvars="foo:\'foo\';bar:true;$baz:1"></div>' + 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) '<span jsvars="foo:\'foo\';bar:true;$baz:1"></span>'; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JstProcessor.prepareTemplate_(template); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assertEquals(template.firstChild.getAttribute(ATT_jstcache), 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template.lastChild.getAttribute(ATT_jstcache)); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 357