<!--
    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.
-->
<testcase>
  <randomString size="20" out="exampleName" />
  <randomString size="250" out="description" />
  <randomString size="500" out="longDesc" />
  <randomString size="250" out="comments" />

  <click locator="link=New Example" />
  <waitForPageToLoad value="10000" />
  <select locator="statusId" option="label=Defined" />
  <type name="exampleName" value="${exampleName}" />
  <type name="description" value="${description}" />
  <type name="longDescription" value="${longDesc}" />
  <type name="comments" value="${comments}" />
  <type name="exampleSize" value="10" />
  <click locator="//img[@alt='View Calendar']" />
  <click locator="link=Now" />
  <click locator="link=OK" />
  <select locator="anotherText" option="label=Good" />
  <click locator="submitButton" />
  <waitForPageToLoad value="10000" />
  <click locator="link=Items" />
  <waitForPageToLoad value="10000" />
  <type name="AddExampleItem_description" value="Item 1" />
  <type name="amount" value="100" />
  <select locator="amountUomId" option="label=Weight: Stone (st)" />
  <click locator="submitButton" />
  <assertConfirmation value="Do you confirm ?" />
</testcase>