#!/bin/bash

# Go to srcdir
cd $(dirname ${BASH_SOURCE[0]})/..

rm -rf out.test
mkdir out.test
cd out.test
../bootstrap.bash

# Run ninja, filter the output, and compare against expectations
# $1: Name of test
function testcase()
{
  echo -n "Running $1..."
  if ! ninja -v -d explain >log_$1 2>&1; then
    echo " Failed."
    echo "Test $1 Failed:" >>failed
    tail log_$1 >>failed
    return
  fi
  grep -E "^(Choosing|Newer|Stage)" log_$1 >test_$1
  if ! cmp -s test_$1 ../tests/expected_$1; then
    echo " Failed."
    echo "Test $1 Failed:" >>failed
    diff -u ../tests/expected_$1 test_$1 >>failed
  else
    echo " Passed."
  fi
}

# Run wrapper, filter the output, and compare against expectations
# $1: Name of test
function testcase_wrapper()
{
  echo -n "Running wrapper_$1..."
  if ! ./blueprint.bash -v -d explain >log_wrapper_$1 2>&1; then
    echo " Failed."
    echo "Test wrapper_$1 Failed:" >>failed
    tail log_wrapper_$1 >>failed
    return
  fi
  grep -E "^(Choosing|Newer|Stage)" log_wrapper_$1 >test_wrapper_$1
  if ! cmp -s test_wrapper_$1 ../tests/expected_wrapper_$1; then
    echo " Failed."
    echo "Test wrapper_$1 Failed:" >>failed
    diff -u ../tests/expected_wrapper_$1 test_wrapper_$1 >>failed
  else
    echo " Passed."
  fi
}


testcase start

# The 2 second sleeps are needed until ninja understands sub-second timestamps
# https://github.com/martine/ninja/issues/371

# This test affects all bootstrap stages
sleep 2
touch ../Blueprints
testcase all

# This test affects only the primary bootstrap stage
sleep 2
touch ../bpmodify/bpmodify.go
testcase primary

# This test affects nothing, nothing should be done
sleep 2
testcase none

# This test will cause the source build.ninja.in to be copied into the first
# stage.
sleep 2
touch ../build.ninja.in
testcase manifest

# From now on, we're going to be modifying the build.ninja.in, so let's make our
# own copy
sleep 2
../tests/bootstrap.bash -r

sleep 2
testcase start2

# This is similar to the last test, but incorporates a change into the source
# build.ninja.in, so that we'll restart into the new version created by the
# build.
sleep 2
echo "# test" >>src.build.ninja.in
testcase regen

# Add tests to our build by using '-t'
sleep 2
../tests/bootstrap.bash -r -t

sleep 2
testcase start_add_tests

# Make sure that updating a test file causes us to go back to the bootstrap
# stage
sleep 2
touch ../parser/parser_test.go
testcase rebuild_test

# Restart testing using the wrapper instead of going straight to ninja. This
# will force each test to start in the correct bootstrap stage, so there are
# less cases to test.
cd ..
rm -rf out.test
mkdir -p out.test
cd out.test
../bootstrap.bash

testcase_wrapper start

# This test affects all bootstrap stages
sleep 2
touch ../Blueprints
testcase_wrapper all

# From now on, we're going to be modifying the build.ninja.in, so let's make our
# own copy
sleep 2
../tests/bootstrap.bash -r

sleep 2
testcase_wrapper start2

# This is similar to the last test, but incorporates a change into the source
# build.ninja.in, so that we'll restart into the new version created by the
# build.
sleep 2
echo "# test" >>src.build.ninja.in
testcase_wrapper regen

if [ -f failed ]; then
  cat failed
  exit 1
fi