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