1
2from PyObjCTools.TestSupport import *
3from SearchKit import *
4from Foundation import NSMutableData
5
6try:
7    unicode
8except NameError:
9    unicode = str
10
11try:
12    long
13except NameError:
14    long = int
15
16class TestSKSearch (TestCase):
17    def testTypes(self):
18        self.assertIsInstance(SKSearchGroupRef, objc.objc_class)
19        self.assertIsInstance(SKSearchResultsRef, objc.objc_class)
20        self.assertIsInstance(SKSearchRef, objc.objc_class)
21
22    def testConstants(self):
23        self.assertEqual(kSKSearchRanked, 0)
24        self.assertEqual(kSKSearchBooleanRanked, 1)
25        self.assertEqual(kSKSearchRequiredRanked, 2)
26        self.assertEqual(kSKSearchPrefixRanked, 3)
27
28        self.assertEqual(kSKSearchOptionDefault, 0)
29        self.assertEqual(kSKSearchOptionNoRelevanceScores, 1)
30        self.assertEqual(kSKSearchOptionSpaceMeansOR, 2)
31        self.assertEqual(kSKSearchOptionFindSimilar, 4)
32
33    def testFunctions(self):
34        self.assertIsInstance(SKSearchGroupGetTypeID(), (int, long))
35        self.assertIsInstance(SKSearchResultsGetTypeID(), (int, long))
36        self.assertIsInstance(SKSearchGetTypeID(), (int, long))
37
38        data = NSMutableData.data()
39        index = SKIndexCreateWithMutableData(
40                data, "pyobjc.test", kSKIndexInverted, None)
41        self.assertIsInstance(index, SKIndexRef)
42        doc = SKDocumentCreateWithURL(
43            CFURLCreateWithFileSystemPath(
44            None, b"/Library/Documentation/Acknowledgements.rtf".decode('latin1'),
45            kCFURLPOSIXPathStyle, False))
46        doc2 = SKDocumentCreateWithURL(
47            CFURLCreateWithFileSystemPath(
48            None, b"/Library/Documentation/iPod/Acknowledgements.rtf".decode('latin1'),
49            kCFURLPOSIXPathStyle, False))
50        SKIndexAddDocumentWithText(index, doc, "copyright and licenses", True)
51        SKIndexAddDocumentWithText(index, doc2, "copyright and licenses for iPod", True)
52        SKIndexFlush(index)
53
54
55        grp = SKSearchGroupCreate([index])
56        self.assertIsInstance(grp, SKSearchGroupRef)
57
58
59        l = []
60
61        @objc.callbackFor(SKSearchResultsCreateWithQuery)
62        def callback(idx, doc, ctx):
63            l.append([idx, doc, ctx])
64            return True
65
66
67        ctx = 10
68
69        res = SKSearchResultsCreateWithQuery(
70                grp, b"copyright".decode('latin1'), kSKSearchRequiredRanked, 2, ctx, callback)
71        self.assertIsInstance(res, SKSearchResultsRef)
72
73        res = SKSearchResultsCreateWithDocuments(
74                grp, [doc], 10, ctx, callback)
75        self.assertIsInstance(res, SKSearchResultsRef)
76        self.assertEqual(len(l), 2)
77        self.assertEqual(l[0][0], index)
78        self.assertIsInstance(l[0][1], SKDocumentRef)
79        self.assertEqual(l[0][2], ctx)
80
81        cnt = SKSearchResultsGetCount(res)
82        self.assertIsInstance(cnt, (int, long))
83
84        if cnt == 0:
85            # XXX: For some reason this doesn't work on OSX 10.7,
86            # reason is unclear for now.
87            pass
88            return
89
90
91        self.failUnless(cnt > 0)
92
93
94        v, o1, o2, o3 = SKSearchResultsGetInfoInRange(res, CFRange(0, cnt), None, None, None)
95        self.assertIsInstance(v, int)
96        self.assertIsInstance(o1, tuple)
97        if o1:
98            self.assertIsInstance(o1[0], SKDocumentRef)
99        self.assertIsInstance(o2, tuple)
100        if o2:
101            self.assertIsInstance(o2[0], SKIndexRef)
102        self.assertIsInstance(o3, tuple)
103        if o3:
104            self.assertIsInstance(o3[0], float)
105
106        v = SKSearchResultsCopyMatchingTerms(res, 1)
107        self.assertIsInstance(v, CFArrayRef)
108
109        src = SKSearchCreate(index, "copyright", kSKSearchOptionFindSimilar)
110        self.assertIsInstance(src, SKSearchRef)
111
112        v, o1, o2, o3 = SKSearchFindMatches(src, 10, None, None, 1.0, None)
113        self.assertIsInstance(v, bool)
114        self.assertIsInstance(o1, tuple)
115        if o1:
116            self.assertIsInstance(o1[0], (int, long))
117        self.assertIsInstance(o2, tuple)
118        if o2:
119            self.assertIsInstance(o2[0], float)
120        self.assertIsInstance(o3, (int, long))
121
122        v1, v2 = SKIndexCopyInfoForDocumentIDs(
123                index, o3, o1, None, None)
124        if v1:
125            self.assertIsInstance(v1[0], unicode)
126        self.assertIsInstance(v2, tuple)
127        if v2:
128            self.assertIsInstance(v2[0], (int, long))
129
130        v = SKIndexCopyDocumentRefsForDocumentIDs(
131            index, o3, o1, None)
132        self.assertIsInstance(v, tuple)
133        if v:
134            self.assertIsInstance(v[0], SKDocumentRef)
135
136        v = SKIndexCopyDocumentURLsForDocumentIDs(
137                index, o3, o1, None)
138        self.assertIsInstance(v, tuple)
139        if v:
140            self.assertIsInstance(v[0], CFURLRef)
141
142        self.assertResultIsCFRetained(SKSearchGroupCopyIndexes)
143        a = SKSearchGroupCopyIndexes(grp)
144        self.assertIsInstance(a, CFArrayRef)
145
146        SKSearchCancel(src)
147
148if __name__ == "__main__":
149    main()
150