118 lines
3.2 KiB
Rust
118 lines
3.2 KiB
Rust
use parser_combinator::primitives::literal;
|
|
use parser_combinator::testutil::{
|
|
json_array, json_bool, json_null, json_number, json_object, json_string, JsonValue,
|
|
};
|
|
use parser_combinator::{Parser, Representation};
|
|
|
|
use proptest::prelude::*;
|
|
|
|
use rstest::*;
|
|
|
|
proptest! {
|
|
#[test]
|
|
fn doesnt_crash(s in "\\PC*") {
|
|
let _output = json_object().parse(&s);
|
|
}
|
|
|
|
#[test]
|
|
fn parse_string(s in r#"[^"]+"#) {
|
|
let input = format!("\"{}\"", s);
|
|
let output = json_string().parse(&input).unwrap();
|
|
match output {
|
|
(JsonValue::Str(output_s), "") if output_s == s => (),
|
|
_ => panic!(),
|
|
}
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn test_parsing() {
|
|
let output = literal("a").parse("a yolo");
|
|
assert_eq!(output.unwrap(), ("a", " yolo"));
|
|
}
|
|
|
|
#[test]
|
|
fn parse_json_primitives() {
|
|
assert_eq!(
|
|
json_string().parse(r#""yolo swagg""#).unwrap(),
|
|
(JsonValue::Str("yolo swagg".into()), "")
|
|
);
|
|
|
|
assert_eq!(
|
|
json_number().parse("-383").unwrap().0,
|
|
JsonValue::Num(-383f64)
|
|
);
|
|
assert_eq!(
|
|
json_number().parse("-.383").unwrap().0,
|
|
JsonValue::Num(-0.383)
|
|
);
|
|
assert_eq!(
|
|
json_number().parse(".383").unwrap().0,
|
|
JsonValue::Num(0.383)
|
|
);
|
|
assert_eq!(
|
|
json_number().parse("-1.383").unwrap().0,
|
|
JsonValue::Num(-1.383)
|
|
);
|
|
}
|
|
|
|
#[rstest]
|
|
#[case(r#"[ 4, 9, "ara",]"#)]
|
|
fn parse_json_array_err(#[case] input: &str) {
|
|
assert!(json_array().parse(input).is_err());
|
|
}
|
|
|
|
#[rstest]
|
|
#[case("[[],[]]", (JsonValue::Array(vec![JsonValue::Array(vec![]), JsonValue::Array(vec![])]), ""))]
|
|
#[case(r#"[ 4, 9, "foo" ]"#, (
|
|
JsonValue::Array(vec![
|
|
JsonValue::Num(4.),
|
|
JsonValue::Num(9.0),
|
|
JsonValue::Str("foo".to_string())
|
|
]),
|
|
""
|
|
))]
|
|
#[case(r#"[8,null,[],5],{}"#,
|
|
(
|
|
JsonValue::Array(vec![
|
|
JsonValue::Num(8.),
|
|
JsonValue::Null,
|
|
JsonValue::Array(vec![]),
|
|
JsonValue::Num(5.),
|
|
]),
|
|
",{}"
|
|
))]
|
|
fn parse_json_array(#[case] input: &str, #[case] expected: (JsonValue, &str)) {
|
|
assert_eq!(json_array().parse(input).unwrap(), expected);
|
|
}
|
|
|
|
#[test]
|
|
fn parse_json_object() {
|
|
assert_eq!(
|
|
json_object().parse(r#"{ "a": 23}"#).unwrap().0,
|
|
JsonValue::Object(vec![("a".into(), JsonValue::Num(23.))])
|
|
);
|
|
assert_eq!(
|
|
json_object().parse(r#"{}"#).unwrap().0,
|
|
JsonValue::Object(vec![])
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn parse_json_document() {
|
|
let test_json = include_str!("joplin-cfg.json");
|
|
let parsed_json = json_object().parse(test_json);
|
|
assert!(parsed_json.is_ok());
|
|
}
|
|
|
|
#[rstest]
|
|
#[case(json_null().representation(), Representation::new("null"))]
|
|
#[case(json_bool().representation(), Representation::new("true | false"))]
|
|
#[case(json_number().representation(), Representation::new("- | ε (1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | )+ . (1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | )+ | ε | . (1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | )+"))]
|
|
fn representations_test(
|
|
#[case] parser_representation: Representation,
|
|
#[case] expected: Representation,
|
|
) {
|
|
assert_eq!(parser_representation, expected);
|
|
}
|