1) Ursprung: Stammbasis statt tiefstem Slot-0-Punkt Zweimal war das schon "behoben". Erst kam der Ursprung aus der Gesamt-Bbox (eine Blatt-Card hob den Baum an), dann aus Material-Slot 0 - aber die AESTE gehoeren ebenfalls zum Rinden-Slot. Gemessen an Tanne_01_S1: tiefster Slot-0-Punkt -5.35 cm, tiefster STAMM-Punkt -0.02 cm. Die Stammbasis schwebte 5.3 cm ueber dem Boden. Die exakte Trennung liefert ast_id (0 = Stamm) - dasselbe Attribut, das der Baum fuer die Faell-Teile ohnehin traegt. Ein Schwellwert auf den Achsabstand faellt beim Kaktus um: dessen Stamm ist dicker als jeder sinnvolle Schwellwert. X/Y kommt jetzt aus dem untersten RING statt aus der Stamm-Bbox; bei Bend 1.5 liegt die Bbox-Mitte in der Kruemmung. Neu: tests/test_ursprung.py, gemessen am reimportierten FBX. Die erste Fassung des Tests suchte den "tiefsten Punkt nahe der Achse" - die Gegenprobe hat sie umgeworfen, weil bei der Tanne eine Astspitze ins Achsband faellt. Ein Schwellwert, der die Bugfassung durchlaesst, prueft nichts. Jetzt wird ein Stammquerschnitt gesucht: Vertices, die die Achse in allen Himmelsrichtungen umschliessen. Gegenprobe bestanden. Nebenbefund: ein Baum ohne Aeste traegt gar kein ast_id (Branch Count 0 schaltet den Ast-Zweig des Graphen ab). Dann ist alles Stamm und der Fallback exakt. 2) Weide S4 auf 350 Cards gedeckelt - Entscheidung des Users Gemessen 5456-5594 Tris ueber drei Seeds gegen 4300 Budget; nach der Deckelung 3890-3962. LEAF_STUFEN_PRESET haelt solche Ausnahmen je Preset. 3) Birke war eine Saeule Gemessen B/H 0.15 - schmaler als der Standardbaum (0.22), nicht die Haelfte der Eiche (0.36). Ursache: Branch Up 1.1, die Aeste klebten am Stamm. Zielband 0.35-0.55 aus Van den Berk (8-12 m bei 15-20 m) und Woodland Trust (6-10 m bei 15-25 m); jetzt 0.51. Haengende Zweigenden ueber Branch Droop 0.8 + Droop Curve 3.5, nicht ueber negatives Sub Up: das wurde von +2.2 bis -2.0 durchgemessen und bewegt nichts (1-6 %), weil die Sub-Aeste zu kurz sind. Mit Droop 26 % bei einem Fall von 0.033 x Hoehe - wie die Tanne (0.030), weit weg von der Weide (0.213). 4) run_tests.ps1 benennt Blender-Abstuerze test_export_robust starb rund in jedem sechsten Lauf mit EXCEPTION_ACCESS_VIOLATION und der Runner meldete "<keine Ergebniszeile>". Der Stack enthaelt keinen einzigen Addon-Frame (RNA_property_int_get -> rna_property_rna_or_id_get -> IDP_GetPropertyFromGroup, Null-Deref), und mit eingebauten Markern verschwindet der Absturz: Heisenbug in Blender 5.1.2. Der Runner wiederholt jetzt einmal und benennt den Absturz. 24 Tests bestehen. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
76 lines
3.3 KiB
PowerShell
76 lines
3.3 KiB
PowerShell
# Faehrt die komplette Test-Suite gegen die Addon-Dateien.
|
|
#
|
|
# Warum es das gibt: die Tests lagen einzeln herum und wurden nur beim Bauen des
|
|
# jeweiligen Features gestartet. Dadurch waren fuenf davon still veraltet - sie
|
|
# pruesten gegen Namen und Zip-Versionen, die es laengst nicht mehr gab, und
|
|
# haetten eine echte Regression nicht gemeldet. Ein Befehl fuer alles.
|
|
#
|
|
# Aufruf:
|
|
# .\run_tests.ps1
|
|
# .\run_tests.ps1 -Blender "E:\SteamLibrary\steamapps\common\Blender\blender.exe"
|
|
# .\run_tests.ps1 -Filter panels # nur tests\test_panels.py
|
|
#
|
|
# Hinweis: test_tree_addon.py prueft das GEBAUTE Zip aus dist\ - vorher
|
|
# .\build.ps1 laufen lassen, sonst meldet der Test das fehlende Zip.
|
|
|
|
param(
|
|
[string]$Blender = "blender",
|
|
[string]$Filter = "*"
|
|
)
|
|
|
|
$root = $PSScriptRoot
|
|
$tests = Get-ChildItem (Join-Path $root "tests") -Filter "test_$Filter.py" | Sort-Object Name
|
|
if (-not $tests) { throw "Keine Tests gefunden fuer Filter '$Filter'" }
|
|
|
|
$failed = @()
|
|
$abgestuerzt = @()
|
|
foreach ($t in $tests) {
|
|
# Ein Lauf kann an einem BLENDER-ABSTURZ sterben statt an einem Testfehler.
|
|
# Nachgemessen an test_export_robust: rund jeder sechste Lauf endet mit
|
|
# EXCEPTION_ACCESS_VIOLATION - und zwar ohne einen einzigen Addon-Frame im
|
|
# Stack (RNA_property_int_get -> rna_property_rna_or_id_get ->
|
|
# IDP_GetPropertyFromGroup, Null-Deref beim Lesen einer Integer-Property).
|
|
# Baut man Marker in denselben Test ein, verschwindet der Absturz: ein
|
|
# Heisenbug, also Blender 5.1.2 und nicht unser Code. Wenn der Lauf
|
|
# durchlaeuft, bestehen ALLE Checks des Tests.
|
|
# Deshalb einmal wiederholen und den Absturz benennen, statt ihn als
|
|
# stillen Testfehler auszugeben - "<keine Ergebniszeile>" hat monatelang
|
|
# niemandem gesagt, was eigentlich los war.
|
|
$out = & $Blender --background --factory-startup --python $t.FullName 2>&1 | Out-String
|
|
$crash = $false
|
|
if ($out -match "EXCEPTION_ACCESS_VIOLATION") {
|
|
$crash = $true
|
|
$out = & $Blender --background --factory-startup --python $t.FullName 2>&1 | Out-String
|
|
$abgestuerzt += if ($out -match "EXCEPTION_ACCESS_VIOLATION") {
|
|
$t.BaseName + " (auch im zweiten Lauf)"
|
|
} else { $t.BaseName }
|
|
}
|
|
|
|
# Die Tests melden ihr Ergebnis als letzte Zeile mit "ERGEBNIS:" bzw.
|
|
# "Alle Checks bestanden." - alles andere ist Blender-Rauschen.
|
|
$line = ($out -split "`n" |
|
|
Where-Object { $_ -match "ERGEBNIS|Alle Checks bestanden|FEHLGESCHLAGEN" } |
|
|
Select-Object -Last 1)
|
|
if (-not $line) {
|
|
$line = if ($crash) { "<Blender abgestuerzt, auch im zweiten Lauf>" }
|
|
else { "<keine Ergebniszeile>" }
|
|
}
|
|
$line = $line.Trim()
|
|
|
|
$ok = ($line -match "ALLE|OK$|bestanden") -and ($line -notmatch "FEHLER|FEHLGESCHLAGEN")
|
|
$color = if ($ok) { "Green" } else { "Red" }
|
|
if (-not $ok) { $failed += $t.BaseName }
|
|
|
|
Write-Host ("{0,-24} {1}" -f $t.BaseName, $line) -ForegroundColor $color
|
|
}
|
|
|
|
Write-Host ""
|
|
if ($abgestuerzt) {
|
|
Write-Host ("Blender-Absturz (wiederholt): {0}" -f ($abgestuerzt -join ", ")) -ForegroundColor Yellow
|
|
}
|
|
if ($failed) {
|
|
Write-Host ("FEHLGESCHLAGEN ({0}): {1}" -f $failed.Count, ($failed -join ", ")) -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
Write-Host ("Alle {0} Tests bestanden." -f $tests.Count) -ForegroundColor Green
|