From 44c298f729beb82572d4b45a980db4a57e7e7de1 Mon Sep 17 00:00:00 2001 From: Garrett D'Amore Date: Fri, 30 Dec 2022 13:30:58 -0800 Subject: [PATCH] Encoding package should initialize at import. There is no reason to make callers execute Register(). Also, while here, let's add some test cases. --- encoding/all.go | 17 ++++++++- encoding/encoding_init_test.go | 68 ++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 encoding/encoding_init_test.go diff --git a/encoding/all.go b/encoding/all.go index ca3ddeb2..a49c8428 100644 --- a/encoding/all.go +++ b/encoding/all.go @@ -12,6 +12,11 @@ // See the License for the specific language governing permissions and // limitations under the License. +// Package encoding is used to provide a fairly complete set of encodings +// for tcell applications. Importing this package will automatically +// register encodings. Note that this package will add several MB to the +// generated binaries, as the encodings themselves can be somewhat large, +// particularly for the East Asian locales. package encoding import ( @@ -29,7 +34,13 @@ import ( // add full character set support to your program. Note that this can // add several megabytes to your program's size, because some of the encodings // are rather large (particularly those from East Asia.) +// +// Deprecated: This is no longer needed, importing the package is sufficient. func Register() { + registerAll() +} + +func registerAll() { // We supply latin1 and latin5, because Go doesn't tcell.RegisterEncoding("ISO8859-1", encoding.ISO8859_1) tcell.RegisterEncoding("ISO8859-9", encoding.ISO8859_9) @@ -62,7 +73,7 @@ func Register() { tcell.RegisterEncoding("Big5", traditionalchinese.Big5) - // Common aliaess + // Common aliases aliases := map[string]string{ "8859-1": "ISO8859-1", "ISO-8859-1": "ISO8859-1", @@ -113,3 +124,7 @@ func Register() { } } } + +func init() { + registerAll(); +} diff --git a/encoding/encoding_init_test.go b/encoding/encoding_init_test.go new file mode 100644 index 00000000..6df58ee7 --- /dev/null +++ b/encoding/encoding_init_test.go @@ -0,0 +1,68 @@ +// Copyright 2022 The TCell Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use file except in compliance with the License. +// You may obtain a copy of the license at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package encoding + +import ( + "testing" + + "github.com/gdamore/tcell/v2" +) + +func TestGBK(t *testing.T) { + enc := tcell.GetEncoding("GBK") + if enc == nil { + t.Fatal("NULL encoding for GBK") + } + glyph, _ := enc.NewDecoder().Bytes([]byte{0x82, 0x74}) + if string(glyph) != "倀" { + t.Errorf("failed to match: %s != 倀", string(glyph)) + } +} + +func TestAscii(t *testing.T) { + encodings := []string{ + "ASCII", + "ISO-8859-1", + "KOI8-R", + "KOI8-U", + "SJIS", + "Big5", + "GB2312", + "GB18030", + "EUC-JP", + "EUCKR", + } + + for _, name := range encodings { + t.Run(name, func(t *testing.T) { + enc := tcell.GetEncoding(name) + if enc == nil { + t.Errorf("Failed getting encoding for %s", name) + return + } + encoder := enc.NewEncoder() + decoder := enc.NewDecoder() + // Ensure that all US-ASCII (lower 7 bit values) encode and decode identically + for i := byte(0); i < 126; i++ { // well, KOI8-R has some problem with "~" + s := string([]byte{i}) + if x, err := encoder.String(s); err != nil || x != s { + t.Errorf("failed encoding for character: %d, err %v expect %s got %s", i, err, s, x) + } + if x, err := decoder.String(s); err != nil || x != s { + t.Errorf("failed decoding for character: %d, err %v expect %s got %s", i, err, s, x) + } + } + }) + } +}