mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2025-12-28 00:38:00 +01:00
* Reduces indentation by remove the namespace braces. * Reduces indentation and removes unused using. * Ensures clear selection if it isn't selecting. * Turn on nullability context for TryParse and update usages as needed. * Use IsNullOrWhiteSpace, which includes IsNullOrEmpty All-whitespace values are also illegal, so may as well handle that here too * Respect the nullable here * It's a struct * Use byte.MaxValue and add remark * Just use the bytes directly * Must respect endianness * Add uint constructor so consumers don't have to do unchecked math * Completely re-work parsing and implement ISpanParsable<Color> All parsing is now almost-0 allocation, and is significantly faster than before * Extension methods required by new code * Use standard Math.Clamp method here * Add some new unit tests for TryParse * De-duplicate code and handle more cases * Enable nullability context for the file * Go ahead and enable the language features and analysis * Implicit usings remove a lot of boilerplate usings. * Add these to the dictionary to shut spell check up * Make this thing a record struct and a union, and update constructors This commit won't build. I'm just breaking out changes a little bit. * Some additional XmlDoc standardizing * Make FindClosestColor and CalculateColorDistance use the vector for SIMD * Add a TryFormat method for support of I*Formattable * Add an interface for support of custom formatting of Colors * Pass by in reference * Parse string delegates to Parse span * Parse now does all the work * Remove the old new code from TryParse * Some new cast operators * Add IFormattable.ToString implementation * Add the rest of the code for Color in its current (unfinished) state * Move that interface to its own file * Add ColorParseException class * Move Attribute to its own file, too. * Re-implement these operators as explicit methods * Get rid of fuzzy equality operators and update tests to use the named methods that replace them * Add an explicit test case for ToString with null format string and explicitly specified Invariant culture * Fix byte orders for hex format to be standard ARGB * Prove that ToString and Parse can round-trip values * Unroll this test into parameterized cases * Fix a couple of comments to match byte order * Update R# dictionary to match correct byte orders * Remove stray comment * Separate all types in this to their own files * Convert this one to use the handy extension * Add test for Argb property * Add a file nesting rule to make some incoming file changes display nicely * Move constructor tests to their own file and add some new tests * Add implicit cast from uint * More constructor tests * Since this is now a record, the equality operators are compiler generated Still spot-checking a few arbitrary values for completeness * Override ToString to delegate to Attribute * Simplify and clean up ToString. Delegate to ColorScheme * Update the test to match new output * These should be fields, really. It's a value type. * Add some type checks for change control * Allow unsafe and turn on implicit usings * Make this one better * Rename tests and remove redundant checks (the type checks already guarantee field consistency) * Reorganize a bit * Make these test 16 random values * Existing operator tests converted * That one is now redundant with both of the other tests that check all the named colors * Move this to type checks and simplify a little bit * These lambdas can be static * Move operators to another file. * Add global using for System.Text because it's EVERYWHERE * Reorganization of Color and some related types. Updated usages to reflect changes * Update tests to reflect changes in Terminal.Gui * Add missing keyword * Add entry to dictionary * Add dotsettings for Terminal.Gui Only specifies language level * Commit unsaved changes for usings here * Implement last remaining TryFormat method * A little cleanup/formality * Sorting rules Sort methods by name and interface they implement * Sort code * Match namespace for tests None! * Unroll ordinal check and reorganize. * Sort before writing new tests * These got reversed... * Add test to prove explicit cast to Vector3 works properly * Sort these too * Add test for uint->Color implicit operator * Add test for Color->uint implicit operator * Correct this test name and re-order * Add test for implicit conversion from Vector3 to Color * Add test for implicit conversion from Vector4 to Color * These also got reversed, like with Vector3 * Add test for implicit conversion from Color to Vector4 * Add test for GetHashCode * Make sure these are all under the same namespace * Remove a now-redundant test * Reorganize formatting and parsing tests to another type part * Tests moved back to Terminal.Gui.DrawingTests namespace as before. * Add tests for the constructor taking 3 or 4 integers and sort * Cleanup - Renamed some tests - Make a test even clearer - Removed redundant code - Got rid of unused parameter in Constructor_WithColorName_AllChannelsCorrect * That needs to be from the reverse map Not broken - just was sub-optimal due to my error. * Enable nullability context in this file Not sure how it got removed but whatev * Respect nullability context in this file now that it's on 🤦♂️ * Add tests for expected exceptions with whitespace or null values * Add test for parameterless constructor * A couple more places for reference passing and some SkipLocalsInit attributes. * Some XmlDoc corrections to reflect the final implementation * Remove namespace qualifier * Can't use these because of lambdas :( * Removed a collection that never ended up being needed. * Add bracing, newline, and modifier style rules * Add spacing rules inside parens/brackets * This was still under the Terminal.Gui.Drawing namespace. Revert that. * Applied updated formatting settings and addressed XmlDoc reviews in #3204 * More places where spaces got added in dependent code. Also a couple of null checks fixed to not use the equality operator * More dependent code format fixes * Finished re-formatting modified code that got spaces added everywhere * Visual studio didn't actually write this file to disk til I closed out of VS... Grr * Delete the ReSharper settings files from this branch. --------- Co-authored-by: BDisp <bd.bdisp@gmail.com>
171 lines
5.9 KiB
C#
171 lines
5.9 KiB
C#
using System;
|
|
using Xunit;
|
|
|
|
namespace Terminal.Gui.ViewsTests;
|
|
public class TimeFieldTests {
|
|
[Fact]
|
|
public void Constructors_Defaults ()
|
|
{
|
|
var tf = new TimeField ();
|
|
Assert.False (tf.IsShortFormat);
|
|
Assert.Equal (TimeSpan.MinValue, tf.Time);
|
|
Assert.Equal (1, tf.CursorPosition);
|
|
Assert.Equal (new Rect (0, 0, 10, 1), tf.Frame);
|
|
|
|
var time = DateTime.Now.TimeOfDay;
|
|
tf = new TimeField (time);
|
|
Assert.False (tf.IsShortFormat);
|
|
Assert.Equal (time, tf.Time);
|
|
Assert.Equal (1, tf.CursorPosition);
|
|
Assert.Equal (new Rect (0, 0, 10, 1), tf.Frame);
|
|
|
|
tf = new TimeField (1, 2, time);
|
|
Assert.False (tf.IsShortFormat);
|
|
Assert.Equal (time, tf.Time);
|
|
Assert.Equal (1, tf.CursorPosition);
|
|
Assert.Equal (new Rect (1, 2, 10, 1), tf.Frame);
|
|
|
|
tf = new TimeField (3, 4, time, true);
|
|
Assert.True (tf.IsShortFormat);
|
|
Assert.Equal (time, tf.Time);
|
|
Assert.Equal (1, tf.CursorPosition);
|
|
Assert.Equal (new Rect (3, 4, 7, 1), tf.Frame);
|
|
|
|
tf.IsShortFormat = false;
|
|
Assert.Equal (new Rect (3, 4, 10, 1), tf.Frame);
|
|
Assert.Equal (10, tf.Width);
|
|
}
|
|
|
|
[Fact]
|
|
public void CursorPosition_Min_Is_Always_One_Max_Is_Always_Max_Format ()
|
|
{
|
|
var tf = new TimeField ();
|
|
Assert.Equal (1, tf.CursorPosition);
|
|
tf.CursorPosition = 0;
|
|
Assert.Equal (1, tf.CursorPosition);
|
|
tf.CursorPosition = 9;
|
|
Assert.Equal (8, tf.CursorPosition);
|
|
tf.IsShortFormat = true;
|
|
tf.CursorPosition = 0;
|
|
Assert.Equal (1, tf.CursorPosition);
|
|
tf.CursorPosition = 6;
|
|
Assert.Equal (5, tf.CursorPosition);
|
|
}
|
|
|
|
[Fact]
|
|
public void CursorPosition_Min_Is_Always_One_Max_Is_Always_Max_Format_After_Selection ()
|
|
{
|
|
var tf = new TimeField ();
|
|
// Start selection
|
|
Assert.True (tf.NewKeyDownEvent (new (KeyCode.CursorLeft | KeyCode.ShiftMask)));
|
|
Assert.Equal (1, tf.SelectedStart);
|
|
Assert.Equal (1, tf.SelectedLength);
|
|
Assert.Equal (0, tf.CursorPosition);
|
|
// Without selection
|
|
Assert.True (tf.NewKeyDownEvent (new (KeyCode.CursorLeft)));
|
|
Assert.Equal (-1, tf.SelectedStart);
|
|
Assert.Equal (0, tf.SelectedLength);
|
|
Assert.Equal (1, tf.CursorPosition);
|
|
tf.CursorPosition = 8;
|
|
Assert.True (tf.NewKeyDownEvent (new (KeyCode.CursorRight | KeyCode.ShiftMask)));
|
|
Assert.Equal (8, tf.SelectedStart);
|
|
Assert.Equal (1, tf.SelectedLength);
|
|
Assert.Equal (9, tf.CursorPosition);
|
|
Assert.True (tf.NewKeyDownEvent (new (KeyCode.CursorRight)));
|
|
Assert.Equal (-1, tf.SelectedStart);
|
|
Assert.Equal (0, tf.SelectedLength);
|
|
Assert.Equal (8, tf.CursorPosition);
|
|
Assert.False (tf.IsShortFormat);
|
|
tf.IsShortFormat = true;
|
|
Assert.Equal (5, tf.CursorPosition);
|
|
// Start selection
|
|
Assert.True (tf.NewKeyDownEvent (new (KeyCode.CursorRight | KeyCode.ShiftMask)));
|
|
Assert.Equal (5, tf.SelectedStart);
|
|
Assert.Equal (1, tf.SelectedLength);
|
|
Assert.Equal (6, tf.CursorPosition);
|
|
Assert.True (tf.NewKeyDownEvent (new (KeyCode.CursorRight)));
|
|
Assert.Equal (-1, tf.SelectedStart);
|
|
Assert.Equal (0, tf.SelectedLength);
|
|
Assert.Equal (5, tf.CursorPosition);
|
|
}
|
|
|
|
[Fact]
|
|
public void KeyBindings_Command ()
|
|
{
|
|
TimeField tf = new TimeField (TimeSpan.Parse ("12:12:19"));
|
|
tf.ReadOnly = true;
|
|
Assert.True (tf.NewKeyDownEvent (new (KeyCode.Delete)));
|
|
Assert.Equal (" 12:12:19", tf.Text);
|
|
tf.ReadOnly = false;
|
|
Assert.True (tf.NewKeyDownEvent (new (KeyCode.D | KeyCode.CtrlMask)));
|
|
Assert.Equal (" 02:12:19", tf.Text);
|
|
tf.CursorPosition = 4;
|
|
tf.ReadOnly = true;
|
|
Assert.True (tf.NewKeyDownEvent (new (KeyCode.Delete)));
|
|
Assert.Equal (" 02:12:19", tf.Text);
|
|
tf.ReadOnly = false;
|
|
Assert.True (tf.NewKeyDownEvent (new (KeyCode.Backspace)));
|
|
Assert.Equal (" 02:02:19", tf.Text);
|
|
Assert.True (tf.NewKeyDownEvent (new (KeyCode.Home)));
|
|
Assert.Equal (1, tf.CursorPosition);
|
|
Assert.True (tf.NewKeyDownEvent (new (KeyCode.End)));
|
|
Assert.Equal (8, tf.CursorPosition);
|
|
Assert.True (tf.NewKeyDownEvent (new (KeyCode.A | KeyCode.CtrlMask)));
|
|
Assert.Equal (1, tf.CursorPosition);
|
|
Assert.True (tf.NewKeyDownEvent (new (KeyCode.E | KeyCode.CtrlMask)));
|
|
Assert.Equal (8, tf.CursorPosition);
|
|
Assert.True (tf.NewKeyDownEvent (new (KeyCode.CursorLeft)));
|
|
Assert.Equal (7, tf.CursorPosition);
|
|
Assert.True (tf.NewKeyDownEvent (new (KeyCode.CursorRight)));
|
|
Assert.Equal (8, tf.CursorPosition);
|
|
// Non-numerics are ignored
|
|
Assert.False (tf.NewKeyDownEvent (new (KeyCode.A)));
|
|
tf.ReadOnly = true;
|
|
tf.CursorPosition = 1;
|
|
Assert.True (tf.NewKeyDownEvent (new (KeyCode.D1)));
|
|
Assert.Equal (" 02:02:19", tf.Text);
|
|
tf.ReadOnly = false;
|
|
Assert.True (tf.NewKeyDownEvent (new (KeyCode.D1)));
|
|
Assert.Equal (" 12:02:19", tf.Text);
|
|
Assert.Equal (2, tf.CursorPosition);
|
|
Assert.True (tf.NewKeyDownEvent (new (KeyCode.D | KeyCode.AltMask)));
|
|
Assert.Equal (" 10:02:19", tf.Text);
|
|
}
|
|
|
|
[Fact]
|
|
public void Typing_With_Selection_Normalize_Format ()
|
|
{
|
|
TimeField tf = new TimeField (TimeSpan.Parse ("12:12:19"));
|
|
// Start selection at before the first separator :
|
|
tf.CursorPosition = 2;
|
|
// Now select the separator :
|
|
Assert.True (tf.NewKeyDownEvent (new (KeyCode.CursorRight | KeyCode.ShiftMask)));
|
|
Assert.Equal (2, tf.SelectedStart);
|
|
Assert.Equal (1, tf.SelectedLength);
|
|
Assert.Equal (3, tf.CursorPosition);
|
|
// Type 3 over the separator
|
|
Assert.True (tf.NewKeyDownEvent (new (KeyCode.D3)));
|
|
// The format was normalized and replaced again with :
|
|
Assert.Equal (" 12:12:19", tf.Text);
|
|
Assert.Equal (4, tf.CursorPosition);
|
|
}
|
|
|
|
[Fact, AutoInitShutdown]
|
|
public void Copy_Paste ()
|
|
{
|
|
TimeField tf1 = new TimeField (TimeSpan.Parse ("12:12:19"));
|
|
TimeField tf2 = new TimeField (TimeSpan.Parse ("12:59:01"));
|
|
// Select all text
|
|
Assert.True (tf2.NewKeyDownEvent (new (KeyCode.End | KeyCode.ShiftMask)));
|
|
Assert.Equal (1, tf2.SelectedStart);
|
|
Assert.Equal (8, tf2.SelectedLength);
|
|
Assert.Equal (9, tf2.CursorPosition);
|
|
// Copy from tf2
|
|
Assert.True (tf2.NewKeyDownEvent (new (KeyCode.C | KeyCode.CtrlMask)));
|
|
// Paste into tf1
|
|
Assert.True (tf1.NewKeyDownEvent (new (KeyCode.V | KeyCode.CtrlMask)));
|
|
Assert.Equal (" 12:59:01", tf1.Text);
|
|
Assert.Equal (9, tf1.CursorPosition);
|
|
}
|
|
}
|