///|
test "evaluate a compiled access rule" (bench : @bench.T) {
  let program = compile(
    "user.age >= 18 && user.country in [\"CN\", \"SG\"] && contains(user.roles, \"owner\") && user.active",
  ).unwrap()
  let input : Json = {
    "user": {
      "age": 24,
      "country": "CN",
      "roles": ["editor", "owner"],
      "active": true,
    },
  }
  bench.bench(fn() { bench.keep(evaluate(program, input)) })
}

///|
test "evaluate a six-rule API policy" (bench : @bench.T) {
  let rules = RuleSet::compile([
    RuleDefinition::new("id", "is_uuid(request?.id)", "id"),
    RuleDefinition::new("email", "is_email(request?.email)", "email"),
    RuleDefinition::new("date", "is_date(request?.date)", "date"),
    RuleDefinition::new("ip", "is_ipv4(request?.ip)", "ip"),
    RuleDefinition::new("version", "is_semver(request?.version)", "version"),
    RuleDefinition::new("active", "request?.active == true", "active"),
  ]).unwrap()
  let input : Json = {
    "request": {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "email": "dev@example.com",
      "date": "2026-07-27",
      "ip": "192.168.1.20",
      "version": "1.2.3",
      "active": true,
    },
  }
  bench.bench(fn() { bench.keep(rules.evaluate(input)) })
}

///|
test "run four regression cases against two rules" (bench : @bench.T) {
  let rules = RuleSet::compile([
    RuleDefinition::new("adult", "user?.age >= 18", "adult"),
    RuleDefinition::new(
      "email", "is_email(coalesce(user?.email, \"\"))", "email",
    ),
  ]).unwrap()
  let suite = RuleTestSuite::new([
    RuleTestCase::new(
      "valid",
      { "user": { "age": 24, "email": "dev@example.com" } },
      true,
    ),
    RuleTestCase::new(
      "minor",
      { "user": { "age": 12, "email": "dev@example.com" } },
      false,
      expected_failed_rules=["adult"],
    ),
    RuleTestCase::new(
      "bad email",
      { "user": { "age": 24, "email": "bad" } },
      false,
      expected_failed_rules=["email"],
    ),
    RuleTestCase::new(
      "both invalid",
      { "user": { "age": 12, "email": "bad" } },
      false,
      expected_failed_rules=["adult", "email"],
    ),
  ]).unwrap()
  bench.bench(fn() { bench.keep(rules.run_test_suite(suite)) })
}