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

library tests.dart2js.interop_anonymous_unreachable_test;

import 'dart:async';

import 'package:test/test.dart';
import 'compiler_helper.dart';

main() {
  test("unreachable code doesn't crash the compiler", () async {
    // This test is a regression for Issue #24974
    String generated = await compile(
        """
        import 'package:js/js.dart';

        @JS() @anonymous
        class UniqueLongNameForTesting_A {
          external factory UniqueLongNameForTesting_A();
        }
        main() {}
    """,
        returnAll: true);

    // the code should not be included in the output either.
    expect(generated, isNot(contains("UniqueLongNameForTesting_A")));
  });

  group('tree-shaking interop types', () {
    String program = """
        import 'package:js/js.dart';

        // reachable and allocated
        @JS() @anonymous
        class UniqueLongNameForTesting_A {
          external bool get x;
          external UniqueLongNameForTesting_D get d;
          external UniqueLongNameForTesting_E get e;
          external factory UniqueLongNameForTesting_A(
              {UniqueLongNameForTesting_B arg0});
        }

        // visible through the parameter above, but not used.
        @JS() @anonymous
        class UniqueLongNameForTesting_B {
          external factory UniqueLongNameForTesting_B();
        }

        // unreachable
        @JS() @anonymous
        class UniqueLongNameForTesting_C {
          external factory UniqueLongNameForTesting_C();
        }

        // visible and reached through `d`.
        @JS() @anonymous
        class UniqueLongNameForTesting_D {
          external factory UniqueLongNameForTesting_D();
        }

        // visible through `e`, but not reached.
        @JS() @anonymous
        class UniqueLongNameForTesting_E {
          external factory UniqueLongNameForTesting_E();
        }

        main() {
          print(new UniqueLongNameForTesting_A().x);
          print(new UniqueLongNameForTesting_A().d);
        }
    """;

    test('no tree-shaking by default', () async {
      String generated = await compile(program, returnAll: true);
      expect(generated.contains("UniqueLongNameForTesting_A"), isTrue);
      expect(generated.contains("UniqueLongNameForTesting_D"), isTrue);

      expect(generated.contains("UniqueLongNameForTesting_B"), isTrue);
      expect(generated.contains("UniqueLongNameForTesting_C"), isTrue);
      expect(generated.contains("UniqueLongNameForTesting_E"), isTrue);
    });

    test('tree-shake when using flag', () async {
      String generated = await compile(program,
          trustJSInteropTypeAnnotations: true, returnAll: true);
      expect(generated.contains("UniqueLongNameForTesting_A"), isTrue);
      expect(generated.contains("UniqueLongNameForTesting_D"), isTrue);

      expect(generated.contains("UniqueLongNameForTesting_B"), isFalse);
      expect(generated.contains("UniqueLongNameForTesting_C"), isFalse);
      expect(generated.contains("UniqueLongNameForTesting_E"), isFalse);
    });
  });

  group('tree-shaking other native types', () {
    String program = """
        import 'dart:html';
        import 'package:js/js.dart';

        @JS() @anonymous
        class UniqueLongNameForTesting_A {
          external dynamic get x;
        }

        @JS() @anonymous
        class UniqueLongNameForTesting_B {
          external dynamic get y;
        }

        main() {
          print(new UniqueLongNameForTesting_A().x);
        }
    """;

    test('allocation effect of dynamic excludes native types', () async {
      String generated = await compile(program, returnAll: true);
      expect(generated.contains("UniqueLongNameForTesting_A"), isTrue);
      // any js-interop type could be allocated by `get x`
      expect(generated.contains("UniqueLongNameForTesting_B"), isTrue);
      // but we exclude other native types like HTMLAudioElement
      expect(generated.contains("HTMLAudioElement"), isFalse);
    });

    test('allocation effect of dynamic excludes native types [flag]', () async {
      // Trusting types doesn't make a difference.
      String generated = await compile(program,
          trustJSInteropTypeAnnotations: true, returnAll: true);
      expect(generated.contains("UniqueLongNameForTesting_A"), isTrue);
      expect(generated.contains("UniqueLongNameForTesting_B"), isTrue);
      expect(generated.contains("HTMLAudioElement"), isFalse);
    });

    test('declared native types are included in allocation effect', () async {
      String program2 = """
          import 'dart:html';
          import 'package:js/js.dart';

          @JS() @anonymous
          class UniqueLongNameForTesting_A {
            external AudioElement get x;
          }

          main() {
            print(new UniqueLongNameForTesting_A().x is AudioElement);
          }
      """;

      String generated = await compile(program2, returnAll: true);
      expect(generated.contains("UniqueLongNameForTesting_A"), isTrue);
      expect(generated.contains("HTMLAudioElement"), isTrue);

      program2 = """
          import 'dart:html';
          import 'package:js/js.dart';

          @JS() @anonymous
          class UniqueLongNameForTesting_A {
            external dynamic get x;
          }

          main() {
            print(new UniqueLongNameForTesting_A().x is AudioElement);
          }
      """;

      generated = await compile(program2, returnAll: true);
      expect(generated.contains("UniqueLongNameForTesting_A"), isTrue);
      // This extra check is to make sure that we don't include HTMLAudioElement
      // just because of the is-check. It is optimized away in this case because
      // we believe it was never instantiated.
      expect(generated.contains("HTMLAudioElement"), isFalse);
    });
  });
}
