{
 "rp": "0.2",
 "note": "Profile validation vectors (SPEC §8). Each profile is either accepted or rejected by Profile.from_dict / RP.profile.",
 "base": {
  "id": "p",
  "default_level": 3,
  "locales": [
   "en"
  ],
  "retention": [
   {
    "until": "P3D",
    "max_level": 5
   }
  ]
 },
 "cases": [
  {
   "name": "the base profile is valid",
   "patch": {},
   "valid": true
  },
  {
   "name": "required fields have no defaults",
   "patch": {
    "id": null
   },
   "valid": false
  },
  {
   "name": "levels are integers",
   "patch": {
    "default_level": 2.5
   },
   "valid": false
  },
  {
   "name": "default ≤ max_default ≤ max_voice",
   "patch": {
    "default_level": 4,
    "max_default_level": 3
   },
   "valid": false
  },
  {
   "name": "objection window must be positive",
   "patch": {
    "objection_window": 0
   },
   "valid": false
  },
  {
   "name": "session gap must outlast the objection window",
   "patch": {
    "objection_window": "PT10M",
    "session_gap": "PT5M"
   },
   "valid": false
  },
  {
   "name": "unknown bare extension names are rejected",
   "patch": {
    "extensions": [
     "foo"
    ]
   },
   "valid": false
  },
  {
   "name": "URI or reverse-domain extensions are accepted",
   "patch": {
    "extensions": [
     "org.example.foo"
    ]
   },
   "valid": true
  },
  {
   "name": "retention levels decrease",
   "patch": {
    "retention": [
     {
      "until": "P3D",
      "max_level": 2
     },
     {
      "until": "P30D",
      "max_level": 3
     }
    ]
   },
   "valid": false
  },
  {
   "name": "retention max_level is a level",
   "patch": {
    "retention": [
     {
      "until": "P3D",
      "max_level": -1
     }
    ]
   },
   "valid": false
  },
  {
   "name": "attribution threshold is in 0–1",
   "patch": {
    "attribution_threshold": 1.5
   },
   "valid": false
  },
  {
   "name": "room_raise is invocation or disabled",
   "patch": {
    "room_raise": "always"
   },
   "valid": false
  }
 ]
}