// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:file/file.dart';
import 'package:flutter_tools/src/base/io.dart';

import '../src/common.dart';
import 'test_utils.dart';

void main() {
  final String dartBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'dart');
  late Directory tempDir;

  setUp(() {
    tempDir = createResolvedTempDirectorySync('exit_code_test.');
  });

  tearDown(() {
    tryToDelete(tempDir);
  });

  testWithoutContext('dart.sh/bat can return a zero exit code', () async {
    tempDir.childFile('main.dart')
      .writeAsStringSync('''
import 'dart:io';
void main() {
  exit(0);
}
''');

    final ProcessResult result = await processManager.run(<String>[
      dartBin,
      fileSystem.path.join(tempDir.path, 'main.dart'),
    ]);

    printOnFailure('Output of dart main.dart:');
    printOnFailure(result.stdout.toString());
    printOnFailure(result.stderr.toString());
    expect(result.exitCode, 0);
  });

  testWithoutContext('dart.sh/bat can return a non-zero exit code', () async {
    tempDir.childFile('main.dart')
      .writeAsStringSync('''
import 'dart:io';
void main() {
  exit(1);
}
''');

    final ProcessResult result = await processManager.run(<String>[
      dartBin,
      fileSystem.path.join(tempDir.path, 'main.dart'),
    ]);

    printOnFailure('Output of dart main.dart:');
    printOnFailure(result.stdout.toString());
    printOnFailure(result.stderr.toString());
    expect(result.exitCode, 1);
  });
}
