blob: 65ffb6ff8f5d573c84830a160f6d4ebeaeab0e79 [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)
135 return
Rob Pike9682ee42009-11-18 22:26:36 -0800136 }
137 // before
Russ Cox6aaef042010-06-08 17:51:57 -0700138 var i int
Rob Pike9682ee42009-11-18 22:26:36 -0800139 for i = 0; i < out; i++ {
Rob Pike797cc492009-11-18 15:31:22 -0800140 if output8[i] != u8(i+13) {
Russ Cox6aaef042010-06-08 17:51:57 -0700141 bad8("before8", i, length, in, out)
142 return
Rob Pike9682ee42009-11-18 22:26:36 -0800143 }
144 }
145 // copied part
146 for ; i < out+n; i++ {
147 if output8[i] != u8(i+in-out) {
Russ Cox6aaef042010-06-08 17:51:57 -0700148 bad8("copied8", i, length, in, out)
149 return
Rob Pike9682ee42009-11-18 22:26:36 -0800150 }
151 }
152 // after
153 for ; i < len(output8); i++ {
154 if output8[i] != u8(i+13) {
Russ Cox6aaef042010-06-08 17:51:57 -0700155 bad8("after8", i, length, in, out)
156 return
Rob Pike797cc492009-11-18 15:31:22 -0800157 }
158 }
159}
160
Russ Cox0f289832010-10-26 08:36:23 -0700161func badS(state string, i, length, in, out int) {
162 fmt.Printf("%s bad(%d %d %d): %c not %c:\n\t%s\n\t%s\n",
163 state,
164 length, in, out,
165 outputS[i],
166 uint8(i+13),
167 inputS, outputS)
168 os.Exit(1)
169}
170
171func verifyS(length, in, out, m int) {
172 n := ncopied(length, in, out)
173 if m != n {
174 fmt.Printf("count bad(%d %d %d): %d not %d\n", length, in, out, m, n)
175 return
176 }
177 // before
178 var i int
179 for i = 0; i < out; i++ {
180 if outputS[i] != u8(i+13) {
181 badS("beforeS", i, length, in, out)
182 return
183 }
184 }
185 // copied part
186 for ; i < out+n; i++ {
187 if outputS[i] != u8(i+in-out) {
188 badS("copiedS", i, length, in, out)
189 return
190 }
191 }
192 // after
193 for ; i < len(outputS); i++ {
194 if outputS[i] != u8(i+13) {
195 badS("afterS", i, length, in, out)
196 return
197 }
198 }
199}
200
Rob Pike797cc492009-11-18 15:31:22 -0800201func bad16(state string, i, length, in, out int) {
202 fmt.Printf("%s bad(%d %d %d): %x not %x:\n\t%v\n\t%v\n",
203 state,
204 length, in, out,
205 output16[i],
206 uint16(i+13),
Russ Cox6aaef042010-06-08 17:51:57 -0700207 input16, output16)
208 os.Exit(1)
Rob Pike797cc492009-11-18 15:31:22 -0800209}
210
Rob Pike9682ee42009-11-18 22:26:36 -0800211func verify16(length, in, out, m int) {
Russ Cox6aaef042010-06-08 17:51:57 -0700212 n := ncopied(length, in, out)
Rob Pike9682ee42009-11-18 22:26:36 -0800213 if m != n {
Russ Cox6aaef042010-06-08 17:51:57 -0700214 fmt.Printf("count bad(%d %d %d): %d not %d\n", length, in, out, m, n)
215 return
Rob Pike9682ee42009-11-18 22:26:36 -0800216 }
217 // before
Russ Cox6aaef042010-06-08 17:51:57 -0700218 var i int
Rob Pike9682ee42009-11-18 22:26:36 -0800219 for i = 0; i < out; i++ {
Rob Pike797cc492009-11-18 15:31:22 -0800220 if output16[i] != u16(i+13) {
Russ Cox6aaef042010-06-08 17:51:57 -0700221 bad16("before16", i, length, in, out)
222 return
Rob Pike9682ee42009-11-18 22:26:36 -0800223 }
224 }
225 // copied part
226 for ; i < out+n; i++ {
227 if output16[i] != u16(i+in-out) {
Russ Cox6aaef042010-06-08 17:51:57 -0700228 bad16("copied16", i, length, in, out)
229 return
Rob Pike9682ee42009-11-18 22:26:36 -0800230 }
231 }
232 // after
233 for ; i < len(output16); i++ {
234 if output16[i] != u16(i+13) {
Russ Cox6aaef042010-06-08 17:51:57 -0700235 bad16("after16", i, length, in, out)
236 return
Rob Pike797cc492009-11-18 15:31:22 -0800237 }
238 }
239}
240
241func bad32(state string, i, length, in, out int) {
242 fmt.Printf("%s bad(%d %d %d): %x not %x:\n\t%v\n\t%v\n",
243 state,
244 length, in, out,
245 output32[i],
246 uint32(i+13),
Russ Cox6aaef042010-06-08 17:51:57 -0700247 input32, output32)
248 os.Exit(1)
Rob Pike797cc492009-11-18 15:31:22 -0800249}
250
Rob Pike9682ee42009-11-18 22:26:36 -0800251func verify32(length, in, out, m int) {
Russ Cox6aaef042010-06-08 17:51:57 -0700252 n := ncopied(length, in, out)
Rob Pike9682ee42009-11-18 22:26:36 -0800253 if m != n {
Russ Cox6aaef042010-06-08 17:51:57 -0700254 fmt.Printf("count bad(%d %d %d): %d not %d\n", length, in, out, m, n)
255 return
Rob Pike9682ee42009-11-18 22:26:36 -0800256 }
257 // before
Russ Cox6aaef042010-06-08 17:51:57 -0700258 var i int
Rob Pike9682ee42009-11-18 22:26:36 -0800259 for i = 0; i < out; i++ {
Rob Pike797cc492009-11-18 15:31:22 -0800260 if output32[i] != u32(i+13) {
Russ Cox6aaef042010-06-08 17:51:57 -0700261 bad32("before32", i, length, in, out)
262 return
Rob Pike9682ee42009-11-18 22:26:36 -0800263 }
264 }
265 // copied part
266 for ; i < out+n; i++ {
267 if output32[i] != u32(i+in-out) {
Russ Cox6aaef042010-06-08 17:51:57 -0700268 bad32("copied32", i, length, in, out)
269 return
Rob Pike9682ee42009-11-18 22:26:36 -0800270 }
271 }
272 // after
273 for ; i < len(output32); i++ {
274 if output32[i] != u32(i+13) {
Russ Cox6aaef042010-06-08 17:51:57 -0700275 bad32("after32", i, length, in, out)
276 return
Rob Pike797cc492009-11-18 15:31:22 -0800277 }
278 }
279}
280
281func bad64(state string, i, length, in, out int) {
282 fmt.Printf("%s bad(%d %d %d): %x not %x:\n\t%v\n\t%v\n",
283 state,
284 length, in, out,
285 output64[i],
286 uint64(i+13),
Russ Cox6aaef042010-06-08 17:51:57 -0700287 input64, output64)
288 os.Exit(1)
Rob Pike797cc492009-11-18 15:31:22 -0800289}
290
Rob Pike9682ee42009-11-18 22:26:36 -0800291func verify64(length, in, out, m int) {
Russ Cox6aaef042010-06-08 17:51:57 -0700292 n := ncopied(length, in, out)
Rob Pike9682ee42009-11-18 22:26:36 -0800293 if m != n {
Russ Cox6aaef042010-06-08 17:51:57 -0700294 fmt.Printf("count bad(%d %d %d): %d not %d\n", length, in, out, m, n)
295 return
Rob Pike9682ee42009-11-18 22:26:36 -0800296 }
297 // before
Russ Cox6aaef042010-06-08 17:51:57 -0700298 var i int
Rob Pike9682ee42009-11-18 22:26:36 -0800299 for i = 0; i < out; i++ {
Rob Pike797cc492009-11-18 15:31:22 -0800300 if output64[i] != u64(i+13) {
Russ Cox6aaef042010-06-08 17:51:57 -0700301 bad64("before64", i, length, in, out)
302 return
Rob Pike9682ee42009-11-18 22:26:36 -0800303 }
304 }
305 // copied part
306 for ; i < out+n; i++ {
307 if output64[i] != u64(i+in-out) {
Russ Cox6aaef042010-06-08 17:51:57 -0700308 bad64("copied64", i, length, in, out)
309 return
Rob Pike9682ee42009-11-18 22:26:36 -0800310 }
311 }
312 // after
313 for ; i < len(output64); i++ {
314 if output64[i] != u64(i+13) {
Russ Cox6aaef042010-06-08 17:51:57 -0700315 bad64("after64", i, length, in, out)
316 return
Rob Pike797cc492009-11-18 15:31:22 -0800317 }
318 }
319}
320
321func slice() {
322 for length := 0; length < N; length++ {
323 for in := 0; in <= 32; in++ {
324 for out := 0; out <= 32; out++ {
325 doAllSlices(length, in, out)
326 }
327 }
328 }
329}
330
Russ Cox6aaef042010-06-08 17:51:57 -0700331// Array test. Can be much simpler. It's only checking for correct handling of [0:].
Rob Pike797cc492009-11-18 15:31:22 -0800332func array() {
Russ Cox6aaef042010-06-08 17:51:57 -0700333 var array [N]uint8
334 reset()
335 copy(array[0:], input8)
Rob Pike797cc492009-11-18 15:31:22 -0800336 for i := 0; i < N; i++ {
337 output8[i] = 0
338 }
Russ Cox6aaef042010-06-08 17:51:57 -0700339 copy(output8, array[0:])
340 verify8(N, 0, 0, N)
Rob Pike797cc492009-11-18 15:31:22 -0800341}
342
343func main() {
Russ Cox6aaef042010-06-08 17:51:57 -0700344 slice()
345 array()
Rob Pike797cc492009-11-18 15:31:22 -0800346}