mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-11-03 13:49:45 +00:00
Keyed archiving preserves view hierarchies created in code. Decoded views retain their content, subviews and state, and each view class is verified against its own description before archiving. * CPAccordionView: Add CPCoding to CPAccordionView and CPAccordionViewItem. * CPBox: * Encode the content, title and box views unconditionally. * Clear the superviews of the box and title views during decoding. * CPButton: Initialize the value to CPOffState. * CPMapTable: Add CPCoding. * CPPopUpButton: Clear the inherited button value. * CPSearchField: Update the cancel button when the object value changes. * CPSplitView: Return nil from dividerColor when the theme defines no divider image. * CPStepper: Discard the decoded buttons before recreating them. * CPTabView: * Encode the current tab view items. * Exclude the tabs from the encoded subviews. * CPTokenField: * Discard the decoded scroll view before recreating it. * Add the decoded tokens to the new document view. * CPVisualEffectView: Resolve the backdrop filter property only when a DOM is available. * CPBoxTest: Verify preservation of the content view, hierarchy and title, and decoding of an untitled box without warnings. * CPButtonTest: Verify the initial value of a button. * CPMapTableTest: Verify preservation of entries through archiving. * DropInArchiveFixtures: Add populated view fixtures, tree comparison, and round trip and saved archive helpers. * DropInArchiveGenerator: Save cib descriptions and view archives, and write no archive data if any view fails its round trip. * DropInArchiveTest: Verify new archives, saved archives and reference cibs, and treat decoding warnings as failures. * DropInSnapshot: * Describe the view hierarchy through private views, with state and content. * Add DropInWithFixedScrollerStyle. * DropInArchives, DropInCibs: Add saved view archives, cib descriptions and reference cibs.
93 lines
3.1 KiB
Plaintext
93 lines
3.1 KiB
Plaintext
/*
|
|
* DropInArchiveGenerator.j
|
|
* AppKit
|
|
*
|
|
* Created by David Richardson on 31/10/2026.
|
|
* Copyright David Richardson 2026.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
@import "DropInArchiveFixtures.j"
|
|
|
|
/*
|
|
Saves the archive test data. Run this only against a build of main:
|
|
|
|
objj Tests/AppKit/DropInArchiveGenerator.j
|
|
|
|
It saves a description of what each reference cib produces. It then saves an
|
|
archive of each view fixture, with the fixture's description before archiving.
|
|
An archive is saved only if it restores that description, so a failure stops
|
|
the generator and no archive data is written.
|
|
*/
|
|
var fs = require("fs"),
|
|
path = require("path");
|
|
|
|
function main(args, namedArgs)
|
|
{
|
|
[[CPApplication alloc] init];
|
|
|
|
var resources = path.join(process.cwd(), "Tests", "AppKit", "Resources"),
|
|
cibFolder = path.join(resources, "DropInCibs"),
|
|
archives = {},
|
|
cibs = {},
|
|
failures = [];
|
|
|
|
fs.readdirSync(cibFolder).sort().forEach(function(aName)
|
|
{
|
|
cibs[aName] = DropInCibTree(aName, fs.readFileSync(path.join(cibFolder, aName), {encoding: 'utf-8'}));
|
|
print(aName + ": " + cibs[aName].length + " top level objects");
|
|
});
|
|
|
|
fs.writeFileSync(path.join(resources, "DropInCibs.json"), JSON.stringify(cibs, null, 1) + "\n");
|
|
|
|
DropInSortedClasses().forEach(function(aClass)
|
|
{
|
|
var name = aClass.name;
|
|
|
|
if (!DropInIsPublicName(name) || !DropInClassIsView(aClass))
|
|
return;
|
|
|
|
if (DropInArchiveExclusion(name))
|
|
return print("excluded " + name + ": " + DropInArchiveExclusion(name));
|
|
|
|
try
|
|
{
|
|
var result = DropInArchiveRoundTrip(aClass),
|
|
differences = DropInTreeDifferences(result.original, result.decoded, name, []);
|
|
|
|
if (differences.length)
|
|
failures = failures.concat(differences);
|
|
else
|
|
archives[name] = { @"archive": result.archive, @"state": result.original };
|
|
}
|
|
catch (anException)
|
|
{
|
|
failures.push(name + ": " + String(anException));
|
|
}
|
|
});
|
|
|
|
if (failures.length)
|
|
{
|
|
failures.forEach(function(aLine) { print("failed " + aLine); });
|
|
print(failures.length + " failures, no archive data written");
|
|
process.exit(1);
|
|
}
|
|
|
|
fs.writeFileSync(path.join(resources, "DropInArchives.json"), JSON.stringify(archives, null, 1) + "\n");
|
|
|
|
print(Object.keys(archives).length + " archived view classes");
|
|
}
|