@rem  Licensed to the Apache Software Foundation (ASF) under one   *
@rem  or more contributor license agreements.  See the NOTICE file *
@rem  distributed with this work for additional information        *
@rem  regarding copyright ownership.  The ASF licenses this file   *
@rem  to you under the Apache License, Version 2.0 (the            *
@rem  "License"); you may not use this file except in compliance   *
@rem  with the License.  You may obtain a copy of the License at   *
@rem                                                               *
@rem    http://www.apache.org/licenses/LICENSE-2.0                 *
@rem                                                               *
@rem  Unless required by applicable law or agreed to in writing,   *
@rem  software distributed under the License is distributed on an  *
@rem  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
@rem  KIND, either express or implied.  See the License for the    *
@rem  specific language governing permissions and limitations      *
@rem  under the License.                                           *
@set q=-q
@set b=-b java
@set d=-d ../../../target/generated-sources/main/etch/java
@set i=-I .
@set n=-n

@set walf=-w all,force

@set testsdir=tests\src\main\etch
@set examplesdir=examples

@set x=%CD%\
@pushd %testsdir%

@call %x%scripts\etch-eclipse.bat %q% %b% %n% %d% %i%        Async.etch
@call %x%scripts\etch-eclipse.bat %q% %b% %n% %d% %i%        Bar.etch
@call %x%scripts\etch-eclipse.bat %q% %b% %n% %d% %i%        Baz.etch
@call %x%scripts\etch-eclipse.bat %q% %b% %n% %d% %i%        BigIdl.etch
@call %x%scripts\etch-eclipse.bat %q% %b% %n% %d% %i%        Closing.etch
@call %x%scripts\etch-eclipse.bat %q% %b% %n% %d% %i%        Cuae.etch
@call %x%scripts\etch-eclipse.bat %q% %b% %n% %d% %i%        Foo.etch
@call %x%scripts\etch-eclipse.bat %q% %b% %n% %d% %i%        Inheritance.etch
@call %x%scripts\etch-eclipse.bat %q% %b% %n% %d% %i% %walf% Test1.etch
@call %x%scripts\etch-eclipse.bat %q% %b% %n% %d% %i%        Test2.etch
@call %x%scripts\etch-eclipse.bat %q% %b% %n% %d% %i%        Test3.etch
@call %x%scripts\etch-eclipse.bat %q% %b% %n% %d% %i%        Test4.etch
@rem *** Test5.etch is a negative test ***
@call %x%scripts\etch-eclipse.bat %q% %b% %n% %d% %i%        Test6.etch
@call %x%scripts\etch-eclipse.bat %q% %b% %n% %d% %i% %walf% TestIncludes.etch
@rem *** TestReservedWords.etch is a negative test ***
@call %x%scripts\etch-eclipse.bat %q% %b% %n% %d% %i%        Types.etch

@popd
@pushd %examplesdir%

@pushd chat\src\main\etch
@call %x%scripts\etch-eclipse.bat %q% %b% %n% %d% %i%        Chat.etch
@popd

@pushd distmap\src\main\etch
@call %x%scripts\etch-eclipse.bat %q% %b% %n% %d% %i%        DistributedHashTable.etch
@popd

@pushd example\src\main\etch
@call %x%scripts\etch-eclipse.bat %q% %b% %n% %d% %i%        Example.etch
@call %x%scripts\etch-eclipse.bat %q% %b% %n% %d% %i%        Foo.etch
@call %x%scripts\etch-eclipse.bat %q% %b% %n% %d% %i%        ExampleFoo.etch
@popd

@pushd perf\src\main\etch
@call %x%scripts\etch-eclipse.bat %q% %b% %n% %d% %i%        Perf.etch
@popd

@popd
