aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--spec/practical/json_spec.cr44
1 files changed, 44 insertions, 0 deletions
diff --git a/spec/practical/json_spec.cr b/spec/practical/json_spec.cr
new file mode 100644
index 0000000..0b85658
--- /dev/null
+++ b/spec/practical/json_spec.cr
@@ -0,0 +1,44 @@
+require "../spec_helper"
+
+include Parcom
+
+# defining my own JSON alias in case of strange interactions
+# with the built-in type
+alias JSONValue = Nil \
+ | Bool \
+ | Int64 \
+ | Float64 \
+ | String \
+ | Array(JSONValue) \
+ | Hash(String, JSONValue)
+
+def json_null
+ Parser.token_sequence("null".chars).map { |_| nil.as(JSONValue) }
+end
+
+def json_value : Parser(Char, JSONValue)
+ Parser.first_of([
+ json_null,
+ ])
+end
+
+describe "example: JSON parsing" do
+ describe "json_null" do
+ it "parses the string 'null' and returns nil when successful" do
+ result = json_null.parse(Tokens.from_string("null"))
+ result.value.should be_nil
+ result.tokens.empty?.should be_true
+
+ expect_raises(ParserFail) { json_null.parse(Tokens.from_string("")) }
+ end
+ end
+
+ describe "json_value" do
+ it "parses null" do
+ result = json_value.parse(Tokens.from_string("null"))
+ result.value.should be_nil
+ result.tokens.empty?.should be_true
+ end
+ end
+end
+