1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
| 'use strict';
| var tape = require('tape');
| var path = require('../');
|
| var backslashRE = /\\/g;
|
| 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'],
| [[' ', '.'], ' '],
| [[' ', '/'], ' /'],
| [[' ', ''], ' '],
| [['/', 'foo'], '/foo'],
| [['/', '/foo'], '/foo'],
| [['/', '//foo'], '/foo'],
| [['/', '', '/foo'], '/foo'],
| [['', '/', 'foo'], '/foo'],
| [['', '/', '/foo'], '/foo']
| ];
|
| // Windows-specific join tests
| var windowsJoinTests =
| [// arguments result
| // UNC path expected
| [['//foo/bar'], '\\\\foo\\bar\\'],
| [['\\/foo/bar'], '\\\\foo\\bar\\'],
| [['\\\\foo/bar'], '\\\\foo\\bar\\'],
| // UNC path expected - server and share separate
| [['//foo', 'bar'], '\\\\foo\\bar\\'],
| [['//foo/', 'bar'], '\\\\foo\\bar\\'],
| [['//foo', '/bar'], '\\\\foo\\bar\\'],
| // UNC path expected - questionable
| [['//foo', '', 'bar'], '\\\\foo\\bar\\'],
| [['//foo/', '', 'bar'], '\\\\foo\\bar\\'],
| [['//foo/', '', '/bar'], '\\\\foo\\bar\\'],
| // UNC path expected - even more questionable
| [['', '//foo', 'bar'], '\\\\foo\\bar\\'],
| [['', '//foo/', 'bar'], '\\\\foo\\bar\\'],
| [['', '//foo/', '/bar'], '\\\\foo\\bar\\'],
| // No UNC path expected (no double slash in first component)
| [['\\', 'foo/bar'], '\\foo\\bar'],
| [['\\', '/foo/bar'], '\\foo\\bar'],
| [['', '/', '/foo/bar'], '\\foo\\bar'],
| // No UNC path expected (no non-slashes in first component -
| // questionable)
| [['//', 'foo/bar'], '\\foo\\bar'],
| [['//', '/foo/bar'], '\\foo\\bar'],
| [['\\\\', '/', '/foo/bar'], '\\foo\\bar'],
| [['//'], '/'],
| // No UNC path expected (share name missing - questionable).
| [['//foo'], '\\foo'],
| [['//foo/'], '\\foo\\'],
| [['//foo', '/'], '\\foo\\'],
| [['//foo', '', '/'], '\\foo\\'],
| // No UNC path expected (too many leading slashes - questionable)
| [['///foo/bar'], '\\foo\\bar'],
| [['////foo', 'bar'], '\\foo\\bar'],
| [['\\\\\\/foo/bar'], '\\foo\\bar'],
| // Drive-relative vs drive-absolute paths. This merely describes the
| // status quo, rather than being obviously right
| [['c:'], 'c:.'],
| [['c:.'], 'c:.'],
| [['c:', ''], 'c:.'],
| [['', 'c:'], 'c:.'],
| [['c:.', '/'], 'c:.\\'],
| [['c:.', 'file'], 'c:file'],
| [['c:', '/'], 'c:\\'],
| [['c:', 'file'], 'c:\\file']
| ];
|
| tape('path.posix.join', function (t) {
| joinTests.forEach(function (p) {
| var actual = path.posix.join.apply(null, p[0]);
| t.strictEqual(actual, p[1]);
| });
| t.end();
| });
|
| tape('path.win32.join', { skip: true }, function (t) {
| joinTests.forEach(function (p) {
| var actual = path.win32.join.apply(null, p[0]).replace(backslashRE, '/');
| t.strictEqual(actual, p[1]);
| });
| windowsJoinTests.forEach(function (p) {
| var actual = path.win32.join.apply(null, p[0]);
| t.strictEqual(actual, p[1]);
| });
| t.end();
| });
|
|