import pytest
from kanjex.conjugator import ICHIDAN, conjugate, assert_verb_type

# Define the test cases for the plain form
ichidan_plain_cases = pytest.mark.parametrize("verb, make_negative, make_past_tense, expected", [
    ("食べる", False, False, "食べる"),
    ("食べる", True, False, "食べない"),
    ("食べる", False, True, "食べた"),
    ("食べる", True, True, "食べなかった"),
    ("見る", False, False, "見る"),
    ("見る", True, False, "見ない"),
    ("見る", False, True, "見た"),
    ("見る", True, True, "見なかった"),
    ("教える", False, False, "教える"),
    ("教える", True, False, "教えない"),
    ("教える", False, True, "教えた"),
    ("教える", True, True, "教えなかった"),
    ("起きる", False, False, "起きる"),
    ("起きる", True, False, "起きない"),
    ("起きる", False, True, "起きた"),
    ("起きる", True, True, "起きなかった"),
    ("寝る", False, False, "寝る"),
    ("寝る", True, False, "寝ない"),
    ("寝る", False, True, "寝た"),
    ("寝る", True, True, "寝なかった"),
    ("着る", False, False, "着る"),
    ("着る", True, False, "着ない"),
    ("着る", False, True, "着た"),
    ("着る", True, True, "着なかった"),
    ("開ける", False, False, "開ける"),
    ("開ける", True, False, "開けない"),
    ("開ける", False, True, "開けた"),
    ("開ける", True, True, "開けなかった"),
    ("閉じる", False, False, "閉じる"),
    ("閉じる", True, False, "閉じない"),
    ("閉じる", False, True, "閉じた"),
    ("閉じる", True, True, "閉じなかった"),
    ("変える", False, False, "変える"),
    ("変える", True, False, "変えない"),
    ("変える", False, True, "変えた"),
    ("変える", True, True, "変えなかった"),
    ("覚える", False, False, "覚える"),
    ("覚える", True, False, "覚えない"),
    ("覚える", False, True, "覚えた"),
    ("覚える", True, True, "覚えなかった"),
    ("借りる", False, False, "借りる"),
    ("借りる", True, False, "借りない"),
    ("借りる", False, True, "借りた"),
    ("借りる", True, True, "借りなかった"),
    ("生きる", False, False, "生きる"),
    ("生きる", True, False, "生きない"),
    ("生きる", False, True, "生きた"),
    ("生きる", True, True, "生きなかった"),
    ("信じる", False, False, "信じる"),
    ("信じる", True, False, "信じない"),
    ("信じる", False, True, "信じた"),
    ("信じる", True, True, "信じなかった"),
    ("出る", False, False, "出る"),
    ("出る", True, False, "出ない"),
    ("出る", False, True, "出た"),
    ("出る", True, True, "出なかった"),
    ("始める", False, False, "始める"),
    ("始める", True, False, "始めない"),
    ("始める", False, True, "始めた"),
    ("始める", True, True, "始めなかった"),
    ("受ける", False, False, "受ける"),
    ("受ける", True, False, "受けない"),
    ("受ける", False, True, "受けた"),
    ("受ける", True, True, "受けなかった"),
    ("考える", False, False, "考える"),
    ("考える", True, False, "考えない"),
    ("考える", False, True, "考えた"),
    ("考える", True, True, "考えなかった"),
    ("決める", False, False, "決める"),
    ("決める", True, False, "決めない"),
    ("決める", False, True, "決めた"),
    ("決める", True, True, "決めなかった"),
    ("諦める", False, False, "諦める"),
    ("諦める", True, False, "諦めない"),
    ("諦める", False, True, "諦めた"),
    ("諦める", True, True, "諦めなかった"),
    ("続ける", False, False, "続ける"),
    ("続ける", True, False, "続けない"),
    ("続ける", False, True, "続けた"),
    ("続ける", True, True, "続けなかった"),
    ("ある", False, False, "ある"),
    ("ある", True, False, "ない"),
    ("ある", False, True, "あった"),
    ("ある", True, True, "なかった"),
    ("いる", False, False, "いる"),
    ("いる", True, False, "いない"),
    ("いる", False, True, "いた"),
    ("いる", True, True, "いなかった"),
    ("頂く", False, False, "頂く"),
    ("頂く", True, False, "頂かない"),
    ("頂く", False, True, "頂いた"),
    ("頂く", True, True, "頂かなかった"),
    ("見せる", False, False, "見せる"),
    ("見せる", True, False, "見せない"),
    ("見せる", False, True, "見せた"),
    ("見せる", True, True, "見せなかった"),
    ("忘れる", False, False, "忘れる"),
    ("忘れる", True, False, "忘れない"),
    ("忘れる", False, True, "忘れた"),
    ("忘れる", True, True, "忘れなかった"),
    ("閉じる", False, False, "閉じる"),
    ("閉じる", True, False, "閉じない"),
    ("閉じる", False, True, "閉じた"),
    ("閉じる", True, True, "閉じなかった"),
    ("捨てる", False, False, "捨てる"),
    ("捨てる", True, False, "捨てない"),
    ("捨てる", False, True, "捨てた"),
    ("捨てる", True, True, "捨てなかった"),
    ("触れる", False, False, "触れる"),
    ("触れる", True, False, "触れない"),
    ("触れる", False, True, "触れた"),
    ("触れる", True, True, "触れなかった"),
    ("消える", False, False, "消える"),
    ("消える", True, False, "消えない"),
    ("消える", False, True, "消えた"),
    ("消える", True, True, "消えなかった")
])

