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

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

import "global_lib.dart" deferred as lib;

Object? nonDeferredGlobal = const {};

void main() {
  nonDeferredGlobal = null;
  asyncStart();
  lib.loadLibrary().then((_) {
    // Ensure non-deferred globals are not reset when loading a deferred
    // library.
    Expect.equals(null, nonDeferredGlobal);

    Expect.equals("finalConstGlobal", lib.finalConstGlobal);
    Expect.equals(0, lib.sideEffectCounter);
    Expect.equals("finalNonConstGlobal", lib.finalNonConstGlobal);
    Expect.equals(1, lib.sideEffectCounter);
    Expect.equals("finalConstGlobal", lib.finalConstGlobal);
    Expect.equals("finalNonConstGlobal", lib.finalNonConstGlobal);
    Expect.equals("lazyConstGlobal", lib.lazyConstGlobal);
    Expect.equals(1, lib.sideEffectCounter);
    Expect.equals("lazyNonConstGlobal", lib.lazyNonConstGlobal);
    Expect.equals(2, lib.sideEffectCounter);
    Expect.equals("finalConstGlobal", lib.readFinalConstGlobal());
    Expect.equals("finalNonConstGlobal", lib.readFinalNonConstGlobal());
    Expect.equals("lazyConstGlobal", lib.readLazyConstGlobal());
    Expect.equals("lazyNonConstGlobal", lib.readLazyNonConstGlobal());

    lib.lazyConstGlobal = "lazyConstGlobal_mutated";
    lib.lazyNonConstGlobal = "lazyNonConstGlobal_mutated";
    Expect.equals("lazyConstGlobal_mutated", lib.lazyConstGlobal);
    Expect.equals("lazyNonConstGlobal_mutated", lib.lazyNonConstGlobal);
    Expect.equals("lazyConstGlobal_mutated", lib.readLazyConstGlobal());
    Expect.equals("lazyNonConstGlobal_mutated", lib.readLazyNonConstGlobal());
    Expect.equals(2, lib.sideEffectCounter);

    lib.writeLazyConstGlobal("lazyConstGlobal_mutated2");
    lib.writeLazyNonConstGlobal("lazyNonConstGlobal_mutated2");
    Expect.equals("lazyConstGlobal_mutated2", lib.lazyConstGlobal);
    Expect.equals("lazyNonConstGlobal_mutated2", lib.lazyNonConstGlobal);
    Expect.equals("lazyConstGlobal_mutated2", lib.readLazyConstGlobal());
    Expect.equals("lazyNonConstGlobal_mutated2", lib.readLazyNonConstGlobal());

    Expect.mapEquals({}, lib.lazyConstGlobal2);
    lib.const1Global = const {'foo': 'bar'};
    Expect.equals(2, lib.sideEffectCounter);
    Expect.equals(const {'foo': 'bar'}['foo'], lib.const1Global['foo']);
    // Try loading the deferred library again, should not reset the globals.
    lib.loadLibrary().then((_) {
      Expect.equals(const {'foo': 'bar'}['foo'], lib.const1Global['foo']);
      asyncEnd();
    });
  });
}
