describe("Files and Directories API", function() {
    var TEST_DIR = "testdir",
        TEST_FILE = "testfile",
        START_CWD = fs.workingDirectory;

    it("should create a new temporary directory and change the Current Working Directory to it", function() {
        expect(fs.makeDirectory(TEST_DIR)).toBeTruthy();
        expect(fs.changeWorkingDirectory(TEST_DIR)).toBeTruthy();
    });

    it("should create a file in the Current Working Directory and check it's absolute path", function() {
        fs.write(TEST_FILE, TEST_FILE, "w");
        var suffix = fs.join("", TEST_DIR, TEST_FILE),
            abs = fs.absolute(".." + suffix),
            lastIndex = abs.lastIndexOf(suffix);
        expect(lastIndex).toNotEqual(-1);
        expect(lastIndex + suffix.length === abs.length);
    });

    it("should return to previous Current Working Directory and remove temporary directory", function() {
        expect(fs.changeWorkingDirectory(START_CWD)).toBeTruthy();
        fs.removeTree(TEST_DIR);
    });

    it("should copy Content of the '/test/' Directory in a temporary directory, compare with the original and then remove", function() {
        var phantomLibraryPathListingLength = fs.list(phantom.libraryPath).length;
        fs.copyTree(phantom.libraryPath, "/tmp/"+TEST_DIR);
        expect(phantomLibraryPathListingLength === fs.list("/tmp/"+TEST_DIR).length);
        fs.removeTree("/tmp/"+TEST_DIR);
    });

    // TODO: test the actual functionality once we can create symlink.
    it("should have readLink function", function() {
            expect(typeof fs.readLink).toEqual('function');
    });

    fs.removeTree(TEST_DIR);

    describe("fs.join(...)", function() {
        var parts, expected, actual;

        it("empty parts", function() {
            parts = [];
            expected = ".";
            actual = fs.join.apply(null, parts);
            expect(actual).toEqual(expected);
        });

        it("one part (empty string)", function() {
            parts = [""];
            expected = ".";
            actual = fs.join.apply(null, parts);
            expect(actual).toEqual(expected);
        });

        it("one part (array)", function() {
            parts = [[], null];
            expected = ".";
            actual = fs.join.apply(null, parts);
            expect(actual).toEqual(expected);
        });

        it("empty string and one part", function() {
            parts = ["", "a"];
            expected = "/a";
            actual = fs.join.apply(null, parts);
            expect(actual).toEqual(expected);
        });

        it("empty string and multiple parts", function() {
            parts = ["", "a", "b", "c"];
            expected = "/a/b/c";
            actual = fs.join.apply(null, parts);
            expect(actual).toEqual(expected);
        });

        it("empty string and multiple parts with empty strings", function() {
            parts = ["", "a", "", "b", "", "c"];
            expected = "/a/b/c";
            actual = fs.join.apply(null, parts);
            expect(actual).toEqual(expected);
        });

        it("multiple parts", function() {
            parts = ["a", "b", "c"];
            expected = "a/b/c";
            actual = fs.join.apply(null, parts);
            expect(actual).toEqual(expected);
        });

        it("multiple parts with empty strings", function() {
            parts = ["a", "", "b", "", "c"];
            expected = "a/b/c";
            actual = fs.join.apply(null, parts);
            expect(actual).toEqual(expected);
        });
    });

    describe("fs.split(path)", function() {
        var path, expected, actual;

        it("should split absolute path with trailing separator", function() {
            path = fs.separator + "a" + fs.separator + "b" + fs.separator + "c" + fs.separator + "d" + fs.separator;
            actual = fs.split(path);
            expected = ["", "a", "b", "c", "d"];
            expect(actual).toEqual(expected);
        });

        it("should split absolute path without trailing separator", function() {
            path = fs.separator + "a" + fs.separator + "b" + fs.separator + "c" + fs.separator + "d";
            actual = fs.split(path);
            expected = ["", "a", "b", "c", "d"];
            expect(actual).toEqual(expected);
        });

        it("should split non-absolute path with trailing separator", function() {
            path = "a" + fs.separator + "b" + fs.separator + "c" + fs.separator + "d" + fs.separator;
            actual = fs.split(path);
            expected = ["a", "b", "c", "d"];
            expect(actual).toEqual(expected);
        });

        it("should split non-absolute path without trailing separator", function() {
            path = "a" + fs.separator + "b" + fs.separator + "c" + fs.separator + "d";
            actual = fs.split(path);
            expected = ["a", "b", "c", "d"];
            expect(actual).toEqual(expected);
        });

        it("should split path with consecutive separators", function() {
            path = "a" + fs.separator + fs.separator + fs.separator + "b" + fs.separator + "c" + fs.separator + fs.separator + "d" + fs.separator + fs.separator + fs.separator;
            expected = ["a", "b", "c", "d"];
            actual = fs.split(path);
            expect(actual).toEqual(expected);
        });
    });
});

@@ -145,16 +145,52 @@
 irectory
+,%0A        system = require('system')
 ;%0A%0A    i
@@ -1271,16 +1271,309 @@
 length;%0A
+        var targetDirectory = '/tmp/';%0A%0A        if (system.os.name === 'windows') %7B%0A            targetDirectory = system.env%5B'TMP'%5D;%0A            if (targetDirectory.indexOf('%5C%5C', targetDirectory.length - '%5C%5C'.length) === -1) %7B%0A                targetDirectory += '%5C%5C';%0A            %7D%0A        %7D%0A%0A
         
@@ -1605,24 +1605,34 @@
 ryPath, 
-%22/tmp/%22+
+targetDirectory + 
 TEST_DIR
@@ -1693,24 +1693,34 @@
 fs.list(
-%22/tmp/%22+
+targetDirectory + 
 TEST_DIR
@@ -1756,16 +1756,26 @@
 ree(
-%22/tmp/%22+
+targetDirectory + 
 TEST

Fix invalid directory path for Windows.