Exercises
Pick a diff.
Each one is a change to a file, with the tests that ship alongside it. Most carry exactly one defect. Some carry none at all, and saying so is worth points.
| Subject | Domain | Difficulty | Status |
|---|---|---|---|
| Config loader1 of 9Reads a JSON config, fills in defaults and reports what could not be parsed | Parsing | 1 | not attempted |
| Config loader2 of 9Reads a JSON config, fills in defaults and reports what could not be parsed | Parsing | 1 | not attempted |
| Config loader3 of 9Reads a JSON config, fills in defaults and reports what could not be parsed | Parsing | 1 | not attempted |
| Config loader4 of 9Reads a JSON config, fills in defaults and reports what could not be parsed | Parsing | 1 | not attempted |
| Config loader5 of 9Reads a JSON config, fills in defaults and reports what could not be parsed | Parsing | 2 | not attempted |
| Config loader6 of 9Reads a JSON config, fills in defaults and reports what could not be parsed | Parsing | 2 | not attempted |
| Config loader7 of 9Reads a JSON config, fills in defaults and reports what could not be parsed | Parsing | 3 | not attempted |
| Config loader8 of 9Reads a JSON config, fills in defaults and reports what could not be parsed | Parsing | 3 | not attempted |
| Config loader9 of 9Reads a JSON config, fills in defaults and reports what could not be parsed | Parsing | 3 | not attempted |
| CSV parserParses delimited text with quoted fields, escaped quotes and a header row | Parsing | 3 | not attempted |
| Currency formatterRenders an amount in minor units as text, per currency and locale | Money | 1 | not attempted |
| Date range overlap1 of 5Decides whether two half-open date ranges overlap, and merges the ones that do | Dates | 1 | not attempted |
| Date range overlap2 of 5Decides whether two half-open date ranges overlap, and merges the ones that do | Dates | 1 | not attempted |
| Date range overlap3 of 5Decides whether two half-open date ranges overlap, and merges the ones that do | Dates | 2 | not attempted |
| Date range overlap4 of 5Decides whether two half-open date ranges overlap, and merges the ones that do | Dates | 2 | not attempted |
| Date range overlap5 of 5Decides whether two half-open date ranges overlap, and merges the ones that do | Dates | 3 | not attempted |
| Directory sort1 of 2Orders a list of people for display, grouping them by initial | Collections | 1 | not attempted |
| Directory sort2 of 2Orders a list of people for display, grouping them by initial | Collections | 2 | not attempted |
| Line diff1 of 3Computes a line-by-line diff from the longest common subsequence of two texts | Collections | 3 | not attempted |
| Line diff2 of 3Computes a line-by-line diff from the longest common subsequence of two texts | Collections | 4 | not attempted |
| Line diff3 of 3Computes a line-by-line diff from the longest common subsequence of two texts | Collections | 4 | not attempted |
| LRU cache1 of 2Caches values up to a capacity, evicting whichever was used least recently | Cache | 2 | not attempted |
| LRU cache2 of 2Caches values up to a capacity, evicting whichever was used least recently | Cache | 4 | not attempted |
| Notification outbox1 of 2Drains a queue of pending notifications, releasing its lease whatever happens | Async | 1 | not attempted |
| Notification outbox2 of 2Drains a queue of pending notifications, releasing its lease whatever happens | Async | 3 | not attempted |
| Order pricing1 of 4Totals a basket in minor units, applying tiered discounts and tax | Money | 1 | not attempted |
| Order pricing2 of 4Totals a basket in minor units, applying tiered discounts and tax | Money | 1 | not attempted |
| Order pricing3 of 4Totals a basket in minor units, applying tiered discounts and tax | Money | 2 | not attempted |
| Order pricing4 of 4Totals a basket in minor units, applying tiered discounts and tax | Money | 3 | not attempted |
| Paginated list endpointServes a page of records with a cursor, a limit and a total count | API handlers | 3 | not attempted |
| Permission middleware1 of 2Decides whether a principal may perform an action on a resource | Auth | 1 | not attempted |
| Permission middleware2 of 2Decides whether a principal may perform an action on a resource | Auth | 2 | not attempted |
| Query builder1 of 3Assembles a parameterised select statement with sorting and paging | API handlers | 2 | not attempted |
| Query builder2 of 3Assembles a parameterised select statement with sorting and paging | API handlers | 2 | not attempted |
| Query builder3 of 3Assembles a parameterised select statement with sorting and paging | API handlers | 3 | not attempted |
| Recurring schedule1 of 3Expands a daily or weekly rule into the instants a job should run | Dates | 2 | not attempted |
| Recurring schedule2 of 3Expands a daily or weekly rule into the instants a job should run | Dates | 2 | not attempted |
| Recurring schedule3 of 3Expands a daily or weekly rule into the instants a job should run | Dates | 4 | not attempted |
| Retry wrapperRetries a failing operation with exponential backoff and a jittered delay | Async | 2 | not attempted |
| Session validatorChecks a session token for expiry, revocation and binding before trusting it | Auth | 3 | not attempted |
| Sign-in handler1 of 6Verifies a password and returns a result the caller can act on safely | Auth | 1 | not attempted |
| Sign-in handler2 of 6Verifies a password and returns a result the caller can act on safely | Auth | 1 | not attempted |
| Sign-in handler3 of 6Verifies a password and returns a result the caller can act on safely | Auth | 2 | not attempted |
| Sign-in handler4 of 6Verifies a password and returns a result the caller can act on safely | Auth | 2 | not attempted |
| Sign-in handler5 of 6Verifies a password and returns a result the caller can act on safely | Auth | 3 | not attempted |
| Sign-in handler6 of 6Verifies a password and returns a result the caller can act on safely | Auth | 3 | not attempted |
| Slug generator1 of 3Turns a title into a url-safe slug, keeping them unique within a collection | Parsing | 1 | not attempted |
| Slug generator2 of 3Turns a title into a url-safe slug, keeping them unique within a collection | Parsing | 2 | not attempted |
| Slug generator3 of 3Turns a title into a url-safe slug, keeping them unique within a collection | Parsing | 2 | not attempted |
| Stock levels1 of 5Aggregates stock across warehouses and decides what needs reordering | Collections | 1 | not attempted |
| Stock levels2 of 5Aggregates stock across warehouses and decides what needs reordering | Collections | 2 | not attempted |
| Stock levels3 of 5Aggregates stock across warehouses and decides what needs reordering | Collections | 2 | not attempted |
| Stock levels4 of 5Aggregates stock across warehouses and decides what needs reordering | Collections | 3 | not attempted |
| Stock levels5 of 5Aggregates stock across warehouses and decides what needs reordering | Collections | 3 | not attempted |
| Token bucket rate limiter1 of 2Allows a burst of requests per client and refills the allowance over time | Async | 1 | not attempted |
| Token bucket rate limiter2 of 2Allows a burst of requests per client and refills the allowance over time | Async | 2 | not attempted |
56 exercises across 8 domains.