librsvg 2.62.2

A library to render SVG images to Cairo surfaces. GNOME uses this to render SVG icons. Outside of GNOME, other desktop environments use it for similar purposes. Wikimedia uses it for Wikipedia's SVG diagrams.
Documentation
//! Tests for loading errors.
//!
//! Note that all the tests in this module are `#[ignore]`.  This is because they
//! take a much longer time to run than normal tests, as they depend upon actually
//! hitting the limits in librsvg for the number of loaded elements, or the number
//! of referenced elements during rendering.
//!
//! There is a *big* difference in the run-time of these tests when compiled with
//! `--release` versus `--debug`.  So, we will only run them in release-mode tests.

#![cfg(test)]

use rsvg::{CairoRenderer, ImplementationLimit, Loader, LoadingError, RenderingError};

#[ignore]
#[test]
fn too_many_elements() {
    let name = "tests/fixtures/errors/bug515-too-many-elements.svgz";

    assert!(matches!(
        Loader::new().read_path(name),
        Err(LoadingError::LimitExceeded(
            ImplementationLimit::TooManyLoadedElements
        ))
    ));
}

fn rendering_instancing_limit(name: &str) {
    let handle = Loader::new()
        .read_path(name)
        .unwrap_or_else(|e| panic!("could not load: {}", e));

    let surface = cairo::ImageSurface::create(cairo::Format::ARgb32, 500, 500).unwrap();
    let cr = cairo::Context::new(&surface).expect("Failed to create a cairo context");

    // Note that at least 515-patttern-billion-laughs.svg requires a viewport of this size
    // or bigger; a smaller one causes the recursive patterns to get so small that they
    // are culled out, and so the document doesn't reach the instancing limit.
    match CairoRenderer::new(&handle)
        .render_document(&cr, &cairo::Rectangle::new(0.0, 0.0, 500.0, 500.0))
    {
        Ok(_) => (),
        Err(RenderingError::LimitExceeded(ImplementationLimit::TooManyReferencedElements)) => (),
        _ => panic!("unexpected error code"),
    }
}

#[ignore]
#[test]
fn instancing_limit1() {
    rendering_instancing_limit("tests/fixtures/errors/bug323-nested-use.svg");
}

#[ignore]
#[test]
fn instancing_limit2() {
    rendering_instancing_limit("tests/fixtures/errors/bug515-pattern-billion-laughs.svg");
}