test_component_encoding.py :  » Template-Engines » Myghty » Myghty-1.1 » test » Python Open Source

Home
Python Open Source
1.3.1.2 Python
2.Ajax
3.Aspect Oriented
4.Blog
5.Build
6.Business Application
7.Chart Report
8.Content Management Systems
9.Cryptographic
10.Database
11.Development
12.Editor
13.Email
14.ERP
15.Game 2D 3D
16.GIS
17.GUI
18.IDE
19.Installer
20.IRC
21.Issue Tracker
22.Language Interface
23.Log
24.Math
25.Media Sound Audio
26.Mobile
27.Network
28.Parser
29.PDF
30.Project Management
31.RSS
32.Search
33.Security
34.Template Engines
35.Test
36.UML
37.USB Serial
38.Web Frameworks
39.Web Server
40.Web Services
41.Web Unit
42.Wiki
43.Windows
44.XML
Python Open Source » Template Engines » Myghty 
Myghty » Myghty 1.1 » test » test_component_encoding.py
# test/component_encoding.py
"""Test that component's encodings are determined correctly.
"""
import unittest, os, shutil, sys, warnings, random, StringIO, time, codecs, re

import testbase
from myghty.interp import Interpreter
from myghty.resolver import NotFound
from myghty import importer,exception

some_encodings = """ascii
                    big5 big5hkscs
                    cp037 cp424 cp437 cp500 cp737 cp775 cp850
                    cp852 cp855 cp856 cp857 cp860 cp861 cp862
                    cp863 cp864 cp865 cp866 cp869 cp874 cp875
                    cp932 cp949 cp950 cp1006 cp1026 cp1140 cp1250
                    cp1251 cp1252 cp1253 cp1254 cp1255 cp1256 cp1257 cp1258
                    euc_jp euc_jis_2004 euc_jisx0213 euc_kr
                    gb2312 gbk gb18030 hz
                    iso2022_jp iso2022_jp_1 iso2022_jp_2 iso2022_jp_2004
                    iso2022_jp_3 iso2022_jp_ext
                    iso2022_kr
                    latin_1
                    iso8859_2 iso8859_3 iso8859_4 iso8859_5 iso8859_6
                    iso8859_7 iso8859_8 iso8859_9 iso8859_10 iso8859_13
                    iso8859_14 iso8859_15
                    johab
                    koi8_r koi8_u
                    mac_cyrillic mac_greek mac_iceland
                    mac_latin2 mac_roman mac_turkish
                    ptcp154
                    shift_jis shift_jis_2004 shift_jisx0213
                    utf_16 utf_16_be utf_16_le utf_7""".split()

def isAsciiSuperset(encoding):
    ascii_chars = ''.join(map(chr, range(0x80)))
    try:
        return ascii_chars.decode(encoding) == ascii_chars.decode('ascii')
    except (ValueError, LookupError):
        return False

some_encodings = [ enc for enc in some_encodings
                   if isAsciiSuperset(enc) and enc != sys.getdefaultencoding()
                   ]
random.shuffle(some_encodings)

def random_encoding():
    enc = some_encodings.pop()
    some_encodings.insert(0, enc)
    return enc

def parse_magic_comment(text):
    m = re.match(r'(?:#.*\n)?#.*coding[:=][ \t]*([-\w.]+)', text)
    if m:
        return m.group(1)
    return None
        
def resetwarnings():
    warnings.resetwarnings()
    try:
        import myghty.compiler
        del myghty.compiler.__warningregistry__
    except AttributeError:
        pass

        
