// Copyright (c) 2014, 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.

// VMOptions=--optimization-counter-threshold=5 --no-background-compilation

import 'package:expect/expect.dart';
import "package:async_helper/async_helper.dart";

import 'dart:async';

// It does not matter where a future is generated.
bar(p) async => p;
baz(p) => new Future(() => p);

foo() async {
  var b = 0;
  for(int i = 0; i < 10; i++) {
    b += (await bar(1)) + (await baz(2));
  }
  return b;
}

faa() async => (await bar('faa')).length;

quaz(p) async {
  var x = 0;
  try {
    for (var j = 0; j < 10; j++) {
      x += await baz(j);
    }
    return x;
  } finally {
    Expect.equals(x, 45);
    return p;
  }
}

quazz() async {
  var x = 0;
  try {
    try {
      x = await bar(1);
      throw x;
    } catch (e1) {
      var y = await baz(e1 + 1);
      throw y;
    }
  } catch (e2) {
    return e2;
  }
}

nesting() async {
  try {
    try {
      var x = 1;
      var y = () async {
        try {
          var z = (await bar(3)) + x;
          throw z;
        }  catch (e1) {
          return e1;
        }
      };
      var a = await y();
      throw a;
    } catch (e2) {
      throw e2 + 1;
    }
  } catch (e3) {
    return e3;
  }
}

awaitAsUnary(a,b) async {
  return await a + await b;
}

awaitIf(p) async {
  if (p < (await bar(5))) {
    return "p<5";
  } else {
    return "p>=5";
  }
}

awaitNestedIf(p,q) async {
  if (p == (await bar(5))) {
    if (q < (await bar(7))) {
      return "q<7";
    } else {
      return "q>=7";
    }
  } else {
    return "p!=5";
  }
  return "!";
}

awaitElseIf(p) async {
  if (p > (await bar(5))) {
    return "p>5";
  } else if (p < (await bar(5))) {
    return "p<5";
  } else {
    return "p==5";
  }
  return "!";
}

awaitReturn() async {
  return await bar(17);
}

awaitSwitch() async {
  switch(await bar(3)) {
    case 1:
      return 1;
      break;
    case 3:
      return 3;
      break;
    default:
      return -1;
  }
}

awaitNestedWhile(int i, int j) async {
  int savedJ = j;
  var decI = () async {
    return i--;
  };
  var decJ = () async {
    return j--;
  };
  var k = 0;
  while ((await decI()) > 0) {
    j = savedJ;
    while(0 < (await decJ())) {
      k++;
    }
  }
  return k;
}

awaitNestedDoWhile(int i, int j) async {
  int savedJ = j;
  var decI = () async {
    return i--;
  };
  var decJ = () async {
    return j--;
  };
  var k = 0;
  do {
    do {
      k++;
    } while (0 < (await decI()));
  } while((await decJ()) > 0);
  return k;
}

awaitFor() async {
  var asyncInc = (p) async => p+1;
  var k = 0;
  for (int j = (await bar(0)), i = (await bar(1));
       j < (await bar(5));
       j = (await asyncInc(j)), i = (await asyncInc(i))) {
    k += i;
    k += j;
  }
  return k;
}

awaitForIn() async {
  var list = ['a', 'b', 'c'];
  var k = '';
  for (var c in (await bar(list))) {
    k += c;
  }
  return k;
}

test() async {
  var result;
  for (int i = 0; i < 10; i++) {
    result = await foo();
    Expect.equals(30, result);
    result = await faa();
    Expect.equals(3, result);
    result = await quaz(17);
    Expect.equals(17, result);
    result = await quazz();
    Expect.equals(2, result);
    result = await nesting();
    Expect.equals(5, result);
    result = await awaitIf(3);
    Expect.equals("p<5", result);
    result = await awaitIf(5);
    Expect.equals("p>=5", result);
    result = await awaitNestedIf(5,3);
    Expect.equals("q<7", result);
    result = await awaitNestedIf(5,8);
    Expect.equals("q>=7", result);
    result = await awaitNestedIf(3,8);
    Expect.equals("p!=5", result);
    result = await awaitReturn();
    Expect.equals(17, result);
    result = await awaitSwitch();
    Expect.equals(3, result);
    result = await awaitElseIf(6);
    Expect.equals("p>5", result);
    result = await awaitElseIf(4);
    Expect.equals("p<5", result);
    result = await awaitElseIf(5);
    Expect.equals("p==5", result);
    result = await awaitNestedWhile(5,3);
    Expect.equals(15, result);
    result = await awaitNestedWhile(4,6);
    Expect.equals(24, result);
    result = await awaitAsUnary(bar(1), bar(2));
    Expect.equals(3, result);
    result = await awaitFor();
    Expect.equals(25, result);
    result = await awaitForIn();
    Expect.equals('abc', result);
  }
}

main() {
  asyncStart();
  test().then((_) {
    asyncEnd();
  });
}