// Copyright (c) 2015, 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.

// coverage:ignore-file

import 'dart:async';
import 'dart:developer';
import 'dart:isolate';

import 'package:coverage/src/util.dart';

import 'test_app_isolate.dart';

part 'test_app.g.dart';

Future<void> main() async {
  for (var i = 0; i < 10; i++) {
    for (var j = 0; j < 10; j++) {
      final sum = usedMethod(i, j);
      if (sum != (i + j)) {
        throw 'bad method!';
      }

      final multiplication = usedGeneratedMethod(i, j);
      if (multiplication != i * j) {
        throw 'bad generated method!';
      }
    }
  }

  final port = ReceivePort();

  final isolate =
      await Isolate.spawn(isolateTask, [port.sendPort, 1, 2], paused: true);
  await Service.controlWebServer(enable: true);
  final isolateID = Service.getIsolateID(isolate);
  print('isolateId = $isolateID');

  isolate.addOnExitListener(port.sendPort);
  isolate.resume(isolate.pauseCapability!);

  final value = await port.first as int;
  if (value != 3) {
    throw 'expected 3!';
  }

  final result = await retry(() async => 42, const Duration(seconds: 1)) as int;
  print(result);
}

int usedMethod(int a, int b) {
  return a + b;
}

int unusedMethod(int a, int b) {
  return a - b;
}

// ignore_for_file: unreachable_from_main, only_throw_errors
// ignore_for_file: deprecated_member_use
