173 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			173 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright 2013 by Dobrosław Żybort. All rights reserved.
 | ||
| // This Source Code Form is subject to the terms of the Mozilla Public
 | ||
| // License, v. 2.0. If a copy of the MPL was not distributed with this
 | ||
| // file, You can obtain one at http://mozilla.org/MPL/2.0/.
 | ||
| 
 | ||
| package slug
 | ||
| 
 | ||
| import (
 | ||
| 	"testing"
 | ||
| )
 | ||
| 
 | ||
| //=============================================================================
 | ||
| 
 | ||
| var SlugMakeTests = []struct {
 | ||
| 	in  string
 | ||
| 	out string
 | ||
| }{
 | ||
| 	{"DOBROSLAWZYBORT", "dobroslawzybort"},
 | ||
| 	{"Dobroslaw Zybort", "dobroslaw-zybort"},
 | ||
| 	{"  Dobroslaw     Zybort  ?", "dobroslaw-zybort"},
 | ||
| 	{"Dobrosław Żybort", "dobroslaw-zybort"},
 | ||
| 	{"Ala ma 6 kotów.", "ala-ma-6-kotow"},
 | ||
| 
 | ||
| 	{"áÁàÀãÃâÂäÄąĄą̊Ą̊", "aaaaaaaaaaaaaa"},
 | ||
| 	{"ćĆĉĈçÇ", "cccccc"},
 | ||
| 	{"éÉèÈẽẼêÊëËęĘ", "eeeeeeeeeeee"},
 | ||
| 	{"íÍìÌĩĨîÎïÏįĮ", "iiiiiiiiiiii"},
 | ||
| 	{"łŁ", "ll"},
 | ||
| 	{"ńŃ", "nn"},
 | ||
| 	{"óÓòÒõÕôÔöÖǫǪǭǬø", "ooooooooooooooo"},
 | ||
| 	{"śŚ", "ss"},
 | ||
| 	{"úÚùÙũŨûÛüÜųŲ", "uuuuuuuuuuuu"},
 | ||
| 	{"y̨Y̨", "yy"},
 | ||
| 	{"źŹżŹ", "zzzz"},
 | ||
| 	{"·/,:;`˜'\"", ""},
 | ||
| 	{"2000–2013", "2000-2013"},
 | ||
| 	{"style—not", "style-not"},
 | ||
| 	{"test_slug", "test_slug"},
 | ||
| 	{"Æ", "ae"},
 | ||
| 	{"Ich heiße", "ich-heisse"},
 | ||
| 
 | ||
| 	{"This & that", "this-and-that"},
 | ||
| 	{"fácil €", "facil-eu"},
 | ||
| 	{"smile ☺", "smile"},
 | ||
| 	{"Hellö Wörld хелло ворлд", "hello-world-khello-vorld"},
 | ||
| 	{"\"C'est déjà l’été.\"", "cest-deja-lete"},
 | ||
| 	{"jaja---lol-méméméoo--a", "jaja-lol-mememeoo-a"},
 | ||
| 	{"影師", "ying-shi"},
 | ||
| }
 | ||
| 
 | ||
