[UNTESTED] Fixes notifiers and adds some additional methods. Adds tests.

Changes:
// ArcaneEnvironment
breaking: context.read<ArcaneEnvironment>() -> ArcaneEnvironment.of(context)
breaking: context.read<ArcaneEnvironment>().state -> ArcaneEnvironment.of(context).environment;

// Feature flag service
added: reset()

// Logging service
added: registerInterface()
added: unregisterInterfaces()
added: unregisterAllInterfaces()

// ArcaneReactiveTheme
fixed: currentMode, dark, light now actually emit new values when changed
added: getters for lightTheme, darkTheme, and systemTheme
TODO: test systemTheme

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
2025-04-04 17:08:06 +02:00
parent b129639f1f
commit ac82e93b9d
16 changed files with 1233 additions and 89 deletions
@@ -0,0 +1,69 @@
import "package:arcane_framework/arcane_framework.dart";
import "package:flutter_test/flutter_test.dart";
void main() {
group("ArcaneFeatureFlags", () {
late ArcaneFeatureFlags featureFlags;
setUp(() {
featureFlags = ArcaneFeatureFlags.I;
});
test("singleton instance is consistent", () {
expect(identical(ArcaneFeatureFlags.I, featureFlags), true);
});
group("feature management", () {
setUp(() {
Arcane.features.reset();
});
test("enableFeature adds feature to enabled list", () {
featureFlags.enableFeature(MockFeature.test);
expect(featureFlags.enabledFeatures, contains(MockFeature.test));
expect(featureFlags.isEnabled(MockFeature.test), true);
});
test("disableFeature removes feature from enabled list", () {
featureFlags.enableFeature(MockFeature.test);
featureFlags.disableFeature(MockFeature.test);
expect(featureFlags.enabledFeatures, isNot(contains(MockFeature.test)));
expect(featureFlags.isDisabled(MockFeature.test), true);
});
test("enabling already enabled feature has no effect", () {
featureFlags.enableFeature(MockFeature.test);
final initialCount = featureFlags.enabledFeatures.length;
featureFlags.enableFeature(MockFeature.test);
expect(featureFlags.enabledFeatures.length, equals(initialCount));
});
test("disabling already disabled feature has no effect", () {
final initialCount = featureFlags.enabledFeatures.length;
featureFlags.disableFeature(MockFeature.test);
expect(featureFlags.enabledFeatures.length, equals(initialCount));
});
});
group("notifications", () {
test("enableFeature notifies listeners", () {
var notified = false;
featureFlags.addListener(() => notified = true);
featureFlags.enableFeature(MockFeature.test);
expect(notified, true);
});
test("disableFeature notifies listeners", () {
featureFlags.enableFeature(MockFeature.test);
var notified = false;
featureFlags.addListener(() => notified = true);
featureFlags.disableFeature(MockFeature.test);
expect(notified, true);
});
});
});
}
enum MockFeature {
test,
another,
}