diff --git a/Lib/dos-8x3/macurl2p.py b/Lib/dos-8x3/macurl2p.py
index 7d53d62..db4c599 100755
--- a/Lib/dos-8x3/macurl2p.py
+++ b/Lib/dos-8x3/macurl2p.py
@@ -44,8 +44,13 @@
     if '/' in pathname:
 	raise RuntimeError, "Cannot convert pathname containing slashes"
     components = string.split(pathname, ':')
+    # Remove empty first and/or last component
+    if components[0] == '':
+    	del components[0]
+    if components[-1] == '':
+    	del components[-1]
     # Replace empty string ('::') by .. (will result in '/../' later)
-    for i in range(1, len(components)):
+    for i in range(len(components)):
 	if components[i] == '':
 	    components[i] = '..'
     # Truncate names longer than 31 bytes
diff --git a/Lib/dos-8x3/test_aud.py b/Lib/dos-8x3/test_aud.py
index e966833..a03fe60 100755
--- a/Lib/dos-8x3/test_aud.py
+++ b/Lib/dos-8x3/test_aud.py
@@ -171,11 +171,12 @@
 
 def testratecv(data):
     if verbose:
-	print 'ratecv'
-    state = (-8000, ((256, 512),))
-    if audioop.ratecv(data[0], 1, 1, 8000, 16000, state) != \
-       ('\001\000\000\001\001\002', state):
-	return 0
+        print 'ratecv'
+    state = None
+    d1, state = audioop.ratecv(data[0], 1, 1, 8000, 16000, state)
+    d2, state = audioop.ratecv(data[0], 1, 1, 8000, 16000, state)
+    if d1 + d2 != '\000\000\001\001\002\001\000\000\001\001\002':
+        return 0
     return 1
 
 def testreverse(data):
diff --git a/Lib/dos-8x3/test_fcn.py b/Lib/dos-8x3/test_fcn.py
index 4929fbb..a5ea1e6 100644
--- a/Lib/dos-8x3/test_fcn.py
+++ b/Lib/dos-8x3/test_fcn.py
@@ -12,17 +12,17 @@
 
 # the example from the library docs
 f = open(filename,'w')
-rv = fcntl.fcntl(f.fileno(), FCNTL.O_NDELAY, 1)
+rv = fcntl.fcntl(f.fileno(), FCNTL.F_SETFL, os.O_NONBLOCK)
 if verbose:
-    print 'Status from fnctl with O_NDELAY: ', rv
+    print 'Status from fnctl with O_NONBLOCK: ', rv
     
 lockdata = struct.pack('hhllhh', FCNTL.F_WRLCK, 0, 0, 0, 0, 0)
 if verbose:
-    print 'struct.pack: ', lockdata
+    print 'struct.pack: ', `lockdata`
     
 rv = fcntl.fcntl(f.fileno(), FCNTL.F_SETLKW, lockdata)
 if verbose:
-    print 'String from fcntl with F_SETLKW: ', rv
+    print 'String from fcntl with F_SETLKW: ', `rv`
 
 f.close()
 os.unlink(filename)
diff --git a/Lib/dos-8x3/test_ima.py b/Lib/dos-8x3/test_ima.py
index f9108ef..77281ab 100644
--- a/Lib/dos-8x3/test_ima.py
+++ b/Lib/dos-8x3/test_ima.py
@@ -152,20 +152,13 @@
     return (image, sizes[0], sizes[1])
 
 def get_qualified_path(name):
-    """ return a more qualified path to name contructed from argv[1]"""
+    """ return a more qualified path to name"""
     import sys
     import os
-    import string
-    
-   # get a more qualified path component of the script...
-    if __name__ == '__main__':
-	ourname = sys.argv[0]
-    else: # ...or the full path of the module
-	ourname = sys.modules[__name__].__file__
-
-    parts = string.splitfields(ourname, os.sep)
-    parts[-1] = name
-    name = string.joinfields(parts, os.sep)
+    for dir in sys.path:
+	fullname = os.path.join(dir, name)
+	if os.path.exists(fullname):
+	    return fullname
     return name
 
 # rgbimg (unlike imgfile) is portable to platforms other than SGI.
