1"""Test where byte objects are accepted"""
2import unittest
3import sys
4from ctypes import *
5
6class BytesTest(unittest.TestCase):
7    def test_c_char(self):
8        x = c_char(b"x")
9        self.assertRaises(TypeError, c_char, "x")
10        x.value = b"y"
11        with self.assertRaises(TypeError):
12            x.value = "y"
13        c_char.from_param(b"x")
14        self.assertRaises(TypeError, c_char.from_param, "x")
15        (c_char * 3)(b"a", b"b", b"c")
16        self.assertRaises(TypeError, c_char * 3, "a", "b", "c")
17
18    def test_c_wchar(self):
19        x = c_wchar("x")
20        self.assertRaises(TypeError, c_wchar, b"x")
21        x.value = "y"
22        with self.assertRaises(TypeError):
23            x.value = b"y"
24        c_wchar.from_param("x")
25        self.assertRaises(TypeError, c_wchar.from_param, b"x")
26        (c_wchar * 3)("a", "b", "c")
27        self.assertRaises(TypeError, c_wchar * 3, b"a", b"b", b"c")
28
29    def test_c_char_p(self):
30        c_char_p(b"foo bar")
31        self.assertRaises(TypeError, c_char_p, "foo bar")
32
33    def test_c_wchar_p(self):
34        c_wchar_p("foo bar")
35        self.assertRaises(TypeError, c_wchar_p, b"foo bar")
36
37    def test_struct(self):
38        class X(Structure):
39            _fields_ = [("a", c_char * 3)]
40
41        x = X(b"abc")
42        self.assertRaises(TypeError, X, "abc")
43        self.assertEqual(x.a, b"abc")
44        self.assertEqual(type(x.a), bytes)
45
46    def test_struct_W(self):
47        class X(Structure):
48            _fields_ = [("a", c_wchar * 3)]
49
50        x = X("abc")
51        self.assertRaises(TypeError, X, b"abc")
52        self.assertEqual(x.a, "abc")
53        self.assertEqual(type(x.a), str)
54
55    @unittest.skipUnless(sys.platform == "win32", 'Windows-specific test')
56    def test_BSTR(self):
57        from _ctypes import _SimpleCData
58        class BSTR(_SimpleCData):
59            _type_ = "X"
60
61        BSTR("abc")
62
63
64if __name__ == '__main__':
65    unittest.main()
66