package onnx

import (
	"encoding/json"
	"os"
	"testing"
)

func TestH2ZBasic(t *testing.T) {
	tests := []struct {
		in   string
		want string
	}{
		{"abc123XYZ", "ａｂｃ１２３ＸＹＺ"},
		{"ｶﾞｯｺｳ", "ガッコウ"},
		{"ﾊﾟﾝ", "パン"},
		{"Hello, world!", "Ｈｅｌｌｏ，\u3000ｗｏｒｌｄ！"},
		{"「そんな……嘘でしょう！？」", "「そんな……嘘でしょう！？」"},
	}
	for _, tt := range tests {
		got := H2Z(tt.in)
		if got != tt.want {
			t.Errorf("H2Z(%q) = %q, want %q", tt.in, got, tt.want)
		}
	}
}

// testdata/jaconv_h2z.json is jaconv 0.5.0's h2z(s, ascii=True, digit=True),
// what manga-ocr applies, over ASCII, half-width kana with and without
// (han)dakuten, and the kana and full-width blocks it must leave alone.
func TestH2ZParityWithJaconv(t *testing.T) {
	data, err := os.ReadFile("testdata/jaconv_h2z.json")
	if err != nil {
		t.Fatal(err)
	}
	var m map[string]string
	if err := json.Unmarshal(data, &m); err != nil {
		t.Fatal(err)
	}
	for orig, want := range m {
		got := H2Z(orig)
		if got != want {
			t.Errorf("char %q (U+%04X): got %q, want %q", orig, []rune(orig)[0], got, want)
		}
	}
}

func TestIsKanaOnly(t *testing.T) {
	if !IsKanaOnly("あくま") {
		t.Errorf("expected あくま to be kana only")
	}
	if !IsKanaOnly("ラーメン！") {
		t.Errorf("expected ラーメン！ to be kana only")
	}
	if IsKanaOnly("悪魔") {
		t.Errorf("expected 悪魔 NOT to be kana only")
	}
	if IsKanaOnly("悪魔と契約する") {
		t.Errorf("expected 悪魔と契約する NOT to be kana only")
	}
}
