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

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

main() {
  Directory temp = Directory.systemTemp.createTempSync('dart_regress_7679');
  File script = new File('${temp.path}/script.dart');
  script.writeAsStringSync("""
import 'dart:io';

class Expect {
  static void isTrue(var x) {
    if (!identical(x, true)) {
      throw new StateError("Not identical");
    }
  }
}

main() {
  Directory d = new Directory('a');
  d.create(recursive: true).then((_) {
    d.exists().then((result) {
      Expect.isTrue(result);
      d = new Directory('b/c/d');
      d.create(recursive: true).then((_) {
        d.exists().then((result) {
          Expect.isTrue(result);
        });
      });
    });
  });
}
""");
  String executable = new File(Platform.executable).resolveSymbolicLinksSync();
  // Note: we prevent this child process from using Crashpad handler because
  // this introduces an issue with deleting the temporary directory.
  Process.run(
      executable,
      []
        ..addAll(Platform.executableArguments)
        ..add('script.dart'),
      workingDirectory: temp.path,
      environment: {'DART_CRASHPAD_HANDLER': ''}).then((result) {
    temp.deleteSync(recursive: true);
    Expect.equals(0, result.exitCode);
  });
}
