import pytest

from spacy.tokens import Doc

FI_NP_TEST_EXAMPLES = [
    (
        "Kaksi tyttöä potkii punaista palloa",
        ["NUM", "NOUN", "VERB", "ADJ", "NOUN"],
        ["nummod", "nsubj", "ROOT", "amod", "obj"],
        [1, 1, 0, 1, -2],
        ["Kaksi tyttöä", "punaista palloa"],
    ),
    (
        "Erittäin vaarallinen leijona karkasi kiertävän sirkuksen eläintenkesyttäjältä",
        ["ADV", "ADJ", "NOUN", "VERB", "ADJ", "NOUN", "NOUN"],
        ["advmod", "amod", "nsubj", "ROOT", "amod", "nmod:poss", "obl"],
        [1, 1, 1, 0, 1, 1, -3],
        ["Erittäin vaarallinen leijona", "kiertävän sirkuksen eläintenkesyttäjältä"],
    ),
    (
        "Leijona raidallisine tassuineen piileksii Porin kaupungin lähellä",
        ["NOUN", "ADJ", "NOUN", "VERB", "PROPN", "NOUN", "ADP"],
        ["nsubj", "amod", "nmod", "ROOT", "nmod:poss", "obl", "case"],
        [3, 1, -2, 0, 1, -2, -1],
        ["Leijona raidallisine tassuineen", "Porin kaupungin"],
    ),
    (
        "Lounaalla nautittiin salaattia, maukasta kanaa ja raikasta vettä",
        ["NOUN", "VERB", "NOUN", "PUNCT", "ADJ", "NOUN", "CCONJ", "ADJ", "NOUN"],
        ["obl", "ROOT", "obj", "punct", "amod", "conj", "cc", "amod", "conj"],
        [1, 0, -1, 2, 1, -3, 2, 1, -6],
        ["Lounaalla", "salaattia", "maukasta kanaa", "raikasta vettä"],
    ),
    (
        "Minua houkuttaa maalle muuttaminen talven jälkeen",
        ["PRON", "VERB", "NOUN", "NOUN", "NOUN", "ADP"],
        ["obj", "ROOT", "nmod", "nsubj", "obl", "case"],
        [1, 0, 1, -2, -3, -1],
        ["maalle muuttaminen", "talven"],
    ),
    (
        "Päivän kohokohta oli vierailu museossa kummilasten kanssa",
        ["NOUN", "NOUN", "AUX", "NOUN", "NOUN", "NOUN", "ADP"],
        ["nmod:poss", "nsubj:cop", "cop", "ROOT", "nmod", "obl", "case"],
        [1, 2, 1, 0, -1, -2, -1],
        ["Päivän kohokohta", "vierailu museossa", "kummilasten"],
    ),
    (
        "Yrittäjät maksoivat tuomioistuimen määräämät korvaukset",
        ["NOUN", "VERB", "NOUN", "VERB", "NOUN"],
        ["nsubj", "ROOT", "nsubj", "acl", "obj"],
        [1, 0, 1, 1, -3],
        ["Yrittäjät", "tuomioistuimen", "korvaukset"],
    ),
    (
        "Julkisoikeudelliset tai niihin rinnastettavat saatavat ovat suoraan ulosottokelpoisia",
        ["ADJ", "CCONJ", "PRON", "VERB", "NOUN", "AUX", "ADV", "NOUN"],
        ["amod", "cc", "obl", "acl", "nsubj:cop", "cop", "advmod", "ROOT"],
        [4, 3, 1, 1, 3, 2, 1, 0],
        ["Julkisoikeudelliset tai niihin rinnastettavat saatavat", "ulosottokelpoisia"],
    ),
    (
        "Se oli ala-arvoista käytöstä kaikilta oppilailta, myös valvojaoppilailta",
        ["PRON", "AUX", "ADJ", "NOUN", "PRON", "NOUN", "PUNCT", "ADV", "NOUN"],
        ["nsubj:cop", "cop", "amod", "ROOT", "det", "nmod", "punct", "advmod", "appos"],
        [3, 2, 1, 0, 1, -2, 2, 1, -3],
        ["ala-arvoista käytöstä kaikilta oppilailta", "valvojaoppilailta"],
    ),
    (
        "Isä souti veneellä, jonka hän oli vuokrannut",
        ["NOUN", "VERB", "NOUN", "PUNCT", "PRON", "PRON", "AUX", "VERB"],
        ["nsubj", "ROOT", "obl", "punct", "obj", "nsubj", "aux", "acl:relcl"],
        [1, 0, -1, 4, 3, 2, 1, -5],
        ["Isä", "veneellä"],
    ),
    (
        "Kirja, jonka poimin hyllystä, kertoo norsuista",
        ["NOUN", "PUNCT", "PRON", "VERB", "NOUN", "PUNCT", "VERB", "NOUN"],
        ["nsubj", "punct", "obj", "acl:relcl", "obl", "punct", "ROOT", "obl"],
        [6, 2, 1, -3, -1, 1, 0, -1],
        ["Kirja", "hyllystä", "norsuista"],
    ),
    (
        "Huomenna on päivä, jota olemme odottaneet",
        ["NOUN", "AUX", "NOUN", "PUNCT", "PRON", "AUX", "VERB"],
        ["ROOT", "cop", "nsubj:cop", "punct", "obj", "aux", "acl:relcl"],
        [0, -1, -2, 3, 2, 1, -4],
        ["Huomenna", "päivä"],
    ),
    (
        "Liikkuvuuden lisääminen on yksi korkeakoulutuksen keskeisistä kehittämiskohteista",
        ["NOUN", "NOUN", "AUX", "PRON", "NOUN", "ADJ", "NOUN"],
        ["nmod:gobj", "nsubj:cop", "cop", "ROOT", "nmod:poss", "amod", "nmod"],
        [1, 2, 1, 0, 2, 1, -3],
        [
            "Liikkuvuuden lisääminen",
            "korkeakoulutuksen keskeisistä kehittämiskohteista",
        ],
    ),
    (
        "Kaupalliset palvelut jätetään yksityisten palveluntarjoajien tarjottavaksi",
        ["ADJ", "NOUN", "VERB", "ADJ", "NOUN", "NOUN"],
        ["amod", "obj", "ROOT", "amod", "nmod:gsubj", "obl"],
        [1, 1, 0, 1, 1, -3],
        ["Kaupalliset palvelut", "yksityisten palveluntarjoajien tarjottavaksi"],
    ),
    (
        "New York tunnetaan kaupunkina, joka ei koskaan nuku",
        ["PROPN", "PROPN", "VERB", "NOUN", "PUNCT", "PRON", "AUX", "ADV", "VERB"],
        [
            "obj",
            "flat:name",
            "ROOT",
            "obl",
            "punct",
            "nsubj",
            "aux",
            "advmod",
            "acl:relcl",
        ],
        [2, -1, 0, -1, 4, 3, 2, 1, -5],
        ["New York", "kaupunkina"],
    ),
    (
        "Loput vihjeet saat herra Möttöseltä",
        ["NOUN", "NOUN", "VERB", "NOUN", "PROPN"],
        ["compound:nn", "obj", "ROOT", "compound:nn", "obj"],
        [1, 1, 0, 1, -2],
        ["Loput vihjeet", "herra Möttöseltä"],
    ),
    (
        "mahdollisuus tukea muita päivystysyksiköitä",
        ["NOUN", "VERB", "PRON", "NOUN"],
        ["ROOT", "acl", "det", "obj"],
        [0, -1, 1, -2],
        ["mahdollisuus", "päivystysyksiköitä"],
    ),
    (
        "sairaanhoitopiirit harjoittavat leikkaustoimintaa alueellaan useammassa sairaalassa",
        ["NOUN", "VERB", "NOUN", "NOUN", "ADJ", "NOUN"],
        ["nsubj", "ROOT", "obj", "obl", "amod", "obl"],
        [1, 0, -1, -1, 1, -3],
        [
            "sairaanhoitopiirit",
            "leikkaustoimintaa",
            "alueellaan",
            "useammassa sairaalassa",
        ],
    ),
    (
        "Lain mukaan varhaiskasvatus on suunnitelmallista toimintaa",
        ["NOUN", "ADP", "NOUN", "AUX", "ADJ", "NOUN"],
        ["obl", "case", "nsubj:cop", "cop", "amod", "ROOT"],
        [5, -1, 3, 2, 1, 0],
        ["Lain", "varhaiskasvatus", "suunnitelmallista toimintaa"],
    ),
]


def test_noun_chunks_is_parsed(fi_tokenizer):
    """Test that noun_chunks raises Value Error for 'fi' language if Doc is not parsed.
    To check this test, we're constructing a Doc
    with a new Vocab here and forcing is_parsed to 'False'
    to make sure the noun chunks don't run.
    """
    doc = fi_tokenizer("Tämä on testi")
    with pytest.raises(ValueError):
        list(doc.noun_chunks)


@pytest.mark.parametrize(
    "text,pos,deps,heads,expected_noun_chunks", FI_NP_TEST_EXAMPLES
)
def test_fi_noun_chunks(fi_tokenizer, text, pos, deps, heads, expected_noun_chunks):
    tokens = fi_tokenizer(text)

    assert len(heads) == len(pos)
    doc = Doc(
        tokens.vocab,
        words=[t.text for t in tokens],
        heads=[head + i for i, head in enumerate(heads)],
        deps=deps,
        pos=pos,
    )

    noun_chunks = list(doc.noun_chunks)
    assert len(noun_chunks) == len(expected_noun_chunks)
    for i, np in enumerate(noun_chunks):
        assert np.text == expected_noun_chunks[i]
