1package liner
2
3import (
4	"strconv"
5	"testing"
6)
7
8func accent(in []rune) []rune {
9	var out []rune
10	for _, r := range in {
11		out = append(out, r)
12		out = append(out, '\u0301')
13	}
14	return out
15}
16
17type testCase struct {
18	s      []rune
19	glyphs int
20}
21
22var testCases = []testCase{
23	{[]rune("query"), 5},
24	{[]rune("私"), 2},
25	{[]rune("hello『世界』"), 13},
26}
27
28func TestCountGlyphs(t *testing.T) {
29	for _, testCase := range testCases {
30		count := countGlyphs(testCase.s)
31		if count != testCase.glyphs {
32			t.Errorf("ASCII count incorrect. %d != %d", count, testCase.glyphs)
33		}
34		count = countGlyphs(accent(testCase.s))
35		if count != testCase.glyphs {
36			t.Errorf("Accent count incorrect. %d != %d", count, testCase.glyphs)
37		}
38	}
39}
40
41func compare(a, b []rune, name string, t *testing.T) {
42	if len(a) != len(b) {
43		t.Errorf(`"%s" != "%s" in %s"`, string(a), string(b), name)
44		return
45	}
46	for i := range a {
47		if a[i] != b[i] {
48			t.Errorf(`"%s" != "%s" in %s"`, string(a), string(b), name)
49			return
50		}
51	}
52}
53
54func TestPrefixGlyphs(t *testing.T) {
55	for _, testCase := range testCases {
56		for i := 0; i <= len(testCase.s); i++ {
57			iter := strconv.Itoa(i)
58			out := getPrefixGlyphs(testCase.s, i)
59			compare(out, testCase.s[:i], "ascii prefix "+iter, t)
60			out = getPrefixGlyphs(accent(testCase.s), i)
61			compare(out, accent(testCase.s[:i]), "accent prefix "+iter, t)
62		}
63		out := getPrefixGlyphs(testCase.s, 999)
64		compare(out, testCase.s, "ascii prefix overflow", t)
65		out = getPrefixGlyphs(accent(testCase.s), 999)
66		compare(out, accent(testCase.s), "accent prefix overflow", t)
67
68		out = getPrefixGlyphs(testCase.s, -3)
69		if len(out) != 0 {
70			t.Error("ascii prefix negative")
71		}
72		out = getPrefixGlyphs(accent(testCase.s), -3)
73		if len(out) != 0 {
74			t.Error("accent prefix negative")
75		}
76	}
77}
78
79func TestSuffixGlyphs(t *testing.T) {
80	for _, testCase := range testCases {
81		for i := 0; i <= len(testCase.s); i++ {
82			iter := strconv.Itoa(i)
83			out := getSuffixGlyphs(testCase.s, i)
84			compare(out, testCase.s[len(testCase.s)-i:], "ascii suffix "+iter, t)
85			out = getSuffixGlyphs(accent(testCase.s), i)
86			compare(out, accent(testCase.s[len(testCase.s)-i:]), "accent suffix "+iter, t)
87		}
88		out := getSuffixGlyphs(testCase.s, 999)
89		compare(out, testCase.s, "ascii suffix overflow", t)
90		out = getSuffixGlyphs(accent(testCase.s), 999)
91		compare(out, accent(testCase.s), "accent suffix overflow", t)
92
93		out = getSuffixGlyphs(testCase.s, -3)
94		if len(out) != 0 {
95			t.Error("ascii suffix negative")
96		}
97		out = getSuffixGlyphs(accent(testCase.s), -3)
98		if len(out) != 0 {
99			t.Error("accent suffix negative")
100		}
101	}
102}
103