spec/examples/rubber_duck_spec.rb in standard-procedure-plumbing-0.3.2 vs spec/examples/rubber_duck_spec.rb in standard-procedure-plumbing-0.3.3

- old
+ new

@@ -1,26 +1,109 @@ require "spec_helper" RSpec.describe "Rubber Duck examples" do - it "casts objects as duck types" do + it "casts objects into duck types" do # standard:disable Lint/ConstantDefinitionInBlock - Person = Plumbing::RubberDuck.define :first_name, :last_name, :email - LikesFood = Plumbing::RubberDuck.define :favourite_food + module DuckExample + Person = Plumbing::RubberDuck.define :first_name, :last_name, :email + LikesFood = Plumbing::RubberDuck.define :favourite_food - PersonData = Struct.new(:first_name, :last_name, :email, :favourite_food) - CarData = Struct.new(:make, :model, :colour) + PersonData = Struct.new(:first_name, :last_name, :email, :favourite_food) + CarData = Struct.new(:make, :model, :colour) + end + # standard:enable Lint/ConstantDefinitionInBlock - @porsche_911 = CarData.new "Porsche", "911", "black" - expect { @porsche_911.as Person }.to raise_error(TypeError) + @porsche_911 = DuckExample::CarData.new "Porsche", "911", "black" + expect { @porsche_911.as DuckExample::Person }.to raise_error(TypeError) - @alice = PersonData.new "Alice", "Aardvark", "alice@example.com", "Ice cream" + @alice = DuckExample::PersonData.new "Alice", "Aardvark", "alice@example.com", "Ice cream" - @person = @alice.as Person + @person = @alice.as DuckExample::Person expect(@person.first_name).to eq "Alice" expect(@person.email).to eq "alice@example.com" expect { @person.favourite_food }.to raise_error(NoMethodError) - @hungry = @person.as LikesFood + @hungry = @person.as DuckExample::LikesFood + expect(@hungry.favourite_food).to eq "Ice cream" + end + + it "casts objects into modules" do + # standard:disable Lint/ConstantDefinitionInBlock + module ModuleExample + module Person + def first_name = @first_name + + def last_name = @last_name + + def email = @email + end + + module LikesFood + def favourite_food = @favourite_food + end + + PersonData = Struct.new(:first_name, :last_name, :email, :favourite_food) + CarData = Struct.new(:make, :model, :colour) + end + # standard:enable Lint/ConstantDefinitionInBlock + @porsche_911 = ModuleExample::CarData.new "Porsche", "911", "black" + expect { @porsche_911.as ModuleExample::Person }.to raise_error(TypeError) + + @alice = ModuleExample::PersonData.new "Alice", "Aardvark", "alice@example.com", "Ice cream" + + @person = @alice.as ModuleExample::Person + expect(@person.first_name).to eq "Alice" + expect(@person.email).to eq "alice@example.com" + expect { @person.favourite_food }.to raise_error(NoMethodError) + + @hungry = @person.as ModuleExample::LikesFood + expect(@hungry.favourite_food).to eq "Ice cream" + end + + it "casts objects into clases" do + # standard:disable Lint/ConstantDefinitionInBlock + module ClassExample + class Person + def initialize first_name, last_name, email + @first_name = first_name + @last_name = last_name + @email = email + end + + attr_reader :first_name + attr_reader :last_name + attr_reader :email + end + + class PersonWhoLikesFood < Person + def initialize first_name, last_name, email, favourite_food + super(first_name, last_name, email) + @favourite_food = favourite_food + end + + attr_reader :favourite_food + end + + class CarData + def initialize make, model, colour + @make = make + @model = model + @colour = colour + end + end + end + # standard:enable Lint/ConstantDefinitionInBlock + @porsche_911 = ClassExample::CarData.new "Porsche", "911", "black" + expect { @porsche_911.as ClassExample::Person }.to raise_error(TypeError) + + @alice = ClassExample::PersonWhoLikesFood.new "Alice", "Aardvark", "alice@example.com", "Ice cream" + + @person = @alice.as ClassExample::Person + expect(@person.first_name).to eq "Alice" + expect(@person.email).to eq "alice@example.com" + expect { @person.favourite_food }.to raise_error(NoMethodError) + + @hungry = @person.as ClassExample::PersonWhoLikesFood expect(@hungry.favourite_food).to eq "Ice cream" end end