v3.13.0: the Simulator's event forms honour the preset's CAT release

The consumption half of the release guard: the event-download forms hide the
parameters introduced after the effective release and say so.

- catEffectiveReleaseInfo(cards, iccid): the equipped card's preset (ICCID
  match, the same rule the SCP80 views use) resolved through presetRelease(),
  else the default Rel-12.
- eventFieldsForRelease(cfg, rel): a field whose introduction release (`rel`)
  is above the effective one is hidden; a field without a known release is
  never hidden.  The EVENT_FORMS annotations verified against the pinned
  specs/histories: the MT call IMS URI (Rel-12, CR 12.4.0 "URI support in MT
  Call event"), the CSG cell selection PLMN ID (Rel-12, 12.1.0), the IMS
  registration IMPU list + status code (Rel-11), the slices S-NSSAI-mapping
  and rejected objects (Rel-18).
- The form notes what was hidden: "hidden parameters: N · introduced after
  Rel-12 · preset: X" (or "default release"), with a tooltip naming the
  source; the send path already skips absent fields, so no builder changes.
- help EN/RU; sw cache simple-v369.
This commit is contained in:
2026-10-02 11:45:21 +03:00
parent 3660a7e173
commit 4f0b2a743c
8 changed files with 98 additions and 15 deletions
+18
View File
@@ -34,6 +34,8 @@ eval(extractBlock('const CAT_RELEASE = {', '// The display label of an introduct
eval(extractFunc(html, 'catReleaseLabel'));
eval(extractBlock('const CAT_RELEASE_DEFAULT', 'function presetRelease').replace(/^const /gm, 'var '));
eval(extractFunc(html, 'presetRelease'));
eval(extractFunc(html, 'cardsNormIccid'));
eval(extractFunc(html, 'catEffectiveReleaseInfo'));
eval(extractBlock('const EVENT_NAMES = {', 'const REJECTION_CAUSES = [').replace(/^const /gm, 'var '));
test('CAT_RELEASE carries the introduction releases of the event list', () => {
@@ -91,3 +93,19 @@ test('presetRelease resolves unspecified presets to the default', () => {
assert.strictEqual(presetRelease(p), CAT_RELEASE_DEFAULT, JSON.stringify(p));
}
});
test('catEffectiveReleaseInfo resolves the equipped preset or the default', () => {
const list = [{ name: 'A', iccid: '89 70 1190 0000 4600 098', release: '17' },
{ name: 'B', iccid: '', release: '14' }];
const hit = catEffectiveReleaseInfo(list, '8970119000004600098');
assert.strictEqual(hit.rel, 17);
assert.strictEqual(hit.source, 'preset');
assert.strictEqual(hit.preset.name, 'A');
// an ICCID that matches no preset (and the empty one) resolves to the default
const miss = catEffectiveReleaseInfo(list, '8970119000004600099');
assert.strictEqual(miss.rel, CAT_RELEASE_DEFAULT);
assert.strictEqual(miss.source, 'default');
assert.strictEqual(miss.preset, null);
assert.strictEqual(catEffectiveReleaseInfo(list, '').source, 'default');
assert.strictEqual(catEffectiveReleaseInfo([], '8970119000004600098').rel, CAT_RELEASE_DEFAULT);
});