tests/unit/Private/ConvertTo-KlippyPascalCaseObject.Tests.ps1

#Requires -Modules Pester

BeforeAll {
    $modulePath = Split-Path -Parent (Split-Path -Parent (Split-Path -Parent $PSScriptRoot))
    Import-Module "$modulePath/KlippyCLI.psd1" -Force
}

Describe "ConvertTo-KlippyPascalCaseObject" -Tag Unit {
    Context "Simple Properties" {
        It "Should convert snake_case to PascalCase" {
            $result = & (Get-Module KlippyCLI) {
                $input = [PSCustomObject]@{ print_stats = "value" }
                ConvertTo-KlippyPascalCaseObject -InputObject $input
            }

            $result.PSObject.Properties.Name | Should -Contain "PrintStats"
            $result.PrintStats | Should -Be "value"
        }

        It "Should handle multiple underscores" {
            $result = & (Get-Module KlippyCLI) {
                $input = [PSCustomObject]@{ current_layer_height = 0.2 }
                ConvertTo-KlippyPascalCaseObject -InputObject $input
            }

            $result.PSObject.Properties.Name | Should -Contain "CurrentLayerHeight"
        }

        It "Should handle single word properties" {
            $result = & (Get-Module KlippyCLI) {
                $input = [PSCustomObject]@{ state = "ready" }
                ConvertTo-KlippyPascalCaseObject -InputObject $input
            }

            $result.PSObject.Properties.Name | Should -Contain "State"
        }
    }

    Context "Nested Objects" {
        It "Should convert nested object properties" {
            $result = & (Get-Module KlippyCLI) {
                $input = [PSCustomObject]@{
                    heater_bed = [PSCustomObject]@{
                        target_temp = 60
                    }
                }
                ConvertTo-KlippyPascalCaseObject -InputObject $input
            }

            $result.HeaterBed | Should -Not -BeNullOrEmpty
            $result.HeaterBed.TargetTemp | Should -Be 60
        }
    }

    Context "Arrays" {
        It "Should preserve primitive arrays" {
            $result = & (Get-Module KlippyCLI) {
                $input = [PSCustomObject]@{
                    values = @(1, 2, 3)
                }
                ConvertTo-KlippyPascalCaseObject -InputObject $input
            }

            $result.Values | Should -Be @(1, 2, 3)
        }
    }

    Context "Edge Cases" {
        It "Should handle null values" {
            $result = & (Get-Module KlippyCLI) {
                $input = [PSCustomObject]@{ null_value = $null }
                ConvertTo-KlippyPascalCaseObject -InputObject $input
            }

            $result.NullValue | Should -BeNullOrEmpty
        }

        It "Should return primitive types unchanged" {
            $result = & (Get-Module KlippyCLI) {
                ConvertTo-KlippyPascalCaseObject -InputObject "string"
            }
            $result | Should -Be "string"
        }
    }
}