'use strict';
var common = require('../common');
var assert = require('assert');
var path = require('path');
var fs = require('fs');

if (process.platform === 'darwin' || common.isWindows) {
  var watchSeenOne = 0;

  var testDir = common.tmpDir;

  var filenameOne = 'watch.txt';
  var testsubdirName = 'testsubdir';
  var testsubdir = path.join(testDir, testsubdirName);
  var relativePathOne = path.join('testsubdir', filenameOne);
  var filepathOne = path.join(testsubdir, filenameOne);

  common.refreshTmpDir();

  process.on('exit', function() {
    assert.ok(watchSeenOne > 0);
  });

  function cleanup() {
    try { fs.unlinkSync(filepathOne); } catch (e) { }
    try { fs.rmdirSync(testsubdir); } catch (e) { }
  };

  try { fs.mkdirSync(testsubdir, 0o700); } catch (e) {}

  assert.doesNotThrow(function() {
    var watcher = fs.watch(testDir, {recursive: true});
    watcher.on('change', function(event, filename) {
      assert.ok('change' === event || 'rename' === event);

      // Ignore stale events generated by mkdir and other tests
      if (filename !== relativePathOne)
        return;

      watcher.close();
      cleanup();
      ++watchSeenOne;
    });
  });

  setTimeout(function() {
    fs.writeFileSync(filepathOne, 'world');
  }, 10);
} else {
  console.log('1..0 # Skipped: recursive option is darwin/windows specific');
}
