Files
fileworkbench/scripts/test-folder-listing.py
zemion db873063f8
Verify source and build Android / android (push) Canceled after 0s
initial commit v 0.2.0
2026-09-24 22:49:27 +02:00

45 lines
2.4 KiB
Python

#!/usr/bin/env python3
"""Run the actual SafBrowserStore cursor-reading block on JVM test doubles.
Requires a local Kotlin compiler and JDK; no SDK, Gradle, or downloads. This checks
Kotlin control flow and resource cleanup, NOT Android API compatibility, Binder,
URI grants, async IO, provider implementation, or device/UI behaviour.
"""
import argparse
from pathlib import Path
import shutil
import subprocess
ROOT = Path(__file__).resolve().parent.parent
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--source', type=Path, default=ROOT / 'androidApp/src/main/kotlin/dev/fileworkbench/android/browser/SafBrowserStore.kt',
help='Optional historical source for reproducing the regression')
args = parser.parse_args()
compiler = shutil.which('kotlinc')
java = shutil.which('java')
if compiler is None or java is None:
parser.error('Install kotlinc and a JDK, then rerun this offline check.')
source = args.source.read_text(encoding='utf-8')
# Copy verbatim, rather than maintaining a second corrected implementation.
start_marker = ' val rows = ArrayList<BrowserEntry>()'
end_marker = ' BrowserListing(rows.distinctBy { it.id }, truncated, loading, information)'
if source.count(start_marker) != 1 or source.count(end_marker) != 1:
parser.error('Listing method changed shape; review and update the harness extraction boundaries.')
start = source.index(start_marker)
end = source.index(end_marker, start) + len(end_marker)
block = source[start:end]
template = (ROOT / 'scripts/regressions/FolderListingHarness.kt.template').read_text(encoding='utf-8')
assert template.count('/* PRODUCTION_LISTING_BLOCK */') == 1
out = ROOT / 'out/folder-listing'
out.mkdir(parents=True, exist_ok=True)
generated = out / 'FolderListingHarness.kt'
generated.write_text(template.replace('/* PRODUCTION_LISTING_BLOCK */', block), encoding='utf-8')
core = sorted(str(p) for p in (ROOT / 'core/src/commonMain').rglob('*.kt'))
jar = out / 'regression.jar'
print(f'Source under test: {args.source}', flush=True)
print('Extracted production cursor-reading block + real common models; Android APIs are test doubles.', flush=True)
compiled = subprocess.run([compiler, *core, str(generated), '-jvm-target', '17', '-include-runtime', '-d', str(jar)], cwd=ROOT)
if compiled.returncode:
raise SystemExit(compiled.returncode)
raise SystemExit(subprocess.run([java, '-cp', str(jar), 'dev.fileworkbench.testing.FolderListingHarnessKt'], cwd=ROOT).returncode)