You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: protected_method_defined_spec.rb
    path of file: ./repos/artichoke/artichoke-backend/vendor/ruby/spec/ruby/core/module
    
    the code of the file until where you have to start completion: require_relative '../../spec_helper'
require_relative 'fixtures/classes'

describe "Module#protected_method_defined?" do
  it "returns true if the named protected method is defined by module or its ancestors" do
    ModuleSpecs::CountsMixin.protected_method_defined?("protected_3").should == true

    ModuleSpecs::CountsParent.protected_method_defined?("protected_3").should == true
    ModuleSpecs::CountsParent.protected_method_defined?("protected_2").should == true

    ModuleSpecs::CountsChild.protected_method_defined?("protected_3").should == true
    ModuleSpecs::CountsChild.protected_method_defined?("protected_2").should == true
    ModuleSpecs::CountsChild.protected_method_defined?("protected_1").should == true
  end

  it "returns
    
    def sym.to_sym() :protected_3 end

    -> do
      ModuleSpecs::CountsMixin.protected_method_defined?(sym)
    end.should raise_error(TypeError)
  end

  it "calls #to_str to convert an Object" do
    str = mock('protected_3')
    str.should_receive(:to_str).and_return("protected_3")
    ModuleSpecs::CountsMixin.protected_method_defined?(str).should == true
  end

  describe "when passed true as a second optional argument" do
    it "performs a lookup in ancestors" do
      ModuleSpecs::Child.protected_method_defined?(:public_child, true).should == false
      ModuleSpecs::Child.protected_method_defined?(:protected_child, true).should == true
      ModuleSpecs::Child.protected_method_defined?(:accessor_method, true).should == false
      ModuleSpecs::Child.protected_method_defined?(:private_child, true).should == false

      # Defined in Parent
      ModuleSpecs::Child.protected_method_defined?(:public_parent, true).should == false
      ModuleSpecs::Child.protected_method_defined?(:protected_parent, true).should == true
      ModuleSpecs::Child.protected_method_defined?(:private_parent, true).should == false

      # Defined in Module
      ModuleSpecs::Child.protected_method_defined?(:public_module, true).should == false
      ModuleSpecs::Child.protected_method_defined?(:protected_module, true).should == true
      ModuleSpecs::Child.protected_method_defined?(:private_module, true).should == false

      # Defined in SuperModule
      ModuleSpecs::Child.protected_method_defined?(:public_super_module, true).should == false
      ModuleSpecs::Child.protected_method_defined?(:protected_super_module, true).should == true
      ModuleSpecs::Child.protected_method_defined?(:private_super_module, true).should == false
    end
  end

  describe "when passed false as a second optional argument" do
    it "checks only the class itself" do
      ModuleSpecs::Child.protected_method_defined?(:public_child, false).should == false
      ModuleSpecs::Child.protected_method_defined?(:protected_child, false).should == true
      ModuleSpecs::Child.protected_method_defined?(:accessor_method, false).should == false
      ModuleSpecs::Child.protected_method_defined?(:private_child, false).should == false

      # Defined in Parent
      ModuleSpecs::Child.protected_method_defined?(:public_parent, false).should == false
      ModuleSpecs::Child.protected_method_defined?(:protected_parent, false).should == false
      ModuleSpecs::Child.protected_method_defined?(:private_parent, false).should == false

      # Defined in Module
      ModuleSpecs::Child.protected_method_defined?(:public_module, false).should == false
      ModuleSpecs::Child.protected_method_defined?(:protected_module, false).should == false
      ModuleSpecs::Child.protected_method_defined?(:private_module, false).should == false

      # Defined in SuperModule
      ModuleSpecs::Child.protected_method_defined?(:public_super_module, false).should == false
      ModuleSpecs::Child.protected_method_defined?(:protected_super_module, false).should == false
      ModuleSpecs::Child.protected_method_defined?(:private_super_module, false).should == false
    end
  end
end