From 2765c5b4c94cf95c62503b42331e7ed38da25fa3 Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Mon, 16 Sep 2019 21:37:34 +0300 Subject: [PATCH] Queue tests --- spec/queue_spec.cr | 47 ++++++++++++++++++++++++++++++++++++++++++++ spec/village_spec.cr | 9 --------- src/map.cr | 17 +++++----------- src/queue.cr | 14 ++++++------- src/village.cr | 6 +++--- 5 files changed, 62 insertions(+), 31 deletions(-) create mode 100644 spec/queue_spec.cr diff --git a/spec/queue_spec.cr b/spec/queue_spec.cr new file mode 100644 index 0000000..687b582 --- /dev/null +++ b/spec/queue_spec.cr @@ -0,0 +1,47 @@ +require "spec" +require "./../src/queue" +require "./../src/command" + +macro define_dummy_classes(count) + {% for i in (1...count) %} + class Test::DummyCommand{{ i }} < Command + def start(world) : Int32 + end + + def finish(world) + end + end + {% end %} +end + +define_dummy_classes(5) + +describe App::Queue do + it "should pop nil on empty queue" do + queue = App::Queue.new + item = queue.pop(50) + item.should be_nil + end + + it "should pop command on one element queue" do + queue = App::Queue.new + queue.push(10, Test::DummyCommand1.new) + item = queue.pop(50) + item.nil?.should be_false + item.as(App::Queue::Item).ts.should eq 10 + item.as(App::Queue::Item).command.should be_a(Test::DummyCommand1) + end + + it "should pop commands in proper order" do + queue = App::Queue.new + queue.push(10, Test::DummyCommand1.new) + queue.push(50, Test::DummyCommand2.new) + queue.push(30, Test::DummyCommand3.new) + item1 = queue.pop(100) + item1.as(App::Queue::Item).command.should be_a(Test::DummyCommand1) + item2 = queue.pop(100) + item2.as(App::Queue::Item).command.should be_a(Test::DummyCommand3) + item3 = queue.pop(100) + item3.as(App::Queue::Item).command.should be_a(Test::DummyCommand2) + end +end diff --git a/spec/village_spec.cr b/spec/village_spec.cr index 6b8ce09..5ed968c 100644 --- a/spec/village_spec.cr +++ b/spec/village_spec.cr @@ -12,12 +12,3 @@ describe Point do p2.distance(p1).should eq 10 end end - -describe App::Queue do - q = App::Queue(Int32).new - q.push(0, 1) - q.push(10, 2) - q.push(5, 3) - item = q.pop(50) - item.nil?.should be_falsey -end diff --git a/src/map.cr b/src/map.cr index 8f31c46..ae596e1 100644 --- a/src/map.cr +++ b/src/map.cr @@ -14,22 +14,15 @@ struct Point end abstract class Tile + property cap : Int32 = 0 + def initialize(@point : Point) - @cap = 0 @cur = 0 end - def point - @point - end - - def cap - @cap - end - - def cur - @cur - end + getter point + getter cap + getter cur def withdraw(value) if value >= @cur diff --git a/src/queue.cr b/src/queue.cr index 231cca7..9830556 100644 --- a/src/queue.cr +++ b/src/queue.cr @@ -1,25 +1,25 @@ -class App::Queue(T) - struct Item(T) - def initialize(@ts : Int32, @value : T) +class App::Queue + struct Item + def initialize(@ts : Int32, @command : Command) end getter ts - getter value + getter command end def initialize - @data = [] of Item(T) + @data = [] of Item end # Plan finishing of *command* at time *ts* - def push(ts : Int32, value : T) + def push(ts : Int32, value : Command) @data.push(Item.new(ts, value)) @data.sort! do |a, b| b.ts <=> a.ts end end - def pop(ts : Int32) : Item(T) | Nil + def pop(ts : Int32) : Item | Nil if @data.size == 0 return nil end diff --git a/src/village.cr b/src/village.cr index 5abf537..c6b7ec8 100644 --- a/src/village.cr +++ b/src/village.cr @@ -21,7 +21,7 @@ class World @ts = 0 @resources = Resources.new @map = Map.new - @queue = App::CommandQueue.new + @queue = App::Queue.new end private def ts @@ -49,8 +49,8 @@ class World if item.nil? break end - command_ts, command = item[:ts], item[:cmd] - @ts = command_ts + command = item.command + @ts = item.ts command.finish(self) printf "world : %d : finish `%s`\n", @ts, typeof(command) end