#!/usr/local/bin/bash
# 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.                                           *

set -e
#set -x

q=-q
b="-b xml"
d="-d ../../../target/generated-sources/main/etch/xml"
i="-I ."
n=-n

walf="-w all,force"
 
testsdir=tests/src/main/etch
examplesdir=examples

x=`pwd`/

pushd $testsdir > /dev/null
${x}scripts/etch-eclipse.bash $q $b $n $d $i        Async.etch
${x}scripts/etch-eclipse.bash $q $b $n $d $i        Bar.etch
${x}scripts/etch-eclipse.bash $q $b $n $d $i        Baz.etch
${x}scripts/etch-eclipse.bash $q $b $n $d $i        BigIdl.etch
${x}scripts/etch-eclipse.bash $q $b $n $d $i        Closing.etch
${x}scripts/etch-eclipse.bash $q $b $n $d $i        Cuae.etch
${x}scripts/etch-eclipse.bash $q $b $n $d $i        Foo.etch
${x}scripts/etch-eclipse.bash $q $b $n $d $i        Inheritance.etch
${x}scripts/etch-eclipse.bash $q $b $n $d $i $walf  Test1.etch
${x}scripts/etch-eclipse.bash $q $b $n $d $i        Test2.etch
${x}scripts/etch-eclipse.bash $q $b $n $d $i        Test3.etch
${x}scripts/etch-eclipse.bash $q $b $n $d $i        Test4.etch
# *** Test5.etch is a negative test ***
${x}scripts/etch-eclipse.bash $q $b $n $d $i        Test6.etch
${x}scripts/etch-eclipse.bash $q $b $n $d $i $walf  TestIncludes.etch
# *** TestReservedWords.etch is a negative test ***
${x}scripts/etch-eclipse.bash $q $b $n $d $i        Types.etch
popd > /dev/null

pushd $examplesdir > /dev/null

pushd chat/src/main/etch > /dev/null
${x}scripts/etch-eclipse.bash $q $b $n $d $i        Chat.etch
popd > /dev/null

pushd distmap/src/main/etch > /dev/null
${x}scripts/etch-eclipse.bash $q $b $n $d $i        DistributedHashTable.etch
popd > /dev/null

pushd example/src/main/etch > /dev/null
${x}scripts/etch-eclipse.bash $q $b $n $d $i        Example.etch
popd > /dev/null

pushd perf/src/main/etch > /dev/null
${x}scripts/etch-eclipse.bash $q $b $n $d $i        Perf.etch
popd > /dev/null

popd > /dev/null
