"""Unit tests for buffer objects.

For now, tests just new or changed functionality.

"""

import copy
import pickle
import sys
import unittest
from test import test_support

class BufferTests(unittest.TestCase):

    def test_extended_getslice(self):
        # Test extended slicing by comparing with list slicing.
        s = "".join(chr(c) for c in list(range(255, -1, -1)))
        b = buffer(s)
        indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300)
        for start in indices:
            for stop in indices:
                # Skip step 0 (invalid)
                for step in indices[1:]:
                    self.assertEqual(b[start:stop:step],
                                     s[start:stop:step])

    def test_newbuffer_interface(self):
        # Test that the buffer object has the new buffer interface
        # as used by the memoryview object
        s = "".join(chr(c) for c in list(range(255, -1, -1)))
        b = buffer(s)
        m = memoryview(b) # Should not raise an exception
        self.assertEqual(m.tobytes(), s)

    def test_large_buffer_size_and_offset(self):
        data = bytearray('hola mundo')
        buf = buffer(data, sys.maxsize, sys.maxsize)
        self.assertEqual(buf[:4096], "")

    def test_copy(self):
        buf = buffer(b'abc')
        with self.assertRaises(TypeError):
            copy.copy(buf)

    # See issue #22995
    ## def test_pickle(self):
    ##     buf = buffer(b'abc')
    ##     for proto in range(pickle.HIGHEST_PROTOCOL + 1):
    ##         with self.assertRaises(TypeError):
    ##             pickle.dumps(buf, proto)


def test_main():
    with test_support.check_py3k_warnings(("buffer.. not supported",
                                           DeprecationWarning)):
        test_support.run_unittest(BufferTests)

if __name__ == "__main__":
    test_main()
