// Copyright (c) 2014, 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:path/path.dart' as path;
import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';
import 'helpers/source_map_validator_helper.dart';

void main() {
  asyncTest(() async {
    Directory tmpDir = await createTempDir();
    try {
      Directory sunflowerDir = new Directory.fromUri(
          Platform.script.resolve('../../../../third_party/sunflower'));

      print("Copying '${sunflowerDir.path}' to '${tmpDir.path}'.");
      copyDirectory(sunflowerDir, tmpDir);
      String ext = Platform.isWindows ? '.bat' : '';
      String command = path.normalize(path.join(
          path.fromUri(Platform.script), '../../../../../sdk/bin/pub${ext}'));
      String file = path.join(tmpDir.path, 'build/web/sunflower.dart.js');

      // sunflower/pubspec.yaml only depends on package:browser for Dartium, we
      // override the file to remove this dependency and make pub-get --offline
      // trivially succeed.
      print("Overriding '${tmpDir.path}/pubspec.yaml'.");
      new File(path.join(tmpDir.path, "pubspec.yaml"))
          .writeAsStringSync(_newPubspec);

      print("Running '$command get --offline' from '${tmpDir}'.");
      ProcessResult getResult = await Process.run(command, ['get', '--offline'],
          workingDirectory: tmpDir.path);
      print(getResult.stdout);
      print(getResult.stderr);
      Expect.equals(0, getResult.exitCode, 'Unexpected exitCode from pub get');

      print("Running '$command build --mode=debug' from '${tmpDir}'.");
      ProcessResult buildResult = await Process.run(
          command, ['build', '--mode=debug'],
          workingDirectory: tmpDir.path);
      print(buildResult.stdout);
      print(buildResult.stderr);
      Expect.equals(0, buildResult.exitCode, 'Unexpected exitCode from pub');
      validateSourceMap(new Uri.file(file, windows: Platform.isWindows));
      print("Deleting '${tmpDir.path}'.");
    } finally {
      tmpDir.deleteSync(recursive: true);
    }
  });
}

String _newPubspec = '''
# Generated by test
name: sunflower
version: 0.0.0
''';
