// Copyright (c) 2018, 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.7

import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/common/elements.dart';
import 'package:compiler/src/elements/entities.dart';
import 'package:compiler/src/ir/static_type.dart';
import 'package:compiler/src/js_backend/native_data.dart';
import 'package:compiler/src/universe/resolution_world_builder.dart';
import 'package:compiler/src/universe/world_builder.dart';
import '../helpers/memory_compiler.dart';

main() {
  asyncTest(() async {
    await runTest();
  });
}

runTest() async {
  String classes = '''
@JS()
library lib;

import 'package:js/js.dart';

class A {}
class A1 extends A {}
class A2 extends A1 {}

class B implements A {}
class B1 extends B {}

class C {}
class C0 {}
class C1 = C with A;
class C2 extends C1 {}
class C3 = C with C0, A;
class C4 = C with A, C0;

@JS()
class D {}

@JS()
class D1 extends D {}

''';

  CommonElements commonElements;
  NativeBasicData nativeBasicData;
  ResolutionWorldBuilder world;

  List<ClassEntity> allClasses;

  ClassEntity A;
  ClassEntity A1;
  ClassEntity A2;
  ClassEntity B;
  ClassEntity B1;
  ClassEntity C;
  ClassEntity C0;
  ClassEntity C1;
  ClassEntity C2;
  ClassEntity C3;
  ClassEntity C4;
  ClassEntity D;
  ClassEntity D1;

  List<ClassRelation> allRelations = ClassRelation.values;
  List<ClassRelation> notExact = [
    ClassRelation.thisExpression,
    ClassRelation.subtype
  ];
  List<ClassRelation> subtype = [ClassRelation.subtype];

  run(List<String> liveClasses) async {
    String source = '''
$classes
main() {
${liveClasses.map((c) => '  new $c();').join('\n')}
}
''';
    print('------------------------------------------------------------------');
    print(source);
    CompilationResult result =
        await runCompiler(memorySourceFiles: {'main.dart': source});
    Expect.isTrue(result.isSuccess);
    Compiler compiler = result.compiler;
    commonElements = compiler.frontendStrategy.commonElements;
    ElementEnvironment elementEnvironment =
        compiler.frontendStrategy.elementEnvironment;
    nativeBasicData = compiler.frontendStrategy.nativeBasicData;
    world = compiler.resolutionWorldBuilderForTesting;

    ClassEntity findClass(String name) {
      ClassEntity cls =
          elementEnvironment.lookupClass(elementEnvironment.mainLibrary, name);
      Expect.isNotNull(cls, 'Class $name not found.');
      return cls;
    }

    allClasses = [
      A = findClass('A'),
      A1 = findClass('A1'),
      A2 = findClass('A2'),
      B = findClass('B'),
      B1 = findClass('B1'),
      C = findClass('C'),
      C0 = findClass('C0'),
      C1 = findClass('C1'),
      C2 = findClass('C2'),
      C3 = findClass('C3'),
      C4 = findClass('C4'),
      D = findClass('D'),
      D1 = findClass('D1'),
    ];
  }

  void check(
      Map<ClassEntity, Map<ClassEntity, List<ClassRelation>>> expectedResults) {
    for (ClassEntity cls in allClasses) {
      for (ClassEntity memberHoldingClass in allClasses) {
        Map<ClassEntity, List<ClassRelation>> memberResults =
            expectedResults[memberHoldingClass] ?? {};
        for (ClassRelation relation in allRelations) {
          List<ClassRelation> expectRelations = memberResults[cls];
          bool expectedResult =
              expectRelations != null && expectRelations.contains(relation);
          StrongModeConstraint constraint = new StrongModeConstraint(
              commonElements, nativeBasicData, cls, relation);
          Expect.equals(
              expectedResult,
              world.isInheritedInClass(
                  memberHoldingClass, constraint.cls, constraint.relation),
              "Unexpected results for member of $memberHoldingClass on a "
              "receiver $constraint (cls=$cls, relation=$relation)");
        }
      }
    }
  }

  await run([]);
  check({});

  await run(['A']);
  check({
    A: {A: allRelations},
  });

  await run(['A1']);
  check({
    A: {
      A: notExact,
      A1: allRelations,
    },
    A1: {
      A: notExact,
      A1: allRelations,
    },
  });

  await run(['A', 'A1']);
  check({
    A: {
      A: allRelations,
      A1: allRelations,
    },
    A1: {
      A: notExact,
      A1: allRelations,
    },
  });

  await run(['A2']);
  check({
    A: {
      A: notExact,
      A1: notExact,
      A2: allRelations,
    },
    A1: {
      A: notExact,
      A1: notExact,
      A2: allRelations,
    },
    A2: {
      A: notExact,
      A1: notExact,
      A2: allRelations,
    },
  });

  await run(['A', 'A2']);
  check({
    A: {
      A: allRelations,
      A1: notExact,
      A2: allRelations,
    },
    A1: {
      A: notExact,
      A1: notExact,
      A2: allRelations,
    },
    A2: {
      A: notExact,
      A1: notExact,
      A2: allRelations,
    },
  });

  await run(['A1', 'A2']);
  check({
    A: {
      A: notExact,
      A1: allRelations,
      A2: allRelations,
    },
    A1: {
      A: notExact,
      A1: allRelations,
      A2: allRelations,
    },
    A2: {
      A: notExact,
      A1: notExact,
      A2: allRelations,
    },
  });

  await run(['B']);
  check({
    B: {
      A: subtype,
      B: allRelations,
    },
  });

  await run(['B1']);
  check({
    B: {
      A: subtype,
      B: notExact,
      B1: allRelations,
    },
    B1: {
      A: subtype,
      B: notExact,
      B1: allRelations,
    },
  });

  await run(['A', 'A2', 'B']);
  check({
    A: {
      A: allRelations,
      A1: notExact,
      A2: allRelations,
    },
    A1: {
      A: notExact,
      A1: notExact,
      A2: allRelations,
    },
    A2: {
      A: notExact,
      A1: notExact,
      A2: allRelations,
    },
    B: {A: subtype, B: allRelations},
  });

  await run(['C']);
  check({
    C: {
      C: allRelations,
    },
  });

  await run(['C1']);
  check({
    A: {
      A: notExact,
      C: notExact,
      C1: allRelations,
    },
    C: {
      A: notExact,
      C: notExact,
      C1: allRelations,
    },
    C1: {
      A: notExact,
      C: notExact,
      C1: allRelations,
    },
  });

  await run(['C2']);
  check({
    A: {
      A: notExact,
      C: notExact,
      C1: notExact,
      C2: allRelations,
    },
    C: {
      A: notExact,
      C: notExact,
      C1: notExact,
      C2: allRelations,
    },
    C1: {
      A: notExact,
      C: notExact,
      C1: notExact,
      C2: allRelations,
    },
    C2: {
      A: notExact,
      C: notExact,
      C1: notExact,
      C2: allRelations,
    },
  });

  await run(['C3']);
  check({
    A: {
      A: notExact,
      C: notExact,
      C0: notExact,
      C3: allRelations,
    },
    C: {
      A: notExact,
      C: notExact,
      C0: notExact,
      C3: allRelations,
    },
    C0: {
      A: notExact,
      C: notExact,
      C0: notExact,
      C3: allRelations,
    },
    C3: {
      A: notExact,
      C: notExact,
      C0: notExact,
      C3: allRelations,
    },
  });

  await run(['C4']);
  check({
    A: {
      A: notExact,
      C: notExact,
      C0: notExact,
      C4: allRelations,
    },
    C: {
      A: notExact,
      C: notExact,
      C0: notExact,
      C4: allRelations,
    },
    C0: {
      A: notExact,
      C: notExact,
      C0: notExact,
      C4: allRelations,
    },
    C4: {
      A: notExact,
      C: notExact,
      C0: notExact,
      C4: allRelations,
    },
  });

  await run(['A2', 'C1']);
  check({
    A: {
      A: notExact,
      A1: notExact,
      A2: allRelations,
      C: notExact,
      C1: allRelations,
    },
    A1: {
      A: notExact,
      A1: notExact,
      A2: allRelations,
    },
    A2: {
      A: notExact,
      A1: notExact,
      A2: allRelations,
    },
    C: {
      A: notExact,
      C: notExact,
      C1: allRelations,
    },
    C1: {
      A: notExact,
      C: notExact,
      C1: allRelations,
    },
  });

  await run(['D']);
  check({
    D: {
      D: allRelations,
      D1: allRelations,
    },
  });
  await run(['D1']);
  check({
    D: {
      D: allRelations,
      D1: allRelations,
    },
    D1: {
      D: allRelations,
      D1: allRelations,
    },
  });
}
