Files
dartamp/packages/dartamp_skin/test/skin_registry_test.dart
T
hans 2f5edfc512 feat: update dependencies and integrate skin manager
- Added `dartamp_skin` as a local dependency in `pubspec.yaml`.
- Updated `path_provider` to version ^2.1.5.
- Modified `test_driver/app.dart` to initialize `SkinManager` and pass it to `DartampApp`.
- Updated `generated_plugins.cmake` to include `jni` in the FFI plugin list.

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
2026-08-09 21:14:54 +02:00

117 lines
3.3 KiB
Dart

import "dart:convert";
import "dart:io";
import "dart:typed_data";
import "package:archive/archive.dart";
import "package:dartamp_skin/dartamp_skin.dart";
import "package:flutter_test/flutter_test.dart";
Uint8List _encode(Archive archive) =>
Uint8List.fromList(ZipEncoder().encode(archive));
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
late Directory tempDir;
setUp(() async {
tempDir = await Directory.systemTemp.createTemp("skin_registry_test");
});
tearDown(() async {
await tempDir.delete(recursive: true);
});
test("empty registry lists only the bundled base skin", () async {
final registry = await SkinRegistry.load(tempDir);
expect(registry.skins.map((s) => s.name), ["Base"]);
expect(registry.skins.first.isBundled, isTrue);
});
test(
"importArchive extracts files, writes a manifest, and reappears",
() async {
final archive = Archive();
final numbers = File(
"assets/skins/base/numbers.bmp",
).readAsBytesSync();
archive.addFile(
ArchiveFile("numbers.bmp", numbers.length, numbers),
);
archive.addFile(
ArchiveFile(
"pledit.txt",
"pledit.txt".length,
utf8.encode("pledit.txt"),
),
);
archive.addFile(
ArchiveFile(
"skin.xml",
'<skin id="My Cool Skin" />'.length,
utf8.encode('<skin id="My Cool Skin" />'),
),
);
final bytes = _encode(archive);
final registry = await SkinRegistry.load(tempDir);
final info = await registry.importArchive(
bytes,
fileName: "myskin.wsz",
);
expect(info.name, "My Cool Skin");
expect(info.isBundled, isFalse);
final folder = info.directory!;
expect(File("${folder.path}/numbers.bmp").existsSync(), isTrue);
expect(File("${folder.path}/manifest.json").existsSync(), isTrue);
final manifest =
jsonDecode(
File("${folder.path}/manifest.json").readAsStringSync(),
)
as Map<String, dynamic>;
expect(manifest["name"], "My Cool Skin");
final reloaded = await SkinRegistry.load(tempDir);
expect(reloaded.skins.map((s) => s.name), contains("My Cool Skin"));
},
);
test("loadSkin overrides the base with imported bitmaps", () async {
final archive = Archive();
final numbers = File(
"assets/skins/base/numbers.bmp",
).readAsBytesSync();
archive.addFile(
ArchiveFile("numbers.bmp", numbers.length, numbers),
);
final bytes = _encode(archive);
final registry = await SkinRegistry.load(tempDir);
final info = await registry.importArchive(
bytes,
name: "Test",
fileName: "test.wsz",
);
final skin = await registry.loadSkin(info);
expect(skin.name, "Test");
expect(skin.image("numbers.bmp")!.width, greaterThan(0));
// Files the archive omits fall back to the base skin.
expect(skin.image("main.bmp"), isNotNull);
});
test("folder names are sanitized", () async {
final archive = Archive();
final bytes = _encode(archive);
final registry = await SkinRegistry.load(tempDir);
final info = await registry.importArchive(
bytes,
name: "Weird/Name: *?",
fileName: "weird.wsz",
);
expect(info.directory!.uri.pathSegments.last, isNot(contains(":")));
});
}