f94cc160cf
- Add parseAppFlagsString() in AppManifestParsing.cpp to parse comma-separated flags (HideStatusBar, Hidden, None) - Parse [app]flags in V1 and app.flags in V2 manifests - Loader already supports HideStatusBar, GuiService hides statusbarWidget when set - Enables fullscreen for ELF apps (e.g. BibleVerse, BookPlayer) without firmware recompilation of internal manifests - Add tests for flag parsing (38 tests passing) - Tested on es3c28p /dev/cu.usbmodem1101 @ 192.168.68.133 with HelloWorld app
151 lines
5.3 KiB
C++
151 lines
5.3 KiB
C++
#include "TestFile.h"
|
|
#include "../../Tactility/Private/Tactility/app/AppManifestParsing.h"
|
|
#include "../../Tactility/Private/Tactility/app/AppManifestParsingInternal.h"
|
|
|
|
#include "doctest.h"
|
|
|
|
using namespace tt;
|
|
using namespace tt::app;
|
|
|
|
TEST_CASE("parseManifest() should parse a V1 (sectioned) manifest.properties file") {
|
|
TestFile file("test-manifest-v1.properties");
|
|
file.writeData(
|
|
"[manifest]\n"
|
|
"version=0.1\n"
|
|
"[target]\n"
|
|
"sdk=0.0.0\n"
|
|
"platforms=esp32,esp32s3,esp32c6,esp32p4\n"
|
|
"[app]\n"
|
|
"id=one.tactility.sdktest\n"
|
|
"versionName=0.1.0\n"
|
|
"versionCode=1\n"
|
|
"name=SDK Test\n"
|
|
);
|
|
|
|
AppManifest manifest;
|
|
CHECK_EQ(parseManifest(file.getPath(), manifest), true);
|
|
CHECK_EQ(manifest.targetSdk, "0.0.0");
|
|
CHECK_EQ(manifest.targetPlatforms, "esp32,esp32s3,esp32c6,esp32p4");
|
|
CHECK_EQ(manifest.appId, "one.tactility.sdktest");
|
|
CHECK_EQ(manifest.appName, "SDK Test");
|
|
CHECK_EQ(manifest.appVersionName, "0.1.0");
|
|
CHECK_EQ(manifest.appVersionCode, 1);
|
|
}
|
|
|
|
TEST_CASE("parseManifest() should parse a V2 (flat) manifest.properties file") {
|
|
TestFile file("test-manifest-v2.properties");
|
|
file.writeData(
|
|
"manifest.version=0.1\n"
|
|
"target.sdk=0.0.0\n"
|
|
"target.platforms=esp32,esp32s3,esp32c6,esp32p4\n"
|
|
"app.id=one.tactility.sdktest\n"
|
|
"app.version.name=0.1.0\n"
|
|
"app.version.code=1\n"
|
|
"app.name=SDK Test\n"
|
|
);
|
|
|
|
AppManifest manifest;
|
|
CHECK_EQ(parseManifest(file.getPath(), manifest), true);
|
|
CHECK_EQ(manifest.targetSdk, "0.0.0");
|
|
CHECK_EQ(manifest.targetPlatforms, "esp32,esp32s3,esp32c6,esp32p4");
|
|
CHECK_EQ(manifest.appId, "one.tactility.sdktest");
|
|
CHECK_EQ(manifest.appName, "SDK Test");
|
|
CHECK_EQ(manifest.appVersionName, "0.1.0");
|
|
CHECK_EQ(manifest.appVersionCode, 1);
|
|
}
|
|
|
|
TEST_CASE("parseManifestV1() should fail when a required key is missing") {
|
|
std::map<std::string, std::string> properties = {
|
|
{"[manifest]version", "0.1"},
|
|
{"[app]id", "one.tactility.sdktest"},
|
|
{"[app]name", "SDK Test"},
|
|
{"[app]versionName", "0.1.0"},
|
|
{"[app]versionCode", "1"},
|
|
// Missing [target]sdk
|
|
{"[target]platforms", "esp32"},
|
|
};
|
|
AppManifest manifest;
|
|
CHECK_EQ(parseManifestV1(properties, manifest), false);
|
|
}
|
|
|
|
TEST_CASE("parseManifestV2() should fail when the app id is invalid") {
|
|
std::map<std::string, std::string> properties = {
|
|
{"manifest.version", "0.1"},
|
|
{"app.id", "abc"}, // too short (isValidId requires >= 5 chars)
|
|
{"app.name", "SDK Test"},
|
|
{"app.version.name", "0.1.0"},
|
|
{"app.version.code", "1"},
|
|
{"target.sdk", "0.0.0"},
|
|
{"target.platforms", "esp32"},
|
|
};
|
|
AppManifest manifest;
|
|
CHECK_EQ(parseManifestV2(properties, manifest), false);
|
|
}
|
|
|
|
TEST_CASE("parseAppFlagsString() should parse various flag combinations") {
|
|
CHECK_EQ(parseAppFlagsString(""), 0);
|
|
CHECK_EQ(parseAppFlagsString("None"), 0);
|
|
CHECK_EQ(parseAppFlagsString("HideStatusBar"), AppManifest::Flags::HideStatusBar);
|
|
CHECK_EQ(parseAppFlagsString("hidden"), AppManifest::Flags::Hidden);
|
|
CHECK_EQ(parseAppFlagsString("HideStatusBar,Hidden"), AppManifest::Flags::HideStatusBar | AppManifest::Flags::Hidden);
|
|
CHECK_EQ(parseAppFlagsString(" hidestatusbar , hidden "), AppManifest::Flags::HideStatusBar | AppManifest::Flags::Hidden);
|
|
CHECK_EQ(parseAppFlagsString("HideStatusBar, Hidden"), AppManifest::Flags::HideStatusBar | AppManifest::Flags::Hidden);
|
|
}
|
|
|
|
TEST_CASE("parseManifest() should parse V1 flags for fullscreen") {
|
|
TestFile file("test-manifest-v1-flags.properties");
|
|
file.writeData(
|
|
"[manifest]\n"
|
|
"version=0.1\n"
|
|
"[target]\n"
|
|
"sdk=0.0.0\n"
|
|
"platforms=esp32\n"
|
|
"[app]\n"
|
|
"id=one.tactility.sdktest\n"
|
|
"versionName=0.1.0\n"
|
|
"versionCode=1\n"
|
|
"name=SDK Test\n"
|
|
"flags=HideStatusBar\n"
|
|
);
|
|
|
|
AppManifest manifest;
|
|
CHECK_EQ(parseManifest(file.getPath(), manifest), true);
|
|
CHECK_EQ(manifest.appFlags & AppManifest::Flags::HideStatusBar, AppManifest::Flags::HideStatusBar);
|
|
}
|
|
|
|
TEST_CASE("parseManifest() should parse V2 flags for fullscreen") {
|
|
TestFile file("test-manifest-v2-flags.properties");
|
|
file.writeData(
|
|
"manifest.version=0.1\n"
|
|
"target.sdk=0.0.0\n"
|
|
"target.platforms=esp32\n"
|
|
"app.id=one.tactility.sdktest\n"
|
|
"app.version.name=0.1.0\n"
|
|
"app.version.code=1\n"
|
|
"app.name=SDK Test\n"
|
|
"app.flags=HideStatusBar\n"
|
|
);
|
|
|
|
AppManifest manifest;
|
|
CHECK_EQ(parseManifest(file.getPath(), manifest), true);
|
|
CHECK_EQ(manifest.appFlags & AppManifest::Flags::HideStatusBar, AppManifest::Flags::HideStatusBar);
|
|
}
|
|
|
|
TEST_CASE("parseManifest() should parse combined flags") {
|
|
TestFile file("test-manifest-v2-flags2.properties");
|
|
file.writeData(
|
|
"manifest.version=0.1\n"
|
|
"target.sdk=0.0.0\n"
|
|
"target.platforms=esp32\n"
|
|
"app.id=one.tactility.sdktest\n"
|
|
"app.version.name=0.1.0\n"
|
|
"app.version.code=1\n"
|
|
"app.name=SDK Test\n"
|
|
"app.flags=HideStatusBar,Hidden\n"
|
|
);
|
|
|
|
AppManifest manifest;
|
|
CHECK_EQ(parseManifest(file.getPath(), manifest), true);
|
|
CHECK_EQ(manifest.appFlags, (AppManifest::Flags::HideStatusBar | AppManifest::Flags::Hidden));
|
|
}
|