diff --git a/Lib/dos-8x3/test_ope.py b/Lib/dos-8x3/test_ope.py
index ff4cba0..1a75065 100755
--- a/Lib/dos-8x3/test_ope.py
+++ b/Lib/dos-8x3/test_ope.py
@@ -1,77 +1,5 @@
-import operator
-import sys
-
-def test(name, input, output, *args):
-    print 'testing:', name
-    f = getattr(operator, name)
-    params = (input,) + args
-    try:
-	val = apply(f, params)
-    except:
-	val = sys.exc_type
-    if val <> output:
-	print '%s%s = %s: %s expected' % (f.__name__, params, `val`, `output`)
-
-test('abs', -1, 1)
-test('add', 3, 7, 4)
-test('and_', 0xf, 0xa, 0xa)
-test('concat', 'py', 'python', 'thon')
-
-test('countOf', [1, 2, 1, 3, 1, 4], 1, 3)
-
-a = [4, 3, 2, 1]
-test('delitem', a, None, 1)
-if a <> [4, 2, 1]:
-    print 'delitem() failed'
-
-a = range(10)
-test('delslice', a, None, 2, 8)
-if a <> [0, 1, 8, 9]:
-    print 'delslice() failed'
-
-a = range(10)
-test('div', 5, 2, 2)
-test('getitem', a, 2, 2)
-test('getslice', a, [4, 5], 4, 6)
-test('indexOf', [4, 3, 2, 1], 1, 3)
-test('inv', 4, -5)
-test('isCallable', 4, 0)
-test('isCallable', operator.isCallable, 1)
-test('isMappingType', operator.isMappingType, 0)
-test('isMappingType', operator.__dict__, 1)
-test('isNumberType', 8.3, 1)
-test('isNumberType', dir(), 0)
-test('isSequenceType', dir(), 1)
-test('isSequenceType', 'yeahbuddy', 1)
-test('isSequenceType', 3, 0)
-test('lshift', 5, 10, 1)
-test('mod', 5, 1, 2)
-test('mul', 5, 10, 2)
-test('neg', 5, -5)
-test('or_', 0xa, 0xf, 0x5)
-test('pos', -5, -5)
-
-a = range(3)
-test('repeat', a, a+a, 2)
-test('rshift', 5, 2, 1)
-
-test('sequenceIncludes', range(4), 1, 2)
-test('sequenceIncludes', range(4), 0, 5)
-
-test('setitem', a, None, 0, 2)
-if a <> [2, 1, 2]:
-    print 'setitem() failed'
-
-a = range(4)
-test('setslice', a, None, 1, 3, [2, 1])
-if a <> [0, 2, 1, 3]:
-    print 'setslice() failed:', a
-
-test('sub', 5, 2, 3)
-test('truth', 5, 1)
-test('truth', [], 0)
-test('xor', 0xb, 0x7, 0xc)
+# Python test set -- part 3, built-in operations.
 
 
-# some negative tests
-test('indexOf', [4, 3, 2, 1], ValueError, 9)
+print '3. Operations'
+print 'XXX Not yet implemented'
diff --git a/Lib/dos-8x3/test_reg.py b/Lib/dos-8x3/test_reg.py
index 9d25d92..078ca40 100644
--- a/Lib/dos-8x3/test_reg.py
+++ b/Lib/dos-8x3/test_reg.py
@@ -48,7 +48,7 @@
 print '__members__:', cre.__members__
 print 'regs:', cre.regs
 print 'last:', cre.last
-print 'translate:', `cre.translate`
+print 'translate:', len(cre.translate)
 print 'givenpat:', cre.givenpat
 
 print 'match with pos:', cre.match('hello world', 7)
diff --git a/Lib/dos-8x3/test_sel.py b/Lib/dos-8x3/test_sel.py
index 32ccfd1..85bfa41 100755
--- a/Lib/dos-8x3/test_sel.py
+++ b/Lib/dos-8x3/test_sel.py
@@ -35,9 +35,9 @@
 
 def test():
 	import sys
-	if sys.platform in ('win', 'mac'):
+	if sys.platform[:3] in ('win', 'mac'):
 		if verbose:
-			print "Can't test select easily"
+			print "Can't test select easily on", sys.platform
 		return
 	cmd = 'for i in 0 1 2 3 4 5 6 7 8 9; do echo testing...; sleep 1; done'
 	p = os.popen(cmd, 'r')
diff --git a/Lib/dos-8x3/test_soc.py b/Lib/dos-8x3/test_soc.py
index 1e157b9..1fe8c41 100644
--- a/Lib/dos-8x3/test_soc.py
+++ b/Lib/dos-8x3/test_soc.py
@@ -8,7 +8,7 @@
 #	sktobj.shutdown()
 
 
-from test_support import verbose
+from test_support import verbose, TestFailed
 import socket
 import os
 import time
@@ -22,13 +22,13 @@
 
 print socket.error
 
-print socket.AF_INET
+socket.AF_INET
 
-print socket.SOCK_STREAM
-print socket.SOCK_DGRAM
-print socket.SOCK_RAW
-print socket.SOCK_RDM
-print socket.SOCK_SEQPACKET
+socket.SOCK_STREAM
+socket.SOCK_DGRAM
+socket.SOCK_RAW
+socket.SOCK_RDM
+socket.SOCK_SEQPACKET
 
 for optional in ("AF_UNIX",
 
@@ -65,6 +65,7 @@
 		 ):
     missing_ok(optional)
 
+socktype = socket.socket_type
 hostname = socket.gethostname()
 ip = socket.gethostbyname(hostname)
 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
@@ -89,43 +90,45 @@
     pass
 
 
+canfork = hasattr(os, 'fork')
 try:
     PORT = 50007
-    if os.fork():
+    if not canfork or os.fork():
 	# parent is server
 	s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 	s.bind(hostname, PORT)
 	s.listen(1)
 	if verbose:
 	    print 'parent accepting'
