123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- // Copyright 2017 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 ianaindex
- import (
- "testing"
- "golang.org/x/text/encoding"
- "golang.org/x/text/encoding/charmap"
- "golang.org/x/text/encoding/internal/identifier"
- "golang.org/x/text/encoding/japanese"
- "golang.org/x/text/encoding/korean"
- "golang.org/x/text/encoding/simplifiedchinese"
- "golang.org/x/text/encoding/traditionalchinese"
- "golang.org/x/text/encoding/unicode"
- )
- var All = [][]encoding.Encoding{
- unicode.All,
- charmap.All,
- japanese.All,
- korean.All,
- simplifiedchinese.All,
- traditionalchinese.All,
- }
- // TestAllIANA tests whether an Encoding supported in x/text is defined by IANA but
- // not supported by this package.
- func TestAllIANA(t *testing.T) {
- for _, ea := range All {
- for _, e := range ea {
- mib, _ := e.(identifier.Interface).ID()
- if x := findMIB(ianaToMIB, mib); x != -1 && encodings[x] == nil {
- t.Errorf("supported MIB %v (%v) not in index", mib, e)
- }
- }
- }
- }
- // TestNotSupported reports the encodings in IANA, but not by x/text.
- func TestNotSupported(t *testing.T) {
- mibs := map[identifier.MIB]bool{}
- for _, ea := range All {
- for _, e := range ea {
- mib, _ := e.(identifier.Interface).ID()
- mibs[mib] = true
- }
- }
- // Many encodings in the IANA index will likely not be suppored by the
- // Go encodings. That is fine.
- // TODO: consider wheter we should add this test.
- // for code, mib := range ianaToMIB {
- // t.Run(fmt.Sprint("IANA:", mib), func(t *testing.T) {
- // if !mibs[mib] {
- // t.Skipf("IANA encoding %s (MIB %v) not supported",
- // ianaNames[code], mib)
- // }
- // })
- // }
- }
- func TestEncoding(t *testing.T) {
- testCases := []struct {
- index *Index
- name string
- canonical string
- err error
- }{
- {MIME, "utf-8", "UTF-8", nil},
- {MIME, " utf-8 ", "UTF-8", nil},
- {MIME, " l5 ", "ISO-8859-9", nil},
- {MIME, "latin5 ", "ISO-8859-9", nil},
- {MIME, "LATIN5 ", "ISO-8859-9", nil},
- {MIME, "latin 5", "", errInvalidName},
- {MIME, "latin-5", "", errInvalidName},
- {IANA, "utf-8", "UTF-8", nil},
- {IANA, " utf-8 ", "UTF-8", nil},
- {IANA, " l5 ", "ISO_8859-9:1989", nil},
- {IANA, "latin5 ", "ISO_8859-9:1989", nil},
- {IANA, "LATIN5 ", "ISO_8859-9:1989", nil},
- {IANA, "latin 5", "", errInvalidName},
- {IANA, "latin-5", "", errInvalidName},
- {MIB, "utf-8", "UTF8", nil},
- {MIB, " utf-8 ", "UTF8", nil},
- {MIB, " l5 ", "ISOLatin5", nil},
- {MIB, "latin5 ", "ISOLatin5", nil},
- {MIB, "LATIN5 ", "ISOLatin5", nil},
- {MIB, "latin 5", "", errInvalidName},
- {MIB, "latin-5", "", errInvalidName},
- }
- for i, tc := range testCases {
- enc, err := tc.index.Encoding(tc.name)
- if err != tc.err {
- t.Errorf("%d: error was %v; want %v", i, err, tc.err)
- }
- if err != nil {
- continue
- }
- if got, err := tc.index.Name(enc); got != tc.canonical {
- t.Errorf("%d: Name(Encoding(%q)) = %q; want %q (%v)", i, tc.name, got, tc.canonical, err)
- }
- }
- }
- func TestTables(t *testing.T) {
- for i, x := range []*Index{MIME, IANA} {
- for name, index := range x.alias {
- got, err := x.Encoding(name)
- if err != nil {
- t.Errorf("%d%s:err: unexpected error %v", i, name, err)
- }
- if want := x.enc[index]; got != want {
- t.Errorf("%d%s:encoding: got %v; want %v", i, name, got, want)
- }
- if got != nil {
- mib, _ := got.(identifier.Interface).ID()
- if i := findMIB(x.toMIB, mib); i != index {
- t.Errorf("%d%s:mib: got %d; want %d", i, name, i, index)
- }
- }
- }
- }
- }
- type unsupported struct {
- encoding.Encoding
- }
- func (unsupported) ID() (identifier.MIB, string) { return 9999, "" }
- func TestName(t *testing.T) {
- testCases := []struct {
- desc string
- enc encoding.Encoding
- f func(e encoding.Encoding) (string, error)
- name string
- err error
- }{{
- "defined encoding",
- charmap.ISO8859_2,
- MIME.Name,
- "ISO-8859-2",
- nil,
- }, {
- "defined Unicode encoding",
- unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM),
- IANA.Name,
- "UTF-16BE",
- nil,
- }, {
- "another defined Unicode encoding",
- unicode.UTF16(unicode.BigEndian, unicode.UseBOM),
- MIME.Name,
- "UTF-16",
- nil,
- }, {
- "unknown Unicode encoding",
- unicode.UTF16(unicode.BigEndian, unicode.ExpectBOM),
- MIME.Name,
- "",
- errUnknown,
- }, {
- "undefined encoding",
- unsupported{},
- MIME.Name,
- "",
- errUnsupported,
- }, {
- "undefined other encoding in HTML standard",
- charmap.CodePage437,
- IANA.Name,
- "IBM437",
- nil,
- }, {
- "unknown encoding",
- encoding.Nop,
- IANA.Name,
- "",
- errUnknown,
- }}
- for i, tc := range testCases {
- name, err := tc.f(tc.enc)
- if name != tc.name || err != tc.err {
- t.Errorf("%d:%s: got %q, %v; want %q, %v", i, tc.desc, name, err, tc.name, tc.err)
- }
- }
- }
|