#! /bin/sh

#
# 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.
#



# the two lines below are to get the current folder, and resolve symlinks
SCRIPT="$0"
# need this for relative symlinks
while [ -h "$SCRIPT" ] ; do
   SCRIPT=`readlink "$SCRIPT"`
done

BINDIR=$( cd "$( dirname "$SCRIPT" )" && pwd )
TESTDIR=$BINDIR/mobile-spec-test

echo "TESTDIR" $SCRIPT

# get the latest mobile-spec
git clone git://github.com/apache/cordova-mobile-spec.git $BINDIR/mobile-spec

# clobber test if it exists
if [ -e $TESTDIR ]
then
    rm -rf $TESTDIR
fi

# generate a working proj
$BINDIR/create $TESTDIR org.apache.cordova.test CordovaTest

# kill the default app and replace it w/ mobile-spec
rm -rf $TESTDIR/www
mv $BINDIR/mobile-spec $TESTDIR/www

# build it, launch it and start logging on stdout
$TESTDIR/cordova/debug && $TESTDIR/cordova/log