-	conn, addr = s.accept()
-	if verbose:
-	    print 'connected by', addr
-	# couple of interesting tests while we've got a live socket
-	f = conn.fileno()
-	if verbose:
-	    print 'fileno:', f
-	p = conn.getpeername()
-	if verbose:
-	    print 'peer:', p
-	n = conn.getsockname()
-	if verbose:
-	    print 'sockname:', n
-	f = conn.makefile()
-	if verbose:
-	    print 'file obj:', f
-	while 1:
-	    data = conn.recv(1024)
-	    if not data:
-		break
+	if canfork:
+	    conn, addr = s.accept()
 	    if verbose:
-		print 'received:', data
-	    conn.send(data)
-	conn.close()
+		print 'connected by', addr
+	    # couple of interesting tests while we've got a live socket
+	    f = conn.fileno()
+	    if verbose:
+		print 'fileno:', f
+	    p = conn.getpeername()
+	    if verbose:
+		print 'peer:', p
+	    n = conn.getsockname()
+	    if verbose:
+		print 'sockname:', n
+	    f = conn.makefile()
+	    if verbose:
+		print 'file obj:', f
+	    while 1:
+		data = conn.recv(1024)
+		if not data:
+		    break
+		if verbose:
+		    print 'received:', data
+		conn.send(data)
+	    conn.close()
     else:
 	try:
 	    # child is client
-	    time.sleep(1)
+	    time.sleep(5)
 	    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 	    if verbose:
 		print 'child connecting'
@@ -138,5 +141,5 @@
 	    s.close()
 	finally:
 	    os._exit(1)
-except socket.error:
-    pass
+except socket.error, msg:
+    raise TestFailed, msg
diff --git a/Lib/dos-8x3/test_str.py b/Lib/dos-8x3/test_str.py
index f568970..efc98ff 100644
--- a/Lib/dos-8x3/test_str.py
+++ b/Lib/dos-8x3/test_str.py
@@ -1,128 +1,72 @@
-#! /usr/bin/env python
-
-# Sanity checker for time.strftime
-
-import time, calendar, sys, string, os
 from test_support import verbose
+import strop, sys
 
-def main():
-    global verbose
-    now = time.time()
-    strftest(now)
-    verbose = 0
-    # Try a bunch of dates and times,  chosen to vary through time of
-    # day and daylight saving time
-    for j in range(-5, 5):
-	for i in range(25):
-	    strftest(now + (i + j*100)*23*3603)
-
-def strftest(now):
+def test(name, input, output, *args):
     if verbose:
-	print "strftime test for", time.ctime(now)
-    nowsecs = int(now)
-    gmt = time.gmtime(now)
-    now = time.localtime(now)
+	print 'string.%s%s =? %s... ' % (name, (input,) + args, output),
+    f = getattr(strop, name)
+    try:
+	value = apply(f, (input,) + args)
+    except:
+	 value = sys.exc_type
+    if value != output:
+	if verbose:
+	    print 'no'
+	print f, `input`, `output`, `value`
+    else:
+	if verbose:
+	    print 'yes'
 
-    if now[3] < 12: ampm='AM'
-    else: ampm='PM'
+test('atoi', " 1 ", 1)
+test('atoi', " 1x", ValueError)
+test('atoi', " x1 ", ValueError)
+test('atol', "  1  ", 1L)
+test('atol', "  1x ", ValueError)
+test('atol', "  x1 ", ValueError)
+test('atof', "  1  ", 1.0)
+test('atof', "  1x ", ValueError)
+test('atof', "  x1 ", ValueError)
 
-    jan1 = time.localtime(time.mktime((now[0], 1, 1) + (0,)*6))
+test('capitalize', ' hello ', ' hello ')
+test('capitalize', 'hello ', 'Hello ')
+test('find', 'abcdefghiabc', 0, 'abc')
+test('find', 'abcdefghiabc', 9, 'abc', 1)
+test('find', 'abcdefghiabc', -1, 'def', 4)
+test('rfind', 'abcdefghiabc', 9, 'abc')
+test('lower', 'HeLLo', 'hello')
+test('upper', 'HeLLo', 'HELLO')
 
-    if now[8]: tz = time.tzname[1]
-    else: tz = time.tzname[0]
+transtable = '\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`xyzdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377'
 
-    if now[3] > 12: clock12 = now[3] - 12
-    elif now[3] > 0: clock12 = now[3]
-    else: clock12 = 12
+test('maketrans', 'abc', transtable, 'xyz')
+test('maketrans', 'abc', ValueError, 'xyzq')
 
