// Copyright (c) 2019, 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 'dart:io';

import 'package:expect/expect.dart';
import 'package:path/path.dart' as p;
import 'package:source_maps/source_maps.dart' as sm;

void main() async {
  final binDir = p.dirname(Platform.resolvedExecutable);
  final sdkDir = p.dirname(binDir);
  // This test expects to run in a build SDK.
  Expect.isTrue(binDir.endsWith('bin'));

  final sdkJsMapDir =
      p.joinAll([sdkDir, 'lib', 'dev_compiler', 'kernel', 'amd']);
  final sdkJsMapFile = p.join(sdkJsMapDir, 'dart_sdk.js.map');

  final sdkJsMapText = await File(sdkJsMapFile).readAsString();
  var mapping = sm.parse(sdkJsMapText) as sm.SingleMapping;

  var urls = mapping.urls;
  Expect.isTrue(urls.isNotEmpty);
  for (var url in urls) {
    Expect.equals(p.extension(url), '.dart');
    Expect.isFalse(p.isAbsolute(url));
    var fullPath = p.canonicalize(p.join(sdkJsMapDir, url));
    Expect.isTrue(await File(fullPath).exists(), 'Missing file: $fullPath');
  }
}
