// Copyright 2015 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 bidi

import (
	"flag"
	"testing"

	"golang.org/x/text/internal/gen"
	"golang.org/x/text/internal/ucd"
)

var long = flag.Bool("long", false,
	"run time-consuming tests, such as tests that fetch data online")

var labels = []string{
	_AL:  "AL",
	_AN:  "AN",
	_B:   "B",
	_BN:  "BN",
	_CS:  "CS",
	_EN:  "EN",
	_ES:  "ES",
	_ET:  "ET",
	_L:   "L",
	_NSM: "NSM",
	_ON:  "ON",
	_R:   "R",
	_S:   "S",
	_WS:  "WS",

	_LRO: "LRO",
	_RLO: "RLO",
	_LRE: "LRE",
	_RLE: "RLE",
	_PDF: "PDF",
	_LRI: "LRI",
	_RLI: "RLI",
	_FSI: "FSI",
	_PDI: "PDI",
}

func TestTables(t *testing.T) {
	if !*long {
		return
	}

	gen.Init()

	trie := newBidiTrie(0)

	ucd.Parse(gen.OpenUCDFile("BidiBrackets.txt"), func(p *ucd.Parser) {
		r1 := p.Rune(0)
		want := p.Rune(1)

		e, _ := trie.lookupString(string(r1))
		if got := entry(e).reverseBracket(r1); got != want {
			t.Errorf("Reverse(%U) = %U; want %U", r1, got, want)
		}
	})

	done := map[rune]bool{}
	test := func(name string, r rune, want string) {
		e, _ := trie.lookupString(string(r))
		if got := labels[entry(e).class(r)]; got != want {
			t.Errorf("%s:%U: got %s; want %s", name, r, got, want)
		}
		done[r] = true
	}

	// Insert the derived BiDi properties.
	ucd.Parse(gen.OpenUCDFile("extracted/DerivedBidiClass.txt"), func(p *ucd.Parser) {
		r := p.Rune(0)
		test("derived", r, p.String(1))
	})
	visitDefaults(func(r rune, c class) {
		if !done[r] {
			test("default", r, labels[c])
		}
	})

}
