TestCase subclass: #'商品Test' instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'TDDBC東京1.5-自動販売機-Test'!]lang[(21 2 96 2 4 5 6)0,5,0,5,0,5,0! !商品Test methodsFor: 'tests'!]lang[(2 24)5,0! test01hash | 商品1 商品2 商品3 商品4 商品5 | 商品1 := 商品 ID: 1 製品名: #test 価格: 100. 商品2 := 商品 ID: 1 製品名: #test 価格: 100. 商品3 := 商品 ID: 2 製品名: #test 価格: 100. 商品4 := 商品 ID: 1 製品名: #test2 価格: 100. 商品5 := 商品 ID: 1 製品名: #test 価格: 101. self assert: 商品1 hash = 商品2 hash. self deny: 商品1 hash = 商品3 hash. self deny: 商品1 hash = 商品4 hash. self deny: 商品1 hash = 商品5 hash.!]lang[(14 2 2 2 2 2 2 2 2 2 5 2 5 2 7 3 8 2 8 2 5 2 7 3 8 2 8 2 5 2 7 3 8 2 8 2 5 2 7 3 9 2 8 2 5 2 7 3 8 2 21 2 9 2 20 2 9 2 20 2 9 2 20 2 9 2 7)0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! !商品Test methodsFor: 'tests'!]lang[(2 24)5,0! test02等価 | 商品1 商品2 商品3 商品4 商品5 | 商品1 := 商品 ID: 1 製品名: #test 価格: 100. 商品2 := 商品 ID: 1 製品名: #test 価格: 100. 商品3 := 商品 ID: 2 製品名: #test 価格: 100. 商品4 := 商品 ID: 1 製品名: #test2 価格: 100. 商品5 := 商品 ID: 1 製品名: #test 価格: 101. self assert: 商品1 = 商品2. self deny: 商品1 = 商品3. self deny: 商品1 = 商品4. self deny: 商品1 = 商品5.!]lang[(6 2 4 2 2 2 2 2 2 2 2 2 5 2 5 2 7 3 8 2 8 2 5 2 7 3 8 2 8 2 5 2 7 3 8 2 8 2 5 2 7 3 9 2 8 2 5 2 7 3 8 2 21 2 4 2 15 2 4 2 15 2 4 2 15 2 4 2 2)0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! !商品Test methodsFor: 'tests'!]lang[(2 24)5,0! test03辞書のキーになることができる | 商品1 辞書 | 商品1 := 商品 ID: 1 製品名: #test 価格: 100. 辞書 := Dictionary new. 辞書 at: 商品1 put: 1. self assert: (辞書 at: 商品1 ifAbsent: [0]) = 1!]lang[(6 14 4 2 2 2 4 2 5 2 7 3 8 2 8 2 21 2 5 2 25 2 5 2 20)0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! TestCase subclass: #'自動販売機Test' instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'TDDBC東京1.5-自動販売機-Test'!]lang[(21 5 96 2 4 5 6)0,5,0,5,0,5,0! !自動販売機Test methodsFor: 'tests'!]lang[(5 24)5,0! test01自動販売機を生成できる | 販売機 | 販売機 := 自動販売機 new. self assert: 販売機 class == 自動販売機!]lang[(6 11 4 3 4 3 4 5 20 3 10 5)0,5,0,5,0,5,0,5,0,5,0,5! ! !自動販売機Test methodsFor: 'tests'!]lang[(5 24)5,0! test02千円札を挿入することができる | 販売機 | 販売機 := 自動販売機 new. self shouldnt: [販売機 投入: 1000] raise: Error!]lang[(6 14 4 3 4 3 4 5 23 3 1 2 20)0,5,0,5,0,5,0,5,0,5,0,5,0! ! !自動販売機Test methodsFor: 'tests'!]lang[(5 24)5,0! test03x1円玉と5円玉以外の硬貨を投入できる | 販売機 | 販売機 := 自動販売機 new. self shouldnt: [販売機 投入: 500] raise: Error. self shouldnt: [販売機 投入: 100] raise: Error. self shouldnt: [販売機 投入: 50] raise: Error. self shouldnt: [販売機 投入: 10] raise: Error!]lang[(8 3 1 13 4 3 4 3 4 5 23 3 1 2 38 3 1 2 38 3 1 2 37 3 1 2 18)0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! !自動販売機Test methodsFor: 'tests'!]lang[(5 24)5,0! test04x1円玉と5円玉は使うことができずエラーになる | 販売機 | 販売機 := 自動販売機 new. self should: [販売機 投入: 5] raise: Error. self should: [販売機 投入: 1] raise: Error!]lang[(8 3 1 17 4 3 4 3 4 5 21 3 1 2 34 3 1 2 17)0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! !自動販売機Test methodsFor: 'tests'!]lang[(5 24)5,0! test05現在投入されている合計金額を算出できる | 販売機 | 販売機 := 自動販売機 new. 販売機 投入: 1000. 販売機 投入: 500. self assert: 販売機 投入金額 = 1500!]lang[(6 19 4 3 4 3 4 5 7 3 1 2 9 3 1 2 21 3 1 4 7)0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! !自動販売機Test methodsFor: 'tests'!]lang[(5 24)5,0! test06ID1コーラ5本120円を在庫として保持できる | 販売機 コーラ | 販売機 := 自動販売機 new. コーラ := 商品 ID: 1 製品名: #コーラ 価格: 120. self assert: (販売機 在庫 at:コーラ) = 5!]lang[(9 3 1 1 3 12 4 3 1 3 4 3 4 5 7 3 4 2 7 3 3 3 1 2 22 3 1 2 4 3 5)0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! !自動販売機Test methodsFor: 'tests'!]lang[(5 24)5,0! test07お金を投入すると現在購入できるIDを算出する | 販売機 コーラ 水 | 販売機 := 自動販売機 new. コーラ := 商品 ID: 1 製品名: #コーラ 価格: 120. 水 := 商品 ID: 3 製品名: #水 価格: 100. 販売機 投入: 50. self assert: 販売機 購入可能商品群 isEmpty. 販売機 投入: 50. self assert: 販売機 購入可能商品群 asArray = {水 ID}. 販売機 投入: 50. self assert: 販売機 購入可能商品群 asSet = {水 ID. コーラ ID} asSet.!]lang[(6 15 2 5 4 3 1 3 1 1 4 3 4 5 7 3 4 2 7 3 3 3 1 2 8 1 4 2 7 3 3 1 1 2 8 3 1 2 20 3 1 7 11 3 1 2 20 3 1 7 12 1 7 3 1 2 20 3 1 7 10 1 5 3 11)0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! !自動販売機Test methodsFor: 'tests'!]lang[(5 24)5,0! test08購入できるIDを指定してジュースを買うとコーラの在庫が減る | 販売機 コーラ | 販売機 := 自動販売機 new. コーラ := 商品 ID: 1 製品名: #コーラ 価格: 120. 販売機 投入: 100. 販売機 投入: 50. 販売機 購入: コーラ ID. self assert: (販売機 在庫 at: コーラ) = 4!]lang[(6 5 2 22 4 3 1 3 4 3 4 5 7 3 4 2 7 3 3 3 1 2 8 3 1 2 8 3 1 2 7 3 1 2 2 3 20 3 1 2 5 3 5)0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! !自動販売機Test methodsFor: 'tests'!]lang[(5 24)5,0! test09現在の売上金額が算出される | 販売機 コーラ | 販売機 := 自動販売機 new. コーラ := 商品 ID: 1 製品名: #コーラ 価格: 120. 3 timesRepeat: [販売機 投入: 100]. 6 timesRepeat: [販売機 投入: 10]. 販売機 購入: コーラ ID. self assert: (販売機 売上金額 = 120)!]lang[(6 13 4 3 1 3 4 3 4 5 7 3 4 2 7 3 3 3 1 2 24 3 1 2 25 3 1 2 8 3 1 2 2 3 20 3 1 4 7)0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! !自動販売機Test methodsFor: 'tests'!]lang[(5 24)5,0! test10現在の在庫数が算出される | 販売機 コーラ | 販売機 := 自動販売機 new. コーラ := 商品 ID: 1 製品名: #コーラ 価格: 120. 3 timesRepeat: [販売機 投入: 100]. 6 timesRepeat: [販売機 投入: 10]. 販売機 購入: コーラ ID. self assert: (販売機 在庫 at: コーラ) = 4!]lang[(6 12 4 3 1 3 4 3 4 5 7 3 4 2 7 3 3 3 1 2 24 3 1 2 25 3 1 2 8 3 1 2 2 3 20 3 1 2 5 3 5)0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! !自動販売機Test methodsFor: 'tests'!]lang[(5 24)5,0! test11在庫切れを考慮する | 販売機 コーラ | 販売機 := 自動販売機 new. コーラ := 商品 ID: 1 製品名: #コーラ 価格: 120. 5 timesRepeat: [販売機 投入: 100. 2 timesRepeat: [販売機 投入: 10]. 販売機 購入: コーラ ID]. self assert: 販売機 在庫切れ商品群 = {コーラ ID}!]lang[(6 9 4 3 1 3 4 3 4 5 7 3 4 2 7 3 3 3 1 2 24 3 1 2 23 3 1 2 7 3 1 2 2 3 20 3 1 7 4 3 4)0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! !自動販売機Test methodsFor: 'tests'!]lang[(5 24)5,0! test12千円札と500円と100円と50円と10円硬貨を保持できる | 販売機 | 販売機 := 自動販売機 new. self assert: 販売機 保持紙幣と硬貨 keys asSet = #(1000 500 100 50 10) asSet!]lang[(6 4 3 2 3 2 2 2 2 9 4 3 4 3 4 5 20 3 1 7 41)0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! !自動販売機Test methodsFor: 'tests'!]lang[(5 24)5,0! test13千円札5枚と硬貨はそれぞれ10枚保持する | 販売機 | 販売機 := 自動販売機 new. self assert: (販売機 保持紙幣と硬貨 at: 1000) = 5. #(500 100 50 10) do: [:key | self assert: (販売機 保持紙幣と硬貨 at: key) = 10]!]lang[(6 3 1 9 2 5 4 3 4 3 4 5 21 3 1 7 62 3 1 7 15)0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! !自動販売機Test methodsFor: 'tests'!]lang[(5 24)5,0! test14x500円玉を投入すると保持硬貨数が増える | 販売機 投入前 差分 | 販売機 := 自動販売機 new. 投入前 := 販売機 保持紙幣と硬貨 copy. 販売機 投入: 500. 差分 := 販売機 保持紙幣と硬貨 keys collect: [:key | key -> ((販売機 保持紙幣と硬貨 at: key) - (投入前 at: key))] thenSelect: [:assoc | assoc value ~= 0]. self assert: 差分 = {500->1}!]lang[(10 17 4 3 1 3 1 2 4 3 4 5 7 3 4 3 1 7 8 3 1 2 8 2 4 3 1 7 34 3 1 7 13 3 69 2 11)0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! !自動販売機Test methodsFor: 'tests'!]lang[(5 24)5,0! test15ジュースが1つ購入されるとお釣りとしてお金が減算される | 販売機 投入前 差分 コーラ | 販売機 := 自動販売機 new. コーラ := 商品 ID: 1 製品名: #コーラ 価格: 120. 投入前 := 販売機 保持紙幣と硬貨 copy. 販売機 投入: 500. 販売機 購入: コーラ ID. 差分 := 販売機 保持紙幣と硬貨 keys asSet collect: [:key | key -> ((販売機 保持紙幣と硬貨 at: key) - (投入前 at: key))] thenSelect: [:assoc | assoc value ~= 0]. self assert: 差分 = {500->1. 100-> -3. 50-> -1. 10-> -3} asSet!]lang[(6 5 1 21 4 3 1 3 1 2 1 3 4 3 4 5 7 3 4 2 7 3 3 3 1 2 8 3 4 3 1 7 8 3 1 2 8 3 1 2 2 3 6 2 4 3 1 7 40 3 1 7 13 3 69 2 45)0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! !自動販売機Test methodsFor: 'tests'!]lang[(5 24)5,0! test16お釣りが足りるか判断できる | 販売機 | 販売機 := 自動販売機 new. 販売機 投入: 1000. self assert: (販売機 保持紙幣と硬貨 at: 100) = 10. self assert: (販売機 保持紙幣と硬貨 at: 50) = 10. self assert: (販売機 保持紙幣と硬貨 at: 10) = 10. self assert: (販売機 購入後残金返却可か: 100). 販売機 保持紙幣と硬貨 at: 100 put: 0. self assert: (販売機 購入後残金返却可か: 100). 販売機 保持紙幣と硬貨 at: 50 put: 5. self deny: (販売機 購入後残金返却可か: 100)!]lang[(6 13 4 3 4 3 4 5 7 3 1 2 23 3 1 7 31 3 1 7 30 3 1 7 30 3 1 9 9 3 1 7 32 3 1 9 9 3 1 7 29 3 1 9 6)0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! !自動販売機Test methodsFor: 'tests'!]lang[(5 24)5,0! test17現在のお釣り用のお金が算出される | 販売機 | 販売機 := 自動販売機 new. self assert: (販売機 保持紙幣と硬貨 at: 500) = 10. self assert: (販売機 保持紙幣と硬貨 at: 100) = 10. self assert: (販売機 保持紙幣と硬貨 at: 50) = 10. self assert: (販売機 保持紙幣と硬貨 at: 10) = 10 !]lang[(6 16 4 3 4 3 4 5 21 3 1 7 31 3 1 7 31 3 1 7 30 3 1 7 14)0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! !自動販売機Test methodsFor: 'tests'!]lang[(5 24)5,0! test18xID2レッドブル200円5本を追加 | 販売機 レッドブル | 販売機 := 自動販売機 new. レッドブル := 商品 ID: 2 製品名: #レッドブル 価格: 200. self assert: (販売機 在庫 at: レッドブル) = 5!]lang[(10 5 3 1 1 4 4 3 1 5 4 3 4 5 7 5 4 2 7 3 3 5 1 2 22 3 1 2 5 5 5)0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! !自動販売機Test methodsFor: 'tests'!]lang[(5 24)5,0! test19xID3水100円5本を追加 | 販売機 水 | 販売機 := 自動販売機 new. 水 := 商品 ID: 3 製品名: #水 価格: 100. self assert: (販売機 在庫 at: 水) = 5!]lang[(10 1 3 1 1 4 4 3 1 1 4 3 4 5 7 1 4 2 7 3 3 1 1 2 22 3 1 2 5 1 5)0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! !自動販売機Test methodsFor: 'tests'!]lang[(5 24)5,0! test20お釣りが足りないと購入できない | 販売機 コーラ | 販売機 := 自動販売機 new. 販売機 投入: 1000. self assert: (販売機 保持紙幣と硬貨 at: 100) = 10. self assert: (販売機 保持紙幣と硬貨 at: 50) = 10. self assert: (販売機 保持紙幣と硬貨 at: 10) = 10. 販売機 保持紙幣と硬貨 at: 100 put: 0. 販売機 保持紙幣と硬貨 at: 50 put: 5. コーラ := 商品 ID: 1 製品名: #コーラ 価格: 120. self deny: (販売機 購入可能商品群 includes: コーラ ID)!]lang[(6 15 4 3 1 3 4 3 4 5 7 3 1 2 23 3 1 7 31 3 1 7 30 3 1 7 16 3 1 7 18 3 1 7 17 3 4 2 7 3 3 3 1 2 20 3 1 7 11 3 4)0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! !