# -*- coding: utf-8 -*-
"""
    MoinMoin - Test if MoinMoin.parser.* do write UNICODE objects

    @copyright: 2007 by Raphael Bossek <raphael.bossek@gmx.de>
    @license: GNU GPL, see COPYING for details.
"""

import unittest, sys, traceback
import MoinMoin.parser
from MoinMoin.Page import Page
from MoinMoin._tests import TestConfig

class TextParserOutput(unittest.TestCase):
    """Parser has to generate unicode output.
    """
    def testParserOutput(self):
        """MoinMoin.parser.text_xslt: Is generated output an unicode object...
        """
        self.assertEqual(self.request.cfg.allow_xslt, False, u'allow_xslt should be disabled')
        errmsg = []
        # Some examples we verify.
        parser_raw_input = {
            u'text_html': u'<html><body><h1>%s</h1></body></html>',
            u'text_irssi': u"[12:01] <RaphaelBosek> %s",
            u'text_moin_wiki': u'||<#fefefe> %s ||',
            u'text_python': u'if True: print "%s"',
            u'text_xslt': u'<?xml version="1.0" encoding="ISO-8859-1"?><!-- %s -->',
        }
        
        # Create a page if not already exists.
        if not u'page' in self.request.formatter.__dict__ or not self.request.formatter.page:
            self.request.formatter.page = Page(self.request, u'test_parser_unicode_page')
        
        # Check all parsers for UNICODE output.
        for parsername in MoinMoin.parser.modules:
            module = __import__(u'MoinMoin.parser', globals(), {}, [parsername])
            parsermodule = getattr(module, parsername)
            if u'Parser' in parsermodule.__dict__:
                i = parser_raw_input.get(parsername, u'%s') % u'\xC3\x84\xC3\x96\xC3\x9C\xC3\xE2\x82\xAC\x27'
                p = parsermodule.Parser(i, self.request)
                try:
                    r = self.request.redirectedOutput(p.format, self.request.formatter)
                except Exception, e:
                    sys.stderr.write(u"from MoinMoin.parser import " + parsername + u"\n")
                    raise

                if isinstance(r, str):
                    o = u'MoinMoin.parser.%s write string data instead of UNICODE: %s' % (parsername, r.encode(),)
                    errmsg.append(o)
                elif not isinstance(r, unicode):
                    o = u'MoinMoin.parser.%s does not write UNICODE data: %s' % (parsername, type(r),)
                    errmsg.append(o)

        if errmsg:
            o = u"\n" + u"\n".join(errmsg)
            self.fail(o.encode(sys.stdout.encoding))