-    expectations = (
-	('%A', calendar.day_name[now[6]], 'full weekday name'),
-	('%a', calendar.day_abbr[now[6]], 'abbreviated weekday name'),
-	('%B', calendar.month_name[now[1]], 'full month name'),
-	('%b', calendar.month_abbr[now[1]], 'abbreviated month name'),
-	('%h', calendar.month_abbr[now[1]], 'abbreviated month name'),
-	('%c', fixasctime(time.asctime(now)), 'near-asctime() format'),
-	('%D', '%02d/%02d/%02d' % (now[1], now[2], (now[0]%100)), 'mm/dd/yy'),
-	('%d', '%02d' % now[2], 'day of month as number (00-31)'),
-	('%e', '%2d' % now[2], 'day of month as number, blank padded ( 0-31)'),
-	('%H', '%02d' % now[3], 'hour (00-23)'),
-	('%I', '%02d' % clock12, 'hour (01-12)'),
-	('%j', '%03d' % now[7], 'julian day (001-366)'),
-	('%M', '%02d' % now[4], 'minute, (00-59)'),
-	('%m', '%02d' % now[1], 'month as number (01-12)'),
-	('%p', ampm, 'AM or PM as appropriate'),
-	('%R', '%02d:%02d' % (now[3], now[4]), '%H:%M'),
-	('%r', '%02d:%02d:%02d %s' % (clock12, now[4], now[5], ampm),
-	 '%I:%M:%S %p'),
-	('%S', '%02d' % now[5], 'seconds of current time (00-60)'),
-	('%T', '%02d:%02d:%02d' % (now[3], now[4], now[5]), '%H:%M:%S'),
-	('%X', '%02d:%02d:%02d' % (now[3], now[4], now[5]), '%H:%M:%S'),
-	('%U', '%02d' % ((now[7] + jan1[6])/7),
-	 'week number of the year (Sun 1st)'),
-	('%W', '%02d' % ((now[7] + (jan1[6] - 1)%7)/7),
-	 'week number of the year (Mon 1st)'),
-	('%w', '%d' % ((1+now[6]) % 7), 'weekday as a number (Sun 1st)'),
-	('%x', '%02d/%02d/%02d' % (now[1], now[2], (now[0]%100)),
-	 '%m/%d/%y %H:%M:%S'),
-	('%Y', '%d' % now[0], 'year with century'),
-	('%y', '%02d' % (now[0]%100), 'year without century'),
-	('%Z', tz, 'time zone name'),
-	('%%', '%', 'single percent sign'),
-	)
+test('split', 'this is the split function',
+     ['this', 'is', 'the', 'split', 'function'])
+test('split', 'a|b|c|d', ['a', 'b', 'c', 'd'], '|')
+test('split', 'a|b|c|d', ['a', 'b', 'c|d'], '|', 2)
 
-    nonstandard_expectations = (
-	('%C', '%02d' % (now[0]/100), 'century'),
-	    # This is for IRIX; on Solaris, %C yields date(1) format.
-	    # Tough.
-	('%k', '%2d' % now[3], 'hour, blank padded ( 0-23)'),
-	('%s', '%d' % nowsecs, 'seconds since the Epoch in UCT'),
-	('%3y', '%03d' % (now[0]%100),
-	 'year without century rendered using fieldwidth'),
-	('%n', '\n', 'newline character'),
-	('%t', '\t', 'tab character'),
-	)
+# join now works with any sequence type
+class Sequence:
+    def __init__(self): self.seq = 'wxyz'
+    def __len__(self): return len(self.seq)
+    def __getitem__(self, i): return self.seq[i]
 
-    if verbose:
-	print "Strftime test, platform: %s, Python version: %s" % \
-	      (sys.platform, string.split(sys.version)[0])
+test('join', ['a', 'b', 'c', 'd'], 'a b c d')
+test('join', ('a', 'b', 'c', 'd'), 'abcd', '')
+test('join', Sequence(), 'w x y z')
 
-    for e in expectations:
-	try:
-	    result = time.strftime(e[0], now)
-	except ValueError, error:
-	    print "Standard '%s' format gave error:" % e[0], error
-	    continue
-	if result == e[1]: continue
-	if result[0] == '%':
-	    print "Does not support standard '%s' format (%s)" % (e[0], e[2])
-	else:
-	    print "Conflict for %s (%s):" % (e[0], e[2])
-	    print "  Expected %s, but got %s" % (e[1], result)
+# try a few long ones
+print strop.join(['x' * 100] * 100, ':')
+print strop.join(('x' * 100,) * 100, ':')
 
-    for e in nonstandard_expectations:
-	try:
-	    result = time.strftime(e[0], now)
-	except ValueError, result:
-	    if verbose:
-		print "Error for nonstandard '%s' format (%s): %s" % \
-		      (e[0], e[2], str(error))
-	    continue
-	if result == e[1]:
-	    if verbose:
-		print "Supports nonstandard '%s' format (%s)" % (e[0], e[2])
-	elif result[0] == '%':
-	    if verbose:
-		print "Does not appear to support '%s' format (%s)" % (e[0],
-								       e[2])
-	else:
-	    if verbose:
-		print "Conflict for nonstandard '%s' format (%s):" % (e[0],
-								      e[2])
-		print "  Expected %s, but got %s" % (e[1], result)
+test('strip', '   hello   ', 'hello')
+test('lstrip', '   hello   ', 'hello   ')
+test('rstrip', '   hello   ', '   hello')
 
-def fixasctime(s):
-    if s[8] == ' ':
-	s = s[:8] + '0' + s[9:]
-    return s
+test('swapcase', 'HeLLo cOmpUteRs', 'hEllO CoMPuTErS')
+test('translate', 'xyzabcdef', 'xyzxyz', transtable, 'def')
 
