Russ Cox | 57eb06f | 2012-02-16 23:51:04 -0500 | [diff] [blame] | 1 | // run |
Rob Pike | 54ec719 | 2009-04-12 17:01:17 -0700 | [diff] [blame] | 2 | |
| 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 Pike | 80a9783 | 2012-02-24 11:48:19 +1100 | [diff] [blame] | 7 | // Test range over strings. |
| 8 | |
Rob Pike | 54ec719 | 2009-04-12 17:01:17 -0700 | [diff] [blame] | 9 | package main |
| 10 | |
Rob Pike | 74dd0ab | 2009-08-17 13:30:22 -0700 | [diff] [blame] | 11 | import ( |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 12 | "fmt" |
| 13 | "os" |
Rob Pike | f9489be | 2011-11-08 15:43:02 -0800 | [diff] [blame] | 14 | "unicode/utf8" |
Rob Pike | 54ec719 | 2009-04-12 17:01:17 -0700 | [diff] [blame] | 15 | ) |
| 16 | |
| 17 | func main() { |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 18 | s := "\000\123\x00\xca\xFE\u0123\ubabe\U0000babe\U0010FFFFx" |
Russ Cox | db33959 | 2011-10-25 22:20:02 -0700 | [diff] [blame] | 19 | expect := []rune{0, 0123, 0, 0xFFFD, 0xFFFD, 0x123, 0xbabe, 0xbabe, 0x10FFFF, 'x'} |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 20 | offset := 0 |
Russ Cox | db33959 | 2011-10-25 22:20:02 -0700 | [diff] [blame] | 21 | var i int |
| 22 | var c rune |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 23 | ok := true |
| 24 | cnum := 0 |
Rob Pike | 54ec719 | 2009-04-12 17:01:17 -0700 | [diff] [blame] | 25 | for i, c = range s { |
Russ Cox | db33959 | 2011-10-25 22:20:02 -0700 | [diff] [blame] | 26 | r, size := utf8.DecodeRuneInString(s[i:len(s)]) // check it another way |
Rob Pike | 54ec719 | 2009-04-12 17:01:17 -0700 | [diff] [blame] | 27 | if i != offset { |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 28 | fmt.Printf("unexpected offset %d not %d\n", i, offset) |
| 29 | ok = false |
Rob Pike | 54ec719 | 2009-04-12 17:01:17 -0700 | [diff] [blame] | 30 | } |
Russ Cox | db33959 | 2011-10-25 22:20:02 -0700 | [diff] [blame] | 31 | if r != expect[cnum] { |
| 32 | fmt.Printf("unexpected rune %d from DecodeRuneInString: %x not %x\n", i, r, expect[cnum]) |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 33 | ok = false |
Rob Pike | 54ec719 | 2009-04-12 17:01:17 -0700 | [diff] [blame] | 34 | } |
| 35 | if c != expect[cnum] { |
Russ Cox | db33959 | 2011-10-25 22:20:02 -0700 | [diff] [blame] | 36 | fmt.Printf("unexpected rune %d from range: %x not %x\n", i, r, expect[cnum]) |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 37 | ok = false |
Rob Pike | 54ec719 | 2009-04-12 17:01:17 -0700 | [diff] [blame] | 38 | } |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 39 | offset += size |
| 40 | cnum++ |
Rob Pike | 54ec719 | 2009-04-12 17:01:17 -0700 | [diff] [blame] | 41 | } |
| 42 | if i != len(s)-1 { |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 43 | fmt.Println("after loop i is", i, "not", len(s)-1) |
| 44 | ok = false |
Rob Pike | 54ec719 | 2009-04-12 17:01:17 -0700 | [diff] [blame] | 45 | } |
Russ Cox | a62467a | 2009-04-13 05:31:44 -0700 | [diff] [blame] | 46 | |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 47 | i = 12345 |
| 48 | c = 23456 |
Russ Cox | a62467a | 2009-04-13 05:31:44 -0700 | [diff] [blame] | 49 | for i, c = range "" { |
| 50 | } |
| 51 | if i != 12345 { |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 52 | fmt.Println("range empty string assigned to index:", i) |
| 53 | ok = false |
Russ Cox | a62467a | 2009-04-13 05:31:44 -0700 | [diff] [blame] | 54 | } |
| 55 | if c != 23456 { |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 56 | fmt.Println("range empty string assigned to value:", c) |
| 57 | ok = false |
Russ Cox | a62467a | 2009-04-13 05:31:44 -0700 | [diff] [blame] | 58 | } |
| 59 | |
Rob Pike | c48b77b | 2012-08-08 14:01:23 -0700 | [diff] [blame] | 60 | 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 Pike | 54ec719 | 2009-04-12 17:01:17 -0700 | [diff] [blame] | 67 | if !ok { |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 68 | fmt.Println("BUG: stringrange") |
Russ Cox | 918afd94 | 2009-05-08 15:21:41 -0700 | [diff] [blame] | 69 | os.Exit(1) |
Rob Pike | 54ec719 | 2009-04-12 17:01:17 -0700 | [diff] [blame] | 70 | } |
| 71 | } |