1'use strict';
2const common = require('../common');
3const assert = require('node:assert');
4const fs = require('node:fs');
5
6function verifyStatFsObject(statfs, isBigint = false) {
7  const valueType = isBigint ? 'bigint' : 'number';
8
9  [
10    'type', 'bsize', 'blocks', 'bfree', 'bavail', 'files', 'ffree',
11  ].forEach((k) => {
12    assert.ok(Object.hasOwn(statfs, k));
13    assert.strictEqual(typeof statfs[k], valueType,
14                       `${k} should be a ${valueType}`);
15  });
16}
17
18fs.statfs(__filename, common.mustSucceed(function(stats) {
19  verifyStatFsObject(stats);
20  assert.strictEqual(this, undefined);
21}));
22
23fs.statfs(__filename, { bigint: true }, function(err, stats) {
24  assert.ifError(err);
25  verifyStatFsObject(stats, true);
26  assert.strictEqual(this, undefined);
27});
28
29// Synchronous
30{
31  const statFsObj = fs.statfsSync(__filename);
32  verifyStatFsObject(statFsObj);
33}
34
35// Synchronous Bigint
36{
37  const statFsBigIntObj = fs.statfsSync(__filename, { bigint: true });
38  verifyStatFsObject(statFsBigIntObj, true);
39}
40
41[false, 1, {}, [], null, undefined].forEach((input) => {
42  assert.throws(
43    () => fs.statfs(input, common.mustNotCall()),
44    {
45      code: 'ERR_INVALID_ARG_TYPE',
46      name: 'TypeError'
47    }
48  );
49  assert.throws(
50    () => fs.statfsSync(input),
51    {
52      code: 'ERR_INVALID_ARG_TYPE',
53      name: 'TypeError'
54    }
55  );
56});
57
58// Should not throw an error
59fs.statfs(__filename, undefined, common.mustCall());
60