mirror of
				https://github.com/golang/go.git
				synced 2025-10-31 08:40:55 +00:00 
			
		
		
		
	 936665f641
			
		
	
	
		936665f641
		
	
	
	
	
		
			
			Gccgo managed to get this case wrong. R=golang-dev, rsc CC=golang-dev https://golang.org/cl/41490044
		
			
				
	
	
		
			150 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // run
 | |
| 
 | |
| // Copyright 2009 The Go Authors. All rights reserved.
 | |
| // Use of this source code is governed by a BSD-style
 | |
| // license that can be found in the LICENSE file.
 | |
| 
 | |
| // Test string literal syntax.
 | |
| 
 | |
| package main
 | |
| 
 | |
| import "os"
 | |
| 
 | |
| var ecode int
 | |
| 
 | |
| func assert(a, b, c string) {
 | |
| 	if a != b {
 | |
| 		ecode = 1
 | |
| 		print("FAIL: ", c, ": ", a, "!=", b, "\n")
 | |
| 		var max int = len(a)
 | |
| 		if len(b) > max {
 | |
| 			max = len(b)
 | |
| 		}
 | |
| 		for i := 0; i < max; i++ {
 | |
| 			ac := 0
 | |
| 			bc := 0
 | |
| 			if i < len(a) {
 | |
| 				ac = int(a[i])
 | |
| 			}
 | |
| 			if i < len(b) {
 | |
| 				bc = int(b[i])
 | |
| 			}
 | |
| 			if ac != bc {
 | |
| 				print("\ta[", i, "] = ", ac, "; b[", i, "] =", bc, "\n")
 | |
| 			}
 | |
| 		}
 | |
| 		panic("string_lit")
 | |
| 	}
 | |
| }
 | |
| 
 | |
| const (
 | |
| 	gx1    = "aä本☺"
 | |
| 	gx2    = "aä\xFF\xFF本☺"
 | |
| 	gx2fix = "aä\uFFFD\uFFFD本☺"
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	gr1 = []rune(gx1)
 | |
| 	gr2 = []rune(gx2)
 | |
| 	gb1 = []byte(gx1)
 | |
| 	gb2 = []byte(gx2)
 | |
| )
 | |
| 
 | |
| func main() {
 | |
| 	ecode = 0
 | |
| 	s :=
 | |
| 		"" +
 | |
| 			" " +
 | |
| 			"'`" +
 | |
| 			"a" +
 | |
| 			"ä" +
 | |
| 			"本" +
 | |
| 			"\a\b\f\n\r\t\v\\\"" +
 | |
| 			"\000\123\x00\xca\xFE\u0123\ubabe\U0000babe" +
 | |
| 
 | |
| 			`` +
 | |
| 			` ` +
 | |
| 			`'"` +
 | |
| 			`a` +
 | |
| 			`ä` +
 | |
| 			`本` +
 | |
| 			`\a\b\f\n\r\t\v\\\'` +
 | |
| 			`\000\123\x00\xca\xFE\u0123\ubabe\U0000babe` +
 | |
| 			`\x\u\U\`
 | |
| 
 | |
| 	assert("", ``, "empty")
 | |
| 	assert(" ", " ", "blank")
 | |
| 	assert("\x61", "a", "lowercase a")
 | |
| 	assert("\x61", `a`, "lowercase a (backquote)")
 | |
| 	assert("\u00e4", "ä", "a umlaut")
 | |
| 	assert("\u00e4", `ä`, "a umlaut (backquote)")
 | |
| 	assert("\u672c", "本", "nihon")
 | |
| 	assert("\u672c", `本`, "nihon (backquote)")
 | |
| 	assert("\x07\x08\x0c\x0a\x0d\x09\x0b\x5c\x22",
 | |
| 		"\a\b\f\n\r\t\v\\\"",
 | |
| 		"backslashes")
 | |
| 	assert("\\a\\b\\f\\n\\r\\t\\v\\\\\\\"",
 | |
| 		`\a\b\f\n\r\t\v\\\"`,
 | |
| 		"backslashes (backquote)")
 | |
