1// Copyright 2015 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package internal
6
7import (
8	"strings"
9	"testing"
10
11	"golang.org/x/text/language"
12)
13
14func TestInheritanceMatcher(t *testing.T) {
15	for i, tt := range []struct {
16		haveTags string
17		wantTags string
18		match    string
19		conf     language.Confidence
20	}{
21		{"und,en,en-US", "en-US", "en-US", language.Exact}, // most specific match
22		{"zh-Hant,zh", "zh-TW", "zh-Hant", language.High},  // zh-TW implies Hant.
23		{"und,zh", "zh-TW", "und", language.High},          // zh-TW does not match zh.
24		{"zh", "zh-TW", "und", language.No},                // zh-TW does not match zh.
25		{"iw,en,nl", "he", "he", language.Exact},           // matches after canonicalization
26		{"he,en,nl", "iw", "he", language.Exact},           // matches after canonicalization
27		// Prefer first match over more specific match for various reasons:
28		// a) consistency of user interface is more important than an exact match,
29		// b) _if_ und is specified, it should be considered a correct and useful match,
30		// Note that a call to this Match will almost always be with a single tag.
31		{"und,en,en-US", "he,en-US", "und", language.High},
32	} {
33		have := parseTags(tt.haveTags)
34		m := NewInheritanceMatcher(have)
35		tag, index, conf := m.Match(parseTags(tt.wantTags)...)
36		want := language.Raw.Make(tt.match)
37		if tag != want {
38			t.Errorf("%d:tag: got %q; want %q", i, tag, want)
39		}
40		if conf != language.No {
41			if got, _ := language.All.Canonicalize(have[index]); got != want {
42				t.Errorf("%d:index: got %q; want %q ", i, got, want)
43			}
44		}
45		if conf != tt.conf {
46			t.Errorf("%d:conf: got %v; want %v", i, conf, tt.conf)
47		}
48	}
49}
50
51func parseTags(list string) (out []language.Tag) {
52	for _, s := range strings.Split(list, ",") {
53		out = append(out, language.Raw.Make(strings.TrimSpace(s)))
54	}
55	return out
56}
57