From 90763ee7b4539737d1ae8e653aafed705c0f3e4d Mon Sep 17 00:00:00 2001 From: Archie Date: Mon, 2 May 2022 13:55:07 +0100 Subject: [PATCH 1/4] created several classes in order to pass tests --- lib/menu.rb | 19 +++++++++++++++++++ lib/message.rb | 0 lib/order.rb | 0 lib/takeaway.rb | 19 +++++++++++++++++++ spec/menu_spec.rb | 0 spec/message_spec.rb | 0 spec/order_spec.rb | 0 spec/takeaway_spec.rb | 21 +++++++++++++++++++++ 8 files changed, 59 insertions(+) create mode 100644 lib/menu.rb create mode 100644 lib/message.rb create mode 100644 lib/order.rb create mode 100644 lib/takeaway.rb create mode 100644 spec/menu_spec.rb create mode 100644 spec/message_spec.rb create mode 100644 spec/order_spec.rb create mode 100644 spec/takeaway_spec.rb diff --git a/lib/menu.rb b/lib/menu.rb new file mode 100644 index 0000000000..261d9e0bf0 --- /dev/null +++ b/lib/menu.rb @@ -0,0 +1,19 @@ +class Menu + +MENU = { + "Sesame Prawn Toast:": 5.80, + "Spare Ribs in Honey Sauce:": 6.20, + "Siu Mai:": 4.00, + "Singapore Style Vermicelli:": 6.40, + "Chicken & Cashewnuts:": 6.60, + "Salt & Pepper Squid:": 7.20, + "Salt & Pepper Tofu:": 6.30, + "Salt & Pepper Chips:": 3.00 +} +# MENU.each { |item, price| puts "#{item} £#{price.to_f}"} + +def intialize + @menu = MENU +end + +end \ No newline at end of file diff --git a/lib/message.rb b/lib/message.rb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/order.rb b/lib/order.rb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/takeaway.rb b/lib/takeaway.rb new file mode 100644 index 0000000000..50c0608fc1 --- /dev/null +++ b/lib/takeaway.rb @@ -0,0 +1,19 @@ +class TakeAway + +attr_reader :basket + +def initialize(menu: Menu) +@menu = menu +@basket = [] +end + +def view_menu + " " +end + +def select(item) +@basket << item +end + + +end diff --git a/spec/menu_spec.rb b/spec/menu_spec.rb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/spec/message_spec.rb b/spec/message_spec.rb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/spec/order_spec.rb b/spec/order_spec.rb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/spec/takeaway_spec.rb b/spec/takeaway_spec.rb new file mode 100644 index 0000000000..decc3e46f7 --- /dev/null +++ b/spec/takeaway_spec.rb @@ -0,0 +1,21 @@ +require 'takeaway' +require 'menu' + +describe TakeAway do + + it 'can create an instance of the class' do + expect(subject).to be_kind_of(TakeAway) + end + + it 'can display a menu' do + expect(subject.view_menu).to be_kind_of(String) + end + + let(:menu){ {"Prawn Toast": 6.5}} + it 'adds items to the basket' do + + item = menu["Prawn Toast"] + subject.select(item) + expect(subject.basket).to eq [item] + end +end \ No newline at end of file From 06e584d675557a310ced3fd245a073dff5dc23eb Mon Sep 17 00:00:00 2001 From: Archie Date: Mon, 2 May 2022 18:51:53 +0100 Subject: [PATCH 2/4] FIrst user story completed --- lib/menu.rb | 23 +++++++++-------------- lib/takeaway.rb | 14 +++++--------- runner.rb | 4 ++++ spec/menu_spec.rb | 19 +++++++++++++++++++ spec/takeaway_spec.rb | 19 +++++++------------ 5 files changed, 44 insertions(+), 35 deletions(-) create mode 100644 runner.rb diff --git a/lib/menu.rb b/lib/menu.rb index 261d9e0bf0..02ee338cee 100644 --- a/lib/menu.rb +++ b/lib/menu.rb @@ -1,19 +1,14 @@ class Menu + + attr_reader :dishes + + def initialize(dishes) + @dishes = dishes + end -MENU = { - "Sesame Prawn Toast:": 5.80, - "Spare Ribs in Honey Sauce:": 6.20, - "Siu Mai:": 4.00, - "Singapore Style Vermicelli:": 6.40, - "Chicken & Cashewnuts:": 6.60, - "Salt & Pepper Squid:": 7.20, - "Salt & Pepper Tofu:": 6.30, - "Salt & Pepper Chips:": 3.00 -} -# MENU.each { |item, price| puts "#{item} £#{price.to_f}"} + def print_menu + dishes.map { |item, price| "%s: £%.2f" % [item.capitalize, price]}.join(', ') + end -def intialize - @menu = MENU -end end \ No newline at end of file diff --git a/lib/takeaway.rb b/lib/takeaway.rb index 50c0608fc1..9fc74c5883 100644 --- a/lib/takeaway.rb +++ b/lib/takeaway.rb @@ -1,19 +1,15 @@ class TakeAway -attr_reader :basket - -def initialize(menu: Menu) -@menu = menu -@basket = [] +def initialize(menu:) + @menu = menu end def view_menu - " " + menu.print end -def select(item) -@basket << item -end +private +attr_reader :menu end diff --git a/runner.rb b/runner.rb new file mode 100644 index 0000000000..e264e12dc8 --- /dev/null +++ b/runner.rb @@ -0,0 +1,4 @@ +require './lib/takeaway.rb' +require './lib/menu.rb' +require './lib/order.rb' +require './lib/message.rb' \ No newline at end of file diff --git a/spec/menu_spec.rb b/spec/menu_spec.rb index e69de29bb2..bb9065ee3c 100644 --- a/spec/menu_spec.rb +++ b/spec/menu_spec.rb @@ -0,0 +1,19 @@ +require 'menu' + +describe Menu do + subject(:menu) { described_class.new(dishes)} + let(:dishes) { { + "Prawn Toast": 5.5, + "Siu Mai": 4.0, + "Singapore Vermicelli": 6.6 + } } + it 'contains a list of dishes with prices' do + expect(menu.dishes).to eq(dishes) + end + + it "prints a list of dishes with prices" do + printed_menu = "Prawn toast: £5.50, Siu mai: £4.00, Singapore vermicelli: £6.60" + expect(menu.print_menu).to eq(printed_menu) + end + +end \ No newline at end of file diff --git a/spec/takeaway_spec.rb b/spec/takeaway_spec.rb index decc3e46f7..eda077001c 100644 --- a/spec/takeaway_spec.rb +++ b/spec/takeaway_spec.rb @@ -1,21 +1,16 @@ require 'takeaway' -require 'menu' describe TakeAway do + subject(:takeaway) { described_class.new(menu: menu) } + let(:menu) {double(:menu, print: printed_menu)} + let(:printed_menu) { "Prawn Toast: £5.50"} - it 'can create an instance of the class' do + it "can create an instance of itself" do expect(subject).to be_kind_of(TakeAway) - end - - it 'can display a menu' do - expect(subject.view_menu).to be_kind_of(String) end - let(:menu){ {"Prawn Toast": 6.5}} - it 'adds items to the basket' do - - item = menu["Prawn Toast"] - subject.select(item) - expect(subject.basket).to eq [item] + it "can print a list of dishes and prices" do + expect(takeaway.view_menu).to eq (printed_menu) end + end \ No newline at end of file From 179e0dd49e92cd622e1ce807751485d31ca86c9b Mon Sep 17 00:00:00 2001 From: Archie Date: Mon, 2 May 2022 20:23:08 +0100 Subject: [PATCH 3/4] completed user story 2. dishes are now selectable --- lib/order.rb | 16 ++++++++++++++++ lib/takeaway.rb | 8 ++++++-- spec/order_spec.rb | 28 ++++++++++++++++++++++++++++ spec/takeaway_spec.rb | 16 +++++++++++++++- 4 files changed, 65 insertions(+), 3 deletions(-) diff --git a/lib/order.rb b/lib/order.rb index e69de29bb2..cbc160fda4 100644 --- a/lib/order.rb +++ b/lib/order.rb @@ -0,0 +1,16 @@ +class Order + + attr_reader :dishes + + def initialize(menu) + @dishes = {} + @menu = menu + end + + def add(dish, quantity) + fail NoItemError, "#{dish.capitalize} is not on the menu!" unless @menu.has_dish?(dish) + dishes[dish] = quantity + end +end + +class NoItemError < StandardError; end \ No newline at end of file diff --git a/lib/takeaway.rb b/lib/takeaway.rb index 9fc74c5883..6bfcf0ef88 100644 --- a/lib/takeaway.rb +++ b/lib/takeaway.rb @@ -1,15 +1,19 @@ class TakeAway -def initialize(menu:) +def initialize(menu:, order: nil) @menu = menu + @order = order || Order.new end def view_menu menu.print end +def place_order(dishes) + dishes.each { |dish, quantity| order.add(dish, quantity) } +end private -attr_reader :menu +attr_reader :menu, :order end diff --git a/spec/order_spec.rb b/spec/order_spec.rb index e69de29bb2..2e6e6b2fe5 100644 --- a/spec/order_spec.rb +++ b/spec/order_spec.rb @@ -0,0 +1,28 @@ +require 'order' + +describe Order do + subject(:order) {described_class.new(menu)} + let(:menu) {double(:menu)} + let(:dishes) { + { + "Prawn Toast": 2, + "Siu Mai": 1 + }} + + before do + allow(menu).to receive(:has_dish?).with(:"Prawn Toast").and_return(true) + allow(menu).to receive(:has_dish?).with(:"Siu Mai").and_return(true) + end + + it "selects several dishes from the menu" do + order.add(:"Prawn Toast", 2) + order.add(:"Siu Mai", 1) + expect(order.dishes).to eq(dishes) + end + + it "doesn't allow items to be added that are not on the menu" do + allow(menu).to receive(:has_dish?).with(:"Onion Bhaji").and_return(false) + expect { order.add(:"Onion Bhaji", 2) }.to raise_error NoItemError, "Onion bhaji is not on the menu!" + end + +end \ No newline at end of file diff --git a/spec/takeaway_spec.rb b/spec/takeaway_spec.rb index eda077001c..05f634aac0 100644 --- a/spec/takeaway_spec.rb +++ b/spec/takeaway_spec.rb @@ -1,9 +1,18 @@ require 'takeaway' describe TakeAway do - subject(:takeaway) { described_class.new(menu: menu) } + + subject(:takeaway) { described_class.new(menu: menu, order: order) } + let(:menu) {double(:menu, print: printed_menu)} + let(:order) {double(:order)} + let(:printed_menu) { "Prawn Toast: £5.50"} + + let(:dishes) { { + "Prawn Toast": 1, + "Siu Mai": 2, + } } it "can create an instance of itself" do expect(subject).to be_kind_of(TakeAway) @@ -13,4 +22,9 @@ expect(takeaway.view_menu).to eq (printed_menu) end + it "can order some number of several available dishes" do + allow(order).to receive(:add).twice + expect(takeaway.place_order(dishes)).to eq(dishes) + end + end \ No newline at end of file From 73e69ffc428e4262d8ff3403816ccaf7ad9f9c6d Mon Sep 17 00:00:00 2001 From: Archie Date: Mon, 2 May 2022 22:04:18 +0100 Subject: [PATCH 4/4] Completed 3rd user story. Implemented all sorts --- lib/menu.rb | 7 +++++++ lib/order.rb | 10 ++++++++++ lib/takeaway.rb | 1 + spec/menu_spec.rb | 7 +++++++ spec/order_spec.rb | 23 +++++++++++++++++++---- spec/takeaway_spec.rb | 8 +++++++- 6 files changed, 51 insertions(+), 5 deletions(-) diff --git a/lib/menu.rb b/lib/menu.rb index 02ee338cee..53dd37f760 100644 --- a/lib/menu.rb +++ b/lib/menu.rb @@ -10,5 +10,12 @@ def print_menu dishes.map { |item, price| "%s: £%.2f" % [item.capitalize, price]}.join(', ') end + def has_dish?(dish) + !dishes[dish].nil? + end + def price(dish) + dishes[dish] + end + end \ No newline at end of file diff --git a/lib/order.rb b/lib/order.rb index cbc160fda4..7da2bccf43 100644 --- a/lib/order.rb +++ b/lib/order.rb @@ -11,6 +11,16 @@ def add(dish, quantity) fail NoItemError, "#{dish.capitalize} is not on the menu!" unless @menu.has_dish?(dish) dishes[dish] = quantity end + + def total + item_totals.reduce(:+) + end + + private + + def item_totals + dishes.map { |dish, quantity| @menu.price(dish) * quantity} + end end class NoItemError < StandardError; end \ No newline at end of file diff --git a/lib/takeaway.rb b/lib/takeaway.rb index 6bfcf0ef88..24a72f2b5b 100644 --- a/lib/takeaway.rb +++ b/lib/takeaway.rb @@ -11,6 +11,7 @@ def view_menu def place_order(dishes) dishes.each { |dish, quantity| order.add(dish, quantity) } + order.total end private diff --git a/spec/menu_spec.rb b/spec/menu_spec.rb index bb9065ee3c..c1f68d5d26 100644 --- a/spec/menu_spec.rb +++ b/spec/menu_spec.rb @@ -16,4 +16,11 @@ expect(menu.print_menu).to eq(printed_menu) end + it 'tells if a dish is on the menu' do + expect(menu.has_dish?(:"Prawn Toast")).to be true + end + + it 'claculates a price' do + expect(menu.price(:"Prawn Toast")).to eq(dishes[:"Prawn Toast"]) + end end \ No newline at end of file diff --git a/spec/order_spec.rb b/spec/order_spec.rb index 2e6e6b2fe5..6bde45eed4 100644 --- a/spec/order_spec.rb +++ b/spec/order_spec.rb @@ -1,8 +1,9 @@ require 'order' +require 'menu' describe Order do subject(:order) {described_class.new(menu)} - let(:menu) {double(:menu)} + let(:menu) {instance_double("Menu")} let(:dishes) { { "Prawn Toast": 2, @@ -12,11 +13,12 @@ before do allow(menu).to receive(:has_dish?).with(:"Prawn Toast").and_return(true) allow(menu).to receive(:has_dish?).with(:"Siu Mai").and_return(true) + allow(menu).to receive(:price).with(:"Prawn Toast").and_return(5.50) + allow(menu).to receive(:price).with(:"Siu Mai").and_return(4.00) end it "selects several dishes from the menu" do - order.add(:"Prawn Toast", 2) - order.add(:"Siu Mai", 1) + create_order expect(order.dishes).to eq(dishes) end @@ -25,4 +27,17 @@ expect { order.add(:"Onion Bhaji", 2) }.to raise_error NoItemError, "Onion bhaji is not on the menu!" end -end \ No newline at end of file + it "calculates the total of the order" do + + total = 15.00 + expect(order.total).to eq(total) + end + + + + def create_order + order.add(:"Prawn Toast", 2) + order.add(:"Siu Mai", 1) + end +end + diff --git a/spec/takeaway_spec.rb b/spec/takeaway_spec.rb index 05f634aac0..9851d18e82 100644 --- a/spec/takeaway_spec.rb +++ b/spec/takeaway_spec.rb @@ -1,11 +1,12 @@ require 'takeaway' +require 'order' describe TakeAway do subject(:takeaway) { described_class.new(menu: menu, order: order) } let(:menu) {double(:menu, print: printed_menu)} - let(:order) {double(:order)} + let(:order) {instance_double("Order", total: 15.60)} let(:printed_menu) { "Prawn Toast: £5.50"} @@ -27,4 +28,9 @@ expect(takeaway.place_order(dishes)).to eq(dishes) end + it "knows the order total" do + allow(order).to receive(:add) + total = takeaway.place_order(dishes) + expect(total).to eq(15.60) + end end \ No newline at end of file