// Copyright 2017 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Flags: --harmony-do-expressions

(function testBasic() {
  let f = (x = eval("var z = 42; z"), y = do { 43 }) => x + y;
  assertEquals(85, f());
})();

(function testReturnParam() {
  let f = (x = eval("var z = 42; z"), y = do { x }) => x + y;
  assertEquals(84, f());
})();

(function testCaptureParam() {
  let f = (x = eval("var z = 42; z"), y = do { () => x }) => x + y();
  assertEquals(84, f());
})();

(function testScoped() {
  let f = (x = eval("var z = 42; z"), y = do { let z; x }) => x + y;
  assertEquals(84, f());
})();

(function testCaptureScoped() {
  let f = (x = eval("var z = 42; z"), y = do { let z; () => x }) => x + y();
  assertEquals(84, f());
})();

(function testCaptureOuter() {
  let z = 44;
  let f = (x = eval("var z = 42; z"), y = do { () => z }) => x + y();
  assertEquals(86, f())
})();

(function testCaptureOuterScoped() {
  let z = 44;
  let f = (x = eval("var z = 42; z"), y = do { let q; () => z }) => x + y();
  assertEquals(86, f())
})();

(function testWith() {
  let f = (x = eval("var z = 42; z"),
           y = do {
             with ({foo: "bar"}) {
               () => x }
           }) => x + y();
  assertEquals(84, f())
})();

(function testTry() {
  let f = (x = eval("var z = 42; z"),
           y = do {
             try { () => x }
             catch (e) { }
           }) => x + y();
  assertEquals(84, f())
})();

(function testCatch() {
  let f = (x = eval("var z = 42; z"),
           y = do {
             try { throw 42 }
             catch (e) { () => x }
           }) => x + y();
  assertEquals(84, f())
})();

(function testFinally() {
  let z = 44;
  let q;
  let f = (x = eval("var z = 42; z"),
           y = do {
             try { }
             catch (e) { }
             finally { q = () => z }
             q;
           }) => x + y();
  assertEquals(86, f())
})();

(function testFinallyThrow() {
  let z = 44;
  let q;
  let f = (x = eval("var z = 42; z"),
           y = do {
             try { throw 42; }
             catch (e) { }
             finally { q = () => z }
             q;
           }) => x + y();
  assertEquals(86, f())
})();