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

// @dart = 2.9

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

const simpleClassSource = '''
extension NumberParsing on String {
  int parseInt() {
    return int.parse(this) + 1;
  }
}

class C {
  static int staticField = 1;
  static int _staticField = 2;
  static int _unusedStaticField = 3;
  int field;
  int _field;
  int _unusedField = 4;

  C(this.field, this._field) {
    int y = 1;
    // Breakpoint: constructorBP
    var nop;
  }

  C.named(this.field): _field = 42;

  C.redirecting(int x) : this(x, 99);

  factory C.factory() => C(42, 0);

  int methodFieldAccess(int x) {
    // Breakpoint: methodBP
    var inScope = 1;
    {
      var innerInScope = global + staticField + field;
      // Breakpoint: innerScopeBP
      var innerNotInScope = 2;
    }
    var notInScope = 3;
    return x + _field + _staticField;
  }

  Future<int> asyncMethod(int x) async {
    return x + _field + _staticField;
  }
}

int global = 42;

main() {
  int x = 15;
  var c = C(5, 6);
  // Breakpoint: globalFunctionBP
  c.methodFieldAccess(10);
}
''';

/// Shared tests that require a language version >=2.12.0 <2.17.0.
// TODO(nshahan) Merge with [runAgnosticSharedTests] after we no longer need to
// test support for evaluation in legacy (pre-null safety) code.
void runNullSafeSharedTests(SetupCompilerOptions setup, TestDriver driver) {
  group('Correct null safety mode used', () {
    var source = '''
        const soundNullSafety = !(<Null>[] is List<int>);
        main() {
          // Breakpoint: bp
          print('hello world');
        }
        ''';

    setUpAll(() async {
      await driver.initSource(setup, source);
    });

    tearDownAll(() async {
      await driver.cleanupTest();
    });

    test('in original source compilation', () async {
      await driver.check(
          breakpointId: 'bp',
          expression: 'soundNullSafety',
          expectedResult: setup.soundNullSafety.toString());
    });

    test('in expression compilation', () async {
      await driver.check(
          breakpointId: 'bp',
          expression: '!(<Null>[] is List<int>)',
          expectedResult: setup.soundNullSafety.toString());
    });
  });

  group('Expression compiler tests in method:', () {
    var source = simpleClassSource;

    setUpAll(() async {
      await driver.initSource(setup, source);
    });

    tearDownAll(() async {
      await driver.cleanupTest();
    });

    test('tear off default constructor', () async {
      await driver.check(
          breakpointId: 'methodBP',
          expression: 'C.new.runtimeType.toString()',
          expectedResult: '(int, int) => C');
    });

    test('call default constructor tear off', () async {
      await driver.check(
          breakpointId: 'methodBP',
          expression: '(C.new)(0, 0)',
          expectedResult: 'test.C.new {Symbol(_unusedField): 4, '
              'Symbol(C.field): 0, Symbol(_field): 0}');
    });

    test('tear off named constructor', () async {
      await driver.check(
          breakpointId: 'methodBP',
          expression: 'C.named.runtimeType.toString()',
          expectedResult: '(int) => C');
    });

    test('call named constructor tear off', () async {
      await driver.check(
          breakpointId: 'methodBP',
          expression: '(C.named)(0)',
          expectedResult: 'test.C.named {Symbol(_unusedField): 4, '
              'Symbol(C.field): 0, Symbol(_field): 42}');
    });

    test('tear off redirecting constructor', () async {
      await driver.check(
          breakpointId: 'methodBP',
          expression: 'C.redirecting.runtimeType.toString()',
          expectedResult: '(int) => C');
    });

    test('call redirecting constructor tear off', () async {
      await driver.check(
          breakpointId: 'methodBP',
          expression: '(C.redirecting)(0)',
          expectedResult: 'test.C.redirecting { Symbol(_unusedField): 4, '
              'Symbol(C.field): 0, Symbol(_field): 99}');
    });

    test('tear off factory constructor', () async {
      await driver.check(
          breakpointId: 'methodBP',
          expression: 'C.factory.runtimeType.toString()',
          expectedResult: '() => C');
    });

    test('call factory constructor tear off', () async {
      await driver.check(
          breakpointId: 'methodBP',
          expression: '(C.factory)()',
          expectedResult: 'test.C.new { Symbol(_unusedField): 4, '
              'Symbol(C.field): 42, Symbol(_field): 0}');
    });
  });

  group('Expression compiler tests in global function:', () {
    var source = simpleClassSource;

    setUpAll(() async {
      await driver.initSource(setup, source);
    });

    tearDownAll(() async {
      await driver.cleanupTest();
    });

    test('tear off default constructor', () async {
      await driver.check(
          breakpointId: 'globalFunctionBP',
          expression: 'C.new.runtimeType.toString()',
          expectedResult: '(int, int) => C');
    });

    test('call default constructor tear off', () async {
      await driver.check(
          breakpointId: 'globalFunctionBP',
          expression: '(C.new)(0, 0)',
          expectedResult: 'test.C.new {Symbol(_unusedField): 4, '
              'Symbol(C.field): 0, Symbol(_field): 0}');
    });

    test('tear off named constructor', () async {
      await driver.check(
          breakpointId: 'globalFunctionBP',
          expression: 'C.named.runtimeType.toString()',
          expectedResult: '(int) => C');
    });

    test('call named constructor tear off', () async {
      await driver.check(
          breakpointId: 'globalFunctionBP',
          expression: '(C.named)(0)',
          expectedResult: 'test.C.named {Symbol(_unusedField): 4, '
              'Symbol(C.field): 0, Symbol(_field): 42}');
    });

    test('tear off redirecting constructor', () async {
      await driver.check(
          breakpointId: 'globalFunctionBP',
          expression: 'C.redirecting.runtimeType.toString()',
          expectedResult: '(int) => C');
    });

    test('call redirecting constructor tear off', () async {
      await driver.check(
          breakpointId: 'globalFunctionBP',
          expression: '(C.redirecting)(0)',
          expectedResult: 'test.C.redirecting { Symbol(_unusedField): 4, '
              'Symbol(C.field): 0, Symbol(_field): 99}');
    });

    test('tear off factory constructor', () async {
      await driver.check(
          breakpointId: 'globalFunctionBP',
          expression: 'C.factory.runtimeType.toString()',
          expectedResult: '() => C');
    });

    test('call factory constructor tear off', () async {
      await driver.check(
          breakpointId: 'globalFunctionBP',
          expression: '(C.factory)()',
          expectedResult: 'test.C.new { Symbol(_unusedField): 4, '
              'Symbol(C.field): 42, Symbol(_field): 0}');
    });
  });

  group('Expression compiler tests in constructor:', () {
    var source = simpleClassSource;

    setUpAll(() async {
      await driver.initSource(setup, source);
    });

    tearDownAll(() async {
      await driver.cleanupTest();
    });

    test('tear off default constructor', () async {
      await driver.check(
          breakpointId: 'constructorBP',
          expression: 'C.new.runtimeType.toString()',
          expectedResult: '(int, int) => C');
    });

    test('call default constructor tear off', () async {
      await driver.check(
          breakpointId: 'constructorBP',
          expression: '(C.new)(0, 0)',
          expectedResult: 'test.C.new {Symbol(_unusedField): 4, '
              'Symbol(C.field): 0, Symbol(_field): 0}');
    });

    test('tear off named constructor', () async {
      await driver.check(
          breakpointId: 'constructorBP',
          expression: 'C.named.runtimeType.toString()',
          expectedResult: '(int) => C');
    });

    test('call named constructor tear off', () async {
      await driver.check(
          breakpointId: 'constructorBP',
          expression: '(C.named)(0)',
          expectedResult: 'test.C.named {Symbol(_unusedField): 4, '
              'Symbol(C.field): 0, Symbol(_field): 42}');
    });

    test('tear off redirecting constructor', () async {
      await driver.check(
          breakpointId: 'constructorBP',
          expression: 'C.redirecting.runtimeType.toString()',
          expectedResult: '(int) => C');
    });

    test('call redirecting constructor tear off', () async {
      await driver.check(
          breakpointId: 'constructorBP',
          expression: '(C.redirecting)(0)',
          expectedResult: 'test.C.redirecting { Symbol(_unusedField): 4, '
              'Symbol(C.field): 0, Symbol(_field): 99}');
    });

    test('tear off factory constructor', () async {
      await driver.check(
          breakpointId: 'constructorBP',
          expression: 'C.factory.runtimeType.toString()',
          expectedResult: '() => C');
    });

    test('call factory constructor tear off', () async {
      await driver.check(
          breakpointId: 'constructorBP',
          expression: '(C.factory)()',
          expectedResult: 'test.C.new { Symbol(_unusedField): 4, '
              'Symbol(C.field): 42, Symbol(_field): 0}');
    });
  });

  group('Enums', () {
    var source = r'''
      enum E {id1, id2, id3}

      enum E2 {id1, id2, id3}

      main() {
        var e = E.id2;
        // Breakpoint: bp
        print('hello world');
      }
        ''';

    setUpAll(() async {
      await driver.initSource(setup, source);
    });

    tearDownAll(() async {
      await driver.cleanupTest();
    });

    test('evaluate to the correct string', () async {
      await driver.check(
          breakpointId: 'bp',
          expression: 'E.id2.toString()',
          expectedResult: 'E.id2');
    });
    test('evaluate to the correct index', () async {
      await driver.check(
          breakpointId: 'bp', expression: 'E.id3.index', expectedResult: '2');
    });
    test('compare properly against themselves', () async {
      await driver.check(
          breakpointId: 'bp',
          expression: 'e == E.id2 && E.id2 == E.id2',
          expectedResult: 'true');
    });
    test('compare properly against other enums', () async {
      await driver.check(
          breakpointId: 'bp',
          expression: 'e != E2.id2 && E.id2 != E2.id2',
          expectedResult: 'true');
    });
  });
}

