// 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: --allow-natives-syntax --harmony-dynamic-import
//
// Note: This test fails with top level await due to test1, which tries to
//       import a module using top level await and expects it to fail.

var ran = false;

async function test1() {
  try {
    let x = await import('modules-skip-8.mjs');
    %AbortJS('failure: should be unreachable');
  } catch(e) {
    assertEquals('Unexpected reserved word', e.message);
    ran = true;
  }
}

test1();
%PerformMicrotaskCheckpoint();
assertTrue(ran);

ran = false;

async function test2() {
  try {
    let x = await import('modules-skip-9.mjs');
    %AbortJS('failure: should be unreachable');
  } catch(e) {
    assertInstanceof(e, SyntaxError);
    assertEquals(
      "The requested module 'modules-skip-empty.mjs' does not provide an " +
      "export named 'default'",
      e.message);
    ran = true;
  }
}

test2();
%PerformMicrotaskCheckpoint();
assertTrue(ran);

ran = false;

async function test3() {
  try {
    let x = await import('nonexistent-file.mjs');
    %AbortJS('failure: should be unreachable');
  } catch(e) {
    assertTrue(e.startsWith('d8: Error reading'));
    ran = true;
  }
}

test3();
%PerformMicrotaskCheckpoint();
assertTrue(ran);
