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

// @dart = 2.9

import 'dart:io';

import "package:async_helper/async_helper.dart";
import "package:expect/expect.dart";

main() {
  asyncStart();

  // On MacOS you get the decomposed utf8 form of file and directory
  // names from the system. Therefore, we have to check for both here.
  var precomposed = 'æøå';
  var decomposed = new String.fromCharCodes([47, 230, 248, 97, 778]);

  Directory.systemTemp.createTemp('dart_directory_non_ascii').then((tempDir) {
    var nonAsciiDir = new Directory("${tempDir.path}/æøå");
    nonAsciiDir
        .exists()
        .then((e) => Expect.isFalse(e))
        .then((_) => nonAsciiDir.create())
        .then((_) => nonAsciiDir.exists())
        .then((e) => Expect.isTrue(e))
        .then((_) => new Directory("${tempDir.path}/æøå").createTemp('temp'))
        .then((temp) {
          Expect.isTrue(temp.path.contains(precomposed) ||
              temp.path.contains(decomposed));
          return temp.delete();
        })
        .then((_) => tempDir.createTemp('æøå'))
        .then((temp) {
          Expect.isTrue(temp.path.contains(precomposed) ||
              temp.path.contains(decomposed));
          return temp.delete();
        })
        .then((temp) => Expect.isFalse(temp.existsSync()))
        .then((_) => tempDir.delete(recursive: true))
        .then((_) {
          Expect.isFalse(nonAsciiDir.existsSync());
          asyncEnd();
        });
  });
}
