Option Strict On
Option Explicit On

Namespace Nexamas.UI.Virtualization

    ''' <summary>
    ''' Immutable result of one MASVirtualizedItemsSystem benchmark scenario. It stores correctness facts and elapsed ticks so
    ''' commercial gates can prove bounded realization and cache behavior without enforcing machine-specific time thresholds.
    ''' </summary>
    Friend NotInheritable Class MASVirtualizationBenchmarkResult

        Friend Sub New(scenario As MASVirtualizationBenchmarkScenario,
                       realizedCount As Integer,
                       measurementCount As Integer,
                       measurementRevision As Integer,
                       elapsedTicks As Long,
                       scrollRequestCorrect As Boolean,
                       realizedRangeContainsTarget As Boolean,
                       diagnostics As MASVirtualizationDiagnosticsSnapshot)
            Me.Scenario = scenario
            Me.RealizedCount = Math.Max(0, realizedCount)
            Me.MeasurementCount = Math.Max(0, measurementCount)
            Me.MeasurementRevision = Math.Max(0, measurementRevision)
            Me.ElapsedTicks = Math.Max(0, elapsedTicks)
            Me.ScrollRequestCorrect = scrollRequestCorrect
            Me.RealizedRangeContainsTarget = realizedRangeContainsTarget
            Me.Diagnostics = diagnostics
        End Sub

        Friend ReadOnly Property Scenario As MASVirtualizationBenchmarkScenario
        Friend ReadOnly Property RealizedCount As Integer
        Friend ReadOnly Property MeasurementCount As Integer
        Friend ReadOnly Property MeasurementRevision As Integer
        Friend ReadOnly Property ElapsedTicks As Long
        Friend ReadOnly Property ScrollRequestCorrect As Boolean
        Friend ReadOnly Property RealizedRangeContainsTarget As Boolean
        Friend ReadOnly Property Diagnostics As MASVirtualizationDiagnosticsSnapshot

        Friend ReadOnly Property ExpectedMaxRealizedCount As Integer
            Get
                If Scenario Is Nothing OrElse Not Scenario.IsValid Then
                    Return 0
                End If

                Return Math.Max(1, CInt(Math.Ceiling(Scenario.ViewportExtentPx / Scenario.EstimatedItemExtentPx)) + (Scenario.OverscanItemCount * 2) + 4)
            End Get
        End Property

        Friend ReadOnly Property RealizedToLogicalItemRatio As Single
            Get
                If Scenario Is Nothing OrElse Scenario.ItemCount <= 0 Then
                    Return 0.0F
                End If

                Return CSng(RealizedCount) / CSng(Scenario.ItemCount)
            End Get
        End Property

        Friend ReadOnly Property IsBoundedRealizationProof As Boolean
            Get
                If Scenario Is Nothing OrElse Not Scenario.IsValid Then
                    Return False
                End If

                Return RealizedCount > 0 AndAlso
                       RealizedCount <= ExpectedMaxRealizedCount AndAlso
                       RealizedCount < Scenario.ItemCount
            End Get
        End Property

        Friend ReadOnly Property Passed As Boolean
            Get
                If Scenario Is Nothing OrElse Not Scenario.IsValid OrElse Diagnostics Is Nothing Then
                    Return False
                End If

                Return ScrollRequestCorrect AndAlso
                       RealizedRangeContainsTarget AndAlso
                       IsBoundedRealizationProof AndAlso
                       Diagnostics.ItemCount = Scenario.ItemCount AndAlso
                       Diagnostics.MeasurementCount = MeasurementCount AndAlso
                       Diagnostics.MeasurementRevision = MeasurementRevision
            End Get
        End Property

    End Class

End Namespace
