diff --git a/Lib/test/test.rawimg b/Lib/test/test.rawimg
new file mode 100644
index 0000000..a6a0480
--- /dev/null
+++ b/Lib/test/test.rawimg
Binary files differ
diff --git a/Lib/test/test.rawimg.rev b/Lib/test/test.rawimg.rev
new file mode 100644
index 0000000..6565c8a
--- /dev/null
+++ b/Lib/test/test.rawimg.rev
Binary files differ
diff --git a/Lib/test/test.rgb b/Lib/test/test.rgb
new file mode 100644
index 0000000..5fe2994
--- /dev/null
+++ b/Lib/test/test.rgb
Binary files differ
diff --git a/Lib/test/test_audioop.py b/Lib/test/test_audioop.py
new file mode 100644
index 0000000..3acf1bf
--- /dev/null
+++ b/Lib/test/test_audioop.py
@@ -0,0 +1,202 @@
+# Test audioop.
+import audioop
+
+def gendata1():
+	return '\0\1\2'
+
+def gendata2():
+	if audioop.getsample('\0\1', 2, 0) == 1:
+		return '\0\0\0\1\0\2'
+	else:
+		return '\0\0\1\0\2\0'
+
+def gendata4():
+	if audioop.getsample('\0\0\0\1', 4, 0) == 1:
+		return '\0\0\0\0\0\0\0\1\0\0\0\2'
+	else:
+		return '\0\0\0\0\1\0\0\0\2\0\0\0'
+
+def testmax(data):
+	if audioop.max(data[0], 1) <> 2 or \
+		  audioop.max(data[1], 2) <> 2 or \
+		  audioop.max(data[2], 4) <> 2:
+		return 0
+	return 1
+
+def testmaxpp(data):
+	if audioop.maxpp(data[0], 1) <> 0 or \
+		  audioop.maxpp(data[1], 2) <> 0 or \
+		  audioop.maxpp(data[2], 4) <> 0:
+		return 0
+	return 1
+
+def testavg(data):
+	if audioop.avg(data[0], 1) <> 1 or \
+		  audioop.avg(data[1], 2) <> 1 or \
+		  audioop.avg(data[2], 4) <> 1:
+		return 0
+	return 1
+
+def testavgpp(data):
+	if audioop.avgpp(data[0], 1) <> 0 or \
+		  audioop.avgpp(data[1], 2) <> 0 or \
+		  audioop.avgpp(data[2], 4) <> 0:
+		return 0
+	return 1
+
+def testrms(data):
+	if audioop.rms(data[0], 1) <> 1 or \
+		  audioop.rms(data[1], 2) <> 1 or \
+		  audioop.rms(data[2], 4) <> 1:
+		return 0
+	return 1
+
+def testcross(data):
+	if audioop.cross(data[0], 1) <> 0 or \
+		  audioop.cross(data[1], 2) <> 0 or \
+		  audioop.cross(data[2], 4) <> 0:
+		return 0
+	return 1
+
+def testadd(data):
+	data2 = []
+	for d in data:
+		str = ''
+		for s in d:
+			str = str + chr(ord(s)*2)
+		data2.append(str)
+	if audioop.add(data[0], data[0], 1) <> data2[0] or \
+		  audioop.add(data[1], data[1], 2) <> data2[1] or \
+		  audioop.add(data[2], data[2], 4) <> data2[2]:
+		return 0
+	return 1
+
+def testbias(data):
+	# Note: this test assumes that avg() works
+	d1 = audioop.bias(data[0], 1, 100)
+	d2 = audioop.bias(data[1], 2, 100)
+	d4 = audioop.bias(data[2], 4, 100)
+	if audioop.avg(d1, 1) <> 101 or \
+		  audioop.avg(d2, 2) <> 101 or \
+		  audioop.avg(d4, 4) <> 101:
+		return 0
+	return 1
+
+def testlin2lin(data):
+	# too simple: we test only the size
+	for d1 in data:
+		for d2 in data:
+			got = len(d1)/3
+			wtd = len(d2)/3
+			if len(audioop.lin2lin(d1, got, wtd)) <> len(d2):
+				return 0
+	return 1
+
+def testadpcm2lin(data):
+	# Very cursory test
+	if audioop.adpcm2lin('\0\0', 1, None) <> ('\0\0\0\0', (0,0)):
+		return 0
+	return 1
+
+def testlin2adpcm(data):
+	# Very cursory test
+	if audioop.lin2adpcm('\0\0\0\0', 1, None) <> ('\0\0', (0,0)):
+		return 0
+	return 1
+
+def testlin2ulaw(data):
+	if audioop.lin2ulaw(data[0], 1) <> '\377\347\333' or \
+		  audioop.lin2ulaw(data[1], 2) <> '\377\377\377' or \
+		  audioop.lin2ulaw(data[2], 4) <> '\377\377\377':
+		return 0
+	return 1
+
+def testulaw2lin(data):
+	# Cursory
+	d = audioop.lin2ulaw(data[0], 1)
+	if audioop.ulaw2lin(d, 1) <> data[0]:
+		return 0
+	return 1
+
+def testmul(data):
+	data2 = []
+	for d in data:
+		str = ''
+		for s in d:
+			str = str + chr(ord(s)*2)
+		data2.append(str)
+	if audioop.mul(data[0], 1, 2) <> data2[0] or \
+		  audioop.mul(data[1],2, 2) <> data2[1] or \
+		  audioop.mul(data[2], 4, 2) <> data2[2]:
+		return 0
+	return 1
+
+def testreverse(data):
+	if audioop.reverse(data[0], 1) <> '\2\1\0':
+		return 0
+	return 1
+
+def testtomono(data):
+	data2 = ''
+	for d in data[0]:
+		data2 = data2 + d + d
+	if audioop.tomono(data2, 1, 0.5, 0.5) <> data[0]:
+		return 0
+	return 1
+
+def testtostereo(data):
+	data2 = ''
+	for d in data[0]:
+		data2 = data2 + d + d
+	if audioop.tostereo(data[0], 1, 1, 1) <> data2:
+		return 0
+	return 1
+
+def testfindfactor(data):
+	if audioop.findfactor(data[1], data[1]) <> 1.0:
+		return 0
+	return 1
+
+def testfindfit(data):
+	if audioop.findfit(data[1], data[1]) <> (0, 1.0):
+		return 0
+	return 1
+
+def testfindmax(data):
+	if audioop.findmax(data[1], 1) <> 2:
+		return 0
+	return 1
+
+def testgetsample(data):
+	for i in range(3):
+		if audioop.getsample(data[0], 1, i) <> i or \
+			  audioop.getsample(data[1], 2, i) <> i or \
+			  audioop.getsample(data[2], 4, i) <> i:
+			return 0
+	return 1
+
+def testone(name, data):
+	try:
+		func = eval('test'+name)
+	except NameError:
+		print 'No test found for audioop.'+name+'()'
+		return
+	try:
+		rv = func(data)
+	except 'xx':
+		print 'Test FAILED for audioop.'+name+'() (with an exception)'
+		return
+	if not rv:
+		print 'Test FAILED for audioop.'+name+'()'
+
+def testall():
+	data = [gendata1(), gendata2(), gendata4()]
+	names = dir(audioop)
+	# We know there is a routine 'add'
+	routines = []
+	for n in names:
+		if type(eval('audioop.'+n)) == type(audioop.add):
+			routines.append(n)
+	for n in routines:
+		testone(n, data)
+testall()
diff --git a/Lib/test/test_rgbimg.py b/Lib/test/test_rgbimg.py
new file mode 100644
index 0000000..7418e69
--- /dev/null
+++ b/Lib/test/test_rgbimg.py
@@ -0,0 +1,39 @@
+# Testing rgbimg module
+
+import rgbimg, os
+
+error = 'test_rgbimg.error'
+
+print 'RGBimg test suite:'
+
+def testimg(rgb_file, 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, 'r').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')
+
+ttob = rgbimg.ttob(0)
+if ttob != 0:
+	raise error, 'ttob should start out as zero'
+
+testimg('test.rgb', 'test.rawimg')
+
+ttob = rgbimg.ttob(1)
+if ttob != 0:
+	raise error, 'ttob should be zero'
+
+testimg('test.rgb', 'test.rawimg.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'