| 	assert("\x00\x53\000\xca\376S몾몾",
 | |
| 		"\000\123\x00\312\xFE\u0053\ubabe\U0000babe",
 | |
| 		"backslashes 2")
 | |
| 	assert("\\000\\123\\x00\\312\\xFE\\u0123\\ubabe\\U0000babe",
 | |
| 		`\000\123\x00\312\xFE\u0123\ubabe\U0000babe`,
 | |
| 		"backslashes 2 (backquote)")
 | |
| 	assert("\\x\\u\\U\\", `\x\u\U\`, "backslash 3 (backquote)")
 | |
| 
 | |
| 	// test large and surrogate-half runes. perhaps not the most logical place for these tests.
 | |
| 	var r int32
 | |
| 	r = 0x10ffff // largest rune value
 | |
| 	s = string(r)
 | |
| 	assert(s, "\xf4\x8f\xbf\xbf", "largest rune")
 | |
| 	r = 0x10ffff + 1
 | |
| 	s = string(r)
 | |
| 	assert(s, "\xef\xbf\xbd", "too-large rune")
 | |
| 	r = 0xD800
 | |
| 	s = string(r)
 | |
| 	assert(s, "\xef\xbf\xbd", "surrogate rune min")
 | |
| 	r = 0xDFFF
 | |
| 	s = string(r)
 | |
| 	assert(s, "\xef\xbf\xbd", "surrogate rune max")
 | |
| 	r = -1
 | |
| 	s = string(r)
 | |
| 	assert(s, "\xef\xbf\xbd", "negative rune")
 | |
| 
 | |
| 	// the large rune tests again, this time using constants instead of a variable.
 | |
| 	// these conversions will be done at compile time.
 | |
| 	s = string(0x10ffff) // largest rune value
 | |
| 	assert(s, "\xf4\x8f\xbf\xbf", "largest rune constant")
 | |
| 	s = string(0x10ffff + 1)
 | |
| 	assert(s, "\xef\xbf\xbd", "too-large rune constant")
 | |
| 	s = string(0xD800)
 | |
| 	assert(s, "\xef\xbf\xbd", "surrogate rune min constant")
 | |
| 	s = string(0xDFFF)
 | |
| 	assert(s, "\xef\xbf\xbd", "surrogate rune max constant")
 | |
| 	s = string(-1)
 | |
| 	assert(s, "\xef\xbf\xbd", "negative rune")
 | |
| 
 | |
| 	// the large rune tests yet again, with a slice.
 | |
| 	rs := []rune{0x10ffff, 0x10ffff + 1, 0xD800, 0xDFFF, -1}
 | |
| 	s = string(rs)
 | |
| 	assert(s, "\xf4\x8f\xbf\xbf\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd", "large rune slice")
 | |
| 
 | |
| 	assert(string(gr1), gx1, "global ->[]rune")
 | |
| 	assert(string(gr2), gx2fix, "global invalid ->[]rune")
 | |
| 	assert(string(gb1), gx1, "->[]byte")
 | |
| 	assert(string(gb2), gx2, "global invalid ->[]byte")
 | |
| 
 | |
| 	var (
 | |
| 		r1 = []rune(gx1)
 | |
| 		r2 = []rune(gx2)
 | |
| 		b1 = []byte(gx1)
 | |
| 		b2 = []byte(gx2)
 | |
| 	)
 | |
| 	assert(string(r1), gx1, "->[]rune")
 | |
| 	assert(string(r2), gx2fix, "invalid ->[]rune")
 | |
| 	assert(string(b1), gx1, "->[]byte")
 | |
| 	assert(string(b2), gx2, "invalid ->[]byte")
 | |
| 
 | |
| 	os.Exit(ecode)
 | |
| }
 |