// Copyright (c) 2023, 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:developer';

import 'package:logging/logging.dart';
import 'package:test/test.dart';
import 'package:vm_service/vm_service.dart';

import 'common/service_test_common.dart';
import 'common/test_helper.dart';

// AUTOGENERATED START
//
// Update these constants by running:
//
// dart pkg/vm_service/test/update_line_numbers.dart <test.dart>
//
const LINE_A = 41;
const LINE_B = 43;
// AUTOGENERATED END

void init() {
  Logger.root.level = Level.ALL;
  Logger.root.onRecord.listen((logRecord) {
    log(
      logRecord.message,
      time: logRecord.time,
      sequenceNumber: logRecord.sequenceNumber,
      level: logRecord.level.value,
      name: logRecord.loggerName,
      zone: null,
      error: logRecord.error,
      stackTrace: logRecord.stackTrace,
    );
  });
}

void run() {
  debugger(); // LINE_A
  Logger.root.fine('Hey Buddy!');
  debugger(); // LINE_B
  Logger.root.info('YES');
}

final tests = <IsolateTest>[
  hasStoppedAtBreakpoint,
  stoppedAtLine(LINE_A),
  resumeIsolateAndAwaitEvent(EventStreams.kLogging, (event) {
    expect(event.kind, EventKind.kLogging);
    expect(event.logRecord!.sequenceNumber, 0);
    expect(event.logRecord!.message!.valueAsString, 'Hey Buddy!');
    expect(event.logRecord!.level, Level.FINE.value);
    expect(event.logRecord!.time, isNotNull);
  }),
  hasStoppedAtBreakpoint,
  stoppedAtLine(LINE_B),
  resumeIsolateAndAwaitEvent(EventStreams.kLogging, (event) {
    expect(event.kind, EventKind.kLogging);
    expect(event.logRecord!.sequenceNumber, 1);
    expect(event.logRecord!.message!.valueAsString, 'YES');
    expect(event.logRecord!.level, Level.INFO.value);
    expect(event.logRecord!.time, isNotNull);
  }),
];

void main([args = const <String>[]]) => runIsolateTests(
      args,
      tests,
      'logging_test.dart',
      testeeBefore: init,
      testeeConcurrent: run,
    );
