<!--
Copyright 2006 Google Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!--
Fileoverview: JsUnit test runner page for jstemplates. 

Author: Steffen Meschkat (mesch@google.com)
-->
<html>
  <head>
    <title>jstemplate jsunit tests</title>
    <script src="jsunit/app/jsUnitCore.js"></script>
    <script src="util.js"></script>
    <script src="jsevalcontext.js"></script>
    <script src="jstemplate.js"></script>
    <script src="jstemplate_unittest.js"></script>
  </head>
  <body>

<!-- jsselect, jscontent, $this -->
<div id="t1">
  <div jsselect="items" jscontent="$this"></div>
</div>

<!-- jsdisplay -->
<div id="t2">
  <div jsdisplay="display">display</div>
</div>
<div id="t2a">
  <div jsdisplay="this.id == showId" id="x">x</div>
</div>

<!-- variables, jsvalues -->
<div id="t3" jsvalues="$href:'http://maps.google.com/'">
  <a href="http://www.google.com/" id="t3a"
  jsvalues="href:$href;.foo.bar.baz:$href;.style.backgroundColor:'red';.bar:$href">link here</a>
</div>

<div id="testJseval1" jseval="callback1()"></div>
<div id="testJseval2" jseval="callback1();callback2();"></div>

<!-- transclude -->
<div id="parent">
  <div id="t4" transclude="t4a"></div>
</div>
<div id="t4a" jsvalues="$href:'http://maps.google.com/'">
  <a href="http://www.google.com/" jsvalues="href:$href">link here</a>
</div>

<!-- scalar values as context -->
<div id="testScalarContext">
  <div jscontent="$this"></div>
</div>
  </body>
</html>