require("./global-leakage.js")
var fs = require('fs')
var test = require('tap').test;
var glob = require('../');

test('mock fs', function(t) {
  var stat = fs.stat
  var statSync = fs.statSync
  var readdir = fs.readdir
  var readdirSync = fs.readdirSync

  function fakeStat(path) {
    var ret
    switch (path.toLowerCase().replace(/\\/g, '/')) {
      case '/tmp': case '/tmp/': case 'c:\\tmp': case 'c:\\tmp\\':
        ret = { isDirectory: function() { return true } }
        break
      case '/tmp/a': case 'c:/tmp/a':
        ret = { isDirectory: function() { return false } }
        break
    }
    return ret
  }

  fs.stat = function(path, cb) {
    var f = fakeStat(path);
    if (f) {
      process.nextTick(function() {
        cb(null, f)
      })
    } else {
      stat.call(fs, path, cb)
    }
  }

  fs.statSync = function(path) {
    return fakeStat(path) || statSync.call(fs, path)
  }

  function fakeReaddir(path) {
    var ret
    switch (path.toLowerCase().replace(/\\/g, '/')) {
      case '/tmp': case '/tmp/': case 'c:/tmp': case 'c:/tmp/':
        ret = [ 'a', 'A' ]
        break
      case '/': case 'c:/':
        ret = ['tmp', 'tMp', 'tMP', 'TMP']
    }
    return ret
  }

  fs.readdir = function(path, cb) {
    var f = fakeReaddir(path)
    if (f)
      process.nextTick(function() {
        cb(null, f)
      })
    else
      readdir.call(fs, path, cb)
  }

  fs.readdirSync = function(path) {
    return fakeReaddir(path) || readdirSync.call(fs, path)
  }

  t.pass('mocked')
  t.end()
})

test('nocase, nomagic', function(t) {
  var n = 2
  var want = [ '/TMP/A',
               '/TMP/a',
               '/tMP/A',
               '/tMP/a',
               '/tMp/A',
               '/tMp/a',
               '/tmp/A',
               '/tmp/a' ]
  if(process.platform.match(/^win/)) {
    want = want.map(function(p) {
      return 'c:' + p
    })
  }
  glob('/tmp/a', { nocase: true }, function(er, res) {
    if (er)
      throw er
    if (process.platform.match(/^win/))
      res = res.map(function (r) {
        return r.replace(/\\/g, '/').replace(/^C:/, 'c:')
      })
    t.same(res.sort(), want)
    if (--n === 0) t.end()
  })
  glob('/tmp/A', { nocase: true }, function(er, res) {
    if (er)
      throw er
    if (process.platform.match(/^win/))
      res = res.map(function (r) {
        return r.replace(/\\/g, '/').replace(/^C:/, 'c:')
      })
    t.same(res.sort(), want)
    if (--n === 0) t.end()
  })
})

test('nocase, with some magic', function(t) {
  t.plan(2)
  var want = [ '/TMP/A',
               '/TMP/a',
               '/tMP/A',
               '/tMP/a',
               '/tMp/A',
               '/tMp/a',
               '/tmp/A',
               '/tmp/a' ]
  if(process.platform.match(/^win/)) {
    want = want.map(function(p) {
      return 'c:' + p
    })
  }

  glob('/tmp/*', { nocase: true }, function(er, res) {
    if (er)
      throw er
    if (process.platform.match(/^win/))
      res = res.map(function (r) { return r.replace(/\\/g, '/') })
    t.same(res.sort(), want)
  })
  glob('/tmp/*', { nocase: true }, function(er, res) {
    if (er)
      throw er
    if (process.platform.match(/^win/))
      res = res.map(function (r) { return r.replace(/\\/g, '/') })
    t.same(res.sort(), want)
  })
})

@@ -107,16 +107,133 @@
 ../');%0A%0A
+var cwd = process.cwd()%0Avar drive = 'c'%0Aif (/%5E%5Ba-zA-Z%5D:%5B%5C%5C%5C/%5D/.test(cwd)) %7B%0A  drive = cwd.charAt(0).toLowerCase()%0A%7D%0A%0A
 test('mo
@@ -495,26 +495,31 @@
 tmp/': case 
+drive+
 '
-c
 :%5C%5Ctmp': cas
@@ -520,18 +520,23 @@
 ': case 
+drive+
 '
-c
 :%5C%5Ctmp%5C%5C
@@ -632,26 +632,31 @@
 mp/a': case 
+drive+
 '
-c
 :/tmp/a':%0A  
@@ -1167,26 +1167,31 @@
 tmp/': case 
+drive+
 '
-c
 :/tmp': case
@@ -1191,18 +1191,23 @@
 ': case 
+drive+
 '
-c
 :/tmp/':
@@ -1269,18 +1269,23 @@
 ': case 
+drive+
 '
-c
 :/':%0A   
@@ -2001,34 +2001,39 @@
  %7B%0A      return 
+drive+
 '
-c
 :' + p%0A    %7D)%0A  
@@ -2232,33 +2232,62 @@
 /').replace(
-/%5EC:/, 'c
+new RegExp('%5E' + drive + ':'), drive+'
 :')%0A      %7D)
@@ -2554,17 +2554,46 @@
 ace(
-/%5EC:/, 'c
+new RegExp('%5E' + drive + ':'), drive+'
 :')%0A
@@ -3011,18 +3011,25 @@
  return 
+drive + 
 '
-c
 :' + p%0A 

Fix nocase-nomagic test to not be C:\ specific