test(android): isolate internal annotation symbol from STEP-102 retained ranges

This commit is contained in:
tei
2026-10-09 13:01:43 +09:00
parent a49dd936c4
commit 86906c8a6a
2 changed files with 31 additions and 2 deletions

View File

@@ -105,6 +105,26 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
"fullCpuFrame=${snapshot.optLong("fullCpuFrame")} ranges=${ranges.joinToString(";")}" "fullCpuFrame=${snapshot.optLong("fullCpuFrame")} ranges=${ranges.joinToString(";")}"
diagnostics.text = "STEP-102 $message" diagnostics.text = "STEP-102 $message"
Log.i(TAG, "STEP102_SAMPLE $message") Log.i(TAG, "STEP102_SAMPLE $message")
if (step102Tick == 8L) {
// One-shot proof of actual runtime style ordering and annotation boundary.
val styleLayers = snapshot.optJSONArray("styleLayers")
val layerOrder = buildList {
for (index in 0 until (styleLayers?.length() ?: 0)) {
val layer = styleLayers?.optJSONObject(index) ?: continue
add("${layer.optInt("layerIndex")}:${layer.optString("layerId")}:${layer.optString("layerType")}")
}
}
val rangeOrder = buildList {
for (index in 0 until (segments?.length() ?: 0)) {
val segment = segments?.optJSONObject(index) ?: continue
add("${segment.optInt("segmentIndex")}:${segment.optString("strategy")}" +
"[${segment.optInt("beginIndex")},${segment.optInt("endExclusive")})" +
"=${segment.optJSONArray("layers")?.length() ?: 0}")
}
}
Log.i(TAG, "STEP102_STYLE_LAYER_LAYOUT scenario=$scenario layers=${layerOrder.joinToString(";")}" +
" segments=${rangeOrder.joinToString(";")}")
}
if (step102Tick == 8L || step102Tick == 130L) { if (step102Tick == 8L || step102Tick == 130L) {
Log.i(TAG, "STEP102_WINDOW_MARKER phase=${if (step102Tick == 8L) "baseline" else "final"} " + Log.i(TAG, "STEP102_WINDOW_MARKER phase=${if (step102Tick == 8L) "baseline" else "final"} " +
"scenario=$scenario tick=$step102Tick") "scenario=$scenario tick=$step102Tick")

View File

@@ -3,7 +3,13 @@ package org.maplibre.android.testapp.activity.particle
import org.json.JSONArray import org.json.JSONArray
import org.json.JSONObject import org.json.JSONObject
/** Offline STEP-102 R-C-R fixture; only the upper retained range changes placement capability. */ /**
* Offline STEP-102 locality fixture.
* R0 / particle C0 / upper R1 keep identical boundaries for T1 and T2.
* MapLibre appends its internal annotation Symbol layer after the style layers:
* keep that layer in a final live C2 range, outside the upper Retained cache.
* Never bypass Renderer placement safety gates to make a fixture pass.
*/
internal object Step102PlacementFixture { internal object Step102PlacementFixture {
enum class Scenario { T1_FREE_SYMBOL, T2_TWO_FREE } enum class Scenario { T1_FREE_SYMBOL, T2_TWO_FREE }
@@ -12,6 +18,8 @@ internal object Step102PlacementFixture {
private const val PARTICLE_SOURCE = "step102-field" private const val PARTICLE_SOURCE = "step102-field"
private const val PARTICLE_LAYER = "step102-particle" private const val PARTICLE_LAYER = "step102-particle"
private const val UPPER_LAYER = "step102-upper" private const val UPPER_LAYER = "step102-upper"
// Built into MapLibre AnnotationManager; it is a Symbol even when the fixture has no symbols.
private const val INTERNAL_ANNOTATION_LAYER = "org.maplibre.annotations.points"
fun styleJson(scenario: Scenario): String { fun styleJson(scenario: Scenario): String {
val sources = JSONObject() val sources = JSONObject()
@@ -56,7 +64,8 @@ internal object Step102PlacementFixture {
.put("segments", JSONArray() .put("segments", JSONArray()
.put(JSONObject().put("strategy", "RETAINED")) .put(JSONObject().put("strategy", "RETAINED"))
.put(JSONObject().put("strategy", "CONTINUOUS").put("startLayerId", PARTICLE_LAYER)) .put(JSONObject().put("strategy", "CONTINUOUS").put("startLayerId", PARTICLE_LAYER))
.put(JSONObject().put("strategy", "RETAINED").put("startLayerId", UPPER_LAYER))) .put(JSONObject().put("strategy", "RETAINED").put("startLayerId", UPPER_LAYER))
.put(JSONObject().put("strategy", "CONTINUOUS").put("startLayerId", INTERNAL_ANNOTATION_LAYER)))
.toString() .toString()
private fun geoJsonSource(geometryJson: String): JSONObject = JSONObject().put("type", "geojson") private fun geoJsonSource(geometryJson: String): JSONObject = JSONObject().put("type", "geojson")