source: project/objc/tests/unit-test.scm @ 143

Last change on this file since 143 was 143, checked in by Jim Ursetto, 14 years ago

objc egg v0.4: Class proxies, refcounting and transparent scheme

object access for ivars, objc:wrap/unwrap, (@ ...) syntax, hyphenated
selectors, callback optimization.

File size: 7.9 KB
Line 
1;;; tests
2
3(use objc testeez typetest)
4(objc:import-classes-at-toplevel!)
5
6(define (epsilon=? a b)
7  (and (not (eqv? a b))
8       (< (abs (- a b))
9          1e-14)))
10
11(define (nsstring=? a b)
12  (string=? (objc:nsstring->string a) b))
13
14(testeez "Chicken Objective C bridge"
15
16;; Unimplemented
17  ;; (objc-invoker TypeTest "printInt:Double:Float:" 1.1 2.2 3.3)   => prints, returns YES (#\x1)
18  ; (objc TypeTest nextChar: #t)                                    => error: not a character
19
20         (test/eq    "Boolean false return" (objc TypeTest isGreaterThanThree: 1) #f)
21         (test/equal "Boolean true return"  (objc TypeTest isGreaterThanThree: 4) #\x1)
22         (test/eq    "True scheme predicate"
23                     (if (objc TypeTest isGreaterThanThree: 4) 'true 'false)
24                     'true)
25         (test/eq    "False scheme predicate"
26                     (if (objc TypeTest isGreaterThanThree: 1) 'true 'false)
27                     'false)
28         (test/equal "(uchar)2 returned as character"
29                     (objc TypeTest convertIntToUChar: 2) #\x2)
30         (test/equal "(uchar)0 returned as character"
31                     (objc TypeTest convertIntToUChar: 0) #\nul)
32         (test/eqv   "Int to short"
33                     (objc TypeTest convertIntToShort: -1) -1)
34         (test/eqv   "Int to ushort"
35                     (objc TypeTest convertIntToUShort: -1) 65535)
36         (test/eqv   "Int to short"
37                     (objc TypeTest convertIntToShort: 32768) -32768)
38         (test/eqv   "Int to ushort"
39                     (objc TypeTest convertIntToUShort: 32768) 32768)
40         (test/eqv   "Double precision"
41                     (objc TypeTest returnDoublePlusOneHalf: 2.1) 2.6)
42         (test/equiv "Float precision"
43                     (objc TypeTest returnFloatPlusOneHalf: 2.1)
44                     2.59999990463257
45                     (epsilon=?))
46         (test/equiv "NSString returns a Scheme string"
47                     (objc TypeTest returnNSStringHiMom)
48                     "hi, mom!"
49                     (nsstring=?))
50         (test/eq    "Null object return is #f"
51                     (objc TypeTest returnNullObject) #f)
52         (test/eqv   "Non-null char"
53                     (objc TypeTest nextChar: #\a) #\b)
54         (test/eqv   "Boolean true argument"
55                     (objc TypeTest isTrue: #t) #\x1)
56         (test/eqv   "Boolean false argument"
57                     (objc TypeTest isTrue: #f) #f)
58         (test/eqv   "Boolean char argument is ok"
59                     (objc TypeTest isTrue: #\a) #\x1)
60         
61   ;; -- Note: (objc NSNumber numberWithInt: n) returns the same pointer if you call
62   ;;          with identical n.  Object only appears to be allocated once for each different value.
63         (test/eqv   "NSNumber within an NSArray"
64                     (objc (objc (objc NSArray arrayWithObject: (objc NSNumber numberWithInt: 5))
65                                 objectAtIndex: 0)
66                           isEqual: (objc NSNumber numberWithInt: 5))
67                     #\x1)
68         (test/eqv   "NSNumber <"
69                     (objc (objc NSNumber numberWithInt: 5)
70                           compare: (objc NSNumber numberWithInt: 6))
71                     -1)
72         (test/eqv   "NSNumber =="
73                     (objc (objc NSNumber numberWithInt: 5)
74                           compare: (objc NSNumber numberWithInt: 5))
75                     0)
76         (test/eqv   "NSNumber >"
77                     (objc (objc NSNumber numberWithInt: 5)
78                           compare: (objc NSNumber numberWithInt: 4))
79                     1)
80
81         (test/equal "Class name"
82                      (objc:class-name (objc NSString class))
83                      "NSString")
84         (test/eqv  "Class check via toplevel symbol"
85                     (objc (objc NSScanner alloc) isKindOfClass: NSScanner)
86                     #\x1)
87         (test/eqv  "Class check via class method"
88                     (objc (objc NSScanner alloc)
89                           isKindOfClass: (objc NSScanner class))
90                     #\x1)
91         (test/eqv  "Superclass check via symbol"
92                     (objc (objc NSScanner alloc) isKindOfClass: NSObject)
93                     #\x1)
94         (test/eqv  "Sibling (non-isa) class check via symbol"
95                     (objc (objc NSScanner alloc) isKindOfClass: NSString)
96                     #f)
97         (test/equiv "NSString in/out conversion"
98                     (objc (objc NSArray arrayWithObject: "tralfamadore") objectAtIndex: 0)
99                     "tralfamadore"
100                     (nsstring=?))
101         (test/equal "Rectangle in/out conversion"
102                     @[TypeTest printRect: (ns:make-rect 1 2 3 4)]
103                     (ns:make-rect 1.0 2.0 3.0 4.0))
104)         
105
106;;; unimplemented
107
108; (objc TypeTest returnIntMinusOne: 0)         => -1
109; (objc TypeTest convertIntToUInt: -1)         => 4294967295.0
110; (objc TypeTest convertIntToLong: -1)         => -1
111; (objc TypeTest convertIntToULong: -1)        => 4294967295.0  [prob. 1.84467440737096e+19 on 64-bit]
112;; These 3 return integer.
113; (objc TypeTest addShort: -1 toUShort: -1)    => 65534
114; (objc TypeTest addInt: -1 toUInt: 4294967295.0) => -2
115; (objc TypeTest addLong: -1 toULong: -1)      => -2      [likely to be different on 64-bit platform]
116
117;; Should test ns:make-number for correct ObjC type created, when integrated
118;; into the bridge.
119
120;; Selector tests
121;; (define inv (objc NSInvocation invocationWithMethodSignature: (objc NSScanner methodSignatureForSelector: "alloc")))
122;; (objc inv selector)  => #f
123;; (objc inv setSelector: "alloc")   => void
124;; (objc inv selector)  => "alloc"
125;;    Note: In order to get the return value via getReturnValue:, we need to pass in a buffer
126;;    and also convert the result to a scheme object.  We could create a wrapper around
127;;    ObjcObjRefToScmObj, though we would have to pass in the expected return type.
128;;    (This is available in  [[inv methodSignature] methodReturnType] and the buffer length
129;;    is available in [[inv methodSignature] methodReturnLength]:
130;;      (define sig (objc inv methodSignature))
131;;      (objc sig methodReturnType)   => "@"
132;;      (objc sig methodReturnLength) => 4
133;;      (objc inv invoke)             => (void)
134;;      (objc inv getReturnType: (make-string 4))   ;; fatal: call with pointer argument
135;;                                                  ;; use locations? values?
136;;             ;; This is a valid pointer pass which is incorrectly handled by gauche-objc,
137               ;; i.e. a value is not returned thru this pointer.
138;;      Argument type for first argument is "^v", or void pointer -- not a struct pointer,
139;;      which gauche expects for return-by-reference but does not check past the ^.
140;;      (objc (objc inv methodSignatureForSelector: "getReturnValue:") getArgumentTypeAtIndex: 2)
141;;   Note, we could also use:
142;;      (cdr (assoc "getReturnValue:" (objc-class-method-list (objc (objc NSInvocation alloc) class))))
143;;         to obtain the full signature, "v12@0:4^v8".
144
145; (objc NSString alloc)  => Exception
146                          ; Did you forget to nest alloc and init?
147                          ; <NSInvalidArgumentException> *** -length only defined for
148                          ; abstract class.  Define -[NSPlaceholderString length]!
149
150
151;; Testing ivar-ref -- create a new NSInvocationFromScheme and have it assign to sig
152; (define o (objc (objc NSInvocationFromScheme alloc) initWithTarget: (objc NSScanner alloc) selector: "class"))
153; (ivar-ref o inv)                => crashes
154; (ivar-ref o sig)                => #<objc-object>
155; (objc (ivar-ref o sig) methodReturnType)       => "#"
156; (ivar-ref o inv)                => suddenly works the second time (after the methodReturnType call)
157;; This is an object deallocation problem.  When the autorelease pool is eliminated (leaking memory)
158;; the problem goes away.  The debug output is showing many similar addresses being used multiple
159;; times and probably one is not retained correctly or something.
Note: See TracBrowser for help on using the repository browser.