// Copyright 2009 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 unicode_test

import (
	"testing";
	. "unicode";
)

type T struct {
	rune	int;
	script	string;
}

// Hand-chosen tests from Unicode 5.1.0, mostly to discover when new
// scripts and categories arise.
var inTest = []T {
	T{0x06e2,	"Arabic"},
	T{0x0567,	"Armenian"},
	T{0x1b37,	"Balinese"},
	T{0x09c2,	"Bengali"},
	T{0x3115,	"Bopomofo"},
	T{0x282d,	"Braille"},
	T{0x1a1a,	"Buginese"},
	T{0x1747,	"Buhid"},
	T{0x156d,	"Canadian_Aboriginal"},
	T{0x102a9,	"Carian"},
	T{0xaa4d,	"Cham"},
	T{0x13c2,	"Cherokee"},
	T{0x0020,	"Common"},
	T{0x1d4a5,	"Common"},
	T{0x2cfc,	"Coptic"},
	T{0x12420,	"Cuneiform"},
	T{0x1080c,	"Cypriot"},
	T{0xa663,	"Cyrillic"},
	T{0x10430,	"Deseret"},
	T{0x094a,	"Devanagari"},
	T{0x1271,	"Ethiopic"},
	T{0x10fc,	"Georgian"},
	T{0x2c40,	"Glagolitic"},
	T{0x10347,	"Gothic"},
	T{0x03ae,	"Greek"},
	T{0x0abf,	"Gujarati"},
	T{0x0a24,	"Gurmukhi"},
	T{0x3028,	"Han"},
	T{0x11b8,	"Hangul"},
	T{0x1727,	"Hanunoo"},
	T{0x05a0,	"Hebrew"},
	T{0x3058,	"Hiragana"},
	T{0x20e6,	"Inherited"},
	T{0x0cbd,	"Kannada"},
	T{0x30a6,	"Katakana"},
	T{0xa928,	"Kayah_Li"},
	T{0x10a11,	"Kharoshthi"},
	T{0x17c6,	"Khmer"},
	T{0x0eaa,	"Lao"},
	T{0x1d79,	"Latin"},
	T{0x1c10,	"Lepcha"},
	T{0x1930,	"Limbu"},
	T{0x1003c,	"Linear_B"},
	T{0x10290,	"Lycian"},
	T{0x10930,	"Lydian"},
	T{0x0d42,	"Malayalam"},
	T{0x1822,	"Mongolian"},
	T{0x104c,	"Myanmar"},
	T{0x19c3,	"New_Tai_Lue"},
	T{0x07f8,	"Nko"},
	T{0x169b,	"Ogham"},
	T{0x1c6a,	"Ol_Chiki"},
	T{0x10310,	"Old_Italic"},
	T{0x103c9,	"Old_Persian"},
	T{0x0b3e,	"Oriya"},
	T{0x10491,	"Osmanya"},
	T{0xa860,	"Phags_Pa"},
	T{0x10918,	"Phoenician"},
	T{0xa949,	"Rejang"},
	T{0x16c0,	"Runic"},
	T{0xa892,	"Saurashtra"},
	T{0x10463,	"Shavian"},
	T{0x0dbd,	"Sinhala"},
	T{0x1ba3,	"Sundanese"},
	T{0xa803,	"Syloti_Nagri"},
	T{0x070f,	"Syriac"},
	T{0x170f,	"Tagalog"},
	T{0x176f,	"Tagbanwa"},
	T{0x1972,	"Tai_Le"},
	T{0x0bbf,	"Tamil"},
	T{0x0c55,	"Telugu"},
	T{0x07a7,	"Thaana"},
	T{0x0e46,	"Thai"},
	T{0x0f36,	"Tibetan"},
	T{0x2d55,	"Tifinagh"},
	T{0x10388,	"Ugaritic"},
	T{0xa60e,	"Vai"},
	T{0xa216,	"Yi"},
}

var outTest = []T {	// not really worth being thorough
	T{0x20,	"Telugu"}
}

