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

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();
}
