2f5edfc512
- 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>
117 lines
3.3 KiB
Dart
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(":")));
|
|
});
|
|
}
|