// 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.

import 'dart:async';
import 'dart:io';
import 'dart:isolate';

const int answer = 42;

String fooSync(int x) {
  if (x == answer) {
    return '*' * x;
  }
  return List.generate(x, (_) => 'xyzzy').join(' ');
}

class BarClass {
  BarClass(this.x);

  int x;

  void baz() {
    print(x);
  }
}

Future<String> fooAsync(int x) async {
  if (x == answer) {
    return '*' * x;
  }
  return List.generate(x, (_) => 'xyzzy').join(' ');
}

/// The number of covered lines is tested and expected to be 4.
///
/// If you modify this method, you may have to update the tests!
void isolateTask(List threeThings) async {
  sleep(const Duration(milliseconds: 500));

  fooSync(answer);
  unawaited(fooAsync(answer).then((_) {
    final port = threeThings.first as SendPort;
    final sum = (threeThings[1] as int) + (threeThings[2] as int);
    port.send(sum);
  }));

  final bar = BarClass(123);
  bar.baz();

  print('678'); // coverage:ignore-line

  // coverage:ignore-start
  print('1');
  print('2');
  print('3');
  // coverage:ignore-end

  print('4 // coverage:ignore-line');
  print('5 // coverage:ignore-file');

  print('6'); // coverage:ignore-start
  print('7');
  print('8');
  // coverage:ignore-end
  print('9'); // coverage:ignore-start
  print('10');
  print('11'); // coverage:ignore-line

  // Regression test for https://github.com/dart-lang/tools/issues/520.
  await Isolate.run(() => print('Isolate.run'), debugName: 'Grandchild');
  // coverage:ignore-end
}
