Browse Source

Reach 100% code coverage.

Sam Jaffe 4 years ago
parent
commit
5384227ee1
3 changed files with 38 additions and 0 deletions
  1. 1 0
      include/dice-roll/parser.h
  2. 21 0
      src/parser.cxx
  3. 16 0
      test/parser_test.cxx

+ 1 - 0
include/dice-roll/parser.h

@@ -85,6 +85,7 @@ private:
    * Domain: value >= 0
    */
   void parse_const(sign s, int value);
+  void parse_dc(char token);
 };
 
 }

+ 21 - 0
src/parser.cxx

@@ -38,6 +38,23 @@ void parser::parse_const(sign s, int value) {
   }
 }
 
+void parser::parse_dc(char token) {
+  using test = difficulty_class::test;
+  bool const is_eq = is_.peek() == '=';
+  if (is_eq) { is_.get(); }
+  if (token == '<') {
+    dice_.dc.comp = is_eq ? test::LessOrEqual : test::Less;
+  } else {
+    dice_.dc.comp = is_eq ? test::GreaterOrEqual : test::Greater;
+  }
+  advance_over_whitespace(is_);
+  if (isnumber(is_.peek())) {
+    is_ >> dice_.dc.against;
+  } else {
+    throw unexpected_token("Expected number for DC", is_.tellg());
+  }
+}
+
 void parser::parse_impl(sign s) {
   advance_over_whitespace(is_);
   // By defaulting this to zero, we can write a more elegant handling of
@@ -60,6 +77,10 @@ void parser::parse_impl(sign s) {
     // Add another token
     parse_impl((is_.get() == '+') ? sign::PLUS : sign::MINUS);
     break;
+  case '<':
+  case '>':
+    parse_dc(is_.get());
+    break;
   default:
     parse_const(s, value);
     break;

+ 16 - 0
test/parser_test.cxx

@@ -111,6 +111,14 @@ TEST(ParserTest, CanParseDC) {
   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}"));
@@ -151,3 +159,11 @@ TEST(DiceIOTest, StringFormDoesNotPreserveWhitespace) {
   ss << dice::from_string("2 { d 4 + 5 }");
   EXPECT_THAT(ss.str(), Eq("2{1d4+5}"));
 }
+
+TEST(DiceIOTest, CanReadDirectlyFromStream) {
+  std::stringstream in("2d6-4-1d6+5"), out;
+  dice::dice d;
+  in >> d;
+  out << d;
+  EXPECT_THAT(out.str(), Eq("2d6-1d6-4+5"));
+}