rollable/spec/rollable/dice.cr

86 lines
3.0 KiB
Crystal

describe Rollable::Dice do
it "initialize" do
d = Rollable::Dice.new 2, 20
d.should be_a Rollable::Dice
d.min.should eq 2
d.max.should eq 40
d.average.should eq 21
expect_raises(Exception) { Rollable::Dice.new 1001, 20 }
end
it "details" do
d = Rollable::Dice.new 2, 6
d.min_details.should eq [1, 1]
d.max_details.should eq [6, 6]
d.average_details.should eq [3.5, 3.5]
10.times do
d.test_details.each { |v| (1..6).includes?(v).should eq(true) }
end
end
it "reverse" do
d = Rollable::Dice.new(2, 20).reverse
d.count.should eq 2
d.die.min.should eq -20
d.min.should eq -40
d.max.should eq -2
d = Rollable::Dice.new(1, 1).reverse
d.count.should eq 1
d.die.min.should eq -1
d.min.should eq -1
d.max.should eq -1
end
it "parse (simple)" do
Rollable::Dice.parse("1d6").should be_a(Rollable::Dice)
Rollable::Dice.parse("1d6").min.should eq 1
Rollable::Dice.parse("1d6").max.should eq 6
Rollable::Dice.parse("4d6").min.should eq 4
Rollable::Dice.parse("4d6").max.should eq 24
Rollable::Dice.parse("1d6+1", false).min.should eq 1
Rollable::Dice.parse("-1d6").min.should eq -6
Rollable::Dice.parse("-1d6").max.should eq -1
Rollable::Dice.parse("-1d6").count.should eq 1
Rollable::Dice.parse("!1d6").count.should eq 1
Rollable::Dice.parse("!1d6").min.should eq 1
Rollable::Dice.parse("!1d6").max.should eq Rollable::Die.new(1..6, true).max
end
it "parse (error)" do
expect_raises(Exception) { Rollable::Dice.parse("yolo") }
expect_raises(Exception) { Rollable::Dice.parse("1d6+1", true) }
expect_raises(Exception) { Rollable::Dice.parse("--1d4") }
end
it "consume" do
rest = Rollable::Dice.consume("1d6+2") do |dice|
dice.should be_a Rollable::Dice
dice.min.should eq 1
dice.max.should eq 6
end
rest.should eq("+2")
end
it "to_s" do
Rollable::Dice.parse("2d6").to_s.should eq("2D6")
Rollable::Dice.parse("-2d6").to_s.should eq("-2D6")
Rollable::Dice.parse("2").to_s.should eq("2")
Rollable::Dice.new(1, Rollable::Die.new(2..2)).to_s.should eq("2")
end
it "cmp" do
# same test in Die
(Rollable::Dice.parse("2d6") == Rollable::Dice.parse("2d6")).should eq true
(Rollable::Dice.parse("2d6") != Rollable::Dice.parse("2d8")).should eq true
(Rollable::Dice.parse("2d8") > Rollable::Dice.parse("2d6")).should eq true
(Rollable::Dice.parse("2d8") >= Rollable::Dice.parse("2d6")).should eq true
(Rollable::Dice.parse("2d4") < Rollable::Dice.parse("2d6")).should eq true
(Rollable::Dice.parse("2d4") <= Rollable::Dice.parse("2d6")).should eq true
(Rollable::Dice.parse("2d4") <=> Rollable::Dice.parse("2d6") < 0).should eq true
((Rollable::Dice.parse("2d6") <=> Rollable::Dice.parse("2d6")) == 0)
((Rollable::Dice.parse("3d6") <=> Rollable::Dice.parse("2d6")) > 0)
((Rollable::Dice.parse("1d6") <=> Rollable::Dice.parse("2d6")) < 0)
(Rollable::Dice.parse("2d6") <=> Rollable::Dice.parse("2d4") > 0).should eq true
end
end