var inCategoryTest = []T {
	T{0x0081, "Cc"},
	T{0x17b4, "Cf"},
	T{0xf0000, "Co"},
	T{0xdb80, "Cs"},
	T{0x0236, "Ll"},
	T{0x1d9d, "Lm"},
	T{0x07cf, "Lo"},
	T{0x1f8a, "Lt"},
	T{0x03ff, "Lu"},
	T{0x0bc1, "Mc"},
	T{0x20df, "Me"},
	T{0x07f0, "Mn"},
	T{0x1bb2, "Nd"},
	T{0x10147, "Nl"},
	T{0x2478, "No"},
	T{0xfe33, "Pc"},
	T{0x2011, "Pd"},
	T{0x301e, "Pe"},
	T{0x2e03, "Pf"},
	T{0x2e02, "Pi"},
	T{0x0022, "Po"},
	T{0x2770, "Ps"},
	T{0x00a4, "Sc"},
	T{0xa711, "Sk"},
	T{0x25f9, "Sm"},
	T{0x2108, "So"},
	T{0x2028, "Zl"},
	T{0x2029, "Zp"},
	T{0x202f, "Zs"},
	T{0x04aa, "letter"},
}

var inPropTest = []T {
	T{0x0046, "ASCII_Hex_Digit"},
	T{0x200F, "Bidi_Control"},
	T{0x2212, "Dash"},
	T{0xE0001, "Deprecated"},
	T{0x00B7, "Diacritic"},
	T{0x30FE, "Extender"},
	T{0xFF46, "Hex_Digit"},
	T{0x2E17, "Hyphen"},
	T{0x2FFB, "IDS_Binary_Operator"},
	T{0x2FF3, "IDS_Trinary_Operator"},
	T{0xFA6A, "Ideographic"},
	T{0x200D, "Join_Control"},
	T{0x0EC4, "Logical_Order_Exception"},
	T{0x2FFFF, "Noncharacter_Code_Point"},
	T{0x065E, "Other_Alphabetic"},
	T{0x2069, "Other_Default_Ignorable_Code_Point"},
	T{0x0BD7, "Other_Grapheme_Extend"},
	T{0x0387, "Other_ID_Continue"},
	T{0x212E, "Other_ID_Start"},
	T{0x2094, "Other_Lowercase"},
	T{0x2040, "Other_Math"},
	T{0x216F, "Other_Uppercase"},
	T{0x0027, "Pattern_Syntax"},
	T{0x0020, "Pattern_White_Space"},
	T{0x300D, "Quotation_Mark"},
	T{0x2EF3, "Radical"},
	T{0x061F, "STerm"},
	T{0x2071, "Soft_Dotted"},
	T{0x003A, "Terminal_Punctuation"},
	T{0x9FC3, "Unified_Ideograph"},
	T{0xFE0F, "Variation_Selector"},
	T{0x0020, "White_Space"},
}

func TestScripts(t *testing.T) {
	notTested := make(map[string] bool);
	for k := range Scripts {
		notTested[k] = true
	}
	for _, test := range inTest {
		if _, ok := Scripts[test.script]; !ok {
			t.Fatal(test.script, "not a known script")
		}
		if !Is(Scripts[test.script], test.rune) {
			t.Errorf("IsScript(%#x, %s) = false, want true\n", test.rune, test.script);
		}
		notTested[test.script] = false, false
	}
	for _, test := range outTest {
		if Is(Scripts[test.script], test.rune) {
			t.Errorf("IsScript(%#x, %s) = true, want false\n", test.rune, test.script);
		}
	}
	for k := range notTested {
		t.Error("not tested:", k)
	}
}

func TestCategories(t *testing.T) {
	notTested := make(map[string] bool);
	for k := range Categories {
		notTested[k] = true
	}
	for _, test := range inCategoryTest {
		if _, ok := Categories[test.script]; !ok {
			t.Fatal(test.script, "not a known category")
		}
		if !Is(Categories[test.script], test.rune) {
			t.Errorf("IsCategory(%#x, %s) = false, want true\n", test.rune, test.script);
		}
		notTested[test.script] = false, false
	}
	for k := range notTested {
		t.Error("not tested:", k)
	}
}

func TestProperties(t *testing.T) {
	notTested := make(map[string] bool);
	for k := range Properties {
		notTested[k] = true
	}
	for _, test := range inPropTest {
		if _, ok := Properties[test.script]; !ok {
			t.Fatal(test.script, "not a known prop")
		}
		if !Is(Properties[test.script], test.rune) {
			t.Errorf("IsCategory(%#x, %s) = false, want true\n", test.rune, test.script);
		}
		notTested[test.script] = false, false
	}
	for k := range notTested {
		t.Error("not tested:", k)
	}
}
