Browse Source

Fixes #546. Enhancement ProgressBar. (#1379)

* Fixes #546. Enhancement ProgressBar.

* Allows set the Text only on Marquee style.
BDisp 4 years ago
parent
commit
e2d53d2d92

+ 4 - 4
Terminal.Gui/Core/ConsoleDriver.cs

@@ -1155,14 +1155,14 @@ namespace Terminal.Gui {
 		public Rune RightBracket = ']';
 
 		/// <summary>
-		/// On Segment indicator for meter views (e.g. <see cref="ProgressBar"/>.
+		/// Blocks Segment indicator for meter views (e.g. <see cref="ProgressBar"/>.
 		/// </summary>
-		public Rune OnMeterSegment = '\u258c';
+		public Rune BlocksMeterSegment = '\u258c';
 
 		/// <summary>
-		/// Off Segment indicator for meter views (e.g. <see cref="ProgressBar"/>.
+		/// Continuous Segment indicator for meter views (e.g. <see cref="ProgressBar"/>.
 		/// </summary>
-		public Rune OffMeterSegement = ' ';
+		public Rune ContinuousMeterSegment = '\u2588';
 
 		/// <summary>
 		/// Make the attribute for the foreground and background colors.

+ 270 - 24
Terminal.Gui/Views/ProgressBar.cs

@@ -1,5 +1,54 @@
-using System;
+using NStack;
+using System;
 namespace Terminal.Gui {
+	/// <summary>
+	/// Specifies the style that a <see cref="ProgressBar"/> uses to indicate the progress of an operation.
+	/// </summary>
+	public enum ProgressBarStyle {
+		/// <summary>
+		/// Indicates progress by increasing the number of segmented blocks in a <see cref="ProgressBar"/>.
+		/// </summary>
+		Blocks,
+		/// <summary>
+		/// Indicates progress by increasing the size of a smooth, continuous bar in a <see cref="ProgressBar"/>.
+		/// </summary>
+		Continuous,
+		/// <summary>
+		/// Indicates progress by continuously scrolling a block across a <see cref="ProgressBar"/> in a marquee fashion.
+		/// </summary>
+		MarqueeBlocks,
+		/// <summary>
+		/// Indicates progress by continuously scrolling a block across a <see cref="ProgressBar"/> in a marquee fashion.
+		/// </summary>
+		MarqueeContinuous
+
+	}
+
+	/// <summary>
+	///Specifies the format that a <see cref="ProgressBar"/> uses to indicate the visual presentation.
+	/// </summary>
+	public enum ProgressBarFormat {
+		/// <summary>
+		/// A simple visual presentation showing only the progress bar.
+		/// </summary>
+		Simple,
+		/// <summary>
+		/// A simple visual presentation showing the progress bar and the percentage.
+		/// </summary>
+		SimplePlusPercentage,
+		/// <summary>
+		/// A framed visual presentation showing only the progress bar.
+		/// </summary>
+		Framed,
+		/// <summary>
+		/// A framed visual presentation showing the progress bar and the percentage.
+		/// </summary>
+		FramedPlusPercentage,
+		/// <summary>
+		/// A framed visual presentation showing all with the progress bar padded.
+		/// </summary>
+		FramedProgressPadded
+	}
 
 	/// <summary>
 	/// A Progress Bar view that can indicate progress of an activity visually.
@@ -16,7 +65,8 @@ namespace Terminal.Gui {
 	/// </remarks>
 	public class ProgressBar : View {
 		bool isActivity;
-		int activityPos, delta;
+		int [] activityPos;
+		int delta, padding;
 
 		/// <summary>
 		/// Initializes a new instance of the <see cref="ProgressBar"/> class, starts in percentage mode with an absolute position and size.
@@ -24,17 +74,28 @@ namespace Terminal.Gui {
 		/// <param name="rect">Rect.</param>
 		public ProgressBar (Rect rect) : base (rect)
 		{
-			CanFocus = false;
-			fraction = 0;
+			Initialize (rect);
 		}
 
 		/// <summary>
 		/// Initializes a new instance of the <see cref="ProgressBar"/> class, starts in percentage mode and uses relative layout.
 		/// </summary>
 		public ProgressBar () : base ()
+		{
+			Initialize (Rect.Empty);
+		}
+
+		void Initialize (Rect rect)
 		{
 			CanFocus = false;
 			fraction = 0;
+			ColorScheme = new ColorScheme () {
+				Normal = Application.Driver.MakeAttribute (Color.BrightGreen, Color.Gray),
+				HotNormal = Colors.Base.Normal
+			};
+			if (rect.IsEmpty) {
+				Height = 1;
+			}
 		}
 
 		float fraction;
@@ -46,32 +107,147 @@ namespace Terminal.Gui {
 		public float Fraction {
 			get => fraction;
 			set {
-				fraction = value;
+				fraction = Math.Min (value, 1);
 				isActivity = false;
 				SetNeedsDisplay ();
 			}
 		}
 
+		ProgressBarStyle progressBarStyle;
+
+		/// <summary>
+		/// Gets/Sets the progress bar style based on the <see cref="Terminal.Gui.ProgressBarStyle"/>
+		/// </summary>
+		public ProgressBarStyle ProgressBarStyle {
+			get => progressBarStyle;
+			set {
+				progressBarStyle = value;
+				switch (value) {
+				case ProgressBarStyle.Blocks:
+					SegmentCharacter = Driver.BlocksMeterSegment;
+					break;
+				case ProgressBarStyle.Continuous:
+					SegmentCharacter = Driver.ContinuousMeterSegment;
+					break;
+				case ProgressBarStyle.MarqueeBlocks:
+					SegmentCharacter = Driver.BlocksMeterSegment;
+					break;
+				case ProgressBarStyle.MarqueeContinuous:
+					SegmentCharacter = Driver.ContinuousMeterSegment;
+					break;
+				}
+				SetNeedsDisplay ();
+			}
+		}
+
+		private ProgressBarFormat progressBarFormat;
+
+		/// <summary>
+		/// Specifies the format that a <see cref="ProgressBar"/> uses to indicate the visual presentation.
+		/// </summary>
+		public ProgressBarFormat ProgressBarFormat {
+			get => progressBarFormat;
+			set {
+				progressBarFormat = value;
+				switch (progressBarFormat) {
+				case ProgressBarFormat.Simple:
+					Height = 1;
+					break;
+				case ProgressBarFormat.SimplePlusPercentage:
+					Height = 2;
+					break;
+				case ProgressBarFormat.Framed:
+					Height = 3;
+					break;
+				case ProgressBarFormat.FramedPlusPercentage:
+					Height = 4;
+					break;
+				case ProgressBarFormat.FramedProgressPadded:
+					Height = 6;
+					break;
+				}
+				SetNeedsDisplay ();
+			}
+		}
+
+		private Rune segmentCharacter = Driver.BlocksMeterSegment;
+
+		/// <summary>
+		/// Segment indicator for meter views.
+		/// </summary>
+		public Rune SegmentCharacter {
+			get => segmentCharacter;
+			set {
+				segmentCharacter = value;
+				SetNeedsDisplay ();
+			}
+		}
+
+		///<inheritdoc/>
+		public override ustring Text {
+			get => GetPercentageText ();
+			set {
+				base.Text = SetPercentageText (value);
+			}
+		}
+
+		ustring GetPercentageText ()
+		{
+			switch (progressBarStyle) {
+			case ProgressBarStyle.Blocks:
+			case ProgressBarStyle.Continuous:
+				return $"{fraction * 100:F0}%";
+			case ProgressBarStyle.MarqueeBlocks:
+			case ProgressBarStyle.MarqueeContinuous:
+				break;
+			}
+
+			return base.Text;
+		}
+
+		ustring SetPercentageText (ustring value)
+		{
+			switch (progressBarStyle) {
+			case ProgressBarStyle.Blocks:
+			case ProgressBarStyle.Continuous:
+				return $"{fraction * 100:F0}%";
+			case ProgressBarStyle.MarqueeBlocks:
+			case ProgressBarStyle.MarqueeContinuous:
+				break;
+			}
+
+			return value;
+		}
+
 		/// <summary>
 		/// Notifies the <see cref="ProgressBar"/> that some progress has taken place.
 		/// </summary>
 		/// <remarks>
-		/// If the <see cref="ProgressBar"/> is is percentage mode, it switches to activity
-		/// mode.   If is in activity mode, the marker is moved.
+		/// If the <see cref="ProgressBar"/> is percentage mode, it switches to activity
+		/// mode. If is in activity mode, the marker is moved.
 		/// </remarks>
 		public void Pulse ()
 		{
+			if (activityPos == null) {
+				PopulateActivityPos ();
+			}
 			if (!isActivity) {
 				isActivity = true;
-				activityPos = 0;
 				delta = 1;
 			} else {
-				activityPos += delta;
-				if (activityPos < 0) {
-					activityPos = 1;
+				for (int i = 0; i < activityPos.Length; i++) {
+					activityPos [i] += delta;
+				}
+				int fWidth = GetFrameWidth ();
+				if (activityPos [activityPos.Length - 1] < 0) {
+					for (int i = 0; i < activityPos.Length; i++) {
+						activityPos [i] = i - activityPos.Length + 2;
+					}
 					delta = 1;
-				} else if (activityPos >= Frame.Width) {
-					activityPos = Frame.Width - 2;
+				} else if (activityPos [0] >= fWidth) {
+					for (int i = 0; i < activityPos.Length; i++) {
+						activityPos [i] = fWidth + i - 2;
+					}
 					delta = -1;
 				}
 			}
@@ -80,27 +256,97 @@ namespace Terminal.Gui {
 		}
 
 		///<inheritdoc/>
-		public override void Redraw(Rect region)
+		public override void Redraw (Rect region)
 		{
+			DrawFrame ();
+
 			Driver.SetAttribute (ColorScheme.Normal);
 
-			int top = Frame.Width;
+			int fWidth = GetFrameWidth ();
 			if (isActivity) {
-				Move (0, 0);
-				for (int i = 0; i < top; i++)
-					if (i == activityPos)
-						Driver.AddRune (Driver.Stipple);
+				Move (padding, padding);
+				for (int i = 0; i < fWidth; i++)
+					if (Array.IndexOf (activityPos, i) != -1)
+						Driver.AddRune (SegmentCharacter);
 					else
 						Driver.AddRune (' ');
 			} else {
-				Move (0, 0);
-				int mid = (int)(fraction * top);
+				Move (padding, padding);
+				int mid = (int)(fraction * fWidth);
 				int i;
-				for (i = 0; i < mid; i++)
-					Driver.AddRune (Driver.Stipple);
-				for (; i < top; i++)
+				for (i = 0; i < mid & i < fWidth; i++)
+					Driver.AddRune (SegmentCharacter);
+				for (; i < fWidth; i++)
 					Driver.AddRune (' ');
 			}
+
+			DrawText (fWidth);
+		}
+
+		int GetFrameWidth ()
+		{
+			switch (progressBarFormat) {
+			case ProgressBarFormat.Simple:
+			case ProgressBarFormat.SimplePlusPercentage:
+				break;
+			case ProgressBarFormat.Framed:
+			case ProgressBarFormat.FramedPlusPercentage:
+				return Frame.Width - 2;
+			case ProgressBarFormat.FramedProgressPadded:
+				return Frame.Width - 2 - padding;
+			}
+
+			return Frame.Width;
+		}
+
+		void DrawText (int fWidth)
+		{
+			switch (progressBarFormat) {
+			case ProgressBarFormat.Simple:
+			case ProgressBarFormat.Framed:
+				break;
+			case ProgressBarFormat.SimplePlusPercentage:
+			case ProgressBarFormat.FramedPlusPercentage:
+			case ProgressBarFormat.FramedProgressPadded:
+				var tf = new TextFormatter () {
+					Alignment = TextAlignment.Centered,
+					Text = Text
+				};
+				var row = padding + (progressBarFormat == ProgressBarFormat.FramedProgressPadded
+					? 2 : 1);
+				Move (padding, row);
+				var rect = new Rect (padding, row, fWidth, Frame.Height);
+				tf?.Draw (ViewToScreen (rect), ColorScheme.HotNormal, ColorScheme.HotNormal);
+				break;
+			}
+		}
+
+		void DrawFrame ()
+		{
+			switch (progressBarFormat) {
+			case ProgressBarFormat.Simple:
+			case ProgressBarFormat.SimplePlusPercentage:
+				padding = 0;
+				break;
+			case ProgressBarFormat.Framed:
+			case ProgressBarFormat.FramedPlusPercentage:
+				padding = 1;
+				Application.Driver.DrawWindowFrame (ViewToScreen (Bounds), padding, padding, padding, padding, true);
+				break;
+			case ProgressBarFormat.FramedProgressPadded:
+				padding = 2;
+				Application.Driver.DrawWindowFrame (ViewToScreen (Bounds), padding, padding, padding, padding + 1, true);
+				Application.Driver.DrawWindowFrame (ViewToScreen (Bounds), padding - 1, padding - 1, padding - 1, padding - 1, true);
+				break;
+			}
+		}
+
+		void PopulateActivityPos ()
+		{
+			activityPos = new int [Math.Min (Frame.Width / 3, 5)];
+			for (int i = 0; i < activityPos.Length; i++) {
+				activityPos [i] = i - activityPos.Length + 1;
+			}
 		}
 
 		///<inheritdoc/>

+ 134 - 0
UICatalog/Scenarios/ProgressBarStyles.cs

@@ -0,0 +1,134 @@
+using System;
+using System.Linq;
+using System.Threading;
+using Terminal.Gui;
+
+namespace UICatalog {
+	[ScenarioMetadata (Name: "ProgressBar Styles", Description: "Shows the ProgressBar Styles")]
+	[ScenarioCategory ("Controls")]
+	[ScenarioCategory ("MainLoop")]
+	class ProgressBarStyles : Scenario {
+		private Timer _fractionTimer;
+		private Timer _pulseTimer;
+		private const uint _timerTick = 100;
+
+		public override void Setup ()
+		{
+			const float fractionStep = 0.01F;
+			const int pbWidth = 20;
+
+			var pbFormatEnum = Enum.GetValues (typeof (ProgressBarFormat)).Cast<ProgressBarFormat> ().ToList ();
+
+			var rbPBFormat = new RadioGroup (pbFormatEnum.Select (e => NStack.ustring.Make (e.ToString ())).ToArray ()) {
+				X = Pos.Center (),
+				Y = 1
+			};
+			Win.Add (rbPBFormat);
+
+			var label = new Label ("Blocks") {
+				X = Pos.Center (),
+				Y = Pos.Bottom (rbPBFormat) + 1
+			};
+			Win.Add (label);
+
+			var blocksPB = new ProgressBar () {
+				X = Pos.Center (),
+				Y = Pos.Y (label) + 1,
+				Width = pbWidth
+			};
+			Win.Add (blocksPB);
+
+			label = new Label ("Continuous") {
+				X = Pos.Center (),
+				Y = Pos.Bottom (blocksPB) + 1
+			};
+			Win.Add (label);
+
+			var continuousPB = new ProgressBar () {
+				X = Pos.Center (),
+				Y = Pos.Y (label) + 1,
+				Width = pbWidth,
+				ProgressBarStyle = ProgressBarStyle.Continuous
+			};
+			Win.Add (continuousPB);
+
+			var button = new Button ("Start timer") {
+				X = Pos.Center (),
+				Y = Pos.Bottom (continuousPB) + 1
+			};
+			button.Clicked += () => {
+				if (_fractionTimer == null) {
+					button.CanFocus = false;
+					blocksPB.Fraction = 0;
+					continuousPB.Fraction = 0;
+					float fractionSum = 0;
+					_fractionTimer = new Timer ((_) => {
+						fractionSum += fractionStep;
+						blocksPB.Fraction = fractionSum;
+						continuousPB.Fraction = fractionSum;
+						if (fractionSum > 1) {
+							_fractionTimer.Dispose ();
+							_fractionTimer = null;
+							button.CanFocus = true;
+						}
+						Application.MainLoop.Driver.Wakeup ();
+					}, null, 0, _timerTick);
+				}
+			};
+			Win.Add (button);
+
+			label = new Label ("Marquee Blocks") {
+				X = Pos.Center (),
+				Y = Pos.Y (button) + 3
+			};
+			Win.Add (label);
+
+			var marqueesBlocksPB = new ProgressBar () {
+				X = Pos.Center (),
+				Y = Pos.Y (label) + 1,
+				Width = pbWidth,
+				ProgressBarStyle = ProgressBarStyle.MarqueeBlocks
+			};
+			Win.Add (marqueesBlocksPB);
+
+			label = new Label ("Marquee Continuous") {
+				X = Pos.Center (),
+				Y = Pos.Bottom (marqueesBlocksPB) + 1
+			};
+			Win.Add (label);
+
+			var marqueesContinuousPB = new ProgressBar () {
+				X = Pos.Center (),
+				Y = Pos.Y (label) + 1,
+				Width = pbWidth,
+				ProgressBarStyle = ProgressBarStyle.MarqueeContinuous
+			};
+			Win.Add (marqueesContinuousPB);
+
+			rbPBFormat.SelectedItemChanged += (e) => {
+				blocksPB.ProgressBarFormat = (ProgressBarFormat)e.SelectedItem;
+				continuousPB.ProgressBarFormat = (ProgressBarFormat)e.SelectedItem;
+				marqueesBlocksPB.ProgressBarFormat = (ProgressBarFormat)e.SelectedItem;
+				marqueesContinuousPB.ProgressBarFormat = (ProgressBarFormat)e.SelectedItem;
+			};
+
+			_pulseTimer = new Timer ((_) => {
+				marqueesBlocksPB.Text = marqueesContinuousPB.Text = DateTime.Now.TimeOfDay.ToString ();
+				marqueesBlocksPB.Pulse ();
+				marqueesContinuousPB.Pulse ();
+				Application.MainLoop.Driver.Wakeup ();
+			}, null, 0, 300);
+
+			Top.Unloaded += Top_Unloaded;
+
+			void Top_Unloaded ()
+			{
+				if (_pulseTimer != null) {
+					_pulseTimer.Dispose ();
+					_pulseTimer = null;
+					Top.Unloaded -= Top_Unloaded;
+				}
+			}
+		}
+	}
+}

+ 848 - 0
UnitTests/ProgressBarTests.cs

@@ -0,0 +1,848 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Xunit;
+
+namespace Terminal.Gui.Views {
+	public class ProgressBarTests {
+		[Fact]
+		[AutoInitShutdown]
+		public void Default_Contructor ()
+		{
+			var pb = new ProgressBar ();
+
+			Assert.False (pb.CanFocus);
+			Assert.Equal (0, pb.Fraction);
+			Assert.Equal (new Attribute (Color.BrightGreen, Color.Gray),
+				new Attribute (pb.ColorScheme.Normal.Foreground, pb.ColorScheme.Normal.Background));
+			Assert.Equal (Colors.Base.Normal, pb.ColorScheme.HotNormal);
+			Assert.Equal (1, pb.Height);
+			Assert.Equal (ProgressBarStyle.Blocks, pb.ProgressBarStyle);
+			Assert.Equal (ProgressBarFormat.Simple, pb.ProgressBarFormat);
+			Assert.Equal (Application.Driver.BlocksMeterSegment, pb.SegmentCharacter);
+		}
+
+		[Fact]
+		[AutoInitShutdown]
+		public void ProgressBarStyle_Setter ()
+		{
+			var driver = ((FakeDriver)Application.Driver);
+
+			var pb = new ProgressBar ();
+
+			pb.ProgressBarStyle = ProgressBarStyle.Blocks;
+			Assert.Equal (driver.BlocksMeterSegment, pb.SegmentCharacter);
+
+			pb.ProgressBarStyle = ProgressBarStyle.Continuous;
+			Assert.Equal (driver.ContinuousMeterSegment, pb.SegmentCharacter);
+
+			pb.ProgressBarStyle = ProgressBarStyle.MarqueeBlocks;
+			Assert.Equal (driver.BlocksMeterSegment, pb.SegmentCharacter);
+
+			pb.ProgressBarStyle = ProgressBarStyle.MarqueeContinuous;
+			Assert.Equal (driver.ContinuousMeterSegment, pb.SegmentCharacter);
+		}
+
+		[Fact]
+		[AutoInitShutdown]
+		public void ProgressBarFormat_Setter ()
+		{
+			var pb = new ProgressBar ();
+
+			pb.ProgressBarFormat = ProgressBarFormat.Simple;
+			Assert.Equal (1, pb.Height);
+
+			pb.ProgressBarFormat = ProgressBarFormat.SimplePlusPercentage;
+			Assert.Equal (2, pb.Height);
+
+			pb.ProgressBarFormat = ProgressBarFormat.Framed;
+			Assert.Equal (3, pb.Height);
+
+			pb.ProgressBarFormat = ProgressBarFormat.FramedPlusPercentage;
+			Assert.Equal (4, pb.Height);
+
+			pb.ProgressBarFormat = ProgressBarFormat.FramedProgressPadded;
+			Assert.Equal (6, pb.Height);
+		}
+
+		[Fact]
+		[AutoInitShutdown]
+		public void ProgressBarFormat_MarqueeBlocks_MarqueeContinuous_Setter ()
+		{
+			var driver = ((FakeDriver)Application.Driver);
+
+			var pb1 = new ProgressBar () { ProgressBarStyle = ProgressBarStyle.MarqueeBlocks };
+			var pb2 = new ProgressBar () { ProgressBarStyle = ProgressBarStyle.MarqueeContinuous };
+
+			pb1.ProgressBarFormat = ProgressBarFormat.Simple;
+			Assert.Equal (ProgressBarFormat.Simple, pb1.ProgressBarFormat);
+			Assert.Equal (1, pb1.Height);
+			pb2.ProgressBarFormat = ProgressBarFormat.Simple;
+			Assert.Equal (ProgressBarFormat.Simple, pb2.ProgressBarFormat);
+			Assert.Equal (1, pb2.Height);
+
+			pb1.ProgressBarFormat = ProgressBarFormat.SimplePlusPercentage;
+			Assert.Equal (ProgressBarFormat.SimplePlusPercentage, pb1.ProgressBarFormat);
+			Assert.Equal (2, pb1.Height);
+			pb2.ProgressBarFormat = ProgressBarFormat.SimplePlusPercentage;
+			Assert.Equal (ProgressBarFormat.SimplePlusPercentage, pb2.ProgressBarFormat);
+			Assert.Equal (2, pb2.Height);
+
+			pb1.ProgressBarFormat = ProgressBarFormat.Framed;
+			Assert.Equal (ProgressBarFormat.Framed, pb1.ProgressBarFormat);
+			Assert.Equal (3, pb1.Height);
+			pb2.ProgressBarFormat = ProgressBarFormat.Framed;
+			Assert.Equal (ProgressBarFormat.Framed, pb2.ProgressBarFormat);
+			Assert.Equal (3, pb2.Height);
+
+			pb1.ProgressBarFormat = ProgressBarFormat.FramedPlusPercentage;
+			Assert.Equal (ProgressBarFormat.FramedPlusPercentage, pb1.ProgressBarFormat);
+			Assert.Equal (4, pb1.Height);
+			pb2.ProgressBarFormat = ProgressBarFormat.FramedPlusPercentage;
+			Assert.Equal (ProgressBarFormat.FramedPlusPercentage, pb2.ProgressBarFormat);
+			Assert.Equal (4, pb2.Height);
+
+			pb1.ProgressBarFormat = ProgressBarFormat.FramedProgressPadded;
+			Assert.Equal (ProgressBarFormat.FramedProgressPadded, pb1.ProgressBarFormat);
+			Assert.Equal (6, pb1.Height);
+			pb2.ProgressBarFormat = ProgressBarFormat.FramedProgressPadded;
+			Assert.Equal (ProgressBarFormat.FramedProgressPadded, pb2.ProgressBarFormat);
+			Assert.Equal (6, pb2.Height);
+		}
+
+		[Fact]
+		[AutoInitShutdown]
+		public void Text_Setter_Not_Marquee ()
+		{
+			var pb = new ProgressBar () { Fraction = 0.25F};
+
+			pb.ProgressBarFormat = ProgressBarFormat.Simple;
+			pb.Text = "blabla";
+			Assert.Equal ("25%", pb.Text);
+
+			pb.ProgressBarFormat = ProgressBarFormat.SimplePlusPercentage;
+			pb.Text = "bleble";
+			Assert.Equal ("25%", pb.Text);
+
+			pb.ProgressBarFormat = ProgressBarFormat.Framed;
+			Assert.Equal ("25%", pb.Text);
+
+			pb.ProgressBarFormat = ProgressBarFormat.FramedPlusPercentage;
+			Assert.Equal ("25%", pb.Text);
+
+			pb.ProgressBarFormat = ProgressBarFormat.FramedProgressPadded;
+			Assert.Equal ("25%", pb.Text);
+		}
+
+		[Fact]
+		[AutoInitShutdown]
+		public void Text_Setter_Marquee ()
+		{
+			var pb = new ProgressBar () { Fraction = 0.25F, ProgressBarStyle = ProgressBarStyle.MarqueeBlocks };
+
+			pb.ProgressBarFormat = ProgressBarFormat.Simple;
+			pb.Text = "blabla";
+			Assert.Equal ("blabla", pb.Text);
+
+			pb.ProgressBarFormat = ProgressBarFormat.SimplePlusPercentage;
+			pb.Text = "bleble";
+			Assert.Equal ("bleble", pb.Text);
+
+			pb.ProgressBarFormat = ProgressBarFormat.Framed;
+			Assert.Equal ("bleble", pb.Text);
+
+			pb.ProgressBarFormat = ProgressBarFormat.FramedPlusPercentage;
+			Assert.Equal ("bleble", pb.Text);
+
+			pb.ProgressBarFormat = ProgressBarFormat.FramedProgressPadded;
+			Assert.Equal ("bleble", pb.Text);
+		}
+
+		[Fact]
+		[AutoInitShutdown]
+		public void Pulse_Redraw ()
+		{
+			var driver = ((FakeDriver)Application.Driver);
+
+			var pb = new ProgressBar () {
+				Width = 15,
+				ProgressBarStyle = ProgressBarStyle.MarqueeBlocks
+			};
+
+			for (int i = 0; i < 38; i++) {
+				pb.Pulse ();
+				pb.Redraw (pb.Bounds);
+				if (i == 0) {
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 1) {
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 2) {
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 3) {
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 4) {
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 5) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 6) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 7) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 8) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 9) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 10) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 11) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 12) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 13) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 14) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 14, 0]);
+				} else if (i == 15) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 14, 0]);
+				} else if (i == 16) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 14, 0]);
+				} else if (i == 17) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 14, 0]);
+				} else if (i == 18) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 14, 0]);
+				} else if (i == 19) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 14, 0]);
+				} else if (i == 20) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 14, 0]);
+				} else if (i == 21) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 14, 0]);
+				} else if (i == 22) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 14, 0]);
+				} else if (i == 23) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 24) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 25) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 26) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 27) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 28) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 29) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 30) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 31) {
+					Assert.Equal (' ', (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 32) {
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 33) {
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 34) {
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 35) {
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 36) {
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				} else if (i == 37) {
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 6, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 7, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 8, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 9, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 10, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 11, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 12, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 13, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 14, 0]);
+				}
+			}
+		}
+
+		[Fact]
+		[AutoInitShutdown]
+		public void Fraction_Redraw ()
+		{
+			var driver = ((FakeDriver)Application.Driver);
+
+			var pb = new ProgressBar () {
+				Width = 5
+			};
+
+			for (int i = 0; i <= pb.Frame.Width; i++) {
+				pb.Fraction += 0.2F;
+				pb.Redraw (pb.Bounds);
+				if (i == 0) {
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+				} else if (i == 1) {
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+				} else if (i == 2) {
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+				} else if (i == 3) {
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+				} else if (i == 4) {
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+				} else if (i == 5) {
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 0, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 1, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 2, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 3, 0]);
+					Assert.Equal (driver.BlocksMeterSegment, (double)driver.Contents [0, 4, 0]);
+					Assert.Equal (' ', (double)driver.Contents [0, 5, 0]);
+				}
+			}
+		}
+	}
+}