/// Shared tests that are valid in legacy (before 2.12) and are agnostic to
/// changes in modern versions of Dart.
///
/// Tests that exercise language features introduced strictly before 2.12 are
/// valid here.
void runAgnosticSharedTests(SetupCompilerOptions setup, TestDriver driver) {
  group('Correct null safety mode used', () {
    var source = '''
        const soundNullSafety = !(<Null>[] is List<int>);
        main() {
          // Breakpoint: bp
          print('hello world');
        }
        ''';

    setUpAll(() async {
      await driver.initSource(setup, source);
    });

    tearDownAll(() async {
      await driver.cleanupTest();
    });

    test('in original source compilation', () async {
      await driver.check(
          breakpointId: 'bp',
          expression: 'soundNullSafety',
          expectedResult: setup.soundNullSafety.toString());
    });

    test('in expression compilation', () async {
      await driver.check(
          breakpointId: 'bp',
          expression: '!(<Null>[] is List<int>)',
          expectedResult: setup.soundNullSafety.toString());
    });
  });

  group('Expression compiler scope collection tests', () {
    var source = simpleClassSource;

    setUpAll(() async {
      await driver.initSource(setup, source);
    });

    tearDownAll(() async {
      await driver.cleanupTest();
    });

    test('local in scope', () async {
      await driver.check(
          breakpointId: 'innerScopeBP',
          expression: 'inScope',
          expectedResult: '1');
    });

    test('local in inner scope', () async {
      await driver.check(
          breakpointId: 'innerScopeBP',
          expression: 'innerInScope',
          expectedResult: '48');
    });

    test('global in scope', () async {
      await driver.check(
          breakpointId: 'innerScopeBP',
          expression: 'global',
          expectedResult: '42');
    });

    test('static field in scope', () async {
      await driver.check(
          breakpointId: 'innerScopeBP',
          expression: 'staticField',
          expectedResult: '1');
    });

    test('field in scope', () async {
      await driver.check(
          breakpointId: 'innerScopeBP',
          expression: 'field',
          expectedResult: '5');
    });

    test('parameter in scope', () async {
      await driver.check(
          breakpointId: 'innerScopeBP', expression: 'x', expectedResult: '10');
    });

    test('local not in scope', () async {
      await driver.check(
          breakpointId: 'innerScopeBP',
          expression: 'notInScope',
          expectedError: "Error: The getter 'notInScope' isn't defined for the"
              " class 'C'.");
    });

    test('local not in inner scope', () async {
      await driver.check(
          breakpointId: 'innerScopeBP',
          expression: 'innerNotInScope',
          expectedError:
              "Error: The getter 'innerNotInScope' isn't defined for the"
              " class 'C'.");
    });
  });

  group('Expression compiler extension symbols tests', () {
    var source = '''
        main() {
          List<int> list = [];
          list.add(0);
          // Breakpoint: bp
        }
        ''';

    setUpAll(() async {
      await driver.initSource(setup, source);
    });

    tearDownAll(() async {
      await driver.cleanupTest();
    });

    test('extension symbol used only in expression compilation', () async {
      await driver.check(
          breakpointId: 'bp', expression: 'list.first', expectedResult: '0');
    });

    test('extension symbol used in original compilation', () async {
      await driver.check(
          breakpointId: 'bp',
          expression: '() { list.add(1); return list.last; }()',
          expectedResult: '1');
    });
  });

  group('Expression compiler tests in extension method:', () {
    var source = '''
        extension NumberParsing on String {
          int parseInt() {
            var ret = int.parse(this);
            // Breakpoint: bp
            return ret;
          }
        }
        main() => "1234".parseInt();
      ''';

    setUpAll(() async {
      await driver.initSource(setup, source);
    });

    tearDownAll(() async {
      await driver.cleanupTest();
    });

    test('compilation error', () async {
      await driver.check(
          breakpointId: 'bp',
          expression: 'typo',
          expectedError: "Error: Undefined name 'typo'");
    });

    test('local (trimmed scope)', () async {
      await driver.check(
          breakpointId: 'bp', expression: 'ret', expectedResult: '1234');
    });

    test('this (full scope)', () async {
      // Note: this currently fails due to
      // - incremental compiler not mapping 'this' from user input to '#this'
      // - incremental compiler not allowing #this as a parameter name
      await driver.check(
          breakpointId: 'bp',
          expression: 'this',
          expectedError: "Error: Expected identifier, but got 'this'");
    });
  });

  group('Expression compiler tests in static function:', () {
    var source = '''
        int foo(int x, {int y: 0}) {
          int z = 3;
          // Breakpoint: bp
          return x + y + z;
        }

        main() => foo(1, y: 2);
        ''';

    setUpAll(() async {
      await driver.initSource(setup, source);
    });

    tearDownAll(() async {
      await driver.cleanupTest();
    });

    test('compilation error', () async {
      await driver.check(
          breakpointId: 'bp',
          expression: 'typo',
          expectedError: "Undefined name 'typo'");
    });

    test('local', () async {
      await driver.check(
          breakpointId: 'bp', expression: 'x', expectedResult: '1');
    });

    test('formal', () async {
      await driver.check(
          breakpointId: 'bp', expression: 'y', expectedResult: '2');
    });

    test('named formal', () async {
      await driver.check(
          breakpointId: 'bp', expression: 'z', expectedResult: '3');
    });

    test('function', () async {
      await driver
          .check(breakpointId: 'bp', expression: 'main', expectedResult: '''
              function main() {
                return test.foo(1, {y: 2});
              }''');
    });
  });

  group('Expression compiler tests in method:', () {
    var source = simpleClassSource;

    setUpAll(() async {
      await driver.initSource(setup, source);
    });

    tearDownAll(() async {
      await driver.cleanupTest();
    });

    test('compilation error', () async {
      await driver.check(
          breakpointId: 'methodBP',
          expression: 'typo',
          expectedError: "The getter 'typo' isn't defined for the class 'C'");
    });

    test('local', () async {
      await driver.check(
          breakpointId: 'methodBP', expression: 'x', expectedResult: '10');
    });

    test('this', () async {
      await driver.check(
          breakpointId: 'methodBP',
          expression: 'this',
          expectedResult:
              'test.C.new {Symbol(_unusedField): 4, Symbol(C.field): 5,'
              ' Symbol(_field): 6}');
    });

    test('expression using locals', () async {
      await driver.check(
          breakpointId: 'methodBP', expression: 'x + 1', expectedResult: '11');
    });

    test('expression using static fields', () async {
      await driver.check(
          breakpointId: 'methodBP',
          expression: 'x + staticField',
          expectedResult: '11');
    });

    test('expression using private static fields', () async {
      await driver.check(
          breakpointId: 'methodBP',
          expression: 'x + _staticField',
          expectedResult: '12');
    });

    test('expression using fields', () async {
      await driver.check(
          breakpointId: 'methodBP',
          expression: 'x + field',
          expectedResult: '15');
    });

    test('expression using private fields', () async {
      await driver.check(
          breakpointId: 'methodBP',
          expression: 'x + _field',
          expectedResult: '16');
    });

    test('expression using globals', () async {
      await driver.check(
          breakpointId: 'methodBP',
          expression: 'x + global',
          expectedResult: '52');
    });

    test('expression using fields not referred to in the original  code',
        () async {
      await driver.check(
          breakpointId: 'methodBP',
          expression: '_unusedField + _unusedStaticField',
          expectedResult: '7');
    });

    test('private field modification', () async {
      await driver.check(
          breakpointId: 'methodBP',
          expression: '_field = 2',
          expectedResult: '2');
    });

    test('field modification', () async {
      await driver.check(
          breakpointId: 'methodBP',
          expression: 'field = 3',
          expectedResult: '3');
    });

    test('private static field modification', () async {
      await driver.check(
          breakpointId: 'methodBP',
          expression: '_staticField = 4',
          expectedResult: '4');
    });

    test('static field modification', () async {
      await driver.check(
          breakpointId: 'methodBP',
          expression: 'staticField = 5',
          expectedResult: '5');
    });
  });

  group('Expression compiler tests in global function:', () {
    var source = simpleClassSource;

    setUpAll(() async {
      await driver.initSource(setup, source);
    });

    tearDownAll(() async {
      await driver.cleanupTest();
    });

    test('compilation error', () async {
      await driver.check(
          breakpointId: 'globalFunctionBP',
          expression: 'typo',
          expectedError: "Undefined name 'typo'.");
    });

    test('local with primitive type', () async {
      await driver.check(
          breakpointId: 'globalFunctionBP',
          expression: 'x',
          expectedResult: '15');
    });

    test('local object', () async {
      await driver.check(
          breakpointId: 'globalFunctionBP',
          expression: 'c',
          expectedResult:
              'test.C.new {Symbol(_unusedField): 4, Symbol(C.field): 5, '
              'Symbol(_field): 6}');
    });

    test('create new object', () async {
      await driver.check(
          breakpointId: 'globalFunctionBP',
          expression: 'C(3, 4)',
          expectedResult:
              'test.C.new {Symbol(_unusedField): 4, Symbol(C.field): 3, '
              'Symbol(_field): 4}');
    });

    test('access field of new object', () async {
      await driver.check(
          breakpointId: 'globalFunctionBP',
          expression: 'C(3, 4)._field',
          expectedResult: '4');
    });

    test('access static field', () async {
      await driver.check(
          breakpointId: 'globalFunctionBP',
          expression: 'C.staticField',
          expectedResult: '1');
    });

    test('expression using private static fields', () async {
      await driver.check(
          breakpointId: 'globalFunctionBP',
          expression: 'C._staticField',
          expectedResult: '2');
    });

    test('access field', () async {
      await driver.check(
          breakpointId: 'globalFunctionBP',
          expression: 'c.field',
          expectedResult: '5');
    });

    test('access private field', () async {
      await driver.check(
          breakpointId: 'globalFunctionBP',
          expression: 'c._field',
          expectedResult: '6');
    });

    test('method call', () async {
      await driver.check(
          breakpointId: 'globalFunctionBP',
          expression: 'c.methodFieldAccess(2)',
          expectedResult: '10');
    });

    test('async method call', () async {
      await driver.check(
          breakpointId: 'globalFunctionBP',
          expression: 'c.asyncMethod(2).runtimeType.toString()',
          expectedResult: '_Future<int>');
    });

    test('extension method call', () async {
      await driver.check(
          breakpointId: 'globalFunctionBP',
          expression: '"1234".parseInt()',
          expectedResult: '1235');
    });

    test('private field modification', () async {
      await driver.check(
          breakpointId: 'globalFunctionBP',
          expression: 'c._field = 10',
          expectedResult: '10');
    });

    test('field modification', () async {
      await driver.check(
          breakpointId: 'globalFunctionBP',
          expression: 'c._field = 11',
          expectedResult: '11');
    });

    test('private static field modification', () async {
      await driver.check(
          breakpointId: 'globalFunctionBP',
          expression: 'C._staticField = 2',
          expectedResult: '2');
    });

    test('static field modification', () async {
      await driver.check(
          breakpointId: 'globalFunctionBP',
          expression: 'C.staticField = 20',
          expectedResult: '20');
    });

    test('call global function from core library', () async {
      await driver.check(
          breakpointId: 'globalFunctionBP',
          expression: 'identical(1, 1)',
          expectedResult: 'true');
    });
  });

  group('Expression compiler tests in constructor:', () {
    var source = simpleClassSource;

    setUpAll(() async {
      await driver.initSource(setup, source);
    });

    tearDownAll(() async {
      await driver.cleanupTest();
    });

    test('compilation error', () async {
      await driver.check(
          breakpointId: 'constructorBP',
          expression: 'typo',
          expectedError: "The getter 'typo' isn't defined for the class 'C'");
    });

    test('local', () async {
      await driver.check(
          breakpointId: 'constructorBP', expression: 'y', expectedResult: '1');
    });

    test('this', () async {
      await driver.check(
          breakpointId: 'constructorBP',
          expression: 'this',
          expectedResult:
              'test.C.new {Symbol(_unusedField): 4, Symbol(C.field): 5,'
              ' Symbol(_field): 6}');
    });

    test('expression using locals', () async {
      await driver.check(
          breakpointId: 'constructorBP',
          expression: 'y + 1',
          expectedResult: '2');
    });

    test('expression using static fields', () async {
      await driver.check(
          breakpointId: 'constructorBP',
          expression: 'y + staticField',
          expectedResult: '2');
    });

    test('expression using private static fields', () async {
      await driver.check(
          breakpointId: 'constructorBP',
          expression: 'y + _staticField',
          expectedResult: '3');
    });

    test('expression using fields', () async {
      await driver.check(
          breakpointId: 'constructorBP',
          expression: 'y + field',
          expectedResult: '6');
    });

    test('expression using private fields', () async {
      await driver.check(
          breakpointId: 'constructorBP',
          expression: 'y + _field',
          expectedResult: '7');
    });

    test('expression using globals', () async {
      await driver.check(
          breakpointId: 'constructorBP',
          expression: 'y + global',
          expectedResult: '43');
    });

    test('method call', () async {
      await driver.check(
          breakpointId: 'constructorBP',
          expression: 'methodFieldAccess(2)',
          expectedResult: '10');
    });

    test('async method call', () async {
      await driver.check(
          breakpointId: 'constructorBP',
          expression: 'asyncMethod(2).runtimeType.toString()',
          expectedResult: '_Future<int>');
    });

    test('extension method call', () async {
      await driver.check(
          breakpointId: 'constructorBP',
          expression: '"1234".parseInt()',
          expectedResult: '1235');
    });

    test('private field modification', () async {
      await driver.check(
          breakpointId: 'constructorBP',
          expression: '_field = 2',
          expectedResult: '2');
    });

    test('field modification', () async {
      await driver.check(
          breakpointId: 'constructorBP',
          expression: 'field = 2',
          expectedResult: '2');
    });

    test('private static field modification', () async {
      await driver.check(
          breakpointId: 'constructorBP',
          expression: '_staticField = 2',
          expectedResult: '2');
    });

    test('static field modification', () async {
      await driver.check(
          breakpointId: 'constructorBP',
          expression: 'staticField = 2',
          expectedResult: '2');
    });
  });

  group('Expression compiler tests in async method:', () {
    var source = '''
        class C {
          static int staticField = 1;
          static int _staticField = 2;
          int _field;
          int field;

          C(this.field, this._field);
          Future<int> asyncMethod(int x) async {
            // Breakpoint: bp
            return x + global + _field + field + staticField + _staticField;
          }
        }

        Future<int> entrypoint() async {
          var c = C(5, 7);
          // Breakpoint: bp1
          return await c.asyncMethod(1);
        }

        int global = 42;
        void main() async {
          await entrypoint();
        }
        ''';

    setUpAll(() async {
      await driver.initSource(setup, source);
    });

    tearDownAll(() async {
      await driver.cleanupTest();
    });

    test('compilation error', () async {
      await driver.check(
          breakpointId: 'bp',
          expression: 'typo',
          expectedError: "The getter 'typo' isn't defined for the class 'C'");
    });

    test('local', () async {
      await driver.check(
          breakpointId: 'bp', expression: 'x', expectedResult: '1');
    });

    test('this', () async {
      await driver.check(
          breakpointId: 'bp',
          expression: 'this',
          expectedResult: 'test.C.new {Symbol(C.field): 5, Symbol(_field): 7}');
    });

    test('awaited method call', () async {
      await driver.check(
          breakpointId: 'bp1',
          expression: 'c.asyncMethod(1).runtimeType.toString()',
          expectedResult: '_Future<int>');
    }, skip: "'await' is not yet supported in expression evaluation.");

    test('awaited method call', () async {
      await driver.check(
          breakpointId: 'bp1',
          expression: 'await c.asyncMethod(1)',
          expectedResult: '58');
    }, skip: "'await' is not yet supported in expression evaluation.");
  });

  group('Expression compiler tests in closures:', () {
    var source = '''
        void globalFunction() {
        int x = 15;

        var outerClosure = (int y) {
          var closureCaptureInner = (int z) {
            // Breakpoint: bp
            var temp = x + y + z;
            return;
          };
          closureCaptureInner(0);
        };

        outerClosure(3);
        return;
      }

      main() => globalFunction();
      ''';

    setUpAll(() async {
      await driver.initSource(setup, source);
    });

    tearDownAll(() async {
      await driver.cleanupTest();
    });

    test('compilation error', () async {
      await driver.check(
          breakpointId: 'bp',
          expression: 'typo',
          expectedError: "Undefined name 'typo'.");
    });

    test('expression using captured variables', () async {
      await driver.check(
          breakpointId: 'bp', expression: r"'$y+$z'", expectedResult: '3+0');
    });

    test('expression using uncaptured variables', () async {
      await driver.check(
          breakpointId: 'bp',
          expression: r"'$x+$y+$z'",
          expectedResult: '15+3+0');
    });
  });

  group('Expression compiler tests in method with no type use:', () {
    var source = '''
        abstract class Key {
          const factory Key(String value) = ValueKey;
          const Key.empty();
        }

        abstract class LocalKey extends Key {
          const LocalKey() : super.empty();
        }

        class ValueKey implements LocalKey {
          const ValueKey(this.value);
          final String value;
        }

        class MyClass {
          const MyClass(this._t);
          final int _t;
        }

        int bar(int p) {
          return p;
        }

        String baz(String t) {
          return t;
        }

        String main() {
          var k = Key('t');
          MyClass c = MyClass(0);
          int p = 1;
          const t = 1;

          // Breakpoint: bp
          return '\$c, \$k, \$t';
        }
        ''';

    setUpAll(() async {
      await driver.initSource(setup, source);
    });

    tearDownAll(() async {
      await driver.cleanupTest();
    });

    test('call function not using type', () async {
      await driver.check(
          breakpointId: 'bp', expression: 'bar(p)', expectedResult: '1');
    });

    test('call function using type', () async {
      await driver.check(
          breakpointId: 'bp', expression: "baz('\$p')", expectedResult: '1');
    });

    test('evaluate new const expression', () async {
      await driver.check(
          breakpointId: 'bp',
          expression: 'const MyClass(1)',
          expectedResult: 'MyClass {Symbol(MyClass._t): 1}');
    });

    test('evaluate optimized const expression', () async {
      await driver.check(
          breakpointId: 'bp', expression: 't', expectedResult: '1');
    },
        skip: 'Cannot compile constants optimized away by the frontend. '
            'Issue: https://github.com/dart-lang/sdk/issues/41999');

    test('evaluate factory constructor call', () async {
      await driver.check(
          breakpointId: 'bp',
          expression: "Key('t')",
          expectedResult: 'test.ValueKey.new {Symbol(ValueKey.value): t}');
    });

    test('evaluate const factory constructor call', () async {
      await driver.check(
          breakpointId: 'bp',
          expression: "const Key('t')",
          expectedResult: 'ValueKey {Symbol(ValueKey.value): t}');
    });
  });

  group('Expression compiler tests in simple loops:', () {
    var source = '''
        void globalFunction() {
          int x = 15;
          for(int i = 0; i < 10; i++) {
            // Breakpoint: bp
            var calculation = '\$i+\$x';
          };
        }

        main() => globalFunction();
        ''';

    setUpAll(() async {
      await driver.initSource(setup, source);
    });

    tearDownAll(() async {
      await driver.cleanupTest();
    });

    test('expression using local', () async {
      await driver.check(
          breakpointId: 'bp', expression: 'x', expectedResult: '15');
    });

    test('expression using loop variable', () async {
      await driver.check(
          breakpointId: 'bp', expression: 'i', expectedResult: '0');
    });
  });

  group('Expression compiler tests in conditional:', () {
    var source = '''
        int globalFunction(int x) {
          if (x == 1) {
            int y = 3;
            // Breakpoint: thenBP
            var calculation = '\$y+\$x';
          } else {
            int z = 4;
            // Breakpoint: elseBP
            var calculation = '\$z+\$x';
          }
          // Breakpoint: postBP
          return 0;
        }

        void main() {
          globalFunction(1);
          globalFunction(2);
        }
        ''';

    setUpAll(() async {
      await driver.initSource(setup, source);
    });

    tearDownAll(() async {
      await driver.cleanupTest();
    });

    test('(then) expression using local', () async {
      await driver.check(
          breakpointId: 'thenBP', expression: 'y', expectedResult: '3');
    });

    test('(then) expression using local out of scope', () async {
      await driver.check(
          breakpointId: 'thenBP',
          expression: 'z',
          expectedError: "Error: Undefined name 'z'");
    });

    test('(else) expression using local', () async {
      await driver.check(
          breakpointId: 'elseBP', expression: 'z', expectedResult: '4');
    });

    test('(else) expression using local out of scope', () async {
      await driver.check(
          breakpointId: 'elseBP',
          expression: 'y',
          expectedError: "Error: Undefined name 'y'");
    });

    test('(post) expression using local', () async {
      await driver.check(
          breakpointId: 'postBP', expression: 'x', expectedResult: '1');
    });

    test('(post) expression using local out of scope', () async {
      await driver.check(
          breakpointId: 'postBP',
          expression: 'z',
          expectedError: "Error: Undefined name 'z'");
    });

    test('(post) expression using local out of scope', () async {
      await driver.check(
          breakpointId: 'postBP',
          expression: 'y',
          expectedError: "Error: Undefined name 'y'");
    });
  });

  group('Expression compiler tests in iterator loops:', () {
    var source = '''
        int globalFunction() {
          var l = <String>['1', '2', '3'];

          for (var e in l) {
            // Breakpoint: bp
            var calculation = '\$e';
          };
          return 0;
        }

        main() => globalFunction();
        ''';

    setUpAll(() async {
      await driver.initSource(setup, source);
    });

    tearDownAll(() async {
      await driver.cleanupTest();
    });

    test('expression loop variable', () async {
      await driver.check(
          breakpointId: 'bp', expression: 'e', expectedResult: '1');
    });
  });

  group('Expression compiler tests in generic method:', () {
    var source = '''
        class C<T1> {
          void generic<T2>(T1 a, T2 b) {
            // Breakpoint: bp
            print(a);
            print(b);
          }
        }

        void main() => C<int>().generic<String>(0, 'hi');
        ''';

    setUpAll(() async {
      await driver.initSource(setup, source);
    });

    tearDownAll(() async {
      await driver.cleanupTest();
    });

    test('evaluate formals', () async {
      await driver.check(
          breakpointId: 'bp',
          expression: "'\${a} \$b'",
          expectedResult: '0 hi');
    });

    test('evaluate class type parameters', () async {
      await driver.check(
          breakpointId: 'bp', expression: "'\$T1'", expectedResult: 'int');
    });

    test('evaluate method type parameters', () async {
      await driver.check(
          breakpointId: 'bp', expression: "'\$T2'", expectedResult: 'String');
    });
  });

  group('Expression compiler tests for interactions with module containers:',
      () {
    var source = '''
        class A {
          const A();
        }
        class B {
          const B();
        }
        void foo() {
          const a = A();
          var check = a is int;
          // Breakpoint: bp
          return;
        }

        void main() => foo();
        ''';

    setUpAll(() async {
      await driver.initSource(setup, source);
    });

    tearDownAll(() async {
      await driver.cleanupTest();
    });

    test('evaluation that non-destructively appends to the type container',
        () async {
      await driver.check(
          breakpointId: 'bp',
          expression: 'a is String',
          expectedResult: 'false');
    });

    test('evaluation that reuses the type container', () async {
      await driver.check(
          breakpointId: 'bp', expression: 'a is int', expectedResult: 'false');
    });

    test('evaluation that non-destructively appends to the constant container',
        () async {
      await driver.check(
          breakpointId: 'bp',
          expression: 'const B() == const B()',
          expectedResult: 'true');
    });

    test('evaluation that properly canonicalizes constants', () async {
      await driver.check(
          breakpointId: 'bp',
          expression: 'a == const A()',
          expectedResult: 'true');
    });
  });
}