-main()
+strop.whitespace
+strop.lowercase
+strop.uppercase
diff --git a/Lib/dos_8x3/macurl2p.py b/Lib/dos_8x3/macurl2p.py
index 7d53d62..db4c599 100755
--- a/Lib/dos_8x3/macurl2p.py
+++ b/Lib/dos_8x3/macurl2p.py
@@ -44,8 +44,13 @@
     if '/' in pathname:
 	raise RuntimeError, "Cannot convert pathname containing slashes"
     components = string.split(pathname, ':')
+    # Remove empty first and/or last component
+    if components[0] == '':
+    	del components[0]
+    if components[-1] == '':
+    	del components[-1]
     # Replace empty string ('::') by .. (will result in '/../' later)
-    for i in range(1, len(components)):
+    for i in range(len(components)):
 	if components[i] == '':
 	    components[i] = '..'
     # Truncate names longer than 31 bytes
diff --git a/Lib/dos_8x3/test_aud.py b/Lib/dos_8x3/test_aud.py
index e966833..a03fe60 100755
--- a/Lib/dos_8x3/test_aud.py
+++ b/Lib/dos_8x3/test_aud.py
@@ -171,11 +171,12 @@
 
 def testratecv(data):
     if verbose:
-	print 'ratecv'
-    state = (-8000, ((256, 512),))
-    if audioop.ratecv(data[0], 1, 1, 8000, 16000, state) != \
-       ('\001\000\000\001\001\002', state):
-	return 0
+        print 'ratecv'
+    state = None
+    d1, state = audioop.ratecv(data[0], 1, 1, 8000, 16000, state)
+    d2, state = audioop.ratecv(data[0], 1, 1, 8000, 16000, state)
+    if d1 + d2 != '\000\000\001\001\002\001\000\000\001\001\002':
+        return 0
     return 1
 
 def testreverse(data):
diff --git a/Lib/dos_8x3/test_fcn.py b/Lib/dos_8x3/test_fcn.py
index 4929fbb..a5ea1e6 100644
--- a/Lib/dos_8x3/test_fcn.py
+++ b/Lib/dos_8x3/test_fcn.py
@@ -12,17 +12,17 @@
 
 # the example from the library docs
 f = open(filename,'w')
-rv = fcntl.fcntl(f.fileno(), FCNTL.O_NDELAY, 1)
+rv = fcntl.fcntl(f.fileno(), FCNTL.F_SETFL, os.O_NONBLOCK)
 if verbose:
-    print 'Status from fnctl with O_NDELAY: ', rv
+    print 'Status from fnctl with O_NONBLOCK: ', rv
     
 lockdata = struct.pack('hhllhh', FCNTL.F_WRLCK, 0, 0, 0, 0, 0)
 if verbose:
-    print 'struct.pack: ', lockdata
+    print 'struct.pack: ', `lockdata`
     
 rv = fcntl.fcntl(f.fileno(), FCNTL.F_SETLKW, lockdata)
 if verbose:
-    print 'String from fcntl with F_SETLKW: ', rv
+    print 'String from fcntl with F_SETLKW: ', `rv`
 
 f.close()
 os.unlink(filename)
diff --git a/Lib/dos_8x3/test_ima.py b/Lib/dos_8x3/test_ima.py
index f9108ef..77281ab 100644
--- a/Lib/dos_8x3/test_ima.py
+++ b/Lib/dos_8x3/test_ima.py
@@ -152,20 +152,13 @@
     return (image, sizes[0], sizes[1])
 
 def get_qualified_path(name):
-    """ return a more qualified path to name contructed from argv[1]"""
+    """ return a more qualified path to name"""
     import sys
     import os
-    import string
-    
-   # get a more qualified path component of the script...
-    if __name__ == '__main__':
-	ourname = sys.argv[0]
-    else: # ...or the full path of the module
-	ourname = sys.modules[__name__].__file__
-
-    parts = string.splitfields(ourname, os.sep)
-    parts[-1] = name
-    name = string.joinfields(parts, os.sep)
+    for dir in sys.path:
+	fullname = os.path.join(dir, name)
+	if os.path.exists(fullname):
+	    return fullname
     return name
 
 # rgbimg (unlike imgfile) is portable to platforms other than SGI.
