1from PyObjCTools.TestSupport import *
2from Quartz import *
3
4class TestCVDisplayLink (TestCase):
5    def testTypes(self):
6        self.assertIsCFType(CVDisplayLinkRef)
7
8    def testFunctions(self):
9        self.assertIsInstance(CVDisplayLinkGetTypeID(), (int, long))
10
11        mainID = CGMainDisplayID()
12
13        self.assertArgIsIn(CVDisplayLinkCreateWithCGDisplays, 0)
14        self.assertArgSizeInArg(CVDisplayLinkCreateWithCGDisplays, 0, 1)
15        self.assertArgIsOut(CVDisplayLinkCreateWithCGDisplays, 2)
16        self.assertArgIsCFRetained(CVDisplayLinkCreateWithCGDisplays, 2)
17
18        rv, link = CVDisplayLinkCreateWithCGDisplays([mainID], 1, None)
19        self.assertEqual(rv, 0)
20        self.assertIsInstance(link, CVDisplayLinkRef)
21
22        self.assertArgIsOut(CVDisplayLinkCreateWithOpenGLDisplayMask, 1)
23        self.assertArgIsCFRetained(CVDisplayLinkCreateWithOpenGLDisplayMask, 1)
24        rv, link2 = CVDisplayLinkCreateWithOpenGLDisplayMask(CGDisplayIDToOpenGLDisplayMask(mainID), None)
25        self.assertEqual(rv, 0)
26        self.assertIsInstance(link2, CVDisplayLinkRef)
27
28        self.assertArgIsOut(CVDisplayLinkCreateWithCGDisplay, 1)
29        self.assertArgIsCFRetained(CVDisplayLinkCreateWithCGDisplay, 1)
30        rv, link3 = CVDisplayLinkCreateWithCGDisplay(mainID, None)
31        self.assertEqual(rv, 0)
32        self.assertIsInstance(link3, CVDisplayLinkRef)
33
34        self.assertArgIsOut(CVDisplayLinkCreateWithActiveCGDisplays, 0)
35        self.assertArgIsCFRetained(CVDisplayLinkCreateWithActiveCGDisplays, 0)
36        rv, link4 = CVDisplayLinkCreateWithActiveCGDisplays(None)
37        self.assertEqual(rv, 0)
38        self.assertIsInstance(link4, CVDisplayLinkRef)
39
40        rv = CVDisplayLinkSetCurrentCGDisplay(link, mainID)
41        self.assertEqual(rv, 0)
42
43        # FIXME
44        CVDisplayLinkSetCurrentCGDisplayFromOpenGLContext
45
46        v = CVDisplayLinkGetCurrentCGDisplay(link)
47        self.assertEqual(v, mainID)
48
49        self.assertArgIsFunction(CVDisplayLinkSetOutputCallback, 1, b'i@n^{_CVTimeStamp=IiqQdq{CVSMPTETime=ssIIIssss}QQ}N^{_CVTimeStamp=IiqQdq{CVSMPTETime=ssIIIssss}QQ}Qo^Q^v', True)
50        self.assertArgHasType(CVDisplayLinkSetOutputCallback, 2, b'^v')
51
52        @objc.callbackFor(CVDisplayLinkSetOutputCallback)
53        def callback(dl, now, time, flags, oflags, ctx):
54            pass
55        CVDisplayLinkSetOutputCallback(link2, callback, None)
56
57        rv = CVDisplayLinkStart(link4)
58        self.assertIsInstance(rv, (int, long))
59        rv = CVDisplayLinkStop(link4)
60        self.assertIsInstance(rv, (int, long))
61
62        self.assertResultHasType(CVDisplayLinkGetNominalOutputVideoRefreshPeriod, CVTime.__typestr__)
63        v = CVDisplayLinkGetNominalOutputVideoRefreshPeriod(link)
64        self.assertIsInstance(v, CVTime)
65
66        self.assertResultHasType(CVDisplayLinkGetOutputVideoLatency, CVTime.__typestr__)
67        v = CVDisplayLinkGetOutputVideoLatency(link)
68        self.assertIsInstance(v, CVTime)
69
70        self.assertResultHasType(CVDisplayLinkGetActualOutputVideoRefreshPeriod, objc._C_DBL)
71        v = CVDisplayLinkGetActualOutputVideoRefreshPeriod(link)
72        self.assertIsInstance(v, float)
73
74        self.assertResultIsBOOL(CVDisplayLinkIsRunning)
75        v = CVDisplayLinkIsRunning(link)
76        self.assertIsInstance(v, bool)
77
78        self.assertArgHasType(CVDisplayLinkGetCurrentTime, 1, b'o^' + CVTimeStamp.__typestr__)
79        rv, v = CVDisplayLinkGetCurrentTime(link, None)
80        self.assertIsInstance(rv, (int, long))
81        self.assertIsInstance(v, CVTimeStamp)
82        ts = v
83
84        self.assertArgHasType(CVDisplayLinkTranslateTime, 1, b'n^' + CVTimeStamp.__typestr__)
85        self.assertArgHasType(CVDisplayLinkTranslateTime, 2, b'o^' + CVTimeStamp.__typestr__)
86        rv, v = CVDisplayLinkTranslateTime(link,  ts, None)
87        self.assertIsInstance(rv, (int, long))
88        self.assertIsInstance(v, CVTimeStamp)
89
90        v = CVDisplayLinkRetain(link)
91        self.assertTrue(v is link)
92        CVDisplayLinkRelease(v)
93
94
95if __name__ == "__main__":
96    main()
97