packages feed

casa-reoc-0.1.0.0: test/DataGens.hs

{-# LANGUAGE DataKinds #-}
{-# OPTIONS_GHC -Wall #-}

-- | Generators of the valid data types, built from the public interface.
module DataGens (
  genAustralianState,
  genRPACategory,
  genLikelihood,
  genConsequence,
  genRiskLevel,
  genKeyPosition,
  genBackupInterval,
  genCourseType,
  genComplexity,
  genInstructorTakeover,
  genTheoryDelivery,
  genExamDelivery,
  genFlightTestExaminer,
  genDirectorship,
  genRadioQualification,
  genRemotePilots,
  genCrewing,
  genTransponder,
  genVersionChange,
  genPerson,
  genAddress,
  genOperationalHeadquarters,
  genCompany,
  genFlightTermination,
  genEmergencyAction,
  genRPAType,
  genEquipment,
  genAircraft,
  genOperatedType,
  genRePLOrigin,
  genOtherReOCRoles,
  genNominee,
  genChiefExecutive,
  genCRPNominee,
  genChiefPilot,
  genMCNominee,
  genKeyPersonnel,
  genOperator,
  genContactPerson,
  genPrimaryContact,
  genHistoryAnswer,
  genPersonnelHistory,
  genRegulatoryAction,
  genRegulatoryHistory,
  genDeclarant,
  genDeclaration,
  genWrittenSignature,
  genApplicationForm,
  genVersion,
  genFirstIssue,
  genRevision,
  genPolicies,
  genRiskAssessment,
  genRisk,
  genOperationsManual,
  genCRINominee,
  genRePLHolding,
  genTeachingQualification,
  genOperationalExperience,
  genTrainingCourse,
  genTrainingArrangements,
  genTrainingMaterial,
  genReOC,
  genField,
  genInvalidValue,
  genStep,
  genUnfilled,
  genInvalid,
  genTooMany,
  genReOCError,
) where

import Control.Lens (review)
import Hedgehog (Gen)
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range
import PrimitiveGens
import ReOC

genAustralianState :: Gen AustralianState
genAustralianState =
  Gen.choice
    [ pure (review newSouthWales ())
    , pure (review victoria ())
    , pure (review queensland ())
    , pure (review westernAustralia ())
    , pure (review southAustralia ())
    , pure (review tasmania ())
    , pure (review australianCapitalTerritory ())
    , pure (review northernTerritory ())
    ]

genRPACategory :: Gen RPACategory
genRPACategory =
  Gen.choice
    [ pure (review aeroplane ())
    , pure (review helicopter ())
    , pure (review multirotor ())
    , pure (review poweredLift ())
    ]

genLikelihood :: Gen Likelihood
genLikelihood =
  Gen.choice
    [ pure (review frequent ())
    , pure (review occasional ())
    , pure (review remote ())
    , pure (review improbable ())
    , pure (review extremelyImprobable ())
    ]

genConsequence :: Gen Consequence
genConsequence =
  Gen.choice
    [ pure (review catastrophic ())
    , pure (review hazardous ())
    , pure (review moderate ())
    , pure (review minor ())
    , pure (review negligible ())
    ]

genRiskLevel :: Gen RiskLevel
genRiskLevel =
  Gen.choice
    [ pure (review high ())
    , pure (review medium ())
    , pure (review low ())
    ]

genKeyPosition :: Gen KeyPosition
genKeyPosition =
  Gen.choice
    [ pure (review chiefExecutiveOfficer ())
    , pure (review chiefRemotePilot ())
    , pure (review maintenanceController ())
    ]

genBackupInterval :: Gen BackupInterval
genBackupInterval =
  Gen.choice
    [ pure (review daily ())
    , pure (review weekly ())
    , pure (review monthly ())
    ]

genCourseType :: Gen CourseType
genCourseType =
  Gen.choice
    [ pure (review initialCourse ())
    , pure (review upgradeSameCategory ())
    , pure (review upgradeDifferentCategory ())
    ]

genComplexity :: Gen Complexity
genComplexity =
  Gen.choice
    [ pure (review automatedAndManual ())
    , pure (review automatedOnly ())
    ]

genInstructorTakeover :: Gen InstructorTakeover
genInstructorTakeover =
  Gen.choice
    [ pure (review dualControllerLink ())
    , pure (review sharedController ())
    ]

genTheoryDelivery :: Gen TheoryDelivery
genTheoryDelivery =
  Gen.choice
    [ pure (review classroomTheory ())
    , pure (review blendedTheory ())
    , pure (review onlineTheory ())
    ]

genExamDelivery :: Gen ExamDelivery
genExamDelivery =
  Gen.choice
    [ pure (review paperExamination ())
    , pure (review computerExamination ())
    ]

genFlightTestExaminer :: Gen FlightTestExaminer
genFlightTestExaminer =
  Gen.choice
    [ pure (review criConductsFlightTests ())
    , pure (review independentExaminerWhereAvailable ())
    ]

genDirectorship :: Gen Directorship
genDirectorship =
  Gen.choice
    [ pure (review soleDirector ())
    , pure (review director ())
    , pure (review notADirector ())
    ]

genRadioQualification :: Gen RadioQualification
genRadioQualification =
  Gen.choice
    [ pure (review flightCrewLicence ())
    , pure (review radioOperatorCertificate ())
    , pure (review noRadioQualification ())
    ]

genRemotePilots :: Gen RemotePilots
genRemotePilots =
  Gen.choice
    [ pure (review crpIsOnlyRemotePilot ())
    , pure (review otherRemotePilots ())
    ]

genCrewing :: Gen Crewing
genCrewing =
  Gen.choice
    [ pure (review soloOperationsOnly ())
    , pure (review soloAndMultiCrewOperations ())
    ]

genTransponder :: Gen Transponder
genTransponder =
  Gen.choice
    [ pure (review noTransponder ())
    , pure (review transponderFitted ())
    ]

genVersionChange :: Gen VersionChange
genVersionChange =
  Gen.choice
    [ pure (review majorRevision ())
    , pure (review minorRevision ())
    ]

genPerson :: Gen Person
genPerson =
  Person'
    <$> genFormText
    <*> genARN
    <*> genPhoneNumber
    <*> genEmailAddress

genAddress :: Gen Address
genAddress =
  Address'
    <$> Gen.nonEmpty (Range.linear 1 2) genText1
    <*> genText1
    <*> genAustralianState
    <*> genPostcode

genOperationalHeadquarters :: Gen OperationalHeadquarters
genOperationalHeadquarters =
  Gen.choice
    [ pure (review atRegisteredOffice ())
    , review operationalHeadquartersAddress <$> genAddress
    ]

genCompany :: Gen Company
genCompany =
  Company'
    <$> genFormText
    <*> genABN
    <*> genARN
    <*> genAddress
    <*> genOperationalHeadquarters
    <*> genPhoneNumber
    <*> genEmailAddress
    <*> Gen.maybe genFormText

genFlightTermination :: Gen FlightTermination
genFlightTermination =
  Gen.choice
    [ pure (review noFlightTerminationSystem ())
    , review flightTerminationSystem <$> genText1
    ]

genEmergencyAction :: Gen EmergencyAction
genEmergencyAction =
  EmergencyAction'
    <$> genText1
    <*> genText1
    <*> Gen.list (Range.linear 0 2) genText1

genRPAType :: Gen RPAType
genRPAType =
  RPAType'
    <$> genText1
    <*> genText1
    <*> genFormText
    <*> genRPACategory
    <*> genGrossWeight
    <*> genText1
    <*> genTransponder
    <*> genFlightTermination
    <*> Gen.nonEmpty (Range.linear 1 2) genText1
    <*> Gen.list (Range.linear 0 2) genText1
    <*> Gen.maybe genText1
    <*> Gen.list (Range.linear 0 2) genEmergencyAction

genEquipment :: Gen Equipment
genEquipment =
  Equipment'
    <$> genText1
    <*> genText1

genAircraft :: Gen Aircraft
genAircraft =
  Aircraft'
    <$> genText1
    <*> Gen.list (Range.linear 0 2) genEquipment

genOperatedType :: Gen OperatedType
genOperatedType =
  OperatedType'
    <$> genRPAType
    <*> Gen.nonEmpty (Range.linear 1 2) genAircraft

genRePLOrigin :: Gen RePLOrigin
genRePLOrigin =
  Gen.choice
    [ pure (review pplTheory ())
    , review rePLTrainingOrganisation <$> genFormText
    ]

genOtherReOCRoles :: Gen OtherReOCRoles
genOtherReOCRoles =
  Gen.choice
    [ pure (review noOtherReOCRoles ())
    , review otherReOCRolesHeld <$> genFormText
    ]

genNominee :: Gen Nominee
genNominee =
  Nominee'
    <$> genPerson
    <*> Gen.list (Range.linear 0 2) genText1
    <*> genText1

genChiefExecutive :: Gen ChiefExecutive
genChiefExecutive =
  ChiefExecutive'
    <$> genNominee
    <*> genDirectorship
    <*> Gen.maybe genFormText

genCRPNominee :: Gen CRPNominee
genCRPNominee =
  Gen.choice
    [ pure (review crpIsCEO ())
    , review crpNominated <$> genNominee
    ]

genChiefPilot :: Gen ChiefPilot
genChiefPilot =
  ChiefPilot'
    <$> genCRPNominee
    <*> genRePLOrigin
    <*> genFormText
    <*> genOtherReOCRoles
    <*> genRadioQualification

genMCNominee :: Gen MCNominee
genMCNominee =
  Gen.choice
    [ pure (review mcIsCEO ())
    , pure (review mcIsCRP ())
    , review mcNominated <$> genNominee
    ]

genKeyPersonnel :: Gen KeyPersonnel
genKeyPersonnel =
  KeyPersonnel'
    <$> genChiefExecutive
    <*> genChiefPilot
    <*> genMCNominee

genOperator :: Gen Operator
genOperator =
  Operator'
    <$> genCompany
    <*> genKeyPersonnel
    <*> genSome genOperatedType

genContactPerson :: Gen ContactPerson
genContactPerson =
  ContactPerson'
    <$> genFormText
    <*> genFormText
    <*> genPhoneNumber
    <*> genEmailAddress

genPrimaryContact :: Gen PrimaryContact
genPrimaryContact =
  Gen.choice
    [ pure (review applicantIsPrimaryContact ())
    , review primaryContactPerson <$> genContactPerson
    ]

genHistoryAnswer :: Gen HistoryAnswer
genHistoryAnswer =
  Gen.choice
    [ pure (review noHistory ())
    , review historyDisclosed <$> genFormText
    ]

genPersonnelHistory :: Gen PersonnelHistory
genPersonnelHistory =
  PersonnelHistory'
    <$> genHistoryAnswer
    <*> genHistoryAnswer
    <*> genHistoryAnswer
    <*> genHistoryAnswer

genRegulatoryAction :: Gen RegulatoryAction
genRegulatoryAction =
  RegulatoryAction'
    <$> Gen.bool
    <*> genFormText
    <*> genFormText
    <*> genDay
    <*> genFormText

genRegulatoryHistory :: Gen RegulatoryHistory
genRegulatoryHistory =
  Gen.choice
    [ pure (review noRegulatoryAction ())
    , review regulatoryActionTaken <$> genRegulatoryAction
    ]

genDeclarant :: Gen Declarant
genDeclarant =
  Declarant'
    <$> genFormText
    <*> genFormText

genDeclaration :: Gen Declaration
genDeclaration =
  Gen.choice
    [ pure (review declaredByCEO ())
    , review declaredByResponsibleManager <$> genFormText
    , review declaredByAgent <$> genFormText
    , review declaredByOther <$> genDeclarant
    ]

genWrittenSignature :: Gen WrittenSignature
genWrittenSignature =
  Gen.choice
    [ review writtenSignatureImage <$> genByteString
    , review writtenSignatureFile <$> genFilePath
    ]

genApplicationForm :: Gen ApplicationForm
genApplicationForm =
  ApplicationForm'
    <$> genPrimaryContact
    <*> genPersonnelHistory
    <*> genRegulatoryHistory
    <*> Gen.bool
    <*> genAtMost genFormText
    <*> genDeclaration
    <*> Gen.maybe genWrittenSignature

genVersion :: Gen Version
genVersion =
  Version'
    <$> genNatural
    <*> genNatural

genFirstIssue :: Gen FirstIssue
genFirstIssue =
  FirstIssue'
    <$> genVersion
    <*> genMonth
    <*> genText1
    <*> genText1
    <*> genText1

genRevision :: Gen Revision
genRevision =
  Revision'
    <$> genVersionChange
    <*> genNatural
    <*> genText1
    <*> genText1
    <*> genText1

genPolicies :: Gen Policies
genPolicies =
  Policies'
    <$> genPositive
    <*> genPositive
    <*> genPositive
    <*> genPositive
    <*> genPositive
    <*> genPositive
    <*> genPositive
    <*> genPositive
    <*> genPercentage
    <*> genBackupInterval
    <*> genPositive
    <*> genPositive

genRiskAssessment :: Gen RiskAssessment
genRiskAssessment =
  RiskAssessment'
    <$> genLikelihood
    <*> genConsequence

genRisk :: Gen Risk
genRisk =
  Risk'
    <$> genText1
    <*> genText1
    <*> genText1
    <*> genRiskAssessment
    <*> genText1
    <*> genRiskAssessment
    <*> genKeyPosition
    <*> genMonth
    <*> genReviewMonths

genOperationsManual :: Gen OperationsManual
genOperationsManual =
  OperationsManual'
    <$> genFirstIssue
    <*> Gen.list (Range.linear 0 2) genRevision
    <*> Gen.nonEmpty (Range.linear 1 2) genText1
    <*> genPolicies
    <*> Gen.nonEmpty (Range.linear 1 2) genRisk
    <*> genCrewing
    <*> genRemotePilots

genCRINominee :: Gen CRINominee
genCRINominee =
  Gen.choice
    [ pure (review criIsCEO ())
    , pure (review criIsCRP ())
    , pure (review criIsMC ())
    , review criNominated <$> genNominee
    ]

genRePLHolding :: Gen RePLHolding
genRePLHolding =
  Gen.choice
    [ pure (review holdsRePLForEachType ())
    , review rePLHoldingIntent <$> genFormText
    ]

genTeachingQualification :: Gen TeachingQualification
genTeachingQualification =
  Gen.choice
    [ review teachingQualificationHeld <$> genFormText
    , review teachingQualificationIntent <$> genFormText
    ]

genOperationalExperience :: Gen OperationalExperience
genOperationalExperience =
  Gen.choice
    [ pure (review hasOperationalExperience ())
    , review operationalExperienceIntent <$> genFormText
    , pure (review operationalExperienceNotApplicable ())
    ]

genTrainingCourse :: Gen TrainingCourse
genTrainingCourse =
  TrainingCourse'
    <$> genCourseType
    <*> genOperatedType
    <*> Gen.nonEmpty (Range.linear 1 2) genComplexity

genTrainingArrangements :: Gen TrainingArrangements
genTrainingArrangements =
  TrainingArrangements'
    <$> Gen.nonEmpty (Range.linear 1 2) genText1
    <*> Gen.nonEmpty (Range.linear 1 2) genText1
    <*> genPositive
    <*> genPositive
    <*> genInstructorTakeover
    <*> genTheoryDelivery
    <*> genExamDelivery
    <*> genPassMark
    <*> genFlightTestExaminer
    <*> Gen.maybe genText1

genTrainingMaterial :: Gen TrainingMaterial
genTrainingMaterial =
  TrainingMaterial'
    <$> genCRINominee
    <*> genRePLHolding
    <*> genTeachingQualification
    <*> genOperationalExperience
    <*> genOtherReOCRoles
    <*> genSome genTrainingCourse
    <*> genTrainingArrangements

genReOC :: Gen ReOC
genReOC =
  ReOC'
    <$> genOperator
    <*> genApplicationForm
    <*> genOperationsManual
    <*> Gen.maybe genTrainingMaterial

genField :: Gen Field
genField =
  Gen.choice
    [ pure (review personFullName ())
    , pure (review personArn ())
    , pure (review personPhoneNumber ())
    , pure (review personEmailAddress ())
    , pure (review addressStreetAddress ())
    , pure (review addressSuburb ())
    , pure (review addressStateOrTerritory ())
    , pure (review addressPostcode ())
    , pure (review operationalHeadquartersAtRegisteredOffice ())
    , pure (review operationalHeadquartersOperationalHeadquartersAddress ())
    , pure (review companyCompanyName ())
    , pure (review companyAbn ())
    , pure (review companyArn ())
    , pure (review companyRegisteredOffice ())
    , pure (review companyOperationalHeadquarters ())
    , pure (review companyPhoneNumber ())
    , pure (review companyEmailAddress ())
    , pure (review companyBusinessName ())
    , pure (review flightTerminationNoFlightTerminationSystem ())
    , pure (review flightTerminationFlightTerminationSystem ())
    , pure (review emergencyActionSituation ())
    , pure (review emergencyActionResponse ())
    , pure (review emergencyActionActionSteps ())
    , pure (review rpaTypeRpaMake ())
    , pure (review rpaTypeRpaModel ())
    , pure (review rpaTypeShortName ())
    , pure (review rpaTypeCategory ())
    , pure (review rpaTypeMaximumGrossWeight ())
    , pure (review rpaTypeUserManual ())
    , pure (review rpaTypeTransponderCarriage ())
    , pure (review rpaTypeFlightTermination ())
    , pure (review rpaTypeInspectionItems ())
    , pure (review rpaTypeBeforeFlight ())
    , pure (review rpaTypeBatteryWarnings ())
    , pure (review rpaTypeEmergencyActions ())
    , pure (review equipmentEquipmentDescription ())
    , pure (review equipmentSerialNumber ())
    , pure (review aircraftSerialNumber ())
    , pure (review aircraftAssociatedEquipment ())
    , pure (review operatedTypeRpaType ())
    , pure (review operatedTypeAirframes ())
    , pure (review rePLOriginPplTheory ())
    , pure (review rePLOriginRePLTrainingOrganisation ())
    , pure (review otherReOCRolesNoOtherReOCRoles ())
    , pure (review otherReOCRolesOtherReOCRolesHeld ())
    , pure (review nomineePerson ())
    , pure (review nomineeOtherQualifications ())
    , pure (review nomineeAviationExperience ())
    , pure (review chiefExecutiveNominee ())
    , pure (review chiefExecutiveDirectorStatus ())
    , pure (review chiefExecutiveManagementExperience ())
    , pure (review crpNomineeCrpIsCEO ())
    , pure (review crpNomineeCrpNominated ())
    , pure (review chiefPilotCrpNominee ())
    , pure (review chiefPilotRePLOrigin ())
    , pure (review chiefPilotRpaHistory ())
    , pure (review chiefPilotOtherReOCRoles ())
    , pure (review chiefPilotRadio ())
    , pure (review mcNomineeMcIsCEO ())
    , pure (review mcNomineeMcIsCRP ())
    , pure (review mcNomineeMcNominated ())
    , pure (review keyPersonnelChiefExecutive ())
    , pure (review keyPersonnelChiefPilot ())
    , pure (review keyPersonnelMcNominee ())
    , pure (review operatorCompany ())
    , pure (review operatorKeyPersonnel ())
    , pure (review operatorFleet ())
    , pure (review contactPersonFullName ())
    , pure (review contactPersonPosition ())
    , pure (review contactPersonPhoneNumber ())
    , pure (review contactPersonEmailAddress ())
    , pure (review primaryContactApplicantIsPrimaryContact ())
    , pure (review primaryContactPrimaryContactPerson ())
    , pure (review historyAnswerNoHistory ())
    , pure (review historyAnswerHistoryDisclosed ())
    , pure (review personnelHistoryActionTaken ())
    , pure (review personnelHistoryTransportLicenceRefused ())
    , pure (review personnelHistoryCriminalConviction ())
    , pure (review personnelHistorySuspensionPending ())
    , pure (review regulatoryActionReocSuspendedOrCancelled ())
    , pure (review regulatoryActionTypeOfAction ())
    , pure (review regulatoryActionAuthorisationAction ())
    , pure (review regulatoryActionActionDate ())
    , pure (review regulatoryActionActionDetails ())
    , pure (review regulatoryHistoryNoRegulatoryAction ())
    , pure (review regulatoryHistoryRegulatoryActionTaken ())
    , pure (review declarantFullName ())
    , pure (review declarantRole ())
    , pure (review declarationDeclaredByCEO ())
    , pure (review declarationDeclaredByResponsibleManager ())
    , pure (review declarationDeclaredByAgent ())
    , pure (review declarationDeclaredByOther ())
    , pure (review writtenSignatureWrittenSignatureImage ())
    , pure (review writtenSignatureWrittenSignatureFile ())
    , pure (review applicationFormPrimaryContact ())
    , pure (review applicationFormPersonnelHistory ())
    , pure (review applicationFormRegulatoryHistory ())
    , pure (review applicationFormProceduresLibrary ())
    , pure (review applicationFormOtherDocuments ())
    , pure (review applicationFormDeclaration ())
    , pure (review applicationFormSignature ())
    , pure (review versionMajorVersion ())
    , pure (review versionMinorVersion ())
    , pure (review firstIssueVersion ())
    , pure (review firstIssueIssueDate ())
    , pure (review firstIssueEffective ())
    , pure (review firstIssueParts ())
    , pure (review firstIssueDetails ())
    , pure (review revisionVersionIncrement ())
    , pure (review revisionMonthsAfter ())
    , pure (review revisionEffective ())
    , pure (review revisionParts ())
    , pure (review revisionDetails ())
    , pure (review policiesRecencyFlights ())
    , pure (review policiesRecencyDays ())
    , pure (review policiesRefresherMonths ())
    , pure (review policiesAlcoholHours ())
    , pure (review policiesRestHours ())
    , pure (review policiesDutyHours ())
    , pure (review policiesInspectionMonths ())
    , pure (review policiesInspectionHours ())
    , pure (review policiesBatteryReserve ())
    , pure (review policiesBackupFrequency ())
    , pure (review policiesIndependentReviewYears ())
    , pure (review policiesCheckingMonths ())
    , pure (review riskAssessmentRiskLikelihood ())
    , pure (review riskAssessmentRiskConsequence ())
    , pure (review riskHazard ())
    , pure (review riskRiskDescription ())
    , pure (review riskExistingControls ())
    , pure (review riskInitialRisk ())
    , pure (review riskAdditionalControls ())
    , pure (review riskResidualRisk ())
    , pure (review riskRiskOwner ())
    , pure (review riskDateEntered ())
    , pure (review riskReviewMonths ())
    , pure (review operationsManualFirstIssue ())
    , pure (review operationsManualRevisions ())
    , pure (review operationsManualServices ())
    , pure (review operationsManualPolicies ())
    , pure (review operationsManualRiskRegister ())
    , pure (review operationsManualCrew ())
    , pure (review operationsManualPilots ())
    , pure (review criNomineeCriIsCEO ())
    , pure (review criNomineeCriIsCRP ())
    , pure (review criNomineeCriIsMC ())
    , pure (review criNomineeCriNominated ())
    , pure (review rePLHoldingHoldsRePLForEachType ())
    , pure (review rePLHoldingRePLHoldingIntent ())
    , pure (review teachingQualificationTeachingQualificationHeld ())
    , pure (review teachingQualificationTeachingQualificationIntent ())
    , pure (review operationalExperienceHasOperationalExperience ())
    , pure (review operationalExperienceOperationalExperienceIntent ())
    , pure (review operationalExperienceOperationalExperienceNotApplicable ())
    , pure (review trainingCourseCourseKind ())
    , pure (review trainingCourseTrainingRPA ())
    , pure (review trainingCourseComplexities ())
    , pure (review trainingArrangementsTheoryVenues ())
    , pure (review trainingArrangementsPracticalAreas ())
    , pure (review trainingArrangementsMaxStudentsPerCourse ())
    , pure (review trainingArrangementsMaxStudentsPerInstructor ())
    , pure (review trainingArrangementsTakeover ())
    , pure (review trainingArrangementsTheory ())
    , pure (review trainingArrangementsExam ())
    , pure (review trainingArrangementsExamPassMark ())
    , pure (review trainingArrangementsExaminer ())
    , pure (review trainingArrangementsSimulator ())
    , pure (review trainingMaterialCriNominee ())
    , pure (review trainingMaterialRePLHolding ())
    , pure (review trainingMaterialTeachingQualification ())
    , pure (review trainingMaterialOperationalExperience ())
    , pure (review trainingMaterialCriOtherReOCRoles ())
    , pure (review trainingMaterialTrainingCourses ())
    , pure (review trainingMaterialTrainingArrangements ())
    , pure (review reOCOperator ())
    , pure (review reOCApplicationForm ())
    , pure (review reOCOperationsManual ())
    , pure (review reOCMaybeTrainingMaterial ())
    ]

genInvalidValue :: Gen InvalidValue
genInvalidValue =
  Gen.choice
    [ review invalidText1 <$> genText
    , review invalidFormText <$> genText
    , review invalidABN <$> genText
    , review invalidARN <$> genText
    , review invalidEmailAddress <$> genText
    , review invalidPhoneNumber <$> genText
    , review invalidPostcode <$> genText
    , review invalidPositive <$> genNatural
    , review invalidPercentage <$> genNatural
    , review invalidGrossWeight <$> genNatural
    , review invalidReviewMonths <$> genNatural
    , review invalidPassMark <$> genNatural
    ]

genStep :: Gen Step
genStep =
  Gen.choice
    [ review field <$> genField
    , review stepIndex <$> genNatural
    ]

genUnfilled :: Gen Unfilled
genUnfilled =
  Unfilled
    <$> Gen.list (Range.linear 0 2) genStep

genInvalid :: Gen Invalid
genInvalid =
  Invalid
    <$> Gen.list (Range.linear 0 2) genStep
    <*> genInvalidValue

genTooMany :: Gen TooMany
genTooMany =
  TooMany
    <$> Gen.list (Range.linear 0 2) genStep
    <*> genNatural
    <*> genNatural

genReOCError :: Gen ReOCError
genReOCError =
  Gen.choice
    [ review unfilled <$> genUnfilled
    , review invalid <$> genInvalid
    , review tooMany <$> genTooMany
    ]