#!/usr/bin/env python
#
# Author: Mike McKerns (mmckerns @caltech and @uqfoundation)
# Author: Anirudh Vegesana (avegesan@cs.stanford.edu)
# Copyright (c) 2022-2023 The Uncertainty Quantification Foundation.
# License: 3-clause BSD.  The full license text is available at:
#  - https://github.com/uqfoundation/dill/blob/master/LICENSE
"""
test pickling a PyCapsule object
"""

import dill
import warnings

test_pycapsule = None

if dill._dill._testcapsule is not None:
    import ctypes
    def test_pycapsule():
        name = ctypes.create_string_buffer(b'dill._testcapsule')
        capsule = dill._dill._PyCapsule_New(
            ctypes.cast(dill._dill._PyCapsule_New, ctypes.c_void_p),
            name,
            None
        )
        with warnings.catch_warnings():
            warnings.simplefilter("ignore")
            dill.copy(capsule)
        dill._testcapsule = capsule
        with warnings.catch_warnings():
            warnings.simplefilter("ignore")
            dill.copy(capsule)
        dill._testcapsule = None
        try:
            with warnings.catch_warnings():
                warnings.simplefilter("ignore", dill.PicklingWarning)
                dill.copy(capsule)
        except dill.UnpicklingError:
            pass
        else:
            raise AssertionError("Expected a different error")

if __name__ == '__main__':
    if test_pycapsule is not None:
        test_pycapsule()