@ichidan_plain_cases
def test_ichidan_plain(verb, make_negative, make_past_tense, expected):
    assert_verb_type(verb, ICHIDAN)
    conjugated = conjugate(verb, "plain", make_negative, make_past_tense)
    assert conjugated == expected, f"[{verb}] Expected {expected}, got {conjugated}."

ichidan_polite_cases = pytest.mark.parametrize("verb, make_negative, make_past_tense, expected", [
    ("食べる", False, False, "食べます"),
    ("食べる", True, False, "食べません"),
    ("食べる", False, True, "食べました"),
    ("食べる", True, True, "食べませんでした"),
    ("見る", False, False, "見ます"),
    ("見る", True, False, "見ません"),
    ("見る", False, True, "見ました"),
    ("見る", True, True, "見ませんでした"),
    ("教える", False, False, "教えます"),
    ("教える", True, False, "教えません"),
    ("教える", False, True, "教えました"),
    ("教える", True, True, "教えませんでした"),
    ("起きる", False, False, "起きます"),
    ("起きる", True, False, "起きません"),
    ("起きる", False, True, "起きました"),
    ("起きる", True, True, "起きませんでした"),
    ("寝る", False, False, "寝ます"),
    ("寝る", True, False, "寝ません"),
    ("寝る", False, True, "寝ました"),
    ("寝る", True, True, "寝ませんでした"),
    ("着る", False, False, "着ます"),
    ("着る", True, False, "着ません"),
    ("着る", False, True, "着ました"),
    ("着る", True, True, "着ませんでした"),
    ("開ける", False, False, "開けます"),
    ("開ける", True, False, "開けません"),
    ("開ける", False, True, "開けました"),
    ("開ける", True, True, "開けませんでした"),
    ("閉じる", False, False, "閉じます"),
    ("閉じる", True, False, "閉じません"),
    ("閉じる", False, True, "閉じました"),
    ("閉じる", True, True, "閉じませんでした"),
    ("変える", False, False, "変えます"),
    ("変える", True, False, "変えません"),
    ("変える", False, True, "変えました"),
    ("変える", True, True, "変えませんでした"),
    ("覚える", False, False, "覚えます"),
    ("覚える", True, False, "覚えません"),
    ("覚える", False, True, "覚えました"),
    ("覚える", True, True, "覚えませんでした"),
    ("借りる", False, False, "借ります"),
    ("借りる", True, False, "借りません"),
    ("借りる", False, True, "借りました"),
    ("借りる", True, True, "借りませんでした"),
    ("生きる", False, False, "生きます"),
    ("生きる", True, False, "生きません"),
    ("生きる", False, True, "生きました"),
    ("生きる", True, True, "生きませんでした"),
    ("信じる", False, False, "信じます"),
    ("信じる", True, False, "信じません"),
    ("信じる", False, True, "信じました"),
    ("信じる", True, True, "信じませんでした"),
    ("出る", False, False, "出ます"),
    ("出る", True, False, "出ません"),
    ("出る", False, True, "出ました"),
    ("出る", True, True, "出ませんでした"),
    ("始める", False, False, "始めます"),
    ("始める", True, False, "始めません"),
    ("始める", False, True, "始めました"),
    ("始める", True, True, "始めませんでした"),
    ("受ける", False, False, "受けます"),
    ("受ける", True, False, "受けません"),
    ("受ける", False, True, "受けました"),
    ("受ける", True, True, "受けませんでした"),
    ("考える", False, False, "考えます"),
    ("考える", True, False, "考えません"),
    ("考える", False, True, "考えました"),
    ("考える", True, True, "考えませんでした"),
    ("決める", False, False, "決めます"),
    ("決める", True, False, "決めません"),
    ("決める", False, True, "決めました"),
    ("決める", True, True, "決めませんでした"),
    ("諦める", False, False, "諦めます"),
    ("諦める", True, False, "諦めません"),
    ("諦める", False, True, "諦めました"),
    ("諦める", True, True, "諦めませんでした"),
    ("続ける", False, False, "続けます"),
    ("続ける", True, False, "続けません"),
    ("続ける", False, True, "続けました"),
    ("続ける", True, True, "続けませんでした"),
    ("ある", False, False, "あります"),
    ("ある", True, False, "ありません"),
    ("ある", False, True, "ありました"),
    ("ある", True, True, "ありませんでした"),
    ("いる", False, False, "います"),
    ("いる", True, False, "いません"),
    ("いる", False, True, "いました"),
    ("いる", True, True, "いませんでした"),
    ("頂く", False, False, "頂きます"),
    ("頂く", True, False, "頂きません"),
    ("頂く", False, True, "頂きました"),
    ("頂く", True, True, "頂きませんでした"),
    ("見せる", False, False, "見せます"),
    ("見せる", True, False, "見せません"),
    ("見せる", False, True, "見せました"),
    ("見せる", True, True, "見せませんでした"),
    ("忘れる", False, False, "忘れます"),
    ("忘れる", True, False, "忘れません"),
    ("忘れる", False, True, "忘れました"),
    ("忘れる", True, True, "忘れませんでした"),
    ("閉じる", False, False, "閉じます"),
    ("閉じる", True, False, "閉じません"),
    ("閉じる", False, True, "閉じました"),
    ("閉じる", True, True, "閉じませんでした"),
    ("捨てる", False, False, "捨てます"),
    ("捨てる", True, False, "捨てません"),
    ("捨てる", False, True, "捨てました"),
    ("捨てる", True, True, "捨てませんでした"),
    ("触れる", False, False, "触れます"),
    ("触れる", True, False, "触れません"),
    ("触れる", False, True, "触れました"),
    ("触れる", True, True, "触れませんでした"),
    ("消える", False, False, "消えます"),
    ("消える", True, False, "消えません"),
    ("消える", False, True, "消えました"),
    ("消える", True, True, "消えませんでした")
])

@ichidan_polite_cases
def test_ichidan_polite(verb, make_negative, make_past_tense, expected):
    assert_verb_type(verb, ICHIDAN)
    conjugated = conjugate(verb, "polite", make_negative, make_past_tense)
    assert conjugated == expected, f"[{verb}] Expected {expected}, got {conjugated}."