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