jeremymcanally-context 0.0.3 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/config/hoe.rb +1 -1
- data/config/requirements.rb +1 -1
- data/context.gemspec +1 -1
- data/lib/context/context.rb +9 -1
- data/lib/context/core_ext/string.rb +6 -1
- data/lib/context/lifecycle.rb +52 -5
- data/lib/context/shared_behavior.rb +22 -2
- data/lib/context/suite.rb +33 -14
- data/lib/context/test.rb +1 -1
- data/lib/context/version.rb +1 -1
- data/test/test_lifecycle.rb +122 -9
- metadata +1 -1
    
        data/config/hoe.rb
    CHANGED
    
    | @@ -56,7 +56,7 @@ $hoe = Hoe.new(GEM_NAME, VERS) do |p| | |
| 56 56 | 
             
              p.summary = DESCRIPTION
         | 
| 57 57 | 
             
              p.url = HOMEPATH
         | 
| 58 58 | 
             
              p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
         | 
| 59 | 
            -
              p.test_globs = ["test | 
| 59 | 
            +
              p.test_globs = ["test/test_*.rb"]
         | 
| 60 60 | 
             
              p.clean_globs |= ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store']  #An array of file patterns to delete on clean.
         | 
| 61 61 |  | 
| 62 62 | 
             
              # == Optional
         | 
    
        data/config/requirements.rb
    CHANGED
    
    
    
        data/context.gemspec
    CHANGED
    
    
    
        data/lib/context/context.rb
    CHANGED
    
    | @@ -1,5 +1,10 @@ | |
| 1 1 | 
             
            class Test::Unit::TestCase
         | 
| 2 2 | 
             
              class << self
         | 
| 3 | 
            +
                # Test::Unit uses ObjectSpace to figure out what Test::Unit:TestCase instances are running
         | 
| 4 | 
            +
                # Contexts are not named and therefore sometimes get garbage collected.
         | 
| 5 | 
            +
                # Think of #context_list as the shelter for nameless contexts
         | 
| 6 | 
            +
                attr_accessor :context_list
         | 
| 7 | 
            +
             | 
| 3 8 | 
             
                def context_name #:nodoc:
         | 
| 4 9 | 
             
                  @context_name ||= ""
         | 
| 5 10 | 
             
                  if superclass.respond_to?(:context_name)
         | 
| @@ -41,9 +46,12 @@ class Test::Unit::TestCase | |
| 41 46 | 
             
                def context(name, &block)
         | 
| 42 47 | 
             
                  cls = Class.new(self)
         | 
| 43 48 | 
             
                  cls.context_name = name
         | 
| 44 | 
            -
                  puts "Creating context #{cls.context_name}"
         | 
| 49 | 
            +
                  # puts "Creating context #{cls.context_name}"
         | 
| 45 50 | 
             
                  cls.class_eval(&block)
         | 
| 51 | 
            +
                  (self.context_list ||= []) << cls
         | 
| 46 52 |  | 
| 53 | 
            +
                  # TODO: Find a better way to uniquely identify classes
         | 
| 54 | 
            +
                  const_set("Test#{name.to_class_name}#{cls.object_id}", cls)
         | 
| 47 55 | 
             
                  cls
         | 
| 48 56 | 
             
                end
         | 
| 49 57 |  | 
| @@ -1,11 +1,16 @@ | |
| 1 1 | 
             
            class String
         | 
| 2 2 | 
             
              # Replaces spaces and tabs with _ so we can use the string as a method name
         | 
| 3 3 | 
             
              def to_method_name
         | 
| 4 | 
            -
                self.downcase.gsub( | 
| 4 | 
            +
                self.downcase.gsub(/[\s:']+/,'_')
         | 
| 5 5 | 
             
              end
         | 
| 6 6 |  | 
| 7 7 | 
             
              # Borrowed from +camelize+ in ActiveSupport
         | 
| 8 8 | 
             
              def to_module_name
         | 
| 9 9 | 
             
                self.to_method_name.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
         | 
| 10 10 | 
             
              end
         | 
| 11 | 
            +
              
         | 
| 12 | 
            +
              # Borrowed from +camelize+ in ActiveSupport
         | 
| 13 | 
            +
              def to_class_name
         | 
| 14 | 
            +
                self.to_method_name.gsub(/\/(.?)/) { "#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
         | 
| 15 | 
            +
              end
         | 
| 11 16 | 
             
            end
         | 
    
        data/lib/context/lifecycle.rb
    CHANGED
    
    | @@ -1,14 +1,15 @@ | |
| 1 1 | 
             
            class Test::Unit::TestCase
         | 
| 2 | 
            -
              # TODO: Chained lifecycle methods
         | 
| 3 2 | 
             
              class << self
         | 
| 3 | 
            +
                attr_accessor :before_each_callbacks, :before_all_callbacks, :after_each_callbacks, :after_all_callbacks
         | 
| 4 | 
            +
             | 
| 4 5 | 
             
                # Add logic to run before the tests (i.e., a +setup+ method)
         | 
| 5 6 | 
             
                #
         | 
| 6 7 | 
             
                #     before do
         | 
| 7 8 | 
             
                #       @user = User.first
         | 
| 8 9 | 
             
                #     end
         | 
| 9 10 | 
             
                # 
         | 
| 10 | 
            -
                def before(&block)
         | 
| 11 | 
            -
                   | 
| 11 | 
            +
                def before(period = :each, &block)
         | 
| 12 | 
            +
                  send("before_#{period}_callbacks") << block
         | 
| 12 13 | 
             
                end
         | 
| 13 14 |  | 
| 14 15 | 
             
                # Add logic to run after the tests (i.e., a +teardown+ method)
         | 
| @@ -17,8 +18,54 @@ class Test::Unit::TestCase | |
| 17 18 | 
             
                #       User.delete_all
         | 
| 18 19 | 
             
                #     end
         | 
| 19 20 | 
             
                #
         | 
| 20 | 
            -
                def after(&block)
         | 
| 21 | 
            -
                   | 
| 21 | 
            +
                def after(period = :each, &block)
         | 
| 22 | 
            +
                  send("after_#{period}_callbacks") << block
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                def gather_callbacks(callback_type, period)
         | 
| 26 | 
            +
                  callbacks = superclass.respond_to?(:gather_callbacks) ? superclass.gather_callbacks(callback_type, period) : []
         | 
| 27 | 
            +
                  callbacks.push(*send("#{callback_type}_#{period}_callbacks"))
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              self.before_all_callbacks  = []
         | 
| 32 | 
            +
              self.before_each_callbacks = []
         | 
| 33 | 
            +
              self.after_each_callbacks  = []
         | 
| 34 | 
            +
              self.after_all_callbacks   = []
         | 
| 35 | 
            +
             | 
| 36 | 
            +
              def self.inherited(child)
         | 
| 37 | 
            +
                super
         | 
| 38 | 
            +
                child.before_all_callbacks  = []
         | 
| 39 | 
            +
                child.before_each_callbacks = []
         | 
| 40 | 
            +
                child.after_each_callbacks  = []
         | 
| 41 | 
            +
                child.after_all_callbacks   = []
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                child.class_eval do
         | 
| 44 | 
            +
                  def setup
         | 
| 45 | 
            +
                    run_each_callbacks :before
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                  def teardown
         | 
| 49 | 
            +
                    run_each_callbacks :after
         | 
| 50 | 
            +
                  end
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
              end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
              def run_each_callbacks(callback_type)
         | 
| 55 | 
            +
                self.class.gather_callbacks(callback_type, :each).each { |c| instance_eval(&c) }
         | 
| 56 | 
            +
              end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
              def run_all_callbacks(callback_type)
         | 
| 59 | 
            +
                previous_ivars = instance_variables
         | 
| 60 | 
            +
                self.class.gather_callbacks(callback_type, :all).each { |c| instance_eval(&c) }
         | 
| 61 | 
            +
                (instance_variables - previous_ivars).inject({}) do |hash, ivar|
         | 
| 62 | 
            +
                  hash.update ivar => instance_variable_get(ivar)
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
              end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
              def set_values_from_callbacks(values)
         | 
| 67 | 
            +
                values.each do |name, value|
         | 
| 68 | 
            +
                  instance_variable_set name, value
         | 
| 22 69 | 
             
                end
         | 
| 23 70 | 
             
              end
         | 
| 24 71 | 
             
            end
         | 
| @@ -1,3 +1,23 @@ | |
| 1 | 
            +
            class SharedContext < Module
         | 
| 2 | 
            +
              def self.create_from_behavior(beh)
         | 
| 3 | 
            +
                mod = self.new
         | 
| 4 | 
            +
                mod.behavior = beh
         | 
| 5 | 
            +
                mod
         | 
| 6 | 
            +
              end
         | 
| 7 | 
            +
              
         | 
| 8 | 
            +
              def behavior=(beh)
         | 
| 9 | 
            +
                @behavior = beh
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
              
         | 
| 12 | 
            +
              def behavior
         | 
| 13 | 
            +
                @behavior
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
              
         | 
| 16 | 
            +
              def included(arg)
         | 
| 17 | 
            +
                @behavior.call
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
            end
         | 
| 20 | 
            +
             | 
| 1 21 | 
             
            class Test::Unit::TestCase
         | 
| 2 22 | 
             
              class << self
         | 
| 3 23 | 
             
                def shared(name, &block)
         | 
| @@ -10,14 +30,14 @@ class Test::Unit::TestCase | |
| 10 30 | 
             
                    raise ArgumentError, "Provide a String or Symbol as the name of the shared behavior group"
         | 
| 11 31 | 
             
                  end
         | 
| 12 32 |  | 
| 13 | 
            -
                  Object.const_set(name,  | 
| 33 | 
            +
                  Object.const_set(name, SharedContext.create_from_behavior(block))
         | 
| 14 34 | 
             
                end
         | 
| 15 35 |  | 
| 16 36 | 
             
                %w(shared_behavior share_as share_behavior_as shared_examples_for).each {|m| alias_method m, :shared}
         | 
| 17 37 |  | 
| 18 38 | 
             
                def use(shared_name)
         | 
| 19 39 | 
             
                  case shared_name.class.name
         | 
| 20 | 
            -
                  when "Module"
         | 
| 40 | 
            +
                  when "SharedContext", "Module"
         | 
| 21 41 | 
             
                    include shared_name
         | 
| 22 42 | 
             
                  when "String"
         | 
| 23 43 | 
             
                    include Object.const_get(shared_name.to_module_name)
         | 
    
        data/lib/context/suite.rb
    CHANGED
    
    | @@ -1,20 +1,39 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
               | 
| 3 | 
            -
                 | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 1 | 
            +
            module Test
         | 
| 2 | 
            +
              module Unit
         | 
| 3 | 
            +
                class TestCase
         | 
| 4 | 
            +
                  class << self
         | 
| 5 | 
            +
                    # Tweaks to standard method so we don't get superclass methods and we don't
         | 
| 6 | 
            +
                    # get weird default tests
         | 
| 7 | 
            +
                    def suite # :nodoc:
         | 
| 8 | 
            +
                      method_names = public_instance_methods - superclass.public_instance_methods
         | 
| 9 | 
            +
                
         | 
| 10 | 
            +
                      tests = method_names.delete_if {|method_name| method_name !~ /^test./}
         | 
| 11 | 
            +
                      suite = Test::Unit::TestSuite.new(name)
         | 
| 12 | 
            +
                      
         | 
| 13 | 
            +
                      tests.sort.each do |test|
         | 
| 14 | 
            +
                        catch(:invalid_test) do
         | 
| 15 | 
            +
                          suite << new(test)
         | 
| 16 | 
            +
                        end
         | 
| 17 | 
            +
                      end
         | 
| 18 | 
            +
                      
         | 
| 19 | 
            +
                      suite
         | 
| 20 | 
            +
                    end
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
                end
         | 
| 7 23 |  | 
| 8 | 
            -
             | 
| 9 | 
            -
                   | 
| 10 | 
            -
                  
         | 
| 11 | 
            -
                   | 
| 12 | 
            -
                     | 
| 13 | 
            -
             | 
| 24 | 
            +
                class TestSuite
         | 
| 25 | 
            +
                  # Runs the tests and/or suites contained in this
         | 
| 26 | 
            +
                  # TestSuite.
         | 
| 27 | 
            +
                  def run(result, &progress_block)
         | 
| 28 | 
            +
                    yield(STARTED, name)
         | 
| 29 | 
            +
                    ivars_from_callback = @tests.first.run_all_callbacks(:before) if @tests.first.is_a?(Test::Unit::TestCase)
         | 
| 30 | 
            +
                    @tests.each do |test|
         | 
| 31 | 
            +
                      test.set_values_from_callbacks(ivars_from_callback) if ivars_from_callback
         | 
| 32 | 
            +
                      test.run(result, &progress_block)
         | 
| 14 33 | 
             
                    end
         | 
| 34 | 
            +
                    ivars_from_callback = @tests.first.run_all_callbacks(:after) if ivars_from_callback
         | 
| 35 | 
            +
                    yield(FINISHED, name)
         | 
| 15 36 | 
             
                  end
         | 
| 16 | 
            -
                  
         | 
| 17 | 
            -
                  suite
         | 
| 18 37 | 
             
                end
         | 
| 19 38 | 
             
              end
         | 
| 20 39 | 
             
            end
         | 
    
        data/lib/context/test.rb
    CHANGED
    
    | @@ -9,7 +9,7 @@ class Test::Unit::TestCase | |
| 9 9 | 
             
                #
         | 
| 10 10 | 
             
                def test(name, &block)
         | 
| 11 11 | 
             
                  test_name = "test_#{((context_name == "" ? context_name : context_name + " ") + name).to_method_name}".to_sym
         | 
| 12 | 
            -
                  puts "running test #{test_name}"
         | 
| 12 | 
            +
                  # puts "running test #{test_name}"
         | 
| 13 13 | 
             
                  defined = instance_method(test_name) rescue false
         | 
| 14 14 | 
             
                  raise "#{test_name} is already defined in #{self}" if defined
         | 
| 15 15 |  | 
    
        data/lib/context/version.rb
    CHANGED
    
    
    
        data/test/test_lifecycle.rb
    CHANGED
    
    | @@ -1,17 +1,130 @@ | |
| 1 1 | 
             
            require File.dirname(__FILE__) + '/test_helper.rb'
         | 
| 2 2 |  | 
| 3 3 | 
             
            class TestLifecycle < Test::Unit::TestCase
         | 
| 4 | 
            -
               | 
| 5 | 
            -
                 | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 4 | 
            +
              before do
         | 
| 5 | 
            +
                @inherited_before_each_var = 1
         | 
| 6 | 
            +
              end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              before do
         | 
| 9 | 
            +
                @inherited_before_each_var = 2
         | 
| 10 | 
            +
                @inherited_before_each_var_2 = 1
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              after do
         | 
| 14 | 
            +
                @inherited_after_each_var = 1
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              before :all do
         | 
| 18 | 
            +
                @inherited_before_all_var = 1
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              after :all do
         | 
| 22 | 
            +
                @inherited_after_all_var = 1
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              sample_test = context "lifecycle" do
         | 
| 26 | 
            +
                attr_reader :inherited_before_each_var, :inherited_before_each_var_2, :inherited_after_each_var, 
         | 
| 27 | 
            +
                  :after_each_var, :inherited_before_all_var, :inherited_after_all_var, :before_all_var, :after_all_var, 
         | 
| 28 | 
            +
                  :superclass_before_each_var, :superclass_after_each_var, :superclass_before_all_var, :superclass_after_all_var
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                before do
         | 
| 31 | 
            +
                  @inherited_before_each_var = 3
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                after do
         | 
| 35 | 
            +
                  @after_each_var = 1
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                before :all do
         | 
| 39 | 
            +
                  @before_all_var = 1
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                after :all do
         | 
| 43 | 
            +
                  @after_all_var = 1
         | 
| 8 44 | 
             
                end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                test "foo" do
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
              end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
              before do
         | 
| 51 | 
            +
                @superclass_before_each_var = 1
         | 
| 9 52 | 
             
              end
         | 
| 10 | 
            -
             | 
| 11 | 
            -
               | 
| 12 | 
            -
                 | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 53 | 
            +
             | 
| 54 | 
            +
              after do
         | 
| 55 | 
            +
                @superclass_after_each_var = 1
         | 
| 56 | 
            +
              end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
              before :all do
         | 
| 59 | 
            +
                @superclass_before_all_var = 1
         | 
| 60 | 
            +
              end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
              after :all do
         | 
| 63 | 
            +
                @superclass_after_all_var = 1
         | 
| 64 | 
            +
              end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
              context "With before/after :each blocks" do
         | 
| 67 | 
            +
                before do
         | 
| 68 | 
            +
                  @result = Test::Unit::TestResult.new
         | 
| 69 | 
            +
                  @test = sample_test.new("test_lifecycle_foo")
         | 
| 70 | 
            +
                  @test.run(@result) { |inherited_after_each_var, v| }
         | 
| 71 | 
            +
                end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                it "it runs superclass before callbacks in order" do
         | 
| 74 | 
            +
                  assert_equal 1, @test.superclass_before_each_var
         | 
| 75 | 
            +
                end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                it "it runs inherited before callbacks in order" do
         | 
| 78 | 
            +
                  assert_equal 3, @test.inherited_before_each_var
         | 
| 79 | 
            +
                end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                it "it runs before callbacks in order" do
         | 
| 82 | 
            +
                  assert_equal 1, @test.inherited_before_each_var_2
         | 
| 83 | 
            +
                end
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                it "it runs superclass after callbacks" do
         | 
| 86 | 
            +
                  assert_equal 1, @test.superclass_after_each_var
         | 
| 87 | 
            +
                end
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                it "it runs inherited after callbacks" do
         | 
| 90 | 
            +
                  assert_equal 1, @test.inherited_after_each_var
         | 
| 91 | 
            +
                end
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                it "it runs after callbacks" do
         | 
| 94 | 
            +
                  assert_equal 1, @test.after_each_var
         | 
| 95 | 
            +
                end
         | 
| 96 | 
            +
              end
         | 
| 97 | 
            +
             | 
| 98 | 
            +
              context "With before/after :all blocks" do
         | 
| 99 | 
            +
                before do
         | 
| 100 | 
            +
                  @result = Test::Unit::TestResult.new
         | 
| 101 | 
            +
                  @suite  = sample_test.suite
         | 
| 102 | 
            +
                  @suite.run(@result) { |inherited_after_each_var, v| }
         | 
| 103 | 
            +
                  @test   = @suite.tests.first
         | 
| 104 | 
            +
                end
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                it "it runs superclass before callbacks in order" do
         | 
| 107 | 
            +
                  assert_equal 1, @test.superclass_before_all_var
         | 
| 108 | 
            +
                end
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                it "it runs inherited before callbacks in order" do
         | 
| 111 | 
            +
                  assert_equal 1, @test.inherited_before_all_var
         | 
| 112 | 
            +
                end
         | 
| 113 | 
            +
             | 
| 114 | 
            +
                it "it runs before callbacks in order" do
         | 
| 115 | 
            +
                  assert_equal 1, @test.before_all_var
         | 
| 116 | 
            +
                end
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                it "it runs superclass after callbacks" do
         | 
| 119 | 
            +
                  assert_equal 1, @test.superclass_after_all_var
         | 
| 120 | 
            +
                end
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                it "it runs inherited after callbacks" do
         | 
| 123 | 
            +
                  assert_equal 1, @test.inherited_after_all_var
         | 
| 124 | 
            +
                end
         | 
| 125 | 
            +
             | 
| 126 | 
            +
                it "it runs after callbacks" do
         | 
| 127 | 
            +
                  assert_equal 1, @test.after_all_var
         | 
| 15 128 | 
             
                end
         | 
| 16 129 | 
             
              end
         | 
| 17 130 | 
             
            end
         |