var fs = require('fs');

var ABSENT_DIR = "absentdir02",
    ABSENT_FILE = "absentfile02",
    TEST_DIR = "testdir02",
    TEST_FILE = "temp-02.test",
    TEST_FILE_PATH = fs.join(TEST_DIR, TEST_FILE),
    TEST_CONTENT = "test content",
    CONTENT_MULTIPLIER = 1024;

test(function () {
    assert_throws("Unable to read file '"+ ABSENT_FILE +"' size",
                  function () { fs.size(ABSENT_FILE); });

    assert_equals(fs.lastModified(ABSENT_FILE), null);

}, "size/date queries on nonexistent files", {/* unsupported */expected_fail: true});

test(function () {
    // Round down to the nearest multiple of two seconds, because
    // file timestamps might only have that much precision.
    var before_creation = Math.floor(Date.now() / 2000) * 2000;

    var f = fs.open(TEST_FILE, "w");
    this.add_cleanup(function () {
        if (f !== null) f.close();
        fs.remove(TEST_FILE);
    });

    for (var i = 0; i < CONTENT_MULTIPLIER; i++) {
        f.write(TEST_CONTENT);
    }
    f.close(); f = null;

    // Similarly, but round _up_.
    var after_creation = Math.ceil(Date.now() / 2000) * 2000;

    assert_equals(fs.size(TEST_FILE),
                  TEST_CONTENT.length * CONTENT_MULTIPLIER);

    var flm = fs.lastModified(TEST_FILE).getTime();

    assert_greater_than_equal(flm, before_creation);
    assert_less_than_equal(flm, after_creation);

}, "size/date queries on existing files");

test(function () {
    fs.makeDirectory(TEST_DIR);
    this.add_cleanup(function () { fs.removeTree(TEST_DIR); });
    fs.write(TEST_FILE_PATH, TEST_CONTENT, "w");

    assert_is_true(fs.exists(TEST_FILE_PATH));
    assert_is_true(fs.exists(TEST_DIR));
    assert_is_false(fs.exists(ABSENT_FILE));
    assert_is_false(fs.exists(ABSENT_DIR));

    assert_is_true(fs.isDirectory(TEST_DIR));
    assert_is_false(fs.isDirectory(ABSENT_DIR));


    assert_is_true(fs.isFile(TEST_FILE_PATH));
    assert_is_false(fs.isFile(ABSENT_FILE));

    var absPath = fs.absolute(TEST_FILE_PATH);
    assert_is_false(fs.isAbsolute(TEST_FILE_PATH));
    assert_is_true(fs.isAbsolute(absPath));

    assert_is_true(fs.isReadable(TEST_FILE_PATH));
    assert_is_true(fs.isWritable(TEST_FILE_PATH));
    assert_is_false(fs.isExecutable(TEST_FILE_PATH));

    assert_is_false(fs.isReadable(ABSENT_FILE));
    assert_is_false(fs.isWritable(ABSENT_FILE));
    assert_is_false(fs.isExecutable(ABSENT_FILE));

    assert_is_true(fs.isReadable(TEST_DIR));
    assert_is_true(fs.isWritable(TEST_DIR));
    assert_is_true(fs.isExecutable(TEST_DIR));

    assert_is_false(fs.isReadable(ABSENT_DIR));
    assert_is_false(fs.isWritable(ABSENT_DIR));
    assert_is_false(fs.isExecutable(ABSENT_DIR));

    assert_is_false(fs.isLink(TEST_DIR));
    assert_is_false(fs.isLink(TEST_FILE_PATH));
    assert_is_false(fs.isLink(ABSENT_DIR));
    assert_is_false(fs.isLink(ABSENT_FILE));

}, "file types and access modes");