diff --git a/Lib/dos_8x3/test_ope.py b/Lib/dos_8x3/test_ope.py
index ff4cba0..1a75065 100755
--- a/Lib/dos_8x3/test_ope.py
+++ b/Lib/dos_8x3/test_ope.py
@@ -1,77 +1,5 @@
-import operator
-import sys
-
-def test(name, input, output, *args):
-    print 'testing:', name
-    f = getattr(operator, name)
-    params = (input,) + args
-    try:
-	val = apply(f, params)
-    except:
-	val = sys.exc_type
-    if val <> output:
-	print '%s%s = %s: %s expected' % (f.__name__, params, `val`, `output`)
-
-test('abs', -1, 1)
-test('add', 3, 7, 4)
-test('and_', 0xf, 0xa, 0xa)
-test('concat', 'py', 'python', 'thon')
-
-test('countOf', [1, 2, 1, 3, 1, 4], 1, 3)
-
-a = [4, 3, 2, 1]
-test('delitem', a, None, 1)
-if a <> [4, 2, 1]:
-    print 'delitem() failed'
-
-a = range(10)
-test('delslice', a, None, 2, 8)
-if a <> [0, 1, 8, 9]:
-    print 'delslice() failed'
-
-a = range(10)
-test('div', 5, 2, 2)
-test('getitem', a, 2, 2)
-test('getslice', a, [4, 5], 4, 6)
-test('indexOf', [4, 3, 2, 1], 1, 3)
-test('inv', 4, -5)
-test('isCallable', 4, 0)
-test('isCallable', operator.isCallable, 1)
-test('isMappingType', operator.isMappingType, 0)
-test('isMappingType', operator.__dict__, 1)
-test('isNumberType', 8.3, 1)
-test('isNumberType', dir(), 0)
-test('isSequenceType', dir(), 1)
-test('isSequenceType', 'yeahbuddy', 1)
-test('isSequenceType', 3, 0)
-test('lshift', 5, 10, 1)
-test('mod', 5, 1, 2)
-test('mul', 5, 10, 2)
-test('neg', 5, -5)
-test('or_', 0xa, 0xf, 0x5)
-test('pos', -5, -5)
-
-a = range(3)
-test('repeat', a, a+a, 2)
-test('rshift', 5, 2, 1)
-
-test('sequenceIncludes', range(4), 1, 2)
-test('sequenceIncludes', range(4), 0, 5)
-
-test('setitem', a, None, 0, 2)
-if a <> [2, 1, 2]:
-    print 'setitem() failed'
-
-a = range(4)
-test('setslice', a, None, 1, 3, [2, 1])
-if a <> [0, 2, 1, 3]:
-    print 'setslice() failed:', a
-
-test('sub', 5, 2, 3)
-test('truth', 5, 1)
-test('truth', [], 0)
-test('xor', 0xb, 0x7, 0xc)
+# Python test set -- part 3, built-in operations.
 
 
-# some negative tests
-test('indexOf', [4, 3, 2, 1], ValueError, 9)
+print '3. Operations'
+print 'XXX Not yet implemented'
diff --git a/Lib/dos_8x3/test_reg.py b/Lib/dos_8x3/test_reg.py
index 9d25d92..078ca40 100644
--- a/Lib/dos_8x3/test_reg.py
+++ b/Lib/dos_8x3/test_reg.py
@@ -48,7 +48,7 @@
 print '__members__:', cre.__members__
 print 'regs:', cre.regs
 print 'last:', cre.last
-print 'translate:', `cre.translate`
+print 'translate:', len(cre.translate)
 print 'givenpat:', cre.givenpat
 
 print 'match with pos:', cre.match('hello world', 7)
diff --git a/Lib/dos_8x3/test_sel.py b/Lib/dos_8x3/test_sel.py
index 32ccfd1..85bfa41 100755
--- a/Lib/dos_8x3/test_sel.py
+++ b/Lib/dos_8x3/test_sel.py
@@ -35,9 +35,9 @@
 
 def test():
 	import sys
-	if sys.platform in ('win', 'mac'):
+	if sys.platform[:3] in ('win', 'mac'):
 		if verbose:
-			print "Can't test select easily"
+			print "Can't test select easily on", sys.platform
 		return
 	cmd = 'for i in 0 1 2 3 4 5 6 7 8 9; do echo testing...; sleep 1; done'
 	p = os.popen(cmd, 'r')
diff --git a/Lib/dos_8x3/test_soc.py b/Lib/dos_8x3/test_soc.py
index 1e157b9..1fe8c41 100644
--- a/Lib/dos_8x3/test_soc.py
+++ b/Lib/dos_8x3/test_soc.py
@@ -8,7 +8,7 @@
 #	sktobj.shutdown()
 
 
-from test_support import verbose
+from test_support import verbose, TestFailed
 import socket
 import os
 import time
@@ -22,13 +22,13 @@
 
 print socket.error
 
-print socket.AF_INET
+socket.AF_INET
 
-print socket.SOCK_STREAM
-print socket.SOCK_DGRAM
-print socket.SOCK_RAW
-print socket.SOCK_RDM
-print socket.SOCK_SEQPACKET
+socket.SOCK_STREAM
+socket.SOCK_DGRAM
+socket.SOCK_RAW
+socket.SOCK_RDM
+socket.SOCK_SEQPACKET
 
 for optional in ("AF_UNIX",
 
@@ -65,6 +65,7 @@
 		 ):
     missing_ok(optional)
 
+socktype = socket.socket_type
 hostname = socket.gethostname()
 ip = socket.gethostbyname(hostname)
 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
@@ -89,43 +90,45 @@
     pass
 
 
+canfork = hasattr(os, 'fork')
 try:
     PORT = 50007
-    if os.fork():
+    if not canfork or os.fork():
 	# parent is server
 	s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 	s.bind(hostname, PORT)
 	s.listen(1)
 	if verbose:
 	    print 'parent accepting'
