// Copyright (c) 2018, 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 'dart:async';
import 'dart:io';
import 'dart:typed_data';

import 'package:test/test.dart';

Future main() async {
  var asyncDir;
  var syncDir;

  test('Non-UTF8 Directory Listing', () async {
    Directory tmp;
    try {
      tmp = await Directory.systemTemp
          .createTemp('non_utf8_directory_test_async');
      final rawPath = new Uint8List.fromList([182]);
      asyncDir = new Directory.fromRawPath(rawPath);
      if (Platform.isMacOS || Platform.isIOS) {
        try {
          await asyncDir.create();
        } on FileSystemException catch (e) {
          // Macos doesn't support non-UTF-8 paths.
          await tmp.delete(recursive: true);
          return;
        }
      } else {
        await asyncDir.create();
      }
      expect(await asyncDir.exists(), isTrue);

      await for (final e in tmp.list()) {
        // FIXME(bkonyi): reenable when rawPath is exposed.
        /*
        if (Platform.isWindows) {
          // Windows replaces invalid characters with � when creating file system
          // entities.
          final raw = e.rawPath;
          expect(raw.sublist(raw.length - 3), [239, 191, 189]);
        } else {
          expect(e.rawPath.last, 182);
        }
        */
      }
      await asyncDir.delete(recursive: true);
    } finally {
      await tmp.delete(recursive: true);
    }
  });

  test('Non-UTF8 Directory Sync Listing', () {
    Directory tmp;
    try {
      tmp = Directory.systemTemp.createTempSync('non_utf8_directory_test_sync');
      final rawPath = new Uint8List.fromList([182]);
      syncDir = new Directory.fromRawPath(rawPath);

      if (Platform.isMacOS || Platform.isIOS) {
        try {
          syncDir.createSync();
        } on FileSystemException catch (e) {
          // Macos doesn't support non-UTF-8 paths.
          tmp.deleteSync(recursive: true);
          return;
        }
      } else {
        syncDir.createSync();
      }
      expect(syncDir.existsSync(), isTrue);

      for (final e in tmp.listSync()) {
        // FIXME(bkonyi): reenable when rawPath is exposed.
        /*
        if (Platform.isWindows) {
          // Windows replaces invalid characters with � when creating file system
          // entities.
          final raw = e.rawPath;
          expect(raw.sublist(raw.length - 3), [239, 191, 189]);
        } else {
          expect(e.rawPath.last, 182);
        }
        */
      }
      syncDir.deleteSync(recursive: true);
    } finally {
      tmp.deleteSync(recursive: true);
    }
  });
}
