18ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Copyright 2006 Google Inc. 28ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// 38ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Licensed under the Apache License, Version 2.0 (the "License"); 48ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// you may not use this file except in compliance with the License. 58ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// You may obtain a copy of the License at 68ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// 78ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// http://www.apache.org/licenses/LICENSE-2.0 88ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// 98ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Unless required by applicable law or agreed to in writing, software 108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// distributed under the License is distributed on an "AS IS" BASIS, 118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// implied. See the License for the specific language governing 138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// permissions and limitations under the License. 148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen/** 158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * @author Steffen Meschkat (mesch@google.com) 168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * @fileoverview Unittest and examples for jstemplates. 178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen */ 188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenfunction jstWrap(data, template) { 208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return jstProcess(new JsEvalContext(data), template); 218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenfunction testJstSelect() { 248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Template cardinality from jsselect. 258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var t = document.getElementById('t1'); 268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var d = { 278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen items: [ 'A', 'B', 'C', '' ] 288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstWrap(d, t); 308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var h = t.innerHTML; 328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var clone = domCloneNode(t); 338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue(/>A<\/div>/.test(h)); 348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue(/>B<\/div>/.test(h)); 358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue(/>C<\/div>/.test(h)); 368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue(/><\/div>/.test(h)); 378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Reprocessing with identical data. 398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstWrap(d, t); 408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertAttributesMatch(t, clone); 418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Reprocessing with changed data. 438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen d.items[1] = 'BB'; 448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstWrap(d, t); 458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen h = t.innerHTML; 478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue(/>A<\/div>/.test(h)); 488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertFalse(/>B<\/div>/.test(h)); 498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue(/>BB<\/div>/.test(h)); 508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue(/>C<\/div>/.test(h)); 518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Reprocessing with dropped data. 538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen d.items.pop(); 548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen d.items.pop(); 558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstWrap(d, t); 568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen h = t.innerHTML; 578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue(/>A<\/div>/.test(h)); 588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue(/>BB<\/div>/.test(h)); 598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertFalse(/>C<\/div>/.test(h)); 608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertFalse(/><\/div>/.test(h)); 618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Reprocessing with dropped data, once more. 638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen d.items.pop(); 648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstWrap(d, t); 658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen h = t.innerHTML; 668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue(/>A<\/div>/.test(h)); 678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertFalse(/>BB<\/div>/.test(h)); 688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertFalse(/>C<\/div>/.test(h)); 698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Reprocessing with empty data -- the last template instance is 718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // preserved, and only hidden. 728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen d.items.pop(); 738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstWrap(d, t); 748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue(/>A<\/div>/.test(h)); 768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertFalse(/>BB<\/div>/.test(h)); 778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertFalse(/>C<\/div>/.test(h)); 788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Reprocessing with added data. 808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen d.items.push('D'); 818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstWrap(d, t); 828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen h = t.innerHTML; 838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertFalse(/>A<\/div>/.test(h)); 848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue(/>D<\/div>/.test(h)); 858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenfunction testJstDisplay() { 888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var t = document.getElementById('t2'); 898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var d = { 908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen display: true 918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstWrap(d, t); 938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var h = t.innerHTML; 958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertFalse(/display:\s*none/.test(h)); 968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen d.display = false; 988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstWrap(d, t); 998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen h = t.innerHTML; 1018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue(/display:\s*none/.test(h)); 1028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Check that 'this' within js expressions is the template node 1048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen t = document.getElementById('t2a'); 1058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen d = { 1068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen showId: 'x' 1078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }; 1088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstWrap(d, t); 1098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen h = t.innerHTML; 1118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertFalse(/display:\s*none/.test(h)); 1128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen d.showId = 'y'; 1148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstWrap(d, t); 1158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen h = t.innerHTML; 1178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue(/display:\s*none/.test(h)); 1188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 1198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenfunction stringContains(str, sub) { 1218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return str.indexOf(sub) != -1; 1228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 1238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenfunction testJseval() { 1258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var data = {}; 1268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var counter = 0; 1288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var ctx = new JsEvalContext(data); 1298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ctx.setVariable("callback1", function() { 1308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ++counter; 1318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }); 1328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ctx.setVariable("callback2", function() { 1338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen counter *= 2; 1348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }); 1358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstProcess(ctx, document.getElementById('testJseval1')); 1378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertEquals("testJseval1", 1, counter); 1388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstProcess(ctx, document.getElementById('testJseval2')); 1408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertEquals("testJseval2", 4, counter); 1418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 1428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenfunction testJstValues() { 1448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var t = document.getElementById('t3'); 1458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var d = {}; 1468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstWrap(d, t); 1478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var h = t.innerHTML; 1488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue(stringContains(h, 'http://maps.google.com/')); 1498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var t3a = document.getElementById('t3a'); 1508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertEquals('http://maps.google.com/', t3a.foo.bar.baz); 1518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertEquals('http://maps.google.com/', t3a.bar); 1528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertEquals('red', t3a.style.backgroundColor); 1538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 1548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenfunction testJstTransclude() { 1568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var t = document.getElementById('t4'); 1578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var p = document.getElementById('parent'); 1588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var d = {}; 1598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstWrap(d, t); 1608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var h = p.innerHTML; 1618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue(h, stringContains(h, 'http://maps.google.com/')); 1628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 1638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenfunction assertAttributesMatch(first, second) { 1658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertEquals('assertAttributesMatch: number of child nodes', 1668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jsLength(first.childNodes), jsLength(second.childNodes)); 1678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var b = second.firstChild; 1688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen for (var a = first.firstChild; a; a = a.nextSibling) { 1698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var att = a.attributes; 1708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (att) { 1718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue(b.attributes != null); 1728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertEquals('assertAttributesMatch: number of attribute nodes', 1738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen att.length, b.attributes.length); 1748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen for (var i = 0; i < jsLength(att); i++) { 1758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var a = att[i]; 1768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertEquals('assertAttributesMatch: value of attribute ' + a.name, 1778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen a.value, b.getAttribute(a.name)); 1788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } else { 1808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertNull(b.attributes); 1818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen b = b.nextSibling; 1838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 1858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenfunction testJsskip() { 1878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var div = domCreateElement(document, "DIV"); 1888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen div.innerHTML = [ 1898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen '<div jseval="outercallback()" jsskip="1">', 1908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen '<div jseval="innercallback()">', 1918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen '</div>', 1928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen '</div>' 1938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ].join(''); 1948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var data = {}; 1968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var ctx = new JsEvalContext(data); 1978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var outerCalled = false; 1988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ctx.setVariable("outercallback", function() { 1998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen outerCalled = true; 2008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }); 2018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var innerCalled = false; 2028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ctx.setVariable("innercallback", function() { 2038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen innerCalled = true; 2048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }); 2058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstProcess(ctx, div); 2068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue(outerCalled); 2088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertFalse(innerCalled); 2098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 2108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenfunction testScalarContext() { 2128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var t = document.getElementById('testScalarContext'); 2138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstWrap(true, t); 2158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue(/>true</.test(t.innerHTML)); 2168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstWrap(false, t); 2188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue(/>false</.test(t.innerHTML)); 2198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstWrap(0, t); 2218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue(/>0</.test(t.innerHTML)); 2228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstWrap("foo", t); 2248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue(/>foo</.test(t.innerHTML)); 2258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstWrap(undefined, t); 2278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue(/>undefined</.test(t.innerHTML)); 2288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstWrap(null, t); 2308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue(/>null</.test(t.innerHTML)); 2318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 2328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenfunction testJstLoadTemplate() { 2348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var wrapperId = 'testJstLoadTemplateWrapper'; 2358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var id = 'testJstLoadTemplate'; 2368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstLoadTemplate_(document, '<div id="' + id + '">content</div>', wrapperId); 2378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var wrapperElem = document.getElementById(wrapperId); 2388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue('Expected wrapper element to be in document', 2398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen !!wrapperElem); 2408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var newTemplate = document.getElementById(id); 2418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue('Expected newly loaded template to be in document', 2428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen !!newTemplate); 2438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue('Expected wrapper to be grandparent of template', 2448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen newTemplate.parentNode.parentNode == wrapperElem); 2458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Make sure the next template loaded with the same wrapper id re-uses the 2478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // wrapper element. 2488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var id2 = 'testJstLoadTemplate2'; 2498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstLoadTemplate_(document, '<div id="' + id2 + '">content</div>', wrapperId); 2508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var newTemplate2 = document.getElementById(id2); 2518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue('Expected newly loaded template to be in document', 2528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen !!newTemplate2); 2538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue('Expected wrapper to be grandparent of template', 2548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen newTemplate2.parentNode.parentNode == wrapperElem); 2558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 2568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenfunction testJstGetTemplateFromDom() { 2588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var element; 2598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Get by id a template in the document 2608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Success 2618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen element = jstGetTemplate('t1'); 2628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue("Asserted jstGetTemplate('t1') to return a dom element", 2638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen !!element); 2648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Failure 2658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen element = jstGetTemplate('asdf'); 2668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertFalse("Asserted jstGetTemplate('asdf') to return null", 2678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen !!element); 2688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 2698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenfunction testJstGetTemplateFromFunction() { 2718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var element; 2728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Fetch a jstemplate by id from within a html string, passed via a function. 2738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen function returnHtmlWithId(id) { 2748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var html = 2758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen '<div>' + 2768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen '<div id="' + id + '">Here is the template</div>' + 2778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen '</div>'; 2788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return html; 2798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 2808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Success 2818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen element = jstGetTemplate('template', 2828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen partial(returnHtmlWithId, 'template')); 2838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue("Expected jstGetTemplate('template') to return a dom element", 2848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen !!element); 2858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Failure 2878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen element = jstGetTemplate('asdf', 2888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen partial(returnHtmlWithId, 'zxcv')); 2898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertFalse("Expected jstGetTemplate('zxcv') to return null", 2908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen !!element); 2918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 2928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenfunction testPrepareNode() { 2948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var id, node; 2958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Reset the cache so we're testing from a known state. 2968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen JstProcessor.jstCache_ = {}; 2978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen JstProcessor.jstCache_[0] = {}; 2988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Skip pre-processed nodes. Preprocessed nodes are those with a 3008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // PROP_jstcache property. 3018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var t = document.getElementById('t1'); 3028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var caches = []; 3038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen caches.push(JstProcessor.prepareNode_(t)); 3048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen caches.push(JstProcessor.prepareNode_(t)); 3058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertEquals('The same cache should be returned on each call to prepareNode', 3068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen caches[0], caches[1]); 3078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Preprocessing a node with a jst attribute should return a valid struct 3098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen id = 'testPrepareNodeWithAttributes'; 3108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstLoadTemplate_(document, '<div id="' + id + '" jsskip="1"></div>'); 3118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen node = document.getElementById(id); 3128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var cache = JstProcessor.prepareNode_(node); 3138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen try { 3148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var jsskip = cache['jsskip']({}, {}); 3158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } catch (e) { 3168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen fail('Exception when evaluating jsskip from cache'); 3178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 3188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertEquals(1, jsskip); 3198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 3208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenfunction testPrepareNodeWithNoAttributes() { 3238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Preprocessing a node with no jst attributes should return null 3248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var id = 'testPrepareNodeNoAttributes'; 3258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstLoadTemplate_(document, '<div id="' + id + '"></div>'); 3268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var node = document.getElementById(id); 3278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertEquals('prepareNode with no jst attributes should return default', 3288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen JstProcessor.jstcache_[0], JstProcessor.prepareNode_(node)); 3298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 3308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenfunction testJsVars() { 3338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var template = document.createElement('div'); 3348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen document.body.appendChild(template); 3358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen template.innerHTML = '<div jsvars="foo:\'foo\';bar:true;$baz:1"></div>'; 3368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var context = new JsEvalContext; 3388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen jstProcess(context, template); 3398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertEquals('foo', context.getVariable('foo')); 3418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertEquals(1, context.getVariable('$baz')); 3428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertTrue(context.getVariable('bar')); 3438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertUndefined(context.getVariable('foobar')); 3448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 3458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenfunction testCacheReuse() { 3488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var template = document.createElement('div'); 3498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen document.body.appendChild(template); 3508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen template.innerHTML = 3518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen '<div jsvars="foo:\'foo\';bar:true;$baz:1"></div>' + 3528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen '<span jsvars="foo:\'foo\';bar:true;$baz:1"></span>'; 3538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen JstProcessor.prepareTemplate_(template); 3548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen assertEquals(template.firstChild.getAttribute(ATT_jstcache), 3558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen template.lastChild.getAttribute(ATT_jstcache)); 3568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 3578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 358