Revision: 808 http://trac.macosforge.org/projects/ruby/changeset/808 Author: eloy.de.enige@gmail.com Date: 2009-01-22 08:30:59 -0800 (Thu, 22 Jan 2009) Log Message: ----------- Added test coverage for whether or not a framework has been loaded. Added Mappings.framework_loaded? and did some refactoring. Added more documentation, although Mappings.map still really really needs some comprehensive docs?\226?\128?\166 Modified Paths: -------------- MacRuby/trunk/lib/hotcocoa/mappings.rb MacRuby/trunk/test-macruby/cases/hotcocoa/mappings_test.rb Added Paths: ----------- MacRuby/trunk/test-macruby/test_helper/assertions_helper.rb Modified: MacRuby/trunk/lib/hotcocoa/mappings.rb =================================================================== --- MacRuby/trunk/lib/hotcocoa/mappings.rb 2009-01-22 16:30:50 UTC (rev 807) +++ MacRuby/trunk/lib/hotcocoa/mappings.rb 2009-01-22 16:30:59 UTC (rev 808) @@ -26,17 +26,22 @@ end end + # TODO: Needs docs for all possible invocations and examples! def self.map(options, &block) framework = options.delete(:framework) mapped_name = options.keys.first mapped_value = options.values.first + args = [mapped_name, mapped_value] if mapped_value.kind_of?(Class) - add_mapping(mapped_name, mapped_value, &block) + add_mapping(*args, &block) else - on_framework(framework) do - constant = Object.full_const_get(mapped_value) - add_mapping(mapped_name, constant, &block) + if framework.nil? || loaded_framework?(framework) + add_constant_mapping(*args, &block) + else + on_framework(framework) do + add_constant_mapping(*args, &block) + end end end end @@ -48,27 +53,34 @@ mappings[m.builder_method] = m end + # Registers +mapped_name+ as a Mapper#builder_method for the given + # +constant+ string which will be looked up. The +block+ is used as the + # Mapper#builder_method's body. + def self.add_constant_mapping(mapped_name, constant, &block) + add_mapping(mapped_name, Object.full_const_get(constant), &block) + end + + # Returns the Hash of mappings. def self.mappings @mappings ||= {} end + # Registers a callback for after the specified framework has been loaded. def self.on_framework(name, &block) - name = name.nil? ? nil : name.to_s.downcase - if name.nil? or loaded_frameworks.include?(name) - block.call - else - (frameworks[name] ||= []) << block - end + (frameworks[name.to_s.downcase] ||= []) << block end + # Returns the Hash of mapped frameworks. def self.frameworks @frameworks ||= {} end + # Returns the Set of loaded frameworks. def self.loaded_frameworks @loaded_frameworks ||= Set.new end + # Registers a given framework as being loaded. def self.framework_loaded(name) name = name.to_s.downcase loaded_frameworks << name @@ -79,6 +91,11 @@ end end + # Returns whether or not the framework has been loaded yet. + def self.loaded_framework?(name) + loaded_frameworks.include?(name.to_s.downcase) + end + end end Modified: MacRuby/trunk/test-macruby/cases/hotcocoa/mappings_test.rb =================================================================== --- MacRuby/trunk/test-macruby/cases/hotcocoa/mappings_test.rb 2009-01-22 16:30:50 UTC (rev 807) +++ MacRuby/trunk/test-macruby/cases/hotcocoa/mappings_test.rb 2009-01-22 16:30:59 UTC (rev 808) @@ -104,6 +104,24 @@ assert_equal ClassFromFramework, Mappings.mappings[:klass].control_class end + it "should keep a unique list of loaded_frameworks" do + assert_difference("Mappings.loaded_frameworks.length", +1) do + Mappings.framework_loaded('TheFramework') + Mappings.framework_loaded('TheFramework') + end + + assert Mappings.loaded_frameworks.include?('theframework') + end + + it "should return whether or not a framework has been loaded yet" do + Mappings.framework_loaded('TheFramework') + assert Mappings.loaded_framework?('TheFramework') + + assert !Mappings.loaded_framework?('IHasNotBeenLoaded') + assert !Mappings.loaded_framework?(nil) + assert !Mappings.loaded_framework?('') + end + def test_reload flunk 'Pending.' end Added: MacRuby/trunk/test-macruby/test_helper/assertions_helper.rb =================================================================== --- MacRuby/trunk/test-macruby/test_helper/assertions_helper.rb (rev 0) +++ MacRuby/trunk/test-macruby/test_helper/assertions_helper.rb 2009-01-22 16:30:59 UTC (rev 808) @@ -0,0 +1,36 @@ +require "test/unit" + +module AssertionsExt + # Asserts that at the end of the block the result of evaluating the given + # +eval_string+ differs by +difference+. + # + # a = [] + # + # assert_difference("a.length", +1) do + # a << "foo" + # end + # + # assert_difference("a.length", -1) do + # a.pop + # end + def assert_difference(eval_string, difference) + before = instance_eval(eval_string) + yield + assert_equal (before + difference), instance_eval(eval_string) + end + + # Asserts that at the end of the block the result of evaluating the given + # +eval_string+ does _not_ differ. + # + # a = Set.new + # a << "foo" + # + # assert_no_difference("a.length") do + # a << "foo" + # end + def assert_no_difference(eval_string, &block) + assert_difference(eval_string, 0, &block) + end +end + +Test::Unit::TestCase.send(:include, AssertionsExt) \ No newline at end of file