Robert Griesemer | d2490e7 | 2008-03-19 15:45:07 -0700 | [diff] [blame] | 1 | // $G $F.go && $L $F.$A && ./$A.out |
| 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 | package main |
| 8 | |
Russ Cox | 918afd94 | 2009-05-08 15:21:41 -0700 | [diff] [blame] | 9 | import "os" |
| 10 | |
Robert Griesemer | 5f5dcfb | 2009-12-09 16:55:03 -0800 | [diff] [blame] | 11 | var ecode int |
Rob Pike | f07d2ee | 2008-06-08 19:08:00 -0700 | [diff] [blame] | 12 | |
| 13 | func assert(a, b, c string) { |
| 14 | if a != b { |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 15 | ecode = 1 |
| 16 | print("FAIL: ", c, ": ", a, "!=", b, "\n") |
| 17 | var max int = len(a) |
Rob Pike | f07d2ee | 2008-06-08 19:08:00 -0700 | [diff] [blame] | 18 | if len(b) > max { |
Robert Griesemer | 5f5dcfb | 2009-12-09 16:55:03 -0800 | [diff] [blame] | 19 | max = len(b) |
Rob Pike | f07d2ee | 2008-06-08 19:08:00 -0700 | [diff] [blame] | 20 | } |
| 21 | for i := 0; i < max; i++ { |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 22 | ac := 0 |
| 23 | bc := 0 |
Rob Pike | f07d2ee | 2008-06-08 19:08:00 -0700 | [diff] [blame] | 24 | if i < len(a) { |
Robert Griesemer | 5f5dcfb | 2009-12-09 16:55:03 -0800 | [diff] [blame] | 25 | ac = int(a[i]) |
Rob Pike | f07d2ee | 2008-06-08 19:08:00 -0700 | [diff] [blame] | 26 | } |
| 27 | if i < len(b) { |
Robert Griesemer | 5f5dcfb | 2009-12-09 16:55:03 -0800 | [diff] [blame] | 28 | bc = int(b[i]) |
Rob Pike | f07d2ee | 2008-06-08 19:08:00 -0700 | [diff] [blame] | 29 | } |
| 30 | if ac != bc { |
Robert Griesemer | 5f5dcfb | 2009-12-09 16:55:03 -0800 | [diff] [blame] | 31 | print("\ta[", i, "] = ", ac, "; b[", i, "] =", bc, "\n") |
Rob Pike | f07d2ee | 2008-06-08 19:08:00 -0700 | [diff] [blame] | 32 | } |
| 33 | } |
| 34 | } |
| 35 | } |
| 36 | |
Russ Cox | 3910161 | 2010-02-25 15:11:07 -0800 | [diff] [blame] | 37 | const ( |
| 38 | gx1 = "aä本☺" |
| 39 | gx2 = "aä\xFF\xFF本☺" |
| 40 | gx2fix = "aä\uFFFD\uFFFD本☺" |
| 41 | ) |
| 42 | |
| 43 | var ( |
| 44 | gr1 = []int(gx1) |
| 45 | gr2 = []int(gx2) |
| 46 | gb1 = []byte(gx1) |
| 47 | gb2 = []byte(gx2) |
| 48 | ) |
| 49 | |
Rob Pike | 34cb7c2 | 2008-06-27 14:15:06 -0700 | [diff] [blame] | 50 | func main() { |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 51 | ecode = 0 |
Rob Pike | f07d2ee | 2008-06-08 19:08:00 -0700 | [diff] [blame] | 52 | s := |
Robert Griesemer | 5f5dcfb | 2009-12-09 16:55:03 -0800 | [diff] [blame] | 53 | "" + |
| 54 | " " + |
| 55 | "'`" + |
| 56 | "a" + |
| 57 | "ä" + |
| 58 | "本" + |
| 59 | "\a\b\f\n\r\t\v\\\"" + |
| 60 | "\000\123\x00\xca\xFE\u0123\ubabe\U0000babe" + |
Russ Cox | 3609624 | 2009-01-16 14:58:14 -0800 | [diff] [blame] | 61 | |
Robert Griesemer | 5f5dcfb | 2009-12-09 16:55:03 -0800 | [diff] [blame] | 62 | `` + |
| 63 | ` ` + |
| 64 | `'"` + |
| 65 | `a` + |
| 66 | `ä` + |
| 67 | `本` + |
| 68 | `\a\b\f\n\r\t\v\\\'` + |
| 69 | `\000\123\x00\xca\xFE\u0123\ubabe\U0000babe` + |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 70 | `\x\u\U\` |
Robert Griesemer | 5f5dcfb | 2009-12-09 16:55:03 -0800 | [diff] [blame] | 71 | |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 72 | assert("", ``, "empty") |
| 73 | assert(" ", " ", "blank") |
| 74 | assert("\x61", "a", "lowercase a") |
| 75 | assert("\x61", `a`, "lowercase a (backquote)") |
| 76 | assert("\u00e4", "ä", "a umlaut") |
| 77 | assert("\u00e4", `ä`, "a umlaut (backquote)") |
| 78 | assert("\u672c", "本", "nihon") |
| 79 | assert("\u672c", `本`, "nihon (backquote)") |
Rob Pike | f07d2ee | 2008-06-08 19:08:00 -0700 | [diff] [blame] | 80 | assert("\x07\x08\x0c\x0a\x0d\x09\x0b\x5c\x22", |
Robert Griesemer | 5f5dcfb | 2009-12-09 16:55:03 -0800 | [diff] [blame] | 81 | "\a\b\f\n\r\t\v\\\"", |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 82 | "backslashes") |
Rob Pike | f07d2ee | 2008-06-08 19:08:00 -0700 | [diff] [blame] | 83 | assert("\\a\\b\\f\\n\\r\\t\\v\\\\\\\"", |
Rob Pike | 74dd0ab | 2009-08-17 13:30:22 -0700 | [diff] [blame] | 84 | `\a\b\f\n\r\t\v\\\"`, |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 85 | "backslashes (backquote)") |
Rob Pike | f07d2ee | 2008-06-08 19:08:00 -0700 | [diff] [blame] | 86 | assert("\x00\x53\000\xca\376S몾몾", |
Rob Pike | 74dd0ab | 2009-08-17 13:30:22 -0700 | [diff] [blame] | 87 | "\000\123\x00\312\xFE\u0053\ubabe\U0000babe", |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 88 | "backslashes 2") |
Rob Pike | f07d2ee | 2008-06-08 19:08:00 -0700 | [diff] [blame] | 89 | assert("\\000\\123\\x00\\312\\xFE\\u0123\\ubabe\\U0000babe", |
Rob Pike | 74dd0ab | 2009-08-17 13:30:22 -0700 | [diff] [blame] | 90 | `\000\123\x00\312\xFE\u0123\ubabe\U0000babe`, |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 91 | "backslashes 2 (backquote)") |
| 92 | assert("\\x\\u\\U\\", `\x\u\U\`, "backslash 3 (backquote)") |
Rob Pike | 5b904a3 | 2008-07-07 14:07:46 -0700 | [diff] [blame] | 93 | |
| 94 | // test large runes. perhaps not the most logical place for this test. |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 95 | var r int32 |
Rob Pike | 5b904a3 | 2008-07-07 14:07:46 -0700 | [diff] [blame] | 96 | r = 0x10ffff; // largest rune value |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 97 | s = string(r) |
| 98 | assert(s, "\xf4\x8f\xbf\xbf", "largest rune") |
| 99 | r = 0x10ffff + 1 |
| 100 | s = string(r) |
| 101 | assert(s, "\xef\xbf\xbd", "too-large rune") |
Russ Cox | 3910161 | 2010-02-25 15:11:07 -0800 | [diff] [blame] | 102 | |
| 103 | assert(string(gr1), gx1, "global ->[]int") |
| 104 | assert(string(gr2), gx2fix, "global invalid ->[]int") |
| 105 | assert(string(gb1), gx1, "->[]byte") |
| 106 | assert(string(gb2), gx2, "global invalid ->[]byte") |
| 107 | |
| 108 | var ( |
| 109 | r1 = []int(gx1) |
| 110 | r2 = []int(gx2) |
| 111 | b1 = []byte(gx1) |
| 112 | b2 = []byte(gx2) |
| 113 | ) |
| 114 | assert(string(r1), gx1, "->[]int") |
| 115 | assert(string(r2), gx2fix, "invalid ->[]int") |
| 116 | assert(string(b1), gx1, "->[]byte") |
| 117 | assert(string(b2), gx2, "invalid ->[]byte") |
| 118 | |
Rob Pike | 4f61fc9 | 2010-09-04 10:36:13 +1000 | [diff] [blame] | 119 | os.Exit(ecode) |
Robert Griesemer | d2490e7 | 2008-03-19 15:45:07 -0700 | [diff] [blame] | 120 | } |