Files
Ismo Vuorinen 83ec08f14b feat: project setup and core models with TDD
MILESTONE 1 COMPLETE:

Project Setup:
- Create .NET 8 MAUI solution targeting iOS, macOS, and web
- Configure nullable reference types and warnings as errors
- Add required dependencies (MAUI 8.0.3, SQLite, CommunityToolkit.Mvvm)
- Add testing dependencies (xUnit, NSubstitute, FluentAssertions, Coverlet)
- Create comprehensive .editorconfig with C# coding standards
- Update CLAUDE.md with development commands

Core Models (TDD - 48 tests, all passing):
- EstimateMode enum (Work, Generic, Humorous modes)
- EstimateResult model with validation (intensity 0.0-1.0, non-null text)
- ShakeData model with intensity validation
- AppSettings model with defaults (Work mode, max history 10)

Build Status:
- All platforms build successfully (net8.0, iOS, macOS)
- 0 warnings, 0 errors
- Test coverage: 51.28% line, 87.5% branch (models have ~100% coverage)

Per spec: Strict TDD followed (RED-GREEN-REFACTOR), models fully validated

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-18 12:12:36 +02:00

490 lines
24 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<coverage line-rate="0.5128" branch-rate="0.875" version="1.9" timestamp="1763460415" lines-covered="60" lines-valid="117" branches-covered="14" branches-valid="16">
<sources>
<source>/Users/ivuorinen/Code/ivuorinen/hiha-arvio/src/HihaArvio/</source>
</sources>
<packages>
<package name="HihaArvio" line-rate="0.5128" branch-rate="0.875" complexity="41">
<classes>
<class name="__XamlGeneratedCode__.__Type416C8673F66D9458" filename="obj/Debug/net8.0/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Resources_Styles_Colors.xaml.sg.cs" line-rate="0" branch-rate="1" complexity="2">
<methods>
<method name="InitializeComponent" signature="()" line-rate="0" branch-rate="1" complexity="1">
<lines>
<line number="29" hits="0" branch="False" />
<line number="30" hits="0" branch="False" />
<line number="31" hits="0" branch="False" />
</lines>
</method>
<method name=".ctor" signature="()" line-rate="0" branch-rate="1" complexity="1">
<lines>
<line number="20" hits="0" branch="False" />
<line number="21" hits="0" branch="False" />
<line number="22" hits="0" branch="False" />
<line number="23" hits="0" branch="False" />
</lines>
</method>
</methods>
<lines>
<line number="29" hits="0" branch="False" />
<line number="30" hits="0" branch="False" />
<line number="31" hits="0" branch="False" />
<line number="20" hits="0" branch="False" />
<line number="21" hits="0" branch="False" />
<line number="22" hits="0" branch="False" />
<line number="23" hits="0" branch="False" />
</lines>
</class>
<class name="__XamlGeneratedCode__.__Type76D52C8BE0F320C6" filename="obj/Debug/net8.0/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/Resources_Styles_Styles.xaml.sg.cs" line-rate="0" branch-rate="1" complexity="2">
<methods>
<method name="InitializeComponent" signature="()" line-rate="0" branch-rate="1" complexity="1">
<lines>
<line number="29" hits="0" branch="False" />
<line number="30" hits="0" branch="False" />
<line number="31" hits="0" branch="False" />
</lines>
</method>
<method name=".ctor" signature="()" line-rate="0" branch-rate="1" complexity="1">
<lines>
<line number="20" hits="0" branch="False" />
<line number="21" hits="0" branch="False" />
<line number="22" hits="0" branch="False" />
<line number="23" hits="0" branch="False" />
</lines>
</method>
</methods>
<lines>
<line number="29" hits="0" branch="False" />
<line number="30" hits="0" branch="False" />
<line number="31" hits="0" branch="False" />
<line number="20" hits="0" branch="False" />
<line number="21" hits="0" branch="False" />
<line number="22" hits="0" branch="False" />
<line number="23" hits="0" branch="False" />
</lines>
</class>
<class name="HihaArvio.App" filename="obj/Debug/net8.0/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/App.xaml.sg.cs" line-rate="0" branch-rate="1" complexity="1">
<methods>
<method name="InitializeComponent" signature="()" line-rate="0" branch-rate="1" complexity="1">
<lines>
<line number="21" hits="0" branch="False" />
<line number="22" hits="0" branch="False" />
<line number="23" hits="0" branch="False" />
</lines>
</method>
</methods>
<lines>
<line number="21" hits="0" branch="False" />
<line number="22" hits="0" branch="False" />
<line number="23" hits="0" branch="False" />
</lines>
</class>
<class name="HihaArvio.App" filename="App.xaml.cs" line-rate="0" branch-rate="1" complexity="1">
<methods>
<method name=".ctor" signature="()" line-rate="0" branch-rate="1" complexity="1">
<lines>
<line number="5" hits="0" branch="False" />
<line number="6" hits="0" branch="False" />
<line number="7" hits="0" branch="False" />
<line number="9" hits="0" branch="False" />
<line number="10" hits="0" branch="False" />
</lines>
</method>
</methods>
<lines>
<line number="5" hits="0" branch="False" />
<line number="6" hits="0" branch="False" />
<line number="7" hits="0" branch="False" />
<line number="9" hits="0" branch="False" />
<line number="10" hits="0" branch="False" />
</lines>
</class>
<class name="HihaArvio.AppShell" filename="obj/Debug/net8.0/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/AppShell.xaml.sg.cs" line-rate="0" branch-rate="1" complexity="1">
<methods>
<method name="InitializeComponent" signature="()" line-rate="0" branch-rate="1" complexity="1">
<lines>
<line number="21" hits="0" branch="False" />
<line number="22" hits="0" branch="False" />
<line number="23" hits="0" branch="False" />
</lines>
</method>
</methods>
<lines>
<line number="21" hits="0" branch="False" />
<line number="22" hits="0" branch="False" />
<line number="23" hits="0" branch="False" />
</lines>
</class>
<class name="HihaArvio.AppShell" filename="AppShell.xaml.cs" line-rate="0" branch-rate="1" complexity="1">
<methods>
<method name=".ctor" signature="()" line-rate="0" branch-rate="1" complexity="1">
<lines>
<line number="5" hits="0" branch="False" />
<line number="6" hits="0" branch="False" />
<line number="7" hits="0" branch="False" />
<line number="8" hits="0" branch="False" />
</lines>
</method>
</methods>
<lines>
<line number="5" hits="0" branch="False" />
<line number="6" hits="0" branch="False" />
<line number="7" hits="0" branch="False" />
<line number="8" hits="0" branch="False" />
</lines>
</class>
<class name="HihaArvio.MainPage" filename="MainPage.xaml.cs" line-rate="0" branch-rate="0" complexity="3">
<methods>
<method name="OnCounterClicked" signature="(System.Object,System.EventArgs)" line-rate="0" branch-rate="0" complexity="2">
<lines>
<line number="13" hits="0" branch="False" />
<line number="14" hits="0" branch="False" />
<line number="16" hits="0" branch="True" condition-coverage="0% (0/2)">
<conditions>
<condition number="26" type="jump" coverage="0%" />
</conditions>
</line>
<line number="17" hits="0" branch="False" />
<line number="19" hits="0" branch="False" />
<line number="21" hits="0" branch="False" />
<line number="22" hits="0" branch="False" />
</lines>
</method>
<method name=".ctor" signature="()" line-rate="0" branch-rate="1" complexity="1">
<lines>
<line number="5" hits="0" branch="False" />
<line number="7" hits="0" branch="False" />
<line number="8" hits="0" branch="False" />
<line number="9" hits="0" branch="False" />
<line number="10" hits="0" branch="False" />
</lines>
</method>
</methods>
<lines>
<line number="13" hits="0" branch="False" />
<line number="14" hits="0" branch="False" />
<line number="16" hits="0" branch="True" condition-coverage="0% (0/2)">
<conditions>
<condition number="26" type="jump" coverage="0%" />
</conditions>
</line>
<line number="17" hits="0" branch="False" />
<line number="19" hits="0" branch="False" />
<line number="21" hits="0" branch="False" />
<line number="22" hits="0" branch="False" />
<line number="5" hits="0" branch="False" />
<line number="7" hits="0" branch="False" />
<line number="8" hits="0" branch="False" />
<line number="9" hits="0" branch="False" />
<line number="10" hits="0" branch="False" />
</lines>
</class>
<class name="HihaArvio.MainPage" filename="obj/Debug/net8.0/Microsoft.Maui.Controls.SourceGen/Microsoft.Maui.Controls.SourceGen.CodeBehindGenerator/MainPage.xaml.sg.cs" line-rate="0" branch-rate="1" complexity="1">
<methods>
<method name="InitializeComponent" signature="()" line-rate="0" branch-rate="1" complexity="1">
<lines>
<line number="25" hits="0" branch="False" />
<line number="26" hits="0" branch="False" />
<line number="27" hits="0" branch="False" />
<line number="28" hits="0" branch="False" />
</lines>
</method>
</methods>
<lines>
<line number="25" hits="0" branch="False" />
<line number="26" hits="0" branch="False" />
<line number="27" hits="0" branch="False" />
<line number="28" hits="0" branch="False" />
</lines>
</class>
<class name="HihaArvio.MauiProgram" filename="MauiProgram.cs" line-rate="0" branch-rate="1" complexity="1">
<methods>
<method name="CreateMauiApp" signature="()" line-rate="0" branch-rate="1" complexity="1">
<lines>
<line number="8" hits="0" branch="False" />
<line number="9" hits="0" branch="False" />
<line number="10" hits="0" branch="False" />
<line number="11" hits="0" branch="False" />
<line number="12" hits="0" branch="False" />
<line number="13" hits="0" branch="False" />
<line number="14" hits="0" branch="False" />
<line number="15" hits="0" branch="False" />
<line number="16" hits="0" branch="False" />
<line number="19" hits="0" branch="False" />
<line number="22" hits="0" branch="False" />
<line number="23" hits="0" branch="False" />
</lines>
</method>
</methods>
<lines>
<line number="8" hits="0" branch="False" />
<line number="9" hits="0" branch="False" />
<line number="10" hits="0" branch="False" />
<line number="11" hits="0" branch="False" />
<line number="12" hits="0" branch="False" />
<line number="13" hits="0" branch="False" />
<line number="14" hits="0" branch="False" />
<line number="15" hits="0" branch="False" />
<line number="16" hits="0" branch="False" />
<line number="19" hits="0" branch="False" />
<line number="22" hits="0" branch="False" />
<line number="23" hits="0" branch="False" />
</lines>
</class>
<class name="HihaArvio.Models.AppSettings" filename="Models/AppSettings.cs" line-rate="1" branch-rate="1" complexity="5">
<methods>
<method name="get_SelectedMode" signature="()" line-rate="1" branch-rate="1" complexity="1">
<lines>
<line number="14" hits="22" branch="False" />
</lines>
</method>
<method name="get_MaxHistorySize" signature="()" line-rate="1" branch-rate="1" complexity="1">
<lines>
<line number="23" hits="7" branch="False" />
</lines>
</method>
<method name="set_MaxHistorySize" signature="(System.Int32)" line-rate="1" branch-rate="1" complexity="2">
<lines>
<line number="25" hits="8" branch="False" />
<line number="26" hits="8" branch="True" condition-coverage="100% (2/2)">
<conditions>
<condition number="10" type="jump" coverage="100%" />
</conditions>
</line>
<line number="27" hits="3" branch="False" />
<line number="28" hits="3" branch="False" />
<line number="29" hits="3" branch="False" />
<line number="30" hits="3" branch="False" />
<line number="31" hits="3" branch="False" />
<line number="34" hits="5" branch="False" />
<line number="35" hits="5" branch="False" />
</lines>
</method>
<method name=".ctor" signature="()" line-rate="1" branch-rate="1" complexity="1">
<lines>
<line number="8" hits="14" branch="False" />
</lines>
</method>
</methods>
<lines>
<line number="14" hits="22" branch="False" />
<line number="23" hits="7" branch="False" />
<line number="25" hits="8" branch="False" />
<line number="26" hits="8" branch="True" condition-coverage="100% (2/2)">
<conditions>
<condition number="10" type="jump" coverage="100%" />
</conditions>
</line>
<line number="27" hits="3" branch="False" />
<line number="28" hits="3" branch="False" />
<line number="29" hits="3" branch="False" />
<line number="30" hits="3" branch="False" />
<line number="31" hits="3" branch="False" />
<line number="34" hits="5" branch="False" />
<line number="35" hits="5" branch="False" />
<line number="8" hits="14" branch="False" />
</lines>
</class>
<class name="HihaArvio.Models.EstimateResult" filename="Models/EstimateResult.cs" line-rate="1" branch-rate="1" complexity="16">
<methods>
<method name="get_Id" signature="()" line-rate="1" branch-rate="1" complexity="1">
<lines>
<line number="14" hits="10" branch="False" />
</lines>
</method>
<method name="get_Timestamp" signature="()" line-rate="1" branch-rate="1" complexity="1">
<lines>
<line number="19" hits="8" branch="False" />
</lines>
</method>
<method name="get_EstimateText" signature="()" line-rate="1" branch-rate="1" complexity="1">
<lines>
<line number="28" hits="2" branch="False" />
</lines>
</method>
<method name="set_EstimateText" signature="(System.String)" line-rate="1" branch-rate="1" complexity="4">
<lines>
<line number="30" hits="8" branch="False" />
<line number="31" hits="8" branch="True" condition-coverage="100% (2/2)">
<conditions>
<condition number="7" type="jump" coverage="100%" />
</conditions>
</line>
<line number="32" hits="1" branch="False" />
<line number="33" hits="1" branch="False" />
<line number="36" hits="7" branch="True" condition-coverage="100% (2/2)">
<conditions>
<condition number="34" type="jump" coverage="100%" />
</conditions>
</line>
<line number="37" hits="2" branch="False" />
<line number="38" hits="2" branch="False" />
<line number="41" hits="5" branch="False" />
<line number="42" hits="5" branch="False" />
</lines>
</method>
<method name="get_Mode" signature="()" line-rate="1" branch-rate="1" complexity="1">
<lines>
<line number="48" hits="7" branch="False" />
</lines>
</method>
<method name="get_ShakeIntensity" signature="()" line-rate="1" branch-rate="1" complexity="1">
<lines>
<line number="56" hits="6" branch="False" />
</lines>
</method>
<method name="set_ShakeIntensity" signature="(System.Double)" line-rate="1" branch-rate="1" complexity="4">
<lines>
<line number="58" hits="12" branch="False" />
<line number="59" hits="12" branch="True" condition-coverage="100% (4/4)">
<conditions>
<condition number="11" type="jump" coverage="100%" />
<condition number="30" type="jump" coverage="100%" />
</conditions>
</line>
<line number="60" hits="3" branch="False" />
<line number="61" hits="3" branch="False" />
<line number="62" hits="3" branch="False" />
<line number="63" hits="3" branch="False" />
<line number="64" hits="3" branch="False" />
<line number="67" hits="9" branch="False" />
<line number="68" hits="9" branch="False" />
</lines>
</method>
<method name="get_ShakeDuration" signature="()" line-rate="1" branch-rate="1" complexity="1">
<lines>
<line number="74" hits="9" branch="False" />
</lines>
</method>
<method name="Create" signature="(System.String,HihaArvio.Models.EstimateMode,System.Double,System.TimeSpan)" line-rate="1" branch-rate="1" complexity="1">
<lines>
<line number="89" hits="4" branch="False" />
<line number="90" hits="4" branch="False" />
<line number="91" hits="4" branch="False" />
<line number="92" hits="4" branch="False" />
<line number="93" hits="4" branch="False" />
<line number="94" hits="4" branch="False" />
<line number="95" hits="4" branch="False" />
<line number="96" hits="4" branch="False" />
<line number="97" hits="4" branch="False" />
<line number="98" hits="4" branch="False" />
<line number="99" hits="4" branch="False" />
</lines>
</method>
<method name=".ctor" signature="()" line-rate="1" branch-rate="1" complexity="1">
<lines>
<line number="8" hits="16" branch="False" />
</lines>
</method>
</methods>
<lines>
<line number="14" hits="10" branch="False" />
<line number="19" hits="8" branch="False" />
<line number="28" hits="2" branch="False" />
<line number="30" hits="8" branch="False" />
<line number="31" hits="8" branch="True" condition-coverage="100% (2/2)">
<conditions>
<condition number="7" type="jump" coverage="100%" />
</conditions>
</line>
<line number="32" hits="1" branch="False" />
<line number="33" hits="1" branch="False" />
<line number="36" hits="7" branch="True" condition-coverage="100% (2/2)">
<conditions>
<condition number="34" type="jump" coverage="100%" />
</conditions>
</line>
<line number="37" hits="2" branch="False" />
<line number="38" hits="2" branch="False" />
<line number="41" hits="5" branch="False" />
<line number="42" hits="5" branch="False" />
<line number="48" hits="7" branch="False" />
<line number="56" hits="6" branch="False" />
<line number="58" hits="12" branch="False" />
<line number="59" hits="12" branch="True" condition-coverage="100% (4/4)">
<conditions>
<condition number="11" type="jump" coverage="100%" />
<condition number="30" type="jump" coverage="100%" />
</conditions>
</line>
<line number="60" hits="3" branch="False" />
<line number="61" hits="3" branch="False" />
<line number="62" hits="3" branch="False" />
<line number="63" hits="3" branch="False" />
<line number="64" hits="3" branch="False" />
<line number="67" hits="9" branch="False" />
<line number="68" hits="9" branch="False" />
<line number="74" hits="9" branch="False" />
<line number="89" hits="4" branch="False" />
<line number="90" hits="4" branch="False" />
<line number="91" hits="4" branch="False" />
<line number="92" hits="4" branch="False" />
<line number="93" hits="4" branch="False" />
<line number="94" hits="4" branch="False" />
<line number="95" hits="4" branch="False" />
<line number="96" hits="4" branch="False" />
<line number="97" hits="4" branch="False" />
<line number="98" hits="4" branch="False" />
<line number="99" hits="4" branch="False" />
<line number="8" hits="16" branch="False" />
</lines>
</class>
<class name="HihaArvio.Models.ShakeData" filename="Models/ShakeData.cs" line-rate="1" branch-rate="1" complexity="7">
<methods>
<method name="get_Intensity" signature="()" line-rate="1" branch-rate="1" complexity="1">
<lines>
<line number="16" hits="7" branch="False" />
</lines>
</method>
<method name="set_Intensity" signature="(System.Double)" line-rate="1" branch-rate="1" complexity="4">
<lines>
<line number="18" hits="10" branch="False" />
<line number="19" hits="10" branch="True" condition-coverage="100% (4/4)">
<conditions>
<condition number="11" type="jump" coverage="100%" />
<condition number="30" type="jump" coverage="100%" />
</conditions>
</line>
<line number="20" hits="4" branch="False" />
<line number="21" hits="4" branch="False" />
<line number="22" hits="4" branch="False" />
<line number="23" hits="4" branch="False" />
<line number="24" hits="4" branch="False" />
<line number="27" hits="6" branch="False" />
<line number="28" hits="6" branch="False" />
</lines>
</method>
<method name="get_Duration" signature="()" line-rate="1" branch-rate="1" complexity="1">
<lines>
<line number="34" hits="7" branch="False" />
</lines>
</method>
<method name="get_IsShaking" signature="()" line-rate="1" branch-rate="1" complexity="1">
<lines>
<line number="39" hits="7" branch="False" />
</lines>
</method>
</methods>
<lines>
<line number="16" hits="7" branch="False" />
<line number="18" hits="10" branch="False" />
<line number="19" hits="10" branch="True" condition-coverage="100% (4/4)">
<conditions>
<condition number="11" type="jump" coverage="100%" />
<condition number="30" type="jump" coverage="100%" />
</conditions>
</line>
<line number="20" hits="4" branch="False" />
<line number="21" hits="4" branch="False" />
<line number="22" hits="4" branch="False" />
<line number="23" hits="4" branch="False" />
<line number="24" hits="4" branch="False" />
<line number="27" hits="6" branch="False" />
<line number="28" hits="6" branch="False" />
<line number="34" hits="7" branch="False" />
<line number="39" hits="7" branch="False" />
</lines>
</class>
</classes>
</package>
</packages>
</coverage>