1package main
2
3import (
4	"strconv"
5	"testing"
6)
7
8// typical czech test sentence ;-)
9const baseTestString = "Příliš žluťoučký kůň příšerně úpěl ďábelské ódy"
10
11func TestRemoveDiacritics(t *testing.T) {
12	testStr := baseTestString
13	expStr := "Prilis zlutoucky kun priserne upel dabelske ody"
14	checkRemoveDiacritics(testStr, expStr, t)
15
16	// other accents (non comlete, but all I founded)
17	testStr = "áéíóúýčďěňřšťžůåøĉĝĥĵŝŭšžõäöüàâçéèêëîïôùûüÿžščćđáéíóúąęėįųūčšžāēīūčšžļķņģáéíóúöüőűäöüëïąćęłńóśźżáàãâçéêíóõôăâîșțáäčďéíĺľňóôŕšťúýžáéíñóúüåäöâçîşûğăâđêôơưáàãảạ"
18	expStr = "aeiouycdenrstzuaocghjsuszoaouaaceeeeiiouuuyzsccdaeiouaeeiuucszaeiucszlkngaeiouououaoueiacelnoszzaaaaceeioooaaistaacdeillnoorstuyzaeinouuaaoacisugaadeoouaaaaa"
19	checkRemoveDiacritics(testStr, expStr, t)
20
21	testStr = "ÁÉÍÓÚÝČĎĚŇŘŠŤŽŮÅØĈĜĤĴŜŬŠŽÕÄÖÜÀÂÇÉÈÊËÎÏÔÙÛÜŸŽŠČĆĐÁÉÍÓÚĄĘĖĮŲŪČŠŽĀĒĪŪČŠŽĻĶŅĢÁÉÍÓÚÖÜŐŰÄÖÜËÏĄĆĘŁŃÓŚŹŻÁÀÃÂÇÉÊÍÓÕÔĂÂÎȘȚÁÄČĎÉÍĹĽŇÓÔŔŠŤÚÝŽÁÉÍÑÓÚÜÅÄÖÂÇÎŞÛĞĂÂĐÊÔƠƯÁÀÃẢẠ"
22	expStr = "AEIOUYCDENRSTZUAOCGHJSUSZOAOUAACEEEEIIOUUUYZSCCDAEIOUAEEIUUCSZAEIUCSZLKNGAEIOUOUOUAOUEIACELNOSZZAAAACEEIOOOAAISTAACDEILLNOORSTUYZAEINOUUAAOACISUGAADEOOUAAAAA"
23	checkRemoveDiacritics(testStr, expStr, t)
24
25	testStr = "áạàảãăắặằẳẵâấậầẩẫéẹèẻẽêếệềểễiíịìỉĩoóọòỏõôốộồổỗơớợờởỡúụùủũưứựừửữyýỵỳỷỹđ"
26	expStr = "aaaaaaaaaaaaaaaaaeeeeeeeeeeeiiiiiioooooooooooooooooouuuuuuuuuuuyyyyyyd"
27	checkRemoveDiacritics(testStr, expStr, t)
28
29	testStr = "ÁẠÀẢÃĂẮẶẰẲẴÂẤẬẦẨẪÉẸÈẺẼÊẾỆỀỂỄÍỊÌỈĨÓỌÒỎÕÔỐỘỒỔỖƠỚỢỜỞỠÚỤÙỦŨƯỨỰỪỬỮÝỴỲỶỸĐ"
30	expStr = "AAAAAAAAAAAAAAAAAEEEEEEEEEEEIIIIIOOOOOOOOOOOOOOOOOUUUUUUUUUUUYYYYYD"
31	checkRemoveDiacritics(testStr, expStr, t)
32}
33
34func checkRemoveDiacritics(testStr string, expStr string, t *testing.T) {
35	resultStr := removeDiacritics(testStr)
36	if resultStr != expStr {
37		t.Errorf("at input '%v' expected '%v' but got '%v'", testStr, expStr, resultStr)
38	}
39}
40
41func TestSearchSettings(t *testing.T) {
42	runSearch(t, true, false, true, true, "Veřejný", "vere", true)
43
44	runSearch(t, true, false, true, false, baseTestString, "Zlutoucky", true)
45	runSearch(t, true, false, true, false, baseTestString, "zlutoucky", true)
46	runSearch(t, true, true, true, false, baseTestString, "Zlutoucky", false)
47	runSearch(t, true, true, true, true, baseTestString, "zlutoucky", true)
48
49	runSearch(t, false, false, true, false, baseTestString, "žlutoucky", true)
50	runSearch(t, false, false, true, false, baseTestString, "Žlutoucky", false)
51
52	runSearch(t, false, false, true, true, baseTestString, "žluťoučký", true)
53	runSearch(t, false, false, true, false, baseTestString, "žluťoučký", true)
54	runSearch(t, false, false, false, false, baseTestString, "žluťoučký", true)
55	runSearch(t, false, false, false, false, baseTestString, "zlutoucky", false)
56	runSearch(t, false, false, true, true, baseTestString, "zlutoucky", true)
57}
58
59func runSearch(t *testing.T, ignorecase, smartcase, ignorediacritics, smartdiacritics bool, base, pattern string, expected bool) {
60	gOpts.ignorecase = ignorecase
61	gOpts.smartcase = smartcase
62	gOpts.ignoredia = ignorediacritics
63	gOpts.smartdia = smartdiacritics
64	matched, _ := searchMatch(base, pattern)
65	if matched != expected {
66		t.Errorf("False search for" +
67			" ignorecase = " + strconv.FormatBool(gOpts.ignorecase) + ", " +
68			" smartcase = " + strconv.FormatBool(gOpts.smartcase) + ", " +
69			" ignoredia = " + strconv.FormatBool(gOpts.ignoredia) + ", " +
70			" smartdia = " + strconv.FormatBool(gOpts.smartdia) + ", ")
71	}
72}
73