rollable/spec/rollable/die.cr

108 lines
4.7 KiB
Crystal

describe Rollable::Die do
it "initialize" do
Rollable::Die.new(1..20).should be_a(Rollable::Die)
Rollable::Die.new(10..20).should be_a(Rollable::Die)
Rollable::Die.new(20).should be_a(Rollable::Die)
Rollable::Die.new(20, true).should be_a(Rollable::Die)
expect_raises(Exception) { Rollable::Die.new(1001) }
end
it "min, max, average" do
Rollable::Die.new(1..1).min.should eq 1
Rollable::Die.new(1..1).max.should eq 1
Rollable::Die.new(1..1).average.should eq 1
Rollable::Die.new(1..20).min.should eq 1
Rollable::Die.new(1..20).max.should eq 20
Rollable::Die.new(1..20).average.should eq 10.5
Rollable::Die.new(1..20, true).min.should eq 1
Rollable::Die.new(1..20, true).max.should eq 80
Rollable::Die.new(1..20, true).average.should eq (10.5*0.05**0 + 10.5*0.05**1 + 10.5*0.05**2 + 10.5*0.05**3).round(3)
end
it "test" do
100.times do
min = rand 1..10
max = rand min..20
((min..max).includes? Rollable::Die.new(min..max).test).should eq(true)
((min..max*Rollable::Die::EXPLODING_ITERATIONS).includes? Rollable::Die.new(min..max, true).test).should eq(true)
end
end
it "like?" do
Rollable::Die.new(1..20).like?(Rollable::Die.new(1..20)).should eq true
Rollable::Die.new(1..20).like?(Rollable::Die.new(-20..-1)).should eq true
Rollable::Die.new(1..20).like?(Rollable::Die.new(1..10)).should eq false
Rollable::Die.new(1..20, true).like?(Rollable::Die.new(1..20, false)).should eq true
end
it "negative?" do
Rollable::Die.new(1..20).negative?.should eq false
Rollable::Die.new(-1..20).negative?.should eq false
Rollable::Die.new(1..-20).negative?.should eq false
Rollable::Die.new(-1..-20).negative?.should eq true
Rollable::Die.new(1..20, true).negative?.should eq false
Rollable::Die.new(-1..-20, true).negative?.should eq true
end
it "fixed?" do
Rollable::Die.new(1..20).fixed?.should eq false
Rollable::Die.new(1..1).fixed?.should eq true
Rollable::Die.new(20..20).fixed?.should eq true
Rollable::Die.new(1).fixed?.should eq true
Rollable::Die.new(1..20, true).fixed?.should eq false
Rollable::Die.new(1, true).fixed?.should eq true
end
it "reverse" do
Rollable::Die.new(1..20).reverse.min.should eq -20
Rollable::Die.new(1..20).reverse.max.should eq -1
Rollable::Die.new(1..1).reverse.min.should eq -1
Rollable::Die.new(1..1).reverse.max.should eq -1
Rollable::Die.new(1..20, true).reverse.min.should eq -20
Rollable::Die.new(1..20, true).reverse.max.should eq -4
end
it "to_s" do
Rollable::Die.new(1..20).to_s.should eq "D20"
Rollable::Die.new(2..2).to_s.should eq "2"
Rollable::Die.new(2..4).to_s.should eq "D(2,4)"
Rollable::Die.new(1..20, true).to_s.should eq "!D20"
Rollable::Die.new(2..4, true).to_s.should eq "!D(2,4)"
end
it "cmp" do
(Rollable::Die.new(1..20) == Rollable::Die.new(1..20)).should eq true
(Rollable::Die.new(1..20) == Rollable::Die.new(1..10)).should eq false
(Rollable::Die.new(1..10) == Rollable::Die.new(1..20)).should eq false
(Rollable::Die.new(1..20) != Rollable::Die.new(1..20)).should eq false
(Rollable::Die.new(1..20) != Rollable::Die.new(1..10)).should eq true
(Rollable::Die.new(1..10) != Rollable::Die.new(1..20)).should eq true
(Rollable::Die.new(1..20) > Rollable::Die.new(1..20)).should eq false
(Rollable::Die.new(1..20) > Rollable::Die.new(1..10)).should eq true
(Rollable::Die.new(1..10) > Rollable::Die.new(1..20)).should eq false
(Rollable::Die.new(1..20) >= Rollable::Die.new(1..20)).should eq true
(Rollable::Die.new(1..20) >= Rollable::Die.new(1..10)).should eq true
(Rollable::Die.new(1..10) >= Rollable::Die.new(1..20)).should eq false
(Rollable::Die.new(1..20) < Rollable::Die.new(1..20)).should eq false
(Rollable::Die.new(1..20) < Rollable::Die.new(1..10)).should eq false
(Rollable::Die.new(1..10) < Rollable::Die.new(1..20)).should eq true
(Rollable::Die.new(1..20) <= Rollable::Die.new(1..20)).should eq true
(Rollable::Die.new(1..20) <= Rollable::Die.new(1..10)).should eq false
(Rollable::Die.new(1..10) <= Rollable::Die.new(1..20)).should eq true
# (Rollable::Die.new(2..6) <=> Rollable::Die.new(4..4) == 0).should eq true
((Rollable::Die.new(2..6) <=> Rollable::Die.new(4..4)) == 0).should eq false
((Rollable::Die.new(1..4) <=> Rollable::Die.new(1..4)) == 0).should eq true
((Rollable::Die.new(2..3) <=> Rollable::Die.new(1..4)) < 0).should eq true
(Rollable::Die.new(2..6) == Rollable::Die.new(4..4)).should eq false
# TODO: (Rollable::Die.new(1..20, true) == Rollable::Die.new(1..20, false)).should eq false
# TODO: (Rollable::Die.new(1..20, true) > Rollable::Die.new(1..20, false)).should eq true
end
end