|  | // 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 idna | 
|  |  | 
|  | import ( | 
|  | "testing" | 
|  | ) | 
|  |  | 
|  | var idnaTestCases = [...]struct { | 
|  | ascii, unicode string | 
|  | }{ | 
|  | // Labels. | 
|  | {"books", "books"}, | 
|  | {"xn--bcher-kva", "bücher"}, | 
|  |  | 
|  | // Domains. | 
|  | {"foo--xn--bar.org", "foo--xn--bar.org"}, | 
|  | {"golang.org", "golang.org"}, | 
|  | {"example.xn--p1ai", "example.рф"}, | 
|  | {"xn--czrw28b.tw", "商業.tw"}, | 
|  | {"www.xn--mller-kva.de", "www.müller.de"}, | 
|  | } | 
|  |  | 
|  | func TestIDNA(t *testing.T) { | 
|  | for _, tc := range idnaTestCases { | 
|  | if a, err := ToASCII(tc.unicode); err != nil { | 
|  | t.Errorf("ToASCII(%q): %v", tc.unicode, err) | 
|  | } else if a != tc.ascii { | 
|  | t.Errorf("ToASCII(%q): got %q, want %q", tc.unicode, a, tc.ascii) | 
|  | } | 
|  |  | 
|  | if u, err := ToUnicode(tc.ascii); err != nil { | 
|  | t.Errorf("ToUnicode(%q): %v", tc.ascii, err) | 
|  | } else if u != tc.unicode { | 
|  | t.Errorf("ToUnicode(%q): got %q, want %q", tc.ascii, u, tc.unicode) | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestIDNASeparators(t *testing.T) { | 
|  | type subCase struct { | 
|  | unicode   string | 
|  | wantASCII string | 
|  | wantErr   bool | 
|  | } | 
|  |  | 
|  | testCases := []struct { | 
|  | name     string | 
|  | profile  *Profile | 
|  | subCases []subCase | 
|  | }{ | 
|  | { | 
|  | name: "Punycode", profile: Punycode, | 
|  | subCases: []subCase{ | 
|  | {"example\u3002jp", "xn--examplejp-ck3h", false}, | 
|  | {"東京\uFF0Ejp", "xn--jp-l92cn98g071o", false}, | 
|  | {"大阪\uFF61jp", "xn--jp-ku9cz72u463f", false}, | 
|  | }, | 
|  | }, | 
|  | { | 
|  | name: "Lookup", profile: Lookup, | 
|  | subCases: []subCase{ | 
|  | {"example\u3002jp", "example.jp", false}, | 
|  | {"東京\uFF0Ejp", "xn--1lqs71d.jp", false}, | 
|  | {"大阪\uFF61jp", "xn--pssu33l.jp", false}, | 
|  | }, | 
|  | }, | 
|  | { | 
|  | name: "Display", profile: Display, | 
|  | subCases: []subCase{ | 
|  | {"example\u3002jp", "example.jp", false}, | 
|  | {"東京\uFF0Ejp", "xn--1lqs71d.jp", false}, | 
|  | {"大阪\uFF61jp", "xn--pssu33l.jp", false}, | 
|  | }, | 
|  | }, | 
|  | { | 
|  | name: "Registration", profile: Registration, | 
|  | subCases: []subCase{ | 
|  | {"example\u3002jp", "", true}, | 
|  | {"東京\uFF0Ejp", "", true}, | 
|  | {"大阪\uFF61jp", "", true}, | 
|  | }, | 
|  | }, | 
|  | } | 
|  | for _, tc := range testCases { | 
|  | t.Run(tc.name, func(t *testing.T) { | 
|  | for _, c := range tc.subCases { | 
|  | gotA, err := tc.profile.ToASCII(c.unicode) | 
|  | if c.wantErr { | 
|  | if err == nil { | 
|  | t.Errorf("ToASCII(%q): got no error, but an error expected", c.unicode) | 
|  | } | 
|  | } else { | 
|  | if err != nil { | 
|  | t.Errorf("ToASCII(%q): got err=%v, but no error expected", c.unicode, err) | 
|  | } else if gotA != c.wantASCII { | 
|  | t.Errorf("ToASCII(%q): got %q, want %q", c.unicode, gotA, c.wantASCII) | 
|  | } | 
|  | } | 
|  | } | 
|  | }) | 
|  | } | 
|  | } | 
|  |  | 
|  | // TODO(nigeltao): test errors, once we've specified when ToASCII and ToUnicode | 
|  | // return errors. |