// Copyright (c) 2012, 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.
//
// Process working directory test.

// @dart = 2.9

library ProcessWorkingDirectoryTest;

import "dart:io";
import "package:expect/expect.dart";
import "process_test_util.dart";

class ProcessWorkingDirectoryTest {
  static String get fullTestFilePath {
    // Extract full path, since we run processes from another directory.
    File path = new File(getProcessTestFileName());
    Expect.isTrue(path.existsSync());
    return path.resolveSymbolicLinksSync();
  }

  static void testValidDirectory() {
    Directory directory =
        Directory.systemTemp.createTempSync('dart_process_working_directory');
    Expect.isTrue(directory.existsSync());

    Process
        .start(fullTestFilePath, const ["0", "0", "99", "0"],
            workingDirectory: directory.path)
        .then((process) {
      process.exitCode.then((int exitCode) {
        Expect.equals(exitCode, 99);
        directory.deleteSync();
      });
      process.stdout.listen((_) {});
      process.stderr.listen((_) {});
    }).catchError((error) {
      directory.deleteSync();
      Expect.fail("Couldn't start process");
    });
  }

  static void testInvalidDirectory() {
    Directory directory =
        Directory.systemTemp.createTempSync('dart_process_working_directory');
    Expect.isTrue(directory.existsSync());

    Process
        .start(fullTestFilePath, const ["0", "0", "99", "0"],
            workingDirectory: directory.path + "/subPath")
        .then((process) {
      Expect.fail("bad process completed");
      directory.deleteSync();
    }).catchError((e) {
      Expect.isNotNull(e);
      directory.deleteSync();
    });
  }
}

main() {
  ProcessWorkingDirectoryTest.testValidDirectory();
  ProcessWorkingDirectoryTest.testInvalidDirectory();
}