class FileComponentEncodingTests(testbase.ComponentTester):
        
    def getComponent(self, head=""):
        return self.makeFileBasedComponent(head + "\nbody\n")

        
    def getCompiled(self, head=""):
        """Get the python source for the compiled component.
        """
        return self._getCompiledFromComp(self.getComponent(head))

    def _getCompiledFromComp(self, comp):
        return file(comp.component_source.module.__file__).read()
        
    def failUnlessComponentEncodingEqual(self, comp, encoding):
        #self.failUnlessEqual(comp.component_source.module._ENCODING,
        #                     Encoding(encoding))
        compiled = self._getCompiledFromComp(comp)
        enc = parse_magic_comment(compiled) or sys.getdefaultencoding()
        self.failUnlessEqual(enc, encoding)
        self.failUnlessEqual(codecs.lookup(enc), codecs.lookup(encoding))


    def testSystemDefaultEncoding(self):
        """Test that component get system default encoding when appropriate.
        """
        comp = self.getComponent()
        self.failUnlessComponentEncodingEqual(comp, sys.getdefaultencoding())

    def testExplicitEncoding(self):
        """Test that component gets encoding from magic comment.
        """
        enc = random_encoding()
        comp = self.getComponent(head = "# encoding: %s\n" % enc)
        self.failUnlessComponentEncodingEqual(comp, enc)

    def testEncodingFromBOM(self):
        """Test that UTF-8 BOM results in utf-8 encoding
        """
        comp = self.getComponent(head = codecs.BOM_UTF8)
        self.failUnlessComponentEncodingEqual(comp, 'utf_8')

    def testBadEncodingFromBOM(self):
        """Test that UTF-8 BOM results in utf-8 encoding
        """
        expected = (SyntaxError,        # For bad module source
                    exception.Syntax,   # For bad file component source
                    exception.ConfigurationError # XXX: Bad module root?
                    )
        self.failUnlessRaises(expected,
                              self.getComponent,
                              head = codecs.BOM_UTF8 + "# encoding: ascii\n"
                              )

    def testEncodingFromFlagsEncoding(self):
        """Test that ``<%flags> encoding`` still works.
        """
        warnings.filterwarnings("ignore",
                                category=DeprecationWarning,
                                module=r'myghty\.compiler')
        enc = random_encoding()
        comp = self.getComponent("<%%flags> encoding = %s </%%flags>\n"
                                 % repr(enc))
        self.failUnlessComponentEncodingEqual(comp, enc)

    def x_testFlagsEncodingWarning(self):
        """Test that ``<%flags> encoding`` results in a warning.
        """
        resetwarnings()
        warnings.filterwarnings("error",
                                category=DeprecationWarning,
                                module=r'myghty\.compiler')
        self.failUnlessRaises(DeprecationWarning,
                              self.getComponent,
                              "<%flags> encoding='ascii' </%flags>\n")
        
    def testMagicCommentAndFlagsEncodingIsError(self):
        """Specifying a magic comment and an encoding flag is an error.

        Test that specifying a magic comment and a ``<%flags> encoding``
        is an error.
        """
        warnings.filterwarnings("ignore",
                                category=DeprecationWarning,
                                module=r'myghty\.compiler')
        self.failUnlessRaises(exception.Syntax,
                              self.getComponent,
                              head="# encoding: latin1\n"
                              "<%flags> encoding='ascii' </%flags>\n")

    def testMagicCommentInCompiledComponent(self):
        """Test that the magic comment get generated in compiled code.
        """
        encoding = random_encoding()
        compiled = self.getCompiled("# -*- encoding: %s -*-\n" % encoding)
        self.failUnlessEqual(parse_magic_comment(compiled), encoding)

    def testNoMagicCommentInCompiledComponent(self):
        """Test that the magic comment doesn't get generated if there's
        no magic comment in the source file.
        """
        compiled = self.getCompiled()
        self.failUnlessEqual(parse_magic_comment(compiled), None)


class MemoryComponentEncodingTests(FileComponentEncodingTests):

    def getComponent(self, head=""):
        return self.makeMemoryComponent(head + "\nbody\n")

    def _getCompiledFromComp(self, comp):
        buf = StringIO.StringIO()
        comp.component_source.get_object_code(self.interpreter.compiler.get(),
                                              buf)
        return buf.getvalue()

if __name__ == '__main__':
    runner = unittest.TextTestRunner(verbosity=2, descriptions=False)
    unittest.main(testRunner=runner)
www.java2java.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.