main
  1
  2require 'spec_helper'
  3
  4describe "review lesseon 1" do
  5  context "strings" do
  6    it "review" do
  7      puts 'blah #{DateTime.now}'
  8      puts "blah #{DateTime.now}"
  9      puts String.new("hello")
 10      # puts String.public_methods
 11    end
 12  end
 13  
 14  class Person
 15    # attr_reader :first_name
 16    # attr_writer :first_name
 17    attr_accessor :first_name
 18    
 19    def initialize(first_name = "no name")
 20      @first_naem = first_name
 21    end
 22    
 23    # def first_name
 24    #   @first_name
 25    # end
 26    
 27    # def first_name=(new_name)
 28    #   @first_name = new_name
 29    # end
 30        
 31    def change_address(street_address, city = "Calgary")
 32      @street_address = street_address
 33      @city = city
 34    end
 35    
 36    def change_clothes(pants: "jeans", shirt: "t-shirt")
 37      puts "PANTS: #{pants}"
 38      puts "SHIRT: #{shirt}"    
 39    end
 40  end
 41  
 42  class CoffeeShop
 43    def initialize(defaults = {size: "regular", type: "espresso", strength: nil, room: false})
 44      @defaults = defaults
 45    end
 46    
 47    # def serve_me(size: "regular", type: "espresso", strength: nil, room: false)
 48    def serve_me(options = {})
 49      order = @defaults.merge(options)
 50      coffee = "Here's your"
 51      [:strength, :size, :type].each do |key|
 52        coffee += (order[key] ? " #{order[key]}" : "")
 53      end
 54      coffee += (order[:room] ? " with room" : "")
 55      coffee += "."
 56      coffee
 57    end
 58  end
 59
 60  class Movies
 61    def initialize()
 62      @movies = ["jurassic park", "rocky", "rocky II"]
 63    end
 64    
 65    def accept(visitor)
 66      @movies.each do |movie|
 67        visitor.visit(movie)
 68      end
 69    end
 70  end
 71  
 72  class LoggingVisitor
 73    def visit(item)
 74      puts item
 75    end
 76  end
 77  
 78  class TotalCount
 79    attr_reader :total
 80    
 81    def initialize
 82      @total = 0
 83    end
 84    
 85    def visit(item)
 86      @total = @total + 1
 87    end
 88  end
 89  
 90  context "visitor" do
 91    it "can visit each movie" do
 92      movies = Movies.new
 93      visitor = LoggingVisitor.new
 94      total_movies = TotalCount.new
 95      
 96      movies.accept(visitor)
 97      movies.accept(total_movies)
 98      
 99      puts total_movies
100      
101      [1, 3, 4].each do |x|
102        puts x * x
103      end
104      
105      [1, 2, 4].map do |x|
106        puts x * x
107      end
108      
109    end
110  end
111  
112
113  context "objects" do
114    it "review" do
115      person = Person.new("mo")
116      # person.full_name # instance method
117      person.first_name = 'mo'
118  
119      # person.first_name=('mo')
120      # other_person = Person.create # class method (singleton method)
121      puts person.object_id
122
123    end
124    
125    it "can use a default parameter" do
126      mo = Person.new("mo")
127      mo.change_address("1737 23 ave nw")
128    end
129    
130    it "can use named parameters" do
131      mo = Person.new("mo")
132      mo.change_clothes(shirt: "bunny hug", pants: "none")
133    end
134  end
135  
136  context "CoffeeShop" do
137    def shop
138      CoffeeShop.new
139    end
140    
141    it "can serve a coffee the way I like it" do
142      coffee = shop.serve_me(size: "medium", type: "dark roast")
143      coffee.should == "Here's your medium dark roast."
144    end
145    
146    it "should serve a coffee with the correct strength" do
147      coffee = shop.serve_me(size: "large", type: "light roast", strength: 'single')
148      coffee.should == "Here's your single large light roast."
149    end
150    
151    it "should specify the room" do
152      coffee = shop.serve_me(size: "small", room: true)
153      coffee.should == "Here's your small espresso with room."
154    end
155  end
156end