// Copyright (c) 2020, 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:async_helper/async_minitest.dart";

void generateIsolateSource(String filePath, String version) {
  File isolateSource = new File(filePath);
  isolateSource.writeAsStringSync('''
      // @dart=$version
      import \'dart:isolate\';

      spawnFunc(List args) {
        var data = args[0];
        var replyTo = args[1];
        try {
          int x = null as int;
          replyTo.send(\'re: weak\');
        } catch (ex) {
          replyTo.send(\'re: strong\');
        }
      }

      void main() async {
        const String debugName = \'spawnedIsolate\';
        final exitPort = ReceivePort();
        final port = new ReceivePort();
        port.listen((msg) {
          print(msg);
          port.close();
        });

        final isolate = await Isolate.spawn(
          spawnFunc,
          [\'re: hi\', port.sendPort],
          paused: false,
          debugName: debugName,
          onExit: exitPort.sendPort);

        // Explicitly await spawned isolate exit to enforce main isolate not
        // completing (and the stand-alone runtime exiting) before the spawned
        // isolate is done.
        await exitPort.first;
      }
  ''');
}

void generateOutput(String sourcePath, String outPath, String type) {
  var exec = Platform.resolvedExecutable;
  var args = <String>[];
  args.add("--snapshot-kind=$type");
  args.add("--snapshot=$outPath");
  args.add(sourcePath);
  var result = Process.runSync(exec, args);
  print('snapshot $type stdout: ${result.stdout}');
  print('snapshot $type stderr: ${result.stderr}');
}

void generateKernel(String sourcePath, String outPath) {
  generateOutput(sourcePath, outPath, "kernel");
}

void generateAppJIT(String sourcePath, String outPath) {
  generateOutput(sourcePath, outPath, "app-jit");
}

void testNullSafetyMode(String filePath, String expected) {
  var exec = Platform.resolvedExecutable;
  var args = <String>[];
  args.add(filePath);
  var result = Process.runSync(exec, args);
  print('test stdout: ${result.stdout}');
  print('test stderr: ${result.stderr}');
  expect(result.stdout.contains('$expected'), true);
}
