├── .gitignore ├── LICENSE ├── README.md ├── docs ├── INSTRUCTIONS.md ├── calendar.css ├── day00 │ ├── challenge.md │ ├── snippet.webp │ └── solution │ │ ├── img │ │ ├── decrypted-email.webp │ │ ├── structure.webp │ │ ├── test-fails.webp │ │ └── tests-can-run.webp │ │ ├── snippet.webp │ │ └── step-by-step.md ├── day01 │ ├── challenge.md │ ├── snippet.webp │ └── solution │ │ ├── img │ │ ├── configure-existing-class.webp │ │ ├── configure-object.webp │ │ ├── create-ctor.webp │ │ ├── ide-hints.webp │ │ ├── introduce-configuration.webp │ │ ├── introduce-parameter-object.webp │ │ ├── red-ctor.webp │ │ └── safe-deletes.gif │ │ ├── snippet.webp │ │ └── step-by-step.md ├── day02 │ ├── challenge.md │ ├── snippet.webp │ └── solution │ │ ├── img │ │ ├── add-parameter.webp │ │ └── fail_for_70.webp │ │ ├── snippet.webp │ │ └── step-by-step.md ├── day03 │ ├── challenge.md │ ├── snippet.webp │ └── solution │ │ ├── img │ │ ├── dot-driven-development.webp │ │ ├── extract-method.webp │ │ ├── generated-data.webp │ │ └── replace-duplication.webp │ │ ├── snippet.webp │ │ └── step-by-step.md ├── day04 │ ├── challenge.md │ ├── img │ │ ├── doubles.webp │ │ └── mock-stub.webp │ ├── snippet.webp │ └── solution │ │ ├── img │ │ ├── express-assertions.webp │ │ ├── generate-fakes.webp │ │ └── instantiate-routine.webp │ │ ├── snippet.webp │ │ └── step-by-step.md ├── day05 │ ├── challenge.md │ ├── img │ │ ├── canon-tdd.webp │ │ └── eid-example.webp │ └── solution │ │ ├── img │ │ ├── first-failing-test.webp │ │ ├── generate-code-from-usage.webp │ │ ├── generate-method-source.webp │ │ ├── new-failing-test.webp │ │ ├── parameterized-tests-with-reason.webp │ │ ├── parameterized-tests.webp │ │ ├── refactor-length-rule.webp │ │ └── regex.webp │ │ ├── snippet.webp │ │ └── step-by-step.md ├── day06 │ ├── challenge.md │ ├── snippet.webp │ └── solution │ │ ├── img │ │ ├── checklist.webp │ │ ├── code-review-pyramid.webp │ │ ├── code-vengers.webp │ │ ├── fingers.webp │ │ └── nvc.webp │ │ ├── snippet.webp │ │ └── step-by-step.md ├── day07 │ ├── challenge.md │ ├── snippet.webp │ └── solution │ │ ├── img │ │ ├── be-completed.webp │ │ └── custom-assert-failing.webp │ │ ├── snippet.webp │ │ └── step-by-step.md ├── day08 │ ├── challenge.md │ ├── snippet.webp │ └── solution │ │ ├── img │ │ ├── card.webp │ │ ├── generate-method.webp │ │ ├── remove-ctor-parameter.webp │ │ ├── safe-delete.webp │ │ └── tell-dont-ask.webp │ │ ├── snippet.webp │ │ └── step-by-step.md ├── day09 │ ├── challenge.md │ ├── snippet.webp │ └── solution │ │ ├── img │ │ ├── childbuilder-create.webp │ │ ├── generate-code-from-usage.webp │ │ ├── nice-function.webp │ │ └── request-infeasible-gift.webp │ │ ├── snippet.webp │ │ └── step-by-step.md ├── day10 │ ├── challenge.md │ ├── snippet.webp │ └── solution │ │ ├── img │ │ ├── boy-scout-rule.webp │ │ ├── continuous-testing.webp │ │ ├── coverage.webp │ │ ├── extract-method.webp │ │ ├── failing-test.webp │ │ ├── fixed-test.webp │ │ └── linq.webp │ │ ├── snippet.webp │ │ └── step-by-step.md ├── day11 │ ├── challenge.md │ ├── snippet.webp │ └── solution │ │ ├── img │ │ ├── all-mutants-killed.webp │ │ ├── code-coverage.webp │ │ ├── coverage-100.webp │ │ ├── edge-cases.webp │ │ ├── fixed-string-mutation.webp │ │ ├── line-coverage.webp │ │ ├── mutant.webp │ │ ├── mutation-report.webp │ │ ├── mutation-score.webp │ │ └── mutations-details.webp │ │ ├── snippet.webp │ │ └── step-by-step.md ├── day12 │ ├── challenge.md │ ├── snippet.webp │ └── solution │ │ ├── img │ │ └── wishlist.webp │ │ ├── snippet.webp │ │ └── step-by-step.md ├── day13 │ ├── challenge.md │ ├── img │ │ ├── mikado.webp │ │ └── the-mikado-method.webp │ ├── snippet.webp │ └── solution │ │ ├── snippet.webp │ │ └── step-by-step.md ├── day14 │ ├── challenge.md │ ├── snippet.webp │ └── solution │ │ ├── img │ │ ├── compare-nickname.webp │ │ ├── file-compare.webp │ │ ├── files.webp │ │ ├── first-run-fails.webp │ │ ├── green-tests.webp │ │ └── introduce-field.webp │ │ ├── snippet.webp │ │ └── step-by-step.md ├── day15 │ ├── challenge.md │ ├── snippet.webp │ └── solution │ │ ├── img │ │ └── pipeline.webp │ │ ├── snippet.webp │ │ └── step-by-step.md ├── day16 │ ├── challenge.md │ ├── pomodoro.webp │ ├── snippet.webp │ └── solution │ │ ├── img │ │ ├── bug-identified.webp │ │ ├── mistral-feedback.webp │ │ └── which-assignment.webp │ │ ├── snippet.webp │ │ └── step-by-step.md ├── day17 │ ├── challenge.md │ ├── img │ │ ├── eid-example.webp │ │ ├── eid.drawio │ │ └── validate-eid.webp │ └── solution │ │ ├── img │ │ ├── eid-archi.webp │ │ ├── generate-eid.webp │ │ ├── parseSex.webp │ │ └── sex-generator.webp │ │ ├── snippet.webp │ │ └── step-by-step.md ├── day18 │ ├── challenge.md │ ├── rock-paper-scissors-lizard-spock.webp │ ├── snippet.webp │ └── solution │ │ ├── img │ │ ├── behavior-driven-development.webp │ │ └── first-failing-test.webp │ │ ├── snippet.webp │ │ └── step-by-step.md ├── day19 │ ├── challenge.md │ ├── snippet.webp │ └── solution │ │ ├── img │ │ ├── argument-exception-for-long.webp │ │ ├── benchmark-all-methods.webp │ │ ├── benchmark-new-method.webp │ │ ├── benchmark1.webp │ │ ├── create-benchmark-project.webp │ │ ├── create-new-method.webp │ │ ├── extract-variables.webp │ │ ├── overflow-exception.webp │ │ └── run-in-release.webp │ │ ├── snippet.webp │ │ └── step-by-step.md ├── day20 │ ├── challenge.md │ ├── snippet.webp │ └── solution │ │ ├── img │ │ ├── first-test.webp │ │ └── green-test.webp │ │ ├── snippet.webp │ │ └── step-by-step.md ├── day21 │ ├── challenge.md │ ├── snippet.webp │ └── solution │ │ ├── img │ │ ├── generate-code.webp │ │ ├── introduce-mutation.webp │ │ ├── move-class.webp │ │ ├── obsolete-class.webp │ │ ├── property-fails.webp │ │ ├── remove-property.webp │ │ └── remove-useless-parameter.webp │ │ ├── snippet.webp │ │ └── step-by-step.md ├── day22 │ ├── challenge.md │ ├── img │ │ ├── eid-archi.webp │ │ └── eid-example.webp │ ├── snippet.webp │ └── solution │ │ ├── img │ │ ├── failing-truncator.webp │ │ ├── falsified-key.webp │ │ └── truncate-mutator.webp │ │ ├── snippet.webp │ │ └── step-by-step.md ├── day23 │ ├── challenge.md │ ├── img │ │ └── controlsystem.webp │ ├── notice.md │ ├── snippet.webp │ └── solution │ │ ├── snippet.webp │ │ └── step-by-step.md ├── day24 │ ├── challenge.md │ ├── img │ │ ├── ccr.webp │ │ ├── cdd+tcr.webp │ │ ├── cdd.webp │ │ ├── tcr.gif │ │ └── tcr.webp │ ├── snippet.webp │ └── solution │ │ ├── img │ │ ├── clean-code-from-cognitive-pov.webp │ │ ├── code-structure.webp │ │ └── crappy-ideas.webp │ │ ├── snippet.webp │ │ └── step-by-step.md ├── day25 │ ├── challenge.md │ ├── img │ │ └── merry-christmas.webp │ ├── snippet.webp │ └── solution │ │ ├── img │ │ ├── badge.webp │ │ ├── merry-christmas.webp │ │ ├── survey.webp │ │ └── time-capsule.webp │ │ └── step-by-step.md ├── img │ ├── yann.png │ └── yoan.png ├── index.html └── snowflakes.js ├── exercise ├── C# │ ├── day00 │ │ ├── Email.Tests │ │ │ ├── Email.Tests.csproj │ │ │ ├── EncryptedEmail.txt │ │ │ ├── EncryptionTests.cs │ │ │ └── FileUtils.cs │ │ ├── Email.sln │ │ └── Email │ │ │ ├── Configuration.cs │ │ │ ├── Email.csproj │ │ │ └── Encryption.cs │ ├── day01 │ │ ├── Communication.Tests │ │ │ ├── Communication.Tests.csproj │ │ │ ├── Doubles │ │ │ │ └── TestLogger.cs │ │ │ └── SantaCommunicatorTests.cs │ │ ├── Communication.sln │ │ └── Communication │ │ │ ├── Communication.csproj │ │ │ ├── ILogger.cs │ │ │ └── SantaCommunicator.cs │ ├── day02 │ │ ├── FizzBuzz.sln │ │ ├── Games.Tests │ │ │ ├── FizzBuzzTests.cs │ │ │ └── Games.Tests.csproj │ │ └── Games │ │ │ ├── FizzBuzz.cs │ │ │ └── Games.csproj │ ├── day03 │ │ ├── Gift-Preparation.sln │ │ ├── Preparation.Tests │ │ │ ├── Preparation.Tests.csproj │ │ │ └── SantaWorkshopServiceTests.cs │ │ └── Preparation │ │ │ ├── Gift.cs │ │ │ ├── Preparation.csproj │ │ │ └── SantaWorkshopService.cs │ ├── day04 │ │ ├── MorningRoutine.sln │ │ ├── Routine.Tests │ │ │ ├── Routine.Tests.csproj │ │ │ └── RoutineTests.cs │ │ └── Routine │ │ │ ├── Email.cs │ │ │ ├── IEmailService.cs │ │ │ ├── IReindeerFeeder.cs │ │ │ ├── IScheduleService.cs │ │ │ ├── Routine.cs │ │ │ ├── Routine.csproj │ │ │ └── Schedule.cs │ ├── day05 │ │ ├── EID.Tests │ │ │ ├── EID.Tests.csproj │ │ │ └── EIDTests.cs │ │ ├── EID.sln │ │ └── EID │ │ │ └── EID.csproj │ ├── day06 │ │ ├── ElfWorkshop.Tests │ │ │ ├── ElfWorkshop.Tests.csproj │ │ │ └── ElfWorkshopTests.cs │ │ ├── ElfWorkshop.sln │ │ └── ElfWorkshop │ │ │ ├── ElfWorkshop.cs │ │ │ └── ElfWorkshop.csproj │ ├── day07 │ │ ├── Workshop.Tests │ │ │ ├── Workshop.Tests.csproj │ │ │ └── WorkshopTest.cs │ │ ├── Workshop.sln │ │ └── Workshop │ │ │ ├── Workshop.cs │ │ │ └── Workshop.csproj │ ├── day08 │ │ ├── ToyProduction.Tests │ │ │ ├── Doubles │ │ │ │ └── InMemoryToyRepository.cs │ │ │ ├── ToyProduction.Tests.csproj │ │ │ └── ToyProductionServiceTest.cs │ │ ├── ToyProduction.sln │ │ └── ToyProduction │ │ │ ├── Domain │ │ │ ├── IToyRepository.cs │ │ │ └── Toy.cs │ │ │ ├── Services │ │ │ └── ToyProductionService.cs │ │ │ └── ToyProduction.csproj │ ├── day09 │ │ ├── GiftWish.Tests │ │ │ ├── GiftWish.Tests.csproj │ │ │ └── SantaServiceTests.cs │ │ ├── GiftWish.sln │ │ └── GiftWish │ │ │ ├── Behavior.cs │ │ │ ├── Child.cs │ │ │ ├── GiftRequest.cs │ │ │ ├── GiftWish.csproj │ │ │ ├── Priority.cs │ │ │ └── SantaService.cs │ ├── day10 │ │ ├── Delivery.Tests │ │ │ ├── 1.txt │ │ │ ├── 2.txt │ │ │ ├── 3.txt │ │ │ ├── 4.txt │ │ │ ├── 5.txt │ │ │ ├── 6.txt │ │ │ ├── Delivery.Tests.csproj │ │ │ └── DeliveryShould.cs │ │ ├── Delivery │ │ │ ├── Delivery.cs │ │ │ └── Delivery.csproj │ │ └── SantasDelivery.sln │ ├── day11 │ │ ├── Christmas.Tests │ │ │ ├── Christmas.Tests.csproj │ │ │ └── PreparationTests.cs │ │ ├── Christmas │ │ │ ├── Christmas.csproj │ │ │ ├── Extensions.cs │ │ │ └── Preparation.cs │ │ └── Preparation.sln │ ├── day12 │ │ ├── Gifts.Tests │ │ │ ├── Gifts.Tests.csproj │ │ │ └── SantaTest.cs │ │ ├── Gifts.sln │ │ └── Gifts │ │ │ ├── Child.cs │ │ │ ├── Gifts.csproj │ │ │ ├── Santa.cs │ │ │ └── Toy.cs │ ├── day13 │ │ ├── SantaMarket.Tests │ │ │ ├── FakeCatalog.cs │ │ │ ├── SantaMarket.Tests.csproj │ │ │ └── SantamarketTest.cs │ │ ├── SantaMarket.sln │ │ └── SantaMarket │ │ │ ├── Model │ │ │ ├── ChristmasElf.cs │ │ │ ├── Discount.cs │ │ │ ├── Offer.cs │ │ │ ├── Product.cs │ │ │ ├── ProductQuantity.cs │ │ │ ├── ProductUnit.cs │ │ │ ├── Receipt.cs │ │ │ ├── ReceiptItem.cs │ │ │ ├── SantaMarketCatalog.cs │ │ │ ├── ShoppingSleigh.cs │ │ │ └── SpecialOfferType.cs │ │ │ └── SantaMarket.csproj │ ├── day14 │ │ ├── Children.Tests │ │ │ ├── Children.Tests.csproj │ │ │ └── MappingTests.cs │ │ ├── Children │ │ │ ├── ChildMapper.cs │ │ │ ├── Children.csproj │ │ │ ├── DTOs │ │ │ │ └── Child.cs │ │ │ └── Db2 │ │ │ │ └── X5T78.cs │ │ └── World.sln │ ├── day15 │ │ ├── ChristmasList.sln │ │ ├── SantaChristmasList.Operations.Test │ │ │ ├── BusinessTest.cs │ │ │ ├── GlobalUsings.cs │ │ │ └── SantaChristmasList.Operations.Test.csproj │ │ └── SantaChristmasList.Operations │ │ │ ├── Business.cs │ │ │ ├── Dependencies.cs │ │ │ ├── Models.cs │ │ │ └── SantaChristmasList.Operations.csproj │ ├── day16 │ │ ├── TaskAssignmentSystem.Tests │ │ │ ├── TaskAssignmentSystem.Tests.csproj │ │ │ └── TaskAssignmentTests.cs │ │ ├── TaskAssignmentSystem.sln │ │ └── TaskAssignmentSystem │ │ │ ├── Elf.cs │ │ │ ├── TaskAssignment.cs │ │ │ └── TaskAssignmentSystem.csproj │ ├── day17 │ │ ├── EID.Tests │ │ │ ├── EID.Tests.csproj │ │ │ └── EIDTests.cs │ │ ├── EID.sln │ │ └── EID │ │ │ └── EID.csproj │ ├── day18 │ │ ├── RockPaperScissorsGame.Tests │ │ │ ├── RockPaperScissors.feature │ │ │ ├── RockPaperScissorsGame.Tests.csproj │ │ │ └── RockPaperScissorsSteps.cs │ │ ├── RockPaperScissorsGame │ │ │ ├── RockPaperScissorsGame.cs │ │ │ └── RockPaperScissorsGame.csproj │ │ └── RockPaperScissorsLizardSpock.sln │ ├── day19 │ │ ├── SantasTravel.sln │ │ ├── Travel.Tests │ │ │ ├── CalculatorTests.cs │ │ │ └── Travel.Tests.csproj │ │ └── Travel │ │ │ ├── SantaTravelCalculator.cs │ │ │ └── Travel.csproj │ ├── day20 │ │ ├── Reindeer.Web.Tests │ │ │ ├── GlobalUsings.cs │ │ │ ├── Reindeer.Web.Tests.csproj │ │ │ ├── ReindeerContractTests.cs │ │ │ └── ReindeerWebApplicationFactory.cs │ │ ├── Reindeer.Web │ │ │ ├── Program.cs │ │ │ ├── Properties │ │ │ │ └── launchSettings.json │ │ │ ├── Reindeer.Web.csproj │ │ │ ├── Service │ │ │ │ ├── Reindeer.cs │ │ │ │ ├── ReindeerErrorCode.cs │ │ │ │ ├── ReindeerResult.cs │ │ │ │ ├── ReindeerService.cs │ │ │ │ ├── ReindeerToCreate.cs │ │ │ │ └── ReindeerToCreateRequest.cs │ │ │ ├── appsettings.Development.json │ │ │ └── appsettings.json │ │ └── ReindeerAPI.sln │ ├── day21 │ │ ├── SantasTour.sln │ │ └── Tour │ │ │ ├── Tour.csproj │ │ │ └── TourCalculator.cs │ ├── day22 │ │ ├── EID.Tests │ │ │ ├── EID.Tests.csproj │ │ │ ├── EIDGenerator.cs │ │ │ └── EIDProperties.cs │ │ ├── EID.sln │ │ └── EID │ │ │ ├── EID.cs │ │ │ ├── EID.csproj │ │ │ ├── ParsingError.cs │ │ │ ├── SerialNumber.cs │ │ │ ├── Sex.cs │ │ │ ├── StringExtensions.cs │ │ │ └── Year.cs │ ├── day23 │ │ ├── ControlSystem.App │ │ │ ├── ControlSystem.App.csproj │ │ │ ├── GlobalUsings.cs │ │ │ └── Program.cs │ │ ├── ControlSystem.Core │ │ │ ├── AmplifierType.cs │ │ │ ├── ControlSystem.Core.csproj │ │ │ ├── ControlSystem.cs │ │ │ ├── Dashboard.cs │ │ │ ├── MagicPowerAmplifier.cs │ │ │ ├── ReindeerPowerUnit.cs │ │ │ ├── ReindeersNeedRestException.cs │ │ │ ├── SleighAction.cs │ │ │ ├── SleighEngineStatus.cs │ │ │ └── SleighNotStartedException.cs │ │ ├── ControlSystem.External │ │ │ ├── ControlSystem.External.csproj │ │ │ ├── MagicStable.cs │ │ │ └── Reindeer.cs │ │ ├── ControlSystem.Tests │ │ │ ├── ControlSystem.Tests.csproj │ │ │ ├── GlobalUsings.cs │ │ │ └── TestControlSystem.cs │ │ └── ControlSystem.sln │ ├── day24 │ │ ├── .tcr │ │ │ ├── config.yml │ │ │ ├── language │ │ │ │ └── csharp.yml │ │ │ └── toolchain │ │ │ │ └── dotnet.yml │ │ ├── Delivery.sln │ │ ├── src │ │ │ └── Delivery │ │ │ │ ├── Delivery.csproj │ │ │ │ ├── Domain │ │ │ │ ├── Core │ │ │ │ │ ├── Error.cs │ │ │ │ │ ├── Event.cs │ │ │ │ │ ├── EventSourcedAggregate.cs │ │ │ │ │ ├── FunctionalExtensions.cs │ │ │ │ │ ├── IAggregate.cs │ │ │ │ │ ├── IEvent.cs │ │ │ │ │ ├── IRepository.cs │ │ │ │ │ └── RegisteredRoutes.cs │ │ │ │ ├── IToyRepository.cs │ │ │ │ ├── StockReducedEvent.cs │ │ │ │ ├── StockUnit.cs │ │ │ │ ├── Toy.cs │ │ │ │ └── ToyCreatedEvent.cs │ │ │ │ └── UseCases │ │ │ │ ├── DeliverToy.cs │ │ │ │ └── ToyDeliveryUseCase.cs │ │ ├── tcrw │ │ └── tests │ │ │ └── Delivery.Tests │ │ │ ├── Assertions │ │ │ ├── ToyAssertions.cs │ │ │ └── ToyExtensions.cs │ │ │ ├── Delivery.Tests.csproj │ │ │ ├── Doubles │ │ │ └── InMemoryToyRepository.cs │ │ │ ├── LangExtExtensions.cs │ │ │ ├── Time.cs │ │ │ ├── ToyBuilder.cs │ │ │ ├── Units │ │ │ └── CreateToyTests.cs │ │ │ └── UseCases │ │ │ └── ToyDelivery.cs │ ├── day25 │ │ ├── TimeCapsule.sln │ │ └── TimeCapsule │ │ │ ├── Browser.cs │ │ │ ├── Capsule.cs │ │ │ ├── Program.cs │ │ │ ├── TimeCapsule.csproj │ │ │ └── timecapsule_template.html │ └── tcr │ │ ├── .gitignore │ │ ├── tcr.sh │ │ └── version.txt ├── java │ ├── day00 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── email │ │ │ │ ├── Configuration.java │ │ │ │ └── Encryption.java │ │ │ └── test │ │ │ ├── java │ │ │ └── email │ │ │ │ ├── EncryptionTest.java │ │ │ │ └── FileUtils.java │ │ │ └── resources │ │ │ └── EncryptedEmail.txt │ ├── day01 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── communication │ │ │ │ ├── Logger.java │ │ │ │ └── SantaCommunicator.java │ │ │ └── test │ │ │ └── java │ │ │ ├── SantaCommunicatorTest.java │ │ │ └── doubles │ │ │ └── TestLogger.java │ ├── day02 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── games │ │ │ │ └── FizzBuzz.java │ │ │ └── test │ │ │ └── java │ │ │ └── games │ │ │ └── FizzBuzzTests.java │ ├── day03 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── preparation │ │ │ │ ├── Gift.java │ │ │ │ └── SantaWorkshopService.java │ │ │ └── test │ │ │ └── java │ │ │ └── preparation │ │ │ └── SantaWorkshopServiceTest.java │ ├── day04 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── routine │ │ │ │ ├── Email.java │ │ │ │ ├── EmailService.java │ │ │ │ ├── ReindeerFeeder.java │ │ │ │ ├── Routine.java │ │ │ │ ├── Schedule.java │ │ │ │ └── ScheduleService.java │ │ │ └── test │ │ │ └── java │ │ │ └── routine │ │ │ └── RoutineTests.java │ ├── day05 │ │ ├── pom.xml │ │ └── src │ │ │ └── test │ │ │ └── java │ │ │ └── eid │ │ │ └── EIDTests.java │ ├── day06 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── workshop │ │ │ │ └── ElfWorkshop.java │ │ │ └── test │ │ │ └── java │ │ │ └── workshop │ │ │ └── ElfWorkshopTests.java │ ├── day07 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── workshop │ │ │ │ ├── Gift.java │ │ │ │ ├── Status.java │ │ │ │ └── Workshop.java │ │ │ └── test │ │ │ └── java │ │ │ └── WorkshopTest.java │ ├── day08 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ ├── domain │ │ │ │ ├── Toy.java │ │ │ │ └── ToyRepository.java │ │ │ │ └── service │ │ │ │ └── ToyProductionService.java │ │ │ └── test │ │ │ └── java │ │ │ ├── ToyProductionServiceTest.java │ │ │ └── doubles │ │ │ └── InMemoryToyRepository.java │ ├── day09 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── gift │ │ │ │ ├── Behavior.java │ │ │ │ ├── Child.java │ │ │ │ ├── GiftRequest.java │ │ │ │ ├── Priority.java │ │ │ │ └── SantaService.java │ │ │ └── test │ │ │ └── java │ │ │ └── gift │ │ │ └── SantaServiceTests.java │ ├── day10 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── delivery │ │ │ │ └── Building.java │ │ │ └── test │ │ │ ├── java │ │ │ └── DeliveryTest.java │ │ │ └── resources │ │ │ ├── 1.txt │ │ │ ├── 2.txt │ │ │ ├── 3.txt │ │ │ ├── 4.txt │ │ │ ├── 5.txt │ │ │ └── 6.txt │ ├── day11 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── christmas │ │ │ │ ├── Preparation.java │ │ │ │ └── ToyType.java │ │ │ └── test │ │ │ └── java │ │ │ └── PreparationTests.java │ ├── day12 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── gifts │ │ │ │ ├── Child.java │ │ │ │ ├── Santa.java │ │ │ │ └── Toy.java │ │ │ └── test │ │ │ └── java │ │ │ └── gifts │ │ │ └── SantaTest.java │ ├── day13 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── santamarket │ │ │ │ └── model │ │ │ │ ├── ChristmasElf.java │ │ │ │ ├── Discount.java │ │ │ │ ├── Offer.java │ │ │ │ ├── Product.java │ │ │ │ ├── ProductQuantity.java │ │ │ │ ├── ProductUnit.java │ │ │ │ ├── Receipt.java │ │ │ │ ├── ReceiptItem.java │ │ │ │ ├── SantamarketCatalog.java │ │ │ │ ├── ShoppingSleigh.java │ │ │ │ └── SpecialOfferType.java │ │ │ └── test │ │ │ └── java │ │ │ └── santamarket │ │ │ └── model │ │ │ ├── FakeCatalog.java │ │ │ ├── ReceiptMatcher.java │ │ │ └── SantamarketTest.java │ ├── day14 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── children │ │ │ │ ├── ChildMapper.java │ │ │ │ ├── db2 │ │ │ │ └── X5T78.java │ │ │ │ └── dtos │ │ │ │ ├── Address.java │ │ │ │ ├── Child.java │ │ │ │ └── Gender.java │ │ │ └── test │ │ │ └── java │ │ │ └── MappingTests.java │ ├── day15 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── santaChristmasList │ │ │ │ └── operations │ │ │ │ ├── Business.java │ │ │ │ ├── dependencies │ │ │ │ ├── Factory.java │ │ │ │ ├── Inventory.java │ │ │ │ └── WishList.java │ │ │ │ └── models │ │ │ │ ├── Child.java │ │ │ │ ├── Gift.java │ │ │ │ ├── ManufacturedGift.java │ │ │ │ └── Sleigh.java │ │ │ └── test │ │ │ └── java │ │ │ └── santaChristmasList │ │ │ └── BusinessTests.java │ ├── day16 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── system │ │ │ │ ├── Elf.java │ │ │ │ └── TaskAssignment.java │ │ │ └── test │ │ │ └── java │ │ │ └── TaskAssignmentSystemTest.java │ ├── day17 │ │ ├── pom.xml │ │ └── src │ │ │ └── test │ │ │ └── java │ │ │ └── eid │ │ │ └── EIDTests.java │ ├── day18 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── game │ │ │ │ ├── Choice.java │ │ │ │ ├── Result.java │ │ │ │ ├── RockPaperScissors.java │ │ │ │ └── Winner.java │ │ │ └── test │ │ │ ├── java │ │ │ ├── RockPaperScissorsSteps.java │ │ │ └── RunCucumberTest.java │ │ │ └── resources │ │ │ └── RockPaperScissorsGame.feature │ ├── day19 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── travel │ │ │ │ └── SantaTravelCalculator.java │ │ │ └── test │ │ │ └── java │ │ │ └── CalculatorTests.java │ ├── day20 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── reindeer │ │ │ │ │ ├── ReindeerApiApplication.java │ │ │ │ │ ├── controller │ │ │ │ │ └── ReindeerController.java │ │ │ │ │ ├── model │ │ │ │ │ ├── Reindeer.java │ │ │ │ │ ├── ReindeerColor.java │ │ │ │ │ ├── ReindeerErrorCode.java │ │ │ │ │ ├── ReindeerResult.java │ │ │ │ │ ├── ReindeerToCreate.java │ │ │ │ │ └── ReindeerToCreateRequest.java │ │ │ │ │ └── service │ │ │ │ │ └── ReindeerService.java │ │ │ └── resources │ │ │ │ └── application.yml │ │ │ └── test │ │ │ └── java │ │ │ └── reindeer │ │ │ └── controller │ │ │ └── ReindeerControllerTest.java │ ├── day21 │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── tour │ │ │ ├── Step.java │ │ │ └── TourCalculator.java │ ├── day22 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── eid │ │ │ │ ├── EID.java │ │ │ │ ├── EIDBuilder.java │ │ │ │ ├── ParsingError.java │ │ │ │ ├── SerialNumber.java │ │ │ │ ├── Sex.java │ │ │ │ ├── StringExtensions.java │ │ │ │ └── Year.java │ │ │ └── test │ │ │ └── java │ │ │ └── eid │ │ │ └── EIDTests.java │ ├── day23 │ │ ├── notice.md │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ ├── app │ │ │ │ └── Main.java │ │ │ │ ├── core │ │ │ │ └── control │ │ │ │ │ ├── AmplifierType.java │ │ │ │ │ ├── ControlSystem.java │ │ │ │ │ ├── Dashboard.java │ │ │ │ │ ├── MagicPowerAmplifier.java │ │ │ │ │ ├── ReindeerPowerUnit.java │ │ │ │ │ ├── ReindeersNeedRestException.java │ │ │ │ │ ├── SleighAction.java │ │ │ │ │ ├── SleighEngineStatus.java │ │ │ │ │ └── SleighNotStartedException.java │ │ │ │ └── external │ │ │ │ ├── deer │ │ │ │ └── Reindeer.java │ │ │ │ └── stable │ │ │ │ └── MagicStable.java │ │ │ └── test │ │ │ └── java │ │ │ └── ControlSystemTest.java │ ├── day24 │ │ ├── .tcr │ │ │ ├── config.yml │ │ │ ├── language │ │ │ │ └── java.yml │ │ │ └── toolchain │ │ │ │ └── maven.yml │ │ ├── pom.xml │ │ ├── src │ │ │ ├── main │ │ │ │ └── java │ │ │ │ │ ├── domain │ │ │ │ │ ├── StockReducedEvent.java │ │ │ │ │ ├── StockUnit.java │ │ │ │ │ ├── Toy.java │ │ │ │ │ ├── ToyCreatedEvent.java │ │ │ │ │ ├── ToyRepository.java │ │ │ │ │ └── core │ │ │ │ │ │ ├── Aggregate.java │ │ │ │ │ │ ├── Error.java │ │ │ │ │ │ ├── Event.java │ │ │ │ │ │ ├── EventSourcedAggregate.java │ │ │ │ │ │ ├── RegisteredRoutes.java │ │ │ │ │ │ ├── Repository.java │ │ │ │ │ │ └── Unit.java │ │ │ │ │ └── usecases │ │ │ │ │ ├── DeliverToy.java │ │ │ │ │ └── ToyDeliveryUseCase.java │ │ │ └── test │ │ │ │ └── java │ │ │ │ └── delivery │ │ │ │ ├── Time.java │ │ │ │ ├── ToyBuilder.java │ │ │ │ ├── assertions │ │ │ │ └── ToyAssertions.java │ │ │ │ ├── doubles │ │ │ │ └── InMemoryToyRepository.java │ │ │ │ ├── unit │ │ │ │ └── CreateToyTests.java │ │ │ │ └── usecases │ │ │ │ └── ToyDeliveryTests.java │ │ └── tcrw │ ├── day25 │ │ ├── pom.xml │ │ ├── src │ │ │ └── main │ │ │ │ └── java │ │ │ │ └── timecapsule │ │ │ │ ├── Browser.java │ │ │ │ ├── Capsule.java │ │ │ │ └── Main.java │ │ └── timecapsule_template.html │ └── tcr │ │ ├── .gitignore │ │ ├── tcr.sh │ │ └── version.txt ├── kotlin │ ├── day00 │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── src │ │ │ ├── main │ │ │ └── kotlin │ │ │ │ └── email │ │ │ │ └── Encryption.kt │ │ │ └── test │ │ │ ├── kotlin │ │ │ └── email │ │ │ │ └── EncryptionTest.kt │ │ │ └── resources │ │ │ └── EncryptedEmail.txt │ ├── day01 │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── src │ │ │ ├── main │ │ │ └── kotlin │ │ │ │ └── communication │ │ │ │ ├── Logger.kt │ │ │ │ └── SantaCommunicator.kt │ │ │ └── test │ │ │ └── kotlin │ │ │ ├── SantaCommunicatorTest.kt │ │ │ └── doubles │ │ │ └── TestLogger.kt │ ├── day02 │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── src │ │ │ ├── main │ │ │ └── kotlin │ │ │ │ └── games │ │ │ │ └── FizzBuzz.kt │ │ │ └── test │ │ │ └── kotlin │ │ │ ├── FizzBuzzProperties.kt │ │ │ └── FizzBuzzTests.kt │ ├── day03 │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── src │ │ │ ├── main │ │ │ └── kotlin │ │ │ │ └── preparation │ │ │ │ ├── Gift.kt │ │ │ │ └── SantaWorkshopService.kt │ │ │ └── test │ │ │ └── kotlin │ │ │ └── SantaWorkshopServiceTest.kt │ ├── day04 │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── src │ │ │ ├── main │ │ │ └── kotlin │ │ │ │ └── routine │ │ │ │ ├── Email.kt │ │ │ │ ├── EmailService.kt │ │ │ │ ├── ReindeerFeeder.kt │ │ │ │ ├── Routine.kt │ │ │ │ ├── Schedule.kt │ │ │ │ └── ScheduleService.kt │ │ │ └── test │ │ │ └── kotlin │ │ │ └── RoutineTest.kt │ ├── day05 │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── src │ │ │ └── test │ │ │ └── kotlin │ │ │ └── EIDTest.kt │ ├── day06 │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── src │ │ │ ├── main │ │ │ └── kotlin │ │ │ │ └── workshop │ │ │ │ └── ElfWorkshop.kt │ │ │ └── test │ │ │ └── kotlin │ │ │ └── ElfWorkshopTests.kt │ ├── day07 │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── src │ │ │ ├── main │ │ │ └── kotlin │ │ │ │ └── production │ │ │ │ ├── Gift.kt │ │ │ │ └── Workshop.kt │ │ │ └── test │ │ │ └── kotlin │ │ │ └── WorkshopTests.kt │ ├── day08 │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── src │ │ │ ├── main │ │ │ └── kotlin │ │ │ │ ├── domain │ │ │ │ ├── Toy.kt │ │ │ │ └── ToyRepository.kt │ │ │ │ └── service │ │ │ │ └── ToyProductionService.kt │ │ │ └── test │ │ │ └── kotlin │ │ │ ├── ToyProductionServiceTest.kt │ │ │ └── doubles │ │ │ └── InMemoryToyRepository.kt │ ├── day09 │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── src │ │ │ ├── main │ │ │ └── kotlin │ │ │ │ └── gift │ │ │ │ ├── Behavior.kt │ │ │ │ ├── Child.kt │ │ │ │ ├── GiftRequest.kt │ │ │ │ ├── Priority.kt │ │ │ │ └── SantaService.kt │ │ │ └── test │ │ │ └── kotlin │ │ │ └── SantaServiceTests.kt │ ├── day10 │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── src │ │ │ ├── main │ │ │ └── kotlin │ │ │ │ └── delivery │ │ │ │ └── Building.kt │ │ │ └── test │ │ │ ├── kotlin │ │ │ └── DeliveryTest.kt │ │ │ └── resources │ │ │ ├── 1.txt │ │ │ ├── 2.txt │ │ │ ├── 3.txt │ │ │ ├── 4.txt │ │ │ ├── 5.txt │ │ │ └── 6.txt │ ├── day11 │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── src │ │ │ ├── main │ │ │ └── kotlin │ │ │ │ └── christmas │ │ │ │ └── Preparation.kt │ │ │ └── test │ │ │ └── kotlin │ │ │ └── PreparationTest.kt │ ├── day12 │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── src │ │ │ ├── main │ │ │ └── kotlin │ │ │ │ └── gifts │ │ │ │ ├── Child.kt │ │ │ │ ├── Santa.kt │ │ │ │ └── Toy.kt │ │ │ └── test │ │ │ └── kotlin │ │ │ └── gifts │ │ │ └── SantaTest.kt │ ├── day13 │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── src │ │ │ ├── main │ │ │ └── kotlin │ │ │ │ └── santamarket │ │ │ │ └── model │ │ │ │ ├── ChristmasElf.kt │ │ │ │ ├── Discount.kt │ │ │ │ ├── Offer.kt │ │ │ │ ├── Product.kt │ │ │ │ ├── ProductQuantity.kt │ │ │ │ ├── ProductUnit.kt │ │ │ │ ├── Receipt.kt │ │ │ │ ├── ReceiptItem.kt │ │ │ │ ├── SantamarketCatalog.kt │ │ │ │ ├── ShoppingSleigh.kt │ │ │ │ └── SpecialOfferType.kt │ │ │ └── test │ │ │ └── kotlin │ │ │ └── santamarket │ │ │ └── model │ │ │ ├── FakeCatalog.kt │ │ │ └── SantamarketTest.kt │ ├── day14 │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── src │ │ │ ├── main │ │ │ └── kotlin │ │ │ │ └── children │ │ │ │ ├── ChildMapper.kt │ │ │ │ ├── db2 │ │ │ │ └── X5T78.kt │ │ │ │ └── dtos │ │ │ │ └── Child.kt │ │ │ └── test │ │ │ └── kotlin │ │ │ └── ChildMapperTest.kt │ ├── day15 │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── src │ │ │ ├── main │ │ │ └── kotlin │ │ │ │ └── santaChristmasList │ │ │ │ └── operations │ │ │ │ ├── Business.kt │ │ │ │ ├── Dependencies.kt │ │ │ │ └── Models.kt │ │ │ └── test │ │ │ └── kotlin │ │ │ └── santaChristmasList │ │ │ └── BusinessTests.kt │ ├── day16 │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── src │ │ │ ├── main │ │ │ └── kotlin │ │ │ │ └── system │ │ │ │ └── TaskAssignment.kt │ │ │ └── test │ │ │ └── kotlin │ │ │ └── TaskAssignmentSystemTest.kt │ ├── day17 │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── src │ │ │ └── test │ │ │ └── kotlin │ │ │ └── EIDTest.kt │ ├── day18 │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── src │ │ │ ├── main │ │ │ └── kotlin │ │ │ │ └── game │ │ │ │ └── RockPaperScissors.kt │ │ │ └── test │ │ │ ├── java │ │ │ ├── RockPaperScissorsSteps.java │ │ │ └── RunCucumberTest.java │ │ │ └── resources │ │ │ └── features │ │ │ └── RockPaperScissorsGame.feature │ ├── day19 │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── src │ │ │ ├── main │ │ │ └── kotlin │ │ │ │ └── travel │ │ │ │ └── SantaTravelCalculator.kt │ │ │ └── test │ │ │ └── kotlin │ │ │ └── CalculatorTests.kt │ ├── day20 │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── src │ │ │ ├── main │ │ │ ├── kotlin │ │ │ │ └── reindeer │ │ │ │ │ ├── Application.kt │ │ │ │ │ ├── ReindeerService.kt │ │ │ │ │ └── UUIDSerializer.kt │ │ │ └── resources │ │ │ │ └── logback.xml │ │ │ └── test │ │ │ └── kotlin │ │ │ └── ReindeerControllerTests.kt │ ├── day21 │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── src │ │ │ └── main │ │ │ └── kotlin │ │ │ └── tour │ │ │ └── TourCalculator.kt │ ├── day22 │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── src │ │ │ ├── main │ │ │ └── kotlin │ │ │ │ └── eid │ │ │ │ ├── EID.kt │ │ │ │ ├── Extensions.kt │ │ │ │ ├── ParsingException.kt │ │ │ │ ├── SerialNumber.kt │ │ │ │ ├── Sex.kt │ │ │ │ └── Year.kt │ │ │ └── test │ │ │ └── kotlin │ │ │ └── EIDProperties.kt │ ├── day23 │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ └── src │ │ │ ├── main │ │ │ └── kotlin │ │ │ │ ├── app │ │ │ │ └── Main.kt │ │ │ │ ├── core │ │ │ │ └── control │ │ │ │ │ ├── AmplifierType.kt │ │ │ │ │ ├── ControlSystem.kt │ │ │ │ │ ├── Dashboard.kt │ │ │ │ │ ├── MagicPowerAmplifier.kt │ │ │ │ │ ├── ReindeerPowerUnit.kt │ │ │ │ │ ├── ReindeersNeedRestException.kt │ │ │ │ │ ├── SleighAction.kt │ │ │ │ │ ├── SleighEngineStatus.kt │ │ │ │ │ └── SleighNotStartedException.kt │ │ │ │ └── external │ │ │ │ ├── deer │ │ │ │ └── Reindeer.kt │ │ │ │ └── stable │ │ │ │ └── MagicStable.kt │ │ │ └── test │ │ │ └── kotlin │ │ │ └── ControlSystemTest.kt │ ├── day24 │ │ ├── .tcr │ │ │ ├── config.yml │ │ │ ├── language │ │ │ │ └── kotlin.yml │ │ │ └── toolchain │ │ │ │ └── gradle.yml │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ ├── src │ │ │ ├── main │ │ │ │ └── kotlin │ │ │ │ │ ├── domain │ │ │ │ │ ├── StockReducedEvent.kt │ │ │ │ │ ├── StockUnit.kt │ │ │ │ │ ├── Toy.kt │ │ │ │ │ ├── ToyCreatedEvent.kt │ │ │ │ │ ├── ToyRepository.kt │ │ │ │ │ └── core │ │ │ │ │ │ ├── Aggregate.kt │ │ │ │ │ │ ├── Error.kt │ │ │ │ │ │ ├── Event.kt │ │ │ │ │ │ ├── EventSourcedAggregate.kt │ │ │ │ │ │ ├── RegisteredRoutes.kt │ │ │ │ │ │ └── Repository.kt │ │ │ │ │ └── usecases │ │ │ │ │ ├── DeliverToy.kt │ │ │ │ │ └── ToyDeliveryUseCase.kt │ │ │ └── test │ │ │ │ └── kotlin │ │ │ │ ├── Time.kt │ │ │ │ ├── ToyBuilder.kt │ │ │ │ ├── assertions │ │ │ │ └── ToyAssertions.kt │ │ │ │ ├── doubles │ │ │ │ └── InMemoryToyRepository.kt │ │ │ │ ├── unit │ │ │ │ └── CreateToyTests.kt │ │ │ │ └── usecases │ │ │ │ └── ToyDeliveryTests.kt │ │ └── tcrw │ ├── day25 │ │ ├── build.gradle.kts │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ ├── src │ │ │ └── main │ │ │ │ └── kotlin │ │ │ │ └── timecapsule │ │ │ │ ├── Browser.kt │ │ │ │ ├── Capsule.kt │ │ │ │ └── Main.kt │ │ └── timecapsule_template.html │ └── tcr │ │ ├── .gitignore │ │ ├── tcr.sh │ │ └── version.txt ├── php │ ├── day00 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── phpunit.xml │ │ ├── src │ │ │ └── Email │ │ │ │ └── Encryption.php │ │ └── tests │ │ │ ├── EncryptionTest.php │ │ │ └── resources │ │ │ └── EncryptedEmail.txt │ ├── day01 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── phpunit.xml │ │ ├── src │ │ │ └── Communication │ │ │ │ ├── ILogger.php │ │ │ │ └── SantaCommunicator.php │ │ └── tests │ │ │ ├── SantaCommunicatorTest.php │ │ │ └── doubles │ │ │ └── TestLogger.php │ ├── day02 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── phpunit.xml │ │ ├── src │ │ │ └── Games │ │ │ │ └── FizzBuzz.php │ │ └── tests │ │ │ └── FizzBuzzTest.php │ ├── day03 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── phpunit.xml │ │ ├── src │ │ │ └── Preparation │ │ │ │ ├── Gift.php │ │ │ │ └── SantaWorkshopService.php │ │ └── tests │ │ │ └── SantaWorkshopServiceTest.php │ ├── day04 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── phpunit.xml │ │ ├── src │ │ │ └── Routine │ │ │ │ ├── Email.php │ │ │ │ ├── EmailService.php │ │ │ │ ├── ReindeerFeeder.php │ │ │ │ ├── Routine.php │ │ │ │ ├── Schedule.php │ │ │ │ └── ScheduleService.php │ │ └── tests │ │ │ └── RoutineTest.php │ ├── day05 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── phpunit.xml │ │ └── tests │ │ │ └── EIDTest.php │ ├── day06 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── phpunit.xml │ │ ├── src │ │ │ └── Workshop │ │ │ │ └── ElfWorkshop.php │ │ └── tests │ │ │ └── ElfWorkshopTest.php │ ├── day07 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── phpunit.xml │ │ ├── src │ │ │ └── Workshop │ │ │ │ ├── Gift.php │ │ │ │ ├── Status.php │ │ │ │ └── Workshop.php │ │ └── tests │ │ │ └── WorkshopTest.php │ ├── day08 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── phpunit.xml │ │ ├── src │ │ │ ├── Domain │ │ │ │ ├── Toy.php │ │ │ │ └── ToyRepository.php │ │ │ └── Services │ │ │ │ └── ToyProductionService.php │ │ └── tests │ │ │ ├── Doubles │ │ │ └── InMemoryToyRepository.php │ │ │ └── ToyProductionServiceTest.php │ ├── day09 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── phpunit.xml │ │ ├── src │ │ │ └── Gift │ │ │ │ ├── Behavior.php │ │ │ │ ├── Child.php │ │ │ │ ├── GiftRequest.php │ │ │ │ ├── Priority.php │ │ │ │ └── SantaService.php │ │ └── tests │ │ │ └── SantaServiceTest.php │ ├── day10 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── phpunit.xml │ │ ├── src │ │ │ └── Delivery │ │ │ │ └── Building.php │ │ └── tests │ │ │ ├── DeliveryTest.php │ │ │ └── deliveries │ │ │ ├── 1.txt │ │ │ ├── 2.txt │ │ │ ├── 3.txt │ │ │ ├── 4.txt │ │ │ ├── 5.txt │ │ │ └── 6.txt │ ├── day11 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── phpunit.xml │ │ ├── src │ │ │ └── Christmas │ │ │ │ ├── Preparation.php │ │ │ │ └── ToyType.php │ │ └── tests │ │ │ └── PreparationTest.php │ ├── day12 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── phpunit.xml │ │ ├── src │ │ │ └── Gifts │ │ │ │ ├── Child.php │ │ │ │ ├── Santa.php │ │ │ │ └── Toy.php │ │ └── tests │ │ │ └── PreparationTest.php │ ├── day13 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── phpunit.xml │ │ ├── src │ │ │ └── SantaMarket │ │ │ │ ├── ChristmasElf.php │ │ │ │ ├── Discount.php │ │ │ │ ├── Offer.php │ │ │ │ ├── Product.php │ │ │ │ ├── ProductQuantity.php │ │ │ │ ├── ProductUnit.php │ │ │ │ ├── Receipt.php │ │ │ │ ├── ReceiptItem.php │ │ │ │ ├── SantamarketCatalog.php │ │ │ │ ├── ShoppingSleigh.php │ │ │ │ └── SpecialOfferType.php │ │ └── tests │ │ │ ├── FakeCatalog.php │ │ │ └── SantaMarketTest.php │ ├── day14 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── phpunit.xml │ │ ├── src │ │ │ └── Children │ │ │ │ ├── ChildMapper.php │ │ │ │ ├── Db2 │ │ │ │ └── X5T78.php │ │ │ │ └── Dtos │ │ │ │ ├── Address.php │ │ │ │ ├── Child.php │ │ │ │ └── Gender.php │ │ └── tests │ │ │ └── ChildMapperTest.php │ ├── day15 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── phpunit.xml │ │ ├── src │ │ │ └── SantaChristmasList │ │ │ │ ├── Business.php │ │ │ │ ├── Dependencies │ │ │ │ ├── Factory.php │ │ │ │ ├── Inventory.php │ │ │ │ └── WishList.php │ │ │ │ └── Models │ │ │ │ ├── Child.php │ │ │ │ ├── Gift.php │ │ │ │ ├── ManufacturedGift.php │ │ │ │ └── Sleigh.php │ │ └── tests │ │ │ └── BusinessTest.php │ ├── day16 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── phpunit.xml │ │ ├── src │ │ │ └── System │ │ │ │ ├── Elf.php │ │ │ │ └── TaskAssignment.php │ │ └── tests │ │ │ └── TaskAssignmentTest.php │ ├── day17 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── phpunit.xml │ │ └── tests │ │ │ └── EIDTest.php │ ├── day18 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── features │ │ │ ├── bootstrap │ │ │ │ └── FeatureContext.php │ │ │ └── rock_paper_scissors.feature │ │ ├── phpunit.xml │ │ └── src │ │ │ └── Game │ │ │ └── RockPaperScissors.php │ ├── day19 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── phpunit.xml │ │ ├── src │ │ │ └── Travel │ │ │ │ └── SantaTravelCalculator.php │ │ └── tests │ │ │ └── CalculatorTest.php │ ├── day20 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── phpunit.xml │ │ ├── src │ │ │ ├── Controllers │ │ │ │ └── ReindeerController.php │ │ │ ├── Enums │ │ │ │ ├── ReindeerColor.php │ │ │ │ └── ReindeerErrorCode.php │ │ │ ├── Models │ │ │ │ └── Reindeer.php │ │ │ ├── Services │ │ │ │ └── ReindeerService.php │ │ │ └── index.php │ │ └── tests │ │ │ └── ReindeerTest.php │ ├── day21 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── phpunit.xml │ │ └── src │ │ │ └── Tour │ │ │ ├── Step.php │ │ │ └── TourCalculator.php │ ├── day22 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── phpunit.xml │ │ ├── src │ │ │ └── Eid │ │ │ │ ├── EID.php │ │ │ │ ├── IntFunctions.php │ │ │ │ ├── ParsingError.php │ │ │ │ ├── SerialNumber.php │ │ │ │ ├── Sex.php │ │ │ │ └── Year.php │ │ └── tests │ │ │ ├── EIDTest.php │ │ │ └── Mutator.php │ ├── day23 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── phpunit.xml │ │ ├── src │ │ │ ├── App │ │ │ │ └── Main.php │ │ │ ├── Core │ │ │ │ └── Control │ │ │ │ │ ├── AmplifierType.php │ │ │ │ │ ├── ControlSystem.php │ │ │ │ │ ├── Dashboard.php │ │ │ │ │ ├── MagicPowerAmplifier.php │ │ │ │ │ ├── ReindeerPowerUnit.php │ │ │ │ │ ├── ReindeersNeedRestException.php │ │ │ │ │ ├── SleighAction.php │ │ │ │ │ ├── SleighEngineStatus.php │ │ │ │ │ └── SleighNotStartedException.php │ │ │ └── External │ │ │ │ ├── Deer │ │ │ │ └── Reindeer.php │ │ │ │ └── Stable │ │ │ │ └── MagicStable.php │ │ └── tests │ │ │ └── ControlSystemTest.php │ ├── day24 │ │ ├── .tcr │ │ │ ├── config.yml │ │ │ ├── language │ │ │ │ └── php.yml │ │ │ └── toolchain │ │ │ │ └── phpunit.yml │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── phpunit.xml │ │ ├── src │ │ │ └── Delivery │ │ │ │ ├── Domain │ │ │ │ ├── Core │ │ │ │ │ ├── Event.php │ │ │ │ │ ├── EventSourcedAggregate.php │ │ │ │ │ ├── IAggregate.php │ │ │ │ │ └── RegisteredRoutes.php │ │ │ │ ├── IToyRepository.php │ │ │ │ ├── StockReducedEvent.php │ │ │ │ ├── StockUnit.php │ │ │ │ ├── Toy.php │ │ │ │ └── ToyCreatedEvent.php │ │ │ │ └── UseCases │ │ │ │ ├── DeliverToy.php │ │ │ │ └── ToyDeliveryUseCase.php │ │ ├── tcrw │ │ └── tests │ │ │ ├── Doubles │ │ │ └── InMemoryToyRepository.php │ │ │ ├── Time.php │ │ │ ├── Unit │ │ │ └── CreateToyTest.php │ │ │ └── UseCases │ │ │ └── ToyDeliveryTest.php │ ├── day25 │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── phpunit.xml │ │ └── src │ │ │ └── TimeCapsule │ │ │ ├── Browser.php │ │ │ ├── Capsule.php │ │ │ ├── index.php │ │ │ └── timecapsule_template.html │ └── tcr │ │ ├── .gitignore │ │ ├── tcr.sh │ │ └── version.txt ├── python │ ├── day00 │ │ ├── encryption_email │ │ │ ├── __init__.py │ │ │ └── encryption.py │ │ ├── requirements.txt │ │ ├── setup.py │ │ └── tests │ │ │ ├── __init__.py │ │ │ ├── resources │ │ │ └── EncryptedEmail.txt │ │ │ ├── test_email.py │ │ │ └── utils.py │ ├── day01 │ │ ├── communication │ │ │ ├── __init__.py │ │ │ ├── logger.py │ │ │ └── santa_communicator.py │ │ ├── requirements.txt │ │ ├── setup.py │ │ └── tests │ │ │ ├── __init__.py │ │ │ ├── doubles │ │ │ └── logger.py │ │ │ └── test_SantaCommunicator.py │ ├── day02 │ │ ├── games │ │ │ ├── __init__.py │ │ │ └── fizz_buzz.py │ │ ├── requirements.txt │ │ ├── setup.py │ │ └── tests │ │ │ ├── ValidInput.py │ │ │ ├── __init__.py │ │ │ ├── test_fizz_buzz.py │ │ │ └── test_fizz_buzz_properties.py │ ├── day03 │ │ ├── preparation │ │ │ ├── Gift.py │ │ │ ├── SantaWorkshopService.py │ │ │ └── __init__.py │ │ ├── requirements.txt │ │ ├── setup.py │ │ └── tests │ │ │ ├── __init__.py │ │ │ └── test_SantaWorkshopService.py │ ├── day04 │ │ ├── requirements.txt │ │ ├── routine │ │ │ ├── __init__.py │ │ │ └── routine.py │ │ ├── setup.py │ │ └── tests │ │ │ ├── __init__.py │ │ │ └── test_routine.py │ ├── day05 │ │ ├── requirements.txt │ │ ├── setup.py │ │ └── tests │ │ │ └── test_eid.py │ ├── day06 │ │ ├── requirements.txt │ │ ├── setup.py │ │ ├── tests │ │ │ ├── __init__.py │ │ │ └── test_workshop.py │ │ └── workshop │ │ │ ├── __init__.py │ │ │ └── elf_workshop.py │ ├── day07 │ │ ├── production │ │ │ ├── __init__.py │ │ │ └── workshop.py │ │ ├── requirements.txt │ │ ├── setup.py │ │ └── tests │ │ │ ├── __init__.py │ │ │ └── test_workshop.py │ ├── day08 │ │ ├── domain │ │ │ ├── __init__.py │ │ │ └── toy.py │ │ ├── requirements.txt │ │ ├── service │ │ │ ├── __init__.py │ │ │ └── toy_service.py │ │ ├── setup.py │ │ └── tests │ │ │ ├── __init__.py │ │ │ ├── doubles.py │ │ │ └── test_toy.py │ ├── day09 │ │ ├── domain │ │ │ ├── __init__.py │ │ │ └── gift.py │ │ ├── requirements.txt │ │ ├── setup.py │ │ └── tests │ │ │ ├── __init__.py │ │ │ └── test_gift.py │ ├── day10 │ │ ├── delivery │ │ │ ├── __init__.py │ │ │ └── building.py │ │ ├── requirements.txt │ │ ├── setup.py │ │ └── tests │ │ │ ├── 1.txt │ │ │ ├── 2.txt │ │ │ ├── 3.txt │ │ │ ├── 4.txt │ │ │ ├── 5.txt │ │ │ ├── 6.txt │ │ │ ├── __init__.py │ │ │ └── test_building.py │ ├── day11 │ │ ├── christmas │ │ │ ├── __init__.py │ │ │ └── building.py │ │ ├── requirements.txt │ │ ├── setup.py │ │ └── tests │ │ │ ├── __init__.py │ │ │ └── test_building.py │ ├── day12 │ │ ├── gifts │ │ │ ├── __init__.py │ │ │ └── gifts.py │ │ ├── requirements.txt │ │ ├── setup.py │ │ └── tests │ │ │ ├── __init__.py │ │ │ └── test_gifts.py │ ├── day13 │ │ ├── model │ │ │ ├── __init__.py │ │ │ ├── christmas_elf.py │ │ │ ├── discount.py │ │ │ ├── offer.py │ │ │ ├── product.py │ │ │ ├── receipt.py │ │ │ ├── receipt_item.py │ │ │ ├── santamarket_catalog.py │ │ │ ├── shopping_sleigh.py │ │ │ └── special_offer_type.py │ │ ├── requirements.txt │ │ ├── setup.py │ │ └── tests │ │ │ ├── __init__.py │ │ │ ├── fake_catalog.py │ │ │ └── test_santamarket.py │ ├── day14 │ │ ├── children │ │ │ ├── __init__.py │ │ │ ├── db2.py │ │ │ ├── dtos.py │ │ │ └── mapper.py │ │ ├── requirements.txt │ │ ├── setup.py │ │ └── tests │ │ │ ├── __init__.py │ │ │ └── test_mapper.py │ ├── day15 │ │ ├── requirements.txt │ │ ├── santaChristmasList │ │ │ ├── Business.py │ │ │ └── __init__.py │ │ ├── setup.py │ │ └── tests │ │ │ ├── __init__.py │ │ │ └── test_business.py │ ├── day16 │ │ ├── requirements.txt │ │ ├── setup.py │ │ ├── system │ │ │ ├── __init__.py │ │ │ └── system.py │ │ └── tests │ │ │ ├── __init__.py │ │ │ └── test_system.py │ ├── day17 │ │ ├── requirements.txt │ │ ├── setup.py │ │ └── tests │ │ │ ├── __init__.py │ │ │ └── test_eid.py │ ├── day18 │ │ ├── features │ │ │ ├── __init__.py │ │ │ ├── rock_paper_scissors.feature │ │ │ └── steps │ │ │ │ └── steps.py │ │ ├── game │ │ │ ├── __init__.py │ │ │ └── game.py │ │ ├── requirements.txt │ │ └── setup.py │ ├── day19 │ │ ├── requirements.txt │ │ ├── setup.py │ │ ├── tests │ │ │ ├── __init__.py │ │ │ └── test_travel.py │ │ └── travel │ │ │ ├── SantaTravelCalculator.py │ │ │ └── __init__.py │ ├── day20 │ │ ├── db.sqlite3 │ │ ├── manage.py │ │ ├── pytest.ini │ │ ├── reindeer │ │ │ ├── __init__.py │ │ │ ├── apps.py │ │ │ ├── models.py │ │ │ ├── service.py │ │ │ ├── urls.py │ │ │ └── views.py │ │ ├── reindeer_service │ │ │ ├── __init__.py │ │ │ ├── settings.py │ │ │ ├── urls.py │ │ │ └── wsgi.py │ │ ├── requirements.txt │ │ ├── setup.py │ │ └── tests │ │ │ ├── __init__.py │ │ │ └── test_reindeer.py │ ├── day21 │ │ ├── requirements.txt │ │ ├── setup.py │ │ └── tour │ │ │ ├── __init__.py │ │ │ └── tour.py │ ├── day22 │ │ ├── eid │ │ │ ├── __init__.py │ │ │ ├── eid.py │ │ │ ├── parsing.py │ │ │ ├── parsing_error.py │ │ │ ├── serial_number.py │ │ │ ├── sex.py │ │ │ └── year.py │ │ ├── requirements.txt │ │ ├── setup.py │ │ └── tests │ │ │ ├── __init__.py │ │ │ └── test_eid.py │ ├── day23 │ │ ├── app │ │ │ └── main.py │ │ ├── core │ │ │ ├── __init__.py │ │ │ └── control.py │ │ ├── external │ │ │ ├── __init__.py │ │ │ ├── deer.py │ │ │ └── stable.py │ │ ├── requirements.txt │ │ ├── setup.py │ │ └── tests │ │ │ ├── __init__.py │ │ │ └── test_control_system.py │ ├── day24 │ │ ├── .tcr │ │ │ ├── config.yml │ │ │ ├── language │ │ │ │ └── python.yml │ │ │ └── toolchain │ │ │ │ └── pytest.yml │ │ ├── domain │ │ │ ├── __init__.py │ │ │ ├── core │ │ │ │ ├── __init__.py │ │ │ │ ├── aggregate.py │ │ │ │ ├── error.py │ │ │ │ ├── event.py │ │ │ │ ├── event_sourced_aggregate.py │ │ │ │ └── registered_routes.py │ │ │ ├── stock_reduced_event.py │ │ │ ├── stock_unit.py │ │ │ ├── toy.py │ │ │ ├── toy_created_event.py │ │ │ └── toy_repository.py │ │ ├── requirements.txt │ │ ├── setup.py │ │ ├── tcrw │ │ ├── tests │ │ │ ├── __init__.py │ │ │ ├── builder.py │ │ │ ├── doubles.py │ │ │ ├── test_toy_creation.py │ │ │ ├── test_toy_use_case.py │ │ │ └── time.py │ │ └── usecases │ │ │ ├── __init__.py │ │ │ ├── deliver_toy.py │ │ │ └── toy_delivery_use_case.py │ ├── day25 │ │ ├── setup.py │ │ └── time_capsule │ │ │ ├── __init__.py │ │ │ ├── capsule.py │ │ │ ├── main.py │ │ │ └── timecapsule_template.html │ └── tcr │ │ ├── .gitignore │ │ ├── tcr.sh │ │ └── version.txt ├── scala │ ├── day00 │ │ ├── build.sbt │ │ ├── project │ │ │ └── build.properties │ │ └── src │ │ │ ├── main │ │ │ └── scala │ │ │ │ └── email │ │ │ │ └── Encryption.scala │ │ │ └── test │ │ │ ├── resources │ │ │ └── EncryptedEmail.txt │ │ │ └── scala │ │ │ └── EncryptionSpec.scala │ ├── day01 │ │ ├── build.sbt │ │ ├── project │ │ │ └── build.properties │ │ └── src │ │ │ ├── main │ │ │ └── scala │ │ │ │ └── communication │ │ │ │ ├── Logger.scala │ │ │ │ └── SantaCommunicator.scala │ │ │ └── test │ │ │ └── scala │ │ │ ├── SantaCommunicatorSpec.scala │ │ │ └── doubles │ │ │ └── TestLogger.scala │ ├── day02 │ │ ├── build.sbt │ │ ├── project │ │ │ └── build.properties │ │ └── src │ │ │ ├── main │ │ │ └── scala │ │ │ │ └── games │ │ │ │ └── FizzBuzz.scala │ │ │ └── test │ │ │ └── scala │ │ │ ├── FizzBuzzProperties.scala │ │ │ └── FizzBuzzTests.scala │ ├── day03 │ │ ├── build.sbt │ │ ├── project │ │ │ └── build.properties │ │ └── src │ │ │ ├── main │ │ │ └── scala │ │ │ │ └── preparation │ │ │ │ ├── Gift.scala │ │ │ │ └── SantaWorkshopService.scala │ │ │ └── test │ │ │ └── scala │ │ │ └── SantaWorkshopServiceSpec.scala │ ├── day04 │ │ ├── build.sbt │ │ ├── project │ │ │ └── build.properties │ │ └── src │ │ │ ├── main │ │ │ └── scala │ │ │ │ └── routine │ │ │ │ ├── Email.scala │ │ │ │ ├── EmailService.scala │ │ │ │ ├── ReindeerFeeder.scala │ │ │ │ ├── Routine.scala │ │ │ │ ├── Schedule.scala │ │ │ │ └── ScheduleService.scala │ │ │ └── test │ │ │ └── scala │ │ │ └── RoutineSpec.scala │ ├── day05 │ │ ├── build.sbt │ │ ├── project │ │ │ └── build.properties │ │ └── src │ │ │ └── test │ │ │ └── scala │ │ │ └── EIDSpec.scala │ ├── day06 │ │ ├── build.sbt │ │ ├── project │ │ │ └── build.properties │ │ └── src │ │ │ ├── main │ │ │ └── scala │ │ │ │ └── workshop │ │ │ │ └── ElfWorkshop.scala │ │ │ └── test │ │ │ └── scala │ │ │ └── ElfWorkshopSpec.scala │ ├── day07 │ │ ├── build.sbt │ │ ├── project │ │ │ └── build.properties │ │ └── src │ │ │ ├── main │ │ │ └── scala │ │ │ │ └── production │ │ │ │ └── Workshop.scala │ │ │ └── test │ │ │ └── scala │ │ │ └── WorkshopSpec.scala │ ├── day08 │ │ ├── build.sbt │ │ ├── project │ │ │ └── build.properties │ │ └── src │ │ │ ├── main │ │ │ └── scala │ │ │ │ ├── domain │ │ │ │ ├── Toy.scala │ │ │ │ └── ToyRepository.scala │ │ │ │ └── service │ │ │ │ └── ToyProductionService.scala │ │ │ └── test │ │ │ └── scala │ │ │ ├── ToyProductionServiceSpec.scala │ │ │ └── doubles │ │ │ └── InMemoryToyRepository.scala │ ├── day09 │ │ ├── build.sbt │ │ ├── project │ │ │ └── build.properties │ │ └── src │ │ │ ├── main │ │ │ └── scala │ │ │ │ └── gift │ │ │ │ ├── Behavior.scala │ │ │ │ ├── Child.scala │ │ │ │ ├── GiftRequest.scala │ │ │ │ ├── Priority.scala │ │ │ │ └── SantaService.scala │ │ │ └── test │ │ │ └── scala │ │ │ └── SantaServiceSpec.scala │ ├── day10 │ │ ├── build.sbt │ │ ├── project │ │ │ └── build.properties │ │ └── src │ │ │ ├── main │ │ │ └── scala │ │ │ │ └── delivery │ │ │ │ └── Building.scala │ │ │ └── test │ │ │ ├── resources │ │ │ ├── 1.txt │ │ │ ├── 2.txt │ │ │ ├── 3.txt │ │ │ ├── 4.txt │ │ │ ├── 5.txt │ │ │ └── 6.txt │ │ │ └── scala │ │ │ └── DeliverySpec.scala │ ├── day11 │ │ ├── build.sbt │ │ ├── project │ │ │ ├── build.properties │ │ │ └── plugins.sbt │ │ └── src │ │ │ ├── main │ │ │ └── scala │ │ │ │ └── christmas │ │ │ │ └── Preparation.scala │ │ │ └── test │ │ │ └── scala │ │ │ └── PreparationSpec.scala │ ├── day12 │ │ ├── build.sbt │ │ ├── project │ │ │ ├── build.properties │ │ │ └── plugins.sbt │ │ └── src │ │ │ ├── main │ │ │ └── scala │ │ │ │ └── gifts │ │ │ │ └── Santa.scala │ │ │ └── test │ │ │ └── scala │ │ │ └── SantaSpec.scala │ ├── day13 │ │ ├── build.sbt │ │ ├── project │ │ │ ├── build.properties │ │ │ └── plugins.sbt │ │ └── src │ │ │ ├── main │ │ │ └── scala │ │ │ │ └── santamarket │ │ │ │ └── model │ │ │ │ ├── ChristmasElf.scala │ │ │ │ ├── Discount.scala │ │ │ │ ├── Offer.scala │ │ │ │ ├── Product.scala │ │ │ │ ├── ProductQuantity.scala │ │ │ │ ├── ProductUnit.scala │ │ │ │ ├── Receipt.scala │ │ │ │ ├── ReceiptItem.scala │ │ │ │ ├── SantamarketCatalog.scala │ │ │ │ ├── ShoppingSleigh.scala │ │ │ │ └── SpecialOfferType.scala │ │ │ └── test │ │ │ └── scala │ │ │ └── santamarket │ │ │ └── model │ │ │ ├── FakeCatalog.scala │ │ │ └── SantaMarketSpec.scala │ ├── day14 │ │ ├── build.sbt │ │ ├── project │ │ │ └── build.properties │ │ └── src │ │ │ ├── main │ │ │ └── scala │ │ │ │ └── children │ │ │ │ ├── ChildMapper.scala │ │ │ │ ├── db2 │ │ │ │ └── X5T78.scala │ │ │ │ └── dtos │ │ │ │ └── Child.scala │ │ │ └── test │ │ │ └── scala │ │ │ └── ChildMapperSpec.scala │ ├── day15 │ │ ├── build.sbt │ │ ├── project │ │ │ └── build.properties │ │ └── src │ │ │ ├── main │ │ │ └── scala │ │ │ │ └── santaChristmasList │ │ │ │ └── operations │ │ │ │ ├── Business.scala │ │ │ │ ├── Dependencies.scala │ │ │ │ └── Models.scala │ │ │ └── test │ │ │ └── scala │ │ │ └── BusinessSpec.scala │ ├── day16 │ │ ├── build.sbt │ │ ├── project │ │ │ └── build.properties │ │ └── src │ │ │ ├── main │ │ │ └── scala │ │ │ │ └── system │ │ │ │ └── TaskAssignment.scala │ │ │ └── test │ │ │ └── scala │ │ │ └── TaskAssignmentSystemSpec.scala │ ├── day17 │ │ ├── build.sbt │ │ ├── project │ │ │ └── build.properties │ │ └── src │ │ │ └── test │ │ │ └── scala │ │ │ └── EIDSpec.scala │ ├── day18 │ │ ├── build.sbt │ │ ├── project │ │ │ └── build.properties │ │ └── src │ │ │ ├── main │ │ │ └── scala │ │ │ │ └── game │ │ │ │ └── RockPaperScissors.scala │ │ │ └── test │ │ │ ├── resources │ │ │ └── features │ │ │ │ └── RockPaperScissorsGame.feature │ │ │ └── scala │ │ │ ├── RockPaperScissorsSteps.scala │ │ │ └── RunCucumberTest.scala │ ├── day19 │ │ ├── build.sbt │ │ ├── project │ │ │ └── build.properties │ │ └── src │ │ │ ├── main │ │ │ └── scala │ │ │ │ └── travel │ │ │ │ └── SantaTravelCalculator.scala │ │ │ └── test │ │ │ └── scala │ │ │ └── TravelCalculatorSpec.scala │ ├── day20 │ │ ├── app │ │ │ ├── controllers │ │ │ │ └── ReindeerController.scala │ │ │ └── reindeer │ │ │ │ └── ReindeerService.scala │ │ ├── build.sbt │ │ ├── conf │ │ │ ├── logback.xml │ │ │ └── routes │ │ ├── project │ │ │ ├── build.properties │ │ │ └── plugins.sbt │ │ └── test │ │ │ └── controllers │ │ │ └── ReindeerSpec.scala │ ├── day21 │ │ ├── build.sbt │ │ ├── project │ │ │ └── build.properties │ │ └── src │ │ │ └── main │ │ │ └── scala │ │ │ └── tour │ │ │ └── TourCalculator.scala │ ├── day22 │ │ ├── build.sbt │ │ ├── project │ │ │ └── build.properties │ │ └── src │ │ │ ├── main │ │ │ └── scala │ │ │ │ └── eid │ │ │ │ ├── EID.scala │ │ │ │ ├── Extensions.scala │ │ │ │ ├── ParsingError.scala │ │ │ │ ├── SerialNumber.scala │ │ │ │ ├── Sex.scala │ │ │ │ └── Year.scala │ │ │ └── test │ │ │ └── scala │ │ │ ├── EIDProperties.scala │ │ │ ├── EIDTests.scala │ │ │ └── Generators.scala │ ├── day23 │ │ ├── build.sbt │ │ ├── project │ │ │ └── build.properties │ │ └── src │ │ │ ├── main │ │ │ └── scala │ │ │ │ ├── app │ │ │ │ └── Main.scala │ │ │ │ ├── core │ │ │ │ └── control │ │ │ │ │ ├── AmplifierType.scala │ │ │ │ │ ├── ControlSystem.scala │ │ │ │ │ ├── Dashboard.scala │ │ │ │ │ ├── MagicPowerAmplifier.scala │ │ │ │ │ ├── ReindeerPowerUnit.scala │ │ │ │ │ ├── ReindeersNeedRestException.scala │ │ │ │ │ ├── SleighAction.scala │ │ │ │ │ ├── SleighEngineStatus.scala │ │ │ │ │ └── SleighNotStartedException.scala │ │ │ │ └── external │ │ │ │ ├── deer │ │ │ │ └── Reindeer.scala │ │ │ │ └── stable │ │ │ │ └── MagicStable.scala │ │ │ └── test │ │ │ └── scala │ │ │ └── ControlSystemSpec.scala │ ├── day24 │ │ ├── .tcr │ │ │ ├── config.yml │ │ │ ├── language │ │ │ │ └── scala.yml │ │ │ └── toolchain │ │ │ │ └── sbt.yml │ │ ├── build.sbt │ │ ├── project │ │ │ └── build.properties │ │ ├── src │ │ │ ├── main │ │ │ │ └── scala │ │ │ │ │ ├── communication │ │ │ │ │ ├── Logger.scala │ │ │ │ │ └── SantaCommunicator.scala │ │ │ │ │ ├── domain │ │ │ │ │ ├── StockReducedEvent.scala │ │ │ │ │ ├── StockUnit.scala │ │ │ │ │ ├── Toy.scala │ │ │ │ │ ├── ToyCreatedEvent.scala │ │ │ │ │ ├── ToyRepository.scala │ │ │ │ │ └── core │ │ │ │ │ │ ├── Aggregate.scala │ │ │ │ │ │ ├── Error.scala │ │ │ │ │ │ ├── Event.scala │ │ │ │ │ │ ├── EventSourcedAggregate.scala │ │ │ │ │ │ ├── Extensions.scala │ │ │ │ │ │ ├── RegisteredRoutes.scala │ │ │ │ │ │ └── Repository.scala │ │ │ │ │ └── usecases │ │ │ │ │ ├── DeliverToy.scala │ │ │ │ │ └── ToyDeliveryUseCase.scala │ │ │ └── test │ │ │ │ └── scala │ │ │ │ ├── SantaCommunicatorSpec.scala │ │ │ │ ├── Time.scala │ │ │ │ ├── assertions │ │ │ │ └── ToyAssertions.scala │ │ │ │ ├── doubles │ │ │ │ ├── InMemoryToyRepository.scala │ │ │ │ └── TestLogger.scala │ │ │ │ ├── unit │ │ │ │ └── CreateToySpec.scala │ │ │ │ └── usecases │ │ │ │ ├── ToyBuilder.scala │ │ │ │ └── ToyDeliverySpec.scala │ │ └── tcrw │ ├── day25 │ │ ├── build.sbt │ │ ├── project │ │ │ └── build.properties │ │ ├── src │ │ │ └── main │ │ │ │ └── scala │ │ │ │ └── timecapsule │ │ │ │ ├── Capsule.scala │ │ │ │ └── Main.scala │ │ └── timecapsule_template.html │ └── tcr │ │ ├── .gitignore │ │ ├── tcr.sh │ │ └── version.txt └── ts │ ├── day00 │ ├── jest.config.js │ ├── package-lock.json │ ├── package.json │ ├── src │ │ └── encryption.ts │ ├── tests │ │ ├── encryption.spec.ts │ │ ├── resources │ │ │ └── EncryptedEmail.txt │ │ └── utils.ts │ └── tsconfig.json │ ├── day01 │ ├── jest.config.js │ ├── package-lock.json │ ├── package.json │ ├── src │ │ ├── logger.ts │ │ └── santaCommunicator.ts │ ├── tests │ │ ├── doubles │ │ │ └── testLogger.ts │ │ └── santaCommunicator.spec.ts │ └── tsconfig.json │ ├── day02 │ ├── jest.config.js │ ├── package-lock.json │ ├── package.json │ ├── src │ │ └── fizzbuzz.ts │ ├── tests │ │ └── fizzbuzz.spec.ts │ └── tsconfig.json │ ├── day03 │ ├── jest.config.js │ ├── package-lock.json │ ├── package.json │ ├── src │ │ ├── gift.ts │ │ └── santaWorkshopService.ts │ ├── tests │ │ └── santaWorkshopService.spec.ts │ └── tsconfig.json │ ├── day04 │ ├── jest.config.js │ ├── package-lock.json │ ├── package.json │ ├── src │ │ └── routine │ │ │ ├── email.ts │ │ │ ├── emailService.ts │ │ │ ├── reindeerFeeder.ts │ │ │ ├── routine.ts │ │ │ ├── schedule.ts │ │ │ └── scheduleService.ts │ ├── tests │ │ └── routine.spec.ts │ └── tsconfig.json │ ├── day05 │ ├── jest.config.js │ ├── package-lock.json │ ├── package.json │ ├── tests │ │ └── eid.spec.ts │ └── tsconfig.json │ ├── day06 │ ├── jest.config.js │ ├── package-lock.json │ ├── package.json │ ├── src │ │ └── elfWorkshop.ts │ ├── tests │ │ └── elfWorkshop.spec.ts │ └── tsconfig.json │ ├── day07 │ ├── jest.config.js │ ├── package-lock.json │ ├── package.json │ ├── src │ │ └── workshop │ │ │ ├── gift.ts │ │ │ ├── status.ts │ │ │ └── workshop.ts │ ├── tests │ │ └── workshop.spec.ts │ └── tsconfig.json │ ├── day08 │ ├── jest.config.js │ ├── package-lock.json │ ├── package.json │ ├── src │ │ ├── domain │ │ │ ├── toy.ts │ │ │ └── toyRepository.ts │ │ └── services │ │ │ └── toyProductionService.ts │ ├── tests │ │ ├── doubles │ │ │ └── inMemoryToyRepository.ts │ │ └── toyProductionService.spec.ts │ └── tsconfig.json │ ├── day09 │ ├── jest.config.js │ ├── package-lock.json │ ├── package.json │ ├── src │ │ ├── behavior.ts │ │ ├── child.ts │ │ ├── giftRequest.ts │ │ ├── priority.ts │ │ └── santaService.ts │ ├── tests │ │ └── santa.analysis.spec.ts │ └── tsconfig.json │ ├── day10 │ ├── jest.config.js │ ├── package-lock.json │ ├── package.json │ ├── src │ │ └── delivery │ │ │ └── building.ts │ ├── tests │ │ ├── deliveries │ │ │ ├── 1.txt │ │ │ ├── 2.txt │ │ │ ├── 3.txt │ │ │ ├── 4.txt │ │ │ ├── 5.txt │ │ │ └── 6.txt │ │ └── delivery.spec.ts │ └── tsconfig.json │ ├── day11 │ ├── jest.config.js │ ├── package-lock.json │ ├── package.json │ ├── src │ │ └── christmas │ │ │ ├── preparation.ts │ │ │ └── toyType.ts │ ├── tests │ │ └── preparation.spec.ts │ └── tsconfig.json │ ├── day12 │ ├── jest.config.js │ ├── package-lock.json │ ├── package.json │ ├── src │ │ └── gifts │ │ │ ├── Child.ts │ │ │ ├── Santa.ts │ │ │ └── Toy.ts │ ├── tests │ │ └── santa.spec.ts │ └── tsconfig.json │ ├── day13 │ ├── jest.config.js │ ├── package-lock.json │ ├── package.json │ ├── src │ │ └── santamarket.model │ │ │ ├── ChristmasElf.ts │ │ │ ├── Discount.ts │ │ │ ├── Offer.ts │ │ │ ├── Product.ts │ │ │ ├── ProductUnit.ts │ │ │ ├── Receipt.ts │ │ │ ├── ReceiptItem.ts │ │ │ ├── SantamarketCatalog.ts │ │ │ ├── ShoppingSleigh.ts │ │ │ └── SpecialOfferType.ts │ ├── tests │ │ ├── FakeCatalog.ts │ │ └── preparation.spec.ts │ └── tsconfig.json │ ├── day14 │ ├── jest.config.js │ ├── package-lock.json │ ├── package.json │ ├── src │ │ └── children │ │ │ ├── childMapper.ts │ │ │ ├── db2 │ │ │ └── x5T78.ts │ │ │ └── dtos │ │ │ └── child.ts │ ├── tests │ │ └── mapping.spec.ts │ └── tsconfig.json │ ├── day15 │ ├── jest.config.js │ ├── package-lock.json │ ├── package.json │ ├── src │ │ ├── business.ts │ │ ├── dependencies.ts │ │ └── models.ts │ ├── tests │ │ └── business.spec.ts │ └── tsconfig.json │ ├── day16 │ ├── jest.config.js │ ├── package-lock.json │ ├── package.json │ ├── src │ │ ├── elf.ts │ │ └── taskAssignmentSystem.ts │ ├── tests │ │ └── taskAssignmentSystem.spec.ts │ └── tsconfig.json │ ├── day17 │ ├── jest.config.js │ ├── package-lock.json │ ├── package.json │ ├── tests │ │ └── eid.spec.ts │ └── tsconfig.json │ ├── day18 │ ├── cucumber.js │ ├── features │ │ ├── rockPaperScissors.feature │ │ └── step_definitions │ │ │ └── rockPapersScissorsSteps.ts │ ├── package-lock.json │ ├── package.json │ ├── src │ │ └── rockPaperScissors.ts │ └── tsconfig.json │ ├── day19 │ ├── jest.config.js │ ├── package-lock.json │ ├── package.json │ ├── src │ │ └── travel │ │ │ └── santaTravelCalculator.ts │ ├── tests │ │ └── calculator.spec.ts │ └── tsconfig.json │ ├── day20 │ ├── jest.config.js │ ├── package-lock.json │ ├── package.json │ ├── src │ │ ├── index.ts │ │ ├── service.ts │ │ └── types.ts │ ├── tests │ │ └── reindeer.spec.ts │ └── tsconfig.json │ ├── day21 │ ├── jest.config.js │ ├── package-lock.json │ ├── package.json │ ├── src │ │ └── tour │ │ │ └── tourCalculator.ts │ └── tsconfig.json │ ├── day22 │ ├── jest.config.js │ ├── package-lock.json │ ├── package.json │ ├── src │ │ └── eid │ │ │ ├── eid.ts │ │ │ ├── parsingException.ts │ │ │ ├── serialNumber.ts │ │ │ ├── sex.ts │ │ │ └── year.ts │ ├── tests │ │ └── eid.spec.ts │ └── tsconfig.json │ ├── day23 │ ├── jest.config.js │ ├── package-lock.json │ ├── package.json │ ├── src │ │ ├── app │ │ │ └── main.ts │ │ ├── control.core │ │ │ ├── amplifierType.ts │ │ │ ├── controlSystem.ts │ │ │ ├── dashboard.ts │ │ │ ├── enums.ts │ │ │ ├── exceptions.ts │ │ │ ├── magicPowerAmplifier.ts │ │ │ └── reindeerPowerUnit.ts │ │ └── external │ │ │ ├── deer │ │ │ └── reindeer.ts │ │ │ └── stable │ │ │ └── magicStable.ts │ ├── tests │ │ └── test_control_system.test.ts │ └── tsconfig.json │ ├── day24 │ ├── .tcr │ │ ├── config.yml │ │ ├── language │ │ │ └── typescript.yml │ │ └── toolchain │ │ │ └── yarn.yml │ ├── jest.config.js │ ├── package-lock.json │ ├── package.json │ ├── src │ │ ├── domain │ │ │ ├── IToyRepository.ts │ │ │ ├── StockReducedEvent.ts │ │ │ ├── StockUnit.ts │ │ │ ├── Toy.ts │ │ │ ├── ToyCreatedEvent.ts │ │ │ └── core │ │ │ │ ├── DomainError.ts │ │ │ │ ├── Event.ts │ │ │ │ ├── EventSourcedAggregate.ts │ │ │ │ ├── IAggregate.ts │ │ │ │ ├── IEvent.ts │ │ │ │ └── Unit.ts │ │ └── usecases │ │ │ ├── DeliverToy.ts │ │ │ └── ToyDeliveryUseCase.ts │ ├── tcrw │ ├── tests │ │ ├── Time.ts │ │ ├── ToyBuilder.ts │ │ ├── doubles │ │ │ └── InMemoryToyRepository.ts │ │ ├── fp.extensions.ts │ │ ├── unit │ │ │ └── CreateToy.spec.ts │ │ └── usecases │ │ │ └── ToyDelivery.spec.ts │ ├── tsconfig.json │ └── yarn.lock │ ├── day25 │ ├── package-lock.json │ ├── package.json │ ├── src │ │ ├── browser.ts │ │ ├── capsule.ts │ │ ├── main.ts │ │ └── timecapsule_template.html │ └── tsconfig.json │ └── tcr │ ├── .gitignore │ ├── tcr.sh │ └── version.txt ├── img ├── advent-of-craft.webp ├── calendar-banner.webp ├── north-star-solutions.webp ├── proposed-solution.webp ├── site.webp └── video.webp ├── learning-paths ├── clean-testing.md ├── design.md ├── functional-programming.md ├── mindset.md ├── refactoring.md └── tdd.md └── solution ├── day00 ├── Email.Tests │ ├── Email.Tests.csproj │ ├── EncryptedEmail.txt │ ├── EncryptionTests.cs │ └── FileUtils.cs ├── Email.sln └── Email │ ├── Configuration.cs │ ├── Email.csproj │ └── Encryption.cs ├── day01 ├── pom.xml └── src │ ├── main │ └── java │ │ └── communication │ │ ├── Configuration.java │ │ ├── Logger.java │ │ ├── Reindeer.java │ │ └── SantaCommunicator.java │ └── test │ └── java │ ├── SantaCommunicatorTest.java │ └── doubles │ └── TestLogger.java ├── day02 ├── build.gradle.kts ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── src │ ├── main │ └── kotlin │ │ └── games │ │ └── FizzBuzz.kt │ └── test │ └── kotlin │ ├── Configuration.kt │ ├── FizzBuzzProperties.kt │ └── FizzBuzzTests.kt ├── day03 ├── pom.xml └── src │ ├── main │ └── java │ │ └── preparation │ │ ├── Gift.java │ │ └── SantaWorkshopService.java │ └── test │ └── java │ └── preparation │ └── SantaWorkshopServiceTest.java ├── day04 ├── MorningRoutine.sln ├── Routine.Tests │ ├── Fakes │ │ ├── EmailService.cs │ │ ├── ReindeerFeeder.cs │ │ └── ScheduleService.cs │ ├── Routine.Tests.csproj │ └── RoutineTests.cs └── Routine │ ├── Email.cs │ ├── IEmailService.cs │ ├── IReindeerFeeder.cs │ ├── IScheduleService.cs │ ├── Routine.cs │ ├── Routine.csproj │ └── Schedule.cs ├── day05 ├── pom.xml └── src │ ├── main │ └── java │ │ └── eid │ │ └── EID.java │ └── test │ └── java │ └── eid │ └── EIDTests.java ├── day06 ├── jest.config.js ├── package-lock.json ├── package.json ├── src │ └── elfWorkshop.ts ├── tests │ └── elfWorkshop.spec.ts └── tsconfig.json ├── day07 ├── build.gradle.kts ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── src │ ├── main │ └── kotlin │ │ └── production │ │ ├── Gift.kt │ │ └── Workshop.kt │ └── test │ └── kotlin │ └── WorkshopTests.kt ├── day08 ├── pom.xml └── src │ ├── main │ └── java │ │ ├── domain │ │ ├── Toy.java │ │ └── ToyRepository.java │ │ └── service │ │ └── ToyProductionService.java │ └── test │ └── java │ ├── ToyProductionServiceTest.java │ └── doubles │ └── InMemoryToyRepository.java ├── day09 ├── jest.config.js ├── package-lock.json ├── package.json ├── src │ ├── behavior.ts │ ├── child.ts │ ├── giftRequest.ts │ ├── priority.ts │ └── santaService.ts ├── tests │ ├── childBuilder.ts │ └── santa.analysis.spec.ts └── tsconfig.json ├── day10 ├── Delivery.Tests │ ├── 1.txt │ ├── 2.txt │ ├── 3.txt │ ├── 4.txt │ ├── 5.txt │ ├── 6.txt │ ├── Delivery.Tests.csproj │ └── DeliveryShould.cs ├── Delivery │ ├── Delivery.cs │ └── Delivery.csproj └── SantasDelivery.sln ├── day11 ├── Christmas.Tests │ ├── Christmas.Tests.csproj │ └── PreparationTests.cs ├── Christmas │ ├── Christmas.csproj │ ├── Extensions.cs │ └── Preparation.cs └── Preparation.sln ├── day12 ├── pom.xml └── src │ ├── main │ └── java │ │ └── gifts │ │ ├── Behavior.java │ │ ├── Child.java │ │ ├── ChildrenRepository.java │ │ ├── Santa.java │ │ ├── Toy.java │ │ └── Wishlist.java │ └── test │ └── java │ └── gifts │ ├── ChooseToyTest.java │ ├── CreateChildPropertyTest.java │ └── fakes │ └── InMemoryChildrenRepository.java ├── day13 ├── pom.xml └── src │ ├── main │ └── java │ │ └── santamarket │ │ └── model │ │ ├── ChristmasElf.java │ │ ├── Discount.java │ │ ├── Offer.java │ │ ├── Product.java │ │ ├── ProductQuantity.java │ │ ├── ProductUnit.java │ │ ├── Receipt.java │ │ ├── ReceiptItem.java │ │ ├── SantamarketCatalog.java │ │ ├── ShoppingSleigh.java │ │ ├── SpecialOfferType.java │ │ └── XForYOffer.java │ └── test │ └── java │ └── santamarket │ └── model │ ├── ComputeDiscountTest.java │ ├── FakeCatalog.java │ ├── ReceiptMatcher.java │ └── SantamarketTest.java ├── day14 ├── Children.Tests │ ├── Children.Tests.csproj │ ├── MappingTests.Map_X5T78_To_Child_For_A_Boy.verified.txt │ ├── MappingTests.Map_X5T78_To_Girl.verified.txt │ ├── MappingTests.cs │ └── X5T78Mother.cs ├── Children │ ├── ChildMapper.cs │ ├── Children.csproj │ ├── DTOs │ │ └── Child.cs │ └── Db2 │ │ └── X5T78.cs └── World.sln ├── day15 ├── ChristmasList.sln ├── SantaChristmasList.Operations.Monad.Test │ ├── BusinessTest.cs │ ├── GlobalUsings.cs │ └── SantaChristmasList.Operations.Test.csproj ├── SantaChristmasList.Operations.Monad │ ├── Business.cs │ ├── Dependencies.cs │ ├── Models.cs │ └── SantaChristmasList.Operations.Monad.csproj ├── SantaChristmasList.Operations.Test │ ├── BusinessTest.cs │ ├── GlobalUsings.cs │ └── SantaChristmasList.Operations.Test.csproj └── SantaChristmasList.Operations │ ├── Business.cs │ ├── Dependencies.cs │ ├── Models.cs │ └── SantaChristmasList.Operations.csproj ├── day16 ├── jest.config.js ├── package-lock.json ├── package.json ├── src │ ├── elf.ts │ └── taskAssignmentSystem.ts ├── tests │ └── taskAssignmentSystem.spec.ts └── tsconfig.json ├── day17 ├── pom.xml └── src │ ├── main │ └── java │ │ └── eid │ │ ├── EID.java │ │ ├── EIDBuilder.java │ │ ├── ParsingError.java │ │ ├── SerialNumber.java │ │ ├── Sex.java │ │ ├── StringExtensions.java │ │ └── Year.java │ └── test │ └── java │ └── eid │ └── EIDTests.java ├── day18 ├── cucumber.js ├── features │ ├── rockPaperScissorsLizardSpock.feature │ └── step_definitions │ │ └── rockPapersScissorsSteps.ts ├── package-lock.json ├── package.json ├── src │ └── rockPaperScissorsLizardSpock.ts └── tsconfig.json ├── day19 ├── SantasTravel.sln ├── Travel.Benchmark │ ├── Program.cs │ ├── SantaTravelBenchmark.cs │ └── Travel.Benchmark.csproj ├── Travel.Tests │ ├── CalculatorTests.cs │ └── Travel.Tests.csproj └── Travel │ ├── SantaTravelCalculator.cs │ └── Travel.csproj ├── day20 ├── Reindeer.Web.Tests │ ├── GlobalUsings.cs │ ├── HttpExtensions.cs │ ├── Reindeer.Web.Tests.csproj │ ├── ReindeerContractTests.cs │ ├── ReindeerWebApplicationFactory.cs │ └── Verified │ │ ├── ReindeerContractTests.ShouldCreateReindeer.verified.txt │ │ └── ReindeerContractTests.ShouldGetReindeer.verified.txt ├── Reindeer.Web │ ├── Program.cs │ ├── Properties │ │ └── launchSettings.json │ ├── Reindeer.Web.csproj │ ├── Service │ │ ├── Reindeer.cs │ │ ├── ReindeerErrorCode.cs │ │ ├── ReindeerResult.cs │ │ ├── ReindeerService.cs │ │ ├── ReindeerToCreate.cs │ │ └── ReindeerToCreateRequest.cs │ ├── appsettings.Development.json │ └── appsettings.json └── ReindeerAPI.sln ├── day21 ├── SantasTour.sln ├── Tour.Tests │ ├── RefactoringProperty.cs │ └── Tour.Tests.csproj └── Tour │ ├── SantaError.cs │ ├── Step.cs │ ├── StepsTextFormatter.cs │ ├── Tour.csproj │ └── TourCalculator.cs ├── day22 ├── pom.xml └── src │ ├── main │ └── java │ │ └── eid │ │ ├── EID.java │ │ ├── EIDBuilder.java │ │ ├── ParsingError.java │ │ ├── SerialNumber.java │ │ ├── Sex.java │ │ ├── StringExtensions.java │ │ └── Year.java │ └── test │ └── java │ └── eid │ └── EIDTests.java ├── day23 ├── pom.xml └── src │ ├── main │ └── java │ │ ├── app │ │ ├── App.java │ │ ├── AppStartingInfo.java │ │ └── Main.java │ │ ├── core │ │ └── control │ │ │ ├── ControlSystem.java │ │ │ ├── Dashboard.java │ │ │ ├── PowerGenerator.java │ │ │ ├── Sleigh.java │ │ │ ├── SystemConfig.java │ │ │ ├── SystemErrors.java │ │ │ ├── SystemMessage.java │ │ │ ├── command │ │ │ ├── Command.java │ │ │ ├── CommandController.java │ │ │ ├── CommandMap.java │ │ │ ├── Commands.java │ │ │ ├── ExecutionCommandError.java │ │ │ └── ExecutionCommandResult.java │ │ │ ├── dashboard │ │ │ └── ConsoleDashboard.java │ │ │ ├── generator │ │ │ ├── AmplifierType.java │ │ │ ├── MagicPowerAmplifier.java │ │ │ ├── MagicPowerGenerator.java │ │ │ ├── PowerUnitFactory.java │ │ │ ├── ReindeerPowerUnit.java │ │ │ └── factory │ │ │ │ └── BestMagicalPerformancePowerUnitFactory.java │ │ │ └── sleigh │ │ │ ├── Action.java │ │ │ ├── ActionFailure.java │ │ │ ├── ActionSuccess.java │ │ │ ├── EngineStatus.java │ │ │ └── XmasSleigh.java │ │ └── external │ │ ├── deer │ │ └── Reindeer.java │ │ └── stable │ │ └── MagicStable.java │ └── test │ └── java │ ├── app │ └── AppTest.java │ └── core │ └── control │ ├── ControlSystemTest.java │ ├── builders │ └── ControlSystemBuilder.java │ ├── command │ └── CommandControllerTest.java │ ├── data │ └── Reindeers.java │ └── generator │ └── MagicPowerGeneratorTest.java ├── day24 ├── .tcr │ ├── config.yml │ ├── language │ │ └── csharp.yml │ └── toolchain │ │ └── dotnet.yml ├── Delivery.sln ├── src │ └── Delivery │ │ ├── Delete.cs │ │ └── Delivery.csproj ├── tcrw └── tests │ └── Delivery.Tests │ ├── Assertions │ ├── ToyAssertions.cs │ └── ToyExtensions.cs │ ├── Delivery.Tests.csproj │ ├── Doubles │ └── InMemoryToyRepository.cs │ ├── LangExtExtensions.cs │ ├── Time.cs │ ├── ToyBuilder.cs │ ├── Units │ └── CreateToyTests.cs │ └── UseCases │ └── ToyDelivery.cs └── day25 ├── TimeCapsule.sln └── TimeCapsule ├── Browser.cs ├── Capsule.cs ├── Program.cs ├── TimeCapsule.csproj ├── timecapsule.html └── timecapsule_template.html /docs/day00/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day00/snippet.webp -------------------------------------------------------------------------------- /docs/day00/solution/img/decrypted-email.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day00/solution/img/decrypted-email.webp -------------------------------------------------------------------------------- /docs/day00/solution/img/structure.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day00/solution/img/structure.webp -------------------------------------------------------------------------------- /docs/day00/solution/img/test-fails.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day00/solution/img/test-fails.webp -------------------------------------------------------------------------------- /docs/day00/solution/img/tests-can-run.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day00/solution/img/tests-can-run.webp -------------------------------------------------------------------------------- /docs/day00/solution/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day00/solution/snippet.webp -------------------------------------------------------------------------------- /docs/day01/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day01/snippet.webp -------------------------------------------------------------------------------- /docs/day01/solution/img/configure-existing-class.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day01/solution/img/configure-existing-class.webp -------------------------------------------------------------------------------- /docs/day01/solution/img/configure-object.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day01/solution/img/configure-object.webp -------------------------------------------------------------------------------- /docs/day01/solution/img/create-ctor.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day01/solution/img/create-ctor.webp -------------------------------------------------------------------------------- /docs/day01/solution/img/ide-hints.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day01/solution/img/ide-hints.webp -------------------------------------------------------------------------------- /docs/day01/solution/img/introduce-configuration.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day01/solution/img/introduce-configuration.webp -------------------------------------------------------------------------------- /docs/day01/solution/img/introduce-parameter-object.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day01/solution/img/introduce-parameter-object.webp -------------------------------------------------------------------------------- /docs/day01/solution/img/red-ctor.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day01/solution/img/red-ctor.webp -------------------------------------------------------------------------------- /docs/day01/solution/img/safe-deletes.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day01/solution/img/safe-deletes.gif -------------------------------------------------------------------------------- /docs/day01/solution/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day01/solution/snippet.webp -------------------------------------------------------------------------------- /docs/day02/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day02/snippet.webp -------------------------------------------------------------------------------- /docs/day02/solution/img/add-parameter.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day02/solution/img/add-parameter.webp -------------------------------------------------------------------------------- /docs/day02/solution/img/fail_for_70.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day02/solution/img/fail_for_70.webp -------------------------------------------------------------------------------- /docs/day02/solution/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day02/solution/snippet.webp -------------------------------------------------------------------------------- /docs/day03/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day03/snippet.webp -------------------------------------------------------------------------------- /docs/day03/solution/img/dot-driven-development.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day03/solution/img/dot-driven-development.webp -------------------------------------------------------------------------------- /docs/day03/solution/img/extract-method.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day03/solution/img/extract-method.webp -------------------------------------------------------------------------------- /docs/day03/solution/img/generated-data.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day03/solution/img/generated-data.webp -------------------------------------------------------------------------------- /docs/day03/solution/img/replace-duplication.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day03/solution/img/replace-duplication.webp -------------------------------------------------------------------------------- /docs/day03/solution/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day03/solution/snippet.webp -------------------------------------------------------------------------------- /docs/day04/img/doubles.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day04/img/doubles.webp -------------------------------------------------------------------------------- /docs/day04/img/mock-stub.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day04/img/mock-stub.webp -------------------------------------------------------------------------------- /docs/day04/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day04/snippet.webp -------------------------------------------------------------------------------- /docs/day04/solution/img/express-assertions.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day04/solution/img/express-assertions.webp -------------------------------------------------------------------------------- /docs/day04/solution/img/generate-fakes.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day04/solution/img/generate-fakes.webp -------------------------------------------------------------------------------- /docs/day04/solution/img/instantiate-routine.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day04/solution/img/instantiate-routine.webp -------------------------------------------------------------------------------- /docs/day04/solution/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day04/solution/snippet.webp -------------------------------------------------------------------------------- /docs/day05/img/canon-tdd.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day05/img/canon-tdd.webp -------------------------------------------------------------------------------- /docs/day05/img/eid-example.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day05/img/eid-example.webp -------------------------------------------------------------------------------- /docs/day05/solution/img/first-failing-test.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day05/solution/img/first-failing-test.webp -------------------------------------------------------------------------------- /docs/day05/solution/img/generate-code-from-usage.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day05/solution/img/generate-code-from-usage.webp -------------------------------------------------------------------------------- /docs/day05/solution/img/generate-method-source.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day05/solution/img/generate-method-source.webp -------------------------------------------------------------------------------- /docs/day05/solution/img/new-failing-test.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day05/solution/img/new-failing-test.webp -------------------------------------------------------------------------------- /docs/day05/solution/img/parameterized-tests-with-reason.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day05/solution/img/parameterized-tests-with-reason.webp -------------------------------------------------------------------------------- /docs/day05/solution/img/parameterized-tests.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day05/solution/img/parameterized-tests.webp -------------------------------------------------------------------------------- /docs/day05/solution/img/refactor-length-rule.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day05/solution/img/refactor-length-rule.webp -------------------------------------------------------------------------------- /docs/day05/solution/img/regex.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day05/solution/img/regex.webp -------------------------------------------------------------------------------- /docs/day05/solution/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day05/solution/snippet.webp -------------------------------------------------------------------------------- /docs/day06/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day06/snippet.webp -------------------------------------------------------------------------------- /docs/day06/solution/img/checklist.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day06/solution/img/checklist.webp -------------------------------------------------------------------------------- /docs/day06/solution/img/code-review-pyramid.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day06/solution/img/code-review-pyramid.webp -------------------------------------------------------------------------------- /docs/day06/solution/img/code-vengers.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day06/solution/img/code-vengers.webp -------------------------------------------------------------------------------- /docs/day06/solution/img/fingers.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day06/solution/img/fingers.webp -------------------------------------------------------------------------------- /docs/day06/solution/img/nvc.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day06/solution/img/nvc.webp -------------------------------------------------------------------------------- /docs/day06/solution/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day06/solution/snippet.webp -------------------------------------------------------------------------------- /docs/day07/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day07/snippet.webp -------------------------------------------------------------------------------- /docs/day07/solution/img/be-completed.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day07/solution/img/be-completed.webp -------------------------------------------------------------------------------- /docs/day07/solution/img/custom-assert-failing.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day07/solution/img/custom-assert-failing.webp -------------------------------------------------------------------------------- /docs/day07/solution/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day07/solution/snippet.webp -------------------------------------------------------------------------------- /docs/day08/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day08/snippet.webp -------------------------------------------------------------------------------- /docs/day08/solution/img/card.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day08/solution/img/card.webp -------------------------------------------------------------------------------- /docs/day08/solution/img/generate-method.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day08/solution/img/generate-method.webp -------------------------------------------------------------------------------- /docs/day08/solution/img/remove-ctor-parameter.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day08/solution/img/remove-ctor-parameter.webp -------------------------------------------------------------------------------- /docs/day08/solution/img/safe-delete.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day08/solution/img/safe-delete.webp -------------------------------------------------------------------------------- /docs/day08/solution/img/tell-dont-ask.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day08/solution/img/tell-dont-ask.webp -------------------------------------------------------------------------------- /docs/day08/solution/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day08/solution/snippet.webp -------------------------------------------------------------------------------- /docs/day09/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day09/snippet.webp -------------------------------------------------------------------------------- /docs/day09/solution/img/childbuilder-create.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day09/solution/img/childbuilder-create.webp -------------------------------------------------------------------------------- /docs/day09/solution/img/generate-code-from-usage.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day09/solution/img/generate-code-from-usage.webp -------------------------------------------------------------------------------- /docs/day09/solution/img/nice-function.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day09/solution/img/nice-function.webp -------------------------------------------------------------------------------- /docs/day09/solution/img/request-infeasible-gift.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day09/solution/img/request-infeasible-gift.webp -------------------------------------------------------------------------------- /docs/day09/solution/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day09/solution/snippet.webp -------------------------------------------------------------------------------- /docs/day10/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day10/snippet.webp -------------------------------------------------------------------------------- /docs/day10/solution/img/boy-scout-rule.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day10/solution/img/boy-scout-rule.webp -------------------------------------------------------------------------------- /docs/day10/solution/img/continuous-testing.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day10/solution/img/continuous-testing.webp -------------------------------------------------------------------------------- /docs/day10/solution/img/coverage.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day10/solution/img/coverage.webp -------------------------------------------------------------------------------- /docs/day10/solution/img/extract-method.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day10/solution/img/extract-method.webp -------------------------------------------------------------------------------- /docs/day10/solution/img/failing-test.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day10/solution/img/failing-test.webp -------------------------------------------------------------------------------- /docs/day10/solution/img/fixed-test.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day10/solution/img/fixed-test.webp -------------------------------------------------------------------------------- /docs/day10/solution/img/linq.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day10/solution/img/linq.webp -------------------------------------------------------------------------------- /docs/day10/solution/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day10/solution/snippet.webp -------------------------------------------------------------------------------- /docs/day11/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day11/snippet.webp -------------------------------------------------------------------------------- /docs/day11/solution/img/all-mutants-killed.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day11/solution/img/all-mutants-killed.webp -------------------------------------------------------------------------------- /docs/day11/solution/img/code-coverage.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day11/solution/img/code-coverage.webp -------------------------------------------------------------------------------- /docs/day11/solution/img/coverage-100.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day11/solution/img/coverage-100.webp -------------------------------------------------------------------------------- /docs/day11/solution/img/edge-cases.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day11/solution/img/edge-cases.webp -------------------------------------------------------------------------------- /docs/day11/solution/img/fixed-string-mutation.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day11/solution/img/fixed-string-mutation.webp -------------------------------------------------------------------------------- /docs/day11/solution/img/line-coverage.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day11/solution/img/line-coverage.webp -------------------------------------------------------------------------------- /docs/day11/solution/img/mutant.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day11/solution/img/mutant.webp -------------------------------------------------------------------------------- /docs/day11/solution/img/mutation-report.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day11/solution/img/mutation-report.webp -------------------------------------------------------------------------------- /docs/day11/solution/img/mutation-score.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day11/solution/img/mutation-score.webp -------------------------------------------------------------------------------- /docs/day11/solution/img/mutations-details.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day11/solution/img/mutations-details.webp -------------------------------------------------------------------------------- /docs/day11/solution/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day11/solution/snippet.webp -------------------------------------------------------------------------------- /docs/day12/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day12/snippet.webp -------------------------------------------------------------------------------- /docs/day12/solution/img/wishlist.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day12/solution/img/wishlist.webp -------------------------------------------------------------------------------- /docs/day12/solution/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day12/solution/snippet.webp -------------------------------------------------------------------------------- /docs/day13/img/mikado.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day13/img/mikado.webp -------------------------------------------------------------------------------- /docs/day13/img/the-mikado-method.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day13/img/the-mikado-method.webp -------------------------------------------------------------------------------- /docs/day13/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day13/snippet.webp -------------------------------------------------------------------------------- /docs/day13/solution/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day13/solution/snippet.webp -------------------------------------------------------------------------------- /docs/day14/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day14/snippet.webp -------------------------------------------------------------------------------- /docs/day14/solution/img/compare-nickname.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day14/solution/img/compare-nickname.webp -------------------------------------------------------------------------------- /docs/day14/solution/img/file-compare.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day14/solution/img/file-compare.webp -------------------------------------------------------------------------------- /docs/day14/solution/img/files.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day14/solution/img/files.webp -------------------------------------------------------------------------------- /docs/day14/solution/img/first-run-fails.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day14/solution/img/first-run-fails.webp -------------------------------------------------------------------------------- /docs/day14/solution/img/green-tests.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day14/solution/img/green-tests.webp -------------------------------------------------------------------------------- /docs/day14/solution/img/introduce-field.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day14/solution/img/introduce-field.webp -------------------------------------------------------------------------------- /docs/day14/solution/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day14/solution/snippet.webp -------------------------------------------------------------------------------- /docs/day15/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day15/snippet.webp -------------------------------------------------------------------------------- /docs/day15/solution/img/pipeline.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day15/solution/img/pipeline.webp -------------------------------------------------------------------------------- /docs/day15/solution/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day15/solution/snippet.webp -------------------------------------------------------------------------------- /docs/day16/pomodoro.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day16/pomodoro.webp -------------------------------------------------------------------------------- /docs/day16/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day16/snippet.webp -------------------------------------------------------------------------------- /docs/day16/solution/img/bug-identified.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day16/solution/img/bug-identified.webp -------------------------------------------------------------------------------- /docs/day16/solution/img/mistral-feedback.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day16/solution/img/mistral-feedback.webp -------------------------------------------------------------------------------- /docs/day16/solution/img/which-assignment.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day16/solution/img/which-assignment.webp -------------------------------------------------------------------------------- /docs/day16/solution/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day16/solution/snippet.webp -------------------------------------------------------------------------------- /docs/day17/img/eid-example.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day17/img/eid-example.webp -------------------------------------------------------------------------------- /docs/day17/img/validate-eid.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day17/img/validate-eid.webp -------------------------------------------------------------------------------- /docs/day17/solution/img/eid-archi.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day17/solution/img/eid-archi.webp -------------------------------------------------------------------------------- /docs/day17/solution/img/generate-eid.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day17/solution/img/generate-eid.webp -------------------------------------------------------------------------------- /docs/day17/solution/img/parseSex.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day17/solution/img/parseSex.webp -------------------------------------------------------------------------------- /docs/day17/solution/img/sex-generator.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day17/solution/img/sex-generator.webp -------------------------------------------------------------------------------- /docs/day17/solution/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day17/solution/snippet.webp -------------------------------------------------------------------------------- /docs/day18/rock-paper-scissors-lizard-spock.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day18/rock-paper-scissors-lizard-spock.webp -------------------------------------------------------------------------------- /docs/day18/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day18/snippet.webp -------------------------------------------------------------------------------- /docs/day18/solution/img/behavior-driven-development.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day18/solution/img/behavior-driven-development.webp -------------------------------------------------------------------------------- /docs/day18/solution/img/first-failing-test.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day18/solution/img/first-failing-test.webp -------------------------------------------------------------------------------- /docs/day18/solution/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day18/solution/snippet.webp -------------------------------------------------------------------------------- /docs/day19/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day19/snippet.webp -------------------------------------------------------------------------------- /docs/day19/solution/img/argument-exception-for-long.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day19/solution/img/argument-exception-for-long.webp -------------------------------------------------------------------------------- /docs/day19/solution/img/benchmark-all-methods.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day19/solution/img/benchmark-all-methods.webp -------------------------------------------------------------------------------- /docs/day19/solution/img/benchmark-new-method.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day19/solution/img/benchmark-new-method.webp -------------------------------------------------------------------------------- /docs/day19/solution/img/benchmark1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day19/solution/img/benchmark1.webp -------------------------------------------------------------------------------- /docs/day19/solution/img/create-benchmark-project.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day19/solution/img/create-benchmark-project.webp -------------------------------------------------------------------------------- /docs/day19/solution/img/create-new-method.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day19/solution/img/create-new-method.webp -------------------------------------------------------------------------------- /docs/day19/solution/img/extract-variables.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day19/solution/img/extract-variables.webp -------------------------------------------------------------------------------- /docs/day19/solution/img/overflow-exception.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day19/solution/img/overflow-exception.webp -------------------------------------------------------------------------------- /docs/day19/solution/img/run-in-release.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day19/solution/img/run-in-release.webp -------------------------------------------------------------------------------- /docs/day19/solution/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day19/solution/snippet.webp -------------------------------------------------------------------------------- /docs/day20/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day20/snippet.webp -------------------------------------------------------------------------------- /docs/day20/solution/img/first-test.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day20/solution/img/first-test.webp -------------------------------------------------------------------------------- /docs/day20/solution/img/green-test.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day20/solution/img/green-test.webp -------------------------------------------------------------------------------- /docs/day20/solution/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day20/solution/snippet.webp -------------------------------------------------------------------------------- /docs/day21/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day21/snippet.webp -------------------------------------------------------------------------------- /docs/day21/solution/img/generate-code.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day21/solution/img/generate-code.webp -------------------------------------------------------------------------------- /docs/day21/solution/img/introduce-mutation.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day21/solution/img/introduce-mutation.webp -------------------------------------------------------------------------------- /docs/day21/solution/img/move-class.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day21/solution/img/move-class.webp -------------------------------------------------------------------------------- /docs/day21/solution/img/obsolete-class.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day21/solution/img/obsolete-class.webp -------------------------------------------------------------------------------- /docs/day21/solution/img/property-fails.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day21/solution/img/property-fails.webp -------------------------------------------------------------------------------- /docs/day21/solution/img/remove-property.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day21/solution/img/remove-property.webp -------------------------------------------------------------------------------- /docs/day21/solution/img/remove-useless-parameter.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day21/solution/img/remove-useless-parameter.webp -------------------------------------------------------------------------------- /docs/day21/solution/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day21/solution/snippet.webp -------------------------------------------------------------------------------- /docs/day22/img/eid-archi.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day22/img/eid-archi.webp -------------------------------------------------------------------------------- /docs/day22/img/eid-example.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day22/img/eid-example.webp -------------------------------------------------------------------------------- /docs/day22/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day22/snippet.webp -------------------------------------------------------------------------------- /docs/day22/solution/img/failing-truncator.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day22/solution/img/failing-truncator.webp -------------------------------------------------------------------------------- /docs/day22/solution/img/falsified-key.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day22/solution/img/falsified-key.webp -------------------------------------------------------------------------------- /docs/day22/solution/img/truncate-mutator.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day22/solution/img/truncate-mutator.webp -------------------------------------------------------------------------------- /docs/day22/solution/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day22/solution/snippet.webp -------------------------------------------------------------------------------- /docs/day23/img/controlsystem.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day23/img/controlsystem.webp -------------------------------------------------------------------------------- /docs/day23/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day23/snippet.webp -------------------------------------------------------------------------------- /docs/day23/solution/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day23/solution/snippet.webp -------------------------------------------------------------------------------- /docs/day24/img/ccr.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day24/img/ccr.webp -------------------------------------------------------------------------------- /docs/day24/img/cdd+tcr.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day24/img/cdd+tcr.webp -------------------------------------------------------------------------------- /docs/day24/img/cdd.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day24/img/cdd.webp -------------------------------------------------------------------------------- /docs/day24/img/tcr.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day24/img/tcr.gif -------------------------------------------------------------------------------- /docs/day24/img/tcr.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day24/img/tcr.webp -------------------------------------------------------------------------------- /docs/day24/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day24/snippet.webp -------------------------------------------------------------------------------- /docs/day24/solution/img/clean-code-from-cognitive-pov.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day24/solution/img/clean-code-from-cognitive-pov.webp -------------------------------------------------------------------------------- /docs/day24/solution/img/code-structure.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day24/solution/img/code-structure.webp -------------------------------------------------------------------------------- /docs/day24/solution/img/crappy-ideas.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day24/solution/img/crappy-ideas.webp -------------------------------------------------------------------------------- /docs/day24/solution/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day24/solution/snippet.webp -------------------------------------------------------------------------------- /docs/day25/img/merry-christmas.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day25/img/merry-christmas.webp -------------------------------------------------------------------------------- /docs/day25/snippet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day25/snippet.webp -------------------------------------------------------------------------------- /docs/day25/solution/img/badge.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day25/solution/img/badge.webp -------------------------------------------------------------------------------- /docs/day25/solution/img/merry-christmas.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day25/solution/img/merry-christmas.webp -------------------------------------------------------------------------------- /docs/day25/solution/img/survey.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day25/solution/img/survey.webp -------------------------------------------------------------------------------- /docs/day25/solution/img/time-capsule.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/day25/solution/img/time-capsule.webp -------------------------------------------------------------------------------- /docs/img/yann.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/img/yann.png -------------------------------------------------------------------------------- /docs/img/yoan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/docs/img/yoan.png -------------------------------------------------------------------------------- /exercise/C#/day00/Email/Configuration.cs: -------------------------------------------------------------------------------- 1 | namespace Email; 2 | 3 | public record Configuration(string Key, string Iv); -------------------------------------------------------------------------------- /exercise/C#/day01/Communication/ILogger.cs: -------------------------------------------------------------------------------- 1 | namespace Communication 2 | { 3 | public interface ILogger 4 | { 5 | void Log(string message); 6 | } 7 | } -------------------------------------------------------------------------------- /exercise/C#/day04/Routine/Email.cs: -------------------------------------------------------------------------------- 1 | namespace Routine 2 | { 3 | public class Email 4 | { 5 | public string Subject { get; set; } 6 | public string Body { get; set; } 7 | } 8 | } -------------------------------------------------------------------------------- /exercise/C#/day04/Routine/IEmailService.cs: -------------------------------------------------------------------------------- 1 | namespace Routine 2 | { 3 | public interface IEmailService 4 | { 5 | void ReadNewEmails(); 6 | } 7 | } -------------------------------------------------------------------------------- /exercise/C#/day04/Routine/IReindeerFeeder.cs: -------------------------------------------------------------------------------- 1 | namespace Routine 2 | { 3 | public interface IReindeerFeeder 4 | { 5 | void FeedReindeers(); 6 | } 7 | } -------------------------------------------------------------------------------- /exercise/C#/day04/Routine/IScheduleService.cs: -------------------------------------------------------------------------------- 1 | namespace Routine 2 | { 3 | public interface IScheduleService 4 | { 5 | Schedule TodaySchedule(); 6 | void OrganizeMyDay(Schedule schedule); 7 | void Continue(); 8 | } 9 | } -------------------------------------------------------------------------------- /exercise/C#/day04/Routine/Schedule.cs: -------------------------------------------------------------------------------- 1 | namespace Routine 2 | { 3 | public class Schedule 4 | { 5 | public List Tasks { get; set; } = []; 6 | } 7 | } -------------------------------------------------------------------------------- /exercise/C#/day08/ToyProduction/Domain/IToyRepository.cs: -------------------------------------------------------------------------------- 1 | namespace ToyProduction.Domain 2 | { 3 | public interface IToyRepository 4 | { 5 | Toy? FindByName(string name); 6 | void Save(Toy toy); 7 | } 8 | } -------------------------------------------------------------------------------- /exercise/C#/day09/GiftWish/Behavior.cs: -------------------------------------------------------------------------------- 1 | namespace GiftWish 2 | { 3 | public enum Behavior 4 | { 5 | Naughty, 6 | Nice 7 | } 8 | } -------------------------------------------------------------------------------- /exercise/C#/day09/GiftWish/Child.cs: -------------------------------------------------------------------------------- 1 | namespace GiftWish 2 | { 3 | public record Child(string FirstName, string LastName, int Age, Behavior Behavior, GiftRequest GiftRequest); 4 | } 5 | -------------------------------------------------------------------------------- /exercise/C#/day09/GiftWish/GiftRequest.cs: -------------------------------------------------------------------------------- 1 | namespace GiftWish 2 | { 3 | public record GiftRequest(string GiftName, bool IsFeasible, Priority Priority); 4 | } 5 | -------------------------------------------------------------------------------- /exercise/C#/day09/GiftWish/Priority.cs: -------------------------------------------------------------------------------- 1 | namespace GiftWish 2 | { 3 | public enum Priority 4 | { 5 | Dream, 6 | NiceToHave 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /exercise/C#/day09/GiftWish/SantaService.cs: -------------------------------------------------------------------------------- 1 | namespace GiftWish 2 | { 3 | public class SantaService 4 | { 5 | public bool EvaluateRequest(Child child) => child is {Behavior: Behavior.Nice, GiftRequest.IsFeasible: true}; 6 | } 7 | } -------------------------------------------------------------------------------- /exercise/C#/day10/Delivery.Tests/1.txt: -------------------------------------------------------------------------------- 1 | (()) -------------------------------------------------------------------------------- /exercise/C#/day10/Delivery.Tests/2.txt: -------------------------------------------------------------------------------- 1 | (()(()( -------------------------------------------------------------------------------- /exercise/C#/day10/Delivery.Tests/3.txt: -------------------------------------------------------------------------------- 1 | ()) -------------------------------------------------------------------------------- /exercise/C#/day10/Delivery.Tests/4.txt: -------------------------------------------------------------------------------- 1 | (()(()(()(()(()(()(()(()(()(()(()(()(()(()(()(()(()(()(()))))))))))))))))(((((()(()))))))))))(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((())))))()())(()()()()()()()()())))))))))) -------------------------------------------------------------------------------- /exercise/C#/day10/Delivery.Tests/5.txt: -------------------------------------------------------------------------------- 1 | )())()) -------------------------------------------------------------------------------- /exercise/C#/day11/Christmas/Extensions.cs: -------------------------------------------------------------------------------- 1 | namespace Christmas 2 | { 3 | public static class Extensions 4 | { 5 | public static TOut Do(this TIn it, Func func) => func(it); 6 | } 7 | } -------------------------------------------------------------------------------- /exercise/C#/day12/Gifts/Toy.cs: -------------------------------------------------------------------------------- 1 | namespace Gifts; 2 | 3 | public record Toy(string Description); -------------------------------------------------------------------------------- /exercise/C#/day13/SantaMarket/Model/ProductUnit.cs: -------------------------------------------------------------------------------- 1 | namespace SantaMarket.Model 2 | { 3 | public enum ProductUnit 4 | { 5 | Each, 6 | Kilo, 7 | Liter 8 | } 9 | } -------------------------------------------------------------------------------- /exercise/C#/day13/SantaMarket/Model/SantaMarketCatalog.cs: -------------------------------------------------------------------------------- 1 | namespace SantaMarket.Model 2 | { 3 | public interface ISantamarketCatalog 4 | { 5 | void AddProduct(Product product, double price); 6 | double GetUnitPrice(Product product); 7 | } 8 | } -------------------------------------------------------------------------------- /exercise/C#/day13/SantaMarket/Model/SpecialOfferType.cs: -------------------------------------------------------------------------------- 1 | namespace SantaMarket.Model 2 | { 3 | public enum SpecialOfferType 4 | { 5 | ThreeForTwo, 6 | TenPercentDiscount, 7 | TwoForAmount, 8 | FiveForAmount 9 | } 10 | } -------------------------------------------------------------------------------- /exercise/C#/day15/SantaChristmasList.Operations.Test/GlobalUsings.cs: -------------------------------------------------------------------------------- 1 | #region 2 | 3 | global using Xunit; 4 | global using FluentAssertions; 5 | 6 | #endregion -------------------------------------------------------------------------------- /exercise/C#/day16/TaskAssignmentSystem/Elf.cs: -------------------------------------------------------------------------------- 1 | namespace TaskAssignmentSystem; 2 | 3 | public class Elf(int id, int skillLevel) 4 | { 5 | public int Id { get; } = id; 6 | public int SkillLevel { get; set; } = skillLevel; 7 | } -------------------------------------------------------------------------------- /exercise/C#/day20/Reindeer.Web.Tests/GlobalUsings.cs: -------------------------------------------------------------------------------- 1 | global using Xunit; -------------------------------------------------------------------------------- /exercise/C#/day20/Reindeer.Web.Tests/ReindeerWebApplicationFactory.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Mvc.Testing; 2 | 3 | namespace Reindeer.Web.Tests 4 | { 5 | public class ReindeerWebApplicationFactory : WebApplicationFactory 6 | { 7 | } 8 | } -------------------------------------------------------------------------------- /exercise/C#/day20/Reindeer.Web/Service/ReindeerErrorCode.cs: -------------------------------------------------------------------------------- 1 | namespace Reindeer.Web.Service 2 | { 3 | public enum ReindeerErrorCode 4 | { 5 | NotFound, 6 | AlreadyExist 7 | } 8 | } -------------------------------------------------------------------------------- /exercise/C#/day20/Reindeer.Web/Service/ReindeerToCreate.cs: -------------------------------------------------------------------------------- 1 | namespace Reindeer.Web.Service 2 | { 3 | public record ReindeerToCreate(Guid Id, string Name, ReindeerColor Color); 4 | } -------------------------------------------------------------------------------- /exercise/C#/day20/Reindeer.Web/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /exercise/C#/day20/Reindeer.Web/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | }, 8 | "AllowedHosts": "*" 9 | } 10 | -------------------------------------------------------------------------------- /exercise/C#/day22/EID/ParsingError.cs: -------------------------------------------------------------------------------- 1 | namespace EID 2 | { 3 | public record ParsingError(string Reason); 4 | } -------------------------------------------------------------------------------- /exercise/C#/day23/ControlSystem.App/GlobalUsings.cs: -------------------------------------------------------------------------------- 1 | // Global using directives 2 | 3 | global using ControlSystem.Core; -------------------------------------------------------------------------------- /exercise/C#/day23/ControlSystem.Core/Dashboard.cs: -------------------------------------------------------------------------------- 1 | namespace ControlSystem.Core 2 | { 3 | public class Dashboard 4 | { 5 | public void DisplayStatus(string message) 6 | { 7 | Console.WriteLine(message); 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /exercise/C#/day23/ControlSystem.Core/SleighAction.cs: -------------------------------------------------------------------------------- 1 | namespace ControlSystem.Core 2 | { 3 | public enum SleighAction 4 | { 5 | Flying, 6 | Hovering, 7 | Parked 8 | } 9 | } -------------------------------------------------------------------------------- /exercise/C#/day23/ControlSystem.Core/SleighEngineStatus.cs: -------------------------------------------------------------------------------- 1 | namespace ControlSystem.Core 2 | { 3 | public enum SleighEngineStatus 4 | { 5 | Off, 6 | On 7 | } 8 | } -------------------------------------------------------------------------------- /exercise/C#/day23/ControlSystem.Tests/GlobalUsings.cs: -------------------------------------------------------------------------------- 1 | global using Xunit; -------------------------------------------------------------------------------- /exercise/C#/day24/.tcr/config.yml: -------------------------------------------------------------------------------- 1 | config: 2 | git: 3 | auto-push: false 4 | polling-period: 2s 5 | mob-timer: 6 | duration: 5m0s 7 | tcr: 8 | language: csharp 9 | toolchain: dotnet 10 | -------------------------------------------------------------------------------- /exercise/C#/day24/src/Delivery/Domain/Core/Error.cs: -------------------------------------------------------------------------------- 1 | namespace Delivery.Domain.Core 2 | { 3 | public record Error(string Message) 4 | { 5 | public static Error AnError(string message) => new(message); 6 | } 7 | } -------------------------------------------------------------------------------- /exercise/C#/day24/src/Delivery/Domain/Core/Event.cs: -------------------------------------------------------------------------------- 1 | namespace Delivery.Domain.Core 2 | { 3 | public record Event(Guid Id, int Version, DateTime Date) : IEvent; 4 | } -------------------------------------------------------------------------------- /exercise/C#/day24/src/Delivery/Domain/Core/IEvent.cs: -------------------------------------------------------------------------------- 1 | namespace Delivery.Domain.Core 2 | { 3 | public interface IEvent 4 | { 5 | Guid Id { get; } 6 | int Version { get; } 7 | DateTime Date { get; } 8 | } 9 | } -------------------------------------------------------------------------------- /exercise/C#/day24/src/Delivery/Domain/StockReducedEvent.cs: -------------------------------------------------------------------------------- 1 | using Delivery.Domain.Core; 2 | 3 | namespace Delivery.Domain 4 | { 5 | public record StockReducedEvent(Guid Id, DateTime Date, string ToyName, StockUnit NewStock) : Event(Id, 1, Date); 6 | } -------------------------------------------------------------------------------- /exercise/C#/day24/src/Delivery/Domain/ToyCreatedEvent.cs: -------------------------------------------------------------------------------- 1 | using Delivery.Domain.Core; 2 | 3 | namespace Delivery.Domain 4 | { 5 | internal record ToyCreatedEvent(Guid Id, DateTime Date, string Name, StockUnit Stock) : Event(Id, 1, Date); 6 | } -------------------------------------------------------------------------------- /exercise/C#/day24/src/Delivery/UseCases/DeliverToy.cs: -------------------------------------------------------------------------------- 1 | namespace Delivery.UseCases 2 | { 3 | public record DeliverToy(string ChildName, string DesiredToy); 4 | } -------------------------------------------------------------------------------- /exercise/C#/day24/tcrw: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | base_dir="$(cd "$(dirname -- "$0")" && pwd)" 4 | . "${base_dir}/../tcr/tcr.sh" 5 | -------------------------------------------------------------------------------- /exercise/C#/day24/tests/Delivery.Tests/Assertions/ToyExtensions.cs: -------------------------------------------------------------------------------- 1 | using Delivery.Domain; 2 | 3 | namespace Delivery.Tests.Assertions; 4 | 5 | public static class ToyExtensions 6 | { 7 | public static ToyAssertions Should(this Toy toy) => new(toy); 8 | } -------------------------------------------------------------------------------- /exercise/C#/tcr/.gitignore: -------------------------------------------------------------------------------- 1 | # Below files and directories are automatically created 2 | # by tcr.sh and do not need to be committed to this repository 3 | 4 | bin/** 5 | doc/** 6 | download/** 7 | LICENSE.md 8 | README.md 9 | -------------------------------------------------------------------------------- /exercise/C#/tcr/version.txt: -------------------------------------------------------------------------------- 1 | tcr 1.0.0 2 | -------------------------------------------------------------------------------- /exercise/java/day00/src/main/java/email/Configuration.java: -------------------------------------------------------------------------------- 1 | package email; 2 | 3 | public record Configuration(String key, String iv) { 4 | } -------------------------------------------------------------------------------- /exercise/java/day01/src/main/java/communication/Logger.java: -------------------------------------------------------------------------------- 1 | package communication; 2 | 3 | public interface Logger { 4 | void log(String message); 5 | } 6 | -------------------------------------------------------------------------------- /exercise/java/day04/src/main/java/routine/EmailService.java: -------------------------------------------------------------------------------- 1 | package routine; 2 | 3 | public interface EmailService { 4 | void readNewEmails(); 5 | } 6 | -------------------------------------------------------------------------------- /exercise/java/day04/src/main/java/routine/ReindeerFeeder.java: -------------------------------------------------------------------------------- 1 | package routine; 2 | 3 | public interface ReindeerFeeder { 4 | void feedReindeers(); 5 | } 6 | -------------------------------------------------------------------------------- /exercise/java/day04/src/main/java/routine/ScheduleService.java: -------------------------------------------------------------------------------- 1 | package routine; 2 | 3 | public interface ScheduleService { 4 | Schedule todaySchedule(); 5 | 6 | void organizeMyDay(Schedule schedule); 7 | 8 | void continueDay(); 9 | } 10 | -------------------------------------------------------------------------------- /exercise/java/day07/src/main/java/workshop/Status.java: -------------------------------------------------------------------------------- 1 | package workshop; 2 | 3 | public enum Status { 4 | PRODUCING, 5 | PRODUCED 6 | } 7 | -------------------------------------------------------------------------------- /exercise/java/day08/src/main/java/domain/ToyRepository.java: -------------------------------------------------------------------------------- 1 | package domain; 2 | 3 | public interface ToyRepository { 4 | Toy findByName(String name); 5 | void save(Toy toy); 6 | } 7 | -------------------------------------------------------------------------------- /exercise/java/day09/src/main/java/gift/Behavior.java: -------------------------------------------------------------------------------- 1 | package gift; 2 | 3 | public enum Behavior { 4 | NAUGHTY, NICE 5 | } -------------------------------------------------------------------------------- /exercise/java/day09/src/main/java/gift/Priority.java: -------------------------------------------------------------------------------- 1 | package gift; 2 | 3 | public enum Priority { 4 | DREAM, NICE_TO_HAVE 5 | } -------------------------------------------------------------------------------- /exercise/java/day09/src/main/java/gift/SantaService.java: -------------------------------------------------------------------------------- 1 | package gift; 2 | 3 | public class SantaService { 4 | public boolean evaluateRequest(Child child) { 5 | return child.getBehavior() == Behavior.NICE && child.getGiftRequest().isFeasible(); 6 | } 7 | } -------------------------------------------------------------------------------- /exercise/java/day10/src/test/resources/1.txt: -------------------------------------------------------------------------------- 1 | (()) -------------------------------------------------------------------------------- /exercise/java/day10/src/test/resources/2.txt: -------------------------------------------------------------------------------- 1 | (()(()( -------------------------------------------------------------------------------- /exercise/java/day10/src/test/resources/3.txt: -------------------------------------------------------------------------------- 1 | ()) -------------------------------------------------------------------------------- /exercise/java/day10/src/test/resources/4.txt: -------------------------------------------------------------------------------- 1 | (()(()(()(()(()(()(()(()(()(()(()(()(()(()(()(()(()(()(()))))))))))))))))(((((()(()))))))))))(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((())))))()())(()()()()()()()()())))))))))) -------------------------------------------------------------------------------- /exercise/java/day10/src/test/resources/5.txt: -------------------------------------------------------------------------------- 1 | )())()) -------------------------------------------------------------------------------- /exercise/java/day11/src/main/java/christmas/ToyType.java: -------------------------------------------------------------------------------- 1 | package christmas; 2 | 3 | public enum ToyType { 4 | EDUCATIONAL, 5 | FUN, 6 | CREATIVE 7 | } -------------------------------------------------------------------------------- /exercise/java/day12/src/main/java/gifts/Toy.java: -------------------------------------------------------------------------------- 1 | package gifts; 2 | 3 | public record Toy(String description) { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /exercise/java/day13/src/main/java/santamarket/model/ProductUnit.java: -------------------------------------------------------------------------------- 1 | package santamarket.model; 2 | 3 | public enum ProductUnit { 4 | KILO, EACH 5 | } 6 | -------------------------------------------------------------------------------- /exercise/java/day13/src/main/java/santamarket/model/SantamarketCatalog.java: -------------------------------------------------------------------------------- 1 | package santamarket.model; 2 | 3 | public interface SantamarketCatalog { 4 | void addProduct(Product product, double price); 5 | 6 | double getUnitPrice(Product product); 7 | } 8 | -------------------------------------------------------------------------------- /exercise/java/day13/src/main/java/santamarket/model/SpecialOfferType.java: -------------------------------------------------------------------------------- 1 | package santamarket.model; 2 | 3 | public enum SpecialOfferType { 4 | THREE_FOR_TWO, 5 | TEN_PERCENT_DISCOUNT, 6 | TWO_FOR_AMOUNT, 7 | FIVE_FOR_AMOUNT, 8 | } 9 | -------------------------------------------------------------------------------- /exercise/java/day14/src/main/java/children/dtos/Gender.java: -------------------------------------------------------------------------------- 1 | package children.dtos; 2 | 3 | public enum Gender { 4 | GIRL, BOY 5 | } 6 | -------------------------------------------------------------------------------- /exercise/java/day15/src/main/java/santaChristmasList/operations/models/Child.java: -------------------------------------------------------------------------------- 1 | package santaChristmasList.operations.models; 2 | 3 | public record Child(String name) { 4 | } 5 | -------------------------------------------------------------------------------- /exercise/java/day15/src/main/java/santaChristmasList/operations/models/Gift.java: -------------------------------------------------------------------------------- 1 | package santaChristmasList.operations.models; 2 | 3 | public record Gift(String name) { 4 | } 5 | -------------------------------------------------------------------------------- /exercise/java/day15/src/main/java/santaChristmasList/operations/models/ManufacturedGift.java: -------------------------------------------------------------------------------- 1 | package santaChristmasList.operations.models; 2 | 3 | public record ManufacturedGift(String barCode) { 4 | } 5 | -------------------------------------------------------------------------------- /exercise/java/day15/src/main/java/santaChristmasList/operations/models/Sleigh.java: -------------------------------------------------------------------------------- 1 | package santaChristmasList.operations.models; 2 | 3 | import java.util.HashMap; 4 | 5 | public class Sleigh extends HashMap { 6 | } -------------------------------------------------------------------------------- /exercise/java/day18/src/main/java/game/Result.java: -------------------------------------------------------------------------------- 1 | package game; 2 | 3 | public record Result(Winner winner, String reason) { 4 | 5 | } -------------------------------------------------------------------------------- /exercise/java/day18/src/main/java/game/Winner.java: -------------------------------------------------------------------------------- 1 | package game; 2 | 3 | public enum Winner { 4 | PLAYER_1, 5 | PLAYER_2, 6 | DRAW 7 | } -------------------------------------------------------------------------------- /exercise/java/day20/src/main/java/reindeer/model/Reindeer.java: -------------------------------------------------------------------------------- 1 | package reindeer.model; 2 | 3 | import java.util.UUID; 4 | 5 | public record Reindeer(UUID id, String name, ReindeerColor color) { 6 | } 7 | -------------------------------------------------------------------------------- /exercise/java/day20/src/main/java/reindeer/model/ReindeerColor.java: -------------------------------------------------------------------------------- 1 | package reindeer.model; 2 | 3 | public enum ReindeerColor { 4 | WHITE, 5 | BLACK, 6 | PURPLE // Why not? 7 | } 8 | -------------------------------------------------------------------------------- /exercise/java/day20/src/main/java/reindeer/model/ReindeerErrorCode.java: -------------------------------------------------------------------------------- 1 | package reindeer.model; 2 | 3 | public enum ReindeerErrorCode { 4 | NOT_FOUND, 5 | ALREADY_EXIST 6 | } 7 | -------------------------------------------------------------------------------- /exercise/java/day20/src/main/java/reindeer/model/ReindeerToCreate.java: -------------------------------------------------------------------------------- 1 | package reindeer.model; 2 | 3 | import java.util.UUID; 4 | 5 | public record ReindeerToCreate(UUID id, String name, ReindeerColor color) { 6 | } 7 | -------------------------------------------------------------------------------- /exercise/java/day20/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | application: 3 | name: reindeer-api 4 | server: 5 | port: 8080 -------------------------------------------------------------------------------- /exercise/java/day21/src/main/java/tour/Step.java: -------------------------------------------------------------------------------- 1 | package tour; 2 | 3 | import java.time.LocalTime; 4 | 5 | public record Step(LocalTime time, String label, int deliveryTime) {} 6 | -------------------------------------------------------------------------------- /exercise/java/day22/src/main/java/eid/ParsingError.java: -------------------------------------------------------------------------------- 1 | package eid; 2 | 3 | public record ParsingError(String reason) { 4 | } -------------------------------------------------------------------------------- /exercise/java/day23/src/main/java/core/control/Dashboard.java: -------------------------------------------------------------------------------- 1 | package core.control; 2 | 3 | public class Dashboard { 4 | public void displayStatus(String message) { 5 | System.out.println(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /exercise/java/day23/src/main/java/core/control/SleighAction.java: -------------------------------------------------------------------------------- 1 | package core.control; 2 | 3 | public enum SleighAction { 4 | FLYING, 5 | HOVERING, 6 | PARKED 7 | } 8 | -------------------------------------------------------------------------------- /exercise/java/day23/src/main/java/core/control/SleighEngineStatus.java: -------------------------------------------------------------------------------- 1 | package core.control; 2 | 3 | public enum SleighEngineStatus { 4 | OFF, 5 | ON 6 | } 7 | -------------------------------------------------------------------------------- /exercise/java/day24/.tcr/config.yml: -------------------------------------------------------------------------------- 1 | config: 2 | git: 3 | auto-push: false 4 | polling-period: 2s 5 | mob-timer: 6 | duration: 5m0s 7 | tcr: 8 | language: java 9 | toolchain: maven 10 | -------------------------------------------------------------------------------- /exercise/java/day24/src/main/java/domain/ToyRepository.java: -------------------------------------------------------------------------------- 1 | package domain; 2 | 3 | import domain.core.Repository; 4 | import io.vavr.control.Option; 5 | 6 | public interface ToyRepository extends Repository { 7 | Option findByName(String toyName); 8 | } -------------------------------------------------------------------------------- /exercise/java/day24/src/main/java/domain/core/Error.java: -------------------------------------------------------------------------------- 1 | package domain.core; 2 | 3 | public record Error(String message) { 4 | public static Error anError(String message) { 5 | return new Error(message); 6 | } 7 | } -------------------------------------------------------------------------------- /exercise/java/day24/src/main/java/domain/core/Unit.java: -------------------------------------------------------------------------------- 1 | package domain.core; 2 | 3 | public final class Unit { 4 | public static final Unit DEFAULT = new Unit(); 5 | 6 | private Unit() { 7 | } 8 | } -------------------------------------------------------------------------------- /exercise/java/day24/src/main/java/usecases/DeliverToy.java: -------------------------------------------------------------------------------- 1 | package usecases; 2 | 3 | public record DeliverToy(String childName, String desiredToy) { 4 | } -------------------------------------------------------------------------------- /exercise/java/day24/tcrw: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | base_dir="$(cd "$(dirname -- "$0")" && pwd)" 4 | . "${base_dir}/../tcr/tcr.sh" 5 | -------------------------------------------------------------------------------- /exercise/java/tcr/.gitignore: -------------------------------------------------------------------------------- 1 | # Below files and directories are automatically created 2 | # by tcr.sh and do not need to be committed to this repository 3 | 4 | bin/** 5 | doc/** 6 | download/** 7 | LICENSE.md 8 | README.md 9 | -------------------------------------------------------------------------------- /exercise/java/tcr/version.txt: -------------------------------------------------------------------------------- 1 | tcr 1.0.0 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day00/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day00/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists -------------------------------------------------------------------------------- /exercise/kotlin/day01/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day01/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists -------------------------------------------------------------------------------- /exercise/kotlin/day01/src/main/kotlin/communication/Logger.kt: -------------------------------------------------------------------------------- 1 | package communication 2 | 3 | interface Logger { 4 | fun log(message: String) 5 | } -------------------------------------------------------------------------------- /exercise/kotlin/day02/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day02/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists -------------------------------------------------------------------------------- /exercise/kotlin/day03/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day03/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists -------------------------------------------------------------------------------- /exercise/kotlin/day04/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day04/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists -------------------------------------------------------------------------------- /exercise/kotlin/day04/src/main/kotlin/routine/Email.kt: -------------------------------------------------------------------------------- 1 | package routine 2 | 3 | data class Email(val subject: String, val body: String) -------------------------------------------------------------------------------- /exercise/kotlin/day04/src/main/kotlin/routine/EmailService.kt: -------------------------------------------------------------------------------- 1 | package routine 2 | 3 | fun interface EmailService { 4 | fun readNewEmails() 5 | } -------------------------------------------------------------------------------- /exercise/kotlin/day04/src/main/kotlin/routine/ReindeerFeeder.kt: -------------------------------------------------------------------------------- 1 | package routine 2 | 3 | fun interface ReindeerFeeder { 4 | fun feedReindeers() 5 | } -------------------------------------------------------------------------------- /exercise/kotlin/day04/src/main/kotlin/routine/Schedule.kt: -------------------------------------------------------------------------------- 1 | package routine 2 | 3 | class Schedule { 4 | val tasks: MutableList = mutableListOf() 5 | } 6 | -------------------------------------------------------------------------------- /exercise/kotlin/day04/src/main/kotlin/routine/ScheduleService.kt: -------------------------------------------------------------------------------- 1 | package routine 2 | 3 | interface ScheduleService { 4 | fun todaySchedule(): Schedule 5 | fun organizeMyDay(schedule: Schedule) 6 | fun continueDay() 7 | } -------------------------------------------------------------------------------- /exercise/kotlin/day04/src/test/kotlin/RoutineTest.kt: -------------------------------------------------------------------------------- 1 | import io.kotest.core.spec.style.StringSpec 2 | 3 | class RoutineTest : StringSpec({ 4 | "start routine with Mockk" { 5 | 6 | } 7 | 8 | "start routine with manual test doubles" { 9 | } 10 | }) -------------------------------------------------------------------------------- /exercise/kotlin/day05/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day05/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists -------------------------------------------------------------------------------- /exercise/kotlin/day05/src/test/kotlin/EIDTest.kt: -------------------------------------------------------------------------------- 1 | import io.kotest.core.spec.style.StringSpec 2 | import io.kotest.matchers.shouldBe 3 | 4 | class EIDTest : StringSpec({ 5 | "implement your tests here" { 6 | 43 shouldBe 42 7 | } 8 | }) -------------------------------------------------------------------------------- /exercise/kotlin/day06/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day06/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists -------------------------------------------------------------------------------- /exercise/kotlin/day07/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day07/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists -------------------------------------------------------------------------------- /exercise/kotlin/day08/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day08/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists -------------------------------------------------------------------------------- /exercise/kotlin/day08/src/main/kotlin/domain/Toy.kt: -------------------------------------------------------------------------------- 1 | package domain 2 | 3 | class Toy(val name: String, var state: State) { 4 | enum class State { 5 | UNASSIGNED, IN_PRODUCTION, COMPLETED 6 | } 7 | } -------------------------------------------------------------------------------- /exercise/kotlin/day08/src/main/kotlin/domain/ToyRepository.kt: -------------------------------------------------------------------------------- 1 | package domain 2 | 3 | interface ToyRepository { 4 | fun findByName(name: String): Toy? 5 | fun save(toy: Toy) 6 | } -------------------------------------------------------------------------------- /exercise/kotlin/day09/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day09/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists -------------------------------------------------------------------------------- /exercise/kotlin/day09/src/main/kotlin/gift/Behavior.kt: -------------------------------------------------------------------------------- 1 | package gift 2 | 3 | enum class Behavior { 4 | NAUGHTY, NICE 5 | } 6 | -------------------------------------------------------------------------------- /exercise/kotlin/day09/src/main/kotlin/gift/Child.kt: -------------------------------------------------------------------------------- 1 | package gift 2 | 3 | data class Child( 4 | val firstName: String, 5 | val lastName: String, 6 | val behavior: Behavior, 7 | val giftRequest: GiftRequest 8 | ) 9 | -------------------------------------------------------------------------------- /exercise/kotlin/day09/src/main/kotlin/gift/GiftRequest.kt: -------------------------------------------------------------------------------- 1 | package gift 2 | 3 | data class GiftRequest( 4 | val giftName: String, 5 | val isFeasible: Boolean, 6 | val priority: Priority 7 | ) -------------------------------------------------------------------------------- /exercise/kotlin/day09/src/main/kotlin/gift/Priority.kt: -------------------------------------------------------------------------------- 1 | package gift 2 | 3 | enum class Priority { 4 | DREAM, NICE_TO_HAVE 5 | } -------------------------------------------------------------------------------- /exercise/kotlin/day09/src/main/kotlin/gift/SantaService.kt: -------------------------------------------------------------------------------- 1 | package gift 2 | 3 | class SantaService { 4 | fun evaluateRequest(child: Child): Boolean = 5 | child.behavior == Behavior.NICE && child.giftRequest.isFeasible 6 | } -------------------------------------------------------------------------------- /exercise/kotlin/day10/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day10/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists -------------------------------------------------------------------------------- /exercise/kotlin/day10/src/test/resources/1.txt: -------------------------------------------------------------------------------- 1 | (()) -------------------------------------------------------------------------------- /exercise/kotlin/day10/src/test/resources/2.txt: -------------------------------------------------------------------------------- 1 | (()(()( -------------------------------------------------------------------------------- /exercise/kotlin/day10/src/test/resources/3.txt: -------------------------------------------------------------------------------- 1 | ()) -------------------------------------------------------------------------------- /exercise/kotlin/day10/src/test/resources/4.txt: -------------------------------------------------------------------------------- 1 | (()(()(()(()(()(()(()(()(()(()(()(()(()(()(()(()(()(()(()))))))))))))))))(((((()(()))))))))))(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((())))))()())(()()()()()()()()())))))))))) -------------------------------------------------------------------------------- /exercise/kotlin/day10/src/test/resources/5.txt: -------------------------------------------------------------------------------- 1 | )())()) -------------------------------------------------------------------------------- /exercise/kotlin/day11/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day11/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists -------------------------------------------------------------------------------- /exercise/kotlin/day12/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day12/src/main/kotlin/gifts/Toy.kt: -------------------------------------------------------------------------------- 1 | package gifts 2 | data class Toy(val description: String) 3 | -------------------------------------------------------------------------------- /exercise/kotlin/day13/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day13/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists -------------------------------------------------------------------------------- /exercise/kotlin/day13/src/main/kotlin/santamarket/model/Offer.kt: -------------------------------------------------------------------------------- 1 | package santamarket.model 2 | 3 | data class Offer(val offerType: SpecialOfferType, val product: Product, val argument: Double) -------------------------------------------------------------------------------- /exercise/kotlin/day13/src/main/kotlin/santamarket/model/Product.kt: -------------------------------------------------------------------------------- 1 | package santamarket.model 2 | 3 | data class Product(val name: String, val unit: ProductUnit) -------------------------------------------------------------------------------- /exercise/kotlin/day13/src/main/kotlin/santamarket/model/ProductQuantity.kt: -------------------------------------------------------------------------------- 1 | package santamarket.model 2 | 3 | data class ProductQuantity(val product: Product, val quantity: Double) -------------------------------------------------------------------------------- /exercise/kotlin/day13/src/main/kotlin/santamarket/model/ProductUnit.kt: -------------------------------------------------------------------------------- 1 | package santamarket.model 2 | 3 | enum class ProductUnit { 4 | KILO, EACH 5 | } -------------------------------------------------------------------------------- /exercise/kotlin/day13/src/main/kotlin/santamarket/model/SantamarketCatalog.kt: -------------------------------------------------------------------------------- 1 | package santamarket.model 2 | 3 | interface SantamarketCatalog { 4 | fun addProduct(product: Product, price: Double) 5 | fun getUnitPrice(product: Product): Double 6 | } 7 | -------------------------------------------------------------------------------- /exercise/kotlin/day13/src/main/kotlin/santamarket/model/SpecialOfferType.kt: -------------------------------------------------------------------------------- 1 | package santamarket.model 2 | 3 | enum class SpecialOfferType { 4 | THREE_FOR_TWO, 5 | TEN_PERCENT_DISCOUNT, 6 | TWO_FOR_AMOUNT, 7 | FIVE_FOR_AMOUNT, 8 | } -------------------------------------------------------------------------------- /exercise/kotlin/day14/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day14/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists -------------------------------------------------------------------------------- /exercise/kotlin/day15/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day15/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists -------------------------------------------------------------------------------- /exercise/kotlin/day16/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day16/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists -------------------------------------------------------------------------------- /exercise/kotlin/day17/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day17/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists -------------------------------------------------------------------------------- /exercise/kotlin/day17/src/test/kotlin/EIDTest.kt: -------------------------------------------------------------------------------- 1 | import io.kotest.core.spec.style.StringSpec 2 | import io.kotest.matchers.shouldBe 3 | 4 | class EIDTest : StringSpec({ 5 | "implement your tests here" { 6 | 43 shouldBe 42 7 | } 8 | }) -------------------------------------------------------------------------------- /exercise/kotlin/day18/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day18/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists -------------------------------------------------------------------------------- /exercise/kotlin/day19/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day19/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists -------------------------------------------------------------------------------- /exercise/kotlin/day20/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day20/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists -------------------------------------------------------------------------------- /exercise/kotlin/day21/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day22/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day22/src/main/kotlin/eid/ParsingException.kt: -------------------------------------------------------------------------------- 1 | package eid 2 | 3 | data class ParsingException(override val message: String) : Exception(message) -------------------------------------------------------------------------------- /exercise/kotlin/day23/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day23/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists -------------------------------------------------------------------------------- /exercise/kotlin/day23/src/main/kotlin/core/control/AmplifierType.kt: -------------------------------------------------------------------------------- 1 | package core.control 2 | 3 | enum class AmplifierType(val multiplier: Int) { 4 | BASIC(1), 5 | BLESSED(2), 6 | DIVINE(3) 7 | } -------------------------------------------------------------------------------- /exercise/kotlin/day23/src/main/kotlin/core/control/Dashboard.kt: -------------------------------------------------------------------------------- 1 | package core.control 2 | 3 | class Dashboard { 4 | fun displayStatus(message: String) = println(message) 5 | } -------------------------------------------------------------------------------- /exercise/kotlin/day23/src/main/kotlin/core/control/SleighAction.kt: -------------------------------------------------------------------------------- 1 | package core.control 2 | 3 | enum class SleighAction { 4 | FLYING, 5 | HOVERING, 6 | PARKED 7 | } -------------------------------------------------------------------------------- /exercise/kotlin/day23/src/main/kotlin/core/control/SleighEngineStatus.kt: -------------------------------------------------------------------------------- 1 | package core.control 2 | 3 | enum class SleighEngineStatus { 4 | OFF, 5 | ON 6 | } 7 | -------------------------------------------------------------------------------- /exercise/kotlin/day24/.tcr/config.yml: -------------------------------------------------------------------------------- 1 | config: 2 | git: 3 | auto-push: false 4 | polling-period: 2s 5 | mob-timer: 6 | duration: 5m0s 7 | tcr: 8 | language: kotlin 9 | toolchain: gradle 10 | -------------------------------------------------------------------------------- /exercise/kotlin/day24/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/day24/src/main/kotlin/domain/ToyRepository.kt: -------------------------------------------------------------------------------- 1 | package domain 2 | 3 | import arrow.core.Option 4 | import domain.core.Repository 5 | 6 | interface ToyRepository : Repository { 7 | fun findByName(toyName: String): Option 8 | } 9 | -------------------------------------------------------------------------------- /exercise/kotlin/day24/src/main/kotlin/domain/core/Error.kt: -------------------------------------------------------------------------------- 1 | package domain.core 2 | 3 | data class Error(val message: String) { 4 | companion object { 5 | fun anError(message: String) = Error(message) 6 | } 7 | } -------------------------------------------------------------------------------- /exercise/kotlin/day24/src/main/kotlin/domain/core/Event.kt: -------------------------------------------------------------------------------- 1 | package domain.core 2 | 3 | import java.time.LocalDateTime 4 | import java.util.* 5 | 6 | interface Event { 7 | val id: UUID 8 | val version: Int get() = 1 9 | val date: LocalDateTime 10 | } -------------------------------------------------------------------------------- /exercise/kotlin/day24/src/main/kotlin/usecases/DeliverToy.kt: -------------------------------------------------------------------------------- 1 | package usecases 2 | 3 | data class DeliverToy(val childName: String, val desiredToy: String) 4 | -------------------------------------------------------------------------------- /exercise/kotlin/day24/tcrw: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | base_dir="$(cd "$(dirname -- "$0")" && pwd)" 4 | . "${base_dir}/../tcr/tcr.sh" 5 | -------------------------------------------------------------------------------- /exercise/kotlin/day25/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /exercise/kotlin/tcr/.gitignore: -------------------------------------------------------------------------------- 1 | # Below files and directories are automatically created 2 | # by tcr.sh and do not need to be committed to this repository 3 | 4 | bin/** 5 | doc/** 6 | download/** 7 | LICENSE.md 8 | README.md 9 | -------------------------------------------------------------------------------- /exercise/kotlin/tcr/version.txt: -------------------------------------------------------------------------------- 1 | tcr 1.0.0 2 | -------------------------------------------------------------------------------- /exercise/php/day01/src/Communication/ILogger.php: -------------------------------------------------------------------------------- 1 | toBe(42); 9 | }); 10 | -------------------------------------------------------------------------------- /exercise/php/day07/src/Workshop/Status.php: -------------------------------------------------------------------------------- 1 | toBe(42); 7 | }); 8 | -------------------------------------------------------------------------------- /exercise/php/day20/src/Enums/ReindeerColor.php: -------------------------------------------------------------------------------- 1 | =3.2 2 | djangorestframework 3 | pytest 4 | pytest-django 5 | pytest-flask 6 | requests -------------------------------------------------------------------------------- /exercise/python/day20/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/exercise/python/day20/tests/__init__.py -------------------------------------------------------------------------------- /exercise/python/day21/requirements.txt: -------------------------------------------------------------------------------- 1 | assertpy~=1.1 2 | pytest -------------------------------------------------------------------------------- /exercise/python/day21/tour/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/exercise/python/day21/tour/__init__.py -------------------------------------------------------------------------------- /exercise/python/day22/eid/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/exercise/python/day22/eid/__init__.py -------------------------------------------------------------------------------- /exercise/python/day22/eid/parsing_error.py: -------------------------------------------------------------------------------- 1 | class ParsingError: 2 | def __init__(self, message: str): 3 | self.message = message 4 | -------------------------------------------------------------------------------- /exercise/python/day22/requirements.txt: -------------------------------------------------------------------------------- 1 | assertpy~=1.1 2 | pytest 3 | hypothesis~=6.108.2 4 | setuptools~=70.3.0 -------------------------------------------------------------------------------- /exercise/python/day22/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/exercise/python/day22/tests/__init__.py -------------------------------------------------------------------------------- /exercise/python/day23/core/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/exercise/python/day23/core/__init__.py -------------------------------------------------------------------------------- /exercise/python/day23/external/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/exercise/python/day23/external/__init__.py -------------------------------------------------------------------------------- /exercise/python/day23/requirements.txt: -------------------------------------------------------------------------------- 1 | assertpy~=1.1 2 | pytest 3 | hypothesis~=6.108.2 4 | setuptools~=70.3.0 -------------------------------------------------------------------------------- /exercise/python/day23/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/exercise/python/day23/tests/__init__.py -------------------------------------------------------------------------------- /exercise/python/day24/.tcr/config.yml: -------------------------------------------------------------------------------- 1 | config: 2 | git: 3 | auto-push: false 4 | polling-period: 2s 5 | mob-timer: 6 | duration: 5m0s 7 | tcr: 8 | language: python 9 | toolchain: pytest 10 | -------------------------------------------------------------------------------- /exercise/python/day24/domain/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/exercise/python/day24/domain/__init__.py -------------------------------------------------------------------------------- /exercise/python/day24/domain/core/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/exercise/python/day24/domain/core/__init__.py -------------------------------------------------------------------------------- /exercise/python/day24/requirements.txt: -------------------------------------------------------------------------------- 1 | assertpy~=1.1 2 | pytest 3 | Faker~=26.0.0 4 | hypothesis~=6.108.2 5 | setuptools~=70.3.0 -------------------------------------------------------------------------------- /exercise/python/day24/tcrw: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | base_dir="$(cd "$(dirname -- "$0")" && pwd)" 4 | . "${base_dir}/../tcr/tcr.sh" 5 | -------------------------------------------------------------------------------- /exercise/python/day24/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/exercise/python/day24/tests/__init__.py -------------------------------------------------------------------------------- /exercise/python/day24/tests/time.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | 3 | 4 | class Time: 5 | now = datetime(2024, 12, 24, 23, 30, 45) 6 | 7 | @staticmethod 8 | def time_provider(): 9 | return Time.now 10 | -------------------------------------------------------------------------------- /exercise/python/day24/usecases/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/exercise/python/day24/usecases/__init__.py -------------------------------------------------------------------------------- /exercise/python/day24/usecases/deliver_toy.py: -------------------------------------------------------------------------------- 1 | class DeliverToy: 2 | def __init__(self, child_name: str, desired_toy: str): 3 | self.child_name = child_name 4 | self.desired_toy = desired_toy 5 | -------------------------------------------------------------------------------- /exercise/python/day25/setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | 3 | setup( 4 | name='🕰 Time Capsule', 5 | version='0.1', 6 | packages=find_packages() 7 | ) 8 | -------------------------------------------------------------------------------- /exercise/python/day25/time_capsule/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/exercise/python/day25/time_capsule/__init__.py -------------------------------------------------------------------------------- /exercise/python/tcr/.gitignore: -------------------------------------------------------------------------------- 1 | # Below files and directories are automatically created 2 | # by tcr.sh and do not need to be committed to this repository 3 | 4 | bin/** 5 | doc/** 6 | download/** 7 | LICENSE.md 8 | README.md 9 | -------------------------------------------------------------------------------- /exercise/python/tcr/version.txt: -------------------------------------------------------------------------------- 1 | tcr 1.0.0 2 | -------------------------------------------------------------------------------- /exercise/scala/day00/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.9.8 -------------------------------------------------------------------------------- /exercise/scala/day01/build.sbt: -------------------------------------------------------------------------------- 1 | ThisBuild / version := "0.1.0-SNAPSHOT" 2 | ThisBuild / scalaVersion := "3.4.2" 3 | libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.15" % "test" -------------------------------------------------------------------------------- /exercise/scala/day01/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.9.8 -------------------------------------------------------------------------------- /exercise/scala/day01/src/main/scala/communication/Logger.scala: -------------------------------------------------------------------------------- 1 | package communication 2 | 3 | trait Logger { 4 | def log(message: String): Unit 5 | } -------------------------------------------------------------------------------- /exercise/scala/day02/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.9.8 -------------------------------------------------------------------------------- /exercise/scala/day03/build.sbt: -------------------------------------------------------------------------------- 1 | ThisBuild / version := "0.1.0-SNAPSHOT" 2 | ThisBuild / scalaVersion := "3.4.2" 3 | libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.15" % "test" -------------------------------------------------------------------------------- /exercise/scala/day03/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.9.8 -------------------------------------------------------------------------------- /exercise/scala/day04/build.sbt: -------------------------------------------------------------------------------- 1 | ThisBuild / version := "0.1.0-SNAPSHOT" 2 | ThisBuild / scalaVersion := "3.4.2" 3 | libraryDependencies ++= Seq( 4 | "org.scalatest" %% "scalatest" % "3.2.15" % "test", 5 | "org.scalamock" %% "scalamock" % "6.0.0" % Test 6 | ) -------------------------------------------------------------------------------- /exercise/scala/day04/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.9.8 -------------------------------------------------------------------------------- /exercise/scala/day04/src/main/scala/routine/Email.scala: -------------------------------------------------------------------------------- 1 | package routine 2 | 3 | case class Email(subject: String, body: String) -------------------------------------------------------------------------------- /exercise/scala/day04/src/main/scala/routine/EmailService.scala: -------------------------------------------------------------------------------- 1 | package routine 2 | 3 | trait EmailService { 4 | def readNewEmails(): Unit 5 | } -------------------------------------------------------------------------------- /exercise/scala/day04/src/main/scala/routine/ReindeerFeeder.scala: -------------------------------------------------------------------------------- 1 | package routine 2 | 3 | trait ReindeerFeeder { 4 | def feedReindeers(): Unit 5 | } -------------------------------------------------------------------------------- /exercise/scala/day04/src/main/scala/routine/Schedule.scala: -------------------------------------------------------------------------------- 1 | package routine 2 | 3 | case class Schedule(var tasks: Seq[String]) -------------------------------------------------------------------------------- /exercise/scala/day04/src/main/scala/routine/ScheduleService.scala: -------------------------------------------------------------------------------- 1 | package routine 2 | 3 | trait ScheduleService { 4 | def todaySchedule(): Schedule 5 | 6 | def organizeMyDay(schedule: Schedule): Unit 7 | 8 | def continueDay(): Unit 9 | } 10 | -------------------------------------------------------------------------------- /exercise/scala/day05/build.sbt: -------------------------------------------------------------------------------- 1 | ThisBuild / version := "0.1.0-SNAPSHOT" 2 | ThisBuild / scalaVersion := "3.4.2" 3 | libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.15" % "test" -------------------------------------------------------------------------------- /exercise/scala/day05/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.9.8 -------------------------------------------------------------------------------- /exercise/scala/day06/build.sbt: -------------------------------------------------------------------------------- 1 | ThisBuild / version := "0.1.0-SNAPSHOT" 2 | ThisBuild / scalaVersion := "3.4.2" 3 | libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.15" % "test" -------------------------------------------------------------------------------- /exercise/scala/day06/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.9.8 -------------------------------------------------------------------------------- /exercise/scala/day07/build.sbt: -------------------------------------------------------------------------------- 1 | ThisBuild / version := "0.1.0-SNAPSHOT" 2 | ThisBuild / scalaVersion := "3.4.2" 3 | libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.15" % "test" -------------------------------------------------------------------------------- /exercise/scala/day07/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.9.8 -------------------------------------------------------------------------------- /exercise/scala/day08/build.sbt: -------------------------------------------------------------------------------- 1 | ThisBuild / version := "0.1.0-SNAPSHOT" 2 | ThisBuild / scalaVersion := "3.4.2" 3 | libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.15" % "test" -------------------------------------------------------------------------------- /exercise/scala/day08/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.9.8 -------------------------------------------------------------------------------- /exercise/scala/day08/src/main/scala/domain/Toy.scala: -------------------------------------------------------------------------------- 1 | package domain 2 | 3 | class Toy(val name: String, var state: Toy.State) 4 | 5 | object Toy { 6 | enum State { 7 | case UNASSIGNED, IN_PRODUCTION, COMPLETED 8 | } 9 | } -------------------------------------------------------------------------------- /exercise/scala/day08/src/main/scala/domain/ToyRepository.scala: -------------------------------------------------------------------------------- 1 | package domain 2 | 3 | trait ToyRepository { 4 | def findByName(name: String): Option[Toy] 5 | 6 | def save(toy: Toy): Unit 7 | } -------------------------------------------------------------------------------- /exercise/scala/day09/build.sbt: -------------------------------------------------------------------------------- 1 | ThisBuild / version := "0.1.0-SNAPSHOT" 2 | ThisBuild / scalaVersion := "3.4.2" 3 | libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.15" % "test" -------------------------------------------------------------------------------- /exercise/scala/day09/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.9.8 -------------------------------------------------------------------------------- /exercise/scala/day09/src/main/scala/gift/Behavior.scala: -------------------------------------------------------------------------------- 1 | package gift 2 | 3 | enum Behavior { 4 | case NAUGHTY, NICE 5 | } -------------------------------------------------------------------------------- /exercise/scala/day09/src/main/scala/gift/GiftRequest.scala: -------------------------------------------------------------------------------- 1 | package gift 2 | 3 | case class GiftRequest( 4 | giftName: String, 5 | isFeasible: Boolean, 6 | priority: Priority 7 | ) -------------------------------------------------------------------------------- /exercise/scala/day09/src/main/scala/gift/Priority.scala: -------------------------------------------------------------------------------- 1 | package gift 2 | 3 | enum Priority { 4 | case DREAM, NICE_TO_HAVE 5 | } -------------------------------------------------------------------------------- /exercise/scala/day09/src/main/scala/gift/SantaService.scala: -------------------------------------------------------------------------------- 1 | package gift 2 | 3 | class SantaService { 4 | def evaluateRequest(child: Child): Boolean = 5 | child.behavior == Behavior.NICE && child.giftRequest.isFeasible 6 | } -------------------------------------------------------------------------------- /exercise/scala/day10/build.sbt: -------------------------------------------------------------------------------- 1 | ThisBuild / version := "0.1.0-SNAPSHOT" 2 | ThisBuild / scalaVersion := "3.4.2" 3 | libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.15" % "test" -------------------------------------------------------------------------------- /exercise/scala/day10/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.9.8 -------------------------------------------------------------------------------- /exercise/scala/day10/src/test/resources/1.txt: -------------------------------------------------------------------------------- 1 | (()) -------------------------------------------------------------------------------- /exercise/scala/day10/src/test/resources/2.txt: -------------------------------------------------------------------------------- 1 | (()(()( -------------------------------------------------------------------------------- /exercise/scala/day10/src/test/resources/3.txt: -------------------------------------------------------------------------------- 1 | ()) -------------------------------------------------------------------------------- /exercise/scala/day10/src/test/resources/4.txt: -------------------------------------------------------------------------------- 1 | (()(()(()(()(()(()(()(()(()(()(()(()(()(()(()(()(()(()(()))))))))))))))))(((((()(()))))))))))(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((())))))()())(()()()()()()()()())))))))))) -------------------------------------------------------------------------------- /exercise/scala/day10/src/test/resources/5.txt: -------------------------------------------------------------------------------- 1 | )())()) -------------------------------------------------------------------------------- /exercise/scala/day11/build.sbt: -------------------------------------------------------------------------------- 1 | ThisBuild / version := "0.1.0-SNAPSHOT" 2 | ThisBuild / scalaVersion := "3.4.2" 3 | libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.15" % "test" -------------------------------------------------------------------------------- /exercise/scala/day11/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.9.8 -------------------------------------------------------------------------------- /exercise/scala/day11/project/plugins.sbt: -------------------------------------------------------------------------------- 1 | addSbtPlugin("io.stryker-mutator" % "sbt-stryker4s" % "0.16.1") -------------------------------------------------------------------------------- /exercise/scala/day12/build.sbt: -------------------------------------------------------------------------------- 1 | ThisBuild / version := "0.1.0-SNAPSHOT" 2 | ThisBuild / scalaVersion := "3.4.2" 3 | libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.15" % "test" -------------------------------------------------------------------------------- /exercise/scala/day12/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.9.8 -------------------------------------------------------------------------------- /exercise/scala/day12/project/plugins.sbt: -------------------------------------------------------------------------------- 1 | addSbtPlugin("io.stryker-mutator" % "sbt-stryker4s" % "0.16.1") -------------------------------------------------------------------------------- /exercise/scala/day13/build.sbt: -------------------------------------------------------------------------------- 1 | ThisBuild / version := "0.1.0-SNAPSHOT" 2 | ThisBuild / scalaVersion := "3.4.2" 3 | libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.15" % "test" -------------------------------------------------------------------------------- /exercise/scala/day13/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.9.8 -------------------------------------------------------------------------------- /exercise/scala/day13/project/plugins.sbt: -------------------------------------------------------------------------------- 1 | addSbtPlugin("io.stryker-mutator" % "sbt-stryker4s" % "0.16.1") -------------------------------------------------------------------------------- /exercise/scala/day13/src/main/scala/santamarket/model/Offer.scala: -------------------------------------------------------------------------------- 1 | package santamarket.model 2 | 3 | case class Offer(offerType: SpecialOfferType, product: Product, argument: Double) -------------------------------------------------------------------------------- /exercise/scala/day13/src/main/scala/santamarket/model/Product.scala: -------------------------------------------------------------------------------- 1 | package santamarket.model 2 | 3 | case class Product(name: String, unit: ProductUnit) -------------------------------------------------------------------------------- /exercise/scala/day13/src/main/scala/santamarket/model/ProductQuantity.scala: -------------------------------------------------------------------------------- 1 | package santamarket.model 2 | 3 | case class ProductQuantity(product: Product, quantity: Double) -------------------------------------------------------------------------------- /exercise/scala/day13/src/main/scala/santamarket/model/ProductUnit.scala: -------------------------------------------------------------------------------- 1 | package santamarket.model 2 | 3 | enum ProductUnit: 4 | case KILO, EACH 5 | -------------------------------------------------------------------------------- /exercise/scala/day13/src/main/scala/santamarket/model/SantamarketCatalog.scala: -------------------------------------------------------------------------------- 1 | package santamarket.model 2 | 3 | trait SantamarketCatalog: 4 | def addProduct(product: Product, price: Double): Unit 5 | def getUnitPrice(product: Product): Double 6 | -------------------------------------------------------------------------------- /exercise/scala/day13/src/main/scala/santamarket/model/SpecialOfferType.scala: -------------------------------------------------------------------------------- 1 | package santamarket.model 2 | 3 | enum SpecialOfferType: 4 | case THREE_FOR_TWO, TEN_PERCENT_DISCOUNT, TWO_FOR_AMOUNT, FIVE_FOR_AMOUNT 5 | -------------------------------------------------------------------------------- /exercise/scala/day14/build.sbt: -------------------------------------------------------------------------------- 1 | ThisBuild / version := "0.1.0-SNAPSHOT" 2 | ThisBuild / scalaVersion := "3.4.2" 3 | libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.15" % "test" -------------------------------------------------------------------------------- /exercise/scala/day14/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.9.8 -------------------------------------------------------------------------------- /exercise/scala/day15/build.sbt: -------------------------------------------------------------------------------- 1 | ThisBuild / version := "0.1.0-SNAPSHOT" 2 | ThisBuild / scalaVersion := "3.4.2" 3 | libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.15" % "test" -------------------------------------------------------------------------------- /exercise/scala/day15/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.9.8 -------------------------------------------------------------------------------- /exercise/scala/day16/build.sbt: -------------------------------------------------------------------------------- 1 | ThisBuild / version := "0.1.0-SNAPSHOT" 2 | ThisBuild / scalaVersion := "3.4.2" 3 | libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.15" % "test" -------------------------------------------------------------------------------- /exercise/scala/day16/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.9.8 -------------------------------------------------------------------------------- /exercise/scala/day17/build.sbt: -------------------------------------------------------------------------------- 1 | ThisBuild / version := "0.1.0-SNAPSHOT" 2 | ThisBuild / scalaVersion := "3.4.2" 3 | libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.15" % "test" -------------------------------------------------------------------------------- /exercise/scala/day17/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.9.8 -------------------------------------------------------------------------------- /exercise/scala/day18/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.9.8 -------------------------------------------------------------------------------- /exercise/scala/day19/build.sbt: -------------------------------------------------------------------------------- 1 | ThisBuild / version := "0.1.0-SNAPSHOT" 2 | ThisBuild / scalaVersion := "3.4.2" 3 | libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.15" % "test" -------------------------------------------------------------------------------- /exercise/scala/day19/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.9.8 -------------------------------------------------------------------------------- /exercise/scala/day20/conf/routes: -------------------------------------------------------------------------------- 1 | POST /reindeer controllers.ReindeerController.createReindeer 2 | GET /reindeer/:id controllers.ReindeerController.getReindeer(id: String) -------------------------------------------------------------------------------- /exercise/scala/day20/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version=1.10.1 2 | -------------------------------------------------------------------------------- /exercise/scala/day20/project/plugins.sbt: -------------------------------------------------------------------------------- 1 | addSbtPlugin("org.playframework" % "sbt-plugin" % "3.0.5") 2 | addSbtPlugin("org.foundweekends.giter8" % "sbt-giter8-scaffold" % "0.16.2") 3 | -------------------------------------------------------------------------------- /exercise/scala/day21/build.sbt: -------------------------------------------------------------------------------- 1 | ThisBuild / version := "0.1.0-SNAPSHOT" 2 | ThisBuild / scalaVersion := "3.4.2" 3 | libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.15" % "test" -------------------------------------------------------------------------------- /exercise/scala/day21/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.9.8 -------------------------------------------------------------------------------- /exercise/scala/day22/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.9.8 -------------------------------------------------------------------------------- /exercise/scala/day22/src/main/scala/eid/ParsingError.scala: -------------------------------------------------------------------------------- 1 | package eid 2 | 3 | opaque type ParsingError = String 4 | 5 | object ParsingError: 6 | def apply(error: String): ParsingError = error -------------------------------------------------------------------------------- /exercise/scala/day23/build.sbt: -------------------------------------------------------------------------------- 1 | ThisBuild / version := "0.1.0-SNAPSHOT" 2 | ThisBuild / scalaVersion := "3.4.2" 3 | libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.15" % "test" -------------------------------------------------------------------------------- /exercise/scala/day23/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.9.8 -------------------------------------------------------------------------------- /exercise/scala/day23/src/main/scala/core/control/AmplifierType.scala: -------------------------------------------------------------------------------- 1 | package core.control 2 | 3 | object AmplifierType extends Enumeration { 4 | type AmplifierType = Value 5 | val BASIC = Value(1) 6 | val BLESSED = Value(2) 7 | val DIVINE = Value(3) 8 | } -------------------------------------------------------------------------------- /exercise/scala/day23/src/main/scala/core/control/Dashboard.scala: -------------------------------------------------------------------------------- 1 | package core.control 2 | 3 | class Dashboard { 4 | def displayStatus(message: String): Unit = println(message) 5 | } -------------------------------------------------------------------------------- /exercise/scala/day23/src/main/scala/core/control/ReindeersNeedRestException.scala: -------------------------------------------------------------------------------- 1 | package core.control 2 | 3 | class ReindeersNeedRestException extends Throwable { 4 | override def getMessage: String = "The reindeer needs rest. Please park the sleigh..." 5 | } 6 | -------------------------------------------------------------------------------- /exercise/scala/day23/src/main/scala/core/control/SleighAction.scala: -------------------------------------------------------------------------------- 1 | package core.control 2 | 3 | object SleighAction extends Enumeration { 4 | type SleighAction = Value 5 | val FLYING, HOVERING, PARKED = Value 6 | } -------------------------------------------------------------------------------- /exercise/scala/day23/src/main/scala/core/control/SleighEngineStatus.scala: -------------------------------------------------------------------------------- 1 | package core.control 2 | 3 | object SleighEngineStatus extends Enumeration { 4 | type SleighEngineStatus = Value 5 | val OFF, ON = Value 6 | } -------------------------------------------------------------------------------- /exercise/scala/day24/.tcr/config.yml: -------------------------------------------------------------------------------- 1 | config: 2 | git: 3 | auto-push: false 4 | polling-period: 2s 5 | mob-timer: 6 | duration: 5m0s 7 | tcr: 8 | language: scala 9 | toolchain: sbt 10 | -------------------------------------------------------------------------------- /exercise/scala/day24/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.9.8 -------------------------------------------------------------------------------- /exercise/scala/day24/src/main/scala/communication/Logger.scala: -------------------------------------------------------------------------------- 1 | package communication 2 | 3 | trait Logger { 4 | def log(message: String): Unit 5 | } -------------------------------------------------------------------------------- /exercise/scala/day24/src/main/scala/domain/ToyRepository.scala: -------------------------------------------------------------------------------- 1 | package domain 2 | 3 | import domain.core.Repository 4 | 5 | trait ToyRepository extends Repository[Toy] { 6 | def findByName(toyName: String): Option[Toy] 7 | } -------------------------------------------------------------------------------- /exercise/scala/day24/src/main/scala/domain/core/Error.scala: -------------------------------------------------------------------------------- 1 | package domain.core 2 | 3 | case class Error(message: String) 4 | 5 | object Error { 6 | def anError(message: String): Error = Error(message) 7 | } -------------------------------------------------------------------------------- /exercise/scala/day24/src/main/scala/domain/core/Event.scala: -------------------------------------------------------------------------------- 1 | package domain.core 2 | 3 | import java.time.LocalDateTime 4 | import java.util.UUID 5 | 6 | trait Event { 7 | val id: UUID 8 | val version: Int = 1 9 | val date: LocalDateTime 10 | } -------------------------------------------------------------------------------- /exercise/scala/day24/src/main/scala/domain/core/Extensions.scala: -------------------------------------------------------------------------------- 1 | package domain.core 2 | 3 | object Extensions { 4 | extension [T](obj: T) 5 | def let(sideEffect: T => Unit): T = { 6 | sideEffect(obj) 7 | obj 8 | } 9 | } -------------------------------------------------------------------------------- /exercise/scala/day24/src/main/scala/domain/core/Repository.scala: -------------------------------------------------------------------------------- 1 | package domain.core 2 | 3 | import java.util.UUID 4 | 5 | trait Repository[A <: EventSourcedAggregate] { 6 | def findById(id: UUID): Option[A] 7 | 8 | def save(aggregate: A): Unit 9 | } -------------------------------------------------------------------------------- /exercise/scala/day24/src/main/scala/usecases/DeliverToy.scala: -------------------------------------------------------------------------------- 1 | package usecases 2 | 3 | case class DeliverToy(childName: String, desiredToy: String) -------------------------------------------------------------------------------- /exercise/scala/day24/tcrw: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | base_dir="$(cd "$(dirname -- "$0")" && pwd)" 4 | . "${base_dir}/../tcr/tcr.sh" 5 | -------------------------------------------------------------------------------- /exercise/scala/day25/build.sbt: -------------------------------------------------------------------------------- 1 | ThisBuild / scalaVersion := "3.3.0" // Scala 3 version -------------------------------------------------------------------------------- /exercise/scala/day25/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.9.8 -------------------------------------------------------------------------------- /exercise/scala/tcr/.gitignore: -------------------------------------------------------------------------------- 1 | # Below files and directories are automatically created 2 | # by tcr.sh and do not need to be committed to this repository 3 | 4 | bin/** 5 | doc/** 6 | download/** 7 | LICENSE.md 8 | README.md 9 | -------------------------------------------------------------------------------- /exercise/scala/tcr/version.txt: -------------------------------------------------------------------------------- 1 | tcr 1.0.0 2 | -------------------------------------------------------------------------------- /exercise/ts/day00/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /exercise/ts/day00/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /exercise/ts/day01/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /exercise/ts/day01/src/logger.ts: -------------------------------------------------------------------------------- 1 | export interface Logger { 2 | log(message: string): void; 3 | } -------------------------------------------------------------------------------- /exercise/ts/day01/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /exercise/ts/day02/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /exercise/ts/day02/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /exercise/ts/day03/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /exercise/ts/day03/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /exercise/ts/day04/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /exercise/ts/day04/src/routine/email.ts: -------------------------------------------------------------------------------- 1 | class Email { 2 | subject: string; 3 | body: string; 4 | } -------------------------------------------------------------------------------- /exercise/ts/day04/src/routine/emailService.ts: -------------------------------------------------------------------------------- 1 | export interface EmailService { 2 | readNewEmails(): void; 3 | } -------------------------------------------------------------------------------- /exercise/ts/day04/src/routine/reindeerFeeder.ts: -------------------------------------------------------------------------------- 1 | export interface ReindeerFeeder { 2 | feedReindeers(): void; 3 | } -------------------------------------------------------------------------------- /exercise/ts/day04/src/routine/schedule.ts: -------------------------------------------------------------------------------- 1 | export class Schedule { 2 | tasks: string[] = []; 3 | } -------------------------------------------------------------------------------- /exercise/ts/day04/src/routine/scheduleService.ts: -------------------------------------------------------------------------------- 1 | import {Schedule} from "./schedule"; 2 | 3 | export interface ScheduleService { 4 | todaySchedule(): Schedule; 5 | 6 | organizeMyDay(schedule: Schedule): void; 7 | 8 | continueDay(): void; 9 | } -------------------------------------------------------------------------------- /exercise/ts/day04/tests/routine.spec.ts: -------------------------------------------------------------------------------- 1 | describe('Routine', () => { 2 | test('start routine with Jest', () => { 3 | 4 | }); 5 | 6 | test('start routine with manual test doubles', () => { 7 | 8 | }); 9 | }); -------------------------------------------------------------------------------- /exercise/ts/day04/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /exercise/ts/day05/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /exercise/ts/day05/tests/eid.spec.ts: -------------------------------------------------------------------------------- 1 | describe('EID', () => { 2 | test('implement your tests here', () => { 3 | expect(43).toBe(42); 4 | }); 5 | }); -------------------------------------------------------------------------------- /exercise/ts/day05/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /exercise/ts/day06/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /exercise/ts/day06/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /exercise/ts/day07/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /exercise/ts/day07/src/workshop/status.ts: -------------------------------------------------------------------------------- 1 | export enum Status { 2 | Producing = 'Producing', 3 | Produced = 'Produced' 4 | } -------------------------------------------------------------------------------- /exercise/ts/day07/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /exercise/ts/day08/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /exercise/ts/day08/src/domain/toyRepository.ts: -------------------------------------------------------------------------------- 1 | import {Toy} from "./toy"; 2 | 3 | export interface ToyRepository { 4 | findByName(name: string): Toy | null; 5 | save(toy: Toy): void; 6 | } -------------------------------------------------------------------------------- /exercise/ts/day08/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /exercise/ts/day09/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /exercise/ts/day09/src/behavior.ts: -------------------------------------------------------------------------------- 1 | type Behavior = "naughty" | "nice"; -------------------------------------------------------------------------------- /exercise/ts/day09/src/priority.ts: -------------------------------------------------------------------------------- 1 | type Priority = "dream" | "nice to have"; -------------------------------------------------------------------------------- /exercise/ts/day09/src/santaService.ts: -------------------------------------------------------------------------------- 1 | import {Child} from "./child"; 2 | 3 | export class SantaService { 4 | public evaluateRequest(child: Child): boolean { 5 | return child.behavior === "nice" && child.giftRequest.isFeasible; 6 | } 7 | } -------------------------------------------------------------------------------- /exercise/ts/day09/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /exercise/ts/day10/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /exercise/ts/day10/tests/deliveries/1.txt: -------------------------------------------------------------------------------- 1 | (()) -------------------------------------------------------------------------------- /exercise/ts/day10/tests/deliveries/2.txt: -------------------------------------------------------------------------------- 1 | (()(()( -------------------------------------------------------------------------------- /exercise/ts/day10/tests/deliveries/3.txt: -------------------------------------------------------------------------------- 1 | ()) -------------------------------------------------------------------------------- /exercise/ts/day10/tests/deliveries/4.txt: -------------------------------------------------------------------------------- 1 | (()(()(()(()(()(()(()(()(()(()(()(()(()(()(()(()(()(()(()))))))))))))))))(((((()(()))))))))))(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((())))))()())(()()()()()()()()())))))))))) -------------------------------------------------------------------------------- /exercise/ts/day10/tests/deliveries/5.txt: -------------------------------------------------------------------------------- 1 | )())()) -------------------------------------------------------------------------------- /exercise/ts/day10/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /exercise/ts/day11/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /exercise/ts/day11/src/christmas/toyType.ts: -------------------------------------------------------------------------------- 1 | export enum ToyType { 2 | EDUCATIONAL = 'Educational', 3 | FUN = 'Fun', 4 | CREATIVE = 'Creative' 5 | } -------------------------------------------------------------------------------- /exercise/ts/day11/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /exercise/ts/day12/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /exercise/ts/day12/src/gifts/Toy.ts: -------------------------------------------------------------------------------- 1 | export class Toy { 2 | constructor(public description: string) {} 3 | } -------------------------------------------------------------------------------- /exercise/ts/day12/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /exercise/ts/day13/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /exercise/ts/day13/src/santamarket.model/ProductUnit.ts: -------------------------------------------------------------------------------- 1 | export enum ProductUnit { 2 | KILO = 'KILO', 3 | EACH = 'EACH', 4 | } -------------------------------------------------------------------------------- /exercise/ts/day13/src/santamarket.model/SantamarketCatalog.ts: -------------------------------------------------------------------------------- 1 | import { Product } from './Product'; 2 | 3 | export interface SantamarketCatalog { 4 | addProduct(product: Product, price: number): void; 5 | getUnitPrice(product: Product): number; 6 | } -------------------------------------------------------------------------------- /exercise/ts/day13/src/santamarket.model/SpecialOfferType.ts: -------------------------------------------------------------------------------- 1 | export enum SpecialOfferType { 2 | THREE_FOR_TWO, 3 | TEN_PERCENT_DISCOUNT, 4 | TWO_FOR_AMOUNT, 5 | FIVE_FOR_AMOUNT, 6 | } -------------------------------------------------------------------------------- /exercise/ts/day13/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /exercise/ts/day14/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /exercise/ts/day14/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /exercise/ts/day15/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /exercise/ts/day15/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /exercise/ts/day16/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /exercise/ts/day16/src/elf.ts: -------------------------------------------------------------------------------- 1 | export class Elf { 2 | constructor(public id: number, public skillLevel: number) {} 3 | } -------------------------------------------------------------------------------- /exercise/ts/day16/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /exercise/ts/day17/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /exercise/ts/day17/tests/eid.spec.ts: -------------------------------------------------------------------------------- 1 | describe('EID', () => { 2 | test('implement your tests here', () => { 3 | expect(43).toBe(42); 4 | }); 5 | }); -------------------------------------------------------------------------------- /exercise/ts/day17/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /exercise/ts/day18/cucumber.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | default: `--require-module ts-node/register --require 'features/**/*.ts'` 3 | }; -------------------------------------------------------------------------------- /exercise/ts/day18/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /exercise/ts/day19/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /exercise/ts/day19/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /exercise/ts/day20/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /exercise/ts/day21/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /exercise/ts/day21/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /exercise/ts/day22/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(tests|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /exercise/ts/day22/src/eid/parsingException.ts: -------------------------------------------------------------------------------- 1 | export class ParsingException extends Error { 2 | constructor(message: string) { 3 | super(message); 4 | this.name = 'ParsingException'; 5 | } 6 | } -------------------------------------------------------------------------------- /exercise/ts/day22/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /exercise/ts/day23/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /exercise/ts/day23/src/control.core/amplifierType.ts: -------------------------------------------------------------------------------- 1 | export enum AmplifierType { 2 | BASIC = 1, 3 | BLESSED = 2, 4 | DIVINE = 3 5 | } -------------------------------------------------------------------------------- /exercise/ts/day23/src/control.core/dashboard.ts: -------------------------------------------------------------------------------- 1 | export class Dashboard { 2 | public displayStatus(message: string) { 3 | console.log(message); 4 | } 5 | } -------------------------------------------------------------------------------- /exercise/ts/day23/src/control.core/enums.ts: -------------------------------------------------------------------------------- 1 | export enum SleighEngineStatus { 2 | OFF = "OFF", 3 | ON = "ON" 4 | } 5 | 6 | export enum SleighAction { 7 | FLYING = "FLYING", 8 | HOVERING = "HOVERING", 9 | PARKED = "PARKED" 10 | } -------------------------------------------------------------------------------- /exercise/ts/day23/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /exercise/ts/day24/.tcr/config.yml: -------------------------------------------------------------------------------- 1 | config: 2 | git: 3 | auto-push: false 4 | polling-period: 2s 5 | mob-timer: 6 | duration: 5m0s 7 | tcr: 8 | language: typescript 9 | toolchain: yarn 10 | -------------------------------------------------------------------------------- /exercise/ts/day24/.tcr/language/typescript.yml: -------------------------------------------------------------------------------- 1 | toolchains: 2 | default: yarn 3 | compatible-with: [yarn] 4 | source-files: 5 | directories: [src] 6 | patterns: ['(?i)^.*\.ts$'] 7 | test-files: 8 | directories: [test] 9 | patterns: ['(?i)^.*\.ts$'] -------------------------------------------------------------------------------- /exercise/ts/day24/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(tests|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /exercise/ts/day24/src/domain/core/DomainError.ts: -------------------------------------------------------------------------------- 1 | export class DomainError { 2 | constructor(public message: string) { 3 | } 4 | 5 | static anError(message: string): DomainError { 6 | return new DomainError(message); 7 | } 8 | } -------------------------------------------------------------------------------- /exercise/ts/day24/src/domain/core/IEvent.ts: -------------------------------------------------------------------------------- 1 | export interface IEvent { 2 | id: string; 3 | version: number; 4 | date: Date; 5 | } -------------------------------------------------------------------------------- /exercise/ts/day24/src/domain/core/Unit.ts: -------------------------------------------------------------------------------- 1 | export class Unit { 2 | static default = new Unit(); 3 | } -------------------------------------------------------------------------------- /exercise/ts/day24/src/usecases/DeliverToy.ts: -------------------------------------------------------------------------------- 1 | export class DeliverToy { 2 | constructor(public childName: string, public desiredToy: string) { 3 | } 4 | } -------------------------------------------------------------------------------- /exercise/ts/day24/tcrw: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | base_dir="$(cd "$(dirname -- "$0")" && pwd)" 4 | . "${base_dir}/../tcr/tcr.sh" 5 | -------------------------------------------------------------------------------- /exercise/ts/day24/tests/Time.ts: -------------------------------------------------------------------------------- 1 | export class Time { 2 | static readonly now = new Date(Date.UTC(2024, 11, 24, 23, 30, 45)); 3 | static provider = () => Time.now; 4 | } -------------------------------------------------------------------------------- /exercise/ts/day24/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /exercise/ts/day25/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "time-capsule", 3 | "version": "1.0.0", 4 | "dependencies": { 5 | "typescript": "^5.3.3" 6 | }, 7 | "devDependencies": { 8 | "@types/node": "^22.9.0" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /exercise/ts/day25/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /exercise/ts/tcr/.gitignore: -------------------------------------------------------------------------------- 1 | # Below files and directories are automatically created 2 | # by tcr.sh and do not need to be committed to this repository 3 | 4 | bin/** 5 | doc/** 6 | download/** 7 | LICENSE.md 8 | README.md 9 | -------------------------------------------------------------------------------- /exercise/ts/tcr/version.txt: -------------------------------------------------------------------------------- 1 | tcr 1.0.0 2 | -------------------------------------------------------------------------------- /img/advent-of-craft.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/img/advent-of-craft.webp -------------------------------------------------------------------------------- /img/calendar-banner.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/img/calendar-banner.webp -------------------------------------------------------------------------------- /img/north-star-solutions.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/img/north-star-solutions.webp -------------------------------------------------------------------------------- /img/proposed-solution.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/img/proposed-solution.webp -------------------------------------------------------------------------------- /img/site.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/img/site.webp -------------------------------------------------------------------------------- /img/video.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/advent-of-craft/2024/f2bc077a7f0680e0ef86a25401af42db7bcfeff7/img/video.webp -------------------------------------------------------------------------------- /solution/day00/Email/Configuration.cs: -------------------------------------------------------------------------------- 1 | namespace Email; 2 | 3 | public record Configuration(string Key, string Iv); -------------------------------------------------------------------------------- /solution/day01/src/main/java/communication/Configuration.java: -------------------------------------------------------------------------------- 1 | package communication; 2 | 3 | public record Configuration(int numberOfDaysToRest, int numberOfDayBeforeChristmas) { 4 | } -------------------------------------------------------------------------------- /solution/day01/src/main/java/communication/Logger.java: -------------------------------------------------------------------------------- 1 | package communication; 2 | 3 | public interface Logger { 4 | void log(String message); 5 | } 6 | -------------------------------------------------------------------------------- /solution/day01/src/main/java/communication/Reindeer.java: -------------------------------------------------------------------------------- 1 | package communication; 2 | 3 | public record Reindeer(String name, String location, int numbersOfDaysForComingBack) { 4 | } -------------------------------------------------------------------------------- /solution/day02/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /solution/day02/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists -------------------------------------------------------------------------------- /solution/day02/src/test/kotlin/Configuration.kt: -------------------------------------------------------------------------------- 1 | object Configuration { 2 | val mapping = mapOf(3 to "Fizz", 5 to "Buzz", 7 to "Whizz", 11 to "Bang") 3 | } -------------------------------------------------------------------------------- /solution/day04/Routine/Email.cs: -------------------------------------------------------------------------------- 1 | namespace Routine 2 | { 3 | public class Email 4 | { 5 | public string Subject { get; set; } 6 | public string Body { get; set; } 7 | } 8 | } -------------------------------------------------------------------------------- /solution/day04/Routine/IEmailService.cs: -------------------------------------------------------------------------------- 1 | namespace Routine 2 | { 3 | public interface IEmailService 4 | { 5 | void ReadNewEmails(); 6 | } 7 | } -------------------------------------------------------------------------------- /solution/day04/Routine/IReindeerFeeder.cs: -------------------------------------------------------------------------------- 1 | namespace Routine 2 | { 3 | public interface IReindeerFeeder 4 | { 5 | void FeedReindeers(); 6 | } 7 | } -------------------------------------------------------------------------------- /solution/day04/Routine/IScheduleService.cs: -------------------------------------------------------------------------------- 1 | namespace Routine 2 | { 3 | public interface IScheduleService 4 | { 5 | Schedule TodaySchedule(); 6 | void OrganizeMyDay(Schedule schedule); 7 | void Continue(); 8 | } 9 | } -------------------------------------------------------------------------------- /solution/day04/Routine/Schedule.cs: -------------------------------------------------------------------------------- 1 | namespace Routine 2 | { 3 | public class Schedule 4 | { 5 | public List Tasks { get; set; } = []; 6 | } 7 | } -------------------------------------------------------------------------------- /solution/day06/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /solution/day06/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /solution/day07/gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official 2 | -------------------------------------------------------------------------------- /solution/day07/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists -------------------------------------------------------------------------------- /solution/day07/src/main/kotlin/production/Gift.kt: -------------------------------------------------------------------------------- 1 | package production 2 | 3 | import production.Status.Producing 4 | 5 | data class Gift(val name: String, var status: Status = Producing) 6 | 7 | enum class Status { 8 | Producing, 9 | Produced 10 | } 11 | -------------------------------------------------------------------------------- /solution/day08/src/main/java/domain/ToyRepository.java: -------------------------------------------------------------------------------- 1 | package domain; 2 | 3 | import java.util.Optional; 4 | 5 | public interface ToyRepository { 6 | Optional findByName(String name); 7 | void save(Toy toy); 8 | } 9 | -------------------------------------------------------------------------------- /solution/day09/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /solution/day09/src/behavior.ts: -------------------------------------------------------------------------------- 1 | type Behavior = "naughty" | "nice"; -------------------------------------------------------------------------------- /solution/day09/src/priority.ts: -------------------------------------------------------------------------------- 1 | type Priority = "dream" | "nice to have"; -------------------------------------------------------------------------------- /solution/day09/src/santaService.ts: -------------------------------------------------------------------------------- 1 | import {Child} from "./child"; 2 | 3 | export class SantaService { 4 | public evaluateRequest(child: Child): boolean { 5 | return child.behavior === "nice" && child.giftRequest.isFeasible; 6 | } 7 | } -------------------------------------------------------------------------------- /solution/day09/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /solution/day10/Delivery.Tests/1.txt: -------------------------------------------------------------------------------- 1 | (()) -------------------------------------------------------------------------------- /solution/day10/Delivery.Tests/2.txt: -------------------------------------------------------------------------------- 1 | (()(()( -------------------------------------------------------------------------------- /solution/day10/Delivery.Tests/3.txt: -------------------------------------------------------------------------------- 1 | ()) -------------------------------------------------------------------------------- /solution/day10/Delivery.Tests/4.txt: -------------------------------------------------------------------------------- 1 | (()(()(()(()(()(()(()(()(()(()(()(()(()(()(()(()(()(()(()))))))))))))))))(((((()(()))))))))))(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((())))))()())(()()()()()()()()())))))))))) -------------------------------------------------------------------------------- /solution/day10/Delivery.Tests/5.txt: -------------------------------------------------------------------------------- 1 | )())()) -------------------------------------------------------------------------------- /solution/day11/Christmas/Extensions.cs: -------------------------------------------------------------------------------- 1 | namespace Christmas 2 | { 3 | public static class Extensions 4 | { 5 | public static TOut Do(this TIn it, Func func) => func(it); 6 | } 7 | } -------------------------------------------------------------------------------- /solution/day12/src/main/java/gifts/Behavior.java: -------------------------------------------------------------------------------- 1 | package gifts; 2 | 3 | public enum Behavior { 4 | NAUGHTY, 5 | NICE, 6 | VERY_NICE; 7 | } -------------------------------------------------------------------------------- /solution/day12/src/main/java/gifts/Toy.java: -------------------------------------------------------------------------------- 1 | package gifts; 2 | 3 | public record Toy(String description) { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /solution/day13/src/main/java/santamarket/model/ProductUnit.java: -------------------------------------------------------------------------------- 1 | package santamarket.model; 2 | 3 | public enum ProductUnit { 4 | KILO, EACH 5 | } 6 | -------------------------------------------------------------------------------- /solution/day13/src/main/java/santamarket/model/SantamarketCatalog.java: -------------------------------------------------------------------------------- 1 | package santamarket.model; 2 | 3 | public interface SantamarketCatalog { 4 | void addProduct(Product product, double price); 5 | 6 | double getUnitPrice(Product product); 7 | } 8 | -------------------------------------------------------------------------------- /solution/day13/src/main/java/santamarket/model/XForYOffer.java: -------------------------------------------------------------------------------- 1 | package santamarket.model; 2 | 3 | public record XForYOffer(int x, int y) { 4 | } 5 | -------------------------------------------------------------------------------- /solution/day15/SantaChristmasList.Operations.Monad.Test/GlobalUsings.cs: -------------------------------------------------------------------------------- 1 | #region 2 | 3 | global using Xunit; 4 | global using FluentAssertions; 5 | 6 | #endregion -------------------------------------------------------------------------------- /solution/day15/SantaChristmasList.Operations.Test/GlobalUsings.cs: -------------------------------------------------------------------------------- 1 | #region 2 | 3 | global using Xunit; 4 | global using FluentAssertions; 5 | 6 | #endregion -------------------------------------------------------------------------------- /solution/day16/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: {'^.+\\.ts?$': 'ts-jest'}, 3 | testEnvironment: 'node', 4 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', 5 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] 6 | }; -------------------------------------------------------------------------------- /solution/day16/src/elf.ts: -------------------------------------------------------------------------------- 1 | export class Elf { 2 | constructor(public id: number, public skillLevel: number) {} 3 | } -------------------------------------------------------------------------------- /solution/day16/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /solution/day17/src/main/java/eid/ParsingError.java: -------------------------------------------------------------------------------- 1 | package eid; 2 | 3 | public record ParsingError(String reason) { 4 | } -------------------------------------------------------------------------------- /solution/day18/cucumber.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | default: `--require-module ts-node/register --require 'features/**/*.ts'` 3 | }; -------------------------------------------------------------------------------- /solution/day18/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "sourceMap": true 6 | }, 7 | "exclude": [ 8 | "node_modules" 9 | ] 10 | } -------------------------------------------------------------------------------- /solution/day19/Travel.Benchmark/Program.cs: -------------------------------------------------------------------------------- 1 | using BenchmarkDotNet.Running; 2 | using Travel.Benchmark; 3 | 4 | BenchmarkRunner.Run(); -------------------------------------------------------------------------------- /solution/day20/Reindeer.Web.Tests/GlobalUsings.cs: -------------------------------------------------------------------------------- 1 | global using Xunit; -------------------------------------------------------------------------------- /solution/day20/Reindeer.Web/Service/ReindeerErrorCode.cs: -------------------------------------------------------------------------------- 1 | namespace Reindeer.Web.Service 2 | { 3 | public enum ReindeerErrorCode 4 | { 5 | NotFound, 6 | AlreadyExist 7 | } 8 | } -------------------------------------------------------------------------------- /solution/day20/Reindeer.Web/Service/ReindeerToCreate.cs: -------------------------------------------------------------------------------- 1 | namespace Reindeer.Web.Service 2 | { 3 | public record ReindeerToCreate(Guid Id, string Name, ReindeerColor Color); 4 | } -------------------------------------------------------------------------------- /solution/day20/Reindeer.Web/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /solution/day20/Reindeer.Web/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | }, 8 | "AllowedHosts": "*" 9 | } 10 | -------------------------------------------------------------------------------- /solution/day21/Tour/SantaError.cs: -------------------------------------------------------------------------------- 1 | namespace Tour 2 | { 3 | public record SantaError(string Message); 4 | } -------------------------------------------------------------------------------- /solution/day21/Tour/Step.cs: -------------------------------------------------------------------------------- 1 | namespace Tour 2 | { 3 | public record Step(TimeOnly Time, string Label, int DeliveryTime); 4 | } -------------------------------------------------------------------------------- /solution/day22/src/main/java/eid/ParsingError.java: -------------------------------------------------------------------------------- 1 | package eid; 2 | 3 | public record ParsingError(String reason) { 4 | } -------------------------------------------------------------------------------- /solution/day23/src/main/java/core/control/Dashboard.java: -------------------------------------------------------------------------------- 1 | package core.control; 2 | 3 | public interface Dashboard { 4 | void display(String message); 5 | } 6 | -------------------------------------------------------------------------------- /solution/day23/src/main/java/core/control/generator/PowerUnitFactory.java: -------------------------------------------------------------------------------- 1 | package core.control.generator; 2 | 3 | import io.vavr.collection.Seq; 4 | 5 | public interface PowerUnitFactory { 6 | Seq bringAllReindeers(); 7 | } 8 | -------------------------------------------------------------------------------- /solution/day23/src/main/java/core/control/sleigh/EngineStatus.java: -------------------------------------------------------------------------------- 1 | package core.control.sleigh; 2 | 3 | public enum EngineStatus { 4 | OFF, 5 | ON 6 | } 7 | -------------------------------------------------------------------------------- /solution/day24/.tcr/config.yml: -------------------------------------------------------------------------------- 1 | config: 2 | git: 3 | auto-push: false 4 | polling-period: 2s 5 | mob-timer: 6 | duration: 30m0s 7 | tcr: 8 | language: csharp 9 | toolchain: dotnet 10 | -------------------------------------------------------------------------------- /solution/day24/tcrw: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | base_dir="$(cd "$(dirname -- "$0")" && pwd)" 4 | . "${base_dir}/../tcr/tcr.sh" 5 | -------------------------------------------------------------------------------- /solution/day24/tests/Delivery.Tests/Assertions/ToyExtensions.cs: -------------------------------------------------------------------------------- 1 | namespace D.Tests.Assertions; 2 | 3 | public static class ToyExtensions 4 | { 5 | public static ToyAssertions Should(this A a) => new(a); 6 | } --------------------------------------------------------------------------------