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

// @dart = 2.9

import 'dart:async';
import 'package:expect/expect.dart';

later(vodka) => new Future.value(vodka);

manana(tequila) async => tequila;

// Regression test for issue 21536.
testNestedFunctions() async {
  var a = await later('Asterix').then((tonic) {
    return later(tonic);
  });
  var o = await manana('Obelix').then(manana);
  Expect.equals("$a and $o", "Asterix and Obelix");
}

addLater({a, b}) => new Future.value(a + b);

// Regression test for issue 21480.
testNamedArguments() async {
  var sum = await addLater(a: 5, b: 10);
  Expect.equals(sum, 15);
  sum = await addLater(b: 11, a: -11);
  Expect.equals(sum, 0);
}

testSideEffects() async {
  Future foo(int a1, int a2) {
    Expect.equals(10, a1);
    Expect.equals(11, a2);
    return new Future.value();
  }

  int a = 10;
  await foo(a++, a++);
  Expect.equals(12, a);
}

main() async {
  testNestedFunctions();
  testNamedArguments();
  testSideEffects();
}