-	conn, addr = s.accept()
-	if verbose:
-	    print 'connected by', addr
-	# couple of interesting tests while we've got a live socket
-	f = conn.fileno()
-	if verbose:
-	    print 'fileno:', f
-	p = conn.getpeername()
-	if verbose:
-	    print 'peer:', p
-	n = conn.getsockname()
-	if verbose:
-	    print 'sockname:', n
-	f = conn.makefile()
-	if verbose:
-	    print 'file obj:', f
-	while 1:
-	    data = conn.recv(1024)
-	    if not data:
-		break
+	if canfork:
+	    conn, addr = s.accept()
 	    if verbose:
-		print 'received:', data
-	    conn.send(data)
-	conn.close()
+		print 'connected by', addr
+	    # couple of interesting tests while we've got a live socket
+	    f = conn.fileno()
+	    if verbose:
+		print 'fileno:', f
+	    p = conn.getpeername()
+	    if verbose:
+		print 'peer:', p
+	    n = conn.getsockname()
+	    if verbose:
+		print 'sockname:', n
+	    f = conn.makefile()
+	    if verbose:
+		print 'file obj:', f
+	    while 1:
+		data = conn.recv(1024)
+		if not data:
+		    break
+		if verbose:
+		    print 'received:', data
+		conn.send(data)
+	    conn.close()
     else:
 	try:
 	    # child is client
-	    time.sleep(1)
+	    time.sleep(5)
 	    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 	    if verbose:
 		print 'child connecting'
@@ -138,5 +141,5 @@
 	    s.close()
 	finally:
 	    os._exit(1)
-except socket.error:
-    pass
+except socket.error, msg:
+    raise TestFailed, msg
diff --git a/Lib/dos_8x3/test_str.py b/Lib/dos_8x3/test_str.py
index f568970..efc98ff 100644
--- a/Lib/dos_8x3/test_str.py
+++ b/Lib/dos_8x3/test_str.py
@@ -1,128 +1,72 @@
-#! /usr/bin/env python
-
-# Sanity checker for time.strftime
-
-import time, calendar, sys, string, os
 from test_support import verbose
+import strop, sys
 
-def main():
-    global verbose
-    now = time.time()
-    strftest(now)
-    verbose = 0
-    # Try a bunch of dates and times,  chosen to vary through time of
-    # day and daylight saving time
-    for j in range(-5, 5):
-	for i in range(25):
-	    strftest(now + (i + j*100)*23*3603)
-
-def strftest(now):
+def test(name, input, output, *args):
     if verbose:
-	print "strftime test for", time.ctime(now)
-    nowsecs = int(now)
-    gmt = time.gmtime(now)
-    now = time.localtime(now)
+	print 'string.%s%s =? %s... ' % (name, (input,) + args, output),
+    f = getattr(strop, name)
+    try:
+	value = apply(f, (input,) + args)
+    except:
+	 value = sys.exc_type
+    if value != output:
+	if verbose:
+	    print 'no'
+	print f, `input`, `output`, `value`
+    else:
+	if verbose:
+	    print 'yes'
 
-    if now[3] < 12: ampm='AM'
-    else: ampm='PM'
+test('atoi', " 1 ", 1)
+test('atoi', " 1x", ValueError)
+test('atoi', " x1 ", ValueError)
+test('atol', "  1  ", 1L)
+test('atol', "  1x ", ValueError)
+test('atol', "  x1 ", ValueError)
+test('atof', "  1  ", 1.0)
+test('atof', "  1x ", ValueError)
+test('atof', "  x1 ", ValueError)
 
-    jan1 = time.localtime(time.mktime((now[0], 1, 1) + (0,)*6))
+test('capitalize', ' hello ', ' hello ')
+test('capitalize', 'hello ', 'Hello ')
+test('find', 'abcdefghiabc', 0, 'abc')
+test('find', 'abcdefghiabc', 9, 'abc', 1)
+test('find', 'abcdefghiabc', -1, 'def', 4)
+test('rfind', 'abcdefghiabc', 9, 'abc')
+test('lower', 'HeLLo', 'hello')
+test('upper', 'HeLLo', 'HELLO')
 
-    if now[8]: tz = time.tzname[1]
-    else: tz = time.tzname[0]
+transtable = '\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`xyzdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377'
 
-    if now[3] > 12: clock12 = now[3] - 12
-    elif now[3] > 0: clock12 = now[3]
-    else: clock12 = 12
+test('maketrans', 'abc', transtable, 'xyz')
+test('maketrans', 'abc', ValueError, 'xyzq')
 
