modernc.org/gc@v1.0.1-0.20240304020402-f0dba7c97c2b/testdata/errchk/test/stringrange.go (about) 1 // run 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 7 // Test range over strings. 8 9 package main 10 11 import ( 12 "fmt" 13 "os" 14 "unicode/utf8" 15 ) 16 17 func main() { 18 s := "\000\123\x00\xca\xFE\u0123\ubabe\U0000babe\U0010FFFFx" 19 expect := []rune{0, 0123, 0, 0xFFFD, 0xFFFD, 0x123, 0xbabe, 0xbabe, 0x10FFFF, 'x'} 20 offset := 0 21 var i int 22 var c rune 23 ok := true 24 cnum := 0 25 for i, c = range s { 26 r, size := utf8.DecodeRuneInString(s[i:len(s)]) // check it another way 27 if i != offset { 28 fmt.Printf("unexpected offset %d not %d\n", i, offset) 29 ok = false 30 } 31 if r != expect[cnum] { 32 fmt.Printf("unexpected rune %d from DecodeRuneInString: %x not %x\n", i, r, expect[cnum]) 33 ok = false 34 } 35 if c != expect[cnum] { 36 fmt.Printf("unexpected rune %d from range: %x not %x\n", i, r, expect[cnum]) 37 ok = false 38 } 39 offset += size 40 cnum++ 41 } 42 if i != len(s)-1 { 43 fmt.Println("after loop i is", i, "not", len(s)-1) 44 ok = false 45 } 46 47 i = 12345 48 c = 23456 49 for i, c = range "" { 50 } 51 if i != 12345 { 52 fmt.Println("range empty string assigned to index:", i) 53 ok = false 54 } 55 if c != 23456 { 56 fmt.Println("range empty string assigned to value:", c) 57 ok = false 58 } 59 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 67 if !ok { 68 fmt.Println("BUG: stringrange") 69 os.Exit(1) 70 } 71 }