@@ -105,3 +105,76 @@ func Test_ToUpperBytes_Edge(t *testing.T) {
105105 })
106106 }
107107}
108+
109+ func Test_AddTrailingSlashBytes (t * testing.T ) {
110+ t .Parallel ()
111+
112+ testCases := []struct {
113+ name string
114+ in []byte
115+ want []byte
116+ }{
117+ {name : "empty" , in : []byte ("" ), want : []byte ("/" )},
118+ {name : "slash-only" , in : []byte ("/" ), want : []byte ("/" )},
119+ {name : "short-no-slash" , in : []byte ("abc" ), want : []byte ("abc/" )},
120+ {name : "short-with-slash" , in : []byte ("abc/" ), want : []byte ("abc/" )},
121+ {name : "path-no-slash" , in : []byte ("/api/v1/users" ), want : []byte ("/api/v1/users/" )},
122+ {name : "path-with-slash" , in : []byte ("/api/v1/users/" ), want : []byte ("/api/v1/users/" )},
123+ {name : "double-slash" , in : []byte ("abc//" ), want : []byte ("abc//" )},
124+ {name : "unicode" , in : []byte ("/日本語" ), want : []byte ("/日本語/" )},
125+ }
126+
127+ for _ , tc := range testCases {
128+ t .Run (tc .name , func (t * testing.T ) {
129+ t .Parallel ()
130+ result := AddTrailingSlashBytes (tc .in )
131+ require .Equal (t , tc .want , result )
132+ })
133+ }
134+ }
135+
136+ func Test_AddTrailingSlashBytes_NoMutation (t * testing.T ) {
137+ t .Parallel ()
138+
139+ original := []byte ("test" )
140+ originalCopy := make ([]byte , len (original ))
141+ copy (originalCopy , original )
142+
143+ _ = AddTrailingSlashBytes (original )
144+
145+ require .Equal (t , originalCopy , original , "original slice should not be mutated" )
146+ }
147+
148+ func Test_AddTrailingSlashBytes_ReturnsSame (t * testing.T ) {
149+ t .Parallel ()
150+
151+ input := []byte ("test/" )
152+ result := AddTrailingSlashBytes (input )
153+ require .Equal (t , input , result )
154+ require .Same (t , & input [0 ], & result [0 ], "should return same slice instance" )
155+ }
156+
157+ func Benchmark_AddTrailingSlashBytes (b * testing.B ) {
158+ cases := []struct {
159+ name string
160+ input []byte
161+ }{
162+ {name : "empty" , input : []byte ("" )},
163+ {name : "slash-only" , input : []byte ("/" )},
164+ {name : "short-no-slash" , input : []byte ("abc" )},
165+ {name : "short-with-slash" , input : []byte ("abc/" )},
166+ {name : "path-no-slash" , input : []byte ("/api/v1/users" )},
167+ {name : "path-with-slash" , input : []byte ("/api/v1/users/" )},
168+ }
169+
170+ for _ , tc := range cases {
171+ b .Run (tc .name , func (b * testing.B ) {
172+ b .ReportAllocs ()
173+ var res []byte
174+ for n := 0 ; n < b .N ; n ++ {
175+ res = AddTrailingSlashBytes (tc .input )
176+ }
177+ _ = res
178+ })
179+ }
180+ }
0 commit comments