Guest User

Untitled

a guest
Jul 23rd, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.81 KB | None | 0 0
  1. # -*- encoding: UTF-8 -*-
  2. describe "Money" do
  3. it "3000.yen で Moneyオブジェクトが生成できること" do
  4. 3000.yen.should == Money.create(3000, :yen)
  5. end
  6.  
  7. describe "比較演算" do
  8. it " == できること " do
  9. (1000.yen == 1000.yen).should be_true
  10. (1000.yen == 1000.dollar).should be_false
  11. (1000.yen == 1001.yen).should be_false
  12. end
  13.  
  14. it "!= できること" do
  15. (1000.yen != 1000.yen).should be_false
  16. (1000.yen != 1000.dollar).should be_true
  17. (1000.yen != 1001.yen).should be_true
  18. end
  19.  
  20. it "> できること" do
  21. (1000.yen > 1001.yen).should be_false
  22. (1000.yen > 1000.yen).should be_false
  23. (1000.yen > 999.yen).should be_true
  24. end
  25.  
  26. it "< できること" do
  27. (1000.yen < 1001.yen).should be_true
  28. (1000.yen < 1000.yen).should be_false
  29. (1000.yen < 999.yen).should be_false
  30. end
  31.  
  32. it ">= できること" do
  33. (1000.yen >= 1001.yen).should be_false
  34. (1000.yen >= 1000.yen).should be_true
  35. (1000.yen >= 999.yen).should be_true
  36. end
  37.  
  38. it "<= できること" do
  39. (1000.yen <= 1001.yen).should be_true
  40. (1000.yen <= 1000.yen).should be_true
  41. (1000.yen <= 999.yen).should be_false
  42. end
  43.  
  44. ["<", ">", ">=", "<="].each do |op|
  45. it "異なる単位は比較できないこと #{op}" do
  46. eval %Q{
  47. expect do
  48. 3000.yen #{op} 2000.dollar
  49. end.to raise_error
  50. }
  51. end
  52. end
  53. end
  54.  
  55. describe "足し算と引き算" do
  56. it "引き算が計算できること" do
  57. (3000.yen - 2000.yen).should == 1000.yen
  58. (3000.yen - 2000.yen).should_not == 0.yen
  59. end
  60.  
  61. it "足し算が計算できること" do
  62. (3000.yen + 999.yen).should == 3999.yen
  63. (3000.yen + 999.yen).should_not == 3998.yen
  64. end
  65.  
  66. it "異なる単位は計算できないこと" do
  67. expect do
  68. 3000.yen - 2000.dollar
  69. end.to raise_error
  70. expect do
  71. 3000.yen + 2000.dollar
  72. end.to raise_error
  73. end
  74. end
  75.  
  76. describe "ソート" do
  77. it "ソートできること" do
  78. [200.yen, 100.yen, 300.yen].sort.should == [100.yen, 200.yen, 300.yen]
  79. [200.yen, 100.yen, 300.yen].sort.reverse.should == [300.yen, 200.yen, 100.yen]
  80. end
  81.  
  82. it "ソートできないこと。異なる単位が混ざっている場合" do
  83. expect do
  84. [100.yen, 300.yen, 400.dollar, 200.dollar, 500.yen].sort
  85. end.to raise_error
  86. end
  87. end
  88. end
  89.  
  90. class Money
  91. # @@money = {}
  92. def self.create amount, currency = :yen
  93. # @@money["#{amount}/#{currency}"] || Money.new(amount, currency)
  94. Money.new(amount, currency)
  95. end
  96.  
  97. attr_reader :amount, :currency
  98.  
  99. def initialize(amount, currency)
  100. @amount, @currency = amount, currency
  101. # @@money["#{amount}/#{currency}"] = self
  102. end
  103.  
  104. # 比較
  105. def ==(other)
  106. self.class == other.class && self.amount == other.amount && self.currency == other.currency
  107. end
  108.  
  109. def <=> other
  110. assert_same_currency other
  111. self.amount <=> other.amount
  112. end
  113.  
  114. def < other
  115. (self <=> other) == -1
  116. end
  117.  
  118. def > other
  119. (self <=> other) == 1
  120. end
  121.  
  122. def >= other
  123. (self <=> other) >= 0
  124. end
  125.  
  126. def <= other
  127. (self <=> other) <= 0
  128. end
  129.  
  130. # 演算
  131. def +(other)
  132. assert_same_currency other
  133. Money.create(self.amount + other.amount, self.currency)
  134. end
  135.  
  136. def -(other)
  137. assert_same_currency other
  138. Money.create(self.amount - other.amount, self.currency)
  139. end
  140. # TODO 割り算、 かけ算
  141.  
  142. def assert_same_currency other
  143. raise "期待は、同じ通貨単位あることでしたが、 一致しませんでした。 #{self.currency}/#{other.currency}" if self.currency != other.currency
  144. end
  145. end
  146.  
  147. class Fixnum
  148. [:yen, :dollar].each do |currency|
  149. define_method(currency) do
  150. Money.create(self, currency)
  151. end
  152. end
  153. end
Add Comment
Please, Sign In to add comment