[Ermine] Improved unit tests for memory quickui service

Test: run 'fx run-host-tests ermine_settings_unittests'
Progress: fxb/39966

Change-Id: I142da2900b44d6d29ea1edffd74172f8e25875d3
diff --git a/session_shells/ermine/settings/test/memory_test.dart b/session_shells/ermine/settings/test/memory_test.dart
index 750869e..1ec38c1 100644
--- a/session_shells/ermine/settings/test/memory_test.dart
+++ b/session_shells/ermine/settings/test/memory_test.dart
@@ -16,11 +16,16 @@
     mem.WatcherBinding binding = MockBinding();
     Memory memory = Memory(monitor: monitorProxy, binding: binding);
 
-    memory.model.updateMem(_buildStats(0.5));
+    final mem.Watcher watcher =
+        verify(binding.wrap(captureAny)).captured.single;
+    await watcher.onChange(_buildStats(0.5));
+
+    // Should receive memory spec
     Spec spec = await memory.getSpec();
     expect(spec.groups.first.title, isNotNull);
     expect(spec.groups.first.values.isEmpty, false);
 
+    // Confirm progress value is correct
     ProgressValue progress = spec.groups.first.values
         .where((v) => v.$tag == ValueTag.progress)
         .first
@@ -30,13 +35,55 @@
     expect(progress?.value, lessThan(1));
     expect(progress.value, 0.5);
 
+    // Confirm text value is correct
+    TextValue text = spec.groups.first.values
+        .where((v) => v.$tag == ValueTag.text)
+        .first
+        ?.text;
+    expect(text?.text, '0.500GB / 1.00GB');
+
+    memory.dispose();
+  });
+
+  test('Change Memory', () async {
+    mem.MonitorProxy monitorProxy = MockMonitorProxy();
+    mem.WatcherBinding binding = MockBinding();
+    Memory memory = Memory(monitor: monitorProxy, binding: binding);
+
+    final mem.Watcher watcher =
+        verify(binding.wrap(captureAny)).captured.single;
+    await watcher.onChange(_buildStats(0.5));
+
+    // Should receive memory spec
+    Spec spec = await memory.getSpec();
+    expect(spec.groups.first.title, isNotNull);
+    expect(spec.groups.first.values.isEmpty, false);
+
+    // Confirm progress value is correct
+    ProgressValue progress = spec.groups.first.values
+        .where((v) => v.$tag == ValueTag.progress)
+        .first
+        ?.progress;
+    expect(progress, isNotNull);
+    expect(progress?.value, greaterThan(0));
+    expect(progress?.value, lessThan(1));
+    expect(progress.value, 0.5);
+
+    // Confirm text value is correct
+    TextValue text = spec.groups.first.values
+        .where((v) => v.$tag == ValueTag.text)
+        .first
+        ?.text;
+    expect(text?.text, '0.500GB / 1.00GB');
+
     // Update memory usage.
-    memory.model.updateMem(_buildStats(0.7));
+    await watcher.onChange(_buildStats(0.7));
 
     spec = await memory.getSpec();
     expect(spec.groups.first.title, isNotNull);
     expect(spec.groups.first.values.isEmpty, false);
 
+    // Confirm progress value is correct
     progress = spec.groups.first.values
         .where((v) => v.$tag == ValueTag.progress)
         .first
@@ -46,17 +93,90 @@
     expect(progress?.value, lessThan(1));
     expect(progress.value, moreOrLessEquals(0.3, epsilon: 1e-5));
 
+    // Confirm text value is correct
+    text = spec.groups.first.values
+        .where((v) => v.$tag == ValueTag.text)
+        .first
+        ?.text;
+    expect(text?.text, '0.300GB / 1.00GB');
+
+    memory.dispose();
+  });
+
+  test('Min Memory', () async {
+    mem.MonitorProxy monitorProxy = MockMonitorProxy();
+    mem.WatcherBinding binding = MockBinding();
+    Memory memory = Memory(monitor: monitorProxy, binding: binding);
+
+    final mem.Watcher watcher =
+        verify(binding.wrap(captureAny)).captured.single;
+    await watcher.onChange(_buildStats(1));
+
+    // Should receive memory spec
+    Spec spec = await memory.getSpec();
+    expect(spec.groups.first.title, isNotNull);
+    expect(spec.groups.first.values.isEmpty, false);
+
+    // Confirm progress value is correct
+    ProgressValue progress = spec.groups.first.values
+        .where((v) => v.$tag == ValueTag.progress)
+        .first
+        ?.progress;
+    expect(progress, isNotNull);
+    expect(progress?.value, lessThan(1));
+    expect(progress.value, 0);
+
+    // Confirm text value is correct
+    TextValue text = spec.groups.first.values
+        .where((v) => v.$tag == ValueTag.text)
+        .first
+        ?.text;
+    expect(text?.text, '0.00GB / 1.00GB');
+
+    memory.dispose();
+  });
+
+  test('Max Memory', () async {
+    mem.MonitorProxy monitorProxy = MockMonitorProxy();
+    mem.WatcherBinding binding = MockBinding();
+    Memory memory = Memory(monitor: monitorProxy, binding: binding);
+
+    final mem.Watcher watcher =
+        verify(binding.wrap(captureAny)).captured.single;
+    await watcher.onChange(_buildStats(0));
+
+    // Should receive memory spec
+    Spec spec = await memory.getSpec();
+    expect(spec.groups.first.title, isNotNull);
+    expect(spec.groups.first.values.isEmpty, false);
+
+    // Confirm progress value is correct
+    ProgressValue progress = spec.groups.first.values
+        .where((v) => v.$tag == ValueTag.progress)
+        .first
+        ?.progress;
+    expect(progress, isNotNull);
+    expect(progress?.value, greaterThan(0));
+    expect(progress.value, 1);
+
+    // Confirm text value is correct
+    TextValue text = spec.groups.first.values
+        .where((v) => v.$tag == ValueTag.text)
+        .first
+        ?.text;
+    expect(text?.text, '1.00GB / 1.00GB');
+
     memory.dispose();
   });
 }
 
 int get gB => pow(1024, 3);
 
-mem.Stats _buildStats(double used) {
+mem.Stats _buildStats(double bytes) {
   // ignore: missing_required_param, missing_required_param_with_details
   return mem.Stats(
     totalBytes: 1 * gB,
-    freeBytes: (used * gB).toInt(),
+    freeBytes: (bytes * gB).toInt(),
   );
 }