def dataunittest_transforms():
    from cellrename_data import CellRenameData, CellRenameItem

    def useFakeData(data, a):
        newdata = [CellRenameItem() for s in a]
        for i in range(len(a)):
            newdata[i].filename = newdata[i].newname = a[i]
        data.data = newdata

    def tostring(data):
        return '|'.join((item.newname for item in data.data))

    testNames1 = 'aa|bb.jpg|cc.Ok.jpg|dd.a'.split('|')
    test1 = CellRenameData('.', '*', False)
    expectEqual(len(test1.data) > 0, True)

    useFakeData(test1, testNames1)
    expectEqual(any((item.filename.endswith('.py') for item in test1.data)),
                False)
    test1.transformSuffixOrPrefix(False, 'suf')
    expectEqual(tostring(test1), 'aasuf|bbsuf.jpg|cc.Oksuf.jpg|ddsuf.a')
    useFakeData(test1, testNames1)
    test1.transformSuffixOrPrefix(True, 'pref')
    expectEqual(tostring(test1), 'prefaa|prefbb.jpg|prefcc.Ok.jpg|prefdd.a')

    useFakeData(test1, testNames1)
    test1.transformAppendNumber('1')
    expectEqual(tostring(test1), 'aa 1|bb 2.jpg|cc.Ok 3.jpg|dd 4.a')
    test1.transformAppendNumber('5')
    expectEqual(tostring(test1), 'aa 1 5|bb 2 6.jpg|cc.Ok 3 7.jpg|dd 4 8.a')
    useFakeData(test1, testNames1)
    test1.transformAppendNumber('000')
    expectEqual(tostring(test1), 'aa 000|bb 001.jpg|cc.Ok 002.jpg|dd 003.a')
    useFakeData(test1, testNames1)
    test1.transformAppendNumber('0098')
    expectEqual(tostring(test1),
                'aa 0098|bb 0099.jpg|cc.Ok 0100.jpg|dd 0101.a')

    useFakeData(test1, testNames1)
    test1.transformWithPattern('s')
    expectEqual(tostring(test1), 's|s.jpg|s.jpg|s.a')
    useFakeData(test1, testNames1)
    test1.transformWithPattern('a%na%n %u%u%f')
    expectEqual(
        tostring(test1),
        'a1a1 aaaaaa|a2a2 bbbbbb.jpg|a3a3 cc.okcc.okcc.Ok.jpg|a4a4 dddddd.a')
    useFakeData(test1, testNames1)
    test1.transformWithPattern('%N(%U)%N')
    expectEqual(tostring(test1), '1(AA)1|2(BB)2.jpg|3(CC.OK)3.jpg|4(DD)4.a')

    useFakeData(test1, testNames1)
    test1.transformReplace('A', 'C')
    test1.transformReplace(
        '.jpg',
        '.png')  # unlike the rest, this *should* be able to rename extensions
    expectEqual(tostring(test1), 'aa|bb.png|cc.Ok.png|dd.a')

    test2 = CellRenameData('.', '*', False)
    testNames2 = 'a(a|test(Athat|first,second|xx,yy,zz|cc.Ok.jpg|ccnOk.jpg|dd.a'.split(
        '|')
    useFakeData(test2, testNames2)
    test2.transformRegexReplace('(a', '_a', False,
                                False)  # not regex, case insensitive
    expectEqual(
        tostring(test2),
        'a_a|test_athat|first,second|xx,yy,zz|cc.Ok.jpg|ccnOk.jpg|dd.a')
    useFakeData(test2, testNames2)
    test2.transformRegexReplace('(a', '_a', False,
                                True)  # not regex, case sensitive
    expectEqual(
        tostring(test2),
        'a_a|test(Athat|first,second|xx,yy,zz|cc.Ok.jpg|ccnOk.jpg|dd.a')
    useFakeData(test2, testNames2)
    test2.transformRegexReplace('cc.Ok', 'match', False,
                                False)  # not regex, case sensitive
    expectEqual(
        tostring(test2),
        'a(a|test(Athat|first,second|xx,yy,zz|match.jpg|ccnOk.jpg|dd.a')
    useFakeData(test2, testNames2)
    test2.transformRegexReplace('cc.Ok', 'match', True,
                                False)  # is regex, case sensitive
    expectEqual(
        tostring(test2),
        'a(a|test(Athat|first,second|xx,yy,zz|match.jpg|match.jpg|dd.a')
    useFakeData(test2, testNames2)
    test2.transformRegexReplace(r'(\w+),(\w+)', r'\2-\1', True,
                                False)  # is regex, case sensitive
    expectEqual(
        tostring(test2),
        'a(a|test(Athat|second-first|yy-xx,zz|cc.Ok.jpg|ccnOk.jpg|dd.a')
