# -*- coding: utf-8 -*-
"""test utils for tests of examples

A module to test must have:

- main(): a method
- EXPOUT: string which contains expected output
- EXPERR: string which contains expected error output
"""
__all__ = ['TestUtil']

import logging
import os
import io
import sys

import cssutils

PY2x = sys.version_info < (3,0)

class OutReplacement(object):
    "io.StringIO does not work somehow?!"
    def __init__(self):
        self.t = ''
        
    def write(self, t):
        if not PY2x:
            # py3 hack
            if t.startswith('b') and t.endswith("'"):
                t = t[2:-1]
                
        self.t += t
        
    def getvalue(self):
        if not PY2x:
            # py3 hack
            self.t = self.t.replace('\\n', '\n')
            self.t = self.t.replace('\\\\', '\\')
            
        return self.t
    

class TestUtil(object):
    def __init__(self):
        "init out and err to catch both"
        self._out = OutReplacement()#StringIO()
        sys.stdout = self._out
        
        self._err = io.StringIO()
        hdlr = logging.StreamHandler(self._err)
        cssutils.log._log.addHandler(hdlr)
                
    def end(self, expo, expe):
        "return out, err"
        sys.stdout = sys.__stdout__

        out = self._out.getvalue()
        err = self._err.getvalue()

        ok = (out == expo and err == expe)
        if not ok:
            print()
            if out != expo:
                print('### out:\n%r\n### != expout:\n%r\n' % (out, expo))
            else:
                print('### err:\n%r\n### != experr:\n%r\n' % (err, expe))
        return ok

modules = 0
errors = 0

def mod(module):
    global modules, errors
    modules += 1
    t = TestUtil()
    module.main()
    ok = t.end(module.EXPOUT, module.EXPERR)
    if not ok:
        errors += 1
    print('---', ok, ':', os.path.basename(module.__file__))
    print()

def main():
    if PY2x:
        print("DOCTESTS:::::::::::::")
        # doctests
        import website
        import doctest
        doctest.testmod(website)
        print()
        print(80*'-')
        print()
        print()

    global modules, errors
    
    import build
    mod(build)
    import customlog
    mod(customlog)
    import imports
    mod(imports) 
    import parse
    mod(parse)
    import selectors_tolower
    mod(selectors_tolower)

    import cssencodings
    mod(cssencodings)
    
    import minify
    mod(minify)
    
    print()
    print(80*'-')
    print('Ran %i tests (%i errors).' % (modules, errors))
    if PY2x:
        print('**Check doctest results above!**')
    else:
        print('doctests do not work in Python 3 (yet?)!')
          
    
if __name__ == '__main__':
    main()
