// 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 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';

import "not_loaded_check_lib.dart" deferred as lib;

// Test that we give appropriate errors when accessing an element that is not
// yet loaded.

var c;

expectSideEffect(test) {
  c = 0;
  test();
  Expect.isTrue(c == 1);
}

expectNoSideEffect(test) {
  c = 0;
  test();
  Expect.isTrue(c == 0);
}

expectThrowsNotLoaded(test) {
  Expect.throws(test, (e) => e is Error);
}

int sideEffect() {
  c = 1;
  return 10;
}

void main() {
  expectSideEffect(() {
    expectThrowsNotLoaded(() {
      lib.foo(sideEffect());
    });
  });
  expectNoSideEffect(() {
    expectThrowsNotLoaded(() {
      lib.C.foo(sideEffect());
    });
  });
  expectSideEffect(() {
    expectThrowsNotLoaded(() {
      new lib.C(sideEffect());
    });
  });
  expectThrowsNotLoaded(() {
    lib.a;
  });
  expectSideEffect(() {
    expectThrowsNotLoaded(() {
      lib.a = sideEffect();
    });
  });
  expectThrowsNotLoaded(() {
    lib.getter;
  });
  expectSideEffect(() {
    expectThrowsNotLoaded(() {
      lib.setter = sideEffect();
    });
  });
  expectNoSideEffect(() {
    expectThrowsNotLoaded(() {
      lib.list[sideEffect()] = sideEffect();
    });
  });
  expectSideEffect(() {
    expectThrowsNotLoaded(() {
      lib.closure(sideEffect());
    });
  });
}
