parser_of_json 0.1.0

A parser for a JSON-type structure
Documentation
use parser_of_json::{JsonValue, get_field, parse_json, validate_json};

#[test]
fn test_invalid_missing_brace() {
    assert!(!validate_json("{\"a\": 1"));
}

#[test]
fn test_invalid_missing_colon() {
    assert!(!validate_json("{\"a\" 1}"));
}

#[test]
fn test_invalid_trailing_comma_object() {
    assert!(!validate_json("{\"a\":1,}"));
}

#[test]
fn test_invalid_trailing_comma_array() {
    assert!(!validate_json("[1,2,]"));
}

#[test]
fn test_invalid_double_comma() {
    assert!(!validate_json("{\"a\":1,,\"b\":2}"));
}

#[test]
fn test_invalid_bareword() {
    assert!(!validate_json("{a: 1}"));
}

#[test]
fn test_string_with_unicode_escape() {
    let input = "\"abc \\u1234 def\"";
    let val = parse_json(input).unwrap();

    if let JsonValue::String(s) = val {
        assert!(s.contains("\\u1234"));
    }
}

#[test]
fn test_number_big() {
    let val = parse_json("123456789012345").unwrap();
    if let JsonValue::Number(n) = val {
        assert_eq!(n, 123456789012345.0);
    }
}

#[test]
fn test_invalid_fraction() {
    assert!(!validate_json("1."));
}

#[test]
fn test_array_single_value() {
    let val = parse_json("[42]").unwrap();
    if let JsonValue::Array(arr) = val {
        assert_eq!(arr.len(), 1);
    }
}

#[test]
fn test_array_nested_mixed() {
    let val = parse_json("[1, [2, [3]], 4]").unwrap();
    if let JsonValue::Array(arr) = val {
        assert_eq!(arr.len(), 3);
    }
}

#[test]
fn test_array_with_objects() {
    let val = parse_json("[{\"x\":1}, {\"y\":2}]").unwrap();
    if let JsonValue::Array(arr) = val {
        assert_eq!(arr.len(), 2);
    }
}

#[test]
fn test_object_deep_nesting() {
    let val = parse_json("{\"a\":{\"b\":{\"c\":{\"d\":1}}}}").unwrap();

    if let JsonValue::Object(a) = val {
        if let JsonValue::Object(b) = a.get("a").unwrap() {
            if let JsonValue::Object(c) = b.get("b").unwrap() {
                if let JsonValue::Object(d) = c.get("c").unwrap() {
                    if let JsonValue::Number(num) = d.get("d").unwrap() {
                        assert_eq!(*num, 1.0);
                    }
                }
            }
        }
    }
}

#[test]
fn test_object_key_retrieval_multiple_types() {
    let json = r#"{
        "num": 10,
        "str": "abc",
        "bool": true,
        "null": null,
        "arr": [1,2],
        "obj": {"x":1}
    }"#;

    let root = parse_json(json).unwrap();

    assert!(matches!(
        get_field(&root, "num"),
        Some(JsonValue::Number(_))
    ));
    assert!(matches!(
        get_field(&root, "str"),
        Some(JsonValue::String(_))
    ));
    assert!(matches!(get_field(&root, "bool"), Some(JsonValue::Bool(_))));
    assert!(matches!(get_field(&root, "null"), Some(JsonValue::Null)));
    assert!(matches!(get_field(&root, "arr"), Some(JsonValue::Array(_))));
    assert!(matches!(
        get_field(&root, "obj"),
        Some(JsonValue::Object(_))
    ));
}

#[test]
fn test_root_value_string() {
    let val = parse_json("\"rty\"").unwrap();
    if let JsonValue::String(s) = val {
        assert_eq!(s, "rty");
    }
}

#[test]
fn test_root_value_number() {
    let val = parse_json("53").unwrap();
    if let JsonValue::Number(n) = val {
        assert_eq!(n, 53.0);
    }
}

#[test]
fn test_root_value_array() {
    let val = parse_json("[1,2]").unwrap();
    if let JsonValue::Array(arr) = val {
        assert_eq!(arr.len(), 2);
    }
}

#[test]
fn test_root_value_object() {
    let val = parse_json("{\"a\":1}").unwrap();
    if let JsonValue::Object(map) = val {
        assert!(map.contains_key("a"));
    }
}

#[test]
fn test_nested_array_of_objects() {
    let json = "[{\"a\":1},{\"b\":2},{\"c\":3}]";
    let val = parse_json(json).unwrap();

    if let JsonValue::Array(arr) = val {
        assert_eq!(arr.len(), 3);
    }
}

#[test]
fn test_invalid_json_extra_characters() {
    assert!(!validate_json("{\"a\":1} x"));
}

#[test]
fn test_invalid_json_missing_comma_between_pairs() {
    assert!(!validate_json("{\"a\":1 \"b\":2}"));
}