"""This file contains tests for the TextGeneration class."""

import sys

import pytest

import shap


@pytest.mark.skipif(sys.platform == 'win32', reason="Integer division bug in HuggingFace on Windows")
def test_call_function_text_generation():
    """Tests if target sentence from model and model wrapped in a function (mimics model agnostic scenario)
    produces the same ids.
    """
    torch = pytest.importorskip("torch")
    transformers = pytest.importorskip("transformers")

    name = "hf-internal-testing/tiny-random-BartModel"
    tokenizer = transformers.AutoTokenizer.from_pretrained(name)
    model = transformers.AutoModelForSeq2SeqLM.from_pretrained(name)

    # Define function
    def f(x):
        inputs = tokenizer(x.tolist(), return_tensors="pt", padding=True)
        with torch.no_grad():
            out = model.generate(**inputs)
        sentence = [tokenizer.decode(g, skip_special_tokens=True) for g in out]
        return sentence

    text_generation_for_pretrained_model = shap.models.TextGeneration(model, tokenizer=tokenizer, device='cpu')
    text_generation_for_model_agnostic_scenario = shap.models.TextGeneration(f, device='cpu')

    s = "This is a test statement for verifying text generation ids"

    target_sentence_ids_for_pretrained_model = text_generation_for_pretrained_model(s)
    target_sentence_for_pretrained_model = [tokenizer.decode(g, skip_special_tokens=True) for g in target_sentence_ids_for_pretrained_model]
    target_sentence_for_model_agnostic_scenario = text_generation_for_model_agnostic_scenario(s)

    assert target_sentence_for_pretrained_model[0] == target_sentence_for_model_agnostic_scenario[0]
