]> Cypherpunks repositories - gostls13.git/commitdiff
unicode/utf16: delete dependence on package unicode
authorRob Pike <r@golang.org>
Tue, 6 Mar 2012 03:58:08 +0000 (14:58 +1100)
committerRob Pike <r@golang.org>
Tue, 6 Mar 2012 03:58:08 +0000 (14:58 +1100)
In the test, verify the copied constants are correct.
Also put the test into package utf16 rather than utf16_test;
the old location was probably due creating the test from
utf8, but the separation is not needed here.

R=golang-dev, bradfitz, rsc, rsc, r
CC=golang-dev
https://golang.org/cl/5752047

src/pkg/unicode/utf16/export_test.go [new file with mode: 0644]
src/pkg/unicode/utf16/utf16.go
src/pkg/unicode/utf16/utf16_test.go
src/pkg/unicode/utf8/utf8_test.go

diff --git a/src/pkg/unicode/utf16/export_test.go b/src/pkg/unicode/utf16/export_test.go
new file mode 100644 (file)
index 0000000..306247e
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2012 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.
+
+package utf16
+
+// Extra names for constants so we can validate them during testing.
+const (
+       MaxRune         = maxRune
+       ReplacementChar = replacementChar
+)
index 2b2eb28f2df658709d3ad218c9c128bbf722ab76..903e4012aa4ab4cb592013f2d7cbc5b02c234f7a 100644 (file)
@@ -5,7 +5,14 @@
 // Package utf16 implements encoding and decoding of UTF-16 sequences.
 package utf16
 
-import "unicode"
+// The conditions replacementChar==unicode.ReplacementChar and
+// maxRune==unicode.MaxRune are verified in the tests.
+// Defining them locally avoids this package depending on package unicode.
+
+const (
+       replacementChar = '\uFFFD'     // Unicode replacement character
+       maxRune         = '\U0010FFFF' // Maximum valid Unicode code point.
+)
 
 const (
        // 0xd800-0xdc00 encodes the high 10 bits of a pair.
@@ -31,15 +38,15 @@ func DecodeRune(r1, r2 rune) rune {
        if surr1 <= r1 && r1 < surr2 && surr2 <= r2 && r2 < surr3 {
                return (rune(r1)-surr1)<<10 | (rune(r2) - surr2) + 0x10000
        }
-       return unicode.ReplacementChar
+       return replacementChar
 }
 
 // EncodeRune returns the UTF-16 surrogate pair r1, r2 for the given rune.
 // If the rune is not a valid Unicode code point or does not need encoding,
 // EncodeRune returns U+FFFD, U+FFFD.
 func EncodeRune(r rune) (r1, r2 rune) {
-       if r < surrSelf || r > unicode.MaxRune || IsSurrogate(r) {
-               return unicode.ReplacementChar, unicode.ReplacementChar
+       if r < surrSelf || r > maxRune || IsSurrogate(r) {
+               return replacementChar, replacementChar
        }
        r -= surrSelf
        return surr1 + (r>>10)&0x3ff, surr2 + r&0x3ff
@@ -58,8 +65,8 @@ func Encode(s []rune) []uint16 {
        n = 0
        for _, v := range s {
                switch {
-               case v < 0, surr1 <= v && v < surr3, v > unicode.MaxRune:
-                       v = unicode.ReplacementChar
+               case v < 0, surr1 <= v && v < surr3, v > maxRune:
+                       v = replacementChar
                        fallthrough
                case v < surrSelf:
                        a[n] = uint16(v)
@@ -89,7 +96,7 @@ func Decode(s []uint16) []rune {
                        n++
                case surr1 <= r && r < surr3:
                        // invalid surrogate sequence
-                       a[n] = unicode.ReplacementChar
+                       a[n] = replacementChar
                        n++
                default:
                        // normal rune
index d453b2f984d1b2604ba9de79a934dd24703ee3c1..ee16a303df3159c4a99dc4b0db1920c756fe88fa 100644 (file)
@@ -11,6 +11,16 @@ import (
        . "unicode/utf16"
 )
 
+// Validate the constants redefined from unicode.
+func TestConstants(t *testing.T) {
+       if MaxRune != unicode.MaxRune {
+               t.Errorf("utf16.maxRune is wrong: %x should be %x", MaxRune, unicode.MaxRune)
+       }
+       if ReplacementChar != unicode.ReplacementChar {
+               t.Errorf("utf16.replacementChar is wrong: %x should be %x", ReplacementChar, unicode.ReplacementChar)
+       }
+}
+
 type encodeTest struct {
        in  []rune
        out []uint16
index abf5a468eac298f28c6b335e89f63995ad4b4084..4f73c8fb81a2f71e211ffee7f66ab1950cf9a802 100644 (file)
@@ -21,6 +21,16 @@ func init() {
        }
 }
 
+// Validate the constants redefined from unicode.
+func TestConstants(t *testing.T) {
+       if MaxRune != unicode.MaxRune {
+               t.Errorf("utf8.MaxRune is wrong: %x should be %x", MaxRune, unicode.MaxRune)
+       }
+       if RuneError != unicode.ReplacementChar {
+               t.Errorf("utf8.RuneError is wrong: %x should be %x", RuneError, unicode.ReplacementChar)
+       }
+}
+
 type Utf8Map struct {
        r   rune
        str string