{
  "title": "Test Result Common Schema",
  "type": "object",
  "definitions": {
    "code78Present": {
      "description": "Indicate presence of code 78 (automatic) on candidates license",
      "type": "boolean"
    },
    "schoolCar": {
      "description": "Indicates whether the vehicle belongs to a driving school",
      "type": "boolean"
    },
    "dualControls": {
      "description": "Indicates whether or not the vehicle has dual controls fitted",
      "type": "boolean"
    },
    "userExitedApp": {
      "description": "User disabled ASAM and exited the app",
      "type": "object",
      "properties": {
        "exitReason": {
          "description": "Reason why the user has exited the app",
          "type": "string"
        },
        "exitFlag": {
          "description": "Flag to indicate if the user has exited the app",
          "type": "boolean"
        }
      },
      "additionalProperties": false,
      "required": [
        "exitFlag"
      ]
    },
    "testData": {
      "additionalProperties": false,
      "description": "Data associated with the test",
      "properties": {
        "drivingFaults": {
          "$ref": "#/definitions/drivingFaults"
        },
        "seriousFaults": {
          "$ref": "#/definitions/seriousFaults"
        },
        "dangerousFaults": {
          "$ref": "#/definitions/dangerousFaults"
        },
        "eco": {
          "$ref": "#/definitions/eco"
        },
        "ETA": {
          "$ref": "#/definitions/ETA"
        },
        "testRequirements": {
          "$ref": "#/definitions/testRequirements"
        }
      },
      "type": "object"
    },
    "manoeuvre": {
      "additionalProperties": false,
      "description": "Data needs capturing for a manoeuvre competency",
      "properties": {
        "controlFault": {
          "$ref": "#/definitions/manoeuvreOutcome"
        },
        "controlFaultComments": {
          "$ref": "#/definitions/faultComments"
        },
        "observationFault": {
          "$ref": "#/definitions/manoeuvreOutcome"
        },
        "observationFaultComments": {
          "$ref": "#/definitions/faultComments"
        },
        "selected": {
          "$ref": "#/definitions/manoeuvreIndicator"
        }
      },
      "type": "object"
    },
    "manoeuvreOutcome": {
      "description": "The possible outcomes of any manoeuvre performed during the test",
      "enum": [
        "DF",
        "S",
        "D"
      ],
      "type": "string"
    },
    "examiner": {
      "description": "The examiner details",
      "type": "object",
      "properties": {
        "staffNumber": {
          "description": "The examiner's DSA staff number",
          "type": "string",
          "maxLength": 10
        },
        "individualId": {
          "description": "The individual ID of the examiner",
          "type": "number"
        }
      },
      "additionalProperties": false,
      "required": [
        "staffNumber"
      ]
    },
    "testCentre": {
      "description": "Details of the test centre",
      "type": "object",
      "properties": {
        "centreId": {
          "description": "Identifer for the test centre",
          "type": "integer"
        },
        "costCode": {
          "description": "Cost centre code for the test centre",
          "type": "string",
          "maxLength": 6
        },
        "centreName": {
          "description": "Name of the test centre",
          "type": "string",
          "maxLength": 50
        }
      },
      "additionalProperties": false,
      "required": [
        "centreId",
        "costCode"
      ]
    },
    "name": {
      "description": "Details of the individual's name",
      "type": "object",
      "properties": {
        "title": {
          "description": "The individual's title",
          "type": "string",
          "maxLength": 7
        },
        "firstName": {
          "description": "The individual's forename",
          "type": "string",
          "maxLength": 50
        },
        "secondName": {
          "description": "The individual's second name",
          "type": "string",
          "maxLength": 50
        },
        "thirdName": {
          "description": "The individual's third name",
          "type": "string",
          "maxLength": 50
        },
        "lastName": {
          "description": "The individual's surname",
          "type": "string",
          "maxLength": 50
        }
      },
      "additionalProperties": false
    },
    "address": {
      "description": "Details of the address",
      "type": "object",
      "properties": {
        "addressLine1": {
          "description": "First line of address",
          "type": "string",
          "maxLength": 255
        },
        "addressLine2": {
          "description": "Second line of address",
          "type": "string",
          "maxLength": 100
        },
        "addressLine3": {
          "description": "Third line of address",
          "type": "string",
          "maxLength": 100
        },
        "addressLine4": {
          "description": "Fourth line of address",
          "type": "string",
          "maxLength": 100
        },
        "addressLine5": {
          "description": "Fifth line of address",
          "type": "string",
          "maxLength": 255
        },
        "postcode": {
          "description": "The address postcode",
          "type": "string",
          "maxLength": 255
        }
      },
      "additionalProperties": false
    },
    "candidate": {
      "description": "Details of the candidate booked into the test slot",
      "type": "object",
      "properties": {
        "candidateId": {
          "description": "The id of the test candidate",
          "type": "integer"
        },
        "candidateName": {
          "$ref": "#/definitions/name"
        },
        "driverNumber": {
          "description": "The candidate's driver number, typically (though not always) 16 characters if UK, or 8 digits if NI",
          "type": "string",
          "maxLength": 24
        },
        "dateOfBirth": {
          "description": "The candidate's date of birth, formatted as an ISO 8601 date (YYYY-MM-DD)",
          "type": "string",
          "minLength": 10,
          "maxLength": 10
        },
        "gender": {
          "$ref": "#/definitions/gender"
        },
        "candidateAddress": {
          "$ref": "#/definitions/address"
        },
        "primaryTelephone": {
          "description": "The candidate's primary telephone number, if any (and consent to leave voicemail has been given)",
          "type": "string",
          "maxLength": 20
        },
        "secondaryTelephone": {
          "description": "The candidate's secondary telephone number, if any (and consent to leave voicemail has been given)",
          "type": "string",
          "maxLength": 20
        },
        "mobileTelephone": {
          "description": "The candidate's mobile telephone number, if any (and consent to leave voicemail has been given)",
          "type": "string",
          "maxLength": 30
        },
        "emailAddress": {
          "description": "The candidate's email address, if any",
          "type": "string",
          "maxLength": 100
        },
        "prn": {
          "description": "The candidate's ADI PRN (potential register number), if an ADI test",
          "type": "integer"
        },
        "previousADITests": {
          "description": "The number of previous test attempts, if an ADI test",
          "type": "integer"
        },
        "ethnicityCode": {
          "description": "A character between A and G representing different categories of ethnicity",
          "type": "string",
          "minLength": 1,
          "maxLength": 1
        }
      },
      "additionalProperties": false
    },
    "applicationReference": {
      "description": "The full application identifier, including applicationId, bookingSequence and checkDigit",
      "type": "object",
      "properties": {
        "applicationId": {
          "description": "Unique identifier for each test application",
          "type": "integer"
        },
        "bookingSequence": {
          "description": "Booking sequence number of the test application",
          "type": "integer"
        },
        "checkDigit": {
          "description": "Reference checksum for the test application",
          "type": "integer"
        }
      },
      "additionalProperties": false,
      "required": [
        "applicationId",
        "bookingSequence",
        "checkDigit"
      ]
    },
    "initiator": {
      "description": "The reason for the previous test cancellation",
      "type": "string",
      "enum": [
        "Act of nature",
        "DSA"
      ],
      "maxLength": 15
    },
    "testSlotAttributes": {
      "description": "The additional attributes of the test slot such as Slot Id, Category, Start Time, etc.",
      "type": "object",
      "properties": {
        "slotId": {
          "description": "Unique identifier for the journal test slot",
          "type": "integer"
        },
        "start": {
          "description": "Start time of the test slot",
          "type": "string",
          "minLength": 19,
          "maxLength": 19
        },
        "vehicleTypeCode": {
          "description": "A short alpha (and sometimes numeric) code describing the vehicle type in vehicle slot type",
          "type": "string",
          "minLength": 1,
          "maxLength": 2
        },
        "welshTest": {
          "description": "Whether the test is to be conducted using the welsh language",
          "type": "boolean"
        },
        "specialNeedsCode": {
          "description": "Special needs code",
          "type": "string",
          "enum": [
            "NONE",
            "YES",
            "EXTRA"
          ]
        },
        "specialNeeds": {
          "description": "Whether the candidate has any special needs that require the D255 form to be completed",
          "type": "boolean"
        },
        "specialNeedsArray": {
          "description": "The special needs",
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "specialNeedsExtendedTest": {
          "description": "Whether the candidate requires an extended test due to special needs",
          "type": "boolean"
        },
        "extendedTest": {
          "description": "Whether this is an extended test",
          "type": "boolean"
        },
        "examinerVisiting": {
          "description": "Whether the examiner conducting the test slot is visiting a test centre that's not their home test centre",
          "type": "boolean"
        },
        "entitlementCheck": {
          "description": "Indicates whether the examiner needs to check the candidates entitlement evidence(e.g. test application has not been checked with DVLA)",
          "type": "boolean"
        },
        "fitMarker": {
          "description": "Indicates whether the candidate has previously had a fraud marker set against them",
          "type": "boolean"
        },
        "fitCaseNumber": {
          "description": "The integrity case number associated to the candidate",
          "type": "string"
        },
        "categoryEntitlementCheck": {
          "description": "Indicates whether the examiner needs to check the candidates entitlement based on new legislation around booking vocational categories",
          "type": "boolean"
        },
        "previousCancellation": {
          "description": "The details of any previous test cancellations",
          "type": "array",
          "items": {
            "$ref": "#/definitions/initiator"
          }
        },
        "slotType": {
          "description": "A description of the types of test intended to be conducted in this slot (e.g. Standard Test / Extended Special Needs Test)",
          "type": "string"
        }
      },
      "additionalProperties": false,
      "required": [
        "slotId",
        "start",
        "vehicleTypeCode",
        "welshTest",
        "specialNeeds",
        "extendedTest"
      ]
    },
    "journalData": {
      "description": "Data brought through from the journal",
      "type": "object",
      "properties": {
        "examiner": {
          "$ref": "#/definitions/examiner"
        },
        "testCentre": {
          "$ref": "#/definitions/testCentre"
        },
        "testSlotAttributes": {
          "$ref": "#/definitions/testSlotAttributes"
        },
        "candidate": {
          "$ref": "#/definitions/candidate"
        },
        "applicationReference": {
          "$ref": "#/definitions/applicationReference"
        }
      },
      "additionalProperties": false,
      "required": [
        "examiner",
        "testCentre",
        "testSlotAttributes",
        "candidate",
        "applicationReference"
      ]
    },
    "eyesightTest": {
      "type": "object",
      "properties": {
        "complete": {
          "type": "boolean"
        },
        "seriousFault": {
          "description": "Whether the candidate has failed the eyesight test",
          "type": "boolean"
        },
        "faultComments": {
          "$ref": "#/definitions/faultComments"
        }
      },
      "additionalProperties": false
    },
    "signature": {
      "description": "Base 64 encoded binary data representing a PNG image of the candidates signature",
      "type": "string"
    },
    "communicationMethod": {
      "description": "The method of communication by which the candidate agrees to receive their results",
      "type": "string",
      "enum": [
        "Email",
        "Post",
        "Support Centre",
        "Not provided"
      ]
    },
    "conductedLanguage": {
      "description": "The language in which a candidate agrees to perform a test",
      "type": "string",
      "enum": [
        "English",
        "Cymraeg",
        "Not provided"
      ]
    },
    "communicationPreferences": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "updatedEmail": {
          "description": "The email address that the candidate agrees their results can be sent to",
          "type": "string",
          "maxLength": 100
        },
        "communicationMethod": {
          "$ref": "#/definitions/communicationMethod"
        },
        "conductedLanguage": {
          "$ref": "#/definitions/conductedLanguage"
        }
      },
      "required": [
        "conductedLanguage"
      ]
    },
    "preTestDeclarations": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "insuranceDeclarationAccepted": {
          "description": "Whether or not the candidate has declared that their test vehicle has a valid insurance policy",
          "type": "boolean"
        },
        "residencyDeclarationAccepted": {
          "description": "Whether or not the candidate has declared that they have lived in the UK for a period acceptable for taking the test",
          "type": "boolean"
        },
        "preTestSignature": {
          "$ref": "#/definitions/signature"
        },
        "candidateDeclarationSigned": {
          "description": "Whether or not the candidate signature had been recorded for delegated tests",
          "type": "boolean"
        }
      },
      "required": [
        "insuranceDeclarationAccepted",
        "residencyDeclarationAccepted",
        "preTestSignature"
      ]
    },
    "accompaniment": {
      "description": "Indicators for anybody else overseeing the test",
      "type": "object",
      "properties": {
        "ADI": {
          "description": "Indicates whether the ADI was present during the test",
          "type": "boolean"
        },
        "supervisor": {
          "description": "Indicates whether a DVSA supervisor was present during the test",
          "type": "boolean"
        },
        "interpreter": {
          "description": "Indicates whether an interpreter was present during the test",
          "type": "boolean"
        },
        "other": {
          "description": "Indicates whether another individual was present during the test",
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "gearboxCategory": {
      "description": "The type of gearbox",
      "type": "string",
      "enum": [
        "Manual",
        "Automatic"
      ]
    },
    "questionCode": {
      "description": "Code representing the question that was asked",
      "type": "string"
    },
    "questionDescription": {
      "description": "Description of the question that was asked",
      "type": "string"
    },
    "questionOutcome": {
      "description": "Outcome of the question that was asked",
      "type": "string",
      "enum": [
        "P",
        "DF",
        "S",
        "D"
      ]
    },
    "questionResult": {
      "description": "Result of a vehicle checks question",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "code": {
          "$ref": "#/definitions/questionCode"
        },
        "description": {
          "$ref": "#/definitions/questionDescription"
        },
        "outcome": {
          "$ref": "#/definitions/questionOutcome"
        }
      }
    },
    "safetyQuestionResult": {
      "description": "Result of a safety question",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "description": {
          "$ref": "#/definitions/questionDescription"
        },
        "outcome": {
          "$ref": "#/definitions/questionOutcome"
        }
      }
    },
    "manoeuvreIndicator": {
      "description": "Indicator for a manoeuvre being performed during the test",
      "type": "boolean"
    },
    "drivingFaultCount": {
      "description": "The count of the number of driving faults recorded against a test element",
      "type": "integer"
    },
    "faultComments": {
      "description": "Comments recorded against a fault",
      "type": "string",
      "maxLength": 1000
    },
    "drivingFaults": {
      "description": "The driving faults accumulated during the test",
      "type": "object",
      "properties": {
        "controlsAccelerator": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "controlsAcceleratorComments": {
          "$ref": "#/definitions/faultComments"
        },
        "controlsClutch": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "controlsClutchComments": {
          "$ref": "#/definitions/faultComments"
        },
        "controlsGears": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "controlsGearsComments": {
          "$ref": "#/definitions/faultComments"
        },
        "controlsFootbrake": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "controlsFootbrakeComments": {
          "$ref": "#/definitions/faultComments"
        },
        "controlsParkingBrake": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "controlsParkingBrakeComments": {
          "$ref": "#/definitions/faultComments"
        },
        "controlsSteering": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "controlsSteeringComments": {
          "$ref": "#/definitions/faultComments"
        },
        "precautions": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "precautionsComments": {
          "$ref": "#/definitions/faultComments"
        },
        "ancillaryControls": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "ancillaryControlsComments": {
          "$ref": "#/definitions/faultComments"
        },
        "moveOffSafety": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "moveOffSafetyComments": {
          "$ref": "#/definitions/faultComments"
        },
        "moveOffControl": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "moveOffControlComments": {
          "$ref": "#/definitions/faultComments"
        },
        "useOfMirrorsSignalling": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "useOfMirrorsSignallingComments": {
          "$ref": "#/definitions/faultComments"
        },
        "useOfMirrorsChangeDirection": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "useOfMirrorsChangeDirectionComments": {
          "$ref": "#/definitions/faultComments"
        },
        "useOfMirrorsChangeSpeed": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "useOfMirrorsChangeSpeedComments": {
          "$ref": "#/definitions/faultComments"
        },
        "signalsNecessary": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "signalsNecessaryComments": {
          "$ref": "#/definitions/faultComments"
        },
        "signalsCorrectly": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "signalsCorrectlyComments": {
          "$ref": "#/definitions/faultComments"
        },
        "signalsTimed": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "signalsTimedComments": {
          "$ref": "#/definitions/faultComments"
        },
        "junctionsApproachSpeed": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "junctionsApproachSpeedComments": {
          "$ref": "#/definitions/faultComments"
        },
        "junctionsObservation": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "junctionsObservationComments": {
          "$ref": "#/definitions/faultComments"
        },
        "junctionsTurningRight": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "junctionsTurningRightComments": {
          "$ref": "#/definitions/faultComments"
        },
        "junctionsTurningLeft": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "junctionsTurningLeftComments": {
          "$ref": "#/definitions/faultComments"
        },
        "junctionsCuttingCorners": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "junctionsCuttingCornersComments": {
          "$ref": "#/definitions/faultComments"
        },
        "judgementOvertaking": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "judgementOvertakingComments": {
          "$ref": "#/definitions/faultComments"
        },
        "judgementMeeting": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "judgementMeetingComments": {
          "$ref": "#/definitions/faultComments"
        },
        "judgementCrossing": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "judgementCrossingComments": {
          "$ref": "#/definitions/faultComments"
        },
        "positioningNormalDriving": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "positioningNormalDrivingComments": {
          "$ref": "#/definitions/faultComments"
        },
        "positioningLaneDiscipline": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "positioningLaneDisciplineComments": {
          "$ref": "#/definitions/faultComments"
        },
        "clearance": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "clearanceComments": {
          "$ref": "#/definitions/faultComments"
        },
        "followingDistance": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "followingDistanceComments": {
          "$ref": "#/definitions/faultComments"
        },
        "useOfSpeed": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "useOfSpeedComments": {
          "$ref": "#/definitions/faultComments"
        },
        "progressAppropriateSpeed": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "progressAppropriateSpeedComments": {
          "$ref": "#/definitions/faultComments"
        },
        "progressUndueHesitation": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "progressUndueHesitationComments": {
          "$ref": "#/definitions/faultComments"
        },
        "responseToSignsTrafficSigns": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "responseToSignsTrafficSignsComments": {
          "$ref": "#/definitions/faultComments"
        },
        "responseToSignsRoadMarkings": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "responseToSignsRoadMarkingsComments": {
          "$ref": "#/definitions/faultComments"
        },
        "responseToSignsTrafficLights": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "responseToSignsTrafficLightsComments": {
          "$ref": "#/definitions/faultComments"
        },
        "responseToSignsTrafficControllers": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "responseToSignsTrafficControllersComments": {
          "$ref": "#/definitions/faultComments"
        },
        "responseToSignsOtherRoadUsers": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "responseToSignsOtherRoadUsersComments": {
          "$ref": "#/definitions/faultComments"
        },
        "pedestrianCrossings": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "pedestrianCrossingsComments": {
          "$ref": "#/definitions/faultComments"
        },
        "positionNormalStops": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "positionNormalStopsComments": {
          "$ref": "#/definitions/faultComments"
        },
        "awarenessPlanning": {
          "$ref": "#/definitions/drivingFaultCount"
        },
        "awarenessPlanningComments": {
          "$ref": "#/definitions/faultComments"
        }
      },
      "additionalProperties": false
    },
    "seriousFaultIndicator": {
      "description": "Indicator for a serious fault being recorded against a test element",
      "type": "boolean"
    },
    "seriousFaults": {
      "description": "The serious faults accumulated during the test",
      "type": "object",
      "properties": {
        "controlsAccelerator": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "controlsAcceleratorComments": {
          "$ref": "#/definitions/faultComments"
        },
        "controlsClutch": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "controlsClutchComments": {
          "$ref": "#/definitions/faultComments"
        },
        "controlsGears": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "controlsGearsComments": {
          "$ref": "#/definitions/faultComments"
        },
        "controlsFootbrake": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "controlsFootbrakeComments": {
          "$ref": "#/definitions/faultComments"
        },
        "controlsParkingBrake": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "controlsParkingBrakeComments": {
          "$ref": "#/definitions/faultComments"
        },
        "controlsSteering": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "controlsSteeringComments": {
          "$ref": "#/definitions/faultComments"
        },
        "precautions": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "precautionsComments": {
          "$ref": "#/definitions/faultComments"
        },
        "ancillaryControls": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "ancillaryControlsComments": {
          "$ref": "#/definitions/faultComments"
        },
        "moveOffSafety": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "moveOffSafetyComments": {
          "$ref": "#/definitions/faultComments"
        },
        "moveOffControl": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "moveOffControlComments": {
          "$ref": "#/definitions/faultComments"
        },
        "useOfMirrorsSignalling": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "useOfMirrorsSignallingComments": {
          "$ref": "#/definitions/faultComments"
        },
        "useOfMirrorsChangeDirection": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "useOfMirrorsChangeDirectionComments": {
          "$ref": "#/definitions/faultComments"
        },
        "useOfMirrorsChangeSpeed": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "useOfMirrorsChangeSpeedComments": {
          "$ref": "#/definitions/faultComments"
        },
        "signalsNecessary": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "signalsNecessaryComments": {
          "$ref": "#/definitions/faultComments"
        },
        "signalsCorrectly": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "signalsCorrectlyComments": {
          "$ref": "#/definitions/faultComments"
        },
        "signalsTimed": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "signalsTimedComments": {
          "$ref": "#/definitions/faultComments"
        },
        "junctionsApproachSpeed": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "junctionsApproachSpeedComments": {
          "$ref": "#/definitions/faultComments"
        },
        "junctionsObservation": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "junctionsObservationComments": {
          "$ref": "#/definitions/faultComments"
        },
        "junctionsTurningRight": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "junctionsTurningRightComments": {
          "$ref": "#/definitions/faultComments"
        },
        "junctionsTurningLeft": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "junctionsTurningLeftComments": {
          "$ref": "#/definitions/faultComments"
        },
        "junctionsCuttingCorners": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "junctionsCuttingCornersComments": {
          "$ref": "#/definitions/faultComments"
        },
        "judgementOvertaking": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "judgementOvertakingComments": {
          "$ref": "#/definitions/faultComments"
        },
        "judgementMeeting": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "judgementMeetingComments": {
          "$ref": "#/definitions/faultComments"
        },
        "judgementCrossing": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "judgementCrossingComments": {
          "$ref": "#/definitions/faultComments"
        },
        "positioningNormalDriving": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "positioningNormalDrivingComments": {
          "$ref": "#/definitions/faultComments"
        },
        "positioningLaneDiscipline": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "positioningLaneDisciplineComments": {
          "$ref": "#/definitions/faultComments"
        },
        "clearance": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "clearanceComments": {
          "$ref": "#/definitions/faultComments"
        },
        "followingDistance": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "followingDistanceComments": {
          "$ref": "#/definitions/faultComments"
        },
        "useOfSpeed": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "useOfSpeedComments": {
          "$ref": "#/definitions/faultComments"
        },
        "progressAppropriateSpeed": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "progressAppropriateSpeedComments": {
          "$ref": "#/definitions/faultComments"
        },
        "progressUndueHesitation": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "progressUndueHesitationComments": {
          "$ref": "#/definitions/faultComments"
        },
        "responseToSignsTrafficSigns": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "responseToSignsTrafficSignsComments": {
          "$ref": "#/definitions/faultComments"
        },
        "responseToSignsRoadMarkings": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "responseToSignsRoadMarkingsComments": {
          "$ref": "#/definitions/faultComments"
        },
        "responseToSignsTrafficLights": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "responseToSignsTrafficLightsComments": {
          "$ref": "#/definitions/faultComments"
        },
        "responseToSignsTrafficControllers": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "responseToSignsTrafficControllersComments": {
          "$ref": "#/definitions/faultComments"
        },
        "responseToSignsOtherRoadUsers": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "responseToSignsOtherRoadUsersComments": {
          "$ref": "#/definitions/faultComments"
        },
        "pedestrianCrossings": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "pedestrianCrossingsComments": {
          "$ref": "#/definitions/faultComments"
        },
        "positionNormalStops": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "positionNormalStopsComments": {
          "$ref": "#/definitions/faultComments"
        },
        "awarenessPlanning": {
          "$ref": "#/definitions/seriousFaultIndicator"
        },
        "awarenessPlanningComments": {
          "$ref": "#/definitions/faultComments"
        }
      },
      "additionalProperties": false
    },
    "dangerousFaultIndicator": {
      "description": "Indicator for a dangerous fault being recorded against a test element",
      "type": "boolean"
    },
    "dangerousFaults": {
      "description": "The dangerous faults accumulated during the test",
      "type": "object",
      "properties": {
        "controlsAccelerator": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "controlsAcceleratorComments": {
          "$ref": "#/definitions/faultComments"
        },
        "controlsClutch": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "controlsClutchComments": {
          "$ref": "#/definitions/faultComments"
        },
        "controlsGears": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "controlsGearsComments": {
          "$ref": "#/definitions/faultComments"
        },
        "controlsFootbrake": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "controlsFootbrakeComments": {
          "$ref": "#/definitions/faultComments"
        },
        "controlsParkingBrake": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "controlsParkingBrakeComments": {
          "$ref": "#/definitions/faultComments"
        },
        "controlsSteering": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "controlsSteeringComments": {
          "$ref": "#/definitions/faultComments"
        },
        "precautions": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "precautionsComments": {
          "$ref": "#/definitions/faultComments"
        },
        "ancillaryControls": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "ancillaryControlsComments": {
          "$ref": "#/definitions/faultComments"
        },
        "moveOffSafety": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "moveOffSafetyComments": {
          "$ref": "#/definitions/faultComments"
        },
        "moveOffControl": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "moveOffControlComments": {
          "$ref": "#/definitions/faultComments"
        },
        "useOfMirrorsSignalling": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "useOfMirrorsSignallingComments": {
          "$ref": "#/definitions/faultComments"
        },
        "useOfMirrorsChangeDirection": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "useOfMirrorsChangeDirectionComments": {
          "$ref": "#/definitions/faultComments"
        },
        "useOfMirrorsChangeSpeed": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "useOfMirrorsChangeSpeedComments": {
          "$ref": "#/definitions/faultComments"
        },
        "signalsNecessary": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "signalsNecessaryComments": {
          "$ref": "#/definitions/faultComments"
        },
        "signalsCorrectly": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "signalsCorrectlyComments": {
          "$ref": "#/definitions/faultComments"
        },
        "signalsTimed": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "signalsTimedComments": {
          "$ref": "#/definitions/faultComments"
        },
        "junctionsApproachSpeed": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "junctionsApproachSpeedComments": {
          "$ref": "#/definitions/faultComments"
        },
        "junctionsObservation": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "junctionsObservationComments": {
          "$ref": "#/definitions/faultComments"
        },
        "junctionsTurningRight": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "junctionsTurningRightComments": {
          "$ref": "#/definitions/faultComments"
        },
        "junctionsTurningLeft": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "junctionsTurningLeftComments": {
          "$ref": "#/definitions/faultComments"
        },
        "junctionsCuttingCorners": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "junctionsCuttingCornersComments": {
          "$ref": "#/definitions/faultComments"
        },
        "judgementOvertaking": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "judgementOvertakingComments": {
          "$ref": "#/definitions/faultComments"
        },
        "judgementMeeting": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "judgementMeetingComments": {
          "$ref": "#/definitions/faultComments"
        },
        "judgementCrossing": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "judgementCrossingComments": {
          "$ref": "#/definitions/faultComments"
        },
        "positioningNormalDriving": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "positioningNormalDrivingComments": {
          "$ref": "#/definitions/faultComments"
        },
        "positioningLaneDiscipline": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "positioningLaneDisciplineComments": {
          "$ref": "#/definitions/faultComments"
        },
        "clearance": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "clearanceComments": {
          "$ref": "#/definitions/faultComments"
        },
        "followingDistance": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "followingDistanceComments": {
          "$ref": "#/definitions/faultComments"
        },
        "useOfSpeed": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "useOfSpeedComments": {
          "$ref": "#/definitions/faultComments"
        },
        "progressAppropriateSpeed": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "progressAppropriateSpeedComments": {
          "$ref": "#/definitions/faultComments"
        },
        "progressUndueHesitation": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "progressUndueHesitationComments": {
          "$ref": "#/definitions/faultComments"
        },
        "responseToSignsTrafficSigns": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "responseToSignsTrafficSignsComments": {
          "$ref": "#/definitions/faultComments"
        },
        "responseToSignsRoadMarkings": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "responseToSignsRoadMarkingsComments": {
          "$ref": "#/definitions/faultComments"
        },
        "responseToSignsTrafficLights": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "responseToSignsTrafficLightsComments": {
          "$ref": "#/definitions/faultComments"
        },
        "responseToSignsTrafficControllers": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "responseToSignsTrafficControllersComments": {
          "$ref": "#/definitions/faultComments"
        },
        "responseToSignsOtherRoadUsers": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "responseToSignsOtherRoadUsersComments": {
          "$ref": "#/definitions/faultComments"
        },
        "pedestrianCrossings": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "pedestrianCrossingsComments": {
          "$ref": "#/definitions/faultComments"
        },
        "positionNormalStops": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "positionNormalStopsComments": {
          "$ref": "#/definitions/faultComments"
        },
        "awarenessPlanning": {
          "$ref": "#/definitions/dangerousFaultIndicator"
        },
        "awarenessPlanningComments": {
          "$ref": "#/definitions/faultComments"
        }
      },
      "additionalProperties": false
    },
    "eco": {
      "description": "Assessment of the eco friendly manner of driving",
      "type": "object",
      "properties": {
        "completed": {
          "description": "Indicates that the eco friendly manner of driving has been assessed",
          "type": "boolean"
        },
        "adviceGivenControl": {
          "description": "Indicates that advice was given on the Control aspect of eco driving",
          "type": "boolean"
        },
        "adviceGivenPlanning": {
          "description": "Indicates that advice was given on the Planning aspect of eco driving",
          "type": "boolean"
        },
        "ecoRelatedFault": {
          "description": "Fault that relates to the Eco selection",
          "type": "string"
        },
        "ecoCaptureReason": {
          "description": "Reason for Eco capture",
          "type": "string"
        },
        "fuelEfficientDriving": {
          "description": "Whether the candidate exemplified efficient driving",
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "ETA": {
      "description": "Indicates whether the examiner had to take physical or verbal action during the test",
      "type": "object",
      "properties": {
        "physical": {
          "description": "Indicates that the examiner had to take physical action",
          "type": "boolean"
        },
        "verbal": {
          "description": "Indicates that the examiner had to take verbal action",
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "postTestDeclarations": {
      "type": "object",
      "properties": {
        "healthDeclarationAccepted": {
          "description": "Whether or not the candidate has declared that their health status hasn't changed since their last application",
          "type": "boolean"
        },
        "passCertificateNumberReceived": {
          "description": "Indicates whether the candidate acknowledges receipt of the PCN",
          "type": "boolean"
        },
        "postTestSignature": {
          "$ref": "#/definitions/signature"
        }
      },
      "additionalProperties": false
    },
    "weatherConditions": {
      "description": "Predefined values for the type of weather encountered during the test",
      "type": "string",
      "enum": [
        "Bright / dry roads",
        "Bright / wet roads",
        "Raining through test",
        "Showers",
        "Foggy / misty",
        "Dull / wet roads",
        "Dull / dry roads",
        "Snowing",
        "Icy",
        "Windy"
      ]
    },
    "independentDriving": {
      "description": "Method chosen to conduct the independent driving section of the test",
      "type": "string",
      "enum": [
        "Sat nav",
        "Diagram",
        "Traffic signs",
        "N/A"
      ]
    },
    "identification": {
      "description": "Indicates which form of ID was provided by the candidate",
      "type": "string",
      "enum": [
        "Licence",
        "Passport"
      ]
    },
    "testSummary": {
      "description": "Recording of other characteristics of the test",
      "type": "object",
      "properties": {
        "routeNumber": {
          "description": "Number of the route that was taken during the test",
          "type": "integer"
        },
        "independentDriving": {
          "$ref": "#/definitions/independentDriving"
        },
        "trueLikenessToPhoto": {
          "description": "Physical appearance resembles a true likeness to provided ID",
          "type": "boolean"
        },
        "candidateDescription": {
          "description": "Physical description of the candidate",
          "type": "string",
          "maxLength": 1000
        },
        "debriefWitnessed": {
          "description": "Indicates whether anybody else (e.g. ADI) was present for the debrief",
          "type": "boolean"
        },
        "identification": {
          "$ref": "#/definitions/identification"
        },
        "weatherConditions": {
          "description": "Description of the type of weather encountered during the test",
          "type": "array",
          "items": {
            "$ref": "#/definitions/weatherConditions"
          }
        },
        "D255": {
          "description": "Indicates whether a D255 form needs to be completed",
          "type": "boolean"
        },
        "additionalInformation": {
          "description": "Any comments that the DE wants to record about the test",
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "categoryCode": {
      "description": "Category code for the test report",
      "type": "string",
      "enum": [
        "A",
        "A1",
        "A2",
        "ADI2",
        "ADI3",
        "AM",
        "B",
        "B1",
        "B+E",
        "C",
        "C1",
        "C1+E",
        "C1+EM",
        "C1M",
        "CCPC",
        "C+E",
        "C+EM",
        "CM",
        "D",
        "D1",
        "D1+E",
        "D1+EM",
        "D1M",
        "DCPC",
        "D+E",
        "D+EM",
        "DM",
        "EUA1M1",
        "EUA1M2",
        "EUA2M1",
        "EUA2M2",
        "EUAM1",
        "EUAM2",
        "EUAMM1",
        "EUAMM2",
        "F",
        "G",
        "H",
        "K",
        "SC"
      ]
    },
    "activityCode": {
      "description": "Code representing the result of the test",
      "type": "string",
      "enum": [
        "1",
        "2",
        "3",
        "4",
        "5",
        "6",
        "11",
        "20",
        "21",
        "22",
        "23",
        "24",
        "25",
        "26",
        "27",
        "28",
        "32",
        "33",
        "34",
        "35",
        "36",
        "37",
        "38",
        "40",
        "41",
        "51",
        "52",
        "55",
        "58",
        "59",
        "60",
        "61",
        "62",
        "63",
        "64",
        "66",
        "67",
        "68",
        "69",
        "70",
        "71",
        "73",
        "74",
        "75",
        "76",
        "77",
        "78",
        "79",
        "80",
        "81",
        "82",
        "83",
        "88",
        "89"
      ]
    },
    "gender": {
      "description": "The gender of an individual, limited to 'M' or 'F' as per TARS master data",
      "type": "string",
      "enum": [
        "M",
        "F"
      ]
    },
    "rekeyReason": {
      "description": "Recording of the rekey reason",
      "type": "object",
      "properties": {
        "transfer": {
          "$ref": "#/definitions/transfer"
        },
        "ipadIssue": {
          "$ref": "#/definitions/ipadIssue"
        },
        "other": {
          "$ref": "#/definitions/other"
        }
      },
      "additionalProperties": false
    },
    "transfer": {
      "description": "Recording of if a rekey was due to a transfer",
      "type": "object",
      "properties": {
        "selected": {
          "description": "If this option was selected",
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "ipadIssue": {
      "description": "Recording of if a rekey was due to a iPad issue",
      "type": "object",
      "properties": {
        "selected": {
          "description": "If this option was selected",
          "type": "boolean"
        },
        "technicalFault": {
          "description": "If the iPad was not used due to a technical fault",
          "type": "boolean"
        },
        "lost": {
          "description": "If the iPad was not used as it has been lost",
          "type": "boolean"
        },
        "stolen": {
          "description": "If the iPad was not used as it has been stolen",
          "type": "boolean"
        },
        "broken": {
          "description": "If the iPad was not used as it is broken",
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "other": {
      "description": "Recording of if a rekey was due to a different reason",
      "type": "object",
      "properties": {
        "selected": {
          "description": "If this option was selected",
          "type": "boolean"
        },
        "reason": {
          "description": "The reason this option was selected",
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "testRequirements": {
      "description": "The test requirements that must be carried out during a test",
      "type": "object",
      "properties": {
        "normalStart1": {
          "description": "Indicates whether or not this test requirement was carried out",
          "type": "boolean"
        },
        "normalStart2": {
          "description": "Indicates whether or not this test requirement was carried out",
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "vehicleDetails": {
      "description": "Details about the vehicle to be used for the test",
      "type": "object",
      "properties": {
        "registrationNumber": {
          "description": "The vehicle registration number",
          "type": "string",
          "maxLength": 7
        },
        "motStatus": {
          "description": "The mot status of the vehicle",
          "type": "string"
        },
        "motEvidenceProvided": {
          "description": "Marker stating if alternative MOT evidence was provided",
          "type": "boolean"
        },
        "motEvidence": {
          "description": "Alternative MOT evidence",
          "type": "string"
        },
        "make": {
          "description": "The make of the vehicle",
          "type": "string"
        },
        "model": {
          "description": "The model of the vehicle",
          "type": "string"
        },
        "testExpiryDate": {
          "description": "The test expiry date of the vehicle",
          "type": "string"
        },
        "previouslySearchedRegNumbers": {
          "description": "Previously searched for registration numbers",
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "gearboxCategory": {
          "$ref": "#/definitions/gearboxCategory"
        }
      },
      "additionalProperties": false
    },
    "passCompletion": {
      "description": "Finalisation of a successful test outcome",
      "type": "object",
      "properties": {
        "provisionalLicenceProvided": {
          "description": "Indicates whether the candidate submitted their provisional driving licence",
          "type": "boolean"
        },
        "passCertificateNumber": {
          "description": "The PCN issued to the candidate",
          "type": "string",
          "maxLength": 8,
          "minLength": 8
        }
      },
      "additionalProperties": false,
      "required": [
        "passCertificateNumber"
      ]
    }
  },
  "properties": {
    "version": {
      "description": "Version number",
      "type": "string"
    },
    "appVersion": {
      "description": "App version number",
      "type": "string"
    },
    "category": {
      "$ref": "#/definitions/categoryCode"
    },
    "journalData": {
      "$ref": "#/definitions/journalData"
    },
    "activityCode": {
      "$ref": "#/definitions/activityCode"
    },
    "communicationPreferences": {
      "$ref": "#/definitions/communicationPreferences"
    },
    "preTestDeclarations": {
      "$ref": "#/definitions/preTestDeclarations"
    },
    "accompaniment": {
      "$ref": "#/definitions/accompaniment"
    },
    "postTestDeclarations": {
      "$ref": "#/definitions/postTestDeclarations"
    },
    "testSummary": {
      "$ref": "#/definitions/testSummary"
    },
    "rekeyReason": {
      "$ref": "#/definitions/rekeyReason"
    },
    "rekey": {
      "description": "Whether the test was rekeyed or not",
      "type": "boolean"
    },
    "rekeyDate": {
      "description": "Date the test was rekeyed",
      "type": "string"
    },
    "delegatedTest": {
      "description": "Whether the test was completed by a delegated examiner or not",
      "type": "boolean"
    },
    "changeMarker": {
      "description": "Whether the test was conducted by another examiner",
      "type": "boolean"
    },
    "examinerBooked": {
      "description": "The examiner who the test was booked to",
      "type": ["number", "string"]
    },
    "examinerConducted": {
      "description": "The examiner who conducted the test",
      "type": ["number", "string"]
    },
    "examinerKeyed": {
      "description": "The examiner who keyed the test into the iPad",
      "type": "number"
    },
    "passCompletion": {
      "$ref": "#/definitions/passCompletion"
    },
    "vehicleDetails": {
      "$ref": "#/definitions/vehicleDetails"
    },
    "userExitedApp": {
      "$ref": "#/definitions/userExitedApp"
    },
    "testData": {
      "$ref": "#/definitions/testData"
    }
  },
  "additionalProperties": false,
  "required": [
    "version",
    "category",
    "journalData",
    "activityCode",
    "rekey",
    "changeMarker",
    "examinerBooked",
    "examinerConducted",
    "examinerKeyed"
  ]
}
