blob: 99e5edb5a429d1ce4dc0ca30e4bc77385018c8ef [file] [log] [blame]
Russ Cox57eb06f2012-02-16 23:51:04 -05001// run
Rob Pike54ec7192009-04-12 17:01:17 -07002
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 Pike80a97832012-02-24 11:48:19 +11007// Test range over strings.
8
Rob Pike54ec7192009-04-12 17:01:17 -07009package main
10
Rob Pike74dd0ab2009-08-17 13:30:22 -070011import (
Rob Pike4f61fc92010-09-04 10:36:13 +100012 "fmt"
13 "os"
Rob Pikef9489be2011-11-08 15:43:02 -080014 "unicode/utf8"
Rob Pike54ec7192009-04-12 17:01:17 -070015)
16
17func main() {
Rob Pike4f61fc92010-09-04 10:36:13 +100018 s := "\000\123\x00\xca\xFE\u0123\ubabe\U0000babe\U0010FFFFx"
Russ Coxdb339592011-10-25 22:20:02 -070019 expect := []rune{0, 0123, 0, 0xFFFD, 0xFFFD, 0x123, 0xbabe, 0xbabe, 0x10FFFF, 'x'}
Rob Pike4f61fc92010-09-04 10:36:13 +100020 offset := 0
Russ Coxdb339592011-10-25 22:20:02 -070021 var i int
22 var c rune
Rob Pike4f61fc92010-09-04 10:36:13 +100023 ok := true
24 cnum := 0
Rob Pike54ec7192009-04-12 17:01:17 -070025 for i, c = range s {
Russ Coxdb339592011-10-25 22:20:02 -070026 r, size := utf8.DecodeRuneInString(s[i:len(s)]) // check it another way
Rob Pike54ec7192009-04-12 17:01:17 -070027 if i != offset {
Rob Pike4f61fc92010-09-04 10:36:13 +100028 fmt.Printf("unexpected offset %d not %d\n", i, offset)
29 ok = false
Rob Pike54ec7192009-04-12 17:01:17 -070030 }
Russ Coxdb339592011-10-25 22:20:02 -070031 if r != expect[cnum] {
32 fmt.Printf("unexpected rune %d from DecodeRuneInString: %x not %x\n", i, r, expect[cnum])
Rob Pike4f61fc92010-09-04 10:36:13 +100033 ok = false
Rob Pike54ec7192009-04-12 17:01:17 -070034 }
35 if c != expect[cnum] {
Russ Coxdb339592011-10-25 22:20:02 -070036 fmt.Printf("unexpected rune %d from range: %x not %x\n", i, r, expect[cnum])
Rob Pike4f61fc92010-09-04 10:36:13 +100037 ok = false
Rob Pike54ec7192009-04-12 17:01:17 -070038 }
Rob Pike4f61fc92010-09-04 10:36:13 +100039 offset += size
40 cnum++
Rob Pike54ec7192009-04-12 17:01:17 -070041 }
42 if i != len(s)-1 {
Rob Pike4f61fc92010-09-04 10:36:13 +100043 fmt.Println("after loop i is", i, "not", len(s)-1)
44 ok = false
Rob Pike54ec7192009-04-12 17:01:17 -070045 }
Russ Coxa62467a2009-04-13 05:31:44 -070046
Rob Pike4f61fc92010-09-04 10:36:13 +100047 i = 12345
48 c = 23456
Russ Coxa62467a2009-04-13 05:31:44 -070049 for i, c = range "" {
50 }
51 if i != 12345 {
Rob Pike4f61fc92010-09-04 10:36:13 +100052 fmt.Println("range empty string assigned to index:", i)
53 ok = false
Russ Coxa62467a2009-04-13 05:31:44 -070054 }
55 if c != 23456 {
Rob Pike4f61fc92010-09-04 10:36:13 +100056 fmt.Println("range empty string assigned to value:", c)
57 ok = false
Russ Coxa62467a2009-04-13 05:31:44 -070058 }
59
Rob Pikec48b77b2012-08-08 14:01:23 -070060 for _, c := range "a\xed\xa0\x80a" {
61 if c != 'a' && c != utf8.RuneError {
62 fmt.Printf("surrogate UTF-8 does not error: %U\n", c)
63 ok = false
64 }
65 }
66
Rob Pike54ec7192009-04-12 17:01:17 -070067 if !ok {
Rob Pike4f61fc92010-09-04 10:36:13 +100068 fmt.Println("BUG: stringrange")
Russ Cox918afd942009-05-08 15:21:41 -070069 os.Exit(1)
Rob Pike54ec7192009-04-12 17:01:17 -070070 }
71}