# -*- coding: utf-8 -*-
"""
    Tests for other lexers
    ~~~~~~~~~~~~~~~~~~~~~~

    :copyright: Copyright 2006-2020 by the Pygments team, see AUTHORS.
    :license: BSD, see LICENSE for details.
"""

import glob
import os

import pytest

from pygments.lexers import (
    EasytrieveLexer, GAPLexer, GDScriptLexer, JclLexer, RexxLexer, guess_lexer
)


def _example_file_path(filename):
    return os.path.join(os.path.dirname(__file__), 'examplefiles', filename)


@pytest.mark.parametrize('lexer', [
    EasytrieveLexer,
    JclLexer,
    RexxLexer,
])
def test_can_recognize_and_guess_example_files(lexer):
    for pattern in lexer.filenames:
        exampleFilesPattern = _example_file_path(pattern)
        for exampleFilePath in glob.glob(exampleFilesPattern):
            with open(exampleFilePath, 'rb') as fp:
                text = fp.read().decode('utf-8')
            probability = lexer.analyse_text(text)
            assert probability > 0, '%s must recognize %r' % (
                lexer.name, exampleFilePath)
            guessedLexer = guess_lexer(text)
            assert guessedLexer.name == lexer.name


def test_easytrieve_can_guess_from_text():
    assert EasytrieveLexer.analyse_text('MACRO')
    assert EasytrieveLexer.analyse_text('\nMACRO')
    assert EasytrieveLexer.analyse_text(' \nMACRO')
    assert EasytrieveLexer.analyse_text(' \n MACRO')
    assert EasytrieveLexer.analyse_text('*\nMACRO')
    assert EasytrieveLexer.analyse_text('*\n *\n\n \n*\n MACRO')


def test_rexx_can_guess_from_text():
    assert RexxLexer.analyse_text('/* */') == pytest.approx(0.01)
    assert RexxLexer.analyse_text('''/* Rexx */
            say "hello world"''') == pytest.approx(1.0)
    val = RexxLexer.analyse_text('/* */\n'
                                 'hello:pRoceduRe\n'
                                 '  say "hello world"')
    assert val > 0.5
    val = RexxLexer.analyse_text('''/* */
            if 1 > 0 then do
                say "ok"
            end
            else do
                say "huh?"
            end''')
    assert val > 0.2
    val = RexxLexer.analyse_text('''/* */
            greeting = "hello world!"
            parse value greeting "hello" name "!"
            say name''')
    assert val > 0.2


@pytest.mark.parametrize("file_path, lexer", [
    ("gdscript_example.gd", GDScriptLexer),
    ("example.gd", GAPLexer),
])
def test_chooses_correct_lexer_for_example_files(file_path, lexer):
    with open(_example_file_path(file_path), "rb") as fp:
        text = fp.read().decode("utf-8")
    guessed_lexer = guess_lexer(text)
    assert guessed_lexer.name == lexer.name
