1#
2#  Copyright (c) 2006 Laurent Sansonetti, Apple Computer Inc.
3#
4
5require 'test/unit'
6require 'osx/cocoa'
7
8system 'make -s' || raise(RuntimeError, "'make' failed")
9require 'objc_test.bundle'
10$OS_VERS = `/usr/bin/sw_vers -productVersion`.chomp # such as "10.6.1"
11
12class TC_Types < Test::Unit::TestCase
13
14  def test_auto_boolean_conversion_objc
15    s1 = OSX::NSString.alloc.initWithString("foo")
16    s2 = s1.copy
17    s3 = OSX::NSString.alloc.initWithString("bar")
18    assert_equal(true, s1.isEqualToString(s2))
19    assert_equal(true, s1.isEqualToString?(s2))
20    assert_equal(false, s1.isEqualToString(s3))
21    assert_equal(false, s1.isEqualToString?(s3))
22  end
23
24  def test_auto_boolean_conversion_c
25    str = OSX::CFStringCreateWithCString(OSX::KCFAllocatorDefault, 'foobar', OSX::KCFStringEncodingASCII)
26    assert_equal(true, OSX::CFStringHasPrefix(str, 'foo'))
27    assert_equal(false, OSX::CFStringHasPrefix(str, 'bar'))
28  end
29
30  def test_char_conversion
31    v = OSX::NSNumber.numberWithChar(?v)
32    assert_equal(?v, v.charValue)
33  end
34
35  def test_uchar_conversion
36    v = OSX::NSNumber.numberWithUnsignedChar(?v)
37    assert_equal(?v, v.unsignedCharValue)
38  end
39
40  def test_short_conversion
41    v = OSX::NSNumber.numberWithShort(42)
42    assert_equal(42, v.shortValue)
43  end
44
45  def test_ushort_conversion
46    v = OSX::NSNumber.numberWithUnsignedShort(42)
47    assert_equal(42, v.unsignedShortValue)
48  end
49
50  def test_int_conversion
51    v = OSX::NSNumber.numberWithInt(42)
52    assert_equal(42, v.intValue)
53  end
54
55  def test_float_conversion
56    v = OSX::NSNumber.numberWithFloat(42.42)
57    assert((42.42 - v.floatValue).abs < 0.01)
58  end
59
60  def test_nsrect
61    rect = OSX::NSRect.new
62    assert_equal(0, rect.origin.x)
63    assert_equal(0, rect.origin.y)
64    assert_equal(0, rect.size.width)
65    assert_equal(0, rect.size.height)
66    assert_equal(OSX::NSZeroRect.to_a.flatten.map { |x| x.to_i }, rect.to_a.flatten.map { |x| x.to_i })
67    rect = OSX::NSRect.new(OSX::NSPoint.new(1, 2), OSX::NSSize.new(3, 4))
68    assert_equal(1, rect.origin.x)
69    assert_equal(2, rect.origin.y)
70    assert_equal(3, rect.size.width)
71    assert_equal(4, rect.size.height)
72    rect = OSX::NSRect.new(1, 2, 3, 4)
73    assert_equal(1, rect.origin.x)
74    assert_equal(2, rect.origin.y)
75    assert_equal(3, rect.size.width)
76    assert_equal(4, rect.size.height)
77    assert_equal([[1, 2], [3, 4]], rect.to_a)
78    rect.origin.x = 42
79    rect.origin.y = 43
80    assert_equal(42, rect.origin.x)
81    assert_equal(43, rect.origin.y)
82    assert_equal(rect, OSX::NSRectFromString('{{42, 43}, {3, 4}'))
83    assert_equal('{{42, 43}, {3, 4}}', OSX::NSStringFromRect(rect).to_s)
84  end
85
86  def test_nssize
87    size = OSX::NSSize.new
88    assert_equal(0, size.width)
89    assert_equal(0, size.height)
90    assert_equal(OSX::NSZeroSize, size)
91    size.width = 42
92    size.height = 43
93    assert_equal([42, 43], size.to_a)
94    assert_equal(size, OSX::NSSize.new(42, 43))
95    assert_equal(size, OSX::NSSizeFromString('{42, 43}'))
96    assert_equal('{42, 43}', OSX::NSStringFromSize(size).to_s)
97  end
98
99  def test_nsrange
100    range = OSX::NSRange.new
101    assert_equal(0, range.location)
102    assert_equal(0, range.length)
103    assert_equal(OSX::NSRange.new(0, 0), range)
104    range = OSX::NSRange.new(2..6)
105    assert_equal(2, range.location)
106    assert_equal(5, range.length)
107    assert_equal(2...7, range.to_range)
108    range = OSX::NSRange.new(2, 10)
109    assert_equal(2, range.location)
110    assert_equal(10, range.length)
111    assert_equal([2, 10], range.to_a)
112    range.location = 42
113    range.length = 43
114    assert_equal(42, range.location)
115    assert_equal(43, range.length)
116  end
117
118  def test_cg_affine_transform
119    ary = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
120    assert_equal(OSX::CGAffineTransformMake(*ary).to_a, ary)
121  end
122
123  def test_bool_nsnumber
124    d = OSX::NSMutableDictionary.alloc.init
125    d.setValue_forKey(true, 'true')
126    d.setValue_forKey(false, 'false')
127    d.setValue_forKey(123, '123')
128    assert_kind_of(OSX::NSCFBoolean, d.objectForKey('true'))
129    assert_kind_of(OSX::NSCFBoolean, d.objectForKey('false'))
130    assert_kind_of(OSX::NSNumber, d.objectForKey('123'))
131  end
132
133  def test_float_nsnumber
134    assert(!OSX::CFNumberIsFloatType(42))
135    assert(OSX::CFNumberIsFloatType(42.42))
136    assert(OSX::NSNumber.numberWithInt(42).integer?)
137    assert(!OSX::NSNumber.numberWithFloat(42.42).integer?)
138  end
139
140  def test_cftypes
141    str = OSX::NSString.alloc.initWithCString_encoding('foo', OSX::NSASCIIStringEncoding)
142    assert_equal(3, str.length)
143    assert_equal(3, OSX::CFStringGetLength(str))
144    str2 = OSX::CFStringCreateWithCString(OSX::KCFAllocatorDefault, 'foo', OSX::KCFStringEncodingASCII)
145    assert_kind_of(OSX::NSString, str2)
146    assert_equal(3, str2.length)
147    assert_equal(3, OSX::CFStringGetLength(str2))
148    assert(str.isEqualToString(str2))
149    assert(OSX::CFEqual(str, str2))
150    url = OSX::CFURLCreateWithString(OSX::KCFAllocatorDefault, 'http://www.google.com', nil)
151    assert_kind_of(OSX::NSURL, url)
152    assert_equal(url.path, OSX::CFURLCopyPath(url))
153  end
154
155# FIXME: no suitable type for testing without toll-free on 10.6
156if $OS_VERS.to_f < 10.6
157  def test_cftype_proxies
158    assert_kind_of(OSX::CFRunLoopRef, OSX::CFRunLoopGetCurrent())
159  end
160end
161
162  def test_opaque_boxed
163    z = OSX::NSDefaultMallocZone()
164    assert_kind_of(OSX::NSZone, z)
165    assert_kind_of(OSX::Boxed, z)
166    assert_kind_of(OSX::NSString, OSX::NSZoneName(z))
167  end
168
169  def test_four_char_code_enums
170    OSX.require_framework('AddressBook')
171    assert_equal(1633841264, OSX::KEventClassABPeoplePicker)
172    assert_equal(OSX::TestFourCharCode.kEventClassABPeoplePickerValue, OSX::KEventClassABPeoplePicker)
173  end
174
175  def test_nsdecimal
176    zero = OSX::NSDecimalNumber.zero
177    assert_equal('0', OSX::NSDecimalString(zero.decimalValue, nil).to_s)
178    one = OSX::NSDecimalNumber.one
179    assert_equal('1', OSX::NSDecimalString(one.decimalValue, nil).to_s)
180    one2 = OSX::NSDecimalNumber.decimalNumberWithDecimal(one.decimalValue)
181    assert_equal(OSX::NSOrderedSame, one.compare(one2))
182    two = one.decimalNumberByAdding(one)
183    assert_equal(2, two.doubleValue)
184    four = two.decimalNumberByMultiplyingBy(two)
185    assert_equal(4, four.doubleValue)
186    still_four = four.decimalNumberByDividingBy(one)
187    assert_equal(4, still_four.doubleValue)
188    four_pow_four = four.decimalNumberByRaisingToPower(4)
189    assert_equal(256, four_pow_four.doubleValue)
190    fifty_six = OSX::NSDecimalNumber.decimalNumberWithString('56')
191    two_hundred = four_pow_four.decimalNumberBySubtracting(fifty_six)
192    assert_equal(200, two_hundred.doubleValue)
193  end
194
195  def test_boxed_fields
196    ary = OSX::NSRect.fields
197    assert_kind_of(Array, ary)
198    assert_equal(2, ary.size)
199    assert(ary.include?(:origin))
200    assert(ary.include?(:size))
201    ary = OSX::NSZone.fields
202    assert_kind_of(Array, ary)
203    assert_equal(0, ary.size) 
204  end
205
206  def test_boxed_opaque
207    assert(!OSX::NSRect.opaque?)
208    assert(!OSX::NSSize.opaque?)
209    assert(OSX::NSZone.opaque?)
210    assert(OSX::NSDecimal.opaque?)
211  end
212
213  def test_const_magic_cookie
214    # FIXME: CFAllocatorRef not defined on 10.6, becomes NSObject via toll-free
215    #assert_kind_of(OSX::CFAllocatorRef, OSX::KCFAllocatorUseContext)
216    # FIMXE test calling CFAllocatorCreate with KCFAllocatorUseContext once we support function pointers 
217    assert_equal(1, OSX::TestMagicCookie.isKCFAllocatorUseContext(OSX::KCFAllocatorUseContext))
218  end
219
220  def test_ignored_enum
221    assert_raise(RuntimeError) { OSX::KCGDirectMainDisplay }
222    assert_nothing_raised { OSX.CGMainDisplayID() }
223  end
224
225  def test_method_func_ptr_arg
226    ary = OSX::NSMutableArray.alloc.init
227    [5, 3, 2, 4, 1].each { |i| ary.addObject(i) }
228    p = proc do |x, y, ctx| 
229      assert_equal(nil, ctx)
230      x.intValue <=> y.intValue
231    end 
232    ary.sortUsingFunction_context(p, nil)
233    assert_equal(ary.to_a.map { |i| i.to_i }, [1, 2, 3, 4, 5])
234    assert_raise(ArgumentError) { ary.sortUsingFunction_context(proc { || }, nil) }
235    assert_raise(ArgumentError) { ary.sortUsingFunction_context(proc { |a| }, nil) }
236    assert_raise(ArgumentError) { ary.sortUsingFunction_context(proc { |a, b| }, nil) }
237    assert_raise(ArgumentError) { ary.sortUsingFunction_context(proc { |a, b, c, d| }, nil) }
238  end
239
240  def test_func_func_ptr_arg
241    ary = OSX::NSMutableArray.alloc.init
242    [5, 3, 2, 4, 1].each { |i| ary.addObject(i) }
243    i = 0
244    provided_ctx = nil
245    p = proc do |value, ctx|
246      if provided_ctx.nil?
247        assert_nil(ctx)
248      else
249        assert_equal(provided_ctx, ctx.bytestr(provided_ctx.length))
250      end
251      assert_kind_of(OSX::ObjcPtr, value)
252      i += 1
253    end
254    provided_ctx = nil
255    OSX::CFArrayApplyFunction(ary, OSX::NSMakeRange(0, ary.count), p, provided_ctx)
256    assert_equal(i, 5)
257    provided_ctx = "foobar"
258    OSX::CFArrayApplyFunction(ary, OSX::NSMakeRange(0, ary.count), p, provided_ctx)
259    assert_equal(i, 10)
260  end
261
262  def test_boxed_struct_dup
263    rect = OSX::NSRect.new(1, 2, 3, 4)
264    rect2 = rect.dup
265    assert_equal(rect, rect2)
266    size2 = rect2.size.dup
267    assert_equal(rect.size, size2)
268    size3 = rect2.size.clone
269    assert_equal(rect.size, size3)
270    assert(!OSX::NSZone.instance_methods(false).include?('dup'))
271  end
272
273  def test_cary_struct
274    OSX.load_bridge_support_file('CAryStructTest.bridgesupport')
275    o = OSX::NSObject.new
276    t1 = o.test1
277    assert_kind_of(OSX::Ttype1, t1)
278    assert_equal(1.0, t1.a)
279    assert_equal(2.0, t1.b)
280# FIXME: SEGV on 10.6
281if $OS_VERS.to_f < 10.6
282    t2 = o.test2
283    assert_kind_of(OSX::Ttype2, t2)
284    assert_equal(1.0, t2.a[0])
285    assert_equal(2.0, t2.a[1])
286else
287    warn "skip 3 assertions in test_cary_struct()"
288end
289  end
290end
291