-    expectations = (
-	('%A', calendar.day_name[now[6]], 'full weekday name'),
-	('%a', calendar.day_abbr[now[6]], 'abbreviated weekday name'),
-	('%B', calendar.month_name[now[1]], 'full month name'),
-	('%b', calendar.month_abbr[now[1]], 'abbreviated month name'),
-	('%h', calendar.month_abbr[now[1]], 'abbreviated month name'),
-	('%c', fixasctime(time.asctime(now)), 'near-asctime() format'),
-	('%D', '%02d/%02d/%02d' % (now[1], now[2], (now[0]%100)), 'mm/dd/yy'),
-	('%d', '%02d' % now[2], 'day of month as number (00-31)'),
-	('%e', '%2d' % now[2], 'day of month as number, blank padded ( 0-31)'),
-	('%H', '%02d' % now[3], 'hour (00-23)'),
-	('%I', '%02d' % clock12, 'hour (01-12)'),
-	('%j', '%03d' % now[7], 'julian day (001-366)'),
-	('%M', '%02d' % now[4], 'minute, (00-59)'),
-	('%m', '%02d' % now[1], 'month as number (01-12)'),
-	('%p', ampm, 'AM or PM as appropriate'),
-	('%R', '%02d:%02d' % (now[3], now[4]), '%H:%M'),
-	('%r', '%02d:%02d:%02d %s' % (clock12, now[4], now[5], ampm),
-	 '%I:%M:%S %p'),
-	('%S', '%02d' % now[5], 'seconds of current time (00-60)'),
-	('%T', '%02d:%02d:%02d' % (now[3], now[4], now[5]), '%H:%M:%S'),
-	('%X', '%02d:%02d:%02d' % (now[3], now[4], now[5]), '%H:%M:%S'),
-	('%U', '%02d' % ((now[7] + jan1[6])/7),
-	 'week number of the year (Sun 1st)'),
-	('%W', '%02d' % ((now[7] + (jan1[6] - 1)%7)/7),
-	 'week number of the year (Mon 1st)'),
-	('%w', '%d' % ((1+now[6]) % 7), 'weekday as a number (Sun 1st)'),
-	('%x', '%02d/%02d/%02d' % (now[1], now[2], (now[0]%100)),
-	 '%m/%d/%y %H:%M:%S'),
-	('%Y', '%d' % now[0], 'year with century'),
-	('%y', '%02d' % (now[0]%100), 'year without century'),
-	('%Z', tz, 'time zone name'),
-	('%%', '%', 'single percent sign'),
-	)
+test('split', 'this is the split function',
+     ['this', 'is', 'the', 'split', 'function'])
+test('split', 'a|b|c|d', ['a', 'b', 'c', 'd'], '|')
+test('split', 'a|b|c|d', ['a', 'b', 'c|d'], '|', 2)
 
-    nonstandard_expectations = (
-	('%C', '%02d' % (now[0]/100), 'century'),
-	    # This is for IRIX; on Solaris, %C yields date(1) format.
-	    # Tough.
-	('%k', '%2d' % now[3], 'hour, blank padded ( 0-23)'),
-	('%s', '%d' % nowsecs, 'seconds since the Epoch in UCT'),
-	('%3y', '%03d' % (now[0]%100),
-	 'year without century rendered using fieldwidth'),
-	('%n', '\n', 'newline character'),
-	('%t', '\t', 'tab character'),
-	)
+# join now works with any sequence type
+class Sequence:
+    def __init__(self): self.seq = 'wxyz'
+    def __len__(self): return len(self.seq)
+    def __getitem__(self, i): return self.seq[i]
 
-    if verbose:
-	print "Strftime test, platform: %s, Python version: %s" % \
-	      (sys.platform, string.split(sys.version)[0])
+test('join', ['a', 'b', 'c', 'd'], 'a b c d')
+test('join', ('a', 'b', 'c', 'd'), 'abcd', '')
+test('join', Sequence(), 'w x y z')
 
-    for e in expectations:
-	try:
-	    result = time.strftime(e[0], now)
-	except ValueError, error:
-	    print "Standard '%s' format gave error:" % e[0], error
-	    continue
-	if result == e[1]: continue
-	if result[0] == '%':
-	    print "Does not support standard '%s' format (%s)" % (e[0], e[2])
-	else:
-	    print "Conflict for %s (%s):" % (e[0], e[2])
-	    print "  Expected %s, but got %s" % (e[1], result)
+# try a few long ones
+print strop.join(['x' * 100] * 100, ':')
+print strop.join(('x' * 100,) * 100, ':')
 
-    for e in nonstandard_expectations:
-	try:
-	    result = time.strftime(e[0], now)
-	except ValueError, result:
-	    if verbose:
-		print "Error for nonstandard '%s' format (%s): %s" % \
-		      (e[0], e[2], str(error))
-	    continue
-	if result == e[1]:
-	    if verbose:
-		print "Supports nonstandard '%s' format (%s)" % (e[0], e[2])
-	elif result[0] == '%':
-	    if verbose:
-		print "Does not appear to support '%s' format (%s)" % (e[0],
-								       e[2])
-	else:
-	    if verbose:
-		print "Conflict for nonstandard '%s' format (%s):" % (e[0],
-								      e[2])
-		print "  Expected %s, but got %s" % (e[1], result)
+test('strip', '   hello   ', 'hello')
+test('lstrip', '   hello   ', 'hello   ')
+test('rstrip', '   hello   ', '   hello')
 
-def fixasctime(s):
-    if s[8] == ' ':
-	s = s[:8] + '0' + s[9:]
-    return s
+test('swapcase', 'HeLLo cOmpUteRs', 'hEllO CoMPuTErS')
+test('translate', 'xyzabcdef', 'xyzxyz', transtable, 'def')
 
-main()
+strop.whitespace
+strop.lowercase
+strop.uppercase
