resolved conflict and update doc

This commit is contained in:
PacoX
2026-07-09 09:08:50 +02:00
93 changed files with 5593 additions and 511 deletions
+54 -8
View File
@@ -2,17 +2,18 @@ import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter_test/flutter_test.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:meshcore_open/connector/meshcore_protocol.dart';
import 'package:meshcore_open/models/channel_message.dart';
import 'package:meshcore_open/models/contact.dart';
import 'package:meshcore_open/models/path_history.dart';
import 'package:meshcore_open/models/app_settings.dart';
import 'package:meshcore_open/storage/prefs_manager.dart';
import 'package:meshcore_open/storage/contact_store.dart';
import 'package:meshcore_open/storage/message_store.dart';
import 'package:meshcore_open/storage/channel_message_store.dart';
import 'package:meshcore_open/storage/contact_discovery_store.dart';
import 'package:meshcore_open/services/app_settings_service.dart';
import 'package:meshcore_open/storage/prefs_manager.dart';
import 'package:meshcore_open/storage/message_store.dart';
import 'package:shared_preferences/shared_preferences.dart';
// Builds a valid contact frame with the given pathLen and optional overrides.
// Frame layout: [respCode(1)][pubKey(32)][type(1)][flags(1)][pathLen(1)][path(64)][name(32)][timestamp(4)][lat(4)][lon(4)]
@@ -51,6 +52,7 @@ Uint8List _buildChannelMessageFrameV3({
required bool hasPath,
int channelIndex = 7,
String senderName = 'Alice',
String text = 'Hello world',
int txtType = txtTypePlain,
}) {
@@ -77,6 +79,14 @@ Uint8List _buildChannelMessageFrameV3({
}
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
setUp(() async {
SharedPreferences.setMockInitialValues({});
PrefsManager.reset();
await PrefsManager.initialize();
});
group('ChannelMessage.fromFrame — V3 packed path decoding', () {
test(
'hasPath reads width, hop count, path bytes, and txtType correctly',
@@ -467,11 +477,6 @@ void main() {
});
group('Storage migration — multi-byte paths compatibility', () {
setUp(() async {
SharedPreferences.setMockInitialValues({});
await PrefsManager.initialize();
});
test(
'ContactStore decodes and migrates legacy mode-encoded paths',
() async {
@@ -638,5 +643,46 @@ void main() {
expect(contacts.first.path, equals(Uint8List.fromList([0x11, 0x22])));
},
);
});
group('AppSettingsService — gps interval fallback', () {
test('resolvedGpsIntervalSeconds prefers device custom var', () {
final service = AppSettingsService();
expect(
service.resolvedGpsIntervalSeconds(const {'gps_interval': '120'}),
equals(120),
);
});
test('resolvedGpsIntervalSeconds falls back to stored value', () async {
final service = AppSettingsService();
await service.updateSettings(AppSettings(gpsIntervalSeconds: 900));
expect(service.resolvedGpsIntervalSeconds(null), equals(900));
expect(
service.resolvedGpsIntervalSeconds(const {'gps_interval': 'bad'}),
equals(900),
);
});
test('resolvedGpsIntervalSeconds keeps an explicit device zero', () async {
final service = AppSettingsService();
await service.updateSettings(AppSettings(gpsIntervalSeconds: 900));
expect(
service.resolvedGpsIntervalSeconds(const {'gps_interval': '0'}),
equals(0),
);
});
test('toJson/fromJson preserves gpsIntervalSeconds', () {
final settings = AppSettings(gpsIntervalSeconds: 321);
final restored = AppSettings.fromJson(settings.toJson());
expect(restored.gpsIntervalSeconds, equals(321));
});
});
}