// Copyright Keysight Technologies 2012-2019 // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, you can obtain one at http://mozilla.org/MPL/2.0/. using System; using System.Text; namespace OpenTap { /// /// Utility class to help print an "ASCII-art" graph with limits in the log files and windows. /// public class TraceBar { /// /// Gets or sets the lower limit which is also used to determine the range of the graph. /// public double LowerLimit { get; set; } /// /// Gets or sets the upper limit which is also used to determine the range of the graph. /// public double UpperLimit { get; set; } /// /// Gets or sets a Boolean value indicating whether the result will be printed as a number /// next to the bar. /// public bool ShowResult { get; set; } /// /// Gets or sets a Boolean value indicating whether the verdict (pass/fail) will be shown /// next to the bar. /// public bool ShowVerdict { get; set; } /// /// Gets or sets the length of the bar in characters. /// public byte BarLength { get; set; } /// /// Combined verdict for all times GetBar has been called. /// public Verdict CombinedVerdict { get; private set; } /// /// Returns a string containing a "tracebar" ready to be printed in the log. /// /// The value to visualize in a TraceBar. /// A string containing a "tracebar" ready to be printed in the log. public string GetBar(double result) { byte stringLength = BarLength; double width = (LowerLimit - UpperLimit); double stepSize = Math.Abs(width / stringLength); bool passed = result <= UpperLimit && result >= LowerLimit; Verdict verdict = passed ? Verdict.Pass : Verdict.Fail; if (double.IsNaN(result)) verdict = Verdict.Inconclusive; if (verdict > CombinedVerdict) CombinedVerdict = verdict; StringBuilder bar; if (ShowResult) { bar = new StringBuilder(); bar.AppendFormat("{0,12:G6} ", result); } else bar = new StringBuilder(stringLength + 20); bar.AppendFormat("{0,6} ", LowerLimit); for (byte count = 0; count <= stringLength; count++) { if (count == 0 & result < LowerLimit) { bar.Append('<'); } else if (count == stringLength & result > UpperLimit) { bar.Append('>'); break; } else if ((result >= (count * stepSize + LowerLimit)) && (result < ((count + 1) * stepSize + LowerLimit))) { bar.Append('|'); } else bar.Append('-'); } bar.AppendFormat(" {0,6}", UpperLimit); if (ShowVerdict) { if (!passed) { bar.Append(" " + verdict.ToString()); } } return bar.ToString(); } /// /// Initializes a new instance of the TraceBar class. /// public TraceBar() { BarLength = 30; LowerLimit = -100; UpperLimit = 100; ShowResult = true; ShowVerdict = true; CombinedVerdict = OpenTap.Verdict.NotSet; } } }