diff --git a/spec/deposit_spec.cr b/spec/deposit_spec.cr new file mode 100644 index 0000000..83ba11c --- /dev/null +++ b/spec/deposit_spec.cr @@ -0,0 +1,38 @@ +require "./spec_helper" + +module Game::Test + describe Deposit do + it "should be created fulfilled" do + dep = Deposit.new(Resources::Type::Crystals, 100) + dep.cap.should eq 100 + dep.cur.should eq 100 + end + + it "can be created partially filled" do + dep = Deposit.new(Resources::Type::Crystals, 100, 20) + dep.cap.should eq 100 + dep.cur.should eq 20 + end + + it "should be decreased with span" do + dep = Deposit.new(Resources::Type::Crystals, 100) + dep.dec Deposit::Span.new(Resources::Type::Crystals, 20) + dep.cap.should eq 100 + dep.cur.should eq 80 + end + + it "should not be increased above capacity" do + dep = Deposit.new(Resources::Type::Crystals, 100, 20) + dep.inc Deposit::Span.new(Resources::Type::Crystals, 100) + dep.cap.should eq 100 + dep.cur.should eq 100 + end + + it "should not be decreased below zero" do + dep = Deposit.new(Resources::Type::Crystals, 100) + dep.dec Deposit::Span.new(Resources::Type::Crystals, 120) + dep.cap.should eq 100 + dep.cur.should eq 0 + end + end +end diff --git a/src/game/deposit.cr b/src/game/deposit.cr new file mode 100644 index 0000000..96c42ff --- /dev/null +++ b/src/game/deposit.cr @@ -0,0 +1,40 @@ +module Game + class Deposit + class Span + def initialize(@res : Resources::Type, @cap : Capacity) + end + + getter res + getter cap + end + + @cur : Capacity = 0 + + def initialize(@res : Resources::Type, @cap : Capacity) + @cur = @cap + end + + def initialize(@res : Resources::Type, @cap : Capacity, @cur : Capacity) + end + + getter res + getter cap + getter cur + + def inc(span : Span) + check_res span.res + @cur = Math.min(@cap, @cur + span.cap) + end + + def dec(span : Span) + check_res span.res + @cur = Math.max(0, @cur - span.cap) + end + + private def check_res(other_res : Resources::Type) + if @res != other_res + raise ResourceMismatch.new + end + end + end +end