Решение на Трета задача от Михаил Жеков

Обратно към всички решения

Към профила на Михаил Жеков

Резултати

  • 0 точки от тестове
  • 0 бонус точки
  • 0 точки общо
  • 0 успешни тест(а)
  • 19 неуспешни тест(а)

Код

require 'bigdecimal'
require 'bigdecimal/util'
class Cart
def initialize inventory_reference
@cart_content = Hash.new
@inventory_reference = inventory_reference
@cart_content.default = 0
end
def add product_name, quantity = 1
raise "There is no such product" unless @inventory_reference.has_key?(product_name)
@cart_content[product_name] += quantity
raise "Quantity less than zero" if @cart_content[product_name]<0
raise "Quantity more than 99" if @cart_content[product_name]>99
end
def total
end
def use coupon
end
def invoice
end
end
class Inventory
attr_accessor :products
def initialize
@products = Hash.new
@promotions = {get_one_free: Hash.new, package: Hash.new, threshold: Hash.new,}
end
def register name, price, promotion = {}
raise "Too long product name" if name.length>40
raise "Price too high" if price>999.99
raise "Price too low" if price<0.01
raise "Invetory already contains that product" if @products.has_key?(name)
@products[name] = price.to_d
@promotions.merge(promotion){|k, v1, v2| v1<<v2}
end
def register_coupon
end
def new_cart
Cart.new @products
end
end

Лог от изпълнението

FFFFFFFFFFFFFFFFFFF

