test: split path tests into multiple files · nodejs/node@06ee10e

1+

'use strict';

2+

require('../common');

3+

const assert = require('assert');

4+

const path = require('path');

5+6+

const failures = [];

7+

const backslashRE = /\\/g;

8+9+

const joinTests = [

10+

[ [path.posix.join, path.win32.join],

11+

// arguments result

12+

[[['.', 'x/b', '..', '/b/c.js'], 'x/b/c.js'],

13+

[[], '.'],

14+

[['/.', 'x/b', '..', '/b/c.js'], '/x/b/c.js'],

15+

[['/foo', '../../../bar'], '/bar'],

16+

[['foo', '../../../bar'], '../../bar'],

17+

[['foo/', '../../../bar'], '../../bar'],

18+

[['foo/x', '../../../bar'], '../bar'],

19+

[['foo/x', './bar'], 'foo/x/bar'],

20+

[['foo/x/', './bar'], 'foo/x/bar'],

21+

[['foo/x/', '.', 'bar'], 'foo/x/bar'],

22+

[['./'], './'],

23+

[['.', './'], './'],

24+

[['.', '.', '.'], '.'],

25+

[['.', './', '.'], '.'],

26+

[['.', '/./', '.'], '.'],

27+

[['.', '/////./', '.'], '.'],

28+

[['.'], '.'],

29+

[['', '.'], '.'],

30+

[['', 'foo'], 'foo'],

31+

[['foo', '/bar'], 'foo/bar'],

32+

[['', '/foo'], '/foo'],

33+

[['', '', '/foo'], '/foo'],

34+

[['', '', 'foo'], 'foo'],

35+

[['foo', ''], 'foo'],

36+

[['foo/', ''], 'foo/'],

37+

[['foo', '', '/bar'], 'foo/bar'],

38+

[['./', '..', '/foo'], '../foo'],

39+

[['./', '..', '..', '/foo'], '../../foo'],

40+

[['.', '..', '..', '/foo'], '../../foo'],

41+

[['', '..', '..', '/foo'], '../../foo'],

42+

[['/'], '/'],

43+

[['/', '.'], '/'],

44+

[['/', '..'], '/'],

45+

[['/', '..', '..'], '/'],

46+

[[''], '.'],

47+

[['', ''], '.'],

48+

[[' /foo'], ' /foo'],

49+

[[' ', 'foo'], ' /foo'],

50+

[[' ', '.'], ' '],

51+

[[' ', '/'], ' /'],

52+

[[' ', ''], ' '],

53+

[['/', 'foo'], '/foo'],

54+

[['/', '/foo'], '/foo'],

55+

[['/', '//foo'], '/foo'],

56+

[['/', '', '/foo'], '/foo'],

57+

[['', '/', 'foo'], '/foo'],

58+

[['', '/', '/foo'], '/foo']

59+

]

60+

]

61+

];

62+63+

// Windows-specific join tests

64+

joinTests.push([

65+

path.win32.join,

66+

joinTests[0][1].slice(0).concat(

67+

[// arguments result

68+

// UNC path expected

69+

[['//foo/bar'], '\\\\foo\\bar\\'],

70+

[['\\/foo/bar'], '\\\\foo\\bar\\'],

71+

[['\\\\foo/bar'], '\\\\foo\\bar\\'],

72+

// UNC path expected - server and share separate

73+

[['//foo', 'bar'], '\\\\foo\\bar\\'],

74+

[['//foo/', 'bar'], '\\\\foo\\bar\\'],

75+

[['//foo', '/bar'], '\\\\foo\\bar\\'],

76+

// UNC path expected - questionable

77+

[['//foo', '', 'bar'], '\\\\foo\\bar\\'],

78+

[['//foo/', '', 'bar'], '\\\\foo\\bar\\'],

79+

[['//foo/', '', '/bar'], '\\\\foo\\bar\\'],

80+

// UNC path expected - even more questionable

81+

[['', '//foo', 'bar'], '\\\\foo\\bar\\'],

82+

[['', '//foo/', 'bar'], '\\\\foo\\bar\\'],

83+

[['', '//foo/', '/bar'], '\\\\foo\\bar\\'],

84+

// No UNC path expected (no double slash in first component)

85+

[['\\', 'foo/bar'], '\\foo\\bar'],

86+

[['\\', '/foo/bar'], '\\foo\\bar'],

87+

[['', '/', '/foo/bar'], '\\foo\\bar'],

88+

// No UNC path expected (no non-slashes in first component -

89+

// questionable)

90+

[['//', 'foo/bar'], '\\foo\\bar'],

91+

[['//', '/foo/bar'], '\\foo\\bar'],

92+

[['\\\\', '/', '/foo/bar'], '\\foo\\bar'],

93+

[['//'], '/'],

94+

// No UNC path expected (share name missing - questionable).

95+

[['//foo'], '\\foo'],

96+

[['//foo/'], '\\foo\\'],

97+

[['//foo', '/'], '\\foo\\'],

98+

[['//foo', '', '/'], '\\foo\\'],

99+

// No UNC path expected (too many leading slashes - questionable)

100+

[['///foo/bar'], '\\foo\\bar'],

101+

[['////foo', 'bar'], '\\foo\\bar'],

102+

[['\\\\\\/foo/bar'], '\\foo\\bar'],

103+

// Drive-relative vs drive-absolute paths. This merely describes the

104+

// status quo, rather than being obviously right

105+

[['c:'], 'c:.'],

106+

[['c:.'], 'c:.'],

107+

[['c:', ''], 'c:.'],

108+

[['', 'c:'], 'c:.'],

109+

[['c:.', '/'], 'c:.\\'],

110+

[['c:.', 'file'], 'c:file'],

111+

[['c:', '/'], 'c:\\'],

112+

[['c:', 'file'], 'c:\\file']

113+

]

114+

)

115+

]);

116+

joinTests.forEach((test) => {

117+

if (!Array.isArray(test[0]))

118+

test[0] = [test[0]];

119+

test[0].forEach((join) => {

120+

test[1].forEach((test) => {

121+

const actual = join.apply(null, test[0]);

122+

const expected = test[1];

123+

// For non-Windows specific tests with the Windows join(), we need to try

124+

// replacing the slashes since the non-Windows specific tests' `expected`

125+

// use forward slashes

126+

let actualAlt;

127+

let os;

128+

if (join === path.win32.join) {

129+

actualAlt = actual.replace(backslashRE, '/');

130+

os = 'win32';

131+

} else {

132+

os = 'posix';

133+

}

134+

const message =

135+

`path.${os}.join(${test[0].map(JSON.stringify).join(',')})\n expect=${

136+

JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`;

137+

if (actual !== expected && actualAlt !== expected)

138+

failures.push(`\n${message}`);

139+

});

140+

});

141+

});

142+

assert.strictEqual(failures.length, 0, failures.join(''));