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

    :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
    :license: BSD, see LICENSE for details.
"""
import glob
import os
import unittest

from pygments.lexers import guess_lexer
from pygments.lexers.scripting import EasytrieveLexer, JclLexer, RexxLexer


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


class AnalyseTextTest(unittest.TestCase):
    def _testCanRecognizeAndGuessExampleFiles(self, lexer):
        assert lexer is not None

        for pattern in lexer.filenames:
            exampleFilesPattern = _exampleFilePath(pattern)
            for exampleFilePath in glob.glob(exampleFilesPattern):
                with open(exampleFilePath, 'rb') as fp:
                    text = fp.read().decode('utf-8')
                probability = lexer.analyse_text(text)
                self.assertTrue(probability > 0,
                                '%s must recognize %r' % (
                                    lexer.name, exampleFilePath))
                guessedLexer = guess_lexer(text)
                self.assertEqual(guessedLexer.name, lexer.name)

    def testCanRecognizeAndGuessExampleFiles(self):
        LEXERS_TO_TEST = [
            EasytrieveLexer,
            JclLexer,
            RexxLexer,
        ]
        for lexerToTest in LEXERS_TO_TEST:
            self._testCanRecognizeAndGuessExampleFiles(lexerToTest)


class EasyTrieveLexerTest(unittest.TestCase):
    def testCanGuessFromText(self):
        self.assertTrue(EasytrieveLexer.analyse_text('MACRO'))
        self.assertTrue(EasytrieveLexer.analyse_text('\nMACRO'))
        self.assertTrue(EasytrieveLexer.analyse_text(' \nMACRO'))
        self.assertTrue(EasytrieveLexer.analyse_text(' \n MACRO'))
        self.assertTrue(EasytrieveLexer.analyse_text('*\nMACRO'))
        self.assertTrue(EasytrieveLexer.analyse_text(
            '*\n *\n\n \n*\n MACRO'))


class RexxLexerTest(unittest.TestCase):
    def testCanGuessFromText(self):
        self.assertAlmostEqual(0.01, RexxLexer.analyse_text('/* */'))
        self.assertAlmostEqual(1.0,
                               RexxLexer.analyse_text('''/* Rexx */
                say "hello world"'''))
        val = RexxLexer.analyse_text('/* */\n'
                                     'hello:pRoceduRe\n'
                                     '  say "hello world"')
        self.assertTrue(val > 0.5, val)
        val = RexxLexer.analyse_text('''/* */
                if 1 > 0 then do
                    say "ok"
                end
                else do
                    say "huh?"
                end''')
        self.assertTrue(val > 0.2, val)
        val = RexxLexer.analyse_text('''/* */
                greeting = "hello world!"
                parse value greeting "hello" name "!"
                say name''')
        self.assertTrue(val > 0.2, val)
