icydb-model 0.299.0

IcyDB application-model authoring, validation, and code generation
Documentation
use super::*;

struct TestCtx {
    issues: crate::visitor::VisitorIssues,
}

impl TestCtx {
    fn new() -> Self {
        Self {
            issues: crate::visitor::VisitorIssues::new(),
        }
    }
}

impl crate::visitor::VisitorContext for TestCtx {
    fn add_issue(&mut self, issue: crate::visitor::Issue) {
        self.issues.push(String::new(), issue);
    }

    fn add_issue_at(&mut self, _: crate::visitor::PathSegment, issue: crate::visitor::Issue) {
        self.add_issue(issue);
    }
}

#[test]
fn equal_reports_mismatch() {
    let v = Equal::new(3);
    let mut ctx = TestCtx::new();

    v.validate("abcd", &mut ctx);

    assert_eq!(
        ctx.issues.get("").expect("root issue should exist")[0].message(),
        "length (4) is not equal to 3"
    );
}

#[test]
fn range_accepts_in_bounds() {
    let v = Range::new(2, 4);
    let mut ctx = TestCtx::new();

    v.validate("abc", &mut ctx);

    assert!(ctx.issues.is_empty());
}

#[test]
fn text_length_counts_unicode_scalar_values_not_utf8_bytes() {
    let one_scalar_four_bytes = "\u{1F525}";

    let equal_one = Equal::new(1);
    let min_two = Min::new(2);
    let max_one = Max::new(1);
    let mut equal_ctx = TestCtx::new();
    let mut min_ctx = TestCtx::new();
    let mut max_ctx = TestCtx::new();

    equal_one.validate(one_scalar_four_bytes, &mut equal_ctx);
    min_two.validate(one_scalar_four_bytes, &mut min_ctx);
    max_one.validate(one_scalar_four_bytes, &mut max_ctx);

    assert!(equal_ctx.issues.is_empty());
    assert_eq!(
        min_ctx.issues.get("").expect("root issue should exist")[0].message(),
        "length (1) is lower than minimum of 2"
    );
    assert!(max_ctx.issues.is_empty());
}

#[test]
fn range_reports_out_of_bounds() {
    let v = Range::new(2, 4);
    let mut ctx = TestCtx::new();

    v.validate("a", &mut ctx);

    assert_eq!(
        ctx.issues.get("").expect("root issue should exist")[0].message(),
        "length (1) must be between 2 and 4 (inclusive)"
    );
}