# 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
target: VM
worlds:
  - entry: main.dart
    sources:
      .dart_tool/package_config.json: |
        {
          "configVersion": 2,
          "packages": [
            {
              "name": "flutter",
              "rootUri": "../flutter",
              "languageVersion": "2.12"
            }
          ]
        }
      main.dart: |
        import 'package:flutter/object.dart';
        import 'lib.dart';
        
        class Adaptor extends RenderFoo with LibMixin {}

        class AdaptorElement extends RenderObject {
          Adaptor get renderObject => super.renderObject;
          void foo() {
            print(renderObject.constraints.axis);
          }
        }
      lib.dart: |
        import 'package:flutter/object.dart';
        mixin LibMixin on RenderObject {}
      flutter/object.dart: |
        class RenderFoo extends RenderObject {
          FooConstraints get constraints => super.constraints as FooConstraints;
        }
        class FooConstraints extends Constraints {
          String get axis => "hello";
        }
        class Constraints {}
        class RenderObject {
          Constraints get constraints => new Constraints();
          RenderObject get renderObject => this;
        }
    expectedLibraryCount: 3

  - entry: main.dart
    worldType: updated
    expectInitializeFromDill: false
    invalidate:
      - main.dart
    expectedLibraryCount: 3
