# Copyright (c) 2021, 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.

type: newworld
worlds:
  - entry: main.dart
    errors: true
    sources:
      main.dart: |
        import 'lib.dart';
        part 'part.dart';
        void main() {}
      part.dart: |
        part of "main.dart";
        void partMethod() {}
      lib.dart: |
        import 'part.dart';
        import 'part.dart';
        import 'part.dart';
        void libMethod() {
          partMethod();
        }
    expectedLibraryCount: 2
  - entry: main.dart
    invalidate:
      - lib.dart
    sources:
      main.dart: |
        import 'lib.dart';
        part 'part.dart';
        void main() {}
      part.dart: |
        part of "main.dart";
        void partMethod() {}
      lib.dart: |
        void libMethod() {}
    expectedLibraryCount: 2
