# Testing rgbimg module

import rgbimg, os, uu

from test.test_support import verbose, unlink, findfile

class error(Exception):
    pass

print 'RGBimg test suite:'

def testimg(rgb_file, raw_file):
    rgb_file = findfile(rgb_file)
    raw_file = findfile(raw_file)
    width, height = rgbimg.sizeofimage(rgb_file)
    rgb = rgbimg.longimagedata(rgb_file)
    if len(rgb) != width * height * 4:
        raise error, 'bad image length'
    raw = open(raw_file, 'rb').read()
    if rgb != raw:
        raise error, \
              'images don\'t match for '+rgb_file+' and '+raw_file
    for depth in [1, 3, 4]:
        rgbimg.longstoimage(rgb, width, height, depth, '@.rgb')
    os.unlink('@.rgb')

table = [
    ('testrgb'+os.extsep+'uue', 'test'+os.extsep+'rgb'),
    ('testimg'+os.extsep+'uue', 'test'+os.extsep+'rawimg'),
    ('testimgr'+os.extsep+'uue', 'test'+os.extsep+'rawimg'+os.extsep+'rev'),
    ]
for source, target in table:
    source = findfile(source)
    target = findfile(target)
    if verbose:
        print "uudecoding", source, "->", target, "..."
    uu.decode(source, target)

if verbose:
    print "testing..."

ttob = rgbimg.ttob(0)
if ttob != 0:
    raise error, 'ttob should start out as zero'

testimg('test'+os.extsep+'rgb', 'test'+os.extsep+'rawimg')

ttob = rgbimg.ttob(1)
if ttob != 0:
    raise error, 'ttob should be zero'

testimg('test'+os.extsep+'rgb', 'test'+os.extsep+'rawimg'+os.extsep+'rev')

ttob = rgbimg.ttob(0)
if ttob != 1:
    raise error, 'ttob should be one'

ttob = rgbimg.ttob(0)
if ttob != 0:
    raise error, 'ttob should be zero'

for source, target in table:
    unlink(findfile(target))