| func TestSlugMake(t *testing.T) {
 | ||
| 	for index, st := range SlugMakeTests {
 | ||
| 		slug := Make(st.in)
 | ||
| 		if st.out != slug {
 | ||
| 			t.Errorf(
 | ||
| 				"%d. Make(%q) => out = %q, want %q",
 | ||
| 				index, st.in, slug, st.out)
 | ||
| 		}
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| var SlugMakeLangTests = []struct {
 | ||
| 	lang string
 | ||
| 	in   string
 | ||
| 	out  string
 | ||
| }{
 | ||
| 	{"en", "This & that", "this-and-that"},
 | ||
| 	{"de", "This & that", "this-und-that"},
 | ||
| 	{"test", "This & that", "this-and-that"}, // unknown lang, fallback to "en"
 | ||
| }
 | ||
| 
 | ||
| func TestSlugMakeLang(t *testing.T) {
 | ||
| 	for index, smlt := range SlugMakeLangTests {
 | ||
| 		slug := MakeLang(smlt.in, smlt.lang)
 | ||
| 		if smlt.out != slug {
 | ||
| 			t.Errorf(
 | ||
| 				"%d. MakeLang(%q, %q) => out = %q, want %q",
 | ||
| 				index, smlt.in, smlt.lang, slug, smlt.out)
 | ||
| 		}
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| var SlugMakeUserSubstituteTests = []struct {
 | ||
| 	cSub map[string]string
 | ||
| 	lang string
 | ||
| 	in   string
 | ||
| 	out  string
 | ||
| }{
 | ||
| 	{map[string]string{"'": " "}, "en", "That's great", "that-s-great"},
 | ||
| 	{map[string]string{"&": "or"}, "en", "This & that", "this-or-that"}, // by default "&" => "and"
 | ||
| 	{map[string]string{"&": "or"}, "de", "This & that", "this-or-that"}, // by default "&" => "und"
 | ||
| }
 | ||
| 
 | ||
| func TestSlugMakeUserSubstituteLang(t *testing.T) {
 | ||
| 	for index, smust := range SlugMakeUserSubstituteTests {
 | ||
| 		CustomSub = smust.cSub
 | ||
| 		slug := MakeLang(smust.in, smust.lang)
 | ||
| 		if smust.out != slug {
 | ||
| 			t.Errorf(
 | ||
| 				"%d. %q; MakeLang(%q, %q) => out = %q, want %q",
 | ||
| 				index, smust.cSub, smust.in, smust.lang,
 | ||
| 				slug, smust.out)
 | ||
| 
 | ||
| 		}
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| // Always substitute runes first
 | ||
| var SlugMakeSubstituteOrderTests = []struct {
 | ||
| 	rSub map[rune]string
 | ||
| 	sSub map[string]string
 | ||
| 	in   string
 | ||
| 	out  string
 | ||
| }{
 | ||
| 	{map[rune]string{'o': "left"}, map[string]string{"o": "right"}, "o o", "left-left"},
 | ||
| 	{map[rune]string{'&': "down"}, map[string]string{"&": "up"}, "&", "down"},
 | ||
| }
 | ||
| 
 | ||
| func TestSlugMakeSubstituteOrderLang(t *testing.T) {
 | ||
| 	for index, smsot := range SlugMakeSubstituteOrderTests {
 | ||
| 		CustomRuneSub = smsot.rSub
 | ||
| 		CustomSub = smsot.sSub
 | ||
| 		slug := Make(smsot.in)
 | ||
| 		if smsot.out != slug {
 | ||
| 			t.Errorf(
 | ||
| 				"%d. %q; %q; Make(%q) => out = %q, want %q",
 | ||
| 				index, smsot.rSub, smsot.sSub, smsot.in,
 | ||
| 				slug, smsot.out)
 | ||
| 
 | ||
| 		}
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| var SlugSubstituteTests = []struct {
 | ||
| 	cSub map[string]string
 | ||
| 	in   string
 | ||
| 	out  string
 | ||
| }{
 | ||
| 	{map[string]string{"o": "no"}, "o o o", "no no no"},
 | ||
| 	{map[string]string{"'": " "}, "That's great", "That s great"},
 | ||
| }
 | ||
| 
 | ||
| func TestSubstituteLang(t *testing.T) {
 | ||
| 	for index, sst := range SlugSubstituteTests {
 | ||
| 		text := Substitute(sst.in, sst.cSub)
 | ||
| 		if sst.out != text {
 | ||
| 			t.Errorf(
 | ||
| 				"%d. Substitute(%q, %q) => out = %q, want %q",
 | ||
| 				index, sst.in, sst.cSub, text, sst.out)
 | ||
| 		}
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| var SlugSubstituteRuneTests = []struct {
 | ||
| 	cSub map[rune]string
 | ||
| 	in   string
 | ||
| 	out  string
 | ||
| }{
 | ||
| 	{map[rune]string{'o': "no"}, "o o o", "no no no"},
 | ||
| 	{map[rune]string{'\'': " "}, "That's great", "That s great"},
 | ||
| }
 | ||
| 
 | ||
| func TestSubstituteRuneLang(t *testing.T) {
 | ||
| 	for index, ssrt := range SlugSubstituteRuneTests {
 | ||
| 		text := SubstituteRune(ssrt.in, ssrt.cSub)
 | ||
| 		if ssrt.out != text {
 | ||
| 			t.Errorf(
 | ||
| 				"%d. SubstituteRune(%q, %q) => out = %q, want %q",
 | ||
| 				index, ssrt.in, ssrt.cSub, text, ssrt.out)
 | ||
| 		}
 | ||
| 	}
 | ||
| }
 | 
