rollable/spec/rollable/roll.cr

120 lines
3.9 KiB
Crystal

describe Rollable::Roll do
it "initialize" do
r = Rollable::Roll.new [
Rollable::Dice.new(1, 20),
Rollable::FixedValue.new_dice(4),
]
r.should be_a Rollable::Roll
r.min.should eq 5
r.max.should eq 24
r.average.should eq 14.5
100.times do
(5..24).includes?(r.test).should eq true
end
end
it "initialize exploding" do
r = Rollable::Roll.new [
Rollable::Dice.new(1, 6, true),
]
r.should be_a Rollable::Roll
min = 1
max = 6*Rollable::Die::EXPLODING_ITERATIONS
r.min.should eq min
r.max.should eq max
100.times do
(min..max).includes?(r.test).should eq true
end
end
it "test (details)" do
r = Rollable::Roll.new [Rollable::Dice.new(2, 6), Rollable::Dice.new(1, 4)]
r.min_details.should eq([1, 1, 1])
r.max_details.should eq([6, 6, 4])
r.average_details.should eq([3.5, 3.5, 2.5])
100.times do
t = r.test_details
(1..6).includes?(t[0]).should eq true
(1..6).includes?(t[1]).should eq true
(1..4).includes?(t[2]).should eq true
end
end
it "parse (simple)" do
(r1 = Rollable::Roll.parse("2d6+4")).should be_a(Rollable::Roll)
r1.average.should eq 11
(r2 = Rollable::Roll.parse("1")).should be_a(Rollable::Roll)
r2.average.should eq 1
(r3 = Rollable::Roll.parse("1d6")).should be_a(Rollable::Roll)
r3.average.should eq 3.5
(r4 = Rollable::Roll.parse("1d6+1")).should be_a(Rollable::Roll)
r4.average.should eq 4.5
(r5 = Rollable::Roll.parse("1d6-1")).should be_a(Rollable::Roll)
r5.average.should eq 2.5
r1.should be_a(Rollable::Roll)
r1.min.should eq 6
r1.max.should eq 16
(Rollable::Roll.parse("!2d6+4").average > Rollable::Roll.parse("2d6+4").average).should be_true
end
it "parse (error)" do
expect_raises(Exception) { Rollable::Roll.parse("yolo") }
Rollable::Roll.parse("yolo") { |_| true } rescue fail("must be catch in block")
end
it "parse (more)" do
(r = Rollable::Roll.parse(" 1d6 - 1 + 2 - 1d6 ")).should be_a(Rollable::Roll)
r.min.should eq -4
r.max.should eq 6
r.average.should eq 1
end
it "to_s" do
Rollable::Roll.parse("1d6").to_s.should eq("1D6")
Rollable::Roll.parse("-1d6").to_s.should eq("-1D6")
Rollable::Roll.parse("4").to_s.should eq("4")
Rollable::Roll.parse("-4").to_s.should eq("-4")
Rollable::Roll.parse("-4 + 2D6").to_s.should eq("-4 + 2D6")
Rollable::Roll.parse(" 1d6 - 1 + 2 - 1d6 ").to_s.should eq("1D6 - 1 + 2 - 1D6")
end
it "cmp" do
r1 = Rollable::Roll.parse("2D6 + 1")
r2 = Rollable::Roll.parse("2D6 + 2")
r3 = Rollable::Roll.parse("2D8")
# same tests than Dice and Die
(r1 == r1).should eq true
(r1 == r2).should eq false
(r1 == r3).should eq false
(r2 == r3).should eq false
(r2 >= r3).should eq false
(r2 <= r3).should eq true
((r2 <=> r3) < 0).should eq true
end
it "compact" do
r = Rollable::Roll.parse("1D6 + 1D6")
r.to_s.should eq("1D6 + 1D6")
r.compact!
r.to_s.should eq("2D6")
Rollable::Roll.parse("1D6 + 1D6 + 1D4 + 2D6 + 1D4").compact!.to_s.should eq("4D6 + 2D4")
Rollable::Roll.parse("1 + 1").compact!.to_s.should eq("2")
Rollable::Roll.parse("1 + 1 + 2").compact!.to_s.should eq("4")
Rollable::Roll.parse("1 + 1d6").compact!.to_s.should eq("1D6 + 1")
Rollable::Roll.parse("1 + 2d6 + 3").compact!.to_s.should eq("2D6 + 4")
Rollable::Roll.parse("2d8 + 1d6 + 1d20 + 5 + 2d8 + 1 + 2 + 1d6 + 1 + 1d6").compact!.to_s.should eq "4D8 + 3D6 + 1D20 + 9"
Rollable::Roll.parse("2d8 + 1d6 + 1d20 + 5 + 2d8 + 1 + 2 - 1d6 - 1 + 1d6").compact!.to_s.should eq "4D8 + 1D6 + 1D20 + 7"
Rollable::Roll.parse("1D6 + 1D6 - 2D6").compact!.size.should eq 0
end
it "order" do
r = Rollable::Roll.parse("1D4 + 1D6")
r.to_s.should eq("1D4 + 1D6")
r.order.to_s.should eq("1D6 + 1D4")
r.to_s.should eq("1D4 + 1D6")
r.order!
r.to_s.should eq("1D6 + 1D4")
end
end