captchaforge 0.2.36

[DO NOT USE — UNDER ACTIVE DEVELOPMENT, NOT PRODUCTION-READY] Captcha solver scaffolding for chromiumoxide-driven browsers. The architecture is in place (vendor solvers, retry-loop iframe walking, VLM provider abstraction, real-WAF bench harness) but the live-vendor success rate is still 0% — Cloudflare Turnstile / hCaptcha / reCAPTCHA detect us at a TLS / CDP fingerprint layer that no flag-based stealth has cleared. Watch the repo; do not depend on this for any real workload.
Documentation
//! Property-based tests for the frame piercing module.

use proptest::prelude::*;
use proptest::test_runner::TestRunner;

#[test]
fn selector_escaping_balanced_quotes() {
    let mut runner = TestRunner::default();
    runner
        .run(
            &"[a-zA-Z0-9_#.:>+~ \\[\\]\\(\\)=\\'@-]{1,128}",
            |selector| {
                let escaped = selector.replace('"', "\\\"");
                let js = format!(r#"document.querySelector("{}")"#, escaped);
                let quote_count = js.matches('"').count();
                prop_assert_eq!(quote_count % 2, 0, "unbalanced quotes in: {}", js);
                Ok(())
            },
        )
        .unwrap();
}

#[test]
fn token_name_escaping_handles_special_chars() {
    let mut runner = TestRunner::default();
    runner
        .run(&"[a-zA-Z0-9_-]{1,64}", |token_name| {
            let escaped = token_name.replace('"', "\\\"").replace('\'', "\\'");
            prop_assert!(!escaped.contains('"') || escaped.contains("\\\""));
            Ok(())
        })
        .unwrap();
}

#[test]
fn empty_selector_produces_valid_js() {
    let selector = "";
    let escaped = selector.replace('"', "\\\"");
    let js = format!(r#"document.querySelector("{}")"#, escaped);
    assert!(js.contains("\"\""));
}