Failures:

  1) Inventory with no discounts can tell the total price of all products
     Failure/Error: inventory.register 'The Best of Coltrane CD', '1.99'
     ArgumentError:
       comparison of String with Float failed
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `>'
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `register'
     # /tmp/d20111115-5847-1nojjda/spec.rb:39:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  2) Inventory with no discounts has some constraints on prices and counts
     Failure/Error: inventory.register 'Existing', '1.00'
     ArgumentError:
       comparison of String with Float failed
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `>'
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `register'
     # /tmp/d20111115-5847-1nojjda/spec.rb:48:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  3) Inventory with no discounts can print an invoice
     Failure/Error: inventory.register 'Green Tea',    '0.79'
     ArgumentError:
       comparison of String with Float failed
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `>'
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `register'
     # /tmp/d20111115-5847-1nojjda/spec.rb:65:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  4) Inventory with a 'buy X, get one free' promotion grants every nth item for free
     Failure/Error: inventory.register 'Gum', '1.00', get_one_free: 4
     ArgumentError:
       comparison of String with Float failed
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `>'
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `register'
     # /tmp/d20111115-5847-1nojjda/spec.rb:89:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  5) Inventory with a 'buy X, get one free' promotion grants 2 items free, when 8 purchased and every 3rd is free
     Failure/Error: inventory.register 'Gum', '1.00', get_one_free: 3
     ArgumentError:
       comparison of String with Float failed
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `>'
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `register'
     # /tmp/d20111115-5847-1nojjda/spec.rb:97:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  6) Inventory with a 'buy X, get one free' promotion shows the discount in the invoice
     Failure/Error: inventory.register 'Green Tea', '1.00', get_one_free: 3
     ArgumentError:
       comparison of String with Float failed
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `>'
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `register'
     # /tmp/d20111115-5847-1nojjda/spec.rb:105:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  7) Inventory with a '% off for every n' promotion gives % off for every group of n
     Failure/Error: inventory.register 'Sandwich', '1.00', package: {4 => 20}
     ArgumentError:
       comparison of String with Float failed
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `>'
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `register'
     # /tmp/d20111115-5847-1nojjda/spec.rb:128:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  8) Inventory with a '% off for every n' promotion does not discount for extra items, that don't fit in a group
     Failure/Error: inventory.register 'Sandwich', '0.50', package: {4 => 10}
     ArgumentError:
       comparison of String with Float failed
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `>'
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `register'
     # /tmp/d20111115-5847-1nojjda/spec.rb:138:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  9) Inventory with a '% off for every n' promotion shows the discount in the invoice
     Failure/Error: inventory.register 'Green Tea', '1.00', package: {4 => 10}
     ArgumentError:
       comparison of String with Float failed
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `>'
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `register'
     # /tmp/d20111115-5847-1nojjda/spec.rb:148:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  10) Inventory with a '% off of every item after the nth' promotion gives a discount for every item after the nth
     Failure/Error: inventory.register 'Coke', '2.00', threshold: {5 => 10}
     ArgumentError:
       comparison of String with Float failed
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `>'
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `register'
     # /tmp/d20111115-5847-1nojjda/spec.rb:171:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  11) Inventory with a '% off of every item after the nth' promotion does not give a discount if there are no more than n items in the cart
     Failure/Error: inventory.register 'Coke', '1.00', threshold: {10 => 20}
     ArgumentError:
       comparison of String with Float failed
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `>'
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `register'
     # /tmp/d20111115-5847-1nojjda/spec.rb:178:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  12) Inventory with a '% off of every item after the nth' promotion shows the discount in the ivnoice
     Failure/Error: inventory.register 'Green Tea', '1.00', threshold: {10 => 10}
     ArgumentError:
       comparison of String with Float failed
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `>'
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `register'
     # /tmp/d20111115-5847-1nojjda/spec.rb:191:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  13) Inventory with a '% off' coupon gives % off of the total
     Failure/Error: inventory.register 'Tea', '1.00'
     ArgumentError:
       comparison of String with Float failed
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `>'
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `register'
     # /tmp/d20111115-5847-1nojjda/spec.rb:214:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  14) Inventory with a '% off' coupon applies the coupon discount after product promotions
     Failure/Error: inventory.register 'Tea', '1.00', get_one_free: 6
     ArgumentError:
       comparison of String with Float failed
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `>'
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `register'
     # /tmp/d20111115-5847-1nojjda/spec.rb:224:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  15) Inventory with a '% off' coupon shows the discount in the invoice
     Failure/Error: inventory.register 'Green Tea', '1.00'
     ArgumentError:
       comparison of String with Float failed
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `>'
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `register'
     # /tmp/d20111115-5847-1nojjda/spec.rb:234:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  16) Inventory with an 'amount off' coupon subtracts the amount form the total
     Failure/Error: inventory.register 'Tea', '1.00'
     ArgumentError:
       comparison of String with Float failed
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `>'
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `register'
     # /tmp/d20111115-5847-1nojjda/spec.rb:255:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  17) Inventory with an 'amount off' coupon does not result in a negative total
     Failure/Error: inventory.register 'Tea', '1.00'
     ArgumentError:
       comparison of String with Float failed
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `>'
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `register'
     # /tmp/d20111115-5847-1nojjda/spec.rb:265:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  18) Inventory with an 'amount off' coupon shows the discount in the invoice
     Failure/Error: inventory.register 'Green Tea', '1.00'
     ArgumentError:
       comparison of String with Float failed
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `>'
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `register'
     # /tmp/d20111115-5847-1nojjda/spec.rb:275:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  19) Inventory with multiple discounts can print an invoice
     Failure/Error: inventory.register 'Green Tea',    '2.79', get_one_free: 2
     ArgumentError:
       comparison of String with Float failed
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `>'
     # /tmp/d20111115-5847-1nojjda/solution.rb:32:in `register'
     # /tmp/d20111115-5847-1nojjda/spec.rb:296:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/homework/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

Finished in 0.54807 seconds
19 examples, 19 failures

Failed examples:

