cash_register 0.0.2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/cash_register.rb +56 -136
- data/spec/cash_register/deal_spec.rb +18 -0
- data/spec/cash_register/deals_spec.rb +13 -0
- data/spec/cash_register/discount_item_spec.rb +25 -0
- data/spec/cash_register/free_item_spec.rb +17 -0
- data/spec/cash_register/list_item_spec.rb +35 -0
- data/spec/cash_register/normal_item_spec.rb +21 -0
- data/spec/cash_register/promotions_spec.rb +24 -0
- data/spec/cash_register/two4one_item_spec.rb +17 -0
- data/spec/cash_register/util_spec.rb +9 -0
- data/spec/cash_register_spec.rb +80 -38
- data/spec/fixture/all_deals.json +32 -0
- data/spec/fixture/deals_dual_promotion.json +3 -0
- data/spec/fixture/only_discount_deals.json +3 -0
- data/spec/fixture/only_normal_deals.json +4 -0
- data/spec/fixture/only_two_for_one_deals.json +7 -0
- data/spec/fixture/only_two_for_one_deals2.json +9 -0
- data/spec/fixture/promotions.json +16 -0
- data/spec/fixture/various_deals.json +10 -0
- metadata +35 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 52a2bb5fc6d54dc472ab92d68f6948f4a250c206
|
4
|
+
data.tar.gz: cd84b56a3b90ff8398aeae47d67ed1c4c10a2861
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 34037ca8c24eccd8baca97d9146352651e02802abd1af9561c01068f0dec0a57954385b99dde67b09b19e9d9d86a20c81bbbfd92e5ccd5e0d13721dc79f94667
|
7
|
+
data.tar.gz: aa20a28b7e31b74aea28930588c36f388b548a385a1a8d8691686ed4cc78ee866d4232fc6190ef74e90aa0b42937553a57c834ce9a8612adc6992d4c3c239eb0
|
data/lib/cash_register.rb
CHANGED
@@ -1,155 +1,75 @@
|
|
1
1
|
# encoding: UTF-8
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
#价格单位为百分之一分
|
6
|
-
DEAL_INFOS = {
|
7
|
-
'ITEM000001': {
|
8
|
-
name: '可口可乐',
|
9
|
-
price: 30000,
|
10
|
-
unit: '瓶'
|
11
|
-
},
|
12
|
-
'ITEM000002': {
|
13
|
-
name: '羽毛球',
|
14
|
-
price: 10000,
|
15
|
-
unit: '个'
|
16
|
-
},
|
17
|
-
'ITEM000003': {
|
18
|
-
name: '苹果',
|
19
|
-
price: 55000,
|
20
|
-
unit: '斤'
|
21
|
-
},
|
22
|
-
'ITEM000004': {
|
23
|
-
name: '牛奶',
|
24
|
-
price: 50000,
|
25
|
-
unit: '瓶'
|
26
|
-
},
|
27
|
-
'ITEM000005': {
|
28
|
-
name: '包子',
|
29
|
-
price: 20000,
|
30
|
-
unit: '个'
|
31
|
-
}
|
32
|
-
}
|
33
|
-
#普通商品
|
34
|
-
DEAL_NORMAL = 0
|
35
|
-
#买二赠一商品
|
36
|
-
DEAL_TWO_FOR_ONE = 1
|
37
|
-
#打折商品
|
38
|
-
DEAL_DISCOUNT = 2
|
39
|
-
|
40
|
-
ON_SALE = {
|
41
|
-
TWO_FOR_ONE: [
|
42
|
-
'ITEM000001',
|
43
|
-
'ITEM000002'
|
44
|
-
],
|
45
|
-
DISCOUNT: [
|
46
|
-
'ITEM000002',
|
47
|
-
'ITEM000003'
|
48
|
-
]
|
49
|
-
}
|
2
|
+
require 'json'
|
3
|
+
Dir["#{File.dirname(__FILE__)}/cash_register/*.rb"].sort.each { |f| require f }
|
50
4
|
|
5
|
+
module CashRegister
|
51
6
|
class << self
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
#名称:羽毛球,数量:1个
|
60
|
-
#----------------------
|
61
|
-
#总计:20.45(元)
|
62
|
-
#节省:4.55(元)
|
63
|
-
#**********************
|
64
|
-
def output_bill(input_array = [])
|
65
|
-
data_to_print = calculate(input_array)
|
66
|
-
p data_to_print
|
67
|
-
output = "***<#{SHOP_NAME}>购物清单***\n"
|
68
|
-
two4one_data = []
|
69
|
-
total_price = 0
|
70
|
-
total_saving = 0
|
71
|
-
data_to_print.each do |data|
|
72
|
-
output += "名称:#{data[:name]},数量:#{data[:count]}#{data[:unit]},单价:#{get_price data[:price]}(元),"
|
73
|
-
if data[:saving] && !data[:free_num]
|
74
|
-
output += "小计:#{get_price data[:billing]}(元),节省:#{get_price data[:saving]}(元)\n"
|
75
|
-
else
|
76
|
-
output += "小计:#{get_price data[:billing]}(元)\n"
|
77
|
-
end
|
78
|
-
if data[:free_num]
|
79
|
-
two4one_data << data
|
80
|
-
end
|
81
|
-
total_price += data[:billing]
|
82
|
-
total_saving += data[:saving].to_i
|
83
|
-
end
|
84
|
-
p total_saving
|
85
|
-
if !two4one_data.empty?
|
86
|
-
output += '-'*22 + "\n"
|
87
|
-
output += "买二赠一商品:\n"
|
88
|
-
end
|
89
|
-
two4one_data.each do |data|
|
90
|
-
output += "名称:#{data[:name]},数量:#{data[:free_num]}#{data[:unit]}\n"
|
7
|
+
include Util
|
8
|
+
|
9
|
+
def output_bill(input_list)
|
10
|
+
output = []
|
11
|
+
output << "***<没钱赚商店>购物清单***"
|
12
|
+
list_items = read_list(input_list).map do |code, count|
|
13
|
+
ListItem.new(code, count)
|
91
14
|
end
|
92
|
-
output +=
|
93
|
-
|
94
|
-
if
|
95
|
-
output
|
15
|
+
output += output_list_items(list_items)
|
16
|
+
free_items = list_items.map(&:free_item).compact
|
17
|
+
if free_items.any?
|
18
|
+
output << dashed_line
|
19
|
+
output << "买二赠一商品:"
|
20
|
+
output += output_free_items(free_items)
|
96
21
|
end
|
97
|
-
output +=
|
22
|
+
output += output_summary(list_items.map(&:item))
|
98
23
|
puts output
|
99
24
|
output
|
100
25
|
end
|
101
26
|
|
102
|
-
def
|
103
|
-
|
27
|
+
def root
|
28
|
+
File.dirname __dir__
|
104
29
|
end
|
105
30
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
if deal_count.nil?
|
114
|
-
mem[deal_id] += 1
|
115
|
-
else
|
116
|
-
mem[deal_id] += deal_count.to_i
|
117
|
-
end
|
118
|
-
mem
|
119
|
-
end
|
120
|
-
deals.each do |deal, count|
|
121
|
-
deal_type = get_deal_type(deal)
|
122
|
-
out_data << calculate_item(deal, count, deal_type)
|
123
|
-
end
|
124
|
-
out_data
|
31
|
+
private
|
32
|
+
def dashed_line
|
33
|
+
'-'*22
|
34
|
+
end
|
35
|
+
|
36
|
+
def dotted_line
|
37
|
+
'*'*22
|
125
38
|
end
|
126
39
|
|
127
|
-
def
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
when DEAL_DISCOUNT
|
137
|
-
result[:saving] = (count*deal_info[:price]*0.05).to_i
|
138
|
-
result[:billing] = count*deal_info[:price] - result[:saving]
|
139
|
-
else
|
140
|
-
result[:billing] = count*deal_info[:price]
|
40
|
+
def output_summary(items)
|
41
|
+
p items.map(&:billing)
|
42
|
+
output = []
|
43
|
+
output << dashed_line
|
44
|
+
total_payment = items.map(&:billing).inject(&:+)
|
45
|
+
total_saving = items.map(&:saving).inject(&:+)
|
46
|
+
output << "总计:#{format_price total_payment}(元)"
|
47
|
+
if total_saving > 0
|
48
|
+
output << "节省:#{format_price total_saving}(元)"
|
141
49
|
end
|
142
|
-
|
143
|
-
|
50
|
+
output << dotted_line
|
51
|
+
output
|
144
52
|
end
|
145
53
|
|
146
|
-
def
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
54
|
+
def output_list_items(list_items)
|
55
|
+
list_items.map{ |list_item| list_item.to_s }
|
56
|
+
end
|
57
|
+
|
58
|
+
def output_free_items(free_items)
|
59
|
+
free_items.map{ |free_item| free_item.to_s }
|
60
|
+
end
|
61
|
+
|
62
|
+
def read_list(input_list)
|
63
|
+
input_list_path = File.join(CashRegister.root, input_list)
|
64
|
+
(JSON.parse(File.read(input_list_path)) rescue []).inject({}) do |mem, input_item|
|
65
|
+
code, count = input_item.split('-')
|
66
|
+
mem[code] ||= 0
|
67
|
+
if count.nil?
|
68
|
+
mem[code] += 1
|
69
|
+
else
|
70
|
+
mem[code] += count.to_i
|
71
|
+
end
|
72
|
+
mem
|
153
73
|
end
|
154
74
|
end
|
155
75
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require_relative '../../lib/cash_register/deal'
|
2
|
+
|
3
|
+
RSpec.describe CashRegister::Deal do
|
4
|
+
before do
|
5
|
+
@args = { "code" => "ITEM000001",
|
6
|
+
"name" => "可口可乐",
|
7
|
+
"price" => 3.0,
|
8
|
+
"unit" => "罐" }
|
9
|
+
end
|
10
|
+
|
11
|
+
it "Deal attributes" do
|
12
|
+
deal = CashRegister::Deal.new(@args)
|
13
|
+
expect(deal.code).to eq('ITEM000001')
|
14
|
+
expect(deal.name).to eq('可口可乐')
|
15
|
+
expect(deal.price).to eq(3.0)
|
16
|
+
expect(deal.unit).to eq('罐')
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require_relative '../../lib/cash_register/deal'
|
2
|
+
require_relative '../../lib/cash_register/deals'
|
3
|
+
|
4
|
+
RSpec.describe CashRegister::Deals do
|
5
|
+
before do
|
6
|
+
CashRegister::Deals.init_deals('spec/fixture/all_deals.json')
|
7
|
+
end
|
8
|
+
|
9
|
+
it "Deals" do
|
10
|
+
deal = CashRegister::Deals.find_by_code('ITEM000001')
|
11
|
+
expect(deal.name).to eq('可口可乐')
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative '../../lib/cash_register/deal'
|
2
|
+
require_relative '../../lib/cash_register/discount_item'
|
3
|
+
|
4
|
+
RSpec.describe CashRegister::DiscountItem do
|
5
|
+
before do
|
6
|
+
@args = { "code" => "ITEM000001",
|
7
|
+
"name" => "可口可乐",
|
8
|
+
"price" => 3.0,
|
9
|
+
"unit" => "罐" }
|
10
|
+
@deal = CashRegister::Deal.new(@args)
|
11
|
+
@discount_item = CashRegister::DiscountItem.new(@deal, 5)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "normal item billing" do
|
15
|
+
expect(@discount_item.billing).to eq(14.25)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'normal item saving' do
|
19
|
+
expect(@discount_item.saving).to eq(0.75)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "normal item to_s" do
|
23
|
+
expect(@discount_item.to_s).to eq('名称:可口可乐,数量:5罐,单价:3.00(元),小计:14.25(元),节省:0.75(元)')
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative '../../lib/cash_register/deal'
|
2
|
+
require_relative '../../lib/cash_register/free_item'
|
3
|
+
|
4
|
+
RSpec.describe CashRegister::FreeItem do
|
5
|
+
before do
|
6
|
+
@args = { "code" => "ITEM000001",
|
7
|
+
"name" => "可口可乐",
|
8
|
+
"price" => 3.0,
|
9
|
+
"unit" => "罐" }
|
10
|
+
@deal = CashRegister::Deal.new(@args)
|
11
|
+
@free_item = CashRegister::FreeItem.new(@deal, 5)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "free item to_s" do
|
15
|
+
expect(@free_item.to_s).to eq('名称:可口可乐,数量:5罐')
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require_relative "../../lib/cash_register"
|
3
|
+
|
4
|
+
RSpec.describe CashRegister::ListItem do
|
5
|
+
before do
|
6
|
+
CashRegister::Promotions.init_promotions('spec/fixture/promotions.json')
|
7
|
+
CashRegister::Deals.init_deals('spec/fixture/all_deals.json')
|
8
|
+
|
9
|
+
@normal_item = CashRegister::ListItem.new('ITEM000004', 5)
|
10
|
+
@two4one_item = CashRegister::ListItem.new('ITEM000001', 5)
|
11
|
+
@discount_item = CashRegister::ListItem.new('ITEM000003', 5)
|
12
|
+
@dual_promotion_item = CashRegister::ListItem.new('ITEM000002', 5)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "normal item" do
|
16
|
+
expect(@normal_item.item.class.name).to eq('CashRegister::NormalItem')
|
17
|
+
expect(@normal_item.to_s).to eq('名称:牛奶,数量:5瓶,单价:5.00(元),小计:25.00(元)')
|
18
|
+
end
|
19
|
+
|
20
|
+
it "two for one item" do
|
21
|
+
expect(@two4one_item.item.class.name).to eq('CashRegister::Two4OneItem')
|
22
|
+
expect(@two4one_item.free_item.class.name).to eq('CashRegister::FreeItem')
|
23
|
+
expect(@two4one_item.to_s).to eq('名称:可口可乐,数量:5罐,单价:3.00(元),小计:12.00(元)')
|
24
|
+
end
|
25
|
+
|
26
|
+
it "discount item" do
|
27
|
+
expect(@discount_item.item.class.name).to eq('CashRegister::DiscountItem')
|
28
|
+
expect(@discount_item.to_s).to eq('名称:苹果,数量:5斤,单价:5.50(元),小计:26.12(元),节省:1.38(元)')
|
29
|
+
end
|
30
|
+
|
31
|
+
it "dual promotions item" do
|
32
|
+
expect(@dual_promotion_item.item.class.name).to eq('CashRegister::Two4OneItem')
|
33
|
+
expect(@dual_promotion_item.to_s).to eq('名称:羽毛球,数量:5个,单价:1.00(元),小计:4.00(元)')
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative '../../lib/cash_register/deal'
|
2
|
+
require_relative '../../lib/cash_register/normal_item'
|
3
|
+
|
4
|
+
RSpec.describe CashRegister::NormalItem do
|
5
|
+
before do
|
6
|
+
@args = { "code" => "ITEM000001",
|
7
|
+
"name" => "可口可乐",
|
8
|
+
"price" => 3.0,
|
9
|
+
"unit" => "罐" }
|
10
|
+
@deal = CashRegister::Deal.new(@args)
|
11
|
+
@normal_item = CashRegister::NormalItem.new(@deal, 5)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "normal item billing" do
|
15
|
+
expect(@normal_item.billing).to eq(15.0)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "normal item to_s" do
|
19
|
+
expect(@normal_item.to_s).to eq('名称:可口可乐,数量:5罐,单价:3.00(元),小计:15.00(元)')
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative '../../lib/cash_register/promotions'
|
2
|
+
|
3
|
+
RSpec.describe CashRegister::Promotions do
|
4
|
+
before do
|
5
|
+
CashRegister::Promotions.init_promotions('spec/fixture/promotions.json')
|
6
|
+
end
|
7
|
+
|
8
|
+
it "is two for one" do
|
9
|
+
result = CashRegister::Promotions.is_two_for_one?('ITEM000001')
|
10
|
+
expect(result).to be true
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'is discount' do
|
14
|
+
result = CashRegister::Promotions.is_discount?('ITEM000003')
|
15
|
+
expect(result).to be true
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'normal deal' do
|
19
|
+
result = CashRegister::Promotions.is_discount?('ITEM000004')
|
20
|
+
expect(result).to be false
|
21
|
+
result = CashRegister::Promotions.is_two_for_one?('ITEM000004')
|
22
|
+
expect(result).to be false
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative '../../lib/cash_register/deal'
|
2
|
+
require_relative '../../lib/cash_register/two4one_item'
|
3
|
+
|
4
|
+
RSpec.describe CashRegister::Two4OneItem do
|
5
|
+
before do
|
6
|
+
@args = { "code" => "ITEM000001",
|
7
|
+
"name" => "可口可乐",
|
8
|
+
"price" => 3.0,
|
9
|
+
"unit" => "罐" }
|
10
|
+
@deal = CashRegister::Deal.new(@args)
|
11
|
+
@normal_item = CashRegister::Two4OneItem.new(@deal, 5)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "normal item billing" do
|
15
|
+
expect(@normal_item.billing).to eq(12.0)
|
16
|
+
end
|
17
|
+
end
|
data/spec/cash_register_spec.rb
CHANGED
@@ -1,48 +1,90 @@
|
|
1
|
-
ENV["RAILS_ENV"] ||= 'test'
|
2
1
|
require 'rubygems'
|
3
|
-
|
4
|
-
|
5
|
-
Dir["#{File.dirname(__FILE__)}/../lib/*.rb"].sort.each { |f| require f }
|
2
|
+
require_relative "../lib/cash_register"
|
6
3
|
|
7
4
|
RSpec.describe CashRegister do
|
8
|
-
before
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
@
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
5
|
+
before do
|
6
|
+
CashRegister::Deals.init_deals('spec/fixture/all_deals.json')
|
7
|
+
CashRegister::Promotions.init_promotions('spec/fixture/promotions.json')
|
8
|
+
@two4one_deals = 'spec/fixture/only_two_for_one_deals.json'
|
9
|
+
@two4one_deals2 = 'spec/fixture/only_two_for_one_deals2.json'
|
10
|
+
@discount_deals = 'spec/fixture/only_discount_deals.json'
|
11
|
+
@normal_deals = 'spec/fixture/only_normal_deals.json'
|
12
|
+
@deals_dual_promotion = 'spec/fixture/deals_dual_promotion.json'
|
13
|
+
@various_deals = 'spec/fixture/various_deals.json'
|
14
|
+
end
|
15
|
+
|
16
|
+
it "one free" do
|
17
|
+
bill = CashRegister.output_bill(@two4one_deals)
|
18
|
+
expect(bill).to match_array(["***<没钱赚商店>购物清单***",
|
19
|
+
"名称:可口可乐,数量:5罐,单价:3.00(元),小计:12.00(元)",
|
20
|
+
"----------------------",
|
21
|
+
"买二赠一商品:", "名称:可口可乐,数量:1罐",
|
22
|
+
"----------------------",
|
23
|
+
"总计:12.00(元)",
|
24
|
+
"节省:3.00(元)",
|
25
|
+
"**********************"])
|
26
|
+
end
|
27
|
+
|
28
|
+
it "more than one free" do
|
29
|
+
bill = CashRegister.output_bill(@two4one_deals2)
|
30
|
+
expect(bill).to match_array(["***<没钱赚商店>购物清单***",
|
31
|
+
"名称:可口可乐,数量:7罐,单价:3.00(元),小计:15.00(元)",
|
32
|
+
"----------------------",
|
33
|
+
"买二赠一商品:",
|
34
|
+
"名称:可口可乐,数量:2罐",
|
35
|
+
"----------------------",
|
36
|
+
"总计:15.00(元)",
|
37
|
+
"节省:6.00(元)",
|
38
|
+
"**********************"])
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'discount deals' do
|
42
|
+
bill = CashRegister.output_bill(@discount_deals)
|
43
|
+
expect(bill).to match_array(["***<没钱赚商店>购物清单***",
|
44
|
+
"名称:苹果,数量:2斤,单价:5.50(元),小计:10.45(元),节省:0.55(元)",
|
45
|
+
"----------------------",
|
46
|
+
"总计:10.45(元)",
|
47
|
+
"节省:0.55(元)",
|
48
|
+
"**********************"])
|
28
49
|
end
|
29
50
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
51
|
+
it 'normal deals' do
|
52
|
+
bill = CashRegister.output_bill(@normal_deals)
|
53
|
+
expect(bill).to match_array(["***<没钱赚商店>购物清单***",
|
54
|
+
"名称:牛奶,数量:3瓶,单价:5.00(元),小计:15.00(元)",
|
55
|
+
"名称:包子,数量:3个,单价:2.00(元),小计:6.00(元)",
|
56
|
+
"----------------------",
|
57
|
+
"总计:21.00(元)",
|
58
|
+
"**********************"])
|
59
|
+
end
|
35
60
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
61
|
+
it 'deals with dual promotion' do
|
62
|
+
bill = CashRegister.output_bill(@deals_dual_promotion)
|
63
|
+
expect(bill).to match_array(["***<没钱赚商店>购物清单***",
|
64
|
+
"名称:羽毛球,数量:9个,单价:1.00(元),小计:6.00(元)",
|
65
|
+
"----------------------",
|
66
|
+
"买二赠一商品:",
|
67
|
+
"名称:羽毛球,数量:3个",
|
68
|
+
"----------------------",
|
69
|
+
"总计:6.00(元)",
|
70
|
+
"节省:3.00(元)",
|
71
|
+
"**********************"])
|
40
72
|
end
|
41
73
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
74
|
+
it 'all kinds of deals' do
|
75
|
+
bill = CashRegister.output_bill(@various_deals)
|
76
|
+
expect(bill).to match_array(["***<没钱赚商店>购物清单***",
|
77
|
+
"名称:可口可乐,数量:5罐,单价:3.00(元),小计:12.00(元)",
|
78
|
+
"名称:羽毛球,数量:9个,单价:1.00(元),小计:6.00(元)",
|
79
|
+
"名称:苹果,数量:2斤,单价:5.50(元),小计:10.45(元),节省:0.55(元)",
|
80
|
+
"名称:包子,数量:3个,单价:2.00(元),小计:6.00(元)",
|
81
|
+
"----------------------",
|
82
|
+
"买二赠一商品:",
|
83
|
+
"名称:可口可乐,数量:1罐",
|
84
|
+
"名称:羽毛球,数量:3个",
|
85
|
+
"----------------------",
|
86
|
+
"总计:34.45(元)",
|
87
|
+
"节省:6.55(元)",
|
88
|
+
"**********************"])
|
47
89
|
end
|
48
90
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"code": "ITEM000001",
|
4
|
+
"name": "可口可乐",
|
5
|
+
"price": 3.00,
|
6
|
+
"unit": "罐"
|
7
|
+
},
|
8
|
+
{
|
9
|
+
"code": "ITEM000002",
|
10
|
+
"name": "羽毛球",
|
11
|
+
"price": 1.00,
|
12
|
+
"unit": "个"
|
13
|
+
},
|
14
|
+
{
|
15
|
+
"code": "ITEM000003",
|
16
|
+
"name": "苹果",
|
17
|
+
"price": 5.50,
|
18
|
+
"unit": "斤"
|
19
|
+
},
|
20
|
+
{
|
21
|
+
"code": "ITEM000004",
|
22
|
+
"name": "牛奶",
|
23
|
+
"price": 5.00,
|
24
|
+
"unit": "瓶"
|
25
|
+
},
|
26
|
+
{
|
27
|
+
"code": "ITEM000005",
|
28
|
+
"name": "包子",
|
29
|
+
"price": 2.00,
|
30
|
+
"unit": "个"
|
31
|
+
}
|
32
|
+
]
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cash_register
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Clark King
|
@@ -31,7 +31,24 @@ extensions: []
|
|
31
31
|
extra_rdoc_files: []
|
32
32
|
files:
|
33
33
|
- lib/cash_register.rb
|
34
|
+
- spec/cash_register/deal_spec.rb
|
35
|
+
- spec/cash_register/deals_spec.rb
|
36
|
+
- spec/cash_register/discount_item_spec.rb
|
37
|
+
- spec/cash_register/free_item_spec.rb
|
38
|
+
- spec/cash_register/list_item_spec.rb
|
39
|
+
- spec/cash_register/normal_item_spec.rb
|
40
|
+
- spec/cash_register/promotions_spec.rb
|
41
|
+
- spec/cash_register/two4one_item_spec.rb
|
42
|
+
- spec/cash_register/util_spec.rb
|
34
43
|
- spec/cash_register_spec.rb
|
44
|
+
- spec/fixture/all_deals.json
|
45
|
+
- spec/fixture/deals_dual_promotion.json
|
46
|
+
- spec/fixture/only_discount_deals.json
|
47
|
+
- spec/fixture/only_normal_deals.json
|
48
|
+
- spec/fixture/only_two_for_one_deals.json
|
49
|
+
- spec/fixture/only_two_for_one_deals2.json
|
50
|
+
- spec/fixture/promotions.json
|
51
|
+
- spec/fixture/various_deals.json
|
35
52
|
- spec/spec_helper.rb
|
36
53
|
homepage: https://github.com/wskongdesheng/homework-kongdesheng
|
37
54
|
licenses:
|
@@ -58,5 +75,22 @@ signing_key:
|
|
58
75
|
specification_version: 4
|
59
76
|
summary: cash register
|
60
77
|
test_files:
|
78
|
+
- spec/cash_register/free_item_spec.rb
|
79
|
+
- spec/cash_register/two4one_item_spec.rb
|
80
|
+
- spec/cash_register/deal_spec.rb
|
81
|
+
- spec/cash_register/normal_item_spec.rb
|
82
|
+
- spec/cash_register/deals_spec.rb
|
83
|
+
- spec/cash_register/list_item_spec.rb
|
84
|
+
- spec/cash_register/discount_item_spec.rb
|
85
|
+
- spec/cash_register/util_spec.rb
|
86
|
+
- spec/cash_register/promotions_spec.rb
|
61
87
|
- spec/spec_helper.rb
|
62
88
|
- spec/cash_register_spec.rb
|
89
|
+
- spec/fixture/promotions.json
|
90
|
+
- spec/fixture/only_discount_deals.json
|
91
|
+
- spec/fixture/various_deals.json
|
92
|
+
- spec/fixture/only_two_for_one_deals.json
|
93
|
+
- spec/fixture/only_two_for_one_deals2.json
|
94
|
+
- spec/fixture/deals_dual_promotion.json
|
95
|
+
- spec/fixture/only_normal_deals.json
|
96
|
+
- spec/fixture/all_deals.json
|