<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you 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.
-->
<Module>
  <ModulePrefs title="EndToEndTest">
    <Require feature="opensocial-templates">
      <Param name="requireLibrary">testLibrary.xml</Param>
    </Require>
  </ModulePrefs>
  <Content type="html">
    <![CDATA[
      <script type="text/javascript" src="/testframework.js"></script>
      <script type="text/javascript">
        var tests = {
          /** Test the library script executed */
          libraryScriptExecuted: function() {
            assertEquals('Library script didn\'t run', true, templateLibraryExecuted);
            finished();
          }
        };
      </script>
      <script type="text/os-template" xmlns:os="http://ns.opensocial.org/2008/markup"
          xmlns:test="#test">
        <test:Tag content="Hello world"/>
      </script>
    ]]>
  </Content>
</Module>
