var path = require("path");
common = require("../common");
assert = common.assert

var f = __filename;

assert.equal(path.basename(f), "test-path.js");
assert.equal(path.basename(f, ".js"), "test-path");
assert.equal(path.extname(f), ".js");
assert.equal(path.dirname(f).substr(-11), "test/simple");
assert.equal(path.dirname("/a/b/"), "/a");
assert.equal(path.dirname("/a/b"), "/a");
assert.equal(path.dirname("/a"), "/");
assert.equal(path.dirname("/"), "/");
path.exists(f, function (y) { assert.equal(y, true) });

assert.equal(path.existsSync(f), true);

assert.equal(path.extname(""), "");
assert.equal(path.extname("/path/to/file"), "");
assert.equal(path.extname("/path/to/file.ext"), ".ext");
assert.equal(path.extname("/path.to/file.ext"), ".ext");
assert.equal(path.extname("/path.to/file"), "");
assert.equal(path.extname("/path.to/.file"), "");
assert.equal(path.extname("/path.to/.file.ext"), ".ext");
assert.equal(path.extname("/path/to/f.ext"), ".ext");
assert.equal(path.extname("/path/to/..ext"), ".ext");
assert.equal(path.extname("file"), "");
assert.equal(path.extname("file.ext"), ".ext");
assert.equal(path.extname(".file"), "");
assert.equal(path.extname(".file.ext"), ".ext");
assert.equal(path.extname("/file"), "");
assert.equal(path.extname("/file.ext"), ".ext");
assert.equal(path.extname("/.file"), "");
assert.equal(path.extname("/.file.ext"), ".ext");
assert.equal(path.extname(".path/file.ext"), ".ext");
assert.equal(path.extname("file.ext.ext"), ".ext");
assert.equal(path.extname("file."), ".");

// path.join tests
var failures = [];
var joinTests =
  // arguments                       result
  [[['.', 'x/b', '..', '/b/c.js'  ], 'x/b/c.js'   ]
  ,[['/.', 'x/b', '..', '/b/c.js' ], '/x/b/c.js'  ]
  ,[['/foo', '../../../bar'       ], '/bar'       ]
  ,[['foo', '../../../bar'        ], '../../bar'  ]
  ,[['foo/', '../../../bar'       ], '../../bar'  ]
  ,[['foo/x', '../../../bar'      ], '../bar'     ]
  ,[['foo/x', './bar'             ], 'foo/x/bar'  ]
  ,[['foo/x/', './bar'            ], 'foo/x/bar'  ]
  ,[['foo/x/', '.', 'bar'         ], 'foo/x/bar'  ]
  ,[['./'                         ], './'         ]
  ,[['.', './'                    ], './'         ]
  ,[['.', '.', '.'                ], '.'          ]
  ,[['.', './', '.'               ], '.'          ]
  ,[['.', '/./', '.'              ], '.'          ]
  ,[['.', '/////./', '.'          ], '.'          ]
  ,[['.'                          ], '.'          ]
  ,[['','.'                       ], '.'          ]
  ,[['', 'foo'                    ], 'foo'        ]
  ,[['foo', '/bar'                ], 'foo/bar'    ]
  ,[['', '/foo'                   ], '/foo'       ]
  ,[['', '', '/foo'               ], '/foo'       ]
  ,[['', '', 'foo'                ], 'foo'        ]
  ,[['foo', ''                    ], 'foo'        ]
  ,[['foo/', ''                   ], 'foo/'       ]
  ,[['foo', '', '/bar'            ], 'foo/bar'    ]
  ,[['./', '..', '/foo'           ], '../foo'     ]
  ,[['./', '..', '..', '/foo'     ], '../../foo'  ]
  ,[['.', '..', '..', '/foo'      ], '../../foo'  ]
  ,[['', '..', '..', '/foo'       ], '../../foo'  ]
  ,[['/'                          ], '/'          ]
  ,[['/', '.'                     ], '/'          ]
  ,[['/', '..'                    ], '/'          ]
  ,[['/', '..', '..'              ], '/'          ]
  ,[[''                           ], '.'          ]
  ,[['', ''                       ], '.'          ]
  ,[[' /foo'                      ], ' /foo'      ]
  ,[[' ', 'foo'                   ], ' /foo'      ]
  ,[[' ', '.'                     ], ' '          ]
  ,[[' ', '/'                     ], ' /'         ]
  ,[[' ', ''                      ], ' '          ]
  // preserving empty path parts, for url resolution case
  // pass boolean true as LAST argument.
  ,[['', '', true                 ], '/'          ]
  ,[['foo', '', true              ], 'foo/'       ]
  ,[['foo', '', 'bar', true       ], 'foo//bar'   ]
  ,[['foo/', '', 'bar', true      ], 'foo///bar'  ]
  ,[['', true                     ], '.'          ]
  // filtration of non-strings.
  ,[['x', true, 7, 'y', null, {}  ], 'x/y'        ]
  ];
joinTests.forEach(function (test) {
  var actual = path.join.apply(path, test[0]);
  var expected = test[1];
  var message = "path.join("+test[0].map(JSON.stringify).join(",")+")"
              + "\n  expect="+JSON.stringify(expected)
              + "\n  actual="+JSON.stringify(actual);
  if (actual !== expected) failures.push("\n"+message);
  // assert.equal(actual, expected, message);
});
assert.equal(failures.length, 0, failures.join(""))


assert.equal(path.normalize("./fixtures///b/../b/c.js"), "fixtures/b/c.js");
assert.equal(path.normalize("./fixtures///b/../b/c.js",true), "fixtures///b/c.js");
assert.equal(path.normalize("/foo/../../../bar"), "/bar");

assert.deepEqual(path.normalizeArray(["fixtures","b","","..","b","c.js"]), ["fixtures","b","c.js"]);
assert.deepEqual(path.normalizeArray(["fixtures","","b","..","b","c.js"], true), ["fixtures","","b","c.js"]);

assert.equal(path.normalize("a//b//../b", true), "a//b/b");
assert.equal(path.normalize("a//b//../b"), "a/b");

assert.equal(path.normalize("a//b//./c", true), "a//b//c");
assert.equal(path.normalize("a//b//./c"), "a/b/c");
assert.equal(path.normalize("a//b//.", true), "a//b/");
assert.equal(path.normalize("a//b//."), "a/b");

