JudeAptitude 1.0.4

dotnet add package JudeAptitude --version 1.0.4
                    
NuGet\Install-Package JudeAptitude -Version 1.0.4
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="JudeAptitude" Version="1.0.4" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="JudeAptitude" Version="1.0.4" />
                    
Directory.Packages.props
<PackageReference Include="JudeAptitude" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add JudeAptitude --version 1.0.4
                    
#r "nuget: JudeAptitude, 1.0.4"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package JudeAptitude@1.0.4
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=JudeAptitude&version=1.0.4
                    
Install as a Cake Addin
#tool nuget:?package=JudeAptitude&version=1.0.4
                    
Install as a Cake Tool

JudeAptitude

JudeAptitude Logo

Introduction

JudeAptitude is an Exam/ Quiz/ CPD/ Survey Engine, created in part because when I see this functionality in projects it's always spaghetti code.

Exam Builder

To start you need to create an Exam.

An Exam can contain multiple Pages, each Page can contain both content and Questions.

Pages could be used to contain tutorial content, training content, HTML, images, videos etc.

Questions can consist of Multiple Choice, Free Text or a Slider/ Survey (1 - 10) question.

Exams can also be marked, if so Questions that count towards the mark need to have a correct answer specified.

Simple Exam

    var myFirstExam = new JudeExam("Hey Jude", isMarked: true);

    var myFirstPage = new ExamPage("Simple Page 1");

    var myFirstQuestion = new FreeTextQuestion
    {
        Prompt = "Simple Question 1",
        ExpectedAnswer = "Cannock",
        UseExactMatch = true,
        CountsTowardsMarking = true
    };


    myFirstPage.Questions.Add(myFirstQuestion);
    myFirstExam.Pages.Add(myFirstPage);

    var result = myFirstExam.ValidateExam();

You can create Exam objects and save them to a DB or some other storage, or you can create Exam objects on the fly from say a large Question Bank.

Attempt

Once you have an Exam a user can now Attempt it

Simple Attempt

    var myFirstAttempt = new ExamAttempt(myFirstExam);

    var questionsOnCurrentPage = myFirstAttempt.GetAllQuestionsOnCurrentPage();

    var simpleQuestion = questionsOnCurrentPage[0];

    myFirstAttempt.SubmitAnswerForQuestionOnCurrentPage(new FreeTextAnswer
    {
        QuestionId = simpleQuestion.QuestionId,
        GivenText = "Cannock"
    });

    var myFirstResult = myFirstAttempt.SubmitExamAttempt();

Once the ExamAttempt has been completed, you can call SubmitExamAttempt() and the Exam Attempt will be marked and return a Result object.

Documentation

Exam Builder
JudeExam πŸ‘‡
Title Title of the Exam
Description Description of the Exam
Subject Subject of the Exam
Tags Tags filter/ search Exams
Difficulty Difficulty to help filter/ search Exams
IsMarked True = All Questions need expected answers, when an ExamAttempt is submitted it will be automatically marked. False = Questions donοΏ½t need correct answers being set, submitting the ExamAttempt will not mark the exam.
RandomisePageOrder True = Pages will be sorted randomly for each ExamAttempt
Pages Pages that will be navigated in the ExamAttempt
PassingMarkPercentage A percentage passing rate, between 0 οΏ½ 1
SetPassingMarkPercentage() Sets the percentage passing rate
ValidateExam() Validate that the Exam you have created is ready to be Attempted
AllQuestionsCountingTowardsMark() Returns all Questions that count towards the mark
AllQuestions() Returns all Questions
PassingMarkTotal() Total passing mark
MaximumPossibleMark() Maximum passing mark
ExamPage πŸ‘‡
Title Title of the Page
Description Description of the Page, could be used to display HTML content
Questions Questions for the Page
RandomiseQuestionOrder True = Questions on the Page will have their order randomised on each ExamAttempt, False = The Order attribute on a Question object will be used for ordering Questions
Order Used to Order Pages
MaximumPossibleMark() Maximum possible Mark for the current Page
Questions πŸ‘‡
Prompt The text used for the Question Prompt
Description Description for the Question, could be used for HTML content
Hint Value that could be shown against the Question
Feedback Value that could be displayed upon submitting an Answer
Order Order of Questions
CountsTowardsMarking True = Question will be counted towards the final Mark
ValidateQuestion() Validate that you have created a valid Question
MaximumPossibleMark() Maximum possible Mark for the Question
MultipleChoiceQuestion πŸ‘‡
Options The options for the Multiple Choice, True/ False, Checkbox or Radio Buttons
CorrectAnswers The correct options
SetToAllOrNothingMarking() Get all options correct to get a Mark
SetToPartialMarking() Get some options correct to get a Mark
FreeTextQuestion πŸ‘‡
ExpectedAnswer Expected text Answer, Question type for Textboxes
Keywords Keywords for Partial Matching
UseExactMatch False = Keywords will be checked
SliderQuestion πŸ‘‡
MinValue Min value of say 1, Question type for a Survey or Feedback form
MaxValue Max value of say 10
ReversePassingThreshold If a correct answer it positive of the Threshold of negative of it
PassingThresholdValue Passing value of say 7

Exam Attempt
ExamAttempt πŸ‘‡
SubmitAnswerForQuestionOnCurrentPage Submit an Answer for the current Page
SubmitExamAttempt() Submits and finalises the Exam Attempt and potentially Marking
GetAllQuestionsOnCurrentPage() Gets all the Questions on the current Page, ordered as defined on the Exam
GetCurrentAnswerForQuestion() Gets a Questions current Answer Submitted for the ExamAttempt
GetCorrectAnswerForQuestion() Gets a Questions correct Answer
GetCurrentPage() Gets details for the current Page
NavigateToNextPage() Moves the Exam to the next Page defined on the Exam
NavigateToPreviousPage() Moves the Exam to the Previous Page defined on the Exam

In memory of Jude (2023 - 2024)

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETStandard 2.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.4 180 11/6/2025
1.0.3 172 11/6/2025
1.0.2 114 10/11/2025
1.0.1 117 10/10/2025
1.0.0 166 10/9/2025

Still largely a WIP