#!/usr/bin/env bash
#
# Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.
#

# A quick check over a subset the tests in the runtime, compiler 
# and client directories.

# Currently builds and checks:
#  runtime - release mode
#  compiler - debug mode (non-optimized)
#  client - chromium debug mode

DO_OPTIMIZE=0
DO_DARTIUM=0
TESTS_FAILED=0

function usage {
  echo "usage: $0 [ --help ] [ --optimize ] [ --dartium ] "
  echo
  echo "Runs a quick set of tests on runtime, client, and compiler dirs"
  echo
  echo " --optimize: Also run dartc and client tests in release mode"
  echo " --dartium : Also run dartium/debug tests"
  echo
}

# Compile the vm/runtime
# $1 directory to build in
# $2 arch 
# $3 mode
function doBuild {
  ./tools/build.py --arch $1 --mode $2
  if [ $? != 0 ] ; then
    echo "Build of $1 - $2 failed"
    exit 1
  fi
}

# Execute a set of tests
# $1 directory to test in
# $2 arch 
# $3 mode
# Returns the output from the subcommand
function doTest {
  ./tools/test.py --component $2 --mode $3
  RESULT=$?
  if [ ${RESULT} != 0 ] ; then
    TESTS_FAILED=1
  fi
  return ${RESULT}
}

# Main

while [ ! -z "$1" ] ; do
  case $1 in
    "-h"|"-?"|"-help"|"--help")
      usage
      exit 1
    ;;
    "--optimize")
      DO_OPTIMIZE=1
    ;;
    "--dartium")
      DO_DARTIUM=1
    ;; 
    *)
      echo "Unrecognized argument: $1"
      usage
      exit 1
    ;;
  esac
  shift
done

if [ ! -d compiler -o ! -d runtime -o ! -d tests ] ; then
  echo "This doesn't look like the dart source tree."
  echo "Change your directory to the dart trunk source"
  exit 1
fi

echo
echo "--- Building release ---"
doBuild ia32 release

echo
echo "--- Building debug ---"
doBuild ia32 debug

echo
echo "=== Runtime tests === "
echo " Debug (Ctrl-C to skip this set of tests)"
doTest runtime vm debug
RUNTIME_RESULT=$?
if [ ${RUNTIME_RESULT} == 0 ] ; then
  echo " Release (Ctrl-C to skip this set of tests)"
  doTest runtime vm release 
  RUNTIME_RESULT=$?
fi


echo
echo "=== dartc tests ==="
echo " Debug mode (Ctrl-C to skip this set of tests)"
doTest compiler dartc debug
DARTC_RESULT=$?

if [ ${DO_OPTIMIZE} == 1 ] ; then
  echo " Release mode (--optimize)"
  doTest compiler dartc release
  RESULT=$?
  if [ ${RESULT} != 0 ] ; then
    DARTC_RESULT=${RESULT}
  fi
fi

echo
echo "=== Client tests ==="
echo " Chromium  (Ctrl-C to skip this set of tests)"
doTest client chromium debug
CLIENT_RESULT=$?

if [ ${DO_OPTIMIZE} == 1 ] ; then
  echo " Chromium Release mode (--optimize)"
  doTest compiler chromium release
  RESULT=$?
  if [ ${RESULT} != 0 ] ; then
    CLIENT_RESULT=${RESULT}
  fi
fi

if [ ${DO_DARTIUM} == 1 ] ; then
  echo " Dartium (Ctrl-C to skip this set of tests)"
  doTest client dartium release
  RESULT=$?
  if [ ${RESULT} != 0 ] ; then
    CLIENT_RESULT=${RESULT}
  fi
fi

# Print summary of results
if [ ${RUNTIME_RESULT}  != 0 ] ; then
  echo "*** vm tests failed"
fi

if [ ${DARTC_RESULT}  != 0 ] ; then
  echo "*** dartc tests failed"
fi

if [ ${CLIENT_RESULT}  != 0 ] ; then
  echo "*** client tests failed"
fi

if [ ${TESTS_FAILED} == 0 ] ; then
  echo "All presubmit tests passed!"
fi
