1#
2#  $Id: tc_wrapper.rb 2118 2007-11-10 22:58:03Z lrz $
3#
4#  Copyright (c) 2006 FUJIMOTO Hisakuni
5#  Copyright (c) 2006 kimura wataru
6#
7
8require 'test/unit'
9require 'osx/cocoa'
10
11class TC_OCObjWrapper < Test::Unit::TestCase
12  include OSX
13
14  def setup
15    @obj = NSObject.alloc.init
16    @data = NSData.alloc.init
17  end
18
19  def teardown
20  end
21
22  def test_instance_methods
23    assert_equal_array(@obj.objc_methods, NSObject.objc_instance_methods)
24  end
25
26  def test_instance_methods_nonrecursive
27    assert_equal_array(NSObject.objc_instance_methods | NSData.objc_instance_methods(false), NSData.objc_instance_methods(true))
28  end
29
30  def test_class_methods
31    assert_equal_array(NSObject.objc_methods, NSObject.objc_class_methods)
32  end
33
34  def test_class_methods_nonrecursive
35    assert_equal_array(NSObject.objc_class_methods | NSData.objc_class_methods(false), NSData.objc_class_methods(true))
36  end
37
38  def assert_equal_array(ary1, ary2)
39    assert_equal((ary1 | ary2).size, ary1.size)
40  end
41
42  def test_method_type
43    sel = 'getBytes:'
44    assert_equal(NSData.objc_instance_method_type(sel),
45		 @data.objc_method_type(sel))
46
47    sel = 'dataWithBytes:length:'
48    assert_equal(NSData.objc_class_method_type(sel),
49		 NSData.objc_method_type(sel))
50  end
51
52  def test_message_syntaxes
53    old_relaxed_syntax = OSX.relaxed_syntax
54    OSX.relaxed_syntax = true
55    url1 = NSURL.alloc.initWithScheme_host_path_('http', 'localhost', '/foo') 
56    url2 = NSURL.alloc.initWithScheme_host_path('http', 'localhost', '/foo') 
57    assert_equal(true, url1.isEqual(url2)) 
58    url3 = NSURL.alloc.objc_send(:initWithScheme, 'http', :host, 'localhost', :path, '/foo')
59    assert_equal(true, url1.isEqual(url3))
60    # No need to check for symbol/value/... and inline Hash syntaxes, as they are deprecated.
61    # However we should check that an exception is raised (as if relaxed_syntax was false) for
62    # the 1.0.0 release.
63    OSX.relaxed_syntax = false 
64    url5 = NSURL.alloc.initWithScheme_host_path_('http', 'localhost', '/foo') 
65    assert_equal(true, url1.isEqual_(url5))
66    assert_raises OSX::OCMessageSendException do
67      # We cannot check the following method
68      #   NSURL.alloc.initWithScheme_host_path('http', 'localhost', '/foo')
69      # because it has already been registered, so let's check another method:
70      NSString.stringWithCapacity(42)
71    end 
72    assert_raises OSX::OCMessageSendException do 
73      NSURL.alloc.initWithScheme('http', :host, 'localhost', :path, '/foo')
74    end
75    assert_raises OSX::OCMessageSendException do
76      NSURL.alloc.initWithScheme('http', :host => 'localhost', :path => '/foo')
77    end
78    OSX.relaxed_syntax = old_relaxed_syntax
79  end
80
81  def test_objc_send
82    # Some additional tests for objc_send.
83    assert_raises ArgumentError do 
84      OSX::NSObject.alloc.objc_send
85    end 
86    assert_nothing_raised { OSX::NSObject.alloc.objc_send :init }
87    assert_nothing_raised { OSX::NSArray.arrayWithObject(1).objc_send(:objectAtIndex, 0) }
88  end
89
90  def test_missing_args
91    assert_raises ArgumentError do
92      NSURL.URLWithString_
93    end
94    assert_raises ArgumentError do
95      NSURL.URLWithString_relativeToURL_('http://localhost')
96    end
97  end
98
99  def test_proxy_ancestors
100    assert(!OSX::NSProxy.ancestors.include?(OSX::NSObject))
101    assert(!OSX::NSProtocolChecker.ancestors.include?(OSX::NSObject))
102    assert(!OSX::NSDistantObject.ancestors.include?(OSX::NSObject))
103  end
104
105  def test_alias
106    # alias class method
107    assert_raises OSX::OCMessageSendException do
108      str = NSString.objc_send(:str, 'RubyCocoa')
109    end
110    OSX::NSString.objc_alias_class_method 'str:', 'stringWithString:'
111    str = NSString.objc_send(:str, 'RubyCocoa')
112    assert(str.isEqualToString?('RubyCocoa'), 'alias class method')
113    # alias instance method
114    assert_raises OSX::OCMessageSendException do
115      substr = str.objc_send(:substr, [4..8])
116    end
117    OSX::NSString.objc_alias_method 'substr:', 'substringWithRange:'
118    substr = str.objc_send(:substr, [4..8])
119    assert(substr.isEqualToString?('Cocoa'), 'alias instace method')
120    # RuntimeError should be raise when the selctor does not exist
121    assert_raises RuntimeError do
122      OSX::NSString.objc_alias_method 'foo', 'foobarbaz'
123    end
124  end
125
126  def test_inline_functions
127    rect = OSX::NSMakeRect(1,2,3,4)
128    assert_kind_of(OSX::NSRect, rect)
129    assert_equal([[1,2],[3,4]], rect.to_a)
130    assert_equal(rect, OSX::NSRect.new(1,2,3,4))
131    assert_equal(rect, OSX::NSMakeRect(1,2,3,4))
132    assert_equal(rect.origin, OSX::NSPoint.new(1,2))
133    assert_equal(rect.origin, OSX::NSMakePoint(1,2))
134    assert_equal(rect.size, OSX::NSSize.new(3,4))
135    assert_equal(rect.size, OSX::NSMakeSize(3,4))
136  end
137
138  def test_enumerator_to_a
139    ary = OSX::NSMutableArray.alloc.init
140    %w{One Two Three}.each { |o| ary.addObject(o) }
141    enum = ary.objectEnumerator
142    ary2 = enum.to_a
143    assert_kind_of(Array, ary2)
144    assert_equal(ary2, ary.to_a)
145  end
146
147  def test_convenience_setters
148    button = OSX::NSButton.alloc.initWithFrame(NSZeroRect)
149    assert_kind_of(OSX::NSControl, button)
150    button.intValue = 1
151    assert_equal(1, button.intValue)
152    button.stringValue = '0'
153    assert_equal('0', button.stringValue)
154    button.objectValue = true
155    assert_equal(true, button.objectValue.to_ruby)
156  end
157
158  def test_convenience_predicates
159    ary = OSX::NSArray.arrayWithObject(1)
160    assert(ary.equalToArray?([1]))
161    assert(!ary.equalToArray?([2]))
162  end
163
164=begin
165  # Test disabled, because #ocm_conforms? has also been disabled.
166  def test_conforms_to_protocol
167    assert(NSString.ocm_conforms?('NSMutableCopying'))
168    assert(!NSObject.ocm_conforms?('NSMutableCopying'))
169    assert(NSProxy.ocm_conforms?('NSObject'))
170    assert_raises(ArgumentError) { NSObject.ocm_conforms?('Foo') }
171  end
172=end
173end
174