From 7ad736bca81c41acaa3c27f3c76538b17f556850 Mon Sep 17 00:00:00 2001
From: Per Lindgren <per.lindgren@ltu.se>
Date: Thu, 5 Sep 2019 16:25:15 +0200
Subject: [PATCH] with test

---
 src/main.rs | 52 +++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 35 insertions(+), 17 deletions(-)

diff --git a/src/main.rs b/src/main.rs
index fb6230e..5a8e287 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -6,8 +6,7 @@ use nom::{
     bytes::complete::tag,
     character::complete::{digit1, multispace0},
     combinator::map,
-    error::{VerboseError, VerboseErrorKind},
-    map_res,
+    error::{context, VerboseError, VerboseErrorKind},
     sequence::{preceded, tuple},
     IResult,
 };
@@ -24,29 +23,48 @@ pub enum Expr {
 }
 
 pub fn parse_i32(i: &str) -> IResult<&str, Expr, VerboseError<&str>> {
-    map_res(digit1, |digit_str: &str| match digit_str.parse::<i32>() {
-        Err(e) => Err(VerboseError {
-            errors: vec![(digit_str, VerboseErrorKind::Context("not a 32-bit integer"))],
-        }),
-        Ok(x) => Ok(Expr::Num(x)),
+    map_res::<_, _, _, _, VerboseError<&str>, _, _>(digit1, |digit_str: &str| {
+        match digit_str.parse::<i32>() {
+            // Err(e) => panic!("e {:?}", e),
+            Err(_) => Err(VerboseError {
+                errors: vec![(digit_str, VerboseErrorKind::Context("not a 32-bit integer"))],
+            }),
+            Ok(x) => Ok(Expr::Num(x)),
+        }
     })(i)
 }
 
 fn parse_expr(input: &str) -> IResult<&str, Expr, VerboseError<&str>> {
-    preceded(
-        multispace0,
-        alt((
-            map(
-                tuple((parse_i32, preceded(multispace0, tag("+")), parse_expr)),
-                |(l, _, r)| Expr::BinOp(Box::new(l), Op::Add, Box::new(r)),
-            ),
-            parse_i32,
-        )),
+    context(
+        "parse_expr",
+        preceded(
+            multispace0,
+            alt((
+                map(
+                    tuple((parse_i32, preceded(multispace0, tag("+")), parse_expr)),
+                    |(l, _, r)| Expr::BinOp(Box::new(l), Op::Add, Box::new(r)),
+                ),
+                parse_i32,
+            )),
+        ),
     )(input)
 }
 
+// cargo test
+#[test]
+fn test_parse_i32_1() {
+    let res = parse_expr("2");
+    assert!(res == Ok(("", Expr::Num(1))))
+}
+
+#[test]
+fn test_parse_i32_2() {
+    let _ = parse_expr("1a").is_ok();
+}
+
 fn main() {
     println!("{:?}", parse_expr("1"));
-    println!("{:?}", parse_expr("1+1a"));
+    println!("{:?}", parse_expr("1+2 + 3"));
+    println!("{:?}", parse_expr("   1+ 1a"));
     println!("{:?}", parse_expr("11111111111111111111111111"));
 }
-- 
GitLab