aboutsummaryrefslogtreecommitdiff
path: root/spec/parcom_spec.cr
diff options
context:
space:
mode:
authorMatthew Hall <hallmatthew314@gmail.com>2023-03-17 23:54:46 +1300
committerMatthew Hall <hallmatthew314@gmail.com>2023-03-17 23:54:46 +1300
commit658876fa4db1bb8363a03135fd22ad61b25050b7 (patch)
tree79f99c99ceac77abe761903346a662c3aa788763 /spec/parcom_spec.cr
parent72236e9bcaf7bff4a2bfbeb50ddf5d0261f74927 (diff)
recover and optional
Diffstat (limited to 'spec/parcom_spec.cr')
-rw-r--r--spec/parcom_spec.cr47
1 files changed, 47 insertions, 0 deletions
diff --git a/spec/parcom_spec.cr b/spec/parcom_spec.cr
index 14e232e..6acd1b2 100644
--- a/spec/parcom_spec.cr
+++ b/spec/parcom_spec.cr
@@ -239,5 +239,52 @@ describe Parser do
expect_raises(ParserFail) { p.parse(tokens) }
end
end
+
+ describe "#recover" do
+ p = Parser(Char, Char).token('a').recover('z')
+
+ it "behaves as normal on success" do
+ tokens = Tokens.from_string("abcd")
+ result = p.parse(tokens)
+
+ result.value.should eq('a')
+ result.tokens.should eq(tokens[1..])
+ end
+
+ tokens2 = Tokens.from_string("bbcd")
+ result2 = p.parse(tokens2)
+
+ it "returns the default value instead of failing" do
+ result2.value.should eq('z')
+ end
+
+ it "does not modify the input when recovering" do
+ result2.tokens.should eq(tokens2)
+ end
+ end
+
+ describe "#optional" do
+ p = Parser(Char, Char).token('a').optional
+
+ it "behaves as normal on success" do
+ tokens = Tokens.from_string("abcd")
+ result = p.parse(tokens)
+
+ result.value.should eq('a')
+ result.tokens.should eq(tokens[1..])
+ end
+
+ tokens2 = Tokens.from_string("bbcd")
+ result2 = p.parse(tokens2)
+
+ it "returns nil instead of failing" do
+ result2.value.should be_nil
+ end
+
+ it "does not modify the input when recovering" do
+ result2.tokens.should eq(tokens2)
+ end
+
+ end
end