[Ermine] Added unit tests for visualizer widgets

Change-Id: I0b42a7ca1656dc3ee281dbe00650ab83d92ae7f9
diff --git a/session_shells/ermine/BUILD.gn b/session_shells/ermine/BUILD.gn
index 26e7042..d0f37a4 100644
--- a/session_shells/ermine/BUILD.gn
+++ b/session_shells/ermine/BUILD.gn
@@ -165,8 +165,11 @@
 flutter_test("visualizers_unittests") {
   sources = [
     "status_graph_visualizer_model_test.dart",
+    "status_graph_visualizer_test.dart",
     "status_progress_bar_visualizer_model_test.dart",
+    "status_progress_bar_visualizer_test.dart",
     "status_tick_bar_visualizer_model_test.dart",
+    "status_tick_bar_visualizer_test.dart",
   ]
 
   deps = [
diff --git a/session_shells/ermine/test/status_graph_visualizer_test.dart b/session_shells/ermine/test/status_graph_visualizer_test.dart
new file mode 100644
index 0000000..c64ff20
--- /dev/null
+++ b/session_shells/ermine/test/status_graph_visualizer_test.dart
@@ -0,0 +1,102 @@
+// Copyright 2019 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// ignore_for_file: implementation_imports
+
+import 'dart:math';
+import 'package:flutter/material.dart';
+
+import 'package:ermine_library/src/widgets/status_graph_visualizer.dart';
+import 'package:test/test.dart';
+
+void main() {
+  StatusGraphVisualizer testGraph;
+  StatusGraphVisualizer testGraphCustom;
+  MainAxisAlignment testAlign;
+  TextStyle testTextStyle;
+  Paint testPaint;
+
+  setUp(() async {
+    testAlign = MainAxisAlignment.spaceBetween;
+    testTextStyle = TextStyle();
+    testPaint = Paint();
+    testGraph = StatusGraphVisualizer(
+      model: StatusGraphVisualizerModel(),
+      axisAlignment: testAlign,
+      textStyle: testTextStyle,
+      drawStyle: testPaint,
+    );
+    testGraphCustom = StatusGraphVisualizer(
+      model: StatusGraphVisualizerModel(),
+      axisAlignment: testAlign,
+      textStyle: testTextStyle,
+      drawStyle: testPaint,
+    );
+  });
+
+  test('test to confirm StatusGraphVisualizer constructs via default model',
+      () {
+    expect(testGraph.model.graphValue, 'loading...');
+    expect(
+        testGraph.model.graphData, lessThanOrEqualTo(testGraph.model.graphMax));
+    expect(testGraph.model.graphData,
+        greaterThanOrEqualTo(testGraph.model.graphMin));
+    expect(testGraph.model.graphData, greaterThanOrEqualTo(0));
+    expect(testGraph.model.graphHeight, greaterThan(0));
+    expect(testGraph.model.graphWidth, greaterThan(0));
+    expect(testGraph.model.graphMin, greaterThanOrEqualTo(0));
+    expect(testGraph.model.graphMin, lessThan(testGraph.model.graphMax));
+    expect(testGraph.model.graphMax, greaterThanOrEqualTo(0));
+    expect(testGraph.model.graphMax, greaterThan(testGraph.model.graphMin));
+    expect(testGraph.model.graphFirst, isNotNull);
+    expect(testGraph.model.borderActive, isNotNull);
+    expect(testGraph.model.fillActive, isNotNull);
+  });
+
+  test(
+      'test to confirm StatusGraphVisualizer graphValue is set correctly via model changes',
+      () {
+    // Confirm default graphValue construction values are equal.
+    expect(testGraph.model.graphValue, testGraphCustom.model.graphValue);
+    // Change graphValue within custom graph (which reflects in animation).
+    String testCustomGraphValue = 'test';
+    testGraphCustom.model.graphValue = testCustomGraphValue;
+    // Confirm graphValue updated correctly & custom model has changed from default.
+    expect(testGraphCustom.model.graphValue, testCustomGraphValue);
+    expect(testGraph.model.graphValue, isNot(testGraphCustom.model.graphValue));
+    // Change graphValue value again to confirm continuous animation updates possible.
+    testCustomGraphValue = 'test2';
+    testGraphCustom.model.graphValue = testCustomGraphValue;
+    // Confirm graphValue updated correctly again & custom model has changed from default.
+    expect(testGraphCustom.model.graphValue, testCustomGraphValue);
+    expect(testGraph.model.graphValue, isNot(testGraphCustom.model.graphValue));
+  });
+
+  test(
+      'test to confirm StatusGraphVisualizer graphData is set correctly via model changes',
+      () {
+    // Confirm default graphData construction values are equal.
+    expect(testGraph.model.graphData, testGraphCustom.model.graphData);
+    // Change graphData within custom graph (which reflects in animation).
+    double testRandomGraphData = Random().nextDouble() * 100;
+    testGraphCustom.model.graphData = testRandomGraphData;
+    // Confirm graphData updated correctly & custom model has changed from default.
+    expect(testGraphCustom.model.graphData, testRandomGraphData);
+    expect(testGraph.model.graphData, isNot(testGraphCustom.model.graphData));
+    // Change graphData value again to confirm continuous animation updates possible.
+    testRandomGraphData = Random().nextDouble() * 100;
+    testGraphCustom.model.graphData = testRandomGraphData;
+    // Confirm graphData updated correctly again & custom model has changed from default.
+    expect(testGraphCustom.model.graphData, testRandomGraphData);
+    expect(testGraph.model.graphData, isNot(testGraphCustom.model.graphData));
+  });
+
+  tearDown(() async {
+    testGraph = null;
+    testGraphCustom = null;
+    testAlign = null;
+    testTextStyle = null;
+    testPaint = null;
+  });
+}
diff --git a/session_shells/ermine/test/status_progress_bar_visualizer_test.dart b/session_shells/ermine/test/status_progress_bar_visualizer_test.dart
new file mode 100644
index 0000000..4c8d26e
--- /dev/null
+++ b/session_shells/ermine/test/status_progress_bar_visualizer_test.dart
@@ -0,0 +1,120 @@
+// Copyright 2019 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// ignore_for_file: implementation_imports
+
+import 'dart:math';
+import 'package:flutter/material.dart';
+
+import 'package:ermine_library/src/widgets/status_progress_bar_visualizer.dart';
+import 'package:test/test.dart';
+
+void main() {
+  StatusProgressBarVisualizer testProgressBar;
+  StatusProgressBarVisualizer testProgressBarCustom;
+  TextAlign testTextAlign;
+  TextStyle testTextStyle;
+
+  setUp(() async {
+    testTextAlign = TextAlign.right;
+    testTextStyle = TextStyle();
+    testProgressBar = StatusProgressBarVisualizer(
+      model: StatusProgressBarVisualizerModel(),
+      textAlignment: testTextAlign,
+      textStyle: testTextStyle,
+    );
+    testProgressBarCustom = StatusProgressBarVisualizer(
+      model: StatusProgressBarVisualizerModel(),
+      textAlignment: testTextAlign,
+      textStyle: testTextStyle,
+    );
+  });
+
+  test(
+      'test to confirm StatusProgressBarVisualizer constructs via default model',
+      () {
+    expect(testProgressBar.model.barValue, 'loading...');
+    expect(testProgressBar.model.barSize, inInclusiveRange(0, 1));
+    expect(testProgressBar.model.barMax, greaterThan(0));
+    expect(testProgressBar.model.barMax,
+        greaterThanOrEqualTo(testProgressBar.model.barFill));
+    expect(testProgressBar.model.barFill, greaterThanOrEqualTo(0));
+    expect(testProgressBar.model.barFill,
+        lessThanOrEqualTo(testProgressBar.model.barMax));
+    expect(testProgressBar.model.offset, greaterThanOrEqualTo(0));
+    expect(testProgressBar.model.barHeight, greaterThanOrEqualTo(0));
+    expect(testProgressBar.model.barFirst, isNotNull);
+  });
+
+  test(
+      'test to confirm StatusProgressBarVisualizer barValue is set correctly via model changes',
+      () {
+    // Confirm default barValue construction values are equal.
+    expect(
+        testProgressBar.model.barValue, testProgressBarCustom.model.barValue);
+    // Change barValue within custom progress bar (which reflects in animation).
+    String testCustomBarValue = 'test';
+    testProgressBarCustom.model.barValue = testCustomBarValue;
+    // Confirm barValue updated correctly & custom model has changed from default.
+    expect(testProgressBarCustom.model.barValue, testCustomBarValue);
+    expect(testProgressBar.model.barValue,
+        isNot(testProgressBarCustom.model.barValue));
+    // Change barValue value again to confirm continuous animation updates possible.
+    testCustomBarValue = 'test2';
+    testProgressBarCustom.model.barValue = testCustomBarValue;
+    // Confirm barValue updated correctly again & custom model has changed from default.
+    expect(testProgressBarCustom.model.barValue, testCustomBarValue);
+    expect(testProgressBar.model.barValue,
+        isNot(testProgressBarCustom.model.barValue));
+  });
+
+  test(
+      'test to confirm StatusProgressBarVisualizer barFill is set correctly via model changes',
+      () {
+    // Confirm default barFill construction values are equal.
+    expect(testProgressBar.model.barFill, testProgressBarCustom.model.barFill);
+    // Change barFill within custom progress bar (which reflects in animation).
+    double testRandomBarFill = Random().nextDouble() * 100;
+    testProgressBarCustom.model.barFill = testRandomBarFill;
+    // Confirm barFill updated correctly & custom model has changed from default.
+    expect(testProgressBarCustom.model.barFill, testRandomBarFill);
+    expect(testProgressBar.model.barFill,
+        isNot(testProgressBarCustom.model.barFill));
+    // Change barFill value again to confirm continuous animation updates possible.
+    testRandomBarFill = Random().nextDouble() * 100;
+    testProgressBarCustom.model.barFill = testRandomBarFill;
+    // Confirm barFill updated correctly again & custom model has changed from default.
+    expect(testProgressBarCustom.model.barFill, testRandomBarFill);
+    expect(testProgressBar.model.barFill,
+        isNot(testProgressBarCustom.model.barFill));
+  });
+
+  test(
+      'test to confirm StatusProgressBarVisualizer barMax is set correctly via model changes',
+      () {
+    // Confirm default barMax construction values are equal.
+    expect(testProgressBar.model.barMax, testProgressBarCustom.model.barMax);
+    // Change barMax within custom progress bar (which reflects in animation).
+    double testRandomBarMax = Random().nextDouble() * 100;
+    testProgressBarCustom.model.barMax = testRandomBarMax;
+    // Confirm barMax updated correctly & custom model has changed from default.
+    expect(testProgressBarCustom.model.barMax, testRandomBarMax);
+    expect(testProgressBar.model.barMax,
+        isNot(testProgressBarCustom.model.barMax));
+    // Change barMax value again to confirm continuous animation updates possible.
+    testRandomBarMax = Random().nextDouble() * 100;
+    testProgressBarCustom.model.barMax = testRandomBarMax;
+    // Confirm barMax updated correctly again & custom model has changed from default.
+    expect(testProgressBarCustom.model.barMax, testRandomBarMax);
+    expect(testProgressBar.model.barMax,
+        isNot(testProgressBarCustom.model.barMax));
+  });
+
+  tearDown(() async {
+    testProgressBar = null;
+    testProgressBarCustom = null;
+    testTextAlign = null;
+    testTextStyle = null;
+  });
+}
diff --git a/session_shells/ermine/test/status_tick_bar_visualizer_test.dart b/session_shells/ermine/test/status_tick_bar_visualizer_test.dart
new file mode 100644
index 0000000..39d2692
--- /dev/null
+++ b/session_shells/ermine/test/status_tick_bar_visualizer_test.dart
@@ -0,0 +1,110 @@
+// Copyright 2019 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// ignore_for_file: implementation_imports
+
+import 'dart:math';
+import 'package:flutter/material.dart';
+
+import 'package:ermine_library/src/widgets/status_tick_bar_visualizer.dart';
+import 'package:test/test.dart';
+
+void main() {
+  StatusTickBarVisualizer testTickBar;
+  StatusTickBarVisualizer testTickBarCustom;
+  TextAlign testTextAlign;
+  TextStyle testTextStyle;
+
+  setUp(() async {
+    testTextAlign = TextAlign.right;
+    testTextStyle = TextStyle();
+    testTickBar = StatusTickBarVisualizer(
+      model: StatusTickBarVisualizerModel(),
+      textAlignment: testTextAlign,
+      textStyle: testTextStyle,
+    );
+    testTickBarCustom = StatusTickBarVisualizer(
+      model: StatusTickBarVisualizerModel(),
+      textAlignment: testTextAlign,
+      textStyle: testTextStyle,
+    );
+  });
+
+  test('test to confirm StatusTickBarVisualizer constructs via default model',
+      () {
+    expect(testTickBar.model.barValue, 'loading...');
+    expect(testTickBar.model.barFill, greaterThanOrEqualTo(0));
+    expect(
+        testTickBar.model.barFill, lessThanOrEqualTo(testTickBar.model.barMax));
+    expect(testTickBar.model.barMax, greaterThanOrEqualTo(0));
+    expect(testTickBar.model.barMax,
+        greaterThanOrEqualTo(testTickBar.model.barFill));
+    expect(testTickBar.model.tickMax, greaterThan(0));
+    expect(testTickBar.model.barFirst, isNotNull);
+  });
+
+  test(
+      'test to confirm StatusTickBarVisualizer barValue is set correctly via model changes',
+      () {
+    // Confirm default barValue construction values are equal.
+    expect(testTickBar.model.barValue, testTickBarCustom.model.barValue);
+    // Change barValue within custom tick bar (which reflects in animation).
+    String testCustomBarValue = 'test';
+    testTickBarCustom.model.barValue = testCustomBarValue;
+    // Confirm barValue updated correctly & custom model has changed from default.
+    expect(testTickBarCustom.model.barValue, testCustomBarValue);
+    expect(testTickBar.model.barValue, isNot(testTickBarCustom.model.barValue));
+    // Change barValue value again to confirm continuous animation updates possible.
+    testCustomBarValue = 'test2';
+    testTickBarCustom.model.barValue = testCustomBarValue;
+    // Confirm barValue updated correctly again & custom model has changed from default.
+    expect(testTickBarCustom.model.barValue, testCustomBarValue);
+    expect(testTickBar.model.barValue, isNot(testTickBarCustom.model.barValue));
+  });
+
+  test(
+      'test to confirm StatusTickBarVisualizer barFill is set correctly via model changes',
+      () {
+    // Confirm default barFill construction values are equal.
+    expect(testTickBar.model.barFill, testTickBarCustom.model.barFill);
+    // Change barFill within custom tick bar (which reflects in animation).
+    double testRandomBarFill = Random().nextDouble() * 100;
+    testTickBarCustom.model.barFill = testRandomBarFill;
+    // Confirm barFill updated correctly & custom model has changed from default.
+    expect(testTickBarCustom.model.barFill, testRandomBarFill);
+    expect(testTickBar.model.barFill, isNot(testTickBarCustom.model.barFill));
+    // Change barFill value again to confirm continuous animation updates possible.
+    testRandomBarFill = Random().nextDouble() * 100;
+    testTickBarCustom.model.barFill = testRandomBarFill;
+    // Confirm barFill updated correctly again & custom model has changed from default.
+    expect(testTickBarCustom.model.barFill, testRandomBarFill);
+    expect(testTickBar.model.barFill, isNot(testTickBarCustom.model.barFill));
+  });
+
+  test(
+      'test to confirm StatusTickBarVisualizer barMax is set correctly via model changes',
+      () {
+    // Confirm default barMax construction values are equal.
+    expect(testTickBar.model.barMax, testTickBarCustom.model.barMax);
+    // Change barMax within custom tick bar (which reflects in animation).
+    double testRandomBarMax = Random().nextDouble() * 100;
+    testTickBarCustom.model.barMax = testRandomBarMax;
+    // Confirm barMax updated correctly & custom model has changed from default.
+    expect(testTickBarCustom.model.barMax, testRandomBarMax);
+    expect(testTickBar.model.barMax, isNot(testTickBarCustom.model.barMax));
+    // Change barMax value again to confirm continuous animation updates possible.
+    testRandomBarMax = Random().nextDouble() * 100;
+    testTickBarCustom.model.barMax = testRandomBarMax;
+    // Confirm barMax updated correctly again & custom model has changed from default.
+    expect(testTickBarCustom.model.barMax, testRandomBarMax);
+    expect(testTickBar.model.barMax, isNot(testTickBarCustom.model.barMax));
+  });
+
+  tearDown(() async {
+    testTickBar = null;
+    testTickBarCustom = null;
+    testTextAlign = null;
+    testTextStyle = null;
+  });
+}