Revision: 792 http://trac.macosforge.org/projects/ruby/changeset/792 Author: eloy.de.enige@gmail.com Date: 2009-01-15 07:28:56 -0800 (Thu, 15 Jan 2009) Log Message: ----------- Started refactoring test cases and turning them into ?\226?\128?\152specs?\226?\128?\153. Modified Paths: -------------- MacRuby/trunk/test-macruby/runner.rb Added Paths: ----------- MacRuby/trunk/test-macruby/cases/ MacRuby/trunk/test-macruby/cases/boxed_test.rb MacRuby/trunk/test-macruby/cases/framework_test.rb MacRuby/trunk/test-macruby/cases/hash_test.rb MacRuby/trunk/test-macruby/cases/objc_ext_test.rb MacRuby/trunk/test-macruby/cases/objc_test.rb MacRuby/trunk/test-macruby/cases/rubycocoa_test_disabled.rb MacRuby/trunk/test-macruby/cases/string_test.rb MacRuby/trunk/test-macruby/fixtures/ MacRuby/trunk/test-macruby/fixtures/PureObjCSubclass.m MacRuby/trunk/test-macruby/known_bugs/ MacRuby/trunk/test-macruby/known_bugs/extconf.rb MacRuby/trunk/test-macruby/known_bugs/known_bugs.rb MacRuby/trunk/test-macruby/known_bugs/known_bugs_in_c.c MacRuby/trunk/test-macruby/test_helper/ MacRuby/trunk/test-macruby/test_helper/objective-c_helper.rb MacRuby/trunk/test-macruby/test_helper/temp_dir_helper.rb MacRuby/trunk/test-macruby/test_helper/test_unit_helper.rb MacRuby/trunk/test-macruby/test_helper.rb Removed Paths: ------------- MacRuby/trunk/test-macruby/extconf.rb MacRuby/trunk/test-macruby/known_bugs.rb MacRuby/trunk/test-macruby/known_bugs_in_c.c MacRuby/trunk/test-macruby/rubycocoa_test.rb MacRuby/trunk/test-macruby/test_boxed.rb MacRuby/trunk/test-macruby/test_framework.rb MacRuby/trunk/test-macruby/test_hash.rb MacRuby/trunk/test-macruby/test_objc.rb MacRuby/trunk/test-macruby/test_objc_ext.rb MacRuby/trunk/test-macruby/test_string.rb Property Changed: ---------------- MacRuby/trunk/test-macruby/ Property changes on: MacRuby/trunk/test-macruby ___________________________________________________________________ Added: svn:ignore + tmp Copied: MacRuby/trunk/test-macruby/cases/boxed_test.rb (from rev 789, MacRuby/trunk/test-macruby/test_boxed.rb) =================================================================== --- MacRuby/trunk/test-macruby/cases/boxed_test.rb (rev 0) +++ MacRuby/trunk/test-macruby/cases/boxed_test.rb 2009-01-15 15:28:56 UTC (rev 792) @@ -0,0 +1,182 @@ +#!/usr/bin/env macruby + +require File.expand_path('../../test_helper', __FILE__) + +class TestBS < Test::Unit::TestCase + + def setup + framework 'Foundation' + bundle = '/tmp/_test_bs.bundle' + if !File.exist?(bundle) or File.mtime(bundle) < File.mtime(__FILE__) + s = <<EOS +#import <Foundation/Foundation.h> +@interface NSObject (MacRubyNSPointAdditions) +- (float)x; +- (float)y; +@end +@interface TestBoxed : NSObject +@end +@implementation TestBoxed +- (void)testPoint:(NSPoint)point x:(float)x y:(float)y +{ + if (point.x != x) + [NSException raise:@"NSException" + format:@"point.x (%f) != x (%f)", point.x, x]; + + if (point.y != y) + [NSException raise:@"NSException" + format:@"point.y (%f) != y (%f)", point.y, y]; +} +- (void)testPointAsObject:(id)point x:(float)x y:(float)y +{ + Class boxed; + boxed = NSClassFromString(@"Boxed"); + + if (![point isKindOfClass:boxed]) + [NSException raise:@"NSException" + format:@"point (%@) isn't a boxed type", point]; + + if (![point isKindOfClass:[NSValue class]]) + [NSException raise:@"NSException" + format:@"point (%@) isn't a value type", point]; + +#if 0 // FIXME this cannot be tested yet + if ([point x] != x) + [NSException raise:@"NSException" + format:@"[point x] (%f) != x (%f)", [point x], x]; + + if ([point y] != y) + [NSException raise:@"NSException" + format:@"[point y] (%f) != y (%f)", [point y], y]; +#endif + + if (strcmp([point objCType], @encode(NSPoint)) != 0) + [NSException raise:@"NSException" + format:@"[point objCType] (%s) != @encode(NSPoint) (%s)", + [point objCType], @encode(NSPoint)]; + + NSPoint p; + [point getValue:&p]; + [self testPoint:p x:x y:y]; +} +- (NSPoint)testReturnPointWithX:(float)x y:(float)y +{ + NSPoint p; + p.x = x; + p.y = y; + return p; +} +@end +EOS + File.open('/tmp/_test.m', 'w') { |io| io.write(s) } + system("gcc /tmp/_test.m -bundle -o #{bundle} -framework Foundation -fobjc-gc-only") or exit 1 + end + require 'dl'; DL.dlopen(bundle) + end + + def test_boxed_classes + assert_kind_of(Class, Boxed) + assert_equal(NSValue, Boxed.superclass) + + # struct + assert(NSRect.ancestors.include?(Boxed)) + assert('{_NSRect={_NSPoint=ff}{_NSSize=ff}}', NSRect.objc_type) + assert_equal([:origin, :size] , NSRect.fields) + assert(!NSRect.opaque?) + + # opaque + assert(NSZone.ancestors.include?(Boxed)) + assert_equal('^{_NSZone=}', NSZone.objc_type) + assert_equal([] , NSZone.fields) + assert(NSZone.opaque?) + end + + def test_opaque + assert_raise(TypeError) { NSZone.new } + z = 'foo'.zone + assert_kind_of(NSZone, z) + assert_equal(z, 'bar'.zone) + end + + def test_struct1 + p = NSPoint.new + assert_kind_of(NSPoint, p) + assert_equal(0.0, p.x) + assert_equal(0.0, p.y) + assert_equal([0.0, 0.0], p.to_a) + assert_equal(p, NSPoint.new) + assert_equal(p, p.dup) + assert_equal(p, p.clone) + assert_equal(p, NSZeroPoint) + + p.x += 1 + assert_equal(1.0, p.x) + assert_equal([1.0, 0.0], p.to_a) + + p2 = NSPoint.new(1.0, 2.0) + assert_equal(p.x, p2.x) + assert_not_equal(p.y, p2.y) + p.y += 2 + assert_equal(p.y, p2.y) + + assert_raise(ArgumentError) { NSPoint.new(42) } + assert_raise(ArgumentError) { NSPoint.new(42, 42, 42) } + assert_raise(TypeError) { NSPoint.new(nil, nil) } + assert_raise(ArgumentError) { NSPoint.new('foo', 'bar') } + assert_raise(TypeError) { p.x = nil } + assert_raise(ArgumentError) { p.x = 'foo' } + + r = NSRect.new + assert_kind_of(NSRect, r) + assert_equal(NSZeroPoint, r.origin) + assert_equal(NSZeroSize, r.size) + assert_equal([NSZeroPoint, NSZeroSize], r.to_a) + + assert_raise(ArgumentError) { r.origin = nil } + assert_raise(ArgumentError) { r.origin = 'foo' } + + r2 = NSRect.new(p, NSSize.new(42.0, 42.0)) + assert_not_equal(r, r2) + r.size = NSSize.new(42.0, 42.0) + assert_equal(r.size, r2.size) + r.origin = p + assert_equal(r.origin, r2.origin) + assert_equal(r, r2) + r.origin.x -= 1 + r2.origin.x -= 1 + r.size.width /= 2.0 + r2.size.width /= 2.0 + assert_equal(r, r2) + assert_equal(r.to_a, r2.to_a) + end + + def test_struct_nsstring_marshalling + r = NSRange.new(1, 4) + assert_kind_of(NSString, NSStringFromRange(r)) + assert_equal('{1, 4}', NSStringFromRange(r)) + assert_equal(r, NSRangeFromString(NSStringFromRange(r))) + rect = NSRect.new(NSPoint.new(42.0, 1042.0), NSSize.new(123, 456)) + assert_equal(NSPoint.new(42.0, 1042.0), + NSPointFromString(NSStringFromPoint(rect.origin))) + end + + def test_nspoint_in_objc + p = NSPoint.new(42.0, 99.0) + o = TestBoxed.new + o.testPoint(p, x:42.0, y:99.0) + o.testPointAsObject(p, x:42.0, y:99.0) + assert_equal(p, o.testReturnPointWithX(42.0, y:99.0)) + end + + class MethodReturningBoxed + def foo + NSPoint.new(1, 2) + end + end + def test_objc_call_pure_method_returning_boxed + o = MethodReturningBoxed.new + assert_equal(NSPoint.new(1, 2), o.send(:foo)) + assert_equal(NSPoint.new(1, 2), o.performSelector(:foo)) + end + +end Property changes on: MacRuby/trunk/test-macruby/cases/boxed_test.rb ___________________________________________________________________ Added: svn:mergeinfo + Copied: MacRuby/trunk/test-macruby/cases/framework_test.rb (from rev 789, MacRuby/trunk/test-macruby/test_framework.rb) =================================================================== --- MacRuby/trunk/test-macruby/cases/framework_test.rb (rev 0) +++ MacRuby/trunk/test-macruby/cases/framework_test.rb 2009-01-15 15:28:56 UTC (rev 792) @@ -0,0 +1,29 @@ +#!/usr/bin/env macruby + +require File.expand_path('../../test_helper', __FILE__) + +class TestFramework < Test::Unit::TestCase + + def test_setup + framework('Foundation') + end + + def test_framework_by_name + assert_nothing_raised { framework('Foundation') } + assert_raise(RuntimeError) { framework('DoesNotExist') } + end + + def test_framework_by_path + assert_nothing_raised do + framework('/System/Library/Frameworks/Foundation.framework') + end + assert_raise(RuntimeError) { framework('/does/not/exist') } + end + + def test_framework_load_twice + assert_equal(false, framework('Foundation')) + assert_equal(false, + framework('/System/Library/Frameworks/Foundation.framework')) + end + +end Property changes on: MacRuby/trunk/test-macruby/cases/framework_test.rb ___________________________________________________________________ Added: svn:mergeinfo + Copied: MacRuby/trunk/test-macruby/cases/hash_test.rb (from rev 789, MacRuby/trunk/test-macruby/test_hash.rb) =================================================================== --- MacRuby/trunk/test-macruby/cases/hash_test.rb (rev 0) +++ MacRuby/trunk/test-macruby/cases/hash_test.rb 2009-01-15 15:28:56 UTC (rev 792) @@ -0,0 +1,91 @@ +#!/usr/bin/env macruby + +require File.expand_path('../../test_helper', __FILE__) + +class TestHash < Test::Unit::TestCase + + def test_hash_class + assert(Hash.is_a?(Class)) + assert(Hash.ancestors.include?(NSDictionary)) + assert(Hash.ancestors.include?(NSMutableDictionary)) + end + + def test_hash_create + h = {} + assert_kind_of(Hash, h) + h = {'a' => 100} + assert_kind_of(Hash, h) + h = Hash.new + assert_kind_of(Hash, h) + h = Hash.alloc.init + assert_kind_of(Hash, h) + h = Hash['a', 100, 'b', 200] + assert_kind_of(Hash, h) + h = Hash['a' => 100, 'b' => 200] + assert_kind_of(Hash, h) + end + + class MyHash < Hash; end + def test_hash_create_subclass + assert(MyHash.ancestors.include?(Hash)) + h = MyHash.new + assert_kind_of(MyHash, h) + h = MyHash.alloc.init + assert_kind_of(MyHash, h) + h = MyHash['a', 100, 'b', 200] + assert_kind_of(MyHash, h) + h = MyHash['a' => 100, 'b' => 200] + assert_kind_of(MyHash, h) + end + + def test_hash_cannot_modify_immutable + h = NSDictionary.new + assert_raise(RuntimeError) { h[1] = 1 } + assert_raise(RuntimeError) { h.clear } + h = NSDictionary.alloc.init + assert_raise(RuntimeError) { h[1] = 1 } + assert_raise(RuntimeError) { h.clear } + end + + def test_hash_get_set + h = {} + h[1] = 2 + assert_equal(2, h[1]) + h['foo'] = 3 + assert_equal(3, h['foo']) + assert_equal(3, h[String.new('foo')]) + h[[1,2]] = 4 + assert_equal(4, h[[1,2]]) + assert_equal(4, h[Array.new([1,2])]) + h[:sym] = 5 + assert_equal(5, h[:sym]) + assert_equal(5, h['sym'.intern]) + end + + def test_hash_count + h = {} + assert_equal(0, h.size) + assert_equal(0, h.count) + assert(h.empty?) + h[1] = 2 + assert_equal(1, h.size) + assert_equal(1, h.count) + assert(!h.empty?) + h[1] = nil + assert_equal(1, h.size) + assert_equal(1, h.count) + assert(!h.empty?) + h.delete(1) + assert_equal(0, h.size) + assert_equal(0, h.count) + assert(h.empty?) + end + + def test_hash_clear + h = {1=>2} + h.clear + assert(h.empty?) + assert_equal(nil, h[1]) + end + +end Property changes on: MacRuby/trunk/test-macruby/cases/hash_test.rb ___________________________________________________________________ Added: svn:mergeinfo + Copied: MacRuby/trunk/test-macruby/cases/objc_ext_test.rb (from rev 789, MacRuby/trunk/test-macruby/test_objc_ext.rb) =================================================================== --- MacRuby/trunk/test-macruby/cases/objc_ext_test.rb (rev 0) +++ MacRuby/trunk/test-macruby/cases/objc_ext_test.rb 2009-01-15 15:28:56 UTC (rev 792) @@ -0,0 +1,89 @@ +#!/usr/bin/env macruby + +require File.expand_path('../../test_helper', __FILE__) + +framework 'Cocoa' + +# These tests should probably move to the macruby part of rubyspec once we get to that point. + +require 'objc_ext/ns_user_defaults' + +class TestNSUserDefaultsExtensions < Test::Unit::TestCase + it "should returns a value for a given key through the #[] reader method" do + defaults.setValue('foo', forKey: 'key') + assert_equal 'foo', defaults['key'] + end + + it "should assign a value for a given key through the #[]= writer method" do + defaults['key'] = 'foo' + assert_equal 'foo', defaults.valueForKey('key') + end + + it "should remove an object for a given key with the #delete method" do + defaults.setValue('foo', forKey: 'key') + defaults.delete('key') + assert_nil defaults.valueForKey('key') + end + + private + + def defaults + NSUserDefaults.standardUserDefaults + end +end + +require 'objc_ext/ns_rect' + +class TestNSRectExtensions < Test::Unit::TestCase + def setup + @rect = NSRect.new([100, 100], [200, 200]) + end + + it "should return its size instance's height with #height" do + assert_equal 200, @rect.height + end + + it "should assign the height to its size instance with #height=" do + @rect.height = 300 + assert_equal 300, @rect.height + + @rect.height = NSNumber.numberWithInt(400) + assert_equal 400, @rect.height + end + + it "should return its size instance's width with #width" do + assert_equal 200, @rect.width + end + + it "should assign the width to its size instance with #width=" do + @rect.width = 300 + assert_equal 300, @rect.width + + @rect.width = NSNumber.numberWithInt(400) + assert_equal 400, @rect.width + end + + it "should return its origin instance's x coord with #x" do + assert_equal 100, @rect.x + end + + it "should assign the x coord to its origin instance with #x=" do + @rect.x = 200 + assert_equal 200, @rect.x + + @rect.x = NSNumber.numberWithInt(300) + assert_equal 300, @rect.x + end + + it "should return its origin instance's y coord with #y" do + assert_equal 100, @rect.y + end + + it "should assign the y coord to its origin instance with #y=" do + @rect.y = 200 + assert_equal 200, @rect.y + + @rect.y = NSNumber.numberWithInt(300) + assert_equal 300, @rect.y + end +end \ No newline at end of file Property changes on: MacRuby/trunk/test-macruby/cases/objc_ext_test.rb ___________________________________________________________________ Added: svn:mergeinfo + Copied: MacRuby/trunk/test-macruby/cases/objc_test.rb (from rev 791, MacRuby/trunk/test-macruby/test_objc.rb) =================================================================== --- MacRuby/trunk/test-macruby/cases/objc_test.rb (rev 0) +++ MacRuby/trunk/test-macruby/cases/objc_test.rb 2009-01-15 15:28:56 UTC (rev 792) @@ -0,0 +1,175 @@ +#!/usr/bin/env macruby + +require File.expand_path('../../test_helper', __FILE__) + +class MacRuby::TestClassConstantLookup < Test::Unit::TestCase + module Namespace + class PureRubyClass; end + module PureRubyModule; end + SINGLETON = (class << self; self; end) + end + + it "should not find pure Ruby classes in different namespaces" do + assert_raise(NameError) { PureRubyClass } + end + + it "should find pure Ruby classes in different namespaces if given the correct path" do + assert_nothing_raised(NameError) { Namespace::PureRubyClass } + end + + it "should not find pure Ruby modules in different namespaces" do + assert_raise(NameError) { PureRubyModule } + end + + it "should find pure Ruby modules in different namespaces if given the correct path" do + assert_nothing_raised(NameError) { Namespace::PureRubyModule } + end + + it "should not find pure Ruby class singletons in different namespaces" do + assert_raise(NameError) { SINGLETON } + end + + it "should find pure Ruby class singletons in different namespaces if given the correct path" do + assert_nothing_raised(NameError) { Namespace::SINGLETON } + end +end + +class MacRuby::TestKeyedArguments < Test::Unit::TestCase + before do + @key, @value = "key", NSObject.new + end + + it "should allow the user to specify each argument by name" do + dictionary = {} + dictionary.setValue(@value, forKey: @key) + + assert_equal @value, dictionary.valueForKey(@key) + end + + it "should still find a method without keyed arguments, even if the last argument is a hash" do + obj = NSObject.new + def obj.method(first, *others) + [first, others] # stub this method to return all args + end + + assert_equal [:first, []], obj.method(:first) + assert_equal [:first, [:foo => 'foo']], obj.method(:first, foo: 'foo') + assert_equal [:first, [:foo => 'foo', :bar => 'bar']], obj.method(:first, foo: 'foo', bar: 'bar') + end + + it "should forward method calls with #performSelector when selector is given as String" do + dictionary = NSMutableDictionary.performSelector('new') + dictionary.performSelector('setObject:forKey:', withObject: @value, withObject: @key) + + assert_equal @value, dictionary.performSelector('objectForKey:', withObject: @key) + end + + it "should forward method calls with #performSelector when selector is given as Symbol" do + dictionary = NSMutableDictionary.performSelector(:'new') + dictionary.performSelector(:'setObject:forKey:', withObject: @value, withObject: @key) + + assert_equal @value, dictionary.performSelector(:'objectForKey:', withObject: @key) + end + + it "should forward method calls with #send when selector is given as String" do + dictionary = NSMutableDictionary.send('new') + dictionary.send('setObject:forKey:', @value, @key) + + assert_equal @value, dictionary.send('objectForKey:', @key) + end + + it "should forward method calls with #send when selector is given as Symbol" do + dictionary = NSMutableDictionary.send(:new) + dictionary.send(:'setObject:forKey:', @value, @key) + + assert_equal @value, dictionary.send(:'objectForKey:', @key) + end +end + +class MacRuby::TestGeneralSyntax < Test::Unit::TestCase + it "should find a Objective-C method with varying number of arguments" do + [ + ['"foo" == "bar"'], + ['"foo" == %@', 'bar'], + ['%@ == %@', 'foo', 'bar'] + + ].each do |arguments| + assert_equal '"foo" == "bar"', NSPredicate.predicateWithFormat(*arguments).predicateFormat + end + end +end + +class MacRuby::TestInstanceVariableAccess < Test::Unit::TestCase + it "should assign an instance variable on an instance of a pure Objective-C class and _not_ garbage collect it" do + obj = NSObject.alloc.init + obj.instance_variable_set(:@foo, 'foo') + GC.start + + assert_equal 'foo', obj.instance_variable_get(:@foo) + end + + it "should assign an instance variable on an instance of a CoreFoundation class and _not_ garbage collect it" do + obj = NSString.alloc.init + obj.instance_variable_set(:@foo, 'foo') + GC.start + + assert_equal 'foo', obj.instance_variable_get(:@foo) + end +end + +class MacRuby::TestMethodDispatch < Test::Unit::TestCase + it "should find a method on a pure Objective-C class in the dispatch chain, before a method on a module that is included" do + objc = ObjectiveC.new(fixture('PureObjCSubclass.m')) + objc.compile! + objc.require! + + assert_equal "FOO", PureObjCSubclass.alloc.init.require("foo") + end + + it "should find a method on a class in the dispatch chain, before a method on a module that is included" do + klass = Class.new do + def require(name) + name.upcase + end + end + + assert_equal "FOO", klass.new.require("foo") + end + + it "should find a method on a singleton in the dispatch chain, before a method on a module that is included" do + obj = NSObject.new + def obj.require(name) + name.upcase + end + + assert_equal "FOO", obj.require("foo") + end +end + +class MacRuby::TestPrimitiveTypes < Test::Unit::TestCase + before do + objc = ObjectiveC.new(fixture('PureObjCSubclass.m')) + objc.compile! + objc.require! + + @pure_objc_instance = PureObjCSubclass.alloc.init + end + + it "should be possible to use a Ruby String as dictionary key and pass the dictionary of into Objective-C land" do + key = String.new("foo") + value = Object.new + dictionary = { key => value } + + assert_equal value, @pure_objc_instance.test_getObject(dictionary, forKey: key) + end +end + +class MacRuby::TestInstantiation < Test::Unit::TestCase + it "should instantiate with klass::new" do + assert_kind_of NSObject, NSObject.new + end + + it "should instantiate with klass::alloc.init" do + assert_kind_of NSObject, NSObject.alloc.init + end +end Property changes on: MacRuby/trunk/test-macruby/cases/objc_test.rb ___________________________________________________________________ Added: svn:mergeinfo + Copied: MacRuby/trunk/test-macruby/cases/rubycocoa_test_disabled.rb (from rev 789, MacRuby/trunk/test-macruby/rubycocoa_test.rb) =================================================================== --- MacRuby/trunk/test-macruby/cases/rubycocoa_test_disabled.rb (rev 0) +++ MacRuby/trunk/test-macruby/cases/rubycocoa_test_disabled.rb 2009-01-15 15:28:56 UTC (rev 792) @@ -0,0 +1,253 @@ +#!/usr/local/bin/macruby + +require "test/spec" +require 'mocha' + +#require File.expand_path('../../lib/osx/cocoa', __FILE__) +require 'osx/cocoa' + +class TestRubyCocoaStyleMethod < OSX::NSObject + def initialize + @set_from_initialize = 'represent!' + end + + def perform_selector_with_object(sel, obj) + callMethod_withArgs(sel, obj) + end + + def callMethod(method, withArgs:args) + send(method, *args) + end + + def method_rubyCocoaStyle_withExtraArg(mname, rc_style, arg) + "#{mname}(#{rc_style}, #{arg})" + end + + def method_notRubyCocoaStyle(first_arg, second_arg, third_arg) + end + + def self.classMethod(mname, macRubyStyle:mr_style, withExtraArg:arg) + "#{mname}(#{mr_style}, #{arg})" + end +end + +class TestRubyCocoaStyleSuperMethod < OSX::NSObject + def init + self if super_init + end +end + +class NSObjectSubclassWithInitialize < OSX::NSObject + def initialize + @set_from_initialize = 'represent!' + end +end + +class NSObjectSubclassWithoutInitialize < OSX::NSObject; end + +CONSTANT_IN_THE_TOPLEVEL_OBJECT_INSTEAD_OF_OSX = true + +describe "RubyCocoa layer, in general" do + xit "should load AppKit when the osx/cocoa file is loaded" do + Kernel.expects(:framework).with('AppKit') + load 'osx/cocoa.rb' + end + + it "should set a global variable which indicates that a framework is being loaded" do + Kernel.expects(:__framework_before_rubycocoa_layer).with do |f| + $LOADING_FRAMEWORK.should.be true + f == 'Foo' + end + Kernel.framework 'Foo' + $LOADING_FRAMEWORK.should.be false + end +end + +describe "NSObject additions" do + before do + @obj = TestRubyCocoaStyleMethod.alloc.init + end + + it "should alias ib_outlet to ib_outlets" do + TestRubyCocoaStyleMethod.private_methods.should.include :ib_outlets + end + + it "should call initialize from init if it exists" do + NSObjectSubclassWithInitialize.alloc.init.instance_variable_get(:@set_from_initialize).should == 'represent!' + NSObjectSubclassWithoutInitialize.alloc.init.instance_variable_get(:@set_from_initialize).should.be nil + end + + it "should catch RubyCocoa style instance method, call the correct MacRuby style method and define a shortcut method" do + @obj.perform_selector_with_object('description', nil).should.match /^<TestRubyCocoaStyleMethod/ + @obj.respond_to?(:callMethod_withArgs).should.be true + @obj.perform_selector_with_object('description', nil).should.match /^<TestRubyCocoaStyleMethod/ + end + + it "should catch RubyCocoa style instance methods that end with a underscore" do + @obj.callMethod_withArgs_('description', nil).should.match /^<TestRubyCocoaStyleMethod/ + @obj.respond_to?(:callMethod_withArgs_).should.be true + end + + it "should catch RubyCocoa style instance methods defined in Objective-C" do + color = NSColor.colorWithCalibratedRed(1.0, green:1.0, blue:1.0, alpha:1.0) + lambda { color.blendedColorWithFraction_ofColor(0.5, NSColor.greenColor) }.should.not.raise NoMethodError + end + + it "should catch RubyCocoa style class methods defined in ruby" do + lambda { TestRubyCocoaStyleMethod.classMethod_macRubyStyle_withExtraArg(1, 2, 3) }.should.not.raise NoMethodError + TestRubyCocoaStyleMethod.respond_to?(:classMethod_macRubyStyle_withExtraArg).should.be true + end + + it "should catch RubyCocoa style class methods defined in Objective-C" do + lambda { NSColor.colorWithCalibratedRed_green_blue_alpha(1.0, 1.0, 1.0, 1.0) }.should.not.raise NoMethodError + NSColor.respond_to?(:colorWithCalibratedRed_green_blue_alpha).should.be true + end + + it "should still raise NoMethodError if a class method doesn't exist" do + lambda { NSColor.colorWithCalibratedRed_pink(1.0, 1.0) }.should.raise NoMethodError + end + + it "should also work on other regular NSObject subclasses" do + nsstring = 'foo' + nsstring.insertString_atIndex('bar', 3) + nsstring.should == 'foobar' + end + + it "should still raise a NoMethodError if the selector doesn't exist when a method is missing" do + lambda { @obj.does_not_exist }.should.raise NoMethodError + lambda { @obj.doesnotexist_ }.should.raise NoMethodError + lambda { @obj.doesnotexist }.should.raise NoMethodError + end + + it "should be possible to call super_foo type methods" do + lambda { TestRubyCocoaStyleSuperMethod.alloc.init }.should.not.raise.exception + end + + it "should handle objc_send style methods" do + nsstring = 'foo' + nsstring.objc_send(:insertString, 'bar', :atIndex, 3) + nsstring.should == 'foobar' + nsstring.objc_send(:description).should == 'foobar' + lambda { nsstring.objc_send(:does_not_exist) }.should.raise NoMethodError + end + + it "should create MacRuby style method aliases for any method containing underscores" do + @obj.respond_to?(:"method:rubyCocoaStyle:withExtraArg:").should.be true + @obj.method('foo', rubyCocoaStyle:true, withExtraArg:false).should == 'foo(true, false)' + end + + it "should not create MacRuby style method aliases for methods containing underscores if the arity doesn't match" do + @obj.respond_to?(:"method:notRubyCocoaStyle:").should.be false + end + + it "should respond to to_ruby" do + @obj.respond_to?(:to_ruby).should.be true + end +end + +describe 'OSX module' do + it "should exist" do + defined?(OSX).should.not.be nil # this is weird.. I haven't defined OSX yet?! + end + + it "should load a framework into the runtime" do + OSX.require_framework 'WebKit' + defined?(WebView).should.not.be nil + + OSX.require_framework '/System/Library/Frameworks/QTKit.framework' + defined?(QTMovie).should.not.be nil + end + + it "should forward messages to Kernel if it responds to it" do + Kernel.expects(:NSRectFill).with(1, 2).times(2) + OSX::NSRectFill(1, 2) + OSX.respond_to?(:NSRectFill).should.be true + OSX::NSRectFill(1, 2) + + lambda { OSX::NSRectFillllllll(1, 2) }.should.raise NoMethodError + end + + it "should try to get missing constants from the toplevel object" do + OSX::CONSTANT_IN_THE_TOPLEVEL_OBJECT_INSTEAD_OF_OSX.should.be true + end + + it "should still raise a NameError from OSX, not from the toplevel object, when a constant is missing" do + lambda { OSX::DOES_NOT_EXIST_IN_TOPLEVEL_OBJECT }.should.raise NameError + + begin + OSX::DOES_NOT_EXIST_IN_TOPLEVEL_OBJECT + rescue NameError => e + e.message.should.include 'OSX::DOES_NOT_EXIST_IN_TOPLEVEL_OBJECT' + end + end +end + +describe 'NSData additions' do + before do + path = '/System/Library/DTDs/BridgeSupport.dtd' + @obj = NSData.dataWithContentsOfFile(path) + @ruby_data = File.read(path) + end + + it "should respond to rubyString" do + @obj.respond_to?(:rubyString).should.be true + @obj.rubyString.should.equal @ruby_data + end +end + +describe 'NSUserDefaults additions' do + before do + @obj = NSUserDefaults.alloc.init + end + + it "should respond to [] and []=" do + @obj.respond_to?(:[]).should.be true + @obj.respond_to?(:[]=).should.be true + @obj['key'] = 'value' + @obj['key'].should.equal 'value' + end +end + +describe 'NSIndexSet additions' do + before do + @obj = NSIndexSet.alloc.init + end + + it "should respond to to_a" do + @obj.respond_to?(:to_a).should.be true + end +end + +describe 'NSNumber additions' do + before do + @i = NSNumber.numberWithInt(42) + @f = NSNumber.numberWithDouble(42.42) + end + + it "should respond to to_i and to_f" do + @i.respond_to?(:to_i).should.be true + @i.respond_to?(:to_f).should.be true + @i.to_i.should.equal 42 + @f.to_f.should.equal 42.42 + end +end + +describe 'NSDate additions' do + before do + @obj = NSDate.alloc.init + end + + it "should respond to to_time" do + @obj.respond_to?(:to_time).should.be true + end +end + +describe 'NSImage additions' do + before do + @obj = NSImage.alloc.init + end + + it "should respond to focus" do + @obj.respond_to?(:focus).should.be true + end +end Property changes on: MacRuby/trunk/test-macruby/cases/rubycocoa_test_disabled.rb ___________________________________________________________________ Added: svn:mergeinfo + Copied: MacRuby/trunk/test-macruby/cases/string_test.rb (from rev 789, MacRuby/trunk/test-macruby/test_string.rb) =================================================================== --- MacRuby/trunk/test-macruby/cases/string_test.rb (rev 0) +++ MacRuby/trunk/test-macruby/cases/string_test.rb 2009-01-15 15:28:56 UTC (rev 792) @@ -0,0 +1,66 @@ +#!/usr/bin/env macruby + +require File.expand_path('../../test_helper', __FILE__) + +class TestString < Test::Unit::TestCase + + def setup + framework 'Foundation' + bundle = '/tmp/_test_string.bundle' + if !File.exist?(bundle) or File.mtime(bundle) < File.mtime(__FILE__) + s = <<EOS +#import <Foundation/Foundation.h> +@interface MyTestClass : NSObject +@end +@implementation MyTestClass +- (NSString*)testSubstring:(NSString*)str range:(NSRange)range +{ + unichar buf[1024]; + [str getCharacters:buf range:range]; + return [[NSString alloc] initWithCharacters:buf length:range.length]; +} +@end +EOS + File.open('/tmp/_test_string.m', 'w') { |io| io.write(s) } + system("gcc /tmp/_test_string.m -bundle -o #{bundle} -framework Foundation -fobjc-gc-only") or exit 1 + end + require 'dl'; DL.dlopen(bundle) + end + + def test_characterAtIndex + s = 'abcあいうxyz' + [0,3,6,8].each do |d| + assert_equal(s[d].ord, s.characterAtIndex(d)) + assert_equal(s[d].ord, s.characterAtIndex(d)) + end + end + + def test_getCharactersRange + s = 'abcあいうxzy' + obj = MyTestClass.alloc.init + [[0,1], [1,7], [4,3], [7,2]].each do |d| + assert_equal(s[*d], obj.testSubstring(s, range:NSRange.new(*d))) + end + end + + # + # Tests for UTF-16 surrogate pairs + # These tests should be fixed in the future. + # + # Memo: + # If an NSString consists of a character which is UTF-16 surrogate pair, + # the length of the string will be 2 in Cocoa, while 1 in ruby 1.9. + # + + def test_characterAtIndex_surrogate_pairs + s = "abc\xf0\xa3\xb4\x8exzy" + assert_equal(s[3].ord, s.characterAtIndex(3)) + end + + def test_getCharactersRange_surrogate_pairs + s = "abc\xf0\xa3\xb4\x8exzy" + obj = MyTestClass.alloc.init + assert_equal(s[2,3], obj.testSubstring(s, range:NSRange.new(2,3))) + end + +end Property changes on: MacRuby/trunk/test-macruby/cases/string_test.rb ___________________________________________________________________ Added: svn:mergeinfo + Deleted: MacRuby/trunk/test-macruby/extconf.rb =================================================================== --- MacRuby/trunk/test-macruby/extconf.rb 2009-01-15 12:52:28 UTC (rev 791) +++ MacRuby/trunk/test-macruby/extconf.rb 2009-01-15 15:28:56 UTC (rev 792) @@ -1,2 +0,0 @@ -require "mkmf" -create_makefile("known_bugs_in_c") \ No newline at end of file Added: MacRuby/trunk/test-macruby/fixtures/PureObjCSubclass.m =================================================================== --- MacRuby/trunk/test-macruby/fixtures/PureObjCSubclass.m (rev 0) +++ MacRuby/trunk/test-macruby/fixtures/PureObjCSubclass.m 2009-01-15 15:28:56 UTC (rev 792) @@ -0,0 +1,16 @@ +#import <Foundation/Foundation.h> + +@interface PureObjCSubclass : NSObject +@end + +@implementation PureObjCSubclass +- (id)require:(NSString *)name +{ + return [name uppercaseString]; +} + +- (id)test_getObject:(id)dictionary forKey:(id)key +{ + return [dictionary objectForKey:key]; +} +@end \ No newline at end of file Copied: MacRuby/trunk/test-macruby/known_bugs/extconf.rb (from rev 789, MacRuby/trunk/test-macruby/extconf.rb) =================================================================== --- MacRuby/trunk/test-macruby/known_bugs/extconf.rb (rev 0) +++ MacRuby/trunk/test-macruby/known_bugs/extconf.rb 2009-01-15 15:28:56 UTC (rev 792) @@ -0,0 +1,2 @@ +require "mkmf" +create_makefile("known_bugs_in_c") \ No newline at end of file Property changes on: MacRuby/trunk/test-macruby/known_bugs/extconf.rb ___________________________________________________________________ Added: svn:mergeinfo + Copied: MacRuby/trunk/test-macruby/known_bugs/known_bugs.rb (from rev 789, MacRuby/trunk/test-macruby/known_bugs.rb) =================================================================== --- MacRuby/trunk/test-macruby/known_bugs/known_bugs.rb (rev 0) +++ MacRuby/trunk/test-macruby/known_bugs/known_bugs.rb 2009-01-15 15:28:56 UTC (rev 792) @@ -0,0 +1,133 @@ +#!/usr/local/bin/macruby + +require "test/unit" +#framework 'Cocoa' + +module KnownBugs + class TestBugsInC < Test::Unit::TestCase + def setup + dir = File.expand_path('../', __FILE__) + exit(1) unless system("cd #{dir} && macruby extconf.rb && make") + require File.join(dir, 'known_bugs_in_c') + end + + def test_accessing_an_array_created_via_rb_str_split2 + KnownBugsInC.test_rb_str_split2("foo:bar", ":") + end + end + + class TestKernel < Test::Unit::TestCase + module ::Kernel + private + def is_callable?; true end + end + + module ::Kernel + def should_be_callable?; true end + private :should_be_callable? + end + + def test_kernel_methods_made_private_with_keyword + assert is_callable? # works + end + + def test_kernel_methods_made_private_with_class_method + assert should_be_callable? # causes endless loop + end + end + + class TestDuplicatingInstances < Test::Unit::TestCase + # Works + + class Foo; end + + def test_dup_on_an_instance_of_a_pure_ruby_class + obj = Foo.new + assert_not_equal obj, obj.dup.object_id + end + + # Fails + + def test_dup_on_an_instance_of_Object + obj = Object.new + assert_nothing_raised(NSException) do + # Raises: [NSObject copyWithZone:]: unrecognized selector sent to instance + assert_not_equal obj.object_id, obj.dup.object_id + end + end + + def test_dup_on_a_class_instance + assert_not_equal Foo.object_id, Foo.dup.object_id + end + end + + class TestStringFormatting < Test::Unit::TestCase + def test_formatting_with_a_Bignum + assert_nothing_raised(RangeError) { "%d" % 68727360256 } + end + end + + class TestIncludingModuleInClass < Test::Unit::TestCase + module ClassInstanceMethod + def a_class_instance_method; end + end + + class ::Class + include ClassInstanceMethod + end + + def test_class_should_respond_to_methods_included_in_Class + assert Class.new.respond_to?(:a_class_instance_method) + end + end + + class TestIncludingModuleInModule < Test::Unit::TestCase + module ModuleInstanceMethod + def a_module_instance_method; end + end + + class ::Module + include ModuleInstanceMethod + end + + def test_module_should_respond_to_methods_included_in_Module + assert Module.new.respond_to?(:a_module_instance_method) + end + end + + class TestConstantLookup < Test::Unit::TestCase + module Namespace + NamespacedConstant = nil + class NamespacedClass; end + end + + def test_should_not_find_namespaced_constants # works + assert_raise(NameError) { NamespacedConstant } + end + + def test_should_not_find_namespaced_classes # fails + assert_raise(NameError) { NamespacedClass } + end + end + + class TestRespondTo < Test::Unit::TestCase + class RespondTo + def respond_to?(method, hidden = false) + super + end + end + + def test_super_implementation + assert_nothing_raised(SystemStackError) do + RespondTo.new.respond_to?(:object_id) + end + end + end + + class TestBooleanComparison < Test::Unit::TestCase + def test_NSCFBoolean_comparison_to_Ruby_bool + assert_equal true, NSNumber.numberWithBool(true) + assert_equal false, NSNumber.numberWithBool(false) + end + end +end \ No newline at end of file Property changes on: MacRuby/trunk/test-macruby/known_bugs/known_bugs.rb ___________________________________________________________________ Added: svn:mergeinfo + Copied: MacRuby/trunk/test-macruby/known_bugs/known_bugs_in_c.c (from rev 789, MacRuby/trunk/test-macruby/known_bugs_in_c.c) =================================================================== --- MacRuby/trunk/test-macruby/known_bugs/known_bugs_in_c.c (rev 0) +++ MacRuby/trunk/test-macruby/known_bugs/known_bugs_in_c.c 2009-01-15 15:28:56 UTC (rev 792) @@ -0,0 +1,17 @@ +#include "ruby/ruby.h" + +static VALUE +known_bug_rb_str_split2(VALUE recv, VALUE str, VALUE sep) +{ + VALUE parts = rb_str_split2(str, sep); + // Accessing the array goes wrong, has it been collected? + // Because at the end of rb_str_split_m the `result' _is_ the array as expected… + return rb_ary_entry(parts, 0); +} + +void Init_known_bugs_in_c() { + VALUE cKnownBugsInC; + + cKnownBugsInC = rb_define_module("KnownBugsInC"); + rb_define_module_function(cKnownBugsInC, "test_rb_str_split2", known_bug_rb_str_split2, 2); +} \ No newline at end of file Property changes on: MacRuby/trunk/test-macruby/known_bugs/known_bugs_in_c.c ___________________________________________________________________ Added: svn:mergeinfo + Deleted: MacRuby/trunk/test-macruby/known_bugs.rb =================================================================== --- MacRuby/trunk/test-macruby/known_bugs.rb 2009-01-15 12:52:28 UTC (rev 791) +++ MacRuby/trunk/test-macruby/known_bugs.rb 2009-01-15 15:28:56 UTC (rev 792) @@ -1,133 +0,0 @@ -#!/usr/local/bin/macruby - -require "test/unit" -#framework 'Cocoa' - -module KnownBugs - class TestBugsInC < Test::Unit::TestCase - def setup - dir = File.expand_path('../', __FILE__) - exit(1) unless system("cd #{dir} && macruby extconf.rb && make") - require File.join(dir, 'known_bugs_in_c') - end - - def test_accessing_an_array_created_via_rb_str_split2 - KnownBugsInC.test_rb_str_split2("foo:bar", ":") - end - end - - class TestKernel < Test::Unit::TestCase - module ::Kernel - private - def is_callable?; true end - end - - module ::Kernel - def should_be_callable?; true end - private :should_be_callable? - end - - def test_kernel_methods_made_private_with_keyword - assert is_callable? # works - end - - def test_kernel_methods_made_private_with_class_method - assert should_be_callable? # causes endless loop - end - end - - class TestDuplicatingInstances < Test::Unit::TestCase - # Works - - class Foo; end - - def test_dup_on_an_instance_of_a_pure_ruby_class - obj = Foo.new - assert_not_equal obj, obj.dup.object_id - end - - # Fails - - def test_dup_on_an_instance_of_Object - obj = Object.new - assert_nothing_raised(NSException) do - # Raises: [NSObject copyWithZone:]: unrecognized selector sent to instance - assert_not_equal obj.object_id, obj.dup.object_id - end - end - - def test_dup_on_a_class_instance - assert_not_equal Foo.object_id, Foo.dup.object_id - end - end - - class TestStringFormatting < Test::Unit::TestCase - def test_formatting_with_a_Bignum - assert_nothing_raised(RangeError) { "%d" % 68727360256 } - end - end - - class TestIncludingModuleInClass < Test::Unit::TestCase - module ClassInstanceMethod - def a_class_instance_method; end - end - - class ::Class - include ClassInstanceMethod - end - - def test_class_should_respond_to_methods_included_in_Class - assert Class.new.respond_to?(:a_class_instance_method) - end - end - - class TestIncludingModuleInModule < Test::Unit::TestCase - module ModuleInstanceMethod - def a_module_instance_method; end - end - - class ::Module - include ModuleInstanceMethod - end - - def test_module_should_respond_to_methods_included_in_Module - assert Module.new.respond_to?(:a_module_instance_method) - end - end - - class TestConstantLookup < Test::Unit::TestCase - module Namespace - NamespacedConstant = nil - class NamespacedClass; end - end - - def test_should_not_find_namespaced_constants # works - assert_raise(NameError) { NamespacedConstant } - end - - def test_should_not_find_namespaced_classes # fails - assert_raise(NameError) { NamespacedClass } - end - end - - class TestRespondTo < Test::Unit::TestCase - class RespondTo - def respond_to?(method, hidden = false) - super - end - end - - def test_super_implementation - assert_nothing_raised(SystemStackError) do - RespondTo.new.respond_to?(:object_id) - end - end - end - - class TestBooleanComparison < Test::Unit::TestCase - def test_NSCFBoolean_comparison_to_Ruby_bool - assert_equal true, NSNumber.numberWithBool(true) - assert_equal false, NSNumber.numberWithBool(false) - end - end -end \ No newline at end of file Deleted: MacRuby/trunk/test-macruby/known_bugs_in_c.c =================================================================== --- MacRuby/trunk/test-macruby/known_bugs_in_c.c 2009-01-15 12:52:28 UTC (rev 791) +++ MacRuby/trunk/test-macruby/known_bugs_in_c.c 2009-01-15 15:28:56 UTC (rev 792) @@ -1,17 +0,0 @@ -#include "ruby/ruby.h" - -static VALUE -known_bug_rb_str_split2(VALUE recv, VALUE str, VALUE sep) -{ - VALUE parts = rb_str_split2(str, sep); - // Accessing the array goes wrong, has it been collected? - // Because at the end of rb_str_split_m the `result' _is_ the array as expected… - return rb_ary_entry(parts, 0); -} - -void Init_known_bugs_in_c() { - VALUE cKnownBugsInC; - - cKnownBugsInC = rb_define_module("KnownBugsInC"); - rb_define_module_function(cKnownBugsInC, "test_rb_str_split2", known_bug_rb_str_split2, 2); -} \ No newline at end of file Deleted: MacRuby/trunk/test-macruby/rubycocoa_test.rb =================================================================== --- MacRuby/trunk/test-macruby/rubycocoa_test.rb 2009-01-15 12:52:28 UTC (rev 791) +++ MacRuby/trunk/test-macruby/rubycocoa_test.rb 2009-01-15 15:28:56 UTC (rev 792) @@ -1,253 +0,0 @@ -#!/usr/local/bin/macruby - -require "test/spec" -require 'mocha' - -#require File.expand_path('../../lib/osx/cocoa', __FILE__) -require 'osx/cocoa' - -class TestRubyCocoaStyleMethod < OSX::NSObject - def initialize - @set_from_initialize = 'represent!' - end - - def perform_selector_with_object(sel, obj) - callMethod_withArgs(sel, obj) - end - - def callMethod(method, withArgs:args) - send(method, *args) - end - - def method_rubyCocoaStyle_withExtraArg(mname, rc_style, arg) - "#{mname}(#{rc_style}, #{arg})" - end - - def method_notRubyCocoaStyle(first_arg, second_arg, third_arg) - end - - def self.classMethod(mname, macRubyStyle:mr_style, withExtraArg:arg) - "#{mname}(#{mr_style}, #{arg})" - end -end - -class TestRubyCocoaStyleSuperMethod < OSX::NSObject - def init - self if super_init - end -end - -class NSObjectSubclassWithInitialize < OSX::NSObject - def initialize - @set_from_initialize = 'represent!' - end -end - -class NSObjectSubclassWithoutInitialize < OSX::NSObject; end - -CONSTANT_IN_THE_TOPLEVEL_OBJECT_INSTEAD_OF_OSX = true - -describe "RubyCocoa layer, in general" do - xit "should load AppKit when the osx/cocoa file is loaded" do - Kernel.expects(:framework).with('AppKit') - load 'osx/cocoa.rb' - end - - it "should set a global variable which indicates that a framework is being loaded" do - Kernel.expects(:__framework_before_rubycocoa_layer).with do |f| - $LOADING_FRAMEWORK.should.be true - f == 'Foo' - end - Kernel.framework 'Foo' - $LOADING_FRAMEWORK.should.be false - end -end - -describe "NSObject additions" do - before do - @obj = TestRubyCocoaStyleMethod.alloc.init - end - - it "should alias ib_outlet to ib_outlets" do - TestRubyCocoaStyleMethod.private_methods.should.include :ib_outlets - end - - it "should call initialize from init if it exists" do - NSObjectSubclassWithInitialize.alloc.init.instance_variable_get(:@set_from_initialize).should == 'represent!' - NSObjectSubclassWithoutInitialize.alloc.init.instance_variable_get(:@set_from_initialize).should.be nil - end - - it "should catch RubyCocoa style instance method, call the correct MacRuby style method and define a shortcut method" do - @obj.perform_selector_with_object('description', nil).should.match /^<TestRubyCocoaStyleMethod/ - @obj.respond_to?(:callMethod_withArgs).should.be true - @obj.perform_selector_with_object('description', nil).should.match /^<TestRubyCocoaStyleMethod/ - end - - it "should catch RubyCocoa style instance methods that end with a underscore" do - @obj.callMethod_withArgs_('description', nil).should.match /^<TestRubyCocoaStyleMethod/ - @obj.respond_to?(:callMethod_withArgs_).should.be true - end - - it "should catch RubyCocoa style instance methods defined in Objective-C" do - color = NSColor.colorWithCalibratedRed(1.0, green:1.0, blue:1.0, alpha:1.0) - lambda { color.blendedColorWithFraction_ofColor(0.5, NSColor.greenColor) }.should.not.raise NoMethodError - end - - it "should catch RubyCocoa style class methods defined in ruby" do - lambda { TestRubyCocoaStyleMethod.classMethod_macRubyStyle_withExtraArg(1, 2, 3) }.should.not.raise NoMethodError - TestRubyCocoaStyleMethod.respond_to?(:classMethod_macRubyStyle_withExtraArg).should.be true - end - - it "should catch RubyCocoa style class methods defined in Objective-C" do - lambda { NSColor.colorWithCalibratedRed_green_blue_alpha(1.0, 1.0, 1.0, 1.0) }.should.not.raise NoMethodError - NSColor.respond_to?(:colorWithCalibratedRed_green_blue_alpha).should.be true - end - - it "should still raise NoMethodError if a class method doesn't exist" do - lambda { NSColor.colorWithCalibratedRed_pink(1.0, 1.0) }.should.raise NoMethodError - end - - it "should also work on other regular NSObject subclasses" do - nsstring = 'foo' - nsstring.insertString_atIndex('bar', 3) - nsstring.should == 'foobar' - end - - it "should still raise a NoMethodError if the selector doesn't exist when a method is missing" do - lambda { @obj.does_not_exist }.should.raise NoMethodError - lambda { @obj.doesnotexist_ }.should.raise NoMethodError - lambda { @obj.doesnotexist }.should.raise NoMethodError - end - - it "should be possible to call super_foo type methods" do - lambda { TestRubyCocoaStyleSuperMethod.alloc.init }.should.not.raise.exception - end - - it "should handle objc_send style methods" do - nsstring = 'foo' - nsstring.objc_send(:insertString, 'bar', :atIndex, 3) - nsstring.should == 'foobar' - nsstring.objc_send(:description).should == 'foobar' - lambda { nsstring.objc_send(:does_not_exist) }.should.raise NoMethodError - end - - it "should create MacRuby style method aliases for any method containing underscores" do - @obj.respond_to?(:"method:rubyCocoaStyle:withExtraArg:").should.be true - @obj.method('foo', rubyCocoaStyle:true, withExtraArg:false).should == 'foo(true, false)' - end - - it "should not create MacRuby style method aliases for methods containing underscores if the arity doesn't match" do - @obj.respond_to?(:"method:notRubyCocoaStyle:").should.be false - end - - it "should respond to to_ruby" do - @obj.respond_to?(:to_ruby).should.be true - end -end - -describe 'OSX module' do - it "should exist" do - defined?(OSX).should.not.be nil # this is weird.. I haven't defined OSX yet?! - end - - it "should load a framework into the runtime" do - OSX.require_framework 'WebKit' - defined?(WebView).should.not.be nil - - OSX.require_framework '/System/Library/Frameworks/QTKit.framework' - defined?(QTMovie).should.not.be nil - end - - it "should forward messages to Kernel if it responds to it" do - Kernel.expects(:NSRectFill).with(1, 2).times(2) - OSX::NSRectFill(1, 2) - OSX.respond_to?(:NSRectFill).should.be true - OSX::NSRectFill(1, 2) - - lambda { OSX::NSRectFillllllll(1, 2) }.should.raise NoMethodError - end - - it "should try to get missing constants from the toplevel object" do - OSX::CONSTANT_IN_THE_TOPLEVEL_OBJECT_INSTEAD_OF_OSX.should.be true - end - - it "should still raise a NameError from OSX, not from the toplevel object, when a constant is missing" do - lambda { OSX::DOES_NOT_EXIST_IN_TOPLEVEL_OBJECT }.should.raise NameError - - begin - OSX::DOES_NOT_EXIST_IN_TOPLEVEL_OBJECT - rescue NameError => e - e.message.should.include 'OSX::DOES_NOT_EXIST_IN_TOPLEVEL_OBJECT' - end - end -end - -describe 'NSData additions' do - before do - path = '/System/Library/DTDs/BridgeSupport.dtd' - @obj = NSData.dataWithContentsOfFile(path) - @ruby_data = File.read(path) - end - - it "should respond to rubyString" do - @obj.respond_to?(:rubyString).should.be true - @obj.rubyString.should.equal @ruby_data - end -end - -describe 'NSUserDefaults additions' do - before do - @obj = NSUserDefaults.alloc.init - end - - it "should respond to [] and []=" do - @obj.respond_to?(:[]).should.be true - @obj.respond_to?(:[]=).should.be true - @obj['key'] = 'value' - @obj['key'].should.equal 'value' - end -end - -describe 'NSIndexSet additions' do - before do - @obj = NSIndexSet.alloc.init - end - - it "should respond to to_a" do - @obj.respond_to?(:to_a).should.be true - end -end - -describe 'NSNumber additions' do - before do - @i = NSNumber.numberWithInt(42) - @f = NSNumber.numberWithDouble(42.42) - end - - it "should respond to to_i and to_f" do - @i.respond_to?(:to_i).should.be true - @i.respond_to?(:to_f).should.be true - @i.to_i.should.equal 42 - @f.to_f.should.equal 42.42 - end -end - -describe 'NSDate additions' do - before do - @obj = NSDate.alloc.init - end - - it "should respond to to_time" do - @obj.respond_to?(:to_time).should.be true - end -end - -describe 'NSImage additions' do - before do - @obj = NSImage.alloc.init - end - - it "should respond to focus" do - @obj.respond_to?(:focus).should.be true - end -end Modified: MacRuby/trunk/test-macruby/runner.rb =================================================================== --- MacRuby/trunk/test-macruby/runner.rb 2009-01-15 12:52:28 UTC (rev 791) +++ MacRuby/trunk/test-macruby/runner.rb 2009-01-15 15:28:56 UTC (rev 792) @@ -1,2 +1,3 @@ -path = File.dirname(__FILE__) -Dir.glob(File.join(path, 'test_*.rb')).each { |p| require(p) } +Dir.glob(File.expand_path('../cases/*_test.rb', __FILE__)).each do |test| + require test +end \ No newline at end of file Deleted: MacRuby/trunk/test-macruby/test_boxed.rb =================================================================== --- MacRuby/trunk/test-macruby/test_boxed.rb 2009-01-15 12:52:28 UTC (rev 791) +++ MacRuby/trunk/test-macruby/test_boxed.rb 2009-01-15 15:28:56 UTC (rev 792) @@ -1,180 +0,0 @@ -require 'test/unit' - -class TestBS < Test::Unit::TestCase - - def setup - framework 'Foundation' - bundle = '/tmp/_test_bs.bundle' - if !File.exist?(bundle) or File.mtime(bundle) < File.mtime(__FILE__) - s = <<EOS -#import <Foundation/Foundation.h> -@interface NSObject (MacRubyNSPointAdditions) -- (float)x; -- (float)y; -@end -@interface TestBoxed : NSObject -@end -@implementation TestBoxed -- (void)testPoint:(NSPoint)point x:(float)x y:(float)y -{ - if (point.x != x) - [NSException raise:@"NSException" - format:@"point.x (%f) != x (%f)", point.x, x]; - - if (point.y != y) - [NSException raise:@"NSException" - format:@"point.y (%f) != y (%f)", point.y, y]; -} -- (void)testPointAsObject:(id)point x:(float)x y:(float)y -{ - Class boxed; - boxed = NSClassFromString(@"Boxed"); - - if (![point isKindOfClass:boxed]) - [NSException raise:@"NSException" - format:@"point (%@) isn't a boxed type", point]; - - if (![point isKindOfClass:[NSValue class]]) - [NSException raise:@"NSException" - format:@"point (%@) isn't a value type", point]; - -#if 0 // FIXME this cannot be tested yet - if ([point x] != x) - [NSException raise:@"NSException" - format:@"[point x] (%f) != x (%f)", [point x], x]; - - if ([point y] != y) - [NSException raise:@"NSException" - format:@"[point y] (%f) != y (%f)", [point y], y]; -#endif - - if (strcmp([point objCType], @encode(NSPoint)) != 0) - [NSException raise:@"NSException" - format:@"[point objCType] (%s) != @encode(NSPoint) (%s)", - [point objCType], @encode(NSPoint)]; - - NSPoint p; - [point getValue:&p]; - [self testPoint:p x:x y:y]; -} -- (NSPoint)testReturnPointWithX:(float)x y:(float)y -{ - NSPoint p; - p.x = x; - p.y = y; - return p; -} -@end -EOS - File.open('/tmp/_test.m', 'w') { |io| io.write(s) } - system("gcc /tmp/_test.m -bundle -o #{bundle} -framework Foundation -fobjc-gc-only") or exit 1 - end - require 'dl'; DL.dlopen(bundle) - end - - def test_boxed_classes - assert_kind_of(Class, Boxed) - assert_equal(NSValue, Boxed.superclass) - - # struct - assert(NSRect.ancestors.include?(Boxed)) - assert('{_NSRect={_NSPoint=ff}{_NSSize=ff}}', NSRect.objc_type) - assert_equal([:origin, :size] , NSRect.fields) - assert(!NSRect.opaque?) - - # opaque - assert(NSZone.ancestors.include?(Boxed)) - assert_equal('^{_NSZone=}', NSZone.objc_type) - assert_equal([] , NSZone.fields) - assert(NSZone.opaque?) - end - - def test_opaque - assert_raise(TypeError) { NSZone.new } - z = 'foo'.zone - assert_kind_of(NSZone, z) - assert_equal(z, 'bar'.zone) - end - - def test_struct1 - p = NSPoint.new - assert_kind_of(NSPoint, p) - assert_equal(0.0, p.x) - assert_equal(0.0, p.y) - assert_equal([0.0, 0.0], p.to_a) - assert_equal(p, NSPoint.new) - assert_equal(p, p.dup) - assert_equal(p, p.clone) - assert_equal(p, NSZeroPoint) - - p.x += 1 - assert_equal(1.0, p.x) - assert_equal([1.0, 0.0], p.to_a) - - p2 = NSPoint.new(1.0, 2.0) - assert_equal(p.x, p2.x) - assert_not_equal(p.y, p2.y) - p.y += 2 - assert_equal(p.y, p2.y) - - assert_raise(ArgumentError) { NSPoint.new(42) } - assert_raise(ArgumentError) { NSPoint.new(42, 42, 42) } - assert_raise(TypeError) { NSPoint.new(nil, nil) } - assert_raise(ArgumentError) { NSPoint.new('foo', 'bar') } - assert_raise(TypeError) { p.x = nil } - assert_raise(ArgumentError) { p.x = 'foo' } - - r = NSRect.new - assert_kind_of(NSRect, r) - assert_equal(NSZeroPoint, r.origin) - assert_equal(NSZeroSize, r.size) - assert_equal([NSZeroPoint, NSZeroSize], r.to_a) - - assert_raise(ArgumentError) { r.origin = nil } - assert_raise(ArgumentError) { r.origin = 'foo' } - - r2 = NSRect.new(p, NSSize.new(42.0, 42.0)) - assert_not_equal(r, r2) - r.size = NSSize.new(42.0, 42.0) - assert_equal(r.size, r2.size) - r.origin = p - assert_equal(r.origin, r2.origin) - assert_equal(r, r2) - r.origin.x -= 1 - r2.origin.x -= 1 - r.size.width /= 2.0 - r2.size.width /= 2.0 - assert_equal(r, r2) - assert_equal(r.to_a, r2.to_a) - end - - def test_struct_nsstring_marshalling - r = NSRange.new(1, 4) - assert_kind_of(NSString, NSStringFromRange(r)) - assert_equal('{1, 4}', NSStringFromRange(r)) - assert_equal(r, NSRangeFromString(NSStringFromRange(r))) - rect = NSRect.new(NSPoint.new(42.0, 1042.0), NSSize.new(123, 456)) - assert_equal(NSPoint.new(42.0, 1042.0), - NSPointFromString(NSStringFromPoint(rect.origin))) - end - - def test_nspoint_in_objc - p = NSPoint.new(42.0, 99.0) - o = TestBoxed.new - o.testPoint(p, x:42.0, y:99.0) - o.testPointAsObject(p, x:42.0, y:99.0) - assert_equal(p, o.testReturnPointWithX(42.0, y:99.0)) - end - - class MethodReturningBoxed - def foo - NSPoint.new(1, 2) - end - end - def test_objc_call_pure_method_returning_boxed - o = MethodReturningBoxed.new - assert_equal(NSPoint.new(1, 2), o.send(:foo)) - assert_equal(NSPoint.new(1, 2), o.performSelector(:foo)) - end - -end Deleted: MacRuby/trunk/test-macruby/test_framework.rb =================================================================== --- MacRuby/trunk/test-macruby/test_framework.rb 2009-01-15 12:52:28 UTC (rev 791) +++ MacRuby/trunk/test-macruby/test_framework.rb 2009-01-15 15:28:56 UTC (rev 792) @@ -1,27 +0,0 @@ -require 'test/unit' - -class TestFramework < Test::Unit::TestCase - - def test_setup - framework('Foundation') - end - - def test_framework_by_name - assert_nothing_raised { framework('Foundation') } - assert_raise(RuntimeError) { framework('DoesNotExist') } - end - - def test_framework_by_path - assert_nothing_raised do - framework('/System/Library/Frameworks/Foundation.framework') - end - assert_raise(RuntimeError) { framework('/does/not/exist') } - end - - def test_framework_load_twice - assert_equal(false, framework('Foundation')) - assert_equal(false, - framework('/System/Library/Frameworks/Foundation.framework')) - end - -end Deleted: MacRuby/trunk/test-macruby/test_hash.rb =================================================================== --- MacRuby/trunk/test-macruby/test_hash.rb 2009-01-15 12:52:28 UTC (rev 791) +++ MacRuby/trunk/test-macruby/test_hash.rb 2009-01-15 15:28:56 UTC (rev 792) @@ -1,89 +0,0 @@ -require 'test/unit' - -class TestHash < Test::Unit::TestCase - - def test_hash_class - assert(Hash.is_a?(Class)) - assert(Hash.ancestors.include?(NSDictionary)) - assert(Hash.ancestors.include?(NSMutableDictionary)) - end - - def test_hash_create - h = {} - assert_kind_of(Hash, h) - h = {'a' => 100} - assert_kind_of(Hash, h) - h = Hash.new - assert_kind_of(Hash, h) - h = Hash.alloc.init - assert_kind_of(Hash, h) - h = Hash['a', 100, 'b', 200] - assert_kind_of(Hash, h) - h = Hash['a' => 100, 'b' => 200] - assert_kind_of(Hash, h) - end - - class MyHash < Hash; end - def test_hash_create_subclass - assert(MyHash.ancestors.include?(Hash)) - h = MyHash.new - assert_kind_of(MyHash, h) - h = MyHash.alloc.init - assert_kind_of(MyHash, h) - h = MyHash['a', 100, 'b', 200] - assert_kind_of(MyHash, h) - h = MyHash['a' => 100, 'b' => 200] - assert_kind_of(MyHash, h) - end - - def test_hash_cannot_modify_immutable - h = NSDictionary.new - assert_raise(RuntimeError) { h[1] = 1 } - assert_raise(RuntimeError) { h.clear } - h = NSDictionary.alloc.init - assert_raise(RuntimeError) { h[1] = 1 } - assert_raise(RuntimeError) { h.clear } - end - - def test_hash_get_set - h = {} - h[1] = 2 - assert_equal(2, h[1]) - h['foo'] = 3 - assert_equal(3, h['foo']) - assert_equal(3, h[String.new('foo')]) - h[[1,2]] = 4 - assert_equal(4, h[[1,2]]) - assert_equal(4, h[Array.new([1,2])]) - h[:sym] = 5 - assert_equal(5, h[:sym]) - assert_equal(5, h['sym'.intern]) - end - - def test_hash_count - h = {} - assert_equal(0, h.size) - assert_equal(0, h.count) - assert(h.empty?) - h[1] = 2 - assert_equal(1, h.size) - assert_equal(1, h.count) - assert(!h.empty?) - h[1] = nil - assert_equal(1, h.size) - assert_equal(1, h.count) - assert(!h.empty?) - h.delete(1) - assert_equal(0, h.size) - assert_equal(0, h.count) - assert(h.empty?) - end - - def test_hash_clear - h = {1=>2} - h.clear - assert(h.empty?) - assert_equal(nil, h[1]) - end - -end Added: MacRuby/trunk/test-macruby/test_helper/objective-c_helper.rb =================================================================== --- MacRuby/trunk/test-macruby/test_helper/objective-c_helper.rb (rev 0) +++ MacRuby/trunk/test-macruby/test_helper/objective-c_helper.rb 2009-01-15 15:28:56 UTC (rev 792) @@ -0,0 +1,54 @@ +require File.expand_path('../temp_dir_helper', __FILE__) +require 'dl' + +# Eloy: From Kari, will probably move to Rucola, so need to update. +class ObjectiveC + class CompileError < ::StandardError; end + + include TempDirHelper + + # Returns a new ObjectiveC compile instance with the +source_file+ and the + # +frameworks+ needed to compile this +source_file+. Foundation is added to + # the +frameworks+ by default. + # + # objc = ObjectiveC.new('/path/to/source_file.m', 'WebKit') + # objc.compile! + # objc.require! + def initialize(source_file, *frameworks) + @path, @frameworks = source_file, frameworks + @frameworks.unshift 'Foundation' + end + + # Compiles the +source_file+. See new. + # Raises a ObjectiveC::CompileError if compilation failed. + # + # TODO: Check the arch build flags etc. + def compile! + ensure_dir!(output_dir) + + frameworks = @frameworks.map { |f| "-framework #{f}" }.join(' ') + command = "gcc -o #{ bundle_path } -arch x86_64 -fobjc-gc -flat_namespace -undefined suppress -bundle #{ frameworks } #{ includes } #{ @path }" + unless system(command) + raise CompileError, "Unable to compile file `#{ File.basename(@path) }'." + end + end + + # Loads the compiled bundle with <tt>DL.dlopen</tt>. + def require! + DL.dlopen(bundle_path) + end + + private + + def includes + "-I#{ File.dirname(@path) }" + end + + def output_dir + temp_dir 'bundles' + end + + def bundle_path + File.join output_dir, "#{ File.basename(@path, '.m') }.bundle" + end +end \ No newline at end of file Added: MacRuby/trunk/test-macruby/test_helper/temp_dir_helper.rb =================================================================== --- MacRuby/trunk/test-macruby/test_helper/temp_dir_helper.rb (rev 0) +++ MacRuby/trunk/test-macruby/test_helper/temp_dir_helper.rb 2009-01-15 15:28:56 UTC (rev 792) @@ -0,0 +1,19 @@ +require "fileutils" + +module TempDirHelper + def ensure_dir!(path) + FileUtils.mkdir_p(path) unless File.exist?(path) + end + + def setup_temp_dir! + ensure_dir!(temp_dir) + end + + def teardown_temp_dir! + FileUtils.rm_rf(temp_dir) if File.exist?(temp_dir) + end + + def temp_dir(path = nil) + path.nil? ? TMP_PATH : File.join(TMP_PATH, path) + end +end \ No newline at end of file Added: MacRuby/trunk/test-macruby/test_helper/test_unit_helper.rb =================================================================== --- MacRuby/trunk/test-macruby/test_helper/test_unit_helper.rb (rev 0) +++ MacRuby/trunk/test-macruby/test_helper/test_unit_helper.rb 2009-01-15 15:28:56 UTC (rev 792) @@ -0,0 +1,27 @@ +# The following is just a simple hack to be able to write tests with a spec description. +# This should ease the process of moving tests to run with mspec for instance. +class Test::Unit::TestCase + class << self + # Runs before each test case. + def before(&block) + define_method("setup", &block) + end + + # Runs after each test case. + def after(&block) + define_method("teardown", &block) + end + + # Defines a test case. + def it(name, &block) + define_method("test_#{name}", &block) + end + end + + private + + # Returns the path to a file in +FIXTURE_PATH+. + def fixture(name) + File.join(FIXTURE_PATH, name) + end +end \ No newline at end of file Added: MacRuby/trunk/test-macruby/test_helper.rb =================================================================== --- MacRuby/trunk/test-macruby/test_helper.rb (rev 0) +++ MacRuby/trunk/test-macruby/test_helper.rb 2009-01-15 15:28:56 UTC (rev 792) @@ -0,0 +1,13 @@ +require 'test/unit' +framework 'Foundation' + +# Add ruby lib to the load path +$:.unshift(File.expand_path('../../lib', __FILE__)) + +FIXTURE_PATH = File.expand_path('../fixtures', __FILE__) +TMP_PATH = File.expand_path('../tmp', __FILE__) + +# Load all test helpers +Dir.glob(File.expand_path('../test_helper/*_helper.rb', __FILE__)).each do |helper| + require helper +end Deleted: MacRuby/trunk/test-macruby/test_objc.rb =================================================================== --- MacRuby/trunk/test-macruby/test_objc.rb 2009-01-15 12:52:28 UTC (rev 791) +++ MacRuby/trunk/test-macruby/test_objc.rb 2009-01-15 15:28:56 UTC (rev 792) @@ -1,155 +0,0 @@ -#!/usr/bin/env macruby - -require 'test/unit' - -require 'test/unit' -class Test::Unit::TestCase - class << self - def it(name, &block) - define_method("test_#{name}", &block) - end - end -end - -class TestClassConstantLookup < Test::Unit::TestCase - module Namespace - class PureRubyClass; end - module PureRubyModule; end - SINGLETON = (class << self; self; end) - end - - it "should not find pure Ruby classes in different namespaces" do - assert_raise(NameError) { PureRubyClass } - end - - it "should find pure Ruby classes in different namespaces if given the correct path" do - assert_nothing_raised(NameError) { Namespace::PureRubyClass } - end - - it "should not find pure Ruby modules in different namespaces" do - assert_raise(NameError) { PureRubyModule } - end - - it "should find pure Ruby modules in different namespaces if given the correct path" do - assert_nothing_raised(NameError) { Namespace::PureRubyModule } - end - - it "should not find pure Ruby class singletons in different namespaces" do - assert_raise(NameError) { SINGLETON } - end - - it "should find pure Ruby class singletons in different namespaces if given the correct path" do - assert_nothing_raised(NameError) { Namespace::SINGLETON } - end -end - -class TestSubclass < Test::Unit::TestCase - - def setup - framework 'Foundation' - bundle = '/tmp/_test.bundle' - if !File.exist?(bundle) or File.mtime(bundle) < File.mtime(__FILE__) - s = <<EOS -#import <Foundation/Foundation.h> -@interface MyClass : NSObject -@end -@implementation MyClass -- (int)test -{ - return 42; -} -- (id)test_getObject:(id)dictionary forKey:(id)key -{ - return [dictionary objectForKey:key]; -} -@end -EOS - File.open('/tmp/_test.m', 'w') { |io| io.write(s) } - system("gcc /tmp/_test.m -bundle -o #{bundle} -framework Foundation -fobjc-gc-only") or exit 1 - end - require 'dl'; DL.dlopen(bundle) - end - - def test_new - o = NSObject.new - assert_kind_of(NSObject, o) - o = NSObject.alloc.init - assert_kind_of(NSObject, o) - end - - class MyDictionary < NSMutableDictionary - def foo(tc, *args) - tc.assert_kind_of(Array, args) - unless args.empty? - tc.assert_equal(1, args.length) - tc.assert_kind_of(Hash, args[0]) - end - end - def foo2(tc, args) - tc.assert_kind_of(Hash, args) - end - end - - def test_keyed_syntax - d = NSMutableDictionary.new - o = NSObject.new - k = NSString.new - d.setObject o, forKey:k - assert_equal(o, d.objectForKey(k)) - - d2 = MyDictionary.new - d2.foo(self) - d2.foo(self, foo:k) - d2.foo(self, foo:k, bar:k) - d2.foo2(self, foo:k, bar:k) - - d2 = NSMutableDictionary.performSelector('new') - d2.performSelector(:'setObject:forKey:', withObject:o, withObject:k) - assert_equal(o, d2.performSelector(:'objectForKey:', withObject:k)) - assert(d.isEqual(d2)) - end - - def test_pure_objc_ivar - o = NSObject.alloc.init - assert_kind_of(NSObject, o) - o.instance_variable_set(:@foo, 'foo') - GC.start - assert_equal('foo', o.instance_variable_get(:@foo)) - end - - def test_cftype_ivar - o = NSString.alloc.init - assert_kind_of(NSString, o) - o.instance_variable_set(:@foo, 'foo') - GC.start - assert_equal('foo', o.instance_variable_get(:@foo)) - end - - def test_method_dispatch_priority - o = MyClass.new - assert_kind_of(MyClass, o) - assert_equal(42, o.test) - end - - def test_method_variadic - p = NSPredicate.predicateWithFormat('foo == 1') - assert_kind_of(NSPredicate, p) - p = NSPredicate.predicateWithFormat('foo == %@', 'bar') - assert_kind_of(NSPredicate, p) - p = NSPredicate.predicateWithFormat('%@ == %@', 'foo', 'bar') - assert_kind_of(NSPredicate, p) - end - - def test_primitive_as_dictionary_key - o = MyClass.new - assert_kind_of(MyClass, o) - s = String.new("foo") - v = Object.new - dict = {s => v} - assert_equal(v, o.test_getObject(dict, forKey:s)) - dict = {} - dict.setObject v, forKey:s - assert_equal(v, o.test_getObject(dict, forKey:s)) - end - -end Deleted: MacRuby/trunk/test-macruby/test_objc_ext.rb =================================================================== --- MacRuby/trunk/test-macruby/test_objc_ext.rb 2009-01-15 12:52:28 UTC (rev 791) +++ MacRuby/trunk/test-macruby/test_objc_ext.rb 2009-01-15 15:28:56 UTC (rev 792) @@ -1,97 +0,0 @@ -#!/usr/bin/env macruby - -$:.unshift(File.expand_path('../../lib', __FILE__)) -framework 'Cocoa' - -require 'test/unit' -class Test::Unit::TestCase - class << self - def it(name, &block) - define_method("test_#{name}", &block) - end - end -end - -# These tests should probably move to the macruby part of rubyspec once we get to that point. - -require 'objc_ext/ns_user_defaults' - -class TestNSUserDefaultsExtensions < Test::Unit::TestCase - it "should returns a value for a given key through the #[] reader method" do - defaults.setValue('foo', forKey: 'key') - assert_equal 'foo', defaults['key'] - end - - it "should assign a value for a given key through the #[]= writer method" do - defaults['key'] = 'foo' - assert_equal 'foo', defaults.valueForKey('key') - end - - it "should remove an object for a given key with the #delete method" do - defaults.setValue('foo', forKey: 'key') - defaults.delete('key') - assert_nil defaults.valueForKey('key') - end - - private - - def defaults - NSUserDefaults.standardUserDefaults - end -end - -require 'objc_ext/ns_rect' - -class TestNSRectExtensions < Test::Unit::TestCase - def setup - @rect = NSRect.new([100, 100], [200, 200]) - end - - it "should return its size instance's height with #height" do - assert_equal 200, @rect.height - end - - it "should assign the height to its size instance with #height=" do - @rect.height = 300 - assert_equal 300, @rect.height - - @rect.height = NSNumber.numberWithInt(400) - assert_equal 400, @rect.height - end - - it "should return its size instance's width with #width" do - assert_equal 200, @rect.width - end - - it "should assign the width to its size instance with #width=" do - @rect.width = 300 - assert_equal 300, @rect.width - - @rect.width = NSNumber.numberWithInt(400) - assert_equal 400, @rect.width - end - - it "should return its origin instance's x coord with #x" do - assert_equal 100, @rect.x - end - - it "should assign the x coord to its origin instance with #x=" do - @rect.x = 200 - assert_equal 200, @rect.x - - @rect.x = NSNumber.numberWithInt(300) - assert_equal 300, @rect.x - end - - it "should return its origin instance's y coord with #y" do - assert_equal 100, @rect.y - end - - it "should assign the y coord to its origin instance with #y=" do - @rect.y = 200 - assert_equal 200, @rect.y - - @rect.y = NSNumber.numberWithInt(300) - assert_equal 300, @rect.y - end -end \ No newline at end of file Deleted: MacRuby/trunk/test-macruby/test_string.rb =================================================================== --- MacRuby/trunk/test-macruby/test_string.rb 2009-01-15 12:52:28 UTC (rev 791) +++ MacRuby/trunk/test-macruby/test_string.rb 2009-01-15 15:28:56 UTC (rev 792) @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- - -require 'test/unit' - -class TestString < Test::Unit::TestCase - - def setup - framework 'Foundation' - bundle = '/tmp/_test_string.bundle' - if !File.exist?(bundle) or File.mtime(bundle) < File.mtime(__FILE__) - s = <<EOS -#import <Foundation/Foundation.h> -@interface MyTestClass : NSObject -@end -@implementation MyTestClass -- (NSString*)testSubstring:(NSString*)str range:(NSRange)range -{ - unichar buf[1024]; - [str getCharacters:buf range:range]; - return [[NSString alloc] initWithCharacters:buf length:range.length]; -} -@end -EOS - File.open('/tmp/_test_string.m', 'w') { |io| io.write(s) } - system("gcc /tmp/_test_string.m -bundle -o #{bundle} -framework Foundation -fobjc-gc-only") or exit 1 - end - require 'dl'; DL.dlopen(bundle) - end - - def test_characterAtIndex - s = 'abcあいうxyz' - [0,3,6,8].each do |d| - assert_equal(s[d].ord, s.characterAtIndex(d)) - assert_equal(s[d].ord, s.characterAtIndex(d)) - end - end - - def test_getCharactersRange - s = 'abcあいうxzy' - obj = MyTestClass.alloc.init - [[0,1], [1,7], [4,3], [7,2]].each do |d| - assert_equal(s[*d], obj.testSubstring(s, range:NSRange.new(*d))) - end - end - - # - # Tests for UTF-16 surrogate pairs - # These tests should be fixed in the future. - # - # Memo: - # If an NSString consists of a character which is UTF-16 surrogate pair, - # the length of the string will be 2 in Cocoa, while 1 in ruby 1.9. - # - - def test_characterAtIndex_surrogate_pairs - s = "abc\xf0\xa3\xb4\x8exzy" - assert_equal(s[3].ord, s.characterAtIndex(3)) - end - - def test_getCharactersRange_surrogate_pairs - s = "abc\xf0\xa3\xb4\x8exzy" - obj = MyTestClass.alloc.init - assert_equal(s[2,3], obj.testSubstring(s, range:NSRange.new(2,3))) - end - -end
participants (1)
-
source_changes@macosforge.org