// 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:dev_compiler/src/kernel/module_symbols.dart';
import 'package:test/test.dart';

import '../shared_test_options.dart';
import 'module_symbols_test_shared.dart';

void main() async {
  for (var mode in [
    NullSafetyTestOption('Sound Mode:', true),
    NullSafetyTestOption('Weak Mode:', false)
  ]) {
    group(mode.description, () {
      var options = SetupCompilerOptions(soundNullSafety: mode.soundNullSafety);
      group('global variable debug symbols', () {
        TestDriver driver;
        VariableSymbol variableSymbol;
        final source = '''
          ${options.dartLangComment}

          class A {}
          var globalVariable = A();
          ''';
        setUpAll(() async {
          driver = TestDriver(options, source);
          var result = await driver.compile();
          variableSymbol = result.symbols.variables.single;
        });
        tearDownAll(() {
          driver.cleanUp();
        });
        test('has name', () async {
          expect(variableSymbol.name, equals('globalVariable'));
        });
        test('is global', () async {
          expect(variableSymbol.kind, VariableSymbolKind.global);
        });
        test('is not const', () async {
          expect(variableSymbol.isConst, false);
        });
        test('is not final', () async {
          expect(variableSymbol.isFinal, false);
        });
        test('is static', () async {
          expect(variableSymbol.isStatic, true);
        });
        test('has interface type id', () async {
          expect(variableSymbol.typeId, 'A');
        });
        test('has localId', () async {
          expect(variableSymbol.localId, 'globalVariable');
        });
        test('has library scopeId', () async {
          expect(variableSymbol.scopeId, endsWith('package:foo/foo.dart'));
        });
        group('location', () {
          test('has scriptId', () async {
            expect(variableSymbol.location.scriptId, endsWith('/foo.dart'));
          });
          test('only start token', () async {
            expect(variableSymbol.location.tokenPos,
                47 + options.dartLangComment.length);
            expect(variableSymbol.location.endTokenPos, null);
          });
        });
      });
      group('global final variable debug symbols', () {
        TestDriver driver;
        VariableSymbol variableSymbol;
        final source = '''
          ${options.dartLangComment}

          class A {}
          final localVariable = A();
          ''';
        setUpAll(() async {
          driver = TestDriver(options, source);
          var result = await driver.compile();
          variableSymbol = result.symbols.variables.single;
        });
        tearDownAll(() {
          driver.cleanUp();
        });
        test('is final', () async {
          expect(variableSymbol.isFinal, true);
        });
      });
      group('global const variable debug symbols', () {
        TestDriver driver;
        VariableSymbol variableSymbol;
        final source = '''
          ${options.dartLangComment}

          class A {
            const A();
          }
          const localVariable = A();
          ''';
        setUpAll(() async {
          driver = TestDriver(options, source);
          var result = await driver.compile();
          variableSymbol = result.symbols.variables.single;
        });
        tearDownAll(() {
          driver.cleanUp();
        });
        test('is const', () async {
          expect(variableSymbol.isConst, true);
        });
      });
    });
  }
}
