blob: e6108d905d199b62398eedf0f29ab5fd004eccc8 [file] [log] [blame]
Russ Cox0b477ef2012-02-16 23:48:57 -05001// run
Rob Pike797cc492009-11-18 15:31:22 -08002
3// Copyright 2009 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
Rob Pikefc0dc042012-02-19 13:19:43 +11007// Semi-exhaustive test for the copy predeclared function.
Rob Pike797cc492009-11-18 15:31:22 -08008
9package main
10
11import (
Russ Cox6aaef042010-06-08 17:51:57 -070012 "fmt"
13 "os"
Rob Pike797cc492009-11-18 15:31:22 -080014)
15
16const N = 40
17
18var input8 = make([]uint8, N)
19var output8 = make([]uint8, N)
20var input16 = make([]uint16, N)
21var output16 = make([]uint16, N)
22var input32 = make([]uint32, N)
23var output32 = make([]uint32, N)
24var input64 = make([]uint64, N)
25var output64 = make([]uint64, N)
Russ Cox0f289832010-10-26 08:36:23 -070026var inputS string
27var outputS = make([]uint8, N)
28
29type my8 []uint8
30type my16 []uint16
31type my32 []uint32
32type my32b []uint32
33type my64 []uint64
34type myS string
Rob Pike797cc492009-11-18 15:31:22 -080035
36func u8(i int) uint8 {
Russ Cox6aaef042010-06-08 17:51:57 -070037 i = 'a' + i%26
38 return uint8(i)
Rob Pike797cc492009-11-18 15:31:22 -080039}
40
41func u16(ii int) uint16 {
Russ Cox6aaef042010-06-08 17:51:57 -070042 var i = uint16(ii)
43 i = 'a' + i%26
44 i |= i << 8
45 return i
Rob Pike797cc492009-11-18 15:31:22 -080046}
47
48func u32(ii int) uint32 {
Russ Cox6aaef042010-06-08 17:51:57 -070049 var i = uint32(ii)
50 i = 'a' + i%26
51 i |= i << 8
52 i |= i << 16
53 return i
Rob Pike797cc492009-11-18 15:31:22 -080054}
55
56func u64(ii int) uint64 {
Russ Cox6aaef042010-06-08 17:51:57 -070057 var i = uint64(ii)
58 i = 'a' + i%26
59 i |= i << 8
60 i |= i << 16
61 i |= i << 32
62 return i
Rob Pike797cc492009-11-18 15:31:22 -080063}
64
65func reset() {
Rob Pike9682ee42009-11-18 22:26:36 -080066 // swap in and out to exercise copy-up and copy-down
Russ Cox6aaef042010-06-08 17:51:57 -070067 input8, output8 = output8, input8
68 input16, output16 = output16, input16
69 input32, output32 = output32, input32
70 input64, output64 = output64, input64
71 in := 0
72 out := 13
Rob Pike797cc492009-11-18 15:31:22 -080073 for i := range input8 {
Russ Cox6aaef042010-06-08 17:51:57 -070074 input8[i] = u8(in)
75 output8[i] = u8(out)
Russ Cox0f289832010-10-26 08:36:23 -070076 outputS[i] = u8(out)
Russ Cox6aaef042010-06-08 17:51:57 -070077 input16[i] = u16(in)
78 output16[i] = u16(out)
79 input32[i] = u32(in)
80 output32[i] = u32(out)
81 input64[i] = u64(in)
82 output64[i] = u64(out)
83 in++
84 out++
Rob Pike797cc492009-11-18 15:31:22 -080085 }
Russ Cox0f289832010-10-26 08:36:23 -070086 inputS = string(input8)
Rob Pike797cc492009-11-18 15:31:22 -080087}
88
89func clamp(n int) int {
90 if n > N {
91 return N
92 }
Russ Cox6aaef042010-06-08 17:51:57 -070093 return n
Rob Pike797cc492009-11-18 15:31:22 -080094}
95
Rob Pike9682ee42009-11-18 22:26:36 -080096func ncopied(length, in, out int) int {
Russ Cox6aaef042010-06-08 17:51:57 -070097 n := length
Rob Pike9682ee42009-11-18 22:26:36 -080098 if in+n > N {
Russ Cox6aaef042010-06-08 17:51:57 -070099 n = N - in
Rob Pike9682ee42009-11-18 22:26:36 -0800100 }
101 if out+n > N {
Russ Cox6aaef042010-06-08 17:51:57 -0700102 n = N - out
Rob Pike9682ee42009-11-18 22:26:36 -0800103 }
Russ Cox6aaef042010-06-08 17:51:57 -0700104 return n
Rob Pike9682ee42009-11-18 22:26:36 -0800105}
106
Rob Pike797cc492009-11-18 15:31:22 -0800107func doAllSlices(length, in, out int) {
Russ Cox6aaef042010-06-08 17:51:57 -0700108 reset()
Russ Cox0f289832010-10-26 08:36:23 -0700109 n := copy(my8(output8[out:clamp(out+length)]), input8[in:clamp(in+length)])
Russ Cox6aaef042010-06-08 17:51:57 -0700110 verify8(length, in, out, n)
Russ Cox0f289832010-10-26 08:36:23 -0700111 n = copy(my8(outputS[out:clamp(out+length)]), myS(inputS[in:clamp(in+length)]))
112 verifyS(length, in, out, n)
113 n = copy(my16(output16[out:clamp(out+length)]), input16[in:clamp(in+length)])
Russ Cox6aaef042010-06-08 17:51:57 -0700114 verify16(length, in, out, n)
Russ Cox0f289832010-10-26 08:36:23 -0700115 n = copy(my32(output32[out:clamp(out+length)]), my32b(input32[in:clamp(in+length)]))
Russ Cox6aaef042010-06-08 17:51:57 -0700116 verify32(length, in, out, n)
Russ Cox0f289832010-10-26 08:36:23 -0700117 n = copy(my64(output64[out:clamp(out+length)]), input64[in:clamp(in+length)])
Russ Cox6aaef042010-06-08 17:51:57 -0700118 verify64(length, in, out, n)
Rob Pike797cc492009-11-18 15:31:22 -0800119}
120
121func bad8(state string, i, length, in, out int) {
122 fmt.Printf("%s bad(%d %d %d): %c not %c:\n\t%s\n\t%s\n",
123 state,
124 length, in, out,
125 output8[i],
126 uint8(i+13),
Russ Cox6aaef042010-06-08 17:51:57 -0700127 input8, output8)
128 os.Exit(1)
Rob Pike797cc492009-11-18 15:31:22 -0800129}
130
Rob Pike9682ee42009-11-18 22:26:36 -0800131func verify8(length, in, out, m int) {
Russ Cox6aaef042010-06-08 17:51:57 -0700132 n := ncopied(length, in, out)
Rob Pike9682ee42009-11-18 22:26:36 -0800133 if m != n {
Russ Cox6aaef042010-06-08 17:51:57 -0700134 fmt.Printf("count bad(%d %d %d): %d not %d\n", length, in, out, m, n)
Alan Donovan052c9422013-02-12 13:17:49 -0500135 os.Exit(1)
Russ Cox6aaef042010-06-08 17:51:57 -0700136 return
Rob Pike9682ee42009-11-18 22:26:36 -0800137 }
138 // before
Russ Cox6aaef042010-06-08 17:51:57 -0700139 var i int
Rob Pike9682ee42009-11-18 22:26:36 -0800140 for i = 0; i < out; i++ {
Rob Pike797cc492009-11-18 15:31:22 -0800141 if output8[i] != u8(i+13) {
Russ Cox6aaef042010-06-08 17:51:57 -0700142 bad8("before8", i, length, in, out)
143 return
Rob Pike9682ee42009-11-18 22:26:36 -0800144 }
145 }
146 // copied part
147 for ; i < out+n; i++ {
148 if output8[i] != u8(i+in-out) {
Russ Cox6aaef042010-06-08 17:51:57 -0700149 bad8("copied8", i, length, in, out)
150 return
Rob Pike9682ee42009-11-18 22:26:36 -0800151 }
152 }
153 // after
154 for ; i < len(output8); i++ {
155 if output8[i] != u8(i+13) {
Russ Cox6aaef042010-06-08 17:51:57 -0700156 bad8("after8", i, length, in, out)
157 return
Rob Pike797cc492009-11-18 15:31:22 -0800158 }
159 }
160}
161
Russ Cox0f289832010-10-26 08:36:23 -0700162func badS(state string, i, length, in, out int) {
163 fmt.Printf("%s bad(%d %d %d): %c not %c:\n\t%s\n\t%s\n",
164 state,
165 length, in, out,
166 outputS[i],
167 uint8(i+13),
168 inputS, outputS)
169 os.Exit(1)
170}
171
172func verifyS(length, in, out, m int) {
173 n := ncopied(length, in, out)
174 if m != n {
175 fmt.Printf("count bad(%d %d %d): %d not %d\n", length, in, out, m, n)
Alan Donovan052c9422013-02-12 13:17:49 -0500176 os.Exit(1)
Russ Cox0f289832010-10-26 08:36:23 -0700177 return
178 }
179 // before
180 var i int
181 for i = 0; i < out; i++ {
182 if outputS[i] != u8(i+13) {
183 badS("beforeS", i, length, in, out)
184 return
185 }
186 }
187 // copied part
188 for ; i < out+n; i++ {
189 if outputS[i] != u8(i+in-out) {
190 badS("copiedS", i, length, in, out)
191 return
192 }
193 }
194 // after
195 for ; i < len(outputS); i++ {
196 if outputS[i] != u8(i+13) {
197 badS("afterS", i, length, in, out)
198 return
199 }
200 }
201}
202
Rob Pike797cc492009-11-18 15:31:22 -0800203func bad16(state string, i, length, in, out int) {
204 fmt.Printf("%s bad(%d %d %d): %x not %x:\n\t%v\n\t%v\n",
205 state,
206 length, in, out,
207 output16[i],
208 uint16(i+13),
Russ Cox6aaef042010-06-08 17:51:57 -0700209 input16, output16)
210 os.Exit(1)
Rob Pike797cc492009-11-18 15:31:22 -0800211}
212
Rob Pike9682ee42009-11-18 22:26:36 -0800213func verify16(length, in, out, m int) {
Russ Cox6aaef042010-06-08 17:51:57 -0700214 n := ncopied(length, in, out)
Rob Pike9682ee42009-11-18 22:26:36 -0800215 if m != n {
Russ Cox6aaef042010-06-08 17:51:57 -0700216 fmt.Printf("count bad(%d %d %d): %d not %d\n", length, in, out, m, n)
Alan Donovan052c9422013-02-12 13:17:49 -0500217 os.Exit(1)
Russ Cox6aaef042010-06-08 17:51:57 -0700218 return
Rob Pike9682ee42009-11-18 22:26:36 -0800219 }
220 // before
Russ Cox6aaef042010-06-08 17:51:57 -0700221 var i int
Rob Pike9682ee42009-11-18 22:26:36 -0800222 for i = 0; i < out; i++ {
Rob Pike797cc492009-11-18 15:31:22 -0800223 if output16[i] != u16(i+13) {
Russ Cox6aaef042010-06-08 17:51:57 -0700224 bad16("before16", i, length, in, out)
225 return
Rob Pike9682ee42009-11-18 22:26:36 -0800226 }
227 }
228 // copied part
229 for ; i < out+n; i++ {
230 if output16[i] != u16(i+in-out) {
Russ Cox6aaef042010-06-08 17:51:57 -0700231 bad16("copied16", i, length, in, out)
232 return
Rob Pike9682ee42009-11-18 22:26:36 -0800233 }
234 }
235 // after
236 for ; i < len(output16); i++ {
237 if output16[i] != u16(i+13) {
Russ Cox6aaef042010-06-08 17:51:57 -0700238 bad16("after16", i, length, in, out)
239 return
Rob Pike797cc492009-11-18 15:31:22 -0800240 }
241 }
242}
243
244func bad32(state string, i, length, in, out int) {
245 fmt.Printf("%s bad(%d %d %d): %x not %x:\n\t%v\n\t%v\n",
246 state,
247 length, in, out,
248 output32[i],
249 uint32(i+13),
Russ Cox6aaef042010-06-08 17:51:57 -0700250 input32, output32)
251 os.Exit(1)
Rob Pike797cc492009-11-18 15:31:22 -0800252}
253
Rob Pike9682ee42009-11-18 22:26:36 -0800254func verify32(length, in, out, m int) {
Russ Cox6aaef042010-06-08 17:51:57 -0700255 n := ncopied(length, in, out)
Rob Pike9682ee42009-11-18 22:26:36 -0800256 if m != n {
Russ Cox6aaef042010-06-08 17:51:57 -0700257 fmt.Printf("count bad(%d %d %d): %d not %d\n", length, in, out, m, n)
Alan Donovan052c9422013-02-12 13:17:49 -0500258 os.Exit(1)
Russ Cox6aaef042010-06-08 17:51:57 -0700259 return
Rob Pike9682ee42009-11-18 22:26:36 -0800260 }
261 // before
Russ Cox6aaef042010-06-08 17:51:57 -0700262 var i int
Rob Pike9682ee42009-11-18 22:26:36 -0800263 for i = 0; i < out; i++ {
Rob Pike797cc492009-11-18 15:31:22 -0800264 if output32[i] != u32(i+13) {
Russ Cox6aaef042010-06-08 17:51:57 -0700265 bad32("before32", i, length, in, out)
266 return
Rob Pike9682ee42009-11-18 22:26:36 -0800267 }
268 }
269 // copied part
270 for ; i < out+n; i++ {
271 if output32[i] != u32(i+in-out) {
Russ Cox6aaef042010-06-08 17:51:57 -0700272 bad32("copied32", i, length, in, out)
273 return
Rob Pike9682ee42009-11-18 22:26:36 -0800274 }
275 }
276 // after
277 for ; i < len(output32); i++ {
278 if output32[i] != u32(i+13) {
Russ Cox6aaef042010-06-08 17:51:57 -0700279 bad32("after32", i, length, in, out)
280 return
Rob Pike797cc492009-11-18 15:31:22 -0800281 }
282 }
283}
284
285func bad64(state string, i, length, in, out int) {
286 fmt.Printf("%s bad(%d %d %d): %x not %x:\n\t%v\n\t%v\n",
287 state,
288 length, in, out,
289 output64[i],
290 uint64(i+13),
Russ Cox6aaef042010-06-08 17:51:57 -0700291 input64, output64)
292 os.Exit(1)
Rob Pike797cc492009-11-18 15:31:22 -0800293}
294
Rob Pike9682ee42009-11-18 22:26:36 -0800295func verify64(length, in, out, m int) {
Russ Cox6aaef042010-06-08 17:51:57 -0700296 n := ncopied(length, in, out)
Rob Pike9682ee42009-11-18 22:26:36 -0800297 if m != n {
Russ Cox6aaef042010-06-08 17:51:57 -0700298 fmt.Printf("count bad(%d %d %d): %d not %d\n", length, in, out, m, n)
Alan Donovan052c9422013-02-12 13:17:49 -0500299 os.Exit(1)
Russ Cox6aaef042010-06-08 17:51:57 -0700300 return
Rob Pike9682ee42009-11-18 22:26:36 -0800301 }
302 // before
Russ Cox6aaef042010-06-08 17:51:57 -0700303 var i int
Rob Pike9682ee42009-11-18 22:26:36 -0800304 for i = 0; i < out; i++ {
Rob Pike797cc492009-11-18 15:31:22 -0800305 if output64[i] != u64(i+13) {
Russ Cox6aaef042010-06-08 17:51:57 -0700306 bad64("before64", i, length, in, out)
307 return
Rob Pike9682ee42009-11-18 22:26:36 -0800308 }
309 }
310 // copied part
311 for ; i < out+n; i++ {
312 if output64[i] != u64(i+in-out) {
Russ Cox6aaef042010-06-08 17:51:57 -0700313 bad64("copied64", i, length, in, out)
314 return
Rob Pike9682ee42009-11-18 22:26:36 -0800315 }
316 }
317 // after
318 for ; i < len(output64); i++ {
319 if output64[i] != u64(i+13) {
Russ Cox6aaef042010-06-08 17:51:57 -0700320 bad64("after64", i, length, in, out)
321 return
Rob Pike797cc492009-11-18 15:31:22 -0800322 }
323 }
324}
325
326func slice() {
327 for length := 0; length < N; length++ {
328 for in := 0; in <= 32; in++ {
329 for out := 0; out <= 32; out++ {
330 doAllSlices(length, in, out)
331 }
332 }
333 }
334}
335
Russ Cox6aaef042010-06-08 17:51:57 -0700336// Array test. Can be much simpler. It's only checking for correct handling of [0:].
Rob Pike797cc492009-11-18 15:31:22 -0800337func array() {
Russ Cox6aaef042010-06-08 17:51:57 -0700338 var array [N]uint8
339 reset()
340 copy(array[0:], input8)
Rob Pike797cc492009-11-18 15:31:22 -0800341 for i := 0; i < N; i++ {
342 output8[i] = 0
343 }
Russ Cox6aaef042010-06-08 17:51:57 -0700344 copy(output8, array[0:])
345 verify8(N, 0, 0, N)
Rob Pike797cc492009-11-18 15:31:22 -0800346}
347
348func main() {
Russ Cox6aaef042010-06-08 17:51:57 -0700349 slice()
350 array()
Rob Pike797cc492009-11-18 15:31:22 -0800351}