from pathlib import Path
import sys
root=Path(__file__).resolve().parents[2]
checks=[]
def has(path,text,label):
    data=(root/path).read_text(encoding='utf-8')
    checks.append((label,text in data))

factory='MASSystem/Application/Facade/MASApplicationWindowControls.ControlFactory.Feedback.vb'
has(factory,'Public Function AddCallout(Optional title As String = Nothing,','AddCallout factory')
has(factory,'Public Function CreatePopover(Optional title As String = Nothing,','CreatePopover factory')
has(factory,'Public Function AddEmptyState(Optional title As String = Nothing,','AddEmptyState factory')
has(factory,'Public Function AddLoadingSkeleton(Optional rowCount As Integer = 4,','AddLoadingSkeleton factory')
has('Component/Feedback/Callout/MASPopover.vb','Private _closeOnOutsidePointer As Boolean = True','popover outside close default')
has('Component/Feedback/Callout/MASPopover.vb','Private _swallowOutsidePointer As Boolean = True','popover swallow default')
has('Component/Feedback/Callout/MASPopover.vb','Private _closeOnEscape As Boolean = True','popover escape default')
has('Component/Feedback/Callout/MASPopover.vb','If _disposed Then Throw New ObjectDisposedException(NameOf(MASPopover))','disposed open throws')
has('Component/Feedback/Callout/MASPopover.vb','x + Math.Max(0.0F, width), y + Math.Max(0.0F, height)','anchor size clamp')
has('Component/Feedback/EmptyState/MASEmptyState.vb','Private _showIllustration As Boolean = True','illustration default')
has('Component/Feedback/LoadingSkeleton/MASLoadingSkeleton.vb','Private _rowCount As Integer = LoadingSkeletonTokens.DefaultRowCount','row token default')
has('Component/Feedback/LoadingSkeleton/MASLoadingSkeleton.vb','Private _lineCount As Integer = LoadingSkeletonTokens.DefaultLineCount','line token default')
has('Component/Tokens/Component/LoadingSkeletonTokens.vb','Friend Const DefaultRowCount As Integer = 4','row default 4')
has('Component/Tokens/Component/LoadingSkeletonTokens.vb','Friend Const DefaultLineCount As Integer = 3','line default 3')
has('Component/Tokens/Component/LoadingSkeletonTokens.vb','Friend Const MinRows As Integer = 1','min rows')
has('Component/Tokens/Component/LoadingSkeletonTokens.vb','Friend Const MaxRows As Integer = 12','max rows')
has('Component/Tokens/Component/LoadingSkeletonTokens.vb','Friend Const MinLines As Integer = 1','min lines')
has('Component/Tokens/Component/LoadingSkeletonTokens.vb','Friend Const MaxLines As Integer = 6','max lines')
idx=(root/'docs/reference/api/all-public-types-index.md').read_text(encoding='utf-8')
for typ in ['MASCallout','MASPopover','MASEmptyState','MASLoadingSkeleton']:
    checks.append((f'{typ} Stable',f'| `{typ}` | Class | Stable | V1Stable' in idx))
doc=root/'docs/reference/controls/callouts-empty-states-and-loading.md'
checks.append(('documentation page exists',doc.exists()))
for rel in ['docs/reference/api/README.md','docs/user/controls.md','docs/recipes/feedback.md']:
    checks.append((f'link in {rel}','callouts-empty-states-and-loading.md' in (root/rel).read_text(encoding='utf-8')))
failed=[name for name,ok in checks if not ok]
print(f'Assertions: {len(checks)-len(failed)} passed, {len(failed)} failed')
for name in failed: print('FAIL:',name)
sys.exit(1 if failed else 0)
