// Copyright (c) 2017, 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

/// @assertion FileStat statSync(String path)
/// Calls the operating system's stat() function on path. Returns a FileStat
/// object containing the data returned by stat(). If the call fails, returns a
/// FileStat object with .type set to FileSystemEntityType.notFound and the
/// other fields invalid.
/// @description Checks that this method calls the operating system's stat()
/// function on path. Returns a FileStat object containing the data returned by
/// stat()
/// @author sgrekhov@unipro.ru

import "dart:io";
import "../../../Utils/expect.dart";
import "../file_utils.dart";

main() async {
  await inSandbox(_main);
}

_main(Directory sandbox) async {
  File file = getTempFileSync(parent: sandbox);
  FileStat fs = FileStat.statSync(file.path);
  Expect.equals(FileSystemEntityType.file, fs.type);
  Expect.equals(0, fs.size);
  Expect.equals(file.statSync().mode, fs.mode);
  Expect.equals(file.statSync().accessed, fs.accessed);
  Expect.equals(file.statSync().changed, fs.changed);
  Expect.equals(file.statSync().modified, fs.modified);
}
