@@ -9,14 +9,22 @@ import (
9
9
"github.com/stretchr/testify/require"
10
10
)
11
11
12
+ func mustGetWindowsString (p path.Stringer ) string {
13
+ s , err := p .GetWindowsString ()
14
+ if err != nil {
15
+ panic (err )
16
+ }
17
+ return s
18
+ }
19
+
12
20
func TestBuilder (t * testing.T ) {
13
21
ctrl := gomock .NewController (t )
14
22
15
23
// The following paths should remain completely identical when
16
24
// resolved without making any assumptions about the layout of
17
25
// the underlying file system. ".." elements should not be
18
26
// removed from paths.
19
- t .Run ("Identity " , func (t * testing.T ) {
27
+ t .Run ("UNIXIdentity " , func (t * testing.T ) {
20
28
for _ , p := range []string {
21
29
"." ,
22
30
".." ,
@@ -42,9 +50,122 @@ func TestBuilder(t *testing.T) {
42
50
}
43
51
})
44
52
53
+ t .Run ("WindowsParseUNIXPaths" , func (t * testing.T ) {
54
+ for _ , data := range [][]string {
55
+ {"." , "." },
56
+ {".." , ".." },
57
+ {"/" , "\\ " },
58
+ {"hello" , "hello" },
59
+ {"hello/" , "hello\\ " },
60
+ {"hello/.." , "hello\\ .." },
61
+ {"/hello/" , "\\ hello\\ " },
62
+ {"/hello/.." , "\\ hello\\ .." },
63
+ {"/hello/../world" , "\\ hello\\ ..\\ world" },
64
+ {"/hello/../world/" , "\\ hello\\ ..\\ world\\ " },
65
+ {"/hello/../world/foo" , "\\ hello\\ ..\\ world\\ foo" },
66
+ } {
67
+ p := data [0 ]
68
+ expected := data [1 ]
69
+ t .Run (p , func (t * testing.T ) {
70
+ // Windows Parser, compare Windows and UNIX string identity.
71
+ builder1 , scopewalker1 := path .EmptyBuilder .Join (path .VoidScopeWalker )
72
+ require .NoError (t , path .Resolve (path .NewWindowsParser (p ), scopewalker1 ))
73
+ require .Equal (t , expected , mustGetWindowsString (builder1 ))
74
+ require .Equal (t , p , builder1 .GetUNIXString ())
75
+
76
+ builder2 , scopewalker2 := path .EmptyBuilder .Join (path .VoidScopeWalker )
77
+ require .NoError (t , path .Resolve (builder1 , scopewalker2 ))
78
+ require .Equal (t , expected , mustGetWindowsString (builder2 ))
79
+ require .Equal (t , p , builder2 .GetUNIXString ())
80
+ })
81
+ }
82
+ })
83
+
84
+ t .Run ("WindowsIdentity" , func (t * testing.T ) {
85
+ for _ , p := range []string {
86
+ "C:\\ " ,
87
+ "C:\\ hello\\ " ,
88
+ "C:\\ hello\\ .." ,
89
+ "C:\\ hello\\ ..\\ world" ,
90
+ "C:\\ hello\\ ..\\ world\\ " ,
91
+ "C:\\ hello\\ ..\\ world\\ foo" ,
92
+ "C:\\ hello\\ ..\\ world\\ foo" ,
93
+ } {
94
+ t .Run (p , func (t * testing.T ) {
95
+ builder1 , scopewalker1 := path .EmptyBuilder .Join (path .VoidScopeWalker )
96
+ require .NoError (t , path .Resolve (path .NewWindowsParser (p ), scopewalker1 ))
97
+ require .Equal (t , p , mustGetWindowsString (builder1 ))
98
+
99
+ builder2 , scopewalker2 := path .EmptyBuilder .Join (path .VoidScopeWalker )
100
+ require .NoError (t , path .Resolve (builder1 , scopewalker2 ))
101
+ require .Equal (t , p , mustGetWindowsString (builder2 ))
102
+ })
103
+ }
104
+ })
105
+
106
+ t .Run ("WindowsParseAndWriteUNIXPaths" , func (t * testing.T ) {
107
+ for _ , data := range [][]string {
108
+ {"C:\\ " , "/" },
109
+ {"C:\\ ." , "/" },
110
+ {"C:\\ hello\\ " , "/hello/" },
111
+ {"C:\\ hello\\ ." , "/hello/" },
112
+ {"C:\\ hello\\ .." , "/hello/.." },
113
+ {"C:\\ hello\\ .\\ world" , "/hello/world" },
114
+ {"C:\\ hello\\ ..\\ world" , "/hello/../world" },
115
+ {"C:\\ hello\\ ..\\ world\\ " , "/hello/../world/" },
116
+ {"C:\\ hello\\ ..\\ world\\ foo" , "/hello/../world/foo" },
117
+ {"C:\\ hello\\ \\ ..\\ world\\ foo" , "/hello/../world/foo" },
118
+ } {
119
+ p := data [0 ]
120
+ expected := data [1 ]
121
+ t .Run (p , func (t * testing.T ) {
122
+ builder1 , scopewalker1 := path .EmptyBuilder .Join (path .VoidScopeWalker )
123
+ require .NoError (t , path .Resolve (path .NewWindowsParser (p ), scopewalker1 ))
124
+ require .Equal (t , expected , builder1 .GetUNIXString ())
125
+
126
+ builder2 , scopewalker2 := path .EmptyBuilder .Join (path .VoidScopeWalker )
127
+ require .NoError (t , path .Resolve (builder1 , scopewalker2 ))
128
+ require .Equal (t , expected , builder2 .GetUNIXString ())
129
+ })
130
+ }
131
+ })
132
+
133
+ t .Run ("WindowsParseCasing" , func (t * testing.T ) {
134
+ for _ , data := range [][]string {
135
+ {"./bar" , "bar" },
136
+ {"./bar\\ " , "bar\\ " },
137
+ {"c:" , "C:\\ " },
138
+ {"c:." , "C:\\ " },
139
+ {"c:Hello" , "C:\\ Hello" },
140
+ {"c:\\ " , "C:\\ " },
141
+ {"c:\\ ." , "C:\\ " },
142
+ {"c:\\ Hello\\ " , "C:\\ Hello\\ " },
143
+ {"c:\\ Hello\\ ." , "C:\\ Hello\\ " },
144
+ {"c:\\ Hello\\ .." , "C:\\ Hello\\ .." },
145
+ {"c:\\ Hello\\ .\\ world" , "C:\\ Hello\\ world" },
146
+ {"c:\\ Hello\\ ..\\ world" , "C:\\ Hello\\ ..\\ world" },
147
+ {"c:\\ Hello\\ ..\\ world" , "C:\\ Hello\\ ..\\ world" },
148
+ {"c:\\ Hello\\ ..\\ world\\ " , "C:\\ Hello\\ ..\\ world\\ " },
149
+ {"c:\\ Hello\\ ..\\ world\\ foo" , "C:\\ Hello\\ ..\\ world\\ foo" },
150
+ {"c:\\ \\ Hello\\ \\ ..\\ world\\ foo" , "C:\\ Hello\\ ..\\ world\\ foo" },
151
+ } {
152
+ p := data [0 ]
153
+ expected := data [1 ]
154
+ t .Run (p , func (t * testing.T ) {
155
+ builder1 , scopewalker1 := path .EmptyBuilder .Join (path .VoidScopeWalker )
156
+ require .NoError (t , path .Resolve (path .NewWindowsParser (p ), scopewalker1 ))
157
+ require .Equal (t , expected , mustGetWindowsString (builder1 ))
158
+
159
+ builder2 , scopewalker2 := path .EmptyBuilder .Join (path .VoidScopeWalker )
160
+ require .NoError (t , path .Resolve (builder1 , scopewalker2 ))
161
+ require .Equal (t , expected , mustGetWindowsString (builder2 ))
162
+ })
163
+ }
164
+ })
165
+
45
166
// The following paths can be normalized, even when making no
46
167
// assumptions about the layout of the underlying file system.
47
- t .Run ("Normalized " , func (t * testing.T ) {
168
+ t .Run ("UNIXNormalized " , func (t * testing.T ) {
48
169
for from , to := range map [string ]string {
49
170
"" : "." ,
50
171
"./" : "." ,
@@ -71,6 +192,33 @@ func TestBuilder(t *testing.T) {
71
192
}
72
193
})
73
194
195
+ t .Run ("WindowsNormalized" , func (t * testing.T ) {
196
+ for from , to := range map [string ]string {
197
+ "" : "." ,
198
+ "./" : "." ,
199
+ "./." : "." ,
200
+ "../" : ".." ,
201
+ "../." : ".." ,
202
+ "//" : "\\ " ,
203
+ "/." : "\\ " ,
204
+ "/./" : "\\ " ,
205
+ "/.." : "\\ " ,
206
+ "/../" : "\\ " ,
207
+ "/hello/." : "\\ hello\\ " ,
208
+ "/hello/../." : "\\ hello\\ .." ,
209
+ } {
210
+ t .Run (from , func (t * testing.T ) {
211
+ builder1 , scopeWalker1 := path .EmptyBuilder .Join (path .VoidScopeWalker )
212
+ require .NoError (t , path .Resolve (path .MustNewUNIXParser (from ), scopeWalker1 ))
213
+ require .Equal (t , to , mustGetWindowsString (builder1 ))
214
+
215
+ builder2 , scopeWalker2 := path .EmptyBuilder .Join (path .VoidScopeWalker )
216
+ require .NoError (t , path .Resolve (builder1 , scopeWalker2 ))
217
+ require .Equal (t , to , mustGetWindowsString (builder2 ))
218
+ })
219
+ }
220
+ })
221
+
74
222
// Paths generated by joining with RootBuilder should start the
75
223
// resolution process at the root directory.
76
224
t .Run ("Root" , func (t * testing.T ) {
0 commit comments