1#
2#  Copyright (c) 2006 Laurent Sansonetti, Apple Computer Inc.
3#  This test is based on a bug report reproducer, written by Tim Burks.
4#
5
6require 'test/unit'
7require 'osx/cocoa'
8require 'rbconfig'
9
10system 'make -s' || raise(RuntimeError, "'make' failed")
11require 'objc_test.bundle'
12
13class RigHelper < OSX::NSObject
14  def name
15    "helper"
16  end
17
18  addRubyMethod_withType("testChar:", "c@:c")
19  def testChar(c)
20    c
21  end
22
23  addRubyMethod_withType("testInt:", "i@:i")
24  def testInt(i)
25    i
26  end
27
28  addRubyMethod_withType("testShort:", "s@:s")
29  def testShort(s)
30    s
31  end
32
33  addRubyMethod_withType("testLong:", "l@:l")
34  def testLong(l)
35    l
36  end
37
38  addRubyMethod_withType("testFloat:", "f@:f")
39  def testFloat(f)
40    f
41  end
42
43  addRubyMethod_withType("testDouble:", "d@:d")
44  def testDouble(d)
45    d
46  end
47
48  addRubyMethod_withType("testLongLong:", "q@:q")
49  def testLongLong(ll)
50    ll
51  end
52end
53
54class ObjcExportHelper < OSX::NSObject
55  def foo1
56    's'
57  end
58  objc_method :foo1, %w{id}
59
60  def foo2(integer)
61    integer + 2
62  end
63  objc_method :foo2, %w{int int}
64
65  def foo3_obj(ary, obj)
66    ary.addObject(obj)
67  end
68  objc_method :foo3, %w{void id id}
69
70  def foo4_size(point, size)
71    OSX::NSRect.new(point, size)
72  end
73  objc_method :foo4_size, [OSX::NSRect, OSX::NSPoint, OSX::NSSize]
74
75  def foo5(rectPtr)
76    rectPtr.origin.x *= 10
77    rectPtr.origin.y *= 10
78    rectPtr.size.width *= 10
79    rectPtr.size.height *= 10
80  end
81  addRubyMethod_withType("foo5:", "v@:^#{OSX::NSRect.encoding}")
82
83  def self.superFoo
84    42
85  end
86  objc_class_method :superFoo, ['int']
87end
88
89class TestStret < OSX::ObjcTestStret
90  def overrideMe(x)
91    OSX::NSRect.new(x,x,x,x)
92  end
93end
94
95class OSX::DirectOverride
96  def self.classOverrideMe
97    'bar'
98  end
99  def overrideMe
100    'foo'
101  end
102end
103
104class OSX::DirectOverrideChild
105  def overrideMe
106    'bar'
107  end
108end
109
110class OSX::NSObject
111  def self.mySuperClassMethod
112    'bar'
113  end
114  objc_class_method :mySuperClassMethod, ['id']
115  def mySuperMethod
116    'foo'
117  end
118  objc_method :mySuperMethod, ['id']
119
120  objc_method(:mySuperMethodWithBlock, [:id, :int]) { |x| "foo_#{x}" }
121end
122
123class OvmixArgRetainedController < OSX::NSObject
124  def setObject(o)
125    @o = o
126  end
127  objc_method :setObject, ['id', 'id']
128  def getObject
129    @o
130  end
131  objc_method :getObject, ['id']
132end
133
134class TC_OVMIX < Test::Unit::TestCase
135  def test_rig
136    testrig = OSX::TestRig.alloc.init
137    testrig.run    
138  end
139
140  def test_objc_method
141    OSX::TestObjcExport.runTests
142  end
143
144  def test_direct_override
145    assert(OSX::DirectOverride.ancestors.include?(OSX::NSObject))
146    o = OSX::DirectOverride.alloc.init
147    assert_kind_of(OSX::NSString, o.performSelector('overrideMe'))
148    assert_equal('foo', o.performSelector('overrideMe').to_s)
149    assert_kind_of(OSX::NSString, OSX::DirectOverride.performSelector('classOverrideMe'))
150    assert_equal('bar', OSX::DirectOverride.performSelector('classOverrideMe').to_s)
151    OSX::DirectOverride.checkOverridenMethods
152  end
153
154  def test_direct_inheritance
155    assert(OSX::DirectOverrideParent.ancestors.include?(OSX::NSObject))
156    p = OSX::DirectOverrideParent.alloc.init
157    assert_kind_of(OSX::NSString, p.performSelector('overrideMe'))
158    assert_equal('foo', p.performSelector('overrideMe').to_s)
159    p.checkOverride('foo')
160    
161    assert(OSX::DirectOverrideChild.ancestors.include?(OSX::NSObject))
162    assert(OSX::DirectOverrideChild.ancestors.include?(
163      OSX::DirectOverrideParent))
164    c = OSX::DirectOverrideChild.alloc.init
165    assert_kind_of(OSX::NSString, c.performSelector('overrideMe'))
166    assert_equal('bar', c.performSelector('overrideMe').to_s)
167    c.checkOverride('bar')
168  end
169
170  def test_super_method
171    o = OSX::NSString.stringWithCString('blah')
172    assert_equal('foo', o.mySuperMethod.to_s)
173    assert_equal('foo', o.performSelector('mySuperMethod').to_s)
174    assert_equal('bar', OSX::NSString.mySuperClassMethod.to_s)
175    assert_equal('bar', OSX::NSString.performSelector('mySuperClassMethod').to_s)
176  end
177
178  def test_objc_method_with_block
179    o = OSX::NSString.stringWithCString('blah')
180    assert_equal('foo_123', o.mySuperMethodWithBlock(123).to_s)
181    assert_equal('foo_456', o.objc_send(:mySuperMethodWithBlock, 456).to_s)
182  end
183
184  def test_arg_retained
185    c = OvmixArgRetainedController.alloc.init
186    OSX::OvmixArgRetained.test(c)
187  end
188end
189