github.com/linchen2chris/hugo@v0.0.0-20230307053224-cec209389705/tpl/path/path_test.go (about) 1 // Copyright 2018 The Hugo Authors. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package path 15 16 import ( 17 "path/filepath" 18 "testing" 19 20 qt "github.com/frankban/quicktest" 21 "github.com/gohugoio/hugo/common/paths" 22 "github.com/gohugoio/hugo/config" 23 "github.com/gohugoio/hugo/deps" 24 ) 25 26 var ns = New(&deps.Deps{Cfg: config.New()}) 27 28 type tstNoStringer struct{} 29 30 func TestBase(t *testing.T) { 31 t.Parallel() 32 c := qt.New(t) 33 34 for _, test := range []struct { 35 path any 36 expect any 37 }{ 38 {filepath.FromSlash(`foo/bar.txt`), `bar.txt`}, 39 {filepath.FromSlash(`foo/bar/txt `), `txt `}, 40 {filepath.FromSlash(`foo/bar.t`), `bar.t`}, 41 {`foo.bar.txt`, `foo.bar.txt`}, 42 {`.x`, `.x`}, 43 {``, `.`}, 44 // errors 45 {tstNoStringer{}, false}, 46 } { 47 48 result, err := ns.Base(test.path) 49 50 if b, ok := test.expect.(bool); ok && !b { 51 c.Assert(err, qt.Not(qt.IsNil)) 52 continue 53 } 54 55 c.Assert(err, qt.IsNil) 56 c.Assert(result, qt.Equals, test.expect) 57 } 58 } 59 60 func TestBaseName(t *testing.T) { 61 t.Parallel() 62 c := qt.New(t) 63 64 for _, test := range []struct { 65 path any 66 expect any 67 }{ 68 {filepath.FromSlash(`foo/bar.txt`), `bar`}, 69 {filepath.FromSlash(`foo/bar/txt `), `txt `}, 70 {filepath.FromSlash(`foo/bar.t`), `bar`}, 71 {`foo.bar.txt`, `foo.bar`}, 72 {`.x`, ``}, 73 {``, `.`}, 74 // errors 75 {tstNoStringer{}, false}, 76 } { 77 78 result, err := ns.BaseName(test.path) 79 80 if b, ok := test.expect.(bool); ok && !b { 81 c.Assert(err, qt.Not(qt.IsNil)) 82 continue 83 } 84 85 c.Assert(err, qt.IsNil) 86 c.Assert(result, qt.Equals, test.expect) 87 } 88 } 89 90 func TestDir(t *testing.T) { 91 t.Parallel() 92 c := qt.New(t) 93 94 for _, test := range []struct { 95 path any 96 expect any 97 }{ 98 {filepath.FromSlash(`foo/bar.txt`), `foo`}, 99 {filepath.FromSlash(`foo/bar/txt `), `foo/bar`}, 100 {filepath.FromSlash(`foo/bar.t`), `foo`}, 101 {`foo.bar.txt`, `.`}, 102 {`.x`, `.`}, 103 {``, `.`}, 104 // errors 105 {tstNoStringer{}, false}, 106 } { 107 108 result, err := ns.Dir(test.path) 109 110 if b, ok := test.expect.(bool); ok && !b { 111 c.Assert(err, qt.Not(qt.IsNil)) 112 continue 113 } 114 115 c.Assert(err, qt.IsNil) 116 c.Assert(result, qt.Equals, test.expect) 117 } 118 } 119 120 func TestExt(t *testing.T) { 121 t.Parallel() 122 c := qt.New(t) 123 124 for _, test := range []struct { 125 path any 126 expect any 127 }{ 128 {filepath.FromSlash(`foo/bar.json`), `.json`}, 129 {`foo.bar.txt `, `.txt `}, 130 {``, ``}, 131 {`.x`, `.x`}, 132 // errors 133 {tstNoStringer{}, false}, 134 } { 135 136 result, err := ns.Ext(test.path) 137 138 if b, ok := test.expect.(bool); ok && !b { 139 c.Assert(err, qt.Not(qt.IsNil)) 140 continue 141 } 142 143 c.Assert(err, qt.IsNil) 144 c.Assert(result, qt.Equals, test.expect) 145 } 146 } 147 148 func TestJoin(t *testing.T) { 149 t.Parallel() 150 c := qt.New(t) 151 152 for _, test := range []struct { 153 elements any 154 expect any 155 }{ 156 { 157 []string{"", "baz", filepath.FromSlash(`foo/bar.txt`)}, 158 `baz/foo/bar.txt`, 159 }, 160 { 161 []any{"", "baz", paths.DirFile{Dir: "big", File: "john"}, filepath.FromSlash(`foo/bar.txt`)}, 162 `baz/big|john/foo/bar.txt`, 163 }, 164 {nil, ""}, 165 // errors 166 {tstNoStringer{}, false}, 167 {[]any{"", tstNoStringer{}}, false}, 168 } { 169 170 result, err := ns.Join(test.elements) 171 172 if b, ok := test.expect.(bool); ok && !b { 173 c.Assert(err, qt.Not(qt.IsNil)) 174 continue 175 } 176 177 c.Assert(err, qt.IsNil) 178 c.Assert(result, qt.Equals, test.expect) 179 } 180 } 181 182 func TestSplit(t *testing.T) { 183 t.Parallel() 184 c := qt.New(t) 185 186 for _, test := range []struct { 187 path any 188 expect any 189 }{ 190 {filepath.FromSlash(`foo/bar.txt`), paths.DirFile{Dir: `foo/`, File: `bar.txt`}}, 191 {filepath.FromSlash(`foo/bar/txt `), paths.DirFile{Dir: `foo/bar/`, File: `txt `}}, 192 {`foo.bar.txt`, paths.DirFile{Dir: ``, File: `foo.bar.txt`}}, 193 {``, paths.DirFile{Dir: ``, File: ``}}, 194 // errors 195 {tstNoStringer{}, false}, 196 } { 197 198 result, err := ns.Split(test.path) 199 200 if b, ok := test.expect.(bool); ok && !b { 201 c.Assert(err, qt.Not(qt.IsNil)) 202 continue 203 } 204 205 c.Assert(err, qt.IsNil) 206 c.Assert(result, qt.Equals, test.expect) 207 } 208 } 209 210 func TestClean(t *testing.T) { 211 t.Parallel() 212 c := qt.New(t) 213 214 for _, test := range []struct { 215 path any 216 expect any 217 }{ 218 {filepath.FromSlash(`foo/bar.txt`), `foo/bar.txt`}, 219 {filepath.FromSlash(`foo/bar/txt`), `foo/bar/txt`}, 220 {filepath.FromSlash(`foo/bar`), `foo/bar`}, 221 {filepath.FromSlash(`foo/bar.t`), `foo/bar.t`}, 222 {``, `.`}, 223 // errors 224 {tstNoStringer{}, false}, 225 } { 226 227 result, err := ns.Clean(test.path) 228 229 if b, ok := test.expect.(bool); ok && !b { 230 c.Assert(err, qt.Not(qt.IsNil)) 231 continue 232 } 233 234 c.Assert(err, qt.IsNil) 235 c.Assert(result, qt.Equals, test.expect) 236 } 237 }