# Copyright (c) 2020, 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.md file.

# A field has 2 references. Both should be passed when creating a new field
# for references to both set and get to work. And both should be put in the
# `buildersCreatedWithReferences` map so - when lazy-loading a dill library
# with additional exports to a library that we're currently recompiling
# those will get setup correctly too.

type: newworld
worlds:
  - entry: main.dart
    experiments: alternative-invalidation-strategy
    sources:
      main.dart: |
        import 'libExporter.dart';
        void foo() {
          int value = libField;
          libField = value+1;
        }
      libExporter.dart: |
        export "lib.dart";
        String fromLibExporter = "hello";
      lib.dart: |
        import "libExporter.dart";
        int libField = 42;
        void requireStuffFromLibExporter() {
          print(fromLibExporter);
        }
    expectedLibraryCount: 3

  - entry: main.dart
    experiments: alternative-invalidation-strategy
    worldType: updated
    expectInitializeFromDill: false
    invalidate:
      - lib.dart
    expectedLibraryCount: 3
    expectsRebuildBodiesOnly: true

  - entry: main.dart
    experiments: alternative-invalidation-strategy
    worldType: updated
    expectInitializeFromDill: false
    invalidate:
      - libExporter.dart
    expectedLibraryCount: 3
    expectsRebuildBodiesOnly: true

  - entry: main.dart
    experiments: alternative-invalidation-strategy
    worldType: updated
    expectInitializeFromDill: false
    invalidate:
      - main.dart
    expectedLibraryCount: 3
    expectsRebuildBodiesOnly: true