diff options
Diffstat (limited to 'spec/ruby/core/struct/initialize_spec.rb')
| -rw-r--r-- | spec/ruby/core/struct/initialize_spec.rb | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/spec/ruby/core/struct/initialize_spec.rb b/spec/ruby/core/struct/initialize_spec.rb new file mode 100644 index 0000000000..c824f52e13 --- /dev/null +++ b/spec/ruby/core/struct/initialize_spec.rb @@ -0,0 +1,74 @@ +require_relative '../../spec_helper' +require_relative 'fixtures/classes' + +describe "Struct#initialize" do + + it "is private" do + StructClasses::Car.private_instance_methods(true).should.include?(:initialize) + end + + it 'allows valid Ruby method names for members' do + valid_method_names = [ + :method1, + :method_1, + :method_1?, + :method_1!, + :a_method + ] + valid_method_names.each do |method_name| + klass = Struct.new(method_name) + instance = klass.new(:value) + instance.send(method_name).should == :value + writer_method = "#{method_name}=".to_sym + result = instance.send(writer_method, :new_value) + result.should == :new_value + instance.send(method_name).should == :new_value + end + end + + it "does nothing when passed a set of fields equal to self" do + car = same_car = StructClasses::Car.new("Honda", "Accord", "1998") + car.instance_eval { initialize("Honda", "Accord", "1998") } + car.should == same_car + end + + it "explicitly sets instance variables to nil when args not provided to initialize" do + car = StructClasses::Honda.new + car.make.should == nil # still nil despite override in Honda#initialize b/c of super order + end + + it "can be overridden" do + StructClasses::SubclassX.new(:y).new.key.should == :value + end + + it "can be initialized with keyword arguments" do + positional_args = StructClasses::Ruby.new("3.2", "OS") + keyword_args = StructClasses::Ruby.new(version: "3.2", platform: "OS") + + positional_args.version.should == keyword_args.version + positional_args.platform.should == keyword_args.platform + end + + it "accepts positional arguments with empty keyword arguments" do + data = StructClasses::Single.new(42, **{}) + + data.value.should == 42 + + data = StructClasses::Ruby.new("3.2", "OS", **{}) + + data.version.should == "3.2" + data.platform.should == "OS" + end + + it "can be called via delegated ... from a prepended module" do + wrapper = Module.new do + def initialize(...) + super(...) + end + end + + klass = Class.new(Struct.new(:a)) { prepend wrapper } + s = klass.new("x") + s.a.should == "x" + end +end |