rspec /tmp/d20111115-5847-1nojjda/spec.rb:38 # Inventory with no discounts can tell the total price of all products
rspec /tmp/d20111115-5847-1nojjda/spec.rb:47 # Inventory with no discounts has some constraints on prices and counts
rspec /tmp/d20111115-5847-1nojjda/spec.rb:64 # Inventory with no discounts can print an invoice
rspec /tmp/d20111115-5847-1nojjda/spec.rb:88 # Inventory with a 'buy X, get one free' promotion grants every nth item for free
rspec /tmp/d20111115-5847-1nojjda/spec.rb:96 # Inventory with a 'buy X, get one free' promotion grants 2 items free, when 8 purchased and every 3rd is free
rspec /tmp/d20111115-5847-1nojjda/spec.rb:104 # Inventory with a 'buy X, get one free' promotion shows the discount in the invoice
rspec /tmp/d20111115-5847-1nojjda/spec.rb:127 # Inventory with a '% off for every n' promotion gives % off for every group of n
rspec /tmp/d20111115-5847-1nojjda/spec.rb:137 # Inventory with a '% off for every n' promotion does not discount for extra items, that don't fit in a group
rspec /tmp/d20111115-5847-1nojjda/spec.rb:147 # Inventory with a '% off for every n' promotion shows the discount in the invoice
rspec /tmp/d20111115-5847-1nojjda/spec.rb:170 # Inventory with a '% off of every item after the nth' promotion gives a discount for every item after the nth
rspec /tmp/d20111115-5847-1nojjda/spec.rb:177 # Inventory with a '% off of every item after the nth' promotion does not give a discount if there are no more than n items in the cart
rspec /tmp/d20111115-5847-1nojjda/spec.rb:190 # Inventory with a '% off of every item after the nth' promotion shows the discount in the ivnoice
rspec /tmp/d20111115-5847-1nojjda/spec.rb:213 # Inventory with a '% off' coupon gives % off of the total
rspec /tmp/d20111115-5847-1nojjda/spec.rb:223 # Inventory with a '% off' coupon applies the coupon discount after product promotions
rspec /tmp/d20111115-5847-1nojjda/spec.rb:233 # Inventory with a '% off' coupon shows the discount in the invoice
rspec /tmp/d20111115-5847-1nojjda/spec.rb:254 # Inventory with an 'amount off' coupon subtracts the amount form the total
rspec /tmp/d20111115-5847-1nojjda/spec.rb:264 # Inventory with an 'amount off' coupon does not result in a negative total
rspec /tmp/d20111115-5847-1nojjda/spec.rb:274 # Inventory with an 'amount off' coupon shows the discount in the invoice
rspec /tmp/d20111115-5847-1nojjda/spec.rb:295 # Inventory with multiple discounts can print an invoice

История (1 версия и 0 коментара)

Михаил обнови решението на 07.11.2011 16:01 (преди над 12 години)

+require 'bigdecimal'
+require 'bigdecimal/util'
+
+class Cart
+ def initialize inventory_reference
+ @cart_content = Hash.new
+ @inventory_reference = inventory_reference
+ @cart_content.default = 0
+ end
+ def add product_name, quantity = 1
+ raise "There is no such product" unless @inventory_reference.has_key?(product_name)
+ @cart_content[product_name] += quantity
+ raise "Quantity less than zero" if @cart_content[product_name]<0
+ raise "Quantity more than 99" if @cart_content[product_name]>99
+ end
+ def total
+ end
+ def use coupon
+ end
+ def invoice
+ end
+end
+
+class Inventory
+ attr_accessor :products
+ def initialize
+ @products = Hash.new
+ @promotions = {get_one_free: Hash.new, package: Hash.new, threshold: Hash.new,}
+ end
+ def register name, price, promotion = {}
+ raise "Too long product name" if name.length>40
+ raise "Price too high" if price>999.99
+ raise "Price too low" if price<0.01
+ raise "Invetory already contains that product" if @products.has_key?(name)
+ @products[name] = price.to_d
+ @promotions.merge(promotion){|k, v1, v2| v1<<v2}
+ end
+ def register_coupon
+ end
+ def new_cart
+ Cart.new @products
+ end
+end