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