# Copyright David Abrahams 2004. Distributed under the Boost
# Software License, Version 1.0. (See accompanying
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
"""
>>> from slice_ext import *
>>> accept_slice(slice(1, None, (1,2)))
1
>>> try:
...     accept_slice(list((1,2)))
...     print "test failed"
... except:
...     print "test passed"
...
test passed
>>> try:
...     from Numeric import array
... except:
...     print 1
... else:
...     check_numeric_array_rich_slice('Numeric', 'ArrayType', lambda x:x)
...
1
>>> try:
...     from numarray import array, all
... except:
...     print 1
... else:
...     check_numeric_array_rich_slice('numarray', 'NDArray', all)
...
1
>>> import sys
>>> if sys.version_info[0] == 2 and sys.version_info[1] >= 3:
...     check_string_rich_slice()
... elif sys.version_info[0] > 2:
...     check_string_rich_slice()
... else:
...     print 1
...
1
>>> check_slice_get_indicies( slice(None))
0
>>> check_slice_get_indicies( slice(2,-2))
0
>>> check_slice_get_indicies( slice(2, None, 2))
5
>>> check_slice_get_indicies( slice(2, None, -1))
-12
>>> check_slice_get_indicies( slice( 20, None))
0
>>> check_slice_get_indicies( slice( -2, -5, -2))
6
"""

# Performs an affirmative and negative argument resolution check,
# checks the operation of extended slicing in Numeric arrays
#   (only performed if Numeric.array or numarray.array can be found).
# checks the operation of extended slicing in new strings (Python 2.3 only).

def run(args = None):
    import sys
    import doctest

    if args is not None:
        sys.argv = args
    return doctest.testmod(sys.modules.get(__name__))
    
if __name__ == '__main__':
    print "running..."
    import sys
    status = run()[0]
    if (status == 0): print "Done."
    sys.exit(status)
