;
+ if (o._properties && typeof o._properties === 'object' && name in o._properties) {
+ return { value: o._properties[name], source: o._property_source?.[name] ?? null };
+ }
+ for (const v of Object.values(o)) {
+ const found = propertyIn(v, name);
+ if (found) return found;
+ }
+ return null;
+}
+
+describe("MATLAB's read-back of core's older binary saves (M4, M7) and of its binary-to-text copies (D15)", () => {
+ it("the truth is MATLAB R2027a's, and every save opened and read with no error or warning", () => {
+ expect(TRUTH.release).toBe('2027a');
+ expect(OLD.length).toBe(Object.keys(BUILDS).length * 3);
+ expect(PASTES.length).toBe(7);
+ expect(TRUTH.cases.filter((c) => c.matlab.error !== '' || !c.matlab.opened || list(c.matlab.warnings).length > 0).map((c) => c.file)).toEqual([]);
+ expect(list(TRUTH.originals).filter((o) => !o.opened || list(o.warnings).length > 0).map((o) => o.file)).toEqual([]);
+ });
+
+ it('the old saves in the tree are the files MATLAB read, of the originals it read them against', () => {
+ for (const c of OLD) {
+ const s = c.sha as { save: string; original: string };
+ expect([c.file, sha(savedBytes(c.file))]).toEqual([c.file, s.save]);
+ const original = at(`../${c.fixture}`);
+ if (existsSync(original)) {
+ expect([c.fixture, sha(new Uint8Array(readFileSync(original)))]).toEqual([c.fixture, s.original]);
+ }
+ }
+ });
+
+ it('core still makes each paste MATLAB was asked about', () => {
+ const { cases } = pastesOf({ createSession, ingest }, pasteSources(TEST_DIR), new Uint8Array(readFileSync(at(`../${TEXT_TWIN}`))));
+ const asked = (c: Case) => [c.file, c.source, list(c.pasted), list(c.dynamic), c.sha];
+ expect(cases.map(asked)).toEqual(PASTES.map(asked));
+ });
+
+ describe('M4: a dynamic property a save wrote as an ordinary one', () => {
+ const dynamic = shapesOf(new Uint8Array(readFileSync(at(`../${GENERATED}`)))).dynamic;
+
+ it("is how the save before #93's last commit spells the AUTOSAR target's options, where the original and a later save keep Source and PropertyType", () => {
+ expect(dynamic.map((d: { name: string }) => d.name)).toEqual([
+ 'AutosarMatrixIOAsArray',
+ 'AutosarCompilerAbstraction',
+ 'AutosarMaxShortNameLength',
+ 'DisableAUTOSARRoutinesHostLibrary',
+ 'AutosarSchemaVersion',
+ ]);
+ for (const build of ['pre93', 'pre69664b0']) {
+ for (const line of linesOf(savedBytes(oldSave(build, GENERATED).file), dynamic)) {
+ expect(line).toMatch(/^[^<]*<\/P>$/);
+ }
+ }
+ for (const line of linesOf(savedBytes(oldSave('pre90caf06', GENERATED).file), dynamic)) {
+ expect(line).toMatch(/^
[^<]*<\/P>$/);
+ }
+ });
+
+ it('MATLAB reads as the dynamic property it was, with its value, and the config set as the original', () => {
+ for (const build of ['pre69664b0', 'pre90caf06']) {
+ const c = oldSave(build, GENERATED);
+ expect(list(c.matlab.dynamic).map((d) => [d.name, d.save, d.dynamicInSave])).toEqual(list(c.matlab.dynamic).map((d) => [d.name, d.original, true]));
+ expect(differKeys(c).filter((k) => k.startsWith('config|'))).toEqual([]);
+ }
+ });
+
+ it('core reads each with the value MATLAB reads; as an ordinary property, there being nothing in the file to say it is not', () => {
+ const values = new Map(list(oldSave('pre69664b0', GENERATED).matlab.dynamic).map((d) => [d.name, d.save]));
+ for (const [build, source] of [
+ ['pre69664b0', null],
+ ['pre90caf06', 'dynamic'],
+ ] as const) {
+ const value = entryOf(openSave(oldSave(build, GENERATED).file), 'config', 'csAutosar').serialize().value;
+ for (const { name } of dynamic) {
+ const read = propertyIn(JSON.parse(JSON.stringify(value)), name)!;
+ expect([name, String(read.value), (read.source as { source?: string } | null)?.source ?? null]).toEqual([name, values.get(name), source]);
+ }
+ }
+ });
+
+ it("but a save before #93 wrote a mixed array's elements as the first's class: MATLAB reads the config sets and the Signal arrays otherwise, and no AUTOSAR option", () => {
+ const c = oldSave('pre93', GENERATED);
+ expect(list(c.matlab.dynamic).map((d) => [d.name, d.save, d.dynamicInSave])).toEqual(dynamic.map((d: { name: string }) => [d.name, '', false]));
+ expect(differKeys(c).filter((k) => !k.startsWith('design|'))).toEqual(['other|holdsBase', 'other|holdsMixed', 'config|csAutosar', 'config|csSimscape']);
+ // What that save wrote: the objects' classes in each entry, in order, the char cells aside.
+ const classes = (bytes: Uint8Array, entry: string) =>
+ [...new Map(objectsOf(strFromU8(unzipSync(bytes)['data/chunk0.xml']))).get(entry)!.matchAll(//g)]
+ .map((m) => m[1])
+ .filter((k) => k !== 'char' && !/^Simulink(\.LoggingInfo|\.CoderInfo|CSC\.)/.test(k));
+ const original = new Uint8Array(readFileSync(at(`../${GENERATED}`)));
+ expect(classes(original, 'holdsMixed')).toEqual(['NdHolder', 'dexdata.DerivedSignal', 'Simulink.Signal']);
+ expect(classes(savedBytes(c.file), 'holdsMixed')).toEqual(['NdHolder', 'dexdata.DerivedSignal', 'dexdata.DerivedSignal']);
+ expect(classes(original, 'csAutosar').slice(9, 11)).toEqual(['Simulink.CodeAppCC', 'Simulink.STFCustomTargetCC']);
+ expect(classes(savedBytes(c.file), 'csAutosar').slice(1, 11)).toEqual([...Array(8).fill('Simulink.SolverCC'), 'Simulink.CodeAppCC', 'Simulink.CodeAppCC']);
+ expect(classes(savedBytes(oldSave('pre69664b0', GENERATED).file), 'csAutosar')).toEqual(classes(original, 'csAutosar'));
+ });
+ });
+
+ describe('M7: a struct entry of no element a save wrote around an , without its fields', () => {
+ const BUILT = ['pre93', 'pre69664b0', 'pre90caf06'];
+ const FIXTURES = ['fixtures/display/dispcat_bin.sldd', 'parity/artifacts/binary/cases.sldd', GENERATED];
+
+ it('is how each of those saves spells every one of them, where the original states its fields', () => {
+ for (const build of BUILT) {
+ for (const fixture of FIXTURES) {
+ const c = oldSave(build, fixture);
+ const original = list(c.emptyStructs);
+ const saved = shapesOf(savedBytes(c.file)).emptyStructs;
+ expect(saved.map((s: { entry: string; dims: number[]; fields: string[]; aroundElement: boolean }) => [s.entry, s.dims, s.fields, s.aroundElement])).toEqual(
+ original.map((s) => [s.entry, s.dims, [], true]),
+ );
+ }
+ }
+ const declared = FIXTURES.flatMap((f) => list(oldSave('pre90caf06', f).emptyStructs).filter((s) => list(s.fields).length > 0).map((s) => [s.entry, list(s.fields)]));
+ expect(declared).toEqual([
+ ['dx_struct_0x0_fields', ['a']],
+ ['dx_struct_1x0', ['a']],
+ ['sE10ab', ['a', 'b']],
+ ]);
+ });
+
+ it('MATLAB reads in the shape its Dimension states, with no element; the fields are lost, and nothing else of it', () => {
+ for (const build of BUILT) {
+ for (const fixture of FIXTURES) {
+ const c = oldSave(build, fixture);
+ expect(list(c.matlab.emptyStructs).map((s) => [s.entry, s.shape])).toEqual(list(c.emptyStructs).map((s) => [s.entry, `struct[${s.dims.join(' ')}]{}`]));
+ const lost = list(c.emptyStructs)
+ .filter((s) => list(s.fields).length > 0)
+ .map((s) => `design|${s.entry}`);
+ const fine = list(c.emptyStructs)
+ .filter((s) => list(s.fields).length === 0)
+ .map((s) => `design|${s.entry}`);
+ expect(differKeys(c).filter((k) => lost.includes(k))).toEqual(lost);
+ expect(differKeys(c).filter((k) => fine.includes(k))).toEqual([]);
+ }
+ // A struct entry's field of no element went out the same way: sHolds.e, a 0x0 struct with field a.
+ const holds = list(oldSave(build, GENERATED).matlab.entries.differ).find((d) => d.startsWith('design|sHolds: '));
+ expect(holds).toContain('e:struct[0 0]<>{}');
+ expect(holds).toContain('wanted struct[1 1]{x:double[1 1]=1,e:struct[0 0]{}');
+ }
+ });
+
+ it('core reads each as MATLAB does: in the shape the Dimension states, with no row and no field, and writes it so', () => {
+ for (const build of BUILT) {
+ for (const fixture of FIXTURES) {
+ const c = oldSave(build, fixture);
+ const root = openSave(c.file);
+ for (const s of list(c.matlab.emptyStructs)) {
+ const entry = entryOf(root, 'design', s.entry);
+ const value = JSON.parse(JSON.stringify(entry.serialize().value));
+ const dims = s.shape.slice('struct['.length, s.shape.indexOf(']')).split(' ').map(Number);
+ expect([s.entry, entry.displayValue, entry.children.length, value._dimensions, value._fields]).toEqual([s.entry, `<${dims.join('x')} struct>`, 0, dims, []]);
+ expect(regenerateEntryXml(entry)).toContain(``);
+ }
+ }
+ }
+ });
+
+ it("and core's copy of each into a text dictionary reads in MATLAB as the old save does; a 0x0x2 as 0x0, as a copy of the original and MATLAB's own text save of it read", () => {
+ const fromOld = PASTES.find((c) => c.source === EMPTIES_OLD_SAVE)!;
+ const fromOriginal = PASTES.find((c) => list(c.pasted)[0]?.from === 'sE00' && c.source !== EMPTIES_OLD_SAVE)!;
+ for (const c of [fromOld, fromOriginal]) {
+ expect(differKeys(c)).toEqual([]);
+ expect(list(c.matlab.pasted).filter((p) => !p.same).map((p) => [p.to, p.shape])).toEqual([['sE002Pasted', 'struct[0 0]{}']]);
+ }
+ expect(list(fromOld.matlab.pasted).map((p) => [p.to, p.shape])).toEqual([
+ ['sE00Pasted', 'struct[0 0]{}'],
+ ['sE02Pasted', 'struct[0 2]{}'],
+ ['sE20Pasted', 'struct[2 0]{}'],
+ ['sE002Pasted', 'struct[0 0]{}'],
+ ['sE10abPasted', 'struct[1 0]{}'],
+ ['sHoldsPasted', 'struct[1 1]{x,e,none}'],
+ ]);
+ const twin = list(TRUTH.originals).find((o) => o.file === 'orig_old_saves_r2027a_text.sldd')!;
+ expect(list(twin.shapes).find((s) => s.key === 'design|sE002')!.shape).toBe('struct[0 0]{}');
+ });
+ });
+
+ it("the other losses of those saves, each fixed since, are a shaped empty's shape and an enumeration value", () => {
+ // dispcat_bin.sldd holds every shaped empty: a cell, char or string of no element lost its
+ // extents (each since kept, in one form at an entry, a property and a cell), and before #93
+ // an enumeration value at an entry its enumeral (kept since 146cb64), and a 0x2 char its shape.
+ const shaped = ['dx_cell_0x3', 'dx_cell_1x0', 'dx_char_1x0', 'dx_string_0x0', 'dx_string_1x0', 'str_0x3'];
+ const enums = ['dx_char_0x2', 'en_i32_high', 'en_i32_vec', 'en_sl_red', 'en_sl_vec', 'p_enum'];
+ const m7 = ['dx_struct_0x0_fields', 'dx_struct_1x0'];
+ const dispcat = 'fixtures/display/dispcat_bin.sldd';
+ for (const [build, keys] of [
+ ['pre93', [...shaped, ...enums, ...m7]],
+ ['pre69664b0', [...shaped, ...enums, ...m7]],
+ ['pre90caf06', [...shaped, ...m7]],
+ ] as const) {
+ expect([build, [...differKeys(oldSave(build, dispcat))].sort()]).toEqual([build, keys.map((k) => `design|${k}`).sort()]);
+ expect([build, differKeys(oldSave(build, 'parity/artifacts/binary/cases.sldd'))]).toEqual([build, []]);
+ }
+ });
+
+ describe("D15: core's copy of a mixed-class object array from a binary dictionary into a text one", () => {
+ const pasted = (to: string) => PASTES.flatMap((c) => list(c.matlab.pasted).filter((p) => p.to === to));
+
+ it('reads in MATLAB as the binary original, every other entry as it was', () => {
+ for (const c of PASTES.filter((c) => c.source !== EMPTIES_OLD_SAVE && list(c.pasted)[0]?.from !== 'sE00')) {
+ expect([c.file, c.matlab.asOriginal, differKeys(c)]).toEqual([c.file, true, []]);
+ }
+ });
+
+ it("a user's subclass of Simulink.Signal beside a Simulink.Signal, either first, as a Simulink.Signal array of each element's own class", () => {
+ expect(pasted('holdsMixedPasted').map((p) => [p.same, p.kids, p.sourceKids])).toEqual(
+ Array(2).fill([true, 'Simulink.Signal[1 2]{dexdata.DerivedSignal,Simulink.Signal}', 'Simulink.Signal[1 2]{dexdata.DerivedSignal,Simulink.Signal}']),
+ );
+ expect(pasted('holdsBasePasted').map((p) => [p.same, p.kids, p.sourceKids])).toEqual(
+ Array(2).fill([true, 'Simulink.Signal[1 2]{Simulink.Signal,dexdata.DerivedSignal}', 'Simulink.Signal[1 2]{Simulink.Signal,dexdata.DerivedSignal}']),
+ );
+ });
+
+ it("a config set's Components, as a Simulink.ConfigComponent array, an SSC.SimscapeCC among them", () => {
+ for (const p of pasted('csSimscapePasted')) {
+ expect([p.same, p.kids === p.sourceKids, p.kids]).toEqual([true, true, expect.stringMatching(/^Simulink\.ConfigComponent\[10 1\]\{Simulink\.SolverCC,.*,SSC\.SimscapeCC\}$/)]);
+ }
+ });
+
+ it("the AUTOSAR target's dynamic properties, which the text form holds among the ordinary ones, as the dynamic properties they were", () => {
+ for (const c of PASTES.filter((c) => list(c.dynamic).length > 0)) {
+ expect(list(c.matlab.dynamic).map((d) => [d.name, d.save === d.original, d.dynamicInSave])).toEqual(list(c.dynamic).map((d) => [d.name, true, true]));
+ }
+ expect(PASTES.filter((c) => list(c.dynamic).length > 0).length).toBe(2);
+ });
+ });
+});
diff --git a/test/parity/oldsaves/make_old_saves_r2027a.m b/test/parity/oldsaves/make_old_saves_r2027a.m
new file mode 100644
index 00000000..07715d2d
--- /dev/null
+++ b/test/parity/oldsaves/make_old_saves_r2027a.m
@@ -0,0 +1,138 @@
+function make_old_saves_r2027a(outDir)
+ % Copyright 2026 The MathWorks, Inc.
+ % Authors old_saves_r2027a_binary.sldd and old_saves_r2027a_text.sldd: one dictionary, in
+ % each format, holding the shapes no other binary fixture holds that the read-back of core's
+ % older saves asks about (probe_old_saves_readback.m). Run (one line: mw splits -batch on
+ % newlines):
+ %
+ % mw -using Bmain matlab -nodesktop -batch "cd(''); make_old_saves_r2027a"
+ %
+ % `outDir` defaults to this folder. Verify by the WROTE lines and the trailing
+ % MAKE_OLD_SAVES_R2027A_DONE; a FAIL line means a shape below is not in the file. The
+ % committed files were written by R2027a (27.1.0.3409468) on 2026-10-18; a re-run gives new
+ % UUIDs and timestamps, and the same values. The old saves beside them were made from the
+ % committed binary file (test/parity/matlab/old_saves.mjs), so a re-run here asks for them,
+ % and for MATLAB's read-back, again.
+ %
+ % THE ENTRIES
+ % Configurations
+ % csAutosar a default Simulink.ConfigSet switched to autosar.tlc: its target component
+ % is a Simulink.STFCustomTargetCC, and the options autosar.tlc adds to it are
+ % written as dynamic properties (Source="dynamic" PropertyType="...") in a
+ % binary dictionary, and under _dynamic_properties in a text one
+ % csSimscape a default Simulink.ConfigSet with an SSC.SimscapeCC attached, a component
+ % no text dictionary lists under Simulink.ConfigComponent, where Simscape is
+ % installed
+ % Other Data
+ % holdsMixed an NdHolder whose Kids is [dexdata.DerivedSignal, Simulink.Signal]: a
+ % Simulink.Signal array whose first element is a user's subclass of it (a
+ % dictionary refuses a Simulink.Signal array as an entry's value, and Design
+ % Data a value of a user's class; Other Data takes one, whose property may hold
+ % the array)
+ % holdsBase the same with the base class first, [Simulink.Signal, dexdata.DerivedSignal]
+ % Design Data
+ % sE00 struct([]), a 0x0 struct with no fields
+ % sE02 a 0x2 struct with no fields
+ % sE20 a 2x0 struct with no fields
+ % sE002 a 0x0x2 struct with no fields
+ % sE10ab a 1x0 struct with fields a and b
+ % sHolds a 1x1 struct whose field e is a 0x0 struct with field a, and whose field
+ % none is a 0x0 struct with no fields
+ here = fileparts(mfilename('fullpath'));
+ if nargin < 1 || isempty(outDir)
+ outDir = here;
+ end
+ addpath(fullfile(here, '..', '..', 'fixtures', 'mcos')); % NdHolder, +dexdata
+ Simulink.data.dictionary.closeAll('-discard');
+ configs = {};
+ try
+ cs = Simulink.ConfigSet;
+ cs.Name = 'csAutosar';
+ switchTarget(cs, 'autosar.tlc', []);
+ target = cs.getComponent('Code Generation').getComponent('Target');
+ fprintf('CONFIG csAutosar target %s components %s\n', class(target), classesOf(cs.Components));
+ configs(end + 1, :) = {'csAutosar', cs};
+ catch err
+ fprintf('FAIL csAutosar: %s\n', err.message);
+ end
+ try
+ cs = Simulink.ConfigSet;
+ cs.Name = 'csSimscape';
+ attachComponent(cs, SSC.SimscapeCC);
+ fprintf('CONFIG csSimscape components %s\n', classesOf(cs.Components));
+ configs(end + 1, :) = {'csSimscape', cs};
+ catch err
+ fprintf('FAIL csSimscape: %s\n', err.message);
+ end
+ other = {};
+ try
+ mixed = NdHolder;
+ mixed.Tag = 'mixed';
+ mixed.Kids = [dexdata.DerivedSignal, Simulink.Signal];
+ base = NdHolder;
+ base.Tag = 'base';
+ base.Kids = [Simulink.Signal, dexdata.DerivedSignal];
+ fprintf('MIXED %s %s; BASE %s %s\n', class(mixed.Kids), classesOf(mixed.Kids), class(base.Kids), classesOf(base.Kids));
+ other = {'holdsMixed', mixed; 'holdsBase', base};
+ catch err
+ fprintf('FAIL mixed signals: %s\n', err.message);
+ end
+ design = {};
+ design(end + 1, :) = {'sE00', struct([])};
+ design(end + 1, :) = {'sE02', repmat(struct(), 0, 2)};
+ design(end + 1, :) = {'sE20', repmat(struct(), 2, 0)};
+ design(end + 1, :) = {'sE002', repmat(struct(), [0 0 2])};
+ design(end + 1, :) = {'sE10ab', struct('a', cell(1, 0), 'b', cell(1, 0))};
+ design(end + 1, :) = {'sHolds', struct('x', 1, 'e', struct('a', {}), 'none', struct([]))};
+ formats = {'uncompressed-text', 'text'; 'compressed-binary', 'binary'};
+ for i = 1:size(formats, 1)
+ fn = fullfile(outDir, ['old_saves_r2027a_' formats{i, 2} '.sldd']);
+ if exist(fn, 'file'), delete(fn); end
+ dd = Simulink.data.dictionary.create(fn);
+ dd.FileFormat = formats{i, 1};
+ ds = dd.getSection('Design Data');
+ for k = 1:size(design, 1)
+ try
+ ds.addEntry(design{k, 1}, design{k, 2});
+ catch err
+ fprintf('FAIL %s %s: %s\n', formats{i, 2}, design{k, 1}, err.message);
+ end
+ end
+ os = dd.getSection('Other Data');
+ for k = 1:size(other, 1)
+ try
+ os.addEntry(other{k, 1}, other{k, 2});
+ catch err
+ fprintf('FAIL %s %s: %s\n', formats{i, 2}, other{k, 1}, err.message);
+ end
+ end
+ cfg = dd.getSection('Configurations');
+ for k = 1:size(configs, 1)
+ try
+ cfg.addEntry(configs{k, 1}, configs{k, 2});
+ catch err
+ fprintf('FAIL %s %s: %s\n', formats{i, 2}, configs{k, 1}, err.message);
+ end
+ end
+ clear ds os cfg
+ dd.saveChanges();
+ dd.close();
+ fprintf('WROTE %s\n', fn);
+ end
+ % What MATLAB reads of each entry, back from the binary file.
+ dd = Simulink.data.dictionary.open(fullfile(outDir, 'old_saves_r2027a_binary.sldd'));
+ for s = {'Design Data', 'Other Data', 'Configurations'}
+ entries = find(getSection(dd, s{1})); %#ok
+ for k = 1:numel(entries)
+ v = getValue(entries(k));
+ fprintf('READ %s %s %s %s\n', s{1}, entries(k).Name, class(v), mat2str(size(v)));
+ end
+ end
+ close(dd);
+ Simulink.data.dictionary.closeAll('-discard');
+ fprintf('MAKE_OLD_SAVES_R2027A_DONE\n');
+end
+
+function s = classesOf(objects)
+ s = strjoin(arrayfun(@(k) {class(objects(k))}, 1:numel(objects)), ',');
+end
diff --git a/test/parity/oldsaves/old_saves_r2027a_binary.sldd b/test/parity/oldsaves/old_saves_r2027a_binary.sldd
new file mode 100644
index 00000000..dbf925e9
Binary files /dev/null and b/test/parity/oldsaves/old_saves_r2027a_binary.sldd differ
diff --git a/test/parity/oldsaves/old_saves_r2027a_text.sldd b/test/parity/oldsaves/old_saves_r2027a_text.sldd
new file mode 100644
index 00000000..edaff791
--- /dev/null
+++ b/test/parity/oldsaves/old_saves_r2027a_text.sldd
@@ -0,0 +1,769 @@
+{
+ "__MW_TEXT_COREPROPERTIES__": {
+ "release": "R2027a"
+ },
+ "__MW_TEXT_PARTS__": {
+ "__MW_TEXT_PART__/data/chunk0": {
+ "__MW_TEXT_content": {
+ "entries": [
+ {
+ "name": "sE00",
+ "metadata": {
+ "uuid": "4e7876e5-399b-4a22-be29-31007668dc7d",
+ "namespace": "dacaf35e-55a5-454d-a7c1-93db038a210e",
+ "lastmod": "20261019T030832.502587",
+ "modifiedby": "weiwang",
+ "isderived": "0"
+ },
+ "value": {
+ "_type": "struct",
+ "_value": "[]"
+ }
+ },
+ {
+ "name": "sE002",
+ "metadata": {
+ "uuid": "7fd87c02-0923-4d6d-9214-1bdc8dfc2951",
+ "namespace": "dacaf35e-55a5-454d-a7c1-93db038a210e",
+ "lastmod": "20261019T030832.505428",
+ "modifiedby": "weiwang",
+ "isderived": "0"
+ },
+ "value": {
+ "_type": "struct",
+ "_value": "[]"
+ }
+ },
+ {
+ "name": "sE02",
+ "metadata": {
+ "uuid": "b52c5ea8-593b-4372-a7b9-83d3ab45b86f",
+ "namespace": "dacaf35e-55a5-454d-a7c1-93db038a210e",
+ "lastmod": "20261019T030832.505069",
+ "modifiedby": "weiwang",
+ "isderived": "0"
+ },
+ "value": {
+ "_type": "struct",
+ "_value": "[]"
+ }
+ },
+ {
+ "name": "sE10ab",
+ "metadata": {
+ "uuid": "9a6707de-258e-4094-9d11-19a2a7238113",
+ "namespace": "dacaf35e-55a5-454d-a7c1-93db038a210e",
+ "lastmod": "20261019T030832.505616",
+ "modifiedby": "weiwang",
+ "isderived": "0"
+ },
+ "value": {
+ "_type": "struct",
+ "_value": "[]"
+ }
+ },
+ {
+ "name": "sE20",
+ "metadata": {
+ "uuid": "90827797-fc7e-4bf5-826f-5a81d5efbf82",
+ "namespace": "dacaf35e-55a5-454d-a7c1-93db038a210e",
+ "lastmod": "20261019T030832.505228",
+ "modifiedby": "weiwang",
+ "isderived": "0"
+ },
+ "value": {
+ "_type": "struct",
+ "_value": "[]"
+ }
+ },
+ {
+ "name": "sHolds",
+ "metadata": {
+ "uuid": "8733824d-6e2e-4e4b-915f-f3155ac74b6c",
+ "namespace": "dacaf35e-55a5-454d-a7c1-93db038a210e",
+ "lastmod": "20261019T030832.505772",
+ "modifiedby": "weiwang",
+ "isderived": "0"
+ },
+ "value": {
+ "_array_type": "Struct",
+ "_dimensions": [
+ 1,
+ 1
+ ],
+ "_elements": [
+ {
+ "e": {
+ "_type": "struct",
+ "_value": "[]"
+ },
+ "none": {
+ "_type": "struct",
+ "_value": "[]"
+ },
+ "x": 1
+ }
+ ],
+ "_fields": [
+ "x",
+ "e",
+ "none"
+ ],
+ "_mw_element_type": "MATLABArray"
+ }
+ },
+ {
+ "name": "csAutosar",
+ "metadata": {
+ "uuid": "185eb70b-104e-43a5-a0f3-3aa84b46ca2e",
+ "namespace": "a3b2532e-8e6e-47f5-94fb-b15daf666a84",
+ "lastmod": "20261019T030832.510190",
+ "modifiedby": "weiwang",
+ "isderived": "0"
+ },
+ "value": {
+ "_array_class": "Simulink.ConfigSet",
+ "_dimensions": [
+ 1,
+ 1
+ ],
+ "_elements": [
+ {
+ "_id": "1",
+ "_properties": {
+ "Components": {
+ "_array_class": "Simulink.ConfigComponent",
+ "_dimensions": [
+ 9,
+ 1
+ ],
+ "_elements": [
+ {
+ "_id": "2",
+ "_object_class": "Simulink.SolverCC",
+ "_properties": {
+ "SolverName": "VariableStepAuto",
+ "Version": "27.0.0"
+ }
+ },
+ {
+ "_id": "3",
+ "_object_class": "Simulink.DataIOCC",
+ "_properties": {
+ "Version": "27.0.0"
+ }
+ },
+ {
+ "_id": "4",
+ "_object_class": "Simulink.OptimizationCC",
+ "_properties": {
+ "DefaultParameterBehavior": "Inlined",
+ "DifferentSizesBufferReuse": "on",
+ "EfficientTunableParamExpr": "on",
+ "EnhancedBackFolding": "on",
+ "OptimizationCustomize": "off",
+ "OptimizeBlockOrder": "speed",
+ "PassReuseOutputArgsAs": "Individual arguments",
+ "RemoveInternalMemoryZeroInit": "on",
+ "RemoveRootLevelIOMemoryZeroInit": "on",
+ "Version": "27.0.0"
+ }
+ },
+ {
+ "_id": "5",
+ "_object_class": "Simulink.DebuggingCC",
+ "_properties": {
+ "ParameterTunabilityLossMsg": "error",
+ "Version": "27.0.0"
+ }
+ },
+ {
+ "_id": "6",
+ "_object_class": "Simulink.HardwareCC",
+ "_properties": {
+ "Version": "27.0.0"
+ }
+ },
+ {
+ "_id": "7",
+ "_object_class": "Simulink.ModelReferenceCC",
+ "_properties": {
+ "Version": "27.0.0"
+ }
+ },
+ {
+ "_id": "8",
+ "_object_class": "Simulink.SFSimCC",
+ "_properties": {
+ "CustomCodeFunctionArrayLayout": [],
+ "MATLABDynamicMemAlloc": "off",
+ "Version": "27.0.0"
+ }
+ },
+ {
+ "_id": "9",
+ "_object_class": "Simulink.RTWCC",
+ "_properties": {
+ "BuildConfiguration": "Faster Builds",
+ "Components": {
+ "_array_class": "Simulink.ConfigComponent",
+ "_dimensions": [
+ 2,
+ 1
+ ],
+ "_elements": [
+ {
+ "_id": "10",
+ "_object_class": "Simulink.CodeAppCC",
+ "_properties": {
+ "ForceParamTrailComments": "on",
+ "IgnoreCustomStorageClasses": "off",
+ "InsertBlockDesc": "on",
+ "OperatorAnnotations": "on",
+ "SFDataObjDesc": "on",
+ "ShowEliminatedStatement": "on",
+ "SimulinkDataObjDesc": "on",
+ "Version": "27.0.0"
+ }
+ },
+ {
+ "_dynamic_properties": {
+ "AutosarCompilerAbstraction": "off",
+ "AutosarMatrixIOAsArray": "off",
+ "AutosarMaxShortNameLength": 128,
+ "AutosarSchemaVersion": "R23-11",
+ "DisableAUTOSARRoutinesHostLibrary": "off"
+ },
+ "_id": "11",
+ "_object_class": "Simulink.STFCustomTargetCC",
+ "_properties": {
+ "AutosarCompliant": "on",
+ "CPPClassGenCompliant": "off",
+ "CombineOutputUpdateFcns": "on",
+ "CombineSignalStateStructs": "on",
+ "CompOptLevelCompliant": "on",
+ "Components": {
+ "_id": "12",
+ "_object_class": "Simulink.ERTTargetCC",
+ "_properties": {
+ "AutosarCompliant": "on",
+ "BooleanFalseId": "FALSE",
+ "BooleanTrueId": "TRUE",
+ "CPPClassGenCompliant": "off",
+ "CombineOutputUpdateFcns": "on",
+ "CombineSignalStateStructs": "on",
+ "CompOptLevelCompliant": "on",
+ "ConcurrentExecutionCompliant": "off",
+ "ConvertIfToSwitch": "on",
+ "ERTCustomFileBanners": "on",
+ "GRTInterface": "off",
+ "GenerateAllocFcn": "off",
+ "GenerateSampleERTMain": "off",
+ "IncludeMdlTerminateFcn": "off",
+ "LUTObjectStructOrderEvenSpacing": "Size,Table,Breakpoints",
+ "LookupTableObjectStructAxisOrder": "2,1,3,4,...",
+ "MATLABClassNameForMDSCustomization": "Simulink.SoftwareTarget.ERTCustomization",
+ "MatFileLogging": "off",
+ "MaxIdInt16": "",
+ "MaxIdInt32": "",
+ "MaxIdInt64": "",
+ "MaxIdInt8": "",
+ "MaxIdUint16": "",
+ "MaxIdUint32": "",
+ "MaxIdUint64": "",
+ "MaxIdUint8": "",
+ "MinIdInt16": "",
+ "MinIdInt32": "",
+ "MinIdInt64": "",
+ "MinIdInt8": "",
+ "ModelReferenceCompliant": "on",
+ "ModelStepFunctionPrototypeControlCompliant": "off",
+ "MultiwordLength": 256,
+ "ParMdlRefBuildCompliant": "on",
+ "RemoveResetFunc": "on",
+ "SupportComplex": "off",
+ "SupportContinuousTime": "off",
+ "SupportNonFinite": "off",
+ "SupportNonInlinedSFcns": "off",
+ "SuppressErrorStatus": "on",
+ "SuppressUnreachableDefaultCases": "on",
+ "UseToolchainInfoCompliant": "on",
+ "Version": "27.0.0"
+ }
+ },
+ "ConcurrentExecutionCompliant": "off",
+ "ERTCustomFileBanners": "on",
+ "GRTInterface": "off",
+ "GenerateAllocFcn": "off",
+ "GenerateSampleERTMain": "off",
+ "IncludeMdlTerminateFcn": "off",
+ "LUTObjectStructOrderEvenSpacing": "Size,Table,Breakpoints",
+ "LookupTableObjectStructAxisOrder": "2,1,3,4,...",
+ "MATLABClassNameForMDSCustomization": "Simulink.SoftwareTarget.ERTCustomization",
+ "MatFileLogging": "off",
+ "ModelReferenceCompliant": "on",
+ "ModelStepFunctionPrototypeControlCompliant": "off",
+ "MultiwordLength": 256,
+ "ParMdlRefBuildCompliant": "on",
+ "RemoveResetFunc": "on",
+ "SupportComplex": "off",
+ "SupportContinuousTime": "off",
+ "SupportNonFinite": "off",
+ "SupportNonInlinedSFcns": "off",
+ "SuppressErrorStatus": "on",
+ "SystemTargetFile": "autosar.tlc",
+ "UseToolchainInfoCompliant": "on",
+ "Version": "27.0.0"
+ }
+ }
+ ]
+ },
+ "DataTypeReplacement": "CDataTypesFixedWidth",
+ "Description": "AUTOSAR",
+ "GenCodeOnly": "on",
+ "SystemTargetFile": "autosar.tlc",
+ "TemplateMakefile": "ert_default_tmf",
+ "Toolchain": "Automatically locate an installed toolchain",
+ "Version": "27.0.0"
+ }
+ },
+ {
+ "_id": "13",
+ "_object_class": "SlCovCC.ConfigComp",
+ "_properties": {
+ "CovEnable": "off",
+ "CovIncludeTopModel": "on",
+ "CovModelRefEnable": "off",
+ "CovScope": "EntireSystem",
+ "Description": "Simulink Coverage Configuration Component",
+ "Version": "27.0.0"
+ }
+ }
+ ]
+ },
+ "ConfigPrmDlgPosition": [
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "CurrentDlgPage": "",
+ "ExtraOptions": "",
+ "Name": "csAutosar",
+ "Version": "27.0.0"
+ }
+ }
+ ],
+ "_mw_element_type": "MATLABArray"
+ }
+ },
+ {
+ "name": "csSimscape",
+ "metadata": {
+ "uuid": "9ea55741-afc2-4183-b145-87155f8f40dd",
+ "namespace": "a3b2532e-8e6e-47f5-94fb-b15daf666a84",
+ "lastmod": "20261019T030832.520987",
+ "modifiedby": "weiwang",
+ "isderived": "0"
+ },
+ "value": {
+ "_array_class": "Simulink.ConfigSet",
+ "_dimensions": [
+ 1,
+ 1
+ ],
+ "_elements": [
+ {
+ "_id": "1",
+ "_properties": {
+ "Components": {
+ "_array_class": "Simulink.ConfigComponent",
+ "_dimensions": [
+ 10,
+ 1
+ ],
+ "_elements": [
+ {
+ "_id": "2",
+ "_object_class": "Simulink.SolverCC",
+ "_properties": {
+ "SolverName": "VariableStepAuto",
+ "Version": "27.0.0"
+ }
+ },
+ {
+ "_id": "3",
+ "_object_class": "Simulink.DataIOCC",
+ "_properties": {
+ "Version": "27.0.0"
+ }
+ },
+ {
+ "_id": "4",
+ "_object_class": "Simulink.OptimizationCC",
+ "_properties": {
+ "Version": "27.0.0"
+ }
+ },
+ {
+ "_id": "5",
+ "_object_class": "Simulink.DebuggingCC",
+ "_properties": {
+ "Version": "27.0.0"
+ }
+ },
+ {
+ "_id": "6",
+ "_object_class": "Simulink.HardwareCC",
+ "_properties": {
+ "Version": "27.0.0"
+ }
+ },
+ {
+ "_id": "7",
+ "_object_class": "Simulink.ModelReferenceCC",
+ "_properties": {
+ "Version": "27.0.0"
+ }
+ },
+ {
+ "_id": "8",
+ "_object_class": "Simulink.SFSimCC",
+ "_properties": {
+ "CustomCodeFunctionArrayLayout": [],
+ "Version": "27.0.0"
+ }
+ },
+ {
+ "_id": "9",
+ "_object_class": "Simulink.RTWCC",
+ "_properties": {
+ "BuildConfiguration": "Faster Builds",
+ "Components": {
+ "_array_class": "Simulink.ConfigComponent",
+ "_dimensions": [
+ 2,
+ 1
+ ],
+ "_elements": [
+ {
+ "_id": "10",
+ "_object_class": "Simulink.CodeAppCC",
+ "_properties": {
+ "Version": "27.0.0"
+ }
+ },
+ {
+ "_id": "11",
+ "_object_class": "Simulink.GRTTargetCC",
+ "_properties": {
+ "CPPClassGenCompliant": "on",
+ "CombineOutputUpdateFcns": "on",
+ "CompOptLevelCompliant": "on",
+ "ConcurrentExecutionCompliant": "on",
+ "ERTCustomFileBanners": "off",
+ "GRTInterface": "off",
+ "GenerateAllocFcn": "off",
+ "GenerateSampleERTMain": "off",
+ "MATLABClassNameForMDSCustomization": "Simulink.SoftwareTarget.GRTCustomization",
+ "MatFileLogging": "on",
+ "ModelReferenceCompliant": "on",
+ "ModelStepFunctionPrototypeControlCompliant": "off",
+ "MultiwordLength": 2048,
+ "ParMdlRefBuildCompliant": "on",
+ "SupportContinuousTime": "on",
+ "SupportNonFinite": "on",
+ "SupportNonInlinedSFcns": "on",
+ "UseToolchainInfoCompliant": "on",
+ "Version": "27.0.0"
+ }
+ }
+ ]
+ },
+ "Description": "Generic Real-Time Target",
+ "SystemTargetFile": "grt.tlc",
+ "Toolchain": "Automatically locate an installed toolchain",
+ "Version": "27.0.0"
+ }
+ },
+ {
+ "_id": "12",
+ "_object_class": "SlCovCC.ConfigComp",
+ "_properties": {
+ "CovEnable": "off",
+ "CovIncludeTopModel": "on",
+ "CovModelRefEnable": "off",
+ "CovScope": "EntireSystem",
+ "Description": "Simulink Coverage Configuration Component",
+ "Version": "27.0.0"
+ }
+ },
+ {
+ "_id": "13",
+ "_object_class": "SSC.SimscapeCC",
+ "_properties": {
+ "Components": {
+ "_id": "14",
+ "_object_class": "simmechanics.ConfigurationSet",
+ "_properties": {
+ "Components": {
+ "_array_class": "Simulink.CustomCC",
+ "_dimensions": [
+ 2,
+ 1
+ ],
+ "_elements": [
+ {
+ "_id": "15",
+ "_object_class": "simmechanics.DiagnosticsConfigSet",
+ "_properties": {
+ "SimMechanicsConflictingReferenceFrames": "warning",
+ "SimMechanicsCrossSectionNullEdge": "warning",
+ "SimMechanicsInvalidVisualProperty": "warning",
+ "SimMechanicsJointTargetOverSpecification": "error",
+ "SimMechanicsRedundantBlock": "warning",
+ "SimMechanicsRigidlyBoundBlock": "error",
+ "SimMechanicsUnconnectedFramePorts": "warning",
+ "SimMechanicsUnconnectedGeometryPorts": "warning",
+ "SimMechanicsUnsatisfiedHighPriorityTargets": "warning",
+ "Version": "27.0.0"
+ }
+ },
+ {
+ "_id": "16",
+ "_object_class": "simmechanics.ExplorerConfigSet",
+ "_properties": {
+ "InternalSimMechanicsExplorerSettings": "",
+ "InternalSimMechanicsPlaybackDataRate": "30",
+ "InternalSimMechanicsSavePlaybackData": "none",
+ "InternalSimMechanicsSavePlaybackDataVariable": "smplaybacklog",
+ "SimMechanicsOpenEditorOnUpdate": "on",
+ "Version": "27.0.0"
+ }
+ }
+ ]
+ },
+ "Version": "27.0.0"
+ }
+ },
+ "EditingMode": "Full",
+ "ExplicitSolverDiagnosticOptions": "warning",
+ "GlobalZcOffDiagnosticOptions": "warning",
+ "SelectedTab": "",
+ "SimscapeAutoSelectReusableComponents": "on",
+ "SimscapeCacheCompileArtifacts": "on",
+ "SimscapeCompileArtifactsDiskCache": "off",
+ "SimscapeCompileComponentReuse": "off",
+ "SimscapeLogDataHistory": 10000,
+ "SimscapeLogDecimation": 1,
+ "SimscapeLogLimitData": "on",
+ "SimscapeLogName": "simlog",
+ "SimscapeLogOpenViewer": "off",
+ "SimscapeLogSimulationStatistics": "off",
+ "SimscapeLogType": "all",
+ "SimscapeMultithreadedCompilation": "on",
+ "SimscapeNominalValues": "[{\"value\":\"1\",\"unit\":\"A\"},{\"value\":\"1\",\"unit\":\"bar\"},{\"value\":\"1\",\"unit\":\"cm^2\"},{\"value\":\"1\",\"unit\":\"cm^3/s\"},{\"value\":\"1\",\"unit\":\"kJ/kg\"},{\"value\":\"1\",\"unit\":\"kW\"},{\"value\":\"1\",\"unit\":\"l\"},{\"value\":\"1\",\"unit\":\"N\"},{\"value\":\"1\",\"unit\":\"N*m\"},{\"value\":\"1\",\"unit\":\"V\"},{\"value\":\"0.001\",\"unit\":\"Wb\"}]",
+ "SimscapeNormalizeSystem": "off",
+ "SimscapeOperatingPoint": "",
+ "SimscapeUseEnergyAccounting": "off",
+ "SimscapeUseOperatingPoints": "off",
+ "Version": "27.0.0"
+ }
+ }
+ ]
+ },
+ "ConfigPrmDlgPosition": [
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "CurrentDlgPage": "",
+ "ExtraOptions": "",
+ "Name": "csSimscape",
+ "Version": "27.0.0"
+ }
+ }
+ ],
+ "_mw_element_type": "MATLABArray"
+ }
+ },
+ {
+ "name": "holdsBase",
+ "metadata": {
+ "uuid": "bf293156-5cd5-4341-ad52-ec7964744b09",
+ "namespace": "42516768-0ace-4981-8ac7-0a9b32cba471",
+ "lastmod": "20261019T030832.509844",
+ "modifiedby": "weiwang",
+ "isderived": "0"
+ },
+ "value": {
+ "_array_class": "NdHolder",
+ "_dimensions": [
+ 1,
+ 1
+ ],
+ "_elements": [
+ {
+ "_id": "1",
+ "_properties": {
+ "Kids": {
+ "_array_class": "Simulink.Signal",
+ "_dimensions": [
+ 1,
+ 2
+ ],
+ "_elements": [
+ {
+ "_id": "2",
+ "_properties": {
+ "CoderInfo": {
+ "_id": "4",
+ "_object_class": "Simulink.CoderInfo",
+ "_properties": {
+ "CSCPackageName": "Simulink",
+ "CustomAttributes": {
+ "_id": "5",
+ "_object_class": "SimulinkCSC.AttribClass_Simulink_Default",
+ "_properties": {}
+ },
+ "CustomStorageClass": "Default",
+ "ParameterOrSignal": "Signal",
+ "StorageClass": "Auto"
+ }
+ },
+ "LoggingInfo": {
+ "_id": "3",
+ "_object_class": "Simulink.LoggingInfo",
+ "_properties": {}
+ }
+ }
+ },
+ {
+ "_id": "6",
+ "_object_class": "dexdata.DerivedSignal",
+ "_properties": {
+ "CoderInfo": {
+ "_id": "8",
+ "_object_class": "Simulink.CoderInfo",
+ "_properties": {
+ "CSCPackageName": "Simulink",
+ "CustomAttributes": {
+ "_id": "9",
+ "_object_class": "SimulinkCSC.AttribClass_Simulink_Default",
+ "_properties": {}
+ },
+ "CustomStorageClass": "Default",
+ "ParameterOrSignal": "Signal",
+ "StorageClass": "Auto"
+ }
+ },
+ "LoggingInfo": {
+ "_id": "7",
+ "_object_class": "Simulink.LoggingInfo",
+ "_properties": {}
+ }
+ }
+ }
+ ]
+ },
+ "Tag": "base"
+ }
+ }
+ ],
+ "_mw_element_type": "MATLABArray"
+ }
+ },
+ {
+ "name": "holdsMixed",
+ "metadata": {
+ "uuid": "969ed16c-ddf7-4f08-a565-78ba997a999c",
+ "namespace": "42516768-0ace-4981-8ac7-0a9b32cba471",
+ "lastmod": "20261019T030832.509126",
+ "modifiedby": "weiwang",
+ "isderived": "0"
+ },
+ "value": {
+ "_array_class": "NdHolder",
+ "_dimensions": [
+ 1,
+ 1
+ ],
+ "_elements": [
+ {
+ "_id": "1",
+ "_properties": {
+ "Kids": {
+ "_array_class": "Simulink.Signal",
+ "_dimensions": [
+ 1,
+ 2
+ ],
+ "_elements": [
+ {
+ "_id": "2",
+ "_object_class": "dexdata.DerivedSignal",
+ "_properties": {
+ "CoderInfo": {
+ "_id": "4",
+ "_object_class": "Simulink.CoderInfo",
+ "_properties": {
+ "CSCPackageName": "Simulink",
+ "CustomAttributes": {
+ "_id": "5",
+ "_object_class": "SimulinkCSC.AttribClass_Simulink_Default",
+ "_properties": {}
+ },
+ "CustomStorageClass": "Default",
+ "ParameterOrSignal": "Signal",
+ "StorageClass": "Auto"
+ }
+ },
+ "LoggingInfo": {
+ "_id": "3",
+ "_object_class": "Simulink.LoggingInfo",
+ "_properties": {}
+ }
+ }
+ },
+ {
+ "_id": "6",
+ "_properties": {
+ "CoderInfo": {
+ "_id": "8",
+ "_object_class": "Simulink.CoderInfo",
+ "_properties": {
+ "CSCPackageName": "Simulink",
+ "CustomAttributes": {
+ "_id": "9",
+ "_object_class": "SimulinkCSC.AttribClass_Simulink_Default",
+ "_properties": {}
+ },
+ "CustomStorageClass": "Default",
+ "ParameterOrSignal": "Signal",
+ "StorageClass": "Auto"
+ }
+ },
+ "LoggingInfo": {
+ "_id": "7",
+ "_object_class": "Simulink.LoggingInfo",
+ "_properties": {}
+ }
+ }
+ }
+ ]
+ },
+ "Tag": "mixed"
+ }
+ }
+ ],
+ "_mw_element_type": "MATLABArray"
+ }
+ }
+ ],
+ "Dictionary References": [],
+ "AllowAccessBWS": false
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/test/parity/oldsaves/pre69664b0_cases.sldd b/test/parity/oldsaves/pre69664b0_cases.sldd
new file mode 100644
index 00000000..d92ecba5
Binary files /dev/null and b/test/parity/oldsaves/pre69664b0_cases.sldd differ
diff --git a/test/parity/oldsaves/pre69664b0_dispcat_bin.sldd b/test/parity/oldsaves/pre69664b0_dispcat_bin.sldd
new file mode 100644
index 00000000..8c71448e
Binary files /dev/null and b/test/parity/oldsaves/pre69664b0_dispcat_bin.sldd differ
diff --git a/test/parity/oldsaves/pre69664b0_old_saves_r2027a_binary.sldd b/test/parity/oldsaves/pre69664b0_old_saves_r2027a_binary.sldd
new file mode 100644
index 00000000..c1f1e731
Binary files /dev/null and b/test/parity/oldsaves/pre69664b0_old_saves_r2027a_binary.sldd differ
diff --git a/test/parity/oldsaves/pre90caf06_cases.sldd b/test/parity/oldsaves/pre90caf06_cases.sldd
new file mode 100644
index 00000000..356617fc
Binary files /dev/null and b/test/parity/oldsaves/pre90caf06_cases.sldd differ
diff --git a/test/parity/oldsaves/pre90caf06_dispcat_bin.sldd b/test/parity/oldsaves/pre90caf06_dispcat_bin.sldd
new file mode 100644
index 00000000..edb0d743
Binary files /dev/null and b/test/parity/oldsaves/pre90caf06_dispcat_bin.sldd differ
diff --git a/test/parity/oldsaves/pre90caf06_old_saves_r2027a_binary.sldd b/test/parity/oldsaves/pre90caf06_old_saves_r2027a_binary.sldd
new file mode 100644
index 00000000..5e534f04
Binary files /dev/null and b/test/parity/oldsaves/pre90caf06_old_saves_r2027a_binary.sldd differ
diff --git a/test/parity/oldsaves/pre93_cases.sldd b/test/parity/oldsaves/pre93_cases.sldd
new file mode 100644
index 00000000..356617fc
Binary files /dev/null and b/test/parity/oldsaves/pre93_cases.sldd differ
diff --git a/test/parity/oldsaves/pre93_dispcat_bin.sldd b/test/parity/oldsaves/pre93_dispcat_bin.sldd
new file mode 100644
index 00000000..957d61c1
Binary files /dev/null and b/test/parity/oldsaves/pre93_dispcat_bin.sldd differ
diff --git a/test/parity/oldsaves/pre93_old_saves_r2027a_binary.sldd b/test/parity/oldsaves/pre93_old_saves_r2027a_binary.sldd
new file mode 100644
index 00000000..deb7b4c9
Binary files /dev/null and b/test/parity/oldsaves/pre93_old_saves_r2027a_binary.sldd differ