def dataunittest_files():
    from cellrename_data import CellRenameData
    names = unittestsetup()

    def containsName(data, name):
        return any((item.filename == name for item in data.data))

    os.mkdir(os.path.join(dir, 'directory1'))
    os.mkdir(os.path.join(dir, 'directory.jpg'))
    os.mkdir(os.path.join(dir, '.hiddendirectory'))
    test1 = CellRenameData(dir, '*', True)
    expectEqual(len(test1.data),
                len(names) + 3 - 2)  # 2 begin with . and shouldn't be included
    expectEqual(containsName(test1, 'directory1'), True)
    expectEqual(containsName(test1, 'directory.jpg'), True)
    expectEqual(containsName(test1, '1'), True)
    expectEqual(containsName(test1, 'a picture.JPG'), True)
    expectEqual(containsName(test1, '.hiddendirectory'), False)
    expectEqual(containsName(test1, '.testhidden'), False)
    expectEqual(any((item.filename.startswith('.') for item in test1.data)),
                False)

    test2 = CellRenameData(dir, '*', False)
    expectEqual(containsName(test2, 'directory1'), False)
    expectEqual(containsName(test2, 'directory.jpg'), False)
    expectEqual(containsName(test2, '.testhidden'), False)
    expectEqual(containsName(test2, '.hiddendirectory'), False)
    expectEqual(containsName(test2, '1'), True)

    testFilter1 = CellRenameData(dir, '*.*', False)
    expectEqual(containsName(testFilter1, '1'), False)
    expectEqual(containsName(testFilter1, 'a picture.JPG'), True)
    expectEqual(containsName(testFilter1, '2.gif'), True)
    expectEqual(containsName(testFilter1, 'directory.jpg'), False)

    testFilter2 = CellRenameData(dir, '*.jp', False)
    expectEqual(containsName(testFilter2, 'a picture.JPG'), False)
    expectEqual(len(testFilter2.data), 0)

    # even on posix systems we want case-insensitive pattern matching.
    testFilter3 = CellRenameData(dir, '*.jpg', False)
    testFilter4 = CellRenameData(dir, '*.JpG', False)
    testFilter5 = CellRenameData(dir, '*.jp*', False)
    testFilter6 = CellRenameData(dir, '*.jp?', False)
    for filter in (testFilter3, testFilter4, testFilter5, testFilter6):
        expectEqual(containsName(filter, 'a picture.JPG'), True)
        expectEqual(containsName(filter, 'picture 2.jpg'), True)
        expectEqual(containsName(filter, 'picture and picture.jpG'), True)
        expectEqual(containsName(filter, 'the PiCture with caps.jpg'), True)
        expectEqual(containsName(filter, 'directory.jpg'), False)

    # test sorting
    testSort1 = CellRenameData(dir, '*', True)
    testSort1.sort('filename')
    expectEqual(testSort1.data[0].filename, '1')
    expectEqual(testSort1.data[1].filename, '2.gif')
    expectEqual(testSort1.data[-1].filename, 'the PiCture with caps.jpg')
    testSort1.sort('filename', True)  # reverse order
    expectEqual(testSort1.data[-1].filename, '1')
    expectEqual(testSort1.data[-2].filename, '2.gif')
    expectEqual(testSort1.data[0].filename, 'the PiCture with caps.jpg')

    fout = open(join(dir, 'a picture.JPG'), 'w')
    fout.write('a')
    fout.close()
    testSort1.refresh()
    testSort1.sort('size')
    expectEqual(testSort1.data[0].filename in ('directory1', 'directory.jpg'),
                True)  # directories always at top
    expectEqual(testSort1.data[1].filename in ('directory1', 'directory.jpg'),
                True)  # directories always at top
    expectEqual(testSort1.data[2].filename, 'a picture.JPG')