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

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;
  ResolutionWorldBuilderImpl 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.resolutionWorldBuilder;

    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,
    },
  });
}
