#!/usr/bin/env python
from reduce import Reduce


class ReduceTest(Reduce):
    def __init__(self):
        # we do not want the super __init__ to be called
        # super().__init__('', '', '')
        pass

    def runtool(self, filedata=None):
        return True

    def writefile(self, filedata):
        pass

    def writebackupfile(self, filedata):
        pass


def test_removecomments():
    """make sure we keep the \n when removing a comment at the end of a line"""

    reduce = ReduceTest()

    filedata = [
        'int i; // some integer\n',
        'int j;\n'
    ]

    expected = [
        'int i;\n',
        'int j;\n'
    ]

    reduce.removecomments(filedata)
    assert filedata == expected


def test_removedirectives():
    """do not remove any of the #if*, #el* or #endif directives on their own"""

    reduce = ReduceTest()

    filedata = [
        '#if 0\n',
        '#else\n',
        '#endif\n',
        '#ifdef DEF\n',
        '#elif 0\n'
        '#endif\n'
    ]

    expected = [
        '#if 0\n',
        '#else\n',
        '#endif\n',
        '#ifdef DEF\n',
        '#elif 0\n'
        '#endif\n'
    ]

    reduce.removedirectives(filedata)
    assert filedata == expected


def test_combinelines_chunk():
    """do not fail with 'TypeError: slice indices must be integers or None or have an __index__ method'"""

    class ReduceTestFail(ReduceTest):
        def runtool(self, filedata=None):
            print(filedata)
            return False

    reduce = ReduceTestFail()

    # need to have at least 11 lines ending with comma to enter chunked mode and twice as much for second iteration
    filedata = [
        'int i,\n',
        'j,\n',
        'k,\n',
        'l,\n',
        'm,\n',
        'n,\n',
        'o,\n',
        'p,\n',
        'q,\n',
        'r,\n',
        's,\n',
        't;\n',
        'int i1,\n',
        'j1,\n',
        'k1,\n',
        'l1,\n',
        'm1,\n',
        'n1,\n',
        'o1,\n',
        'p1,\n',
        'q1,\n',
        'r1,\n',
        's1,\n',
        't1;\n'
    ]

    reduce.combinelines(filedata)


def test_combinelines_chunk_2():
    """'filedata' is not changed by the function since the data is assigned to a local variable"""

    reduce = ReduceTest()

    # need to have at least 11 lines ending with comma to enter chunked mode
    filedata = [
        'int i,\n',
        'j,\n',
        'k,\n',
        'l,\n',
        'm,\n',
        'n,\n',
        'o,\n',
        'p,\n',
        'q,\n',
        'r,\n',
        's,\n',
        't;\n'
    ]

    filedata2 = reduce.combinelines(filedata)
    assert filedata == filedata
    assert filedata2 == ['int i,j,\n',
                         '',
                         'l,\n',
                         'm,\n',
                         'n,\n',
                         'o,\n',
                         'p,\n',
                         'q,\n',
                         'r,\n',
                         's,\n',
                         't;\n',
                         '']