|
|
@@ -15,29 +15,29 @@
|
|
|
|
|
|
using unsigned_die = std::pair<int, int>;
|
|
|
namespace dice {
|
|
|
- bool operator==(die const & lhs, die const & rhs) {
|
|
|
- return lhs.sgn == rhs.sgn && lhs.num == rhs.num && lhs.sides == rhs.sides;
|
|
|
- }
|
|
|
-
|
|
|
- bool operator==(die const & lhs, unsigned_die const & rhs) {
|
|
|
- return lhs.num == rhs.first && lhs.sides == rhs.second;
|
|
|
- }
|
|
|
+bool operator==(die const & lhs, die const & rhs) {
|
|
|
+ return lhs.sgn == rhs.sgn && lhs.num == rhs.num && lhs.sides == rhs.sides;
|
|
|
+}
|
|
|
+
|
|
|
+bool operator==(die const & lhs, unsigned_die const & rhs) {
|
|
|
+ return lhs.num == rhs.first && lhs.sides == rhs.second;
|
|
|
+}
|
|
|
}
|
|
|
|
|
|
using namespace ::testing;
|
|
|
|
|
|
-TEST(DiceTest, ThrowsOnEmptyString) {
|
|
|
+TEST(ParserTest, ThrowsOnEmptyString) {
|
|
|
EXPECT_THROW(dice::from_string(""), dice::unexpected_token);
|
|
|
}
|
|
|
|
|
|
-TEST(DiceTest, ThrowsOnOpeningArithmetic) {
|
|
|
+TEST(ParserTest, ThrowsOnOpeningArithmetic) {
|
|
|
EXPECT_THROW(dice::from_string("+5"), dice::unexpected_token);
|
|
|
EXPECT_THROW(dice::from_string("-5"), dice::unexpected_token);
|
|
|
EXPECT_THROW(dice::from_string("+1d4"), dice::unexpected_token);
|
|
|
EXPECT_THROW(dice::from_string("-1d4"), dice::unexpected_token);
|
|
|
}
|
|
|
|
|
|
-TEST(DiceTest, Implicit1dN) {
|
|
|
+TEST(ParserTest, Implicit1dN) {
|
|
|
dice::dice capture;
|
|
|
EXPECT_NO_THROW(capture = dice::from_string("d4"));
|
|
|
EXPECT_THAT(capture.num, Eq(1));
|
|
|
@@ -45,7 +45,7 @@ TEST(DiceTest, Implicit1dN) {
|
|
|
EXPECT_THAT(capture.of[0], Eq(unsigned_die(1, 4)));
|
|
|
}
|
|
|
|
|
|
-TEST(DiceTest, Explicit1dN) {
|
|
|
+TEST(ParserTest, Explicit1dN) {
|
|
|
dice::dice capture;
|
|
|
EXPECT_NO_THROW(capture = dice::from_string("1d4"));
|
|
|
EXPECT_THAT(capture.num, Eq(1));
|
|
|
@@ -53,11 +53,11 @@ TEST(DiceTest, Explicit1dN) {
|
|
|
EXPECT_THAT(capture.of[0], Eq(unsigned_die(1, 4)));
|
|
|
}
|
|
|
|
|
|
-TEST(DiceTest, CannotImplicitNumberOfSides) {
|
|
|
+TEST(ParserTest, CannotImplicitNumberOfSides) {
|
|
|
EXPECT_THROW(dice::from_string("1d"), dice::unexpected_token);
|
|
|
}
|
|
|
|
|
|
-TEST(DiceTest, AllowsMultipleDice) {
|
|
|
+TEST(ParserTest, AllowsMultipleDice) {
|
|
|
dice::dice capture;
|
|
|
EXPECT_NO_THROW(capture = dice::from_string("1d4+1d6"));
|
|
|
EXPECT_THAT(capture.of, SizeIs(2));
|
|
|
@@ -65,7 +65,7 @@ TEST(DiceTest, AllowsMultipleDice) {
|
|
|
Eq(unsigned_die(1, 6))));
|
|
|
}
|
|
|
|
|
|
-TEST(DiceTest, CanIncludeConstant) {
|
|
|
+TEST(ParserTest, CanIncludeConstant) {
|
|
|
dice::dice capture;
|
|
|
EXPECT_NO_THROW(capture = dice::from_string("1d4+1"));
|
|
|
EXPECT_THAT(capture.of, SizeIs(1));
|
|
|
@@ -73,7 +73,7 @@ TEST(DiceTest, CanIncludeConstant) {
|
|
|
EXPECT_THAT(capture.modifier[0].value, 1);
|
|
|
}
|
|
|
|
|
|
-TEST(DiceTest, ConstantSignIsInSgnMember) {
|
|
|
+TEST(ParserTest, ConstantSignIsInSgnMember) {
|
|
|
dice::dice capture;
|
|
|
EXPECT_NO_THROW(capture = dice::from_string("1d4-1"));
|
|
|
EXPECT_THAT(capture.of, SizeIs(1));
|
|
|
@@ -81,22 +81,22 @@ TEST(DiceTest, ConstantSignIsInSgnMember) {
|
|
|
EXPECT_THAT(capture.modifier[0].value, 1);
|
|
|
}
|
|
|
|
|
|
-TEST(DiceTest, ThrowsIfUnterminatedArithmatic) {
|
|
|
+TEST(ParserTest, ThrowsIfUnterminatedArithmatic) {
|
|
|
EXPECT_THROW(dice::from_string("1d4+"), dice::unexpected_token);
|
|
|
}
|
|
|
|
|
|
-TEST(DiceTest, CanProduceMultiRollExpression) {
|
|
|
+TEST(ParserTest, CanProduceMultiRollExpression) {
|
|
|
dice::dice capture;
|
|
|
EXPECT_NO_THROW(capture = dice::from_string("2{d4}"));
|
|
|
EXPECT_THAT(capture.num, Eq(2));
|
|
|
EXPECT_THAT(capture.of, SizeIs(1));
|
|
|
}
|
|
|
|
|
|
-TEST(DiceTest, MultiRollWillThrowIfNoEndBrace) {
|
|
|
+TEST(ParserTest, MultiRollWillThrowIfNoEndBrace) {
|
|
|
EXPECT_THROW(dice::from_string("2{d4"), dice::unexpected_token);
|
|
|
}
|
|
|
|
|
|
-TEST(DiceTest, IgnoresWhitespace) {
|
|
|
+TEST(ParserTest, IgnoresWhitespace) {
|
|
|
dice::dice capture;
|
|
|
EXPECT_NO_THROW(capture = dice::from_string("2 { d 4 + 5 }"));
|
|
|
EXPECT_THAT(capture.num, Eq(2));
|
|
|
@@ -104,14 +104,40 @@ TEST(DiceTest, IgnoresWhitespace) {
|
|
|
EXPECT_THAT(capture.modifier, SizeIs(1));
|
|
|
}
|
|
|
|
|
|
-TEST(DiceSerialTest, StringFormIsExplicit) {
|
|
|
- std::stringstream ss;
|
|
|
- ss << dice::from_string("2{2d6-d4+5}");
|
|
|
- EXPECT_THAT(ss.str(), Eq("2{2d6-1d4+5}"));
|
|
|
+TEST(ParserTest, CanParseDC) {
|
|
|
+ EXPECT_NO_THROW(dice::from_string("1d20<10"));
|
|
|
+ EXPECT_NO_THROW(dice::from_string("1d20<=10"));
|
|
|
+ EXPECT_NO_THROW(dice::from_string("1d20>10"));
|
|
|
+ EXPECT_NO_THROW(dice::from_string("1d20>=10"));
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ParserTest, DCCannotBeNegative) {
|
|
|
+ EXPECT_THROW(dice::from_string("1d20>-1"), dice::unexpected_token);
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ParserTest, DCCanBeWhitespacePadded) {
|
|
|
+ EXPECT_NO_THROW(dice::from_string("1d20 < 10"));
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ParserTest, CanParseDCForMultiroll) {
|
|
|
+ EXPECT_NO_THROW(dice::from_string("2{1d20<10}"));
|
|
|
+ EXPECT_NO_THROW(dice::from_string("2{1d20<=10}"));
|
|
|
+ EXPECT_NO_THROW(dice::from_string("2{1d20>10}"));
|
|
|
+ EXPECT_NO_THROW(dice::from_string("2{1d20>=10}"));
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ParserTest, MultirollDCMustAppearInsideBrackets) {
|
|
|
+ EXPECT_NO_THROW(dice::from_string("2{1d20}<10"));
|
|
|
+ EXPECT_NO_THROW(dice::from_string("2{1d20}<=10"));
|
|
|
+ EXPECT_NO_THROW(dice::from_string("2{1d20}>10"));
|
|
|
+ EXPECT_NO_THROW(dice::from_string("2{1d20}>=10"));
|
|
|
}
|
|
|
|
|
|
-TEST(DiceSerialTest, StringFormDoesNotPreserveWhitespace) {
|
|
|
- std::stringstream ss;
|
|
|
- ss << dice::from_string("2 { d 4 + 5 }");
|
|
|
- EXPECT_THAT(ss.str(), Eq("2{1d4+5}"));
|
|
|
+TEST(ParserTest, DCIsCaptured) {
|
|
|
+ using test = dice::difficulty_class::test;
|
|
|
+ EXPECT_THAT(dice::from_string("1d20<10").dc.against, 10);
|
|
|
+ EXPECT_THAT(dice::from_string("1d20<10").dc.comp, test::Less);
|
|
|
+ EXPECT_THAT(dice::from_string("1d20<=10").dc.comp, test::LessOrEqual);
|
|
|
+ EXPECT_THAT(dice::from_string("1d20>10").dc.comp, test::Greater);
|
|
|
+ EXPECT_THAT(dice::from_string("1d20>=10").dc.comp, test::GreaterOrEqual);
|
|
|
}
|