├── Sample
└── InputMaskSample
│ ├── InputMaskSample
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ └── AppIcon.appiconset
│ │ │ └── Contents.json
│ ├── Entitlements.plist
│ ├── Main.cs
│ ├── ViewController.designer.cs
│ ├── ViewController.cs
│ ├── Info.plist
│ ├── LaunchScreen.storyboard
│ ├── AppDelegate.cs
│ ├── Main.storyboard
│ └── InputMaskSample.csproj
│ └── InputMaskSample.sln
├── Source
├── InputMask
│ ├── Classes
│ │ ├── Model
│ │ │ ├── CompilationException.cs
│ │ │ ├── WrongFormatException.cs
│ │ │ ├── CaretString.cs
│ │ │ ├── Next.cs
│ │ │ ├── States
│ │ │ │ ├── EOLState.cs
│ │ │ │ ├── FixedState.cs
│ │ │ │ ├── FreeState.cs
│ │ │ │ ├── ValueState.cs
│ │ │ │ └── OptionalValueState.cs
│ │ │ └── State.cs
│ │ ├── Helper
│ │ │ ├── CharacterSet.cs
│ │ │ ├── StringExtensions.cs
│ │ │ ├── CaretStringIterator.cs
│ │ │ ├── Compiler.cs
│ │ │ └── FormatSanitizer.cs
│ │ ├── View
│ │ │ ├── IMaskedTextFieldDelegateListener.cs
│ │ │ └── MaskedTextFieldDelegate.cs
│ │ └── Mask.cs
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ └── InputMask.csproj
├── InputMaskTests
│ ├── Entitlements.plist
│ ├── Tests
│ │ ├── MaskTestBase.cs
│ │ ├── MaskTestCase.cs
│ │ ├── YearCase.cs
│ │ ├── YearACCase.cs
│ │ ├── MonthYearDoubledoubleShashCase.cs
│ │ ├── DayMonthYearCase.cs
│ │ ├── DayMonthYearShortCase.cs
│ │ └── PhoneCase.cs
│ ├── Main.cs
│ ├── Info.plist
│ ├── LaunchScreen.storyboard
│ ├── UnitTestAppDelegate.cs
│ └── InputMaskTests.csproj
└── InputMask.sln
├── LICENSE
├── README.md
└── .gitignore
/Sample/InputMaskSample/InputMaskSample/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Source/InputMask/Classes/Model/CompilationException.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | namespace InputMask.Classes.Model
3 | {
4 | public class CompilationException : Exception
5 | {
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/Source/InputMaskTests/Entitlements.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/Source/InputMask/Classes/Helper/CharacterSet.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | namespace InputMask.Classes.Helper
3 | {
4 | //public class CharacterSet
5 | //{
6 | // public CharacterSet()
7 | // {
8 | // }
9 | //}
10 | }
11 |
--------------------------------------------------------------------------------
/Sample/InputMaskSample/InputMaskSample/Entitlements.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/Source/InputMask/Classes/View/IMaskedTextFieldDelegateListener.cs:
--------------------------------------------------------------------------------
1 | using UIKit;
2 |
3 | namespace InputMask.Classes.View
4 | {
5 | public interface IMaskedTextFieldDelegateListener : IUITextFieldDelegate
6 | {
7 | void TextField(IUITextInput textField, bool complete, string value);
8 | }
9 | }
--------------------------------------------------------------------------------
/Source/InputMask/Classes/Helper/StringExtensions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | namespace InputMask.Classes.Helper
3 | {
4 | public static class StringExtensions
5 | {
6 | public static string TruncateFirst(this string content){
7 | return content.Substring(1);
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Source/InputMask/Classes/Model/WrongFormatException.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | namespace InputMask.Classes.Model
3 | {
4 | public class WrongFormatException : Exception
5 | {
6 | public WrongFormatException()
7 | {
8 | }
9 | public WrongFormatException(string message) : base(message)
10 | {
11 | }
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Source/InputMask/Classes/Model/CaretString.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | namespace InputMask.Classes.Model
3 | {
4 | public class CaretString
5 | {
6 | public String Content;
7 |
8 | public nint CaretPosition;
9 |
10 | public CaretString(String content, nint caretPosition)
11 | {
12 | Content = content;
13 | CaretPosition = caretPosition;
14 | }
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Sample/InputMaskSample/InputMaskSample/Main.cs:
--------------------------------------------------------------------------------
1 | using UIKit;
2 |
3 | namespace InputMaskSample
4 | {
5 | public class Application
6 | {
7 | // This is the main entry point of the application.
8 | static void Main(string[] args)
9 | {
10 | // if you want to use a different Application Delegate class from "AppDelegate"
11 | // you can specify it here.
12 | UIApplication.Main(args, null, "AppDelegate");
13 | }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Source/InputMaskTests/Tests/MaskTestBase.cs:
--------------------------------------------------------------------------------
1 |
2 | using System;
3 | using InputMask.Classes;
4 | using NUnit.Framework;
5 |
6 | namespace InputMaskTests.Tests
7 | {
8 | public abstract class MaskTestBase
9 | {
10 | public Mask CreateMask()
11 | {
12 | return new Mask(Format);
13 | }
14 |
15 | public virtual string Format
16 | {
17 | get
18 | {
19 | throw new NotImplementedException();
20 | }
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Source/InputMaskTests/Main.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Linq;
3 | using System.Collections.Generic;
4 |
5 | using Foundation;
6 | using UIKit;
7 |
8 | namespace InputMaskTests
9 | {
10 | public class Application
11 | {
12 | // This is the main entry point of the application.
13 | static void Main(string[] args)
14 | {
15 | // if you want to use a different Application Delegate class from "UnitTestAppDelegate"
16 | // you can specify it here.
17 | UIApplication.Main(args, null, "UnitTestAppDelegate");
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Source/InputMask/Classes/Model/Next.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | namespace InputMask.Classes.Model
3 | {
4 | public class Next
5 | {
6 | public State State { get; set; }
7 | public char? Insert { get; set; }
8 | public bool Pass { get; set; }
9 | public char? Value { get; set; }
10 |
11 | public Next()
12 | {
13 | }
14 |
15 | public Next(State state, char? insert, bool pass, char? value)
16 | {
17 | State = state;
18 | Insert = insert;
19 | Pass = pass;
20 | Value = value;
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Source/InputMask/Classes/Model/States/EOLState.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | namespace InputMask.Classes.Model.States
3 | {
4 | public class EOLState : State
5 | {
6 | public EOLState(State child) : base(child)
7 | {
8 | }
9 |
10 | public EOLState() : base(null)
11 | {
12 | }
13 |
14 | public override Next Accept(char character)
15 | {
16 | return null;
17 | }
18 |
19 | public override State NextState()
20 | {
21 | return this;
22 | }
23 |
24 | public override string DebugDescription()
25 | {
26 | return "EOL";
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Source/InputMaskTests/Tests/MaskTestCase.cs:
--------------------------------------------------------------------------------
1 |
2 | using System;
3 | using InputMask.Classes;
4 | using InputMask.Classes.Model;
5 | using NUnit.Framework;
6 |
7 | namespace InputMaskTests.Tests
8 | {
9 | [TestFixture]
10 | public class MaskTestCase
11 | {
12 | [Test]
13 | public void TestInit_nestedBrackets_throwsWrongFormatCompilerError()
14 | {
15 | Assert.Throws(() => {
16 | new Mask("[[00]000]");
17 | });
18 | }
19 |
20 | [Test]
21 | public void TestInit_mixedCharacters_initialized()
22 | {
23 | var mask = new Mask("[00000Aa]");
24 | Assert.IsNotNull(mask);
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Sample/InputMaskSample/InputMaskSample/ViewController.designer.cs:
--------------------------------------------------------------------------------
1 | // WARNING
2 | //
3 | // This file has been generated automatically by Visual Studio to store outlets and
4 | // actions made in the UI designer. If it is removed, they will be lost.
5 | // Manual changes to this file may not be handled correctly.
6 | //
7 | using Foundation;
8 | using System.CodeDom.Compiler;
9 |
10 | namespace InputMaskSample
11 | {
12 | [Register ("ViewController")]
13 | partial class ViewController
14 | {
15 | [Outlet]
16 | UIKit.UITextField field { get; set; }
17 |
18 | void ReleaseDesignerOutlets ()
19 | {
20 | if (field != null) {
21 | field.Dispose ();
22 | field = null;
23 | }
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Source/InputMask/Classes/Model/State.cs:
--------------------------------------------------------------------------------
1 | using System.Diagnostics;
2 |
3 | namespace InputMask.Classes.Model
4 | {
5 | [DebuggerDisplay("{DebugDescription()}")]
6 | public abstract class State
7 | {
8 | public State Child;
9 |
10 | public State(State child)
11 | {
12 | Child = child;
13 | }
14 |
15 | public abstract Next Accept(char character);
16 |
17 | public virtual Next Autocomplete()
18 | {
19 | return null;
20 | }
21 |
22 | public virtual State NextState()
23 | {
24 | return Child;
25 | }
26 |
27 | public virtual string DebugDescription()
28 | {
29 | return string.Format("BASE -> {0}", Child != null ? Child.DebugDescription() : "null");
30 | }
31 | }
32 | }
--------------------------------------------------------------------------------
/Source/InputMask/Classes/Helper/CaretStringIterator.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using InputMask.Classes.Model;
3 |
4 | namespace InputMask.Classes.Helper
5 | {
6 | public class CaretStringIterator
7 | {
8 | private CaretString _caretString;
9 | private int _currentIndex;
10 |
11 | public CaretStringIterator(CaretString caretString)
12 | {
13 | _caretString = caretString;
14 | _currentIndex = 0;
15 | }
16 |
17 | public bool BeforeCaret(){
18 | return _currentIndex <= _caretString.CaretPosition || (_currentIndex == 0 && _caretString.CaretPosition == 0);
19 | }
20 |
21 | public char? Next()
22 | {
23 | if (_currentIndex >= _caretString.Content.Length)
24 | return null;
25 |
26 | var character = _caretString.Content[_currentIndex];
27 | _currentIndex = ++_currentIndex;
28 | return character;
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/Source/InputMask/Classes/Model/States/FixedState.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | namespace InputMask.Classes.Model.States
3 | {
4 | public class FixedState : State
5 | {
6 | public char OwnCharacter;
7 |
8 | public FixedState(State child, char character) : base(child)
9 | {
10 | OwnCharacter = character;
11 | }
12 |
13 | public override Next Accept(char character)
14 | {
15 | if (OwnCharacter == character)
16 | return new Next(NextState(), character, true, character);
17 |
18 | return new Next(NextState(), OwnCharacter, false, OwnCharacter);
19 | }
20 |
21 | public override Next Autocomplete()
22 | {
23 | return new Next(NextState(), OwnCharacter, false, OwnCharacter);
24 | }
25 |
26 | public override string DebugDescription()
27 | {
28 | return string.Format("{0} -> {1}", OwnCharacter, Child != null ? Child.DebugDescription() : "null");
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/Source/InputMask/Classes/Model/States/FreeState.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | namespace InputMask.Classes.Model.States
3 | {
4 | public class FreeState : State
5 | {
6 | public char OwnCharacter;
7 |
8 | public FreeState(State child, char character) : base(child)
9 | {
10 | Child = child;
11 | OwnCharacter = character;
12 | }
13 |
14 | public override Next Accept(char character)
15 | {
16 | if (OwnCharacter == character)
17 | {
18 | return new Next(NextState(), character, true, null);
19 | }
20 |
21 | return new Next(NextState(), OwnCharacter, false, null);
22 | }
23 |
24 | public override Next Autocomplete()
25 | {
26 | return new Next(NextState(), OwnCharacter, false, null);
27 | }
28 |
29 | public override string DebugDescription()
30 | {
31 | return string.Format("{0} -> {1}", OwnCharacter, Child != null ? Child.DebugDescription() : "null");
32 | }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/Source/InputMask/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 |
4 | // Information about this assembly is defined by the following attributes.
5 | // Change them to the values specific to your project.
6 |
7 | [assembly: AssemblyTitle("InputMask")]
8 | [assembly: AssemblyDescription("")]
9 | [assembly: AssemblyConfiguration("")]
10 | [assembly: AssemblyCompany("")]
11 | [assembly: AssemblyProduct("")]
12 | [assembly: AssemblyCopyright("${AuthorCopyright}")]
13 | [assembly: AssemblyTrademark("")]
14 | [assembly: AssemblyCulture("")]
15 |
16 | // The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
17 | // The form "{Major}.{Minor}.*" will automatically update the build and revision,
18 | // and "{Major}.{Minor}.{Build}.*" will update just the revision.
19 |
20 | [assembly: AssemblyVersion("1.0.*")]
21 |
22 | // The following attributes are used to specify the signing key for the assembly,
23 | // if desired. See the Mono documentation for more information about signing.
24 |
25 | //[assembly: AssemblyDelaySign(false)]
26 | //[assembly: AssemblyKeyFile("")]
27 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 Elton Garcia de Santana
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Source/InputMaskTests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleName
6 | InputMaskTests
7 | CFBundleIdentifier
8 | santana.garcia.elton.inputmasktests
9 | CFBundleShortVersionString
10 | 1.0
11 | CFBundleVersion
12 | 1.0
13 | LSRequiresIPhoneOS
14 |
15 | MinimumOSVersion
16 | 10.3
17 | UIDeviceFamily
18 |
19 | 1
20 | 2
21 |
22 | UISupportedInterfaceOrientations
23 |
24 | UIInterfaceOrientationPortrait
25 | UIInterfaceOrientationLandscapeLeft
26 | UIInterfaceOrientationLandscapeRight
27 |
28 | UILaunchStoryboardName
29 | LaunchScreen
30 | NSAppTransportSecurity
31 |
32 | NSAllowsArbitraryLoads
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/Sample/InputMaskSample/InputMaskSample/ViewController.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Diagnostics;
3 | using Foundation;
4 | using InputMask.Classes.View;
5 | using UIKit;
6 |
7 | namespace InputMaskSample
8 | {
9 | public partial class ViewController : UIViewController, IMaskedTextFieldDelegateListener
10 | {
11 | MaskedTextFieldDelegate maskedDelegate;
12 |
13 | protected ViewController(IntPtr handle) : base(handle) { }
14 |
15 | public override void ViewDidLoad()
16 | {
17 | base.ViewDidLoad();
18 |
19 | maskedDelegate = new MaskedTextFieldDelegate("8 ([000]) [000] [00] [00]");
20 | maskedDelegate.Listener = this;
21 |
22 | field.Delegate = maskedDelegate;
23 | }
24 |
25 | public void TextField(IUITextInput textField, bool complete, string value)
26 | {
27 | Debug.WriteLine(value);
28 | }
29 |
30 | [Export("textField:shouldChangeCharactersInRange:replacementString:")]
31 | public bool ShouldChangeCharacters(UITextField textField, Foundation.NSRange range, string replacementString)
32 | {
33 | Debug.WriteLine(textField.Text);
34 | return true;
35 | }
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/Sample/InputMaskSample/InputMaskSample/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleName
6 | InputMaskSample
7 | CFBundleIdentifier
8 | santana.garcia.elton.inputmasksample
9 | CFBundleShortVersionString
10 | 1.0
11 | CFBundleVersion
12 | 1.0
13 | LSRequiresIPhoneOS
14 |
15 | MinimumOSVersion
16 | 10.3
17 | UIDeviceFamily
18 |
19 | 1
20 |
21 | UILaunchStoryboardName
22 | LaunchScreen
23 | UIMainStoryboardFile
24 | Main
25 | UIRequiredDeviceCapabilities
26 |
27 | armv7
28 |
29 | UISupportedInterfaceOrientations
30 |
31 | UIInterfaceOrientationPortrait
32 | UIInterfaceOrientationLandscapeLeft
33 | UIInterfaceOrientationLandscapeRight
34 |
35 | XSAppIconAssets
36 | Assets.xcassets/AppIcon.appiconset
37 |
38 |
39 |
--------------------------------------------------------------------------------
/Sample/InputMaskSample/InputMaskSample.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 2012
4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InputMaskSample", "InputMaskSample\InputMaskSample.csproj", "{E8779D97-3943-48A9-B541-5C8E08E6E348}"
5 | EndProject
6 | Global
7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
8 | Debug|iPhoneSimulator = Debug|iPhoneSimulator
9 | Release|iPhone = Release|iPhone
10 | Release|iPhoneSimulator = Release|iPhoneSimulator
11 | Debug|iPhone = Debug|iPhone
12 | EndGlobalSection
13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
14 | {E8779D97-3943-48A9-B541-5C8E08E6E348}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
15 | {E8779D97-3943-48A9-B541-5C8E08E6E348}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
16 | {E8779D97-3943-48A9-B541-5C8E08E6E348}.Release|iPhone.ActiveCfg = Release|iPhone
17 | {E8779D97-3943-48A9-B541-5C8E08E6E348}.Release|iPhone.Build.0 = Release|iPhone
18 | {E8779D97-3943-48A9-B541-5C8E08E6E348}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
19 | {E8779D97-3943-48A9-B541-5C8E08E6E348}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
20 | {E8779D97-3943-48A9-B541-5C8E08E6E348}.Debug|iPhone.ActiveCfg = Debug|iPhone
21 | {E8779D97-3943-48A9-B541-5C8E08E6E348}.Debug|iPhone.Build.0 = Debug|iPhone
22 | EndGlobalSection
23 | EndGlobal
24 |
--------------------------------------------------------------------------------
/Source/InputMask/Classes/Model/States/ValueState.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | namespace InputMask.Classes.Model.States
3 | {
4 | public class ValueState : State
5 | {
6 | public enum StateType
7 | {
8 | Numeric,
9 | Literal,
10 | AlphaNumeric
11 | }
12 |
13 | public StateType Type;
14 |
15 | public ValueState(State child, StateType type) : base(child)
16 | {
17 | Type = type;
18 | }
19 |
20 | public Boolean Accepts(char character)
21 | {
22 | switch (Type)
23 | {
24 | case StateType.Numeric:
25 | return Char.IsNumber(character);
26 | case StateType.Literal:
27 | return Char.IsLetter(character);
28 | case StateType.AlphaNumeric:
29 | return Char.IsLetterOrDigit(character);
30 | default:
31 | return false;
32 | }
33 | }
34 |
35 | public override Next Accept(char character)
36 | {
37 | if (!Accepts(character))
38 | return null;
39 | return new Next(NextState(), character, true, character);
40 | }
41 |
42 | public override string DebugDescription()
43 | {
44 | var content = Child != null ? Child.DebugDescription() : "null";
45 | switch (Type)
46 | {
47 | case StateType.Numeric:
48 | return string.Format("[0] -> {0}", content);
49 | case StateType.Literal:
50 | return string.Format("[A] -> {0}", content);
51 | case StateType.AlphaNumeric:
52 | return string.Format("[_] -> {0}", content);
53 | default:
54 | return "null";
55 | }
56 | }
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/Source/InputMaskTests/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/Source/InputMask/Classes/Model/States/OptionalValueState.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using static InputMask.Classes.Model.States.ValueState;
3 |
4 | namespace InputMask.Classes.Model.States
5 | {
6 | public class OptionalValueState : State
7 | {
8 | public StateType Type;
9 |
10 | public OptionalValueState(State child, StateType type) : base(child)
11 | {
12 | Type = type;
13 | }
14 |
15 | public override Next Accept(char character)
16 | {
17 | if (Accepts(character))
18 | {
19 | return new Next(NextState(), character, true, character);
20 | }
21 | return new Next(NextState(), null, false, null);
22 | }
23 |
24 | public Boolean Accepts(char character)
25 | {
26 | switch (Type)
27 | {
28 | case StateType.Numeric:
29 | return Char.IsNumber(character);
30 | case StateType.Literal:
31 | return Char.IsLetter(character);
32 | case StateType.AlphaNumeric:
33 | return Char.IsLetterOrDigit(character);
34 | default:
35 | return false;
36 | }
37 | }
38 |
39 | public override string DebugDescription()
40 | {
41 | var content = Child != null ? Child.DebugDescription() : "null";
42 | switch (Type)
43 | {
44 | case StateType.Numeric:
45 | return string.Format("[9] -> {0}", content);
46 | case StateType.Literal:
47 | return string.Format("[a] -> {0}", content);
48 | case StateType.AlphaNumeric:
49 | return string.Format("[-] -> {0}", content);
50 | default:
51 | return "null";
52 | }
53 | }
54 | }
55 | }
--------------------------------------------------------------------------------
/Sample/InputMaskSample/InputMaskSample/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/Source/InputMaskTests/UnitTestAppDelegate.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Linq;
3 | using System.Collections.Generic;
4 |
5 | using Foundation;
6 | using UIKit;
7 | using MonoTouch.NUnit.UI;
8 |
9 | namespace InputMaskTests
10 | {
11 | // The UIApplicationDelegate for the application. This class is responsible for launching the
12 | // User Interface of the application, as well as listening (and optionally responding) to
13 | // application events from iOS.
14 | [Register("UnitTestAppDelegate")]
15 | public partial class UnitTestAppDelegate : UIApplicationDelegate
16 | {
17 | // class-level declarations
18 | UIWindow window;
19 | TouchRunner runner;
20 |
21 | //
22 | // This method is invoked when the application has loaded and is ready to run. In this
23 | // method you should instantiate the window, load the UI into it and then make the window
24 | // visible.
25 | //
26 | // You have 17 seconds to return from this method, or iOS will terminate your application.
27 | //
28 | public override bool FinishedLaunching(UIApplication app, NSDictionary options)
29 | {
30 | // create a new window instance based on the screen size
31 | window = new UIWindow(UIScreen.MainScreen.Bounds);
32 | runner = new TouchRunner(window);
33 |
34 | // register every tests included in the main application/assembly
35 | runner.Add(System.Reflection.Assembly.GetExecutingAssembly());
36 |
37 | window.RootViewController = new UINavigationController(runner.GetViewController());
38 |
39 | // make the window visible
40 | window.MakeKeyAndVisible();
41 |
42 | return true;
43 | }
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/Source/InputMask/Classes/Helper/Compiler.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Linq;
3 | using Foundation;
4 | using InputMask.Classes.Model;
5 | using InputMask.Classes.Model.States;
6 |
7 | namespace InputMask.Classes.Helper
8 | {
9 | public class Compiler
10 | {
11 | public State Compile(string formatString)
12 | {
13 | var sanitizedFormat = new FormatSanitizer().Sanitize(formatString);
14 | return Compile(sanitizedFormat, false, false);
15 | }
16 |
17 | private State Compile(string content, bool valueable, bool wasFixed)
18 | {
19 | if (string.IsNullOrEmpty(content) || content.Length == 0)
20 | return new EOLState();
21 |
22 | var character = content.First();
23 |
24 | if ('[' == character)
25 | return Compile(content.TruncateFirst(), true, false);
26 |
27 | if ('{' == character)
28 | return Compile(content.TruncateFirst(), false, true);
29 |
30 | if (']' == character)
31 | return Compile(content.TruncateFirst(), false, false);
32 |
33 | if ('}' == character)
34 | return Compile(content.TruncateFirst(), false, false);
35 |
36 | if (valueable)
37 | {
38 | if (character == '0')
39 | return new ValueState(Compile(content.TruncateFirst(), true, false), ValueState.StateType.Numeric);
40 |
41 | if (character == 'A')
42 | return new ValueState(Compile(content.TruncateFirst(), true, false), ValueState.StateType.Literal);
43 |
44 | if (character == '_')
45 | return new ValueState(Compile(content.TruncateFirst(), true, false), ValueState.StateType.AlphaNumeric);
46 |
47 | if (character == '9')
48 | return new OptionalValueState(Compile(content.TruncateFirst(), true, false), ValueState.StateType.Numeric);
49 |
50 | if (character == 'a')
51 | return new OptionalValueState(Compile(content.TruncateFirst(), true, false), ValueState.StateType.Literal);
52 |
53 | if (character == '-')
54 | return new OptionalValueState(Compile(content.TruncateFirst(), true, false), ValueState.StateType.AlphaNumeric);
55 |
56 | throw new CompilationException();
57 | }
58 |
59 | if (wasFixed)
60 | return new FixedState(Compile(content.TruncateFirst(), false, true), character);
61 |
62 | return new FreeState(Compile(content.TruncateFirst(), false, false), character);
63 | }
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # input-mask-xamarin-ios
2 | User input masking library ported to Xamarin.IOS
3 |
4 | Original version: https://github.com/RedMadRobot/input-mask-ios
5 |
6 | 
7 |
8 | ## Description
9 | The library allows to format user input on the fly according to the provided mask and to extract valueable characters.
10 |
11 | Masks consist of blocks of symbols, which may include:
12 |
13 | * `[]` — a block for valueable symbols written by user.
14 |
15 | Square brackets block may contain any number of special symbols:
16 |
17 | 1. `0` — mandatory digit. For instance, `[000]` mask will allow user to enter three numbers: `123`.
18 | 2. `9` — optional digit . For instance, `[00099]` mask will allow user to enter from three to five numbers.
19 | 3. `А` — mandatory letter. `[AAA]` mask will allow user to enter three letters: `abc`.
20 | 4. `а` — optional letter. `[АААааа]` mask will allow to enter from three to six letters.
21 | 5. `_` — mandatory symbol (digit or letter).
22 | 6. `-` — optional symbol (digit or letter).
23 |
24 | Other symbols inside square brackets will cause a mask initialization error.
25 |
26 | Blocks may contain mixed types of symbols; such that, `[000AA]` will end up being divided in two groups: `[000][AA]` (this happens automatically).
27 |
28 | Blocks must not contain nested brackets. `[[00]000]` format will cause a mask initialization error.
29 |
30 | Symbols outside the square brackets will take a place in the output.
31 | For instance, `+7 ([000]) [000]-[0000]` mask will format the input field to the form of `+7 (123) 456-7890`.
32 |
33 | * `{}` — a block for valueable yet fixed symbols, which could not be altered by the user.
34 |
35 | Symbols within the square and curly brackets form an extracted value (valueable characters).
36 | In other words, `[00]-[00]` and `[00]{-}[00]` will format the input to the same form of `12-34`,
37 | but in the first case the value, extracted by the library, will be equal to `1234`, and in the second case it will result in `12-34`.
38 |
39 | Mask format examples:
40 |
41 | 1. [00000000000]
42 | 2. {401}-[000]-[00]-[00]
43 | 3. [000999999]
44 | 4. {818}-[000]-[00]-[00]
45 | 5. [A][-----------------------------------------------------]
46 | 6. [A][_______________________________________________________________]
47 | 7. 8 [0000000000]
48 | 8. 8([000])[000]-[00]-[00]
49 | 9. [0000]{-}[00]
50 | 10. +1 ([000]) [000] [00] [00]
51 |
52 | # License
53 |
54 | The library is distributed under the MIT [LICENSE](https://opensource.org/licenses/MIT).
55 |
--------------------------------------------------------------------------------
/Sample/InputMaskSample/InputMaskSample/AppDelegate.cs:
--------------------------------------------------------------------------------
1 | using Foundation;
2 | using UIKit;
3 |
4 | namespace InputMaskSample
5 | {
6 | // The UIApplicationDelegate for the application. This class is responsible for launching the
7 | // User Interface of the application, as well as listening (and optionally responding) to application events from iOS.
8 | [Register("AppDelegate")]
9 | public class AppDelegate : UIApplicationDelegate
10 | {
11 | // class-level declarations
12 |
13 | public override UIWindow Window
14 | {
15 | get;
16 | set;
17 | }
18 |
19 | public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
20 | {
21 | // Override point for customization after application launch.
22 | // If not required for your application you can safely delete this method
23 |
24 | return true;
25 | }
26 |
27 | public override void OnResignActivation(UIApplication application)
28 | {
29 | // Invoked when the application is about to move from active to inactive state.
30 | // This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message)
31 | // or when the user quits the application and it begins the transition to the background state.
32 | // Games should use this method to pause the game.
33 | }
34 |
35 | public override void DidEnterBackground(UIApplication application)
36 | {
37 | // Use this method to release shared resources, save user data, invalidate timers and store the application state.
38 | // If your application supports background exection this method is called instead of WillTerminate when the user quits.
39 | }
40 |
41 | public override void WillEnterForeground(UIApplication application)
42 | {
43 | // Called as part of the transiton from background to active state.
44 | // Here you can undo many of the changes made on entering the background.
45 | }
46 |
47 | public override void OnActivated(UIApplication application)
48 | {
49 | // Restart any tasks that were paused (or not yet started) while the application was inactive.
50 | // If the application was previously in the background, optionally refresh the user interface.
51 | }
52 |
53 | public override void WillTerminate(UIApplication application)
54 | {
55 | // Called when the application is about to terminate. Save data, if needed. See also DidEnterBackground.
56 | }
57 | }
58 | }
59 |
60 |
--------------------------------------------------------------------------------
/Source/InputMask.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 2012
4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InputMask", "InputMask\InputMask.csproj", "{19BE37DD-82BA-4802-90AD-E32AFA1F6D56}"
5 | EndProject
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InputMaskTests", "InputMaskTests\InputMaskTests.csproj", "{6415D269-A04D-4B70-8ADA-56631BB22E14}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Release|Any CPU = Release|Any CPU
12 | Debug|iPhoneSimulator = Debug|iPhoneSimulator
13 | Release|iPhone = Release|iPhone
14 | Release|iPhoneSimulator = Release|iPhoneSimulator
15 | Debug|iPhone = Debug|iPhone
16 | EndGlobalSection
17 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
18 | {19BE37DD-82BA-4802-90AD-E32AFA1F6D56}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
19 | {19BE37DD-82BA-4802-90AD-E32AFA1F6D56}.Debug|Any CPU.Build.0 = Debug|Any CPU
20 | {19BE37DD-82BA-4802-90AD-E32AFA1F6D56}.Release|Any CPU.ActiveCfg = Release|Any CPU
21 | {19BE37DD-82BA-4802-90AD-E32AFA1F6D56}.Release|Any CPU.Build.0 = Release|Any CPU
22 | {19BE37DD-82BA-4802-90AD-E32AFA1F6D56}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
23 | {19BE37DD-82BA-4802-90AD-E32AFA1F6D56}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
24 | {19BE37DD-82BA-4802-90AD-E32AFA1F6D56}.Release|iPhone.ActiveCfg = Release|Any CPU
25 | {19BE37DD-82BA-4802-90AD-E32AFA1F6D56}.Release|iPhone.Build.0 = Release|Any CPU
26 | {19BE37DD-82BA-4802-90AD-E32AFA1F6D56}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
27 | {19BE37DD-82BA-4802-90AD-E32AFA1F6D56}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
28 | {19BE37DD-82BA-4802-90AD-E32AFA1F6D56}.Debug|iPhone.ActiveCfg = Debug|Any CPU
29 | {19BE37DD-82BA-4802-90AD-E32AFA1F6D56}.Debug|iPhone.Build.0 = Debug|Any CPU
30 | {6415D269-A04D-4B70-8ADA-56631BB22E14}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
31 | {6415D269-A04D-4B70-8ADA-56631BB22E14}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator
32 | {6415D269-A04D-4B70-8ADA-56631BB22E14}.Release|Any CPU.ActiveCfg = Release|iPhone
33 | {6415D269-A04D-4B70-8ADA-56631BB22E14}.Release|Any CPU.Build.0 = Release|iPhone
34 | {6415D269-A04D-4B70-8ADA-56631BB22E14}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
35 | {6415D269-A04D-4B70-8ADA-56631BB22E14}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
36 | {6415D269-A04D-4B70-8ADA-56631BB22E14}.Release|iPhone.ActiveCfg = Release|iPhone
37 | {6415D269-A04D-4B70-8ADA-56631BB22E14}.Release|iPhone.Build.0 = Release|iPhone
38 | {6415D269-A04D-4B70-8ADA-56631BB22E14}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
39 | {6415D269-A04D-4B70-8ADA-56631BB22E14}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
40 | {6415D269-A04D-4B70-8ADA-56631BB22E14}.Debug|iPhone.ActiveCfg = Debug|iPhone
41 | {6415D269-A04D-4B70-8ADA-56631BB22E14}.Debug|iPhone.Build.0 = Debug|iPhone
42 | EndGlobalSection
43 | EndGlobal
44 |
--------------------------------------------------------------------------------
/Sample/InputMaskSample/InputMaskSample/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images": [
3 | {
4 | "idiom": "iphone",
5 | "size": "29x29",
6 | "scale": "1x"
7 | },
8 | {
9 | "idiom": "iphone",
10 | "size": "29x29",
11 | "scale": "2x"
12 | },
13 | {
14 | "idiom": "iphone",
15 | "size": "29x29",
16 | "scale": "3x"
17 | },
18 | {
19 | "idiom": "iphone",
20 | "size": "40x40",
21 | "scale": "2x"
22 | },
23 | {
24 | "idiom": "iphone",
25 | "size": "40x40",
26 | "scale": "3x"
27 | },
28 | {
29 | "idiom": "iphone",
30 | "size": "57x57",
31 | "scale": "1x"
32 | },
33 | {
34 | "idiom": "iphone",
35 | "size": "57x57",
36 | "scale": "2x"
37 | },
38 | {
39 | "idiom": "iphone",
40 | "size": "60x60",
41 | "scale": "2x"
42 | },
43 | {
44 | "idiom": "iphone",
45 | "size": "60x60",
46 | "scale": "3x"
47 | },
48 | {
49 | "idiom": "ipad",
50 | "size": "29x29",
51 | "scale": "1x"
52 | },
53 | {
54 | "idiom": "ipad",
55 | "size": "29x29",
56 | "scale": "2x"
57 | },
58 | {
59 | "idiom": "ipad",
60 | "size": "40x40",
61 | "scale": "1x"
62 | },
63 | {
64 | "idiom": "ipad",
65 | "size": "40x40",
66 | "scale": "2x"
67 | },
68 | {
69 | "idiom": "ipad",
70 | "size": "50x50",
71 | "scale": "1x"
72 | },
73 | {
74 | "idiom": "ipad",
75 | "size": "50x50",
76 | "scale": "2x"
77 | },
78 | {
79 | "idiom": "ipad",
80 | "size": "72x72",
81 | "scale": "1x"
82 | },
83 | {
84 | "idiom": "ipad",
85 | "size": "72x72",
86 | "scale": "2x"
87 | },
88 | {
89 | "idiom": "ipad",
90 | "size": "76x76",
91 | "scale": "1x"
92 | },
93 | {
94 | "idiom": "ipad",
95 | "size": "76x76",
96 | "scale": "2x"
97 | },
98 | {
99 | "size": "24x24",
100 | "idiom": "watch",
101 | "scale": "2x",
102 | "role": "notificationCenter",
103 | "subtype": "38mm"
104 | },
105 | {
106 | "size": "27.5x27.5",
107 | "idiom": "watch",
108 | "scale": "2x",
109 | "role": "notificationCenter",
110 | "subtype": "42mm"
111 | },
112 | {
113 | "size": "29x29",
114 | "idiom": "watch",
115 | "role": "companionSettings",
116 | "scale": "2x"
117 | },
118 | {
119 | "size": "29x29",
120 | "idiom": "watch",
121 | "role": "companionSettings",
122 | "scale": "3x"
123 | },
124 | {
125 | "size": "40x40",
126 | "idiom": "watch",
127 | "scale": "2x",
128 | "role": "appLauncher",
129 | "subtype": "38mm"
130 | },
131 | {
132 | "size": "44x44",
133 | "idiom": "watch",
134 | "scale": "2x",
135 | "role": "longLook",
136 | "subtype": "42mm"
137 | },
138 | {
139 | "size": "86x86",
140 | "idiom": "watch",
141 | "scale": "2x",
142 | "role": "quickLook",
143 | "subtype": "38mm"
144 | },
145 | {
146 | "size": "98x98",
147 | "idiom": "watch",
148 | "scale": "2x",
149 | "role": "quickLook",
150 | "subtype": "42mm"
151 | }
152 | ],
153 | "info": {
154 | "version": 1,
155 | "author": "xcode"
156 | }
157 | }
--------------------------------------------------------------------------------
/Source/InputMask/InputMask.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Debug
5 | AnyCPU
6 | {19BE37DD-82BA-4802-90AD-E32AFA1F6D56}
7 | {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
8 | Library
9 | InputMask
10 | InputMask
11 | Resources
12 |
13 |
14 | true
15 | full
16 | false
17 | bin\Debug
18 | DEBUG;
19 | prompt
20 | 4
21 | iPhone Developer
22 | true
23 | true
24 | true
25 | 48967
26 |
27 |
28 | pdbonly
29 | true
30 | bin\Release
31 | prompt
32 | 4
33 | iPhone Developer
34 | true
35 | SdkOnly
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
--------------------------------------------------------------------------------
/Sample/InputMaskSample/InputMaskSample/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/Source/InputMaskTests/Tests/YearCase.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using InputMask.Classes.Model;
3 | using NUnit.Framework;
4 |
5 | namespace InputMaskTests.Tests
6 | {
7 | [TestFixture]
8 | public class YearCase : MaskTestBase
9 | {
10 | public override string Format => "[0099]";
11 |
12 | [Test]
13 | public void TestInit_correctFormat_maskInitialized()
14 | {
15 | Assert.NotNull(CreateMask());
16 | }
17 |
18 | [Test]
19 | public void TestGetPlaceholder_allSet_returnsCorrectPlaceholder()
20 | {
21 | var placeholder = CreateMask().Placeholder();
22 | Assert.AreEqual(placeholder, "0000");
23 | }
24 |
25 | [Test]
26 | public void TestAcceptableTextLength_allSet_returnsCorrectCount()
27 | {
28 | var acceptableTextLength = CreateMask().AcceptableTextLength();
29 | Assert.AreEqual(acceptableTextLength, 2);
30 | }
31 |
32 | [Test]
33 | public void TestTotalTextLength_allSet_returnsCorrectCount()
34 | {
35 | var totalTextLength = CreateMask().TotalTextLength();
36 | Assert.AreEqual(totalTextLength, 4);
37 | }
38 |
39 | [Test]
40 | public void TestAcceptableValueLength_allSet_returnsCorrectCount()
41 | {
42 | var acceptableValueLength = CreateMask().AcceptableValueLength();
43 | Assert.AreEqual(acceptableValueLength, 2);
44 | }
45 |
46 | [Test]
47 | public void TestTotalValueLength_allSet_returnsCorrectCount()
48 | {
49 | var totalValueLength = CreateMask().TotalValueLength();
50 | Assert.AreEqual(totalValueLength, 4);
51 | }
52 |
53 | [Test]
54 | public void TestApply_1_returns_1()
55 | {
56 | var inputString = "1";
57 | var inputCaret = inputString.Length;
58 |
59 | var expectedString = "1";
60 | var expectedCaret = inputString.Length;
61 |
62 | var expectedValue = expectedString;
63 |
64 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
65 |
66 | Assert.AreEqual(expectedString, result.FormattedText.Content);
67 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
68 | Assert.AreEqual(expectedValue, result.ExtractedValue);
69 |
70 | Assert.AreEqual(false, result.Complete);
71 | }
72 |
73 |
74 | [Test]
75 | public void TestApply_11_returns_11()
76 | {
77 | var inputString = "11";
78 | var inputCaret = inputString.Length;
79 |
80 | var expectedString = "11";
81 | var expectedCaret = inputString.Length;
82 |
83 | var expectedValue = expectedString;
84 |
85 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
86 |
87 | Assert.AreEqual(expectedString, result.FormattedText.Content);
88 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
89 | Assert.AreEqual(expectedValue, result.ExtractedValue);
90 |
91 | Assert.AreEqual(true, result.Complete);
92 | }
93 |
94 |
95 | [Test]
96 | public void TestApply_112_returns_112()
97 | {
98 | var inputString = "112";
99 | var inputCaret = inputString.Length;
100 |
101 | var expectedString = "112";
102 | var expectedCaret = inputString.Length;
103 |
104 | var expectedValue = expectedString;
105 |
106 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
107 |
108 | Assert.AreEqual(expectedString, result.FormattedText.Content);
109 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
110 | Assert.AreEqual(expectedValue, result.ExtractedValue);
111 |
112 | Assert.AreEqual(true, result.Complete);
113 | }
114 |
115 |
116 | [Test]
117 | public void TestApply_1122_returns_1122()
118 | {
119 | var inputString = "1122";
120 | var inputCaret = inputString.Length;
121 |
122 |
123 | var expectedString = "1122";
124 | var expectedCaret = inputString.Length;
125 |
126 | var expectedValue = expectedString;
127 |
128 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
129 |
130 | Assert.AreEqual(expectedString, result.FormattedText.Content);
131 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
132 | Assert.AreEqual(expectedValue, result.ExtractedValue);
133 |
134 | Assert.AreEqual(true, result.Complete);
135 | }
136 | }
137 | }
138 |
--------------------------------------------------------------------------------
/Sample/InputMaskSample/InputMaskSample/InputMaskSample.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Debug
5 | iPhoneSimulator
6 | {E8779D97-3943-48A9-B541-5C8E08E6E348}
7 | {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
8 | Exe
9 | InputMaskSample
10 | InputMaskSample
11 | Resources
12 |
13 |
14 | true
15 | full
16 | false
17 | bin\iPhoneSimulator\Debug
18 | DEBUG;ENABLE_TEST_CLOUD;
19 | prompt
20 | 4
21 | iPhone Developer
22 | true
23 | true
24 | true
25 | true
26 | 56986
27 | None
28 | i386, x86_64
29 | HttpClientHandler
30 | x86
31 |
32 |
33 | pdbonly
34 | true
35 | bin\iPhone\Release
36 | prompt
37 | 4
38 | iPhone Developer
39 | true
40 | Entitlements.plist
41 | SdkOnly
42 | ARMv7, ARM64
43 | HttpClientHandler
44 | x86
45 |
46 |
47 | pdbonly
48 | true
49 | bin\iPhoneSimulator\Release
50 | prompt
51 | 4
52 | iPhone Developer
53 | true
54 | true
55 | None
56 | i386, x86_64
57 | HttpClientHandler
58 | x86
59 |
60 |
61 | true
62 | full
63 | false
64 | bin\iPhone\Debug
65 | DEBUG;ENABLE_TEST_CLOUD;
66 | prompt
67 | 4
68 | iPhone Developer
69 | true
70 | true
71 | true
72 | true
73 | true
74 | Entitlements.plist
75 | 32450
76 | SdkOnly
77 | ARMv7, ARM64
78 | HttpClientHandler
79 | x86
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 | ..\..\..\Source\InputMask\bin\Debug\InputMask.dll
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 | ViewController.cs
111 |
112 |
113 |
114 |
--------------------------------------------------------------------------------
/Source/InputMaskTests/InputMaskTests.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Debug
5 | iPhoneSimulator
6 | {6415D269-A04D-4B70-8ADA-56631BB22E14}
7 | {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
8 | Exe
9 | InputMaskTests
10 | InputMaskTests
11 | Resources
12 |
13 |
14 | true
15 | full
16 | false
17 | bin\iPhoneSimulator\Debug
18 | DEBUG;
19 | prompt
20 | 4
21 | iPhone Developer
22 | true
23 | true
24 | true
25 | true
26 | 42679
27 | None
28 | i386, x86_64
29 | HttpClientHandler
30 |
31 |
32 | pdbonly
33 | true
34 | bin\iPhone\Release
35 |
36 | prompt
37 | 4
38 | iPhone Developer
39 | true
40 | Entitlements.plist
41 | SdkOnly
42 | ARMv7, ARM64
43 | HttpClientHandler
44 |
45 |
46 | pdbonly
47 | true
48 | bin\iPhoneSimulator\Release
49 |
50 | prompt
51 | 4
52 | iPhone Developer
53 | true
54 | true
55 | None
56 | i386, x86_64
57 | HttpClientHandler
58 |
59 |
60 | true
61 | full
62 | false
63 | bin\iPhone\Debug
64 | DEBUG;
65 | prompt
66 | 4
67 | iPhone Developer
68 | true
69 | true
70 | true
71 | true
72 | true
73 | Entitlements.plist
74 | 53201
75 | SdkOnly
76 | ARMv7, ARM64
77 | HttpClientHandler
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 | {19BE37DD-82BA-4802-90AD-E32AFA1F6D56}
111 | InputMask
112 |
113 |
114 |
115 |
--------------------------------------------------------------------------------
/Source/InputMaskTests/Tests/YearACCase.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using InputMask.Classes.Model;
3 | using NUnit.Framework;
4 |
5 | namespace InputMaskTests.Tests
6 | {
7 | [TestFixture]
8 | public class YearACCase : MaskTestBase
9 | {
10 | public override string Format => "[9990] AC";
11 |
12 | [Test]
13 | public void TestInit_correctFormat_maskInitialized()
14 | {
15 | Assert.NotNull(CreateMask());
16 | }
17 |
18 | [Test]
19 | public void TestGetPlaceholder_allSet_returnsCorrectPlaceholder()
20 | {
21 | var placeholder = CreateMask().Placeholder();
22 |
23 | Assert.AreEqual(placeholder, "0000 AC");
24 | }
25 |
26 | [Test]
27 | public void TestAcceptableTextLength_allSet_returnsCorrectCount()
28 | {
29 | var acceptableTextLength = CreateMask().AcceptableTextLength();
30 |
31 | Assert.AreEqual(acceptableTextLength, 4);
32 | }
33 |
34 | [Test]
35 | public void TestTotalTextLength_allSet_returnsCorrectCount()
36 | {
37 | var totalTextLength = CreateMask().TotalTextLength();
38 |
39 | Assert.AreEqual(totalTextLength, 7);
40 | }
41 |
42 | [Test]
43 | public void TestAcceptableValueLength_allSet_returnsCorrectCount()
44 | {
45 | var acceptableValueLength = CreateMask().AcceptableValueLength();
46 |
47 | Assert.AreEqual(acceptableValueLength, 1);
48 | }
49 |
50 | [Test]
51 | public void TestTotalValueLength_allSet_returnsCorrectCount()
52 | {
53 | var totalValueLength = CreateMask().TotalValueLength();
54 |
55 | Assert.AreEqual(totalValueLength, 4);
56 | }
57 |
58 | [Test]
59 | public void TestApply_1_returns_1()
60 | {
61 | var inputString = "1";
62 | var inputCaret = inputString.Length;
63 |
64 | var expectedString = "1";
65 | var expectedCaret = expectedString.Length;
66 |
67 | var expectedValue = expectedString;
68 |
69 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
70 |
71 | Assert.AreEqual(expectedString, result.FormattedText.Content);
72 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
73 | Assert.AreEqual(expectedValue, result.ExtractedValue);
74 |
75 | Assert.AreEqual(false, result.Complete);
76 | }
77 |
78 | [Test]
79 | public void TestApply_11_returns_11()
80 | {
81 | var inputString = "11";
82 | var inputCaret = inputString.Length;
83 |
84 | var expectedString = "11";
85 | var expectedCaret = expectedString.Length;
86 |
87 | var expectedValue = expectedString;
88 |
89 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
90 |
91 | Assert.AreEqual(expectedString, result.FormattedText.Content);
92 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
93 | Assert.AreEqual(expectedValue, result.ExtractedValue);
94 |
95 | Assert.AreEqual(false, result.Complete);
96 | }
97 |
98 | [Test]
99 | public void TestApply_111_returns_111()
100 | {
101 | var inputString = "111";
102 | var inputCaret = inputString.Length;
103 |
104 | var expectedString = "111";
105 | var expectedCaret = expectedString.Length;
106 |
107 | var expectedValue = expectedString;
108 |
109 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
110 |
111 | Assert.AreEqual(expectedString, result.FormattedText.Content);
112 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
113 | Assert.AreEqual(expectedValue, result.ExtractedValue);
114 |
115 | Assert.AreEqual(false, result.Complete);
116 | }
117 |
118 | [Test]
119 | public void TestApply_1111_returns_1111()
120 | {
121 | var inputString = "1111";
122 | var inputCaret = inputString.Length;
123 |
124 | var expectedString = "1111";
125 | var expectedCaret = expectedString.Length;
126 |
127 | var expectedValue = expectedString;
128 |
129 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
130 |
131 | Assert.AreEqual(expectedString, result.FormattedText.Content);
132 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
133 | Assert.AreEqual(expectedValue, result.ExtractedValue);
134 |
135 | Assert.AreEqual(false, result.Complete);
136 | }
137 |
138 |
139 | [Test]
140 | public void TestApply_11112_returns_1111spaceAC()
141 | {
142 | var inputString = "11112";
143 | var inputCaret = inputString.Length;
144 |
145 | var expectedString = "1111 AC";
146 | var expectedCaret = expectedString.Length;
147 |
148 | var expectedValue = "1111";
149 |
150 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
151 |
152 | Assert.AreEqual(expectedString, result.FormattedText.Content);
153 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
154 | Assert.AreEqual(expectedValue, result.ExtractedValue);
155 |
156 | Assert.AreEqual(true, result.Complete);
157 | }
158 |
159 |
160 | [Test]
161 | public void TestApplyAutocomplete_1111_returns_1111spaceAC()
162 | {
163 | var inputString = "1111";
164 | var inputCaret = inputString.Length;
165 |
166 | var expectedString = "1111 AC";
167 | var expectedCaret = expectedString.Length;
168 |
169 | var expectedValue = "1111";
170 |
171 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret), true);
172 |
173 | Assert.AreEqual(expectedString, result.FormattedText.Content);
174 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
175 | Assert.AreEqual(expectedValue, result.ExtractedValue);
176 |
177 | Assert.AreEqual(true, result.Complete);
178 | }
179 | }
180 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | #OSX
2 | .DS_Store
3 | .DS_Store?
4 |
5 | # Build Folders (you can keep bin if you'd like, to store dlls and pdbs)
6 | [Bb]in/
7 | [Oo]bj/
8 |
9 | # mstest test results
10 | TestResults
11 |
12 | packages
13 |
14 | ## Ignore Visual Studio temporary files, build results, and
15 | ## files generated by popular Visual Studio add-ons.
16 | ##
17 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
18 |
19 | # User-specific files
20 | *.suo
21 | *.user
22 | *.userosscache
23 | *.sln.docstates
24 |
25 | # User-specific files (MonoDevelop/Xamarin Studio)
26 | *.userprefs
27 |
28 | # Build results
29 | [Dd]ebug/
30 | [Dd]ebugPublic/
31 | [Rr]elease/
32 | [Rr]eleases/
33 | x64/
34 | x86/
35 | bld/
36 | [Bb]in/
37 | [Oo]bj/
38 | [Ll]og/
39 |
40 | # Visual Studio 2015 cache/options directory
41 | .vs/
42 | # Uncomment if you have tasks that create the project's static files in wwwroot
43 | #wwwroot/
44 |
45 | # MSTest test Results
46 | [Tt]est[Rr]esult*/
47 | [Bb]uild[Ll]og.*
48 |
49 | # NUNIT
50 | *.VisualState.xml
51 | TestResult.xml
52 |
53 | # Build Results of an ATL Project
54 | [Dd]ebugPS/
55 | [Rr]eleasePS/
56 | dlldata.c
57 |
58 | # .NET Core
59 | project.lock.json
60 | project.fragment.lock.json
61 | artifacts/
62 | **/Properties/launchSettings.json
63 |
64 | *_i.c
65 | *_p.c
66 | *_i.h
67 | *.ilk
68 | *.meta
69 | *.obj
70 | *.pch
71 | *.pdb
72 | *.pgc
73 | *.pgd
74 | *.rsp
75 | *.sbr
76 | *.tlb
77 | *.tli
78 | *.tlh
79 | *.tmp
80 | *.tmp_proj
81 | *.log
82 | *.vspscc
83 | *.vssscc
84 | .builds
85 | *.pidb
86 | *.svclog
87 | *.scc
88 |
89 | # Chutzpah Test files
90 | _Chutzpah*
91 |
92 | # Visual C++ cache files
93 | ipch/
94 | *.aps
95 | *.ncb
96 | *.opendb
97 | *.opensdf
98 | *.sdf
99 | *.cachefile
100 | *.VC.db
101 | *.VC.VC.opendb
102 |
103 | # Visual Studio profiler
104 | *.psess
105 | *.vsp
106 | *.vspx
107 | *.sap
108 |
109 | # TFS 2012 Local Workspace
110 | $tf/
111 |
112 | # Guidance Automation Toolkit
113 | *.gpState
114 |
115 | # ReSharper is a .NET coding add-in
116 | _ReSharper*/
117 | *.[Rr]e[Ss]harper
118 | *.DotSettings.user
119 |
120 | # JustCode is a .NET coding add-in
121 | .JustCode
122 |
123 | # TeamCity is a build add-in
124 | _TeamCity*
125 |
126 | # DotCover is a Code Coverage Tool
127 | *.dotCover
128 |
129 | # Visual Studio code coverage results
130 | *.coverage
131 | *.coveragexml
132 |
133 | # NCrunch
134 | _NCrunch_*
135 | .*crunch*.local.xml
136 | nCrunchTemp_*
137 |
138 | # MightyMoose
139 | *.mm.*
140 | AutoTest.Net/
141 |
142 | # Web workbench (sass)
143 | .sass-cache/
144 |
145 | # Installshield output folder
146 | [Ee]xpress/
147 |
148 | # DocProject is a documentation generator add-in
149 | DocProject/buildhelp/
150 | DocProject/Help/*.HxT
151 | DocProject/Help/*.HxC
152 | DocProject/Help/*.hhc
153 | DocProject/Help/*.hhk
154 | DocProject/Help/*.hhp
155 | DocProject/Help/Html2
156 | DocProject/Help/html
157 |
158 | # Click-Once directory
159 | publish/
160 |
161 | # Publish Web Output
162 | *.[Pp]ublish.xml
163 | *.azurePubxml
164 | # TODO: Comment the next line if you want to checkin your web deploy settings
165 | # but database connection strings (with potential passwords) will be unencrypted
166 | *.pubxml
167 | *.publishproj
168 |
169 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
170 | # checkin your Azure Web App publish settings, but sensitive information contained
171 | # in these scripts will be unencrypted
172 | PublishScripts/
173 |
174 | # NuGet Packages
175 | *.nupkg
176 | # The packages folder can be ignored because of Package Restore
177 | **/packages/*
178 | # except build/, which is used as an MSBuild target.
179 | !**/packages/build/
180 | # Uncomment if necessary however generally it will be regenerated when needed
181 | #!**/packages/repositories.config
182 | # NuGet v3's project.json files produces more ignorable files
183 | *.nuget.props
184 | *.nuget.targets
185 |
186 | # Microsoft Azure Build Output
187 | csx/
188 | *.build.csdef
189 |
190 | # Microsoft Azure Emulator
191 | ecf/
192 | rcf/
193 |
194 | # Windows Store app package directories and files
195 | AppPackages/
196 | BundleArtifacts/
197 | Package.StoreAssociation.xml
198 | _pkginfo.txt
199 |
200 | # Visual Studio cache files
201 | # files ending in .cache can be ignored
202 | *.[Cc]ache
203 | # but keep track of directories ending in .cache
204 | !*.[Cc]ache/
205 |
206 | # Others
207 | ClientBin/
208 | ~$*
209 | *~
210 | *.dbmdl
211 | *.dbproj.schemaview
212 | *.jfm
213 | *.pfx
214 | *.publishsettings
215 | orleans.codegen.cs
216 |
217 | # Since there are multiple workflows, uncomment next line to ignore bower_components
218 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
219 | #bower_components/
220 |
221 | # RIA/Silverlight projects
222 | Generated_Code/
223 |
224 | # Backup & report files from converting an old project file
225 | # to a newer Visual Studio version. Backup files are not needed,
226 | # because we have git ;-)
227 | _UpgradeReport_Files/
228 | Backup*/
229 | UpgradeLog*.XML
230 | UpgradeLog*.htm
231 |
232 | # SQL Server files
233 | *.mdf
234 | *.ldf
235 | *.ndf
236 |
237 | # Business Intelligence projects
238 | *.rdl.data
239 | *.bim.layout
240 | *.bim_*.settings
241 |
242 | # Microsoft Fakes
243 | FakesAssemblies/
244 |
245 | # GhostDoc plugin setting file
246 | *.GhostDoc.xml
247 |
248 | # Node.js Tools for Visual Studio
249 | .ntvs_analysis.dat
250 | node_modules/
251 |
252 | # Typescript v1 declaration files
253 | typings/
254 |
255 | # Visual Studio 6 build log
256 | *.plg
257 |
258 | # Visual Studio 6 workspace options file
259 | *.opt
260 |
261 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
262 | *.vbw
263 |
264 | # Visual Studio LightSwitch build output
265 | **/*.HTMLClient/GeneratedArtifacts
266 | **/*.DesktopClient/GeneratedArtifacts
267 | **/*.DesktopClient/ModelManifest.xml
268 | **/*.Server/GeneratedArtifacts
269 | **/*.Server/ModelManifest.xml
270 | _Pvt_Extensions
271 |
272 | # Paket dependency manager
273 | .paket/paket.exe
274 | paket-files/
275 |
276 | # FAKE - F# Make
277 | .fake/
278 |
279 | # JetBrains Rider
280 | .idea/
281 | *.sln.iml
282 |
283 | # CodeRush
284 | .cr/
285 |
286 | # Python Tools for Visual Studio (PTVS)
287 | __pycache__/
288 | *.pyc
289 |
290 | # Cake - Uncomment if you are using it
291 | # tools/**
292 | # !tools/packages.config
293 |
294 | # Telerik's JustMock configuration file
295 | *.jmconfig
296 |
297 | # BizTalk build output
298 | *.btp.cs
299 | *.btm.cs
300 | *.odx.cs
301 | *.xsd.cs
302 |
--------------------------------------------------------------------------------
/Source/InputMask/Classes/Helper/FormatSanitizer.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using InputMask.Classes.Model;
5 |
6 | namespace InputMask.Classes.Helper
7 | {
8 | public class FormatSanitizer
9 | {
10 | public string Sanitize(string formatString)
11 | {
12 | CheckOpenBraces(formatString);
13 | var blocks = DivideBlocksWithMixedCharacters(GetFormatBlocks(formatString));
14 | return string.Join("", SortFormatBlocks(blocks));
15 | }
16 |
17 | private void CheckOpenBraces(string content)
18 | {
19 | var squareBraceOpen = false;
20 | var curlyBraceOpen = false;
21 |
22 | foreach (var character in content)
23 | {
24 | if ('[' == character)
25 | {
26 | if (squareBraceOpen)
27 | throw new WrongFormatException();
28 |
29 | squareBraceOpen = true;
30 | }
31 | if (']' == character)
32 | squareBraceOpen = false;
33 |
34 | if ('{' == character)
35 | {
36 | if (curlyBraceOpen)
37 | throw new WrongFormatException();
38 |
39 | curlyBraceOpen = true;
40 | }
41 | if ('}' == character)
42 | curlyBraceOpen = false;
43 | }
44 | }
45 |
46 | private List GetFormatBlocks(string content)
47 | {
48 | var blocks = new List();
49 | var currentBlock = string.Empty;
50 |
51 | foreach (var character in content)
52 | {
53 | if ('[' == character || '{' == character)
54 | {
55 | if (0 < currentBlock.Length)
56 | blocks.Add(currentBlock);
57 |
58 | currentBlock = string.Empty;
59 | }
60 |
61 | currentBlock += character;
62 |
63 | if (']' == character || '}' == character)
64 | {
65 | blocks.Add(currentBlock);
66 | currentBlock = string.Empty;
67 | }
68 | }
69 |
70 | if (!string.IsNullOrEmpty(currentBlock))
71 | blocks.Add(currentBlock);
72 |
73 | return blocks;
74 | }
75 |
76 | private List DivideBlocksWithMixedCharacters(List blocks)
77 | {
78 | var resultingBlocks = new List();
79 |
80 | foreach (var block in blocks)
81 | {
82 | if (block.StartsWith("[", StringComparison.InvariantCulture))
83 | {
84 | var blockBuffer = string.Empty;
85 | foreach (var blockCharacter in block)
86 | {
87 | if (blockCharacter == '[')
88 | {
89 | blockBuffer += blockCharacter;
90 | continue;
91 | }
92 | if (blockCharacter == ']')
93 | {
94 | blockBuffer += blockCharacter;
95 | resultingBlocks.Add(blockBuffer);
96 | break;
97 | }
98 |
99 | if (blockCharacter == '0' || blockCharacter == '9')
100 | {
101 | if (blockBuffer.Contains("A")
102 | || blockBuffer.Contains("a")
103 | || blockBuffer.Contains("-")
104 | || blockBuffer.Contains("_"))
105 | {
106 | blockBuffer += "]";
107 | resultingBlocks.Add(blockBuffer);
108 | blockBuffer = "[" + blockCharacter;
109 | continue;
110 | }
111 | }
112 |
113 | if (blockCharacter == 'A' || blockCharacter == 'a')
114 | {
115 | if (blockBuffer.Contains("0")
116 | || blockBuffer.Contains("9")
117 | || blockBuffer.Contains("-")
118 | || blockBuffer.Contains("_"))
119 | {
120 | blockBuffer += "]";
121 | resultingBlocks.Add(blockBuffer);
122 | blockBuffer = "[" + blockCharacter;
123 | continue;
124 | }
125 | }
126 |
127 | if (blockCharacter == '-' || blockCharacter == '_')
128 | {
129 | if (blockBuffer.Contains("0")
130 | || blockBuffer.Contains("9")
131 | || blockBuffer.Contains("A")
132 | || blockBuffer.Contains("a"))
133 | {
134 | blockBuffer += "]";
135 | resultingBlocks.Add(blockBuffer);
136 | blockBuffer = "[" + blockCharacter;
137 | continue;
138 | }
139 | }
140 |
141 | blockBuffer += blockCharacter;
142 | }
143 | }
144 | else
145 | {
146 | resultingBlocks.Add(block);
147 | }
148 | }
149 | return resultingBlocks;
150 | }
151 |
152 | public List SortFormatBlocks(List blocks)
153 | {
154 | var sortedBlocks = new List();
155 |
156 | foreach (var block in blocks)
157 | {
158 | string sortedBlock;
159 | if (block.StartsWith("[", StringComparison.InvariantCulture))
160 | {
161 | if (block.Contains("0") || block.Contains("9"))
162 | {
163 | sortedBlock = SortBlock(block);
164 | }
165 | else if (block.Contains("a") || block.Contains("A")){
166 | sortedBlock = SortBlock(block);
167 | }
168 | else
169 | {
170 | sortedBlock = string.Format("[{0}]", new String(block
171 | .Replace('[', char.MinValue)
172 | .Replace(']', char.MinValue)
173 | .Replace('_', 'A')
174 | .Replace('-', 'a')
175 | .OrderBy(c => c).ToArray()));
176 |
177 | sortedBlock = sortedBlock.Replace('A', '_').Replace('a', '-');
178 | }
179 | }
180 | else
181 | {
182 | sortedBlock = block;
183 | }
184 |
185 | sortedBlocks.Add(sortedBlock);
186 | }
187 |
188 | return sortedBlocks;
189 | }
190 |
191 | private string SortBlock(string block)
192 | {
193 | return string.Format("[{0}]", new String(block.Where(c => c != '[' && c != ']').OrderBy(c => c).ToArray()));
194 | }
195 | }
196 | }
197 |
--------------------------------------------------------------------------------
/Source/InputMask/Classes/View/MaskedTextFieldDelegate.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using Foundation;
3 | using InputMask.Classes.Model;
4 | using UIKit;
5 |
6 | namespace InputMask.Classes.View
7 | {
8 | public class MaskedTextFieldDelegate : UITextFieldDelegate, IUITextFieldDelegate
9 | {
10 | private string _maskFormat;
11 | private bool _autocomplete;
12 | private bool _autocompleteOnFocus;
13 |
14 | public Mask mask;
15 |
16 | private IMaskedTextFieldDelegateListener listener;
17 |
18 | public IMaskedTextFieldDelegateListener Listener
19 | {
20 | get { return listener; }
21 | set { listener = value; }
22 | }
23 |
24 | public string MaskFormat
25 | {
26 | get { return _maskFormat; }
27 | set
28 | {
29 | _maskFormat = value;
30 | mask = Mask.GetOrCreate(value);
31 | }
32 | }
33 |
34 | public bool AutoComplete
35 | {
36 | get
37 | {
38 | return _autocomplete;
39 | }
40 | set
41 | {
42 | _autocomplete = value;
43 | }
44 | }
45 |
46 | public bool AutoCompleteOnFocus
47 | {
48 | get
49 | {
50 | return _autocompleteOnFocus;
51 | }
52 | set
53 | {
54 | _autocompleteOnFocus = value;
55 | }
56 | }
57 |
58 | public MaskedTextFieldDelegate(string format)
59 | {
60 | _maskFormat = format;
61 | mask = Mask.GetOrCreate(format);
62 | _autocomplete = _autocompleteOnFocus = false;
63 | }
64 |
65 | public MaskedTextFieldDelegate() : this(string.Empty)
66 | {
67 | }
68 |
69 | public void Put(string text, UITextField field)
70 | {
71 | var result = mask.Apply(new CaretString(text, text.Length - 1), _autocomplete);
72 | field.Text = result.FormattedText.Content;
73 | var position = result.FormattedText.CaretPosition;
74 | SetCaretPosition(position, field);
75 | listener?.TextField(field, result.Complete, result.ExtractedValue);
76 | }
77 |
78 | public string Placeholder()
79 | {
80 |
81 | return mask.Placeholder();
82 | }
83 |
84 | public int AcceptableTextLength()
85 | {
86 | return mask.AcceptableTextLength();
87 | }
88 |
89 | public int TotalTextLength()
90 | {
91 | return mask.TotalTextLength();
92 | }
93 |
94 | public int AcceptableValueLength()
95 | {
96 | return mask.AcceptableValueLength();
97 | }
98 |
99 | public int TotalValueLength()
100 | {
101 | return mask.TotalValueLength();
102 | }
103 |
104 | public override bool ShouldChangeCharacters(UITextField textField, NSRange range, string replacementString)
105 | {
106 | string extractedValue;
107 | bool complete;
108 |
109 | if (IsDeletion(range, replacementString))
110 | {
111 | extractedValue = DeleteText(range, textField, out complete);
112 | }
113 | else
114 | {
115 | extractedValue = ModifyText(range, textField, replacementString, out complete);
116 | }
117 |
118 | listener.TextField(textField, complete, extractedValue);
119 | listener.ShouldChangeCharacters(textField, range, replacementString);
120 | return false;
121 | }
122 |
123 | public string DeleteText(NSRange range, UITextField field, out bool complete)
124 | {
125 | var text = ReplaceCharacters(field.Text, range, string.Empty);
126 | var result = mask.Apply(new CaretString(text, range.Location), false);
127 | field.Text = result.FormattedText.Content;
128 | SetCaretPosition(range.Location, field);
129 |
130 | complete = result.Complete;
131 | return result.ExtractedValue;
132 | }
133 |
134 | public string ModifyText(NSRange range, UITextField field, string content, out bool complete)
135 | {
136 | var updatedText = ReplaceCharacters(field.Text, range, content);
137 | var result = mask.Apply(new CaretString(updatedText, CaretPosition(field) + content.Length), AutoComplete);
138 |
139 | field.Text = result.FormattedText.Content;
140 |
141 | var position = result.FormattedText.CaretPosition;
142 | SetCaretPosition(position, field);
143 |
144 | complete = result.Complete;
145 | return result.ExtractedValue;
146 | }
147 |
148 | public void SelectionWillChange(IUITextInput uiTextInput)
149 | {
150 | var field = uiTextInput as UITextField;
151 | if (field != null)
152 | {
153 | field.ShouldBeginEditing(field);
154 | }
155 | }
156 |
157 | public void SelectionDidChange(IUITextInput uiTextInput)
158 | {
159 | var field = uiTextInput as UITextField;
160 | if (field != null)
161 | {
162 | listener.ShouldEndEditing(field);
163 | }
164 | }
165 |
166 | public void TextWillChange(IUITextInput textField)
167 | {
168 | var field = textField as UITextField;
169 | if (field != null)
170 | {
171 | if (AutoCompleteOnFocus && string.IsNullOrEmpty(textField.ToString()))
172 | {
173 | ShouldChangeCharacters(field, new NSRange(0, 0), string.Empty);
174 | }
175 | listener.EditingStarted(field);
176 | }
177 | }
178 |
179 | public void TextDidChange(IUITextInput textField)
180 | {
181 | var field = textField as UITextField;
182 | if (field != null)
183 | {
184 | listener.EditingEnded(field);
185 | }
186 | }
187 |
188 | public bool TextFieldShouldClear(UITextField textField)
189 | {
190 | var shouldClear = listener.ShouldClear(textField);
191 | if (shouldClear)
192 | {
193 | var result = mask.Apply(new CaretString(string.Empty, 0), AutoComplete);
194 | listener.TextField(textField, result.Complete, result.ExtractedValue);
195 | }
196 | return shouldClear;
197 | }
198 |
199 | public bool TextFieldShouldReturn(UITextField textField)
200 | {
201 | return listener.ShouldReturn(textField);
202 | }
203 |
204 | public bool IsDeletion(NSRange range, string content)
205 | {
206 | return range.Length > 0 && content.Length == 0;
207 | }
208 |
209 | public string ReplaceCharacters(string text, NSRange range, string newText)
210 | {
211 | if (text != null)
212 | {
213 | var strg = new NSString(text);
214 | var result = new NSMutableString();
215 | result.Append(strg);
216 | var newContent = new NSString(newText);
217 |
218 | if (range.Length > 0)
219 | {
220 | return result.Replace(range, newContent).ToString();
221 | }
222 | else
223 | {
224 | result.Insert(newContent, range.Location);
225 | return result;
226 | }
227 | }
228 | return string.Empty;
229 | }
230 |
231 | public nint CaretPosition(UITextField field)
232 | {
233 | if (!field.IsFirstResponder)
234 | return field.Text.Length;
235 |
236 | var range = field.SelectedTextRange;
237 | if (range != null)
238 | {
239 | var selectedTextLocation = range.Start;
240 | return field.GetOffsetFromPosition(field.BeginningOfDocument, selectedTextLocation);
241 | }
242 | return 0;
243 | }
244 |
245 | public void SetCaretPosition(nint position, UITextField field)
246 | {
247 | if (!field.IsFirstResponder)
248 | return;
249 |
250 | if (position > field.Text.Length)
251 | return;
252 |
253 | var from = field.GetPosition(field.BeginningOfDocument, position);
254 | var to = field.GetPosition(from, 0);
255 | field.SelectedTextRange = field.GetTextRange(from, to);
256 | }
257 | }
258 | }
259 |
--------------------------------------------------------------------------------
/Source/InputMask/Classes/Mask.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Diagnostics;
4 | using InputMask.Classes.Helper;
5 | using InputMask.Classes.Model;
6 | using InputMask.Classes.Model.States;
7 | using static InputMask.Classes.Model.States.ValueState;
8 |
9 | namespace InputMask.Classes
10 | {
11 | [DebuggerDisplay("{DebugDescription()}")]
12 | public class Mask
13 | {
14 | [DebuggerDisplay("{DebugDescription()}")]
15 | public class Result
16 | {
17 | public CaretString FormattedText;
18 | public string ExtractedValue;
19 | public int Affinity;
20 | public bool Complete;
21 |
22 | public string DebugDescription()
23 | {
24 | return $"FORMATTED TEXT: {FormattedText}) EXTRACTED VALUE: {ExtractedValue} AFFINITY: {Affinity} COMPLETE: {Complete}";
25 | }
26 | }
27 |
28 | private State initialState;
29 | private static Dictionary cache = new Dictionary();
30 |
31 | public Mask(string format)
32 | {
33 | initialState = new Compiler().Compile(format);
34 | }
35 |
36 | public static Mask GetOrCreate(string format)
37 | {
38 | Mask cachedMask;
39 | if (cache.TryGetValue(format, out cachedMask))
40 | return cachedMask;
41 |
42 | cachedMask = new Mask(format);
43 | cache.Add(format, cachedMask);
44 | return cachedMask;
45 | }
46 |
47 | public Result Apply(CaretString text, bool autocomplete = false)
48 | {
49 | var interator = new CaretStringIterator(text);
50 |
51 | var affinity= 0;
52 | var extractedValue = string.Empty;
53 | var modifiedString = string.Empty;
54 | var modifiedCaretPosition = text.CaretPosition;
55 |
56 | var state = initialState;
57 | var beforeCaret = interator.BeforeCaret();
58 | var character = interator.Next();
59 |
60 | while (character.HasValue)
61 | {
62 | var next = state.Accept(character.Value);
63 | if (next != null)
64 | {
65 | state = next.State;
66 | modifiedString += next.Insert != null ? new String(next.Insert.Value, 1) : string.Empty;
67 | extractedValue += next.Value != null ? new String(next.Value.Value, 1) : string.Empty;
68 |
69 | if (next.Pass)
70 | {
71 | beforeCaret = interator.BeforeCaret();
72 | character = interator.Next();
73 | affinity += 1;
74 | }
75 | else
76 | {
77 | if (beforeCaret && next.Insert != null)
78 | {
79 | modifiedCaretPosition += 1;
80 | }
81 | affinity -= 1;
82 | }
83 | }
84 | else
85 | {
86 | if (interator.BeforeCaret())
87 | {
88 | modifiedCaretPosition -= 1;
89 | }
90 | beforeCaret = interator.BeforeCaret();
91 | character = interator.Next();
92 | affinity -= 1;
93 | }
94 | }
95 |
96 | Next nextAC;
97 | while (autocomplete && beforeCaret && (nextAC = state.Autocomplete()) != null)
98 | {
99 | state = nextAC.State;
100 | modifiedString += nextAC.Insert.HasValue ? new string(nextAC.Insert.Value, 1) : string.Empty;
101 | extractedValue += nextAC.Value.HasValue ? new string(nextAC.Value.Value, 1) : string.Empty;
102 | if (nextAC.Insert.HasValue)
103 | {
104 | modifiedCaretPosition += 1;
105 | }
106 | }
107 |
108 | return new Result {
109 | FormattedText = new CaretString(modifiedString, modifiedCaretPosition),
110 | ExtractedValue = extractedValue,
111 | Affinity = affinity,
112 | Complete = NoMandatoryCharactersLeftAfterState(state)
113 | };
114 | }
115 |
116 | public string Placeholder()
117 | {
118 | return AppendPlaceHolder(initialState, string.Empty);
119 | }
120 |
121 | public int AcceptableTextLength()
122 | {
123 | var state = initialState;
124 | var length = 0;
125 |
126 | State s;
127 | while ((s = state) != null && !(state is EOLState))
128 | {
129 | if (s is FixedState || s is FreeState || s is ValueState)
130 | length++;
131 | state = s.Child;
132 | }
133 | return length;
134 | }
135 |
136 | public int TotalTextLength()
137 | {
138 | var state = initialState;
139 | var length = 0;
140 | while (!(state is EOLState))
141 | {
142 | if (state is FixedState || state is FreeState || state is ValueState || state is OptionalValueState)
143 | length++;
144 | state = state.Child;
145 | }
146 | return length;
147 | }
148 |
149 | public int AcceptableValueLength()
150 | {
151 | var state = initialState;
152 | var length = 0;
153 | while (!(state is EOLState))
154 | {
155 | if (state is FixedState || state is ValueState)
156 | length++;
157 | state = state.Child;
158 | }
159 | return length;
160 | }
161 |
162 | public int TotalValueLength()
163 | {
164 | var state = initialState;
165 | var length = 0;
166 | while (!(state is EOLState))
167 | {
168 | if (state is FixedState || state is ValueState || state is OptionalValueState)
169 | length++;
170 | state = state.Child;
171 | }
172 | return length;
173 | }
174 |
175 | public string AppendPlaceHolder(State state, string placeholder)
176 | {
177 | if (state == null)
178 | return placeholder;
179 |
180 | if (state is EOLState)
181 | return placeholder;
182 |
183 | if (state is FixedState)
184 | {
185 | var fixedState = state as FixedState;
186 | return AppendPlaceHolder(fixedState.Child, placeholder + fixedState.OwnCharacter);
187 | }
188 |
189 | if (state is FreeState)
190 | {
191 | var freeState = state as FreeState;
192 | return AppendPlaceHolder(freeState.Child, placeholder + freeState.OwnCharacter);
193 | }
194 |
195 | if (state is OptionalValueState)
196 | {
197 | var optState = state as OptionalValueState;
198 | switch (optState.Type)
199 | {
200 | case StateType.AlphaNumeric:
201 | return AppendPlaceHolder(optState.Child, placeholder + '-');
202 | case StateType.Literal:
203 | return AppendPlaceHolder(optState.Child, placeholder + 'a');
204 | case StateType.Numeric:
205 | return AppendPlaceHolder(optState.Child, placeholder + '0');
206 | default:
207 | break;
208 | }
209 | }
210 |
211 | if (state is ValueState)
212 | {
213 | var optState = state as ValueState;
214 | switch (optState.Type)
215 | {
216 | case StateType.AlphaNumeric:
217 | return AppendPlaceHolder(optState.Child, placeholder + '-');
218 | case StateType.Literal:
219 | return AppendPlaceHolder(optState.Child, placeholder + 'a');
220 | case StateType.Numeric:
221 | return AppendPlaceHolder(optState.Child, placeholder + '0');
222 | default:
223 | break;
224 | }
225 | }
226 |
227 | return placeholder;
228 | }
229 |
230 | public bool NoMandatoryCharactersLeftAfterState(State state)
231 | {
232 | if (state is EOLState)
233 | return true;
234 | else if (state is FixedState || state is FreeState || state is ValueState)
235 | return false;
236 | else
237 | return NoMandatoryCharactersLeftAfterState(state.NextState());
238 | }
239 |
240 | public virtual string DebugDescription()
241 | {
242 | return initialState.DebugDescription();
243 | }
244 | }
245 | }
246 |
--------------------------------------------------------------------------------
/Source/InputMaskTests/Tests/MonthYearDoubledoubleShashCase.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using InputMask.Classes.Model;
3 | using NUnit.Framework;
4 |
5 | namespace InputMaskTests.Tests
6 | {
7 | [TestFixture]
8 | public class MonthYearDoubledoubleShashCase : MaskTestBase
9 | {
10 | public override string Format => "[00]{//}[0000]";
11 |
12 | [Test]
13 | public void TestInit_correctFormat_maskInitialized()
14 | {
15 | Assert.NotNull(CreateMask());
16 | }
17 |
18 | [Test]
19 | public void TestGetPlaceholder_allSet_returnsCorrectPlaceholder()
20 | {
21 | var placeholder = CreateMask().Placeholder();
22 |
23 | Assert.AreEqual(placeholder, "00//0000");
24 | }
25 |
26 |
27 | [Test]
28 | public void TestAcceptableTextLength_allSet_returnsCorrectCount()
29 | {
30 | var acceptableTextLength = CreateMask().AcceptableTextLength();
31 |
32 | Assert.AreEqual(acceptableTextLength, 8);
33 | }
34 |
35 |
36 | [Test]
37 | public void TestTotalTextLength_allSet_returnsCorrectCount()
38 | {
39 | var totalTextLength = CreateMask().TotalTextLength();
40 |
41 | Assert.AreEqual(totalTextLength, 8);
42 |
43 | }
44 |
45 |
46 | [Test]
47 | public void TestAcceptableValueLength_allSet_returnsCorrectCount()
48 | {
49 | var acceptableValueLength = CreateMask().AcceptableValueLength();
50 |
51 | Assert.AreEqual(acceptableValueLength, 8);
52 | }
53 |
54 |
55 | [Test]
56 | public void TestTotalValueLength_allSet_returnsCorrectCount()
57 | {
58 | var totalValueLength = CreateMask().TotalValueLength();
59 |
60 | Assert.AreEqual(totalValueLength, 8);
61 | }
62 |
63 |
64 | [Test]
65 | public void TestApply_1_returns_1()
66 | {
67 | var inputString = "1";
68 | var inputCaret = inputString.Length;
69 |
70 |
71 | var expectedString = "1";
72 | var expectedCaret = expectedString.Length;
73 |
74 | var expectedValue = expectedString;
75 |
76 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
77 |
78 | Assert.AreEqual(expectedString, result.FormattedText.Content);
79 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
80 | Assert.AreEqual(expectedValue, result.ExtractedValue);
81 |
82 | Assert.AreEqual(false, result.Complete);
83 | }
84 |
85 |
86 | [Test]
87 | public void TestApply_11_returns_11()
88 | {
89 | var inputString = "11";
90 | var inputCaret = inputString.Length;
91 |
92 | var expectedString = "11";
93 | var expectedCaret = expectedString.Length;
94 |
95 | var expectedValue = expectedString;
96 |
97 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
98 |
99 | Assert.AreEqual(expectedString, result.FormattedText.Content);
100 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
101 | Assert.AreEqual(expectedValue, result.ExtractedValue);
102 |
103 | Assert.AreEqual(false, result.Complete);
104 | }
105 |
106 |
107 | [Test]
108 | public void TestApply_111_returns_11doubleShash1()
109 | {
110 | var inputString = "111";
111 | var inputCaret = inputString.Length;
112 |
113 | var expectedString = "11//1";
114 | var expectedCaret = expectedString.Length;
115 |
116 | var expectedValue = expectedString;
117 |
118 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
119 |
120 | Assert.AreEqual(expectedString, result.FormattedText.Content);
121 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
122 | Assert.AreEqual(expectedValue, result.ExtractedValue);
123 |
124 | Assert.AreEqual(false, result.Complete);
125 | }
126 |
127 |
128 | [Test]
129 | public void TestApply_1111_returns_11doubleShash11()
130 | {
131 | var inputString = "1111";
132 | var inputCaret = inputString.Length;
133 |
134 | var expectedString = "11//11";
135 | var expectedCaret = expectedString.Length;
136 |
137 | var expectedValue = expectedString;
138 |
139 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
140 |
141 | Assert.AreEqual(expectedString, result.FormattedText.Content);
142 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
143 | Assert.AreEqual(expectedValue, result.ExtractedValue);
144 |
145 | Assert.AreEqual(false, result.Complete);
146 | }
147 |
148 |
149 | [Test]
150 | public void TestApply_123456_returns_12doubleShash3456()
151 | {
152 | var inputString = "123456";
153 | var inputCaret = inputString.Length;
154 |
155 |
156 | var expectedString = "12//3456";
157 | var expectedCaret = expectedString.Length;
158 |
159 | var expectedValue = expectedString;
160 |
161 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
162 |
163 | Assert.AreEqual(expectedString, result.FormattedText.Content);
164 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
165 | Assert.AreEqual(expectedValue, result.ExtractedValue);
166 |
167 | Assert.AreEqual(true, result.Complete);
168 | }
169 |
170 |
171 | [Test]
172 | public void TestApply_12shash3_returns_12doubleShash3()
173 | {
174 | var inputString = "12/3";
175 | var inputCaret = inputString.Length;
176 |
177 | var expectedString = "12//3";
178 | var expectedCaret = expectedString.Length;
179 |
180 | var expectedValue = expectedString;
181 |
182 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
183 |
184 | Assert.AreEqual(expectedString, result.FormattedText.Content);
185 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
186 | Assert.AreEqual(expectedValue, result.ExtractedValue);
187 |
188 | Assert.AreEqual(false, result.Complete);
189 | }
190 |
191 |
192 | [Test]
193 | public void TestApply_12doubleShash3_returns_12doubleShash3()
194 | {
195 | var inputString = "12//3";
196 | var inputCaret = inputString.Length;
197 |
198 | var expectedString = "12//3";
199 | var expectedCaret = expectedString.Length;
200 |
201 | var expectedValue = expectedString;
202 |
203 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
204 |
205 | Assert.AreEqual(expectedString, result.FormattedText.Content);
206 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
207 | Assert.AreEqual(expectedValue, result.ExtractedValue);
208 |
209 | Assert.AreEqual(false, result.Complete);
210 | }
211 |
212 |
213 | [Test]
214 | public void TestApply_12shash34_returns_12doubleShash34()
215 | {
216 | var inputString = "12/34";
217 | var inputCaret = inputString.Length;
218 |
219 | var expectedString = "12//34";
220 | var expectedCaret = expectedString.Length;
221 |
222 | var expectedValue = expectedString;
223 |
224 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
225 |
226 | Assert.AreEqual(expectedString, result.FormattedText.Content);
227 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
228 | Assert.AreEqual(expectedValue, result.ExtractedValue);
229 |
230 | Assert.AreEqual(false, result.Complete);
231 | }
232 |
233 |
234 | [Test]
235 | public void TestApply_12doubleShash34_returns_12doubleShash34()
236 | {
237 | var inputString = "12//34";
238 | var inputCaret = inputString.Length;
239 |
240 | var expectedString = "12//34";
241 | var expectedCaret = expectedString.Length;
242 |
243 | var expectedValue = expectedString;
244 |
245 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
246 |
247 | Assert.AreEqual(expectedString, result.FormattedText.Content);
248 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
249 | Assert.AreEqual(expectedValue, result.ExtractedValue);
250 |
251 | Assert.AreEqual(false, result.Complete);
252 | }
253 |
254 |
255 | [Test]
256 | public void TestApply_12doubleShash345_returns_12doubleShash345()
257 | {
258 | var inputString = "12//345";
259 | var inputCaret = inputString.Length;
260 |
261 | var expectedString = "12//345";
262 | var expectedCaret = expectedString.Length;
263 |
264 | var expectedValue = expectedString;
265 |
266 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
267 |
268 | Assert.AreEqual(expectedString, result.FormattedText.Content);
269 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
270 | Assert.AreEqual(expectedValue, result.ExtractedValue);
271 |
272 | Assert.AreEqual(false, result.Complete);
273 | }
274 |
275 |
276 | [Test]
277 | public void TestApply_12doubleShash3456_returns_12doubleShash3456()
278 | {
279 | var inputString = "12//3456";
280 | var inputCaret = inputString.Length;
281 |
282 | var expectedString = "12//3456";
283 | var expectedCaret = expectedString.Length;
284 |
285 | var expectedValue = expectedString;
286 |
287 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
288 |
289 | Assert.AreEqual(expectedString, result.FormattedText.Content);
290 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
291 | Assert.AreEqual(expectedValue, result.ExtractedValue);
292 |
293 | Assert.AreEqual(true, result.Complete);
294 | }
295 |
296 |
297 | [Test]
298 | public void TestApply_1234567_returns_12doubleShash3456()
299 | {
300 | var inputString = "1234567";
301 | var inputCaret = inputString.Length;
302 |
303 | var expectedString = "12//3456";
304 | var expectedCaret = expectedString.Length;
305 |
306 | var expectedValue = expectedString;
307 |
308 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
309 |
310 | Assert.AreEqual(expectedString, result.FormattedText.Content);
311 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
312 | Assert.AreEqual(expectedValue, result.ExtractedValue);
313 |
314 | Assert.AreEqual(true, result.Complete);
315 | }
316 |
317 |
318 | [Test]
319 | public void TestApply_12345678_returns_12doubleShash3456()
320 | {
321 | var inputString = "12345678";
322 | var inputCaret = inputString.Length;
323 |
324 | var expectedString = "12//3456";
325 | var expectedCaret = expectedString.Length;
326 |
327 | var expectedValue = expectedString;
328 |
329 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
330 |
331 | Assert.AreEqual(expectedString, result.FormattedText.Content);
332 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
333 | Assert.AreEqual(expectedValue, result.ExtractedValue);
334 |
335 | Assert.AreEqual(true, result.Complete);
336 | }
337 |
338 |
339 | [Test]
340 | public void TestApply_1111_StartIndex_returns_11doubleShash11_StartIndex()
341 | {
342 | var inputString = "1111";
343 | var inputCaret = 0;
344 |
345 | var expectedString = "11//11";
346 | var expectedCaret = 0;
347 |
348 | var expectedValue = expectedString;
349 |
350 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
351 |
352 | Assert.AreEqual(expectedString, result.FormattedText.Content);
353 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
354 | Assert.AreEqual(expectedValue, result.ExtractedValue);
355 |
356 | Assert.AreEqual(false, result.Complete);
357 | }
358 |
359 |
360 | [Test]
361 | public void TestApply_1111_ThirdIndex_returns_11doubleShash11_FourthIndex()
362 | {
363 | var inputString = "1111";
364 | var inputCaret = 3;
365 |
366 | var expectedString = "11//11";
367 | var expectedCaret = 5;
368 |
369 | var expectedValue = expectedString;
370 |
371 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
372 |
373 | Assert.AreEqual(expectedString, result.FormattedText.Content);
374 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
375 | Assert.AreEqual(expectedValue, result.ExtractedValue);
376 |
377 | Assert.AreEqual(false, result.Complete);
378 | }
379 |
380 |
381 | [Test]
382 | public void TestApply_abc1111_returns_11doubleShash11()
383 | {
384 | var inputString = "abc1111";
385 | var inputCaret = inputString.Length;
386 |
387 | var expectedString = "11//11";
388 | var expectedCaret = expectedString.Length;
389 |
390 | var expectedValue = expectedString;
391 |
392 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
393 |
394 | Assert.AreEqual(expectedString, result.FormattedText.Content);
395 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
396 | Assert.AreEqual(expectedValue, result.ExtractedValue);
397 |
398 | Assert.AreEqual(false, result.Complete);
399 | }
400 |
401 |
402 | [Test]
403 | public void TestApply_abc1de111_returns_11doubleShash11()
404 | {
405 | var inputString = "abc1de111";
406 | var inputCaret = inputString.Length;
407 |
408 | var expectedString = "11//11";
409 | var expectedCaret = expectedString.Length;
410 |
411 | var expectedValue = expectedString;
412 |
413 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
414 |
415 | Assert.AreEqual(expectedString, result.FormattedText.Content);
416 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
417 | Assert.AreEqual(expectedValue, result.ExtractedValue);
418 |
419 | Assert.AreEqual(false, result.Complete);
420 | }
421 |
422 |
423 | [Test]
424 | public void TestApply_abc1de1fg11_returns_11doubleShash11()
425 | {
426 | var inputString = "abc1de1fg11";
427 | var inputCaret = inputString.Length;
428 |
429 | var expectedString = "11//11";
430 | var expectedCaret = expectedString.Length;
431 |
432 | var expectedValue = expectedString;
433 |
434 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
435 |
436 | Assert.AreEqual(expectedString, result.FormattedText.Content);
437 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
438 | Assert.AreEqual(expectedValue, result.ExtractedValue);
439 |
440 | Assert.AreEqual(false, result.Complete);
441 | }
442 |
443 | }
444 | }
445 |
--------------------------------------------------------------------------------
/Source/InputMaskTests/Tests/DayMonthYearCase.cs:
--------------------------------------------------------------------------------
1 | using InputMaskTests.Tests;
2 | using NUnit.Framework;
3 |
4 | namespace InputMaskTests.Tests
5 | {
6 | [TestFixture]
7 | public class DayMonthYearCase : MaskTestBase
8 | {
9 | public override string Format => "[00]{.}[00]{.}[0000]";
10 |
11 | [Test]
12 | public void TestInit_correctFormat_maskInitialized()
13 | {
14 | Assert.IsNotNull(CreateMask());
15 | }
16 |
17 | [Test]
18 | public void TestGetPlaceholder_allSet_returnsCorrectPlaceholder()
19 | {
20 | var placeholder = CreateMask().Placeholder();
21 | Assert.AreEqual(placeholder, "00.00.0000");
22 | }
23 |
24 | [Test]
25 | public void TestAcceptableTextLength_allSet_returnsCorrectCount()
26 | {
27 | var acceptableTextLength = CreateMask().AcceptableTextLength();
28 | Assert.AreEqual(acceptableTextLength, 10);
29 | }
30 |
31 | [Test]
32 | public void TestTotalTextLength_allSet_returnsCorrectCount()
33 | {
34 | var totalTextLength = CreateMask().TotalTextLength();
35 | Assert.AreEqual(totalTextLength, 10);
36 | }
37 |
38 | [Test]
39 | public void TestAcceptableValueLength_allSet_returnsCorrectCount()
40 | {
41 | var acceptableValueLength = CreateMask().AcceptableValueLength();
42 | Assert.AreEqual(acceptableValueLength, 10);
43 | }
44 |
45 | [Test]
46 | public void TestTotalValueLength_allSet_returnsCorrectCount()
47 | {
48 | var totalValueLength = CreateMask().TotalValueLength();
49 | Assert.AreEqual(totalValueLength, 10);
50 | }
51 |
52 | [Test]
53 | public void TestApply_1_returns_1()
54 | {
55 | var inputString = "1";
56 | var inputCaret = inputString.Length;
57 |
58 |
59 | var expectedString = "1";
60 | var expectedCaret = expectedString.Length;
61 | var expectedValue = expectedString;
62 |
63 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret));
64 |
65 | Assert.AreEqual(expectedString, result.FormattedText.Content);
66 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
67 | Assert.AreEqual(expectedValue, result.ExtractedValue);
68 |
69 | Assert.AreEqual(false, result.Complete);
70 | }
71 |
72 | [Test]
73 | public void TestApply_11_returns_11()
74 | {
75 | var inputString = "11";
76 | var inputCaret = inputString.Length;
77 |
78 |
79 | var expectedString = "11";
80 | var expectedCaret = expectedString.Length;
81 | var expectedValue = expectedString;
82 |
83 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret));
84 |
85 | Assert.AreEqual(expectedString, result.FormattedText.Content);
86 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
87 | Assert.AreEqual(expectedValue, result.ExtractedValue);
88 |
89 | Assert.AreEqual(false, result.Complete);
90 | }
91 |
92 | [Test]
93 | public void TestApply_111_returns_11dot1()
94 | {
95 | var inputString = "111";
96 | var inputCaret = inputString.Length;
97 |
98 |
99 | var expectedString = "11.1";
100 | var expectedCaret = expectedString.Length;
101 | var expectedValue = expectedString;
102 |
103 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret));
104 |
105 | Assert.AreEqual(expectedString, result.FormattedText.Content);
106 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
107 | Assert.AreEqual(expectedValue, result.ExtractedValue);
108 |
109 | Assert.AreEqual(false, result.Complete);
110 | }
111 |
112 | [Test]
113 | public void TestApply_1111_returns_11dot11()
114 | {
115 | var inputString = "1111";
116 | var inputCaret = inputString.Length;
117 |
118 |
119 | var expectedString = "11.11";
120 | var expectedCaret = expectedString.Length;
121 | var expectedValue = expectedString;
122 |
123 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret));
124 |
125 | Assert.AreEqual(expectedString, result.FormattedText.Content);
126 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
127 | Assert.AreEqual(expectedValue, result.ExtractedValue);
128 |
129 | Assert.AreEqual(false, result.Complete);
130 | }
131 |
132 | [Test]
133 | public void TestApply_123456_returns_12dot34dot56()
134 | {
135 | var inputString = "123456";
136 | var inputCaret = inputString.Length;
137 |
138 |
139 | var expectedString = "12.34.56";
140 | var expectedCaret = expectedString.Length;
141 | var expectedValue = expectedString;
142 |
143 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret));
144 |
145 | Assert.AreEqual(expectedString, result.FormattedText.Content);
146 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
147 | Assert.AreEqual(expectedValue, result.ExtractedValue);
148 |
149 | Assert.AreEqual(false, result.Complete);
150 | }
151 |
152 | [Test]
153 | public void TestApply_12dot3_returns_12dot3()
154 | {
155 | var inputString = "12.3";
156 | var inputCaret = inputString.Length;
157 |
158 |
159 | var expectedString = "12.3";
160 | var expectedCaret = expectedString.Length;
161 | var expectedValue = expectedString;
162 |
163 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret));
164 |
165 | Assert.AreEqual(expectedString, result.FormattedText.Content);
166 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
167 | Assert.AreEqual(expectedValue, result.ExtractedValue);
168 |
169 | Assert.AreEqual(false, result.Complete);
170 | }
171 |
172 | [Test]
173 | public void TestApply_12dot34_returns_12dot34()
174 | {
175 | var inputString = "12.34";
176 | var inputCaret = inputString.Length;
177 |
178 |
179 | var expectedString = "12.34";
180 | var expectedCaret = expectedString.Length;
181 | var expectedValue = expectedString;
182 |
183 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret));
184 |
185 | Assert.AreEqual(expectedString, result.FormattedText.Content);
186 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
187 | Assert.AreEqual(expectedValue, result.ExtractedValue);
188 |
189 | Assert.AreEqual(false, result.Complete);
190 | }
191 |
192 | [Test]
193 | public void TestApply_12dot34dot5_returns_12dot34dot5()
194 | {
195 | var inputString = "12.34.5";
196 | var inputCaret = inputString.Length;
197 |
198 |
199 | var expectedString = "12.34.5";
200 | var expectedCaret = expectedString.Length;
201 | var expectedValue = expectedString;
202 |
203 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret));
204 |
205 | Assert.AreEqual(expectedString, result.FormattedText.Content);
206 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
207 | Assert.AreEqual(expectedValue, result.ExtractedValue);
208 |
209 | Assert.AreEqual(false, result.Complete);
210 | }
211 |
212 |
213 | [Test]
214 | public void TestApply_12dot34dot56_returns_12dot34dot56()
215 | {
216 | var inputString = "12.34.56";
217 | var inputCaret = inputString.Length;
218 |
219 |
220 | var expectedString = "12.34.56";
221 | var expectedCaret = expectedString.Length;
222 | var expectedValue = expectedString;
223 |
224 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret));
225 |
226 | Assert.AreEqual(expectedString, result.FormattedText.Content);
227 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
228 | Assert.AreEqual(expectedValue, result.ExtractedValue);
229 |
230 | Assert.AreEqual(false, result.Complete);
231 | }
232 |
233 | [Test]
234 | public void TestApply_1234567_returns_12dot34dot567()
235 | {
236 | var inputString = "1234567";
237 | var inputCaret = inputString.Length;
238 |
239 | var expectedString = "12.34.567";
240 | var expectedCaret = expectedString.Length;
241 | var expectedValue = expectedString;
242 |
243 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret));
244 |
245 | Assert.AreEqual(expectedString, result.FormattedText.Content);
246 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
247 | Assert.AreEqual(expectedValue, result.ExtractedValue);
248 | Assert.AreEqual(false, result.Complete);
249 | }
250 |
251 |
252 | [Test]
253 | public void TestApply_12345678_returns_12dot34dot5678()
254 | {
255 | var inputString = "12345678";
256 | var inputCaret = inputString.Length;
257 |
258 |
259 | var expectedString = "12.34.5678";
260 | var expectedCaret = expectedString.Length;
261 | var expectedValue = expectedString;
262 |
263 |
264 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret));
265 |
266 | Assert.AreEqual(expectedString, result.FormattedText.Content);
267 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
268 | Assert.AreEqual(expectedValue, result.ExtractedValue);
269 |
270 | Assert.AreEqual(true, result.Complete);
271 | }
272 |
273 |
274 | [Test]
275 | public void TestApply_1111_StartIndex_returns_11dot11_StartIndex()
276 | {
277 | var inputString = "1111";
278 | var inputCaret = 0;
279 |
280 |
281 | var expectedString = "11.11";
282 | var expectedCaret = 0;
283 | var expectedValue = expectedString;
284 |
285 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret));
286 |
287 | Assert.AreEqual(expectedString, result.FormattedText.Content);
288 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
289 | Assert.AreEqual(expectedValue, result.ExtractedValue);
290 |
291 | Assert.AreEqual(false, result.Complete);
292 | }
293 |
294 |
295 | [Test]
296 | public void TestApply_1111_ThirdIndex_returns_11dot11_FourthIndex()
297 | {
298 | var inputString = "1111";
299 |
300 | var inputCaret = 3;
301 |
302 |
303 | var expectedString = "11.11";
304 | var expectedCaret = 4;
305 | var expectedValue = expectedString;
306 |
307 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret));
308 |
309 | Assert.AreEqual(expectedString, result.FormattedText.Content);
310 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
311 | Assert.AreEqual(expectedValue, result.ExtractedValue);
312 |
313 | Assert.AreEqual(false, result.Complete);
314 | }
315 |
316 |
317 | [Test]
318 | public void TestApply_abc1111_returns_11dot11()
319 | {
320 | var inputString = "abc1111";
321 | var inputCaret = inputString.Length;
322 |
323 |
324 | var expectedString = "11.11";
325 | var expectedCaret = expectedString.Length;
326 | var expectedValue = expectedString;
327 |
328 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret));
329 |
330 | Assert.AreEqual(expectedString, result.FormattedText.Content);
331 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
332 | Assert.AreEqual(expectedValue, result.ExtractedValue);
333 |
334 | Assert.AreEqual(false, result.Complete);
335 | }
336 |
337 |
338 | [Test]
339 | public void TestApply_abc1de111_returns_11dot11()
340 | {
341 | var inputString = "abc1de111";
342 | var inputCaret = inputString.Length;
343 |
344 |
345 | var expectedString = "11.11";
346 | var expectedCaret = expectedString.Length;
347 | var expectedValue = expectedString;
348 |
349 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret));
350 |
351 | Assert.AreEqual(expectedString, result.FormattedText.Content);
352 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
353 | Assert.AreEqual(expectedValue, result.ExtractedValue);
354 |
355 | Assert.AreEqual(false, result.Complete);
356 | }
357 |
358 |
359 | [Test]
360 | public void TestApply_abc1de1fg11_returns_11dot11()
361 | {
362 | var inputString = "abc1de1fg11";
363 | var inputCaret = inputString.Length;
364 |
365 |
366 | var expectedString = "11.11";
367 | var expectedCaret = expectedString.Length;
368 | var expectedValue = expectedString;
369 |
370 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret));
371 |
372 | Assert.AreEqual(expectedString, result.FormattedText.Content);
373 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
374 | Assert.AreEqual(expectedValue, result.ExtractedValue);
375 |
376 | Assert.AreEqual(false, result.Complete);
377 | }
378 |
379 |
380 | [Test]
381 | public void TestApplyAutocomplete_empty_returns_empty()
382 | {
383 | var inputString = "";
384 | var inputCaret = inputString.Length;
385 |
386 |
387 | var expectedString = "";
388 | var expectedCaret = expectedString.Length;
389 | var expectedValue = expectedString;
390 |
391 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret), true);
392 |
393 | Assert.AreEqual(expectedString, result.FormattedText.Content);
394 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
395 | Assert.AreEqual(expectedValue, result.ExtractedValue);
396 |
397 | Assert.AreEqual(false, result.Complete);
398 | }
399 |
400 |
401 | [Test]
402 | public void TestApplyAutocomplete_1_returns_1()
403 | {
404 | var inputString = "1";
405 | var inputCaret = inputString.Length;
406 |
407 | var expectedString = "1";
408 | var expectedCaret = expectedString.Length;
409 | var expectedValue = expectedString;
410 |
411 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret), true);
412 |
413 | Assert.AreEqual(expectedString, result.FormattedText.Content);
414 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
415 | Assert.AreEqual(expectedValue, result.ExtractedValue);
416 |
417 | Assert.AreEqual(false, result.Complete);
418 | }
419 |
420 |
421 | [Test]
422 | public void TestApplyAutocomplete_11_returns_11dot()
423 | {
424 | var inputString = "11";
425 | var inputCaret = inputString.Length;
426 |
427 | var expectedString = "11.";
428 | var expectedCaret = expectedString.Length;
429 | var expectedValue = expectedString;
430 |
431 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret), true);
432 |
433 | Assert.AreEqual(expectedString, result.FormattedText.Content);
434 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
435 | Assert.AreEqual(expectedValue, result.ExtractedValue);
436 |
437 | Assert.AreEqual(false, result.Complete);
438 | }
439 |
440 |
441 | [Test]
442 | public void TestApplyAutocomplete_111_returns_11dot1()
443 | {
444 | var inputString = "111";
445 | var inputCaret = inputString.Length;
446 |
447 | var expectedString = "11.1";
448 | var expectedCaret = expectedString.Length;
449 | var expectedValue = expectedString;
450 |
451 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret), true);
452 |
453 | Assert.AreEqual(expectedString, result.FormattedText.Content);
454 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
455 | Assert.AreEqual(expectedValue, result.ExtractedValue);
456 |
457 | Assert.AreEqual(false, result.Complete);
458 | }
459 |
460 |
461 | [Test]
462 | public void TestApplyAutocomplete_1111_returns_11dot11dot()
463 | {
464 | var inputString = "1111";
465 | var inputCaret = inputString.Length;
466 |
467 | var expectedString = "11.11.";
468 | var expectedCaret = expectedString.Length;
469 | var expectedValue = expectedString;
470 |
471 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret), true);
472 |
473 | Assert.AreEqual(expectedString, result.FormattedText.Content);
474 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
475 | Assert.AreEqual(expectedValue, result.ExtractedValue);
476 |
477 | Assert.AreEqual(false, result.Complete);
478 | }
479 |
480 |
481 | [Test]
482 | public void TestApplyAutocomplete_11111_returns_11dot11dot1()
483 | {
484 | var inputString = "11111";
485 | var inputCaret = inputString.Length;
486 |
487 | var expectedString = "11.11.1";
488 | var expectedCaret = expectedString.Length;
489 | var expectedValue = expectedString;
490 |
491 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret), true);
492 |
493 | Assert.AreEqual(expectedString, result.FormattedText.Content);
494 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
495 | Assert.AreEqual(expectedValue, result.ExtractedValue);
496 |
497 | Assert.AreEqual(false, result.Complete);
498 | }
499 |
500 |
501 | [Test]
502 | public void TestApplyAutocomplete_111111_returns_11dot11dot11()
503 | {
504 | var inputString = "111111";
505 | var inputCaret = inputString.Length;
506 |
507 | var expectedString = "11.11.11";
508 | var expectedCaret = expectedString.Length;
509 | var expectedValue = expectedString;
510 |
511 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret), true);
512 |
513 | Assert.AreEqual(expectedString, result.FormattedText.Content);
514 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
515 | Assert.AreEqual(expectedValue, result.ExtractedValue);
516 |
517 | Assert.AreEqual(false, result.Complete);
518 | }
519 |
520 |
521 | [Test]
522 | public void TestApplyAutocomplete_1111111_returns_11dot11dot111()
523 | {
524 | var inputString = "1111111";
525 | var inputCaret = inputString.Length;
526 |
527 | var expectedString = "11.11.111";
528 | var expectedCaret = expectedString.Length;
529 | var expectedValue = expectedString;
530 |
531 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret), true);
532 |
533 | Assert.AreEqual(expectedString, result.FormattedText.Content);
534 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
535 | Assert.AreEqual(expectedValue, result.ExtractedValue);
536 |
537 | Assert.AreEqual(false, result.Complete);
538 | }
539 |
540 |
541 | [Test]
542 | public void TestApplyAutocomplete_11111111_returns_11dot11dot1111()
543 | {
544 | var inputString = "11111111";
545 | var inputCaret = inputString.Length;
546 |
547 | var expectedString = "11.11.1111";
548 | var expectedCaret = expectedString.Length;
549 | var expectedValue = expectedString;
550 |
551 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret), true);
552 |
553 | Assert.AreEqual(expectedString, result.FormattedText.Content);
554 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
555 | Assert.AreEqual(expectedValue, result.ExtractedValue);
556 |
557 | Assert.AreEqual(true, result.Complete);
558 | }
559 |
560 |
561 | [Test]
562 | public void TestApplyAutocomplete_111111111_returns_11dot11dot1111()
563 | {
564 | var inputString = "111111111";
565 | var inputCaret = inputString.Length;
566 |
567 | var expectedString = "11.11.1111";
568 | var expectedCaret = expectedString.Length;
569 | var expectedValue = expectedString;
570 |
571 | var result = CreateMask().Apply(new InputMask.Classes.Model.CaretString(inputString, inputCaret), true);
572 |
573 | Assert.AreEqual(expectedString, result.FormattedText.Content);
574 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
575 | Assert.AreEqual(expectedValue, result.ExtractedValue);
576 |
577 | Assert.AreEqual(true, result.Complete);
578 | }
579 | }
580 | }
--------------------------------------------------------------------------------
/Source/InputMaskTests/Tests/DayMonthYearShortCase.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using InputMask.Classes.Model;
3 | using NUnit.Framework;
4 |
5 | namespace InputMaskTests.Tests
6 | {
7 | [TestFixture]
8 | public class DayMonthYearShortCase : MaskTestBase
9 | {
10 | public override string Format => "[90]{.}[90]{.}[0000]";
11 |
12 | [Test]
13 | public void testInit_correctFormat_maskInitialized()
14 | {
15 | Assert.NotNull(CreateMask());
16 | }
17 |
18 | [Test]
19 | public void testGetPlaceholder_allSet_returnsCorrectPlaceholder()
20 | {
21 | var placeholder = CreateMask().Placeholder();
22 | Assert.AreEqual(placeholder, "00.00.0000");
23 | }
24 |
25 | [Test]
26 | public void testAcceptableTextLength_allSet_returnsCorrectCount()
27 | {
28 | var acceptableTextLength = CreateMask().AcceptableTextLength();
29 | Assert.AreEqual(acceptableTextLength, 8);
30 | }
31 |
32 | [Test]
33 | public void testTotalTextLength_allSet_returnsCorrectCount()
34 | {
35 | var totalTextLength = CreateMask().TotalTextLength();
36 | Assert.AreEqual(totalTextLength, 10);
37 | }
38 |
39 | [Test]
40 | public void testAcceptableValueLength_allSet_returnsCorrectCount()
41 | {
42 | var acceptableValueLength = CreateMask().AcceptableValueLength();
43 | Assert.AreEqual(acceptableValueLength, 8);
44 | }
45 |
46 | [Test]
47 | public void testTotalValueLength_allSet_returnsCorrectCount()
48 | {
49 | var totalValueLength = CreateMask().TotalValueLength();
50 | Assert.AreEqual(totalValueLength, 10);
51 | }
52 |
53 | [Test]
54 | public void TestApply_1_returns_1()
55 | {
56 | var inputString = "1";
57 | var inputCaret = inputString.Length;
58 |
59 | var expectedString = "1";
60 | var expectedCaret = expectedString.Length;
61 |
62 | var expectedValue = "1";
63 |
64 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
65 |
66 | Assert.AreEqual(expectedString, result.FormattedText.Content); Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition); Assert.AreEqual(expectedValue, result.ExtractedValue);
67 |
68 | Assert.AreEqual(1, result.Affinity); Assert.AreEqual(false, result.Complete);
69 | }
70 |
71 |
72 | [Test]
73 | public void TestApply_11_returns_11()
74 | {
75 | var inputString = "11";
76 | var inputCaret = inputString.Length;
77 |
78 | var expectedString = "11";
79 | var expectedCaret = expectedString.Length;
80 |
81 | var expectedValue = "11";
82 |
83 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
84 |
85 | Assert.AreEqual(expectedString, result.FormattedText.Content);
86 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition); Assert.AreEqual(expectedValue, result.ExtractedValue);
87 |
88 | Assert.AreEqual(2, result.Affinity); Assert.AreEqual(false, result.Complete);
89 | }
90 |
91 |
92 | [Test]
93 | public void TestApply_111_returns_11dot1()
94 | {
95 | var inputString = "111";
96 | var inputCaret = inputString.Length;
97 |
98 | var expectedString = "11.1";
99 | var expectedCaret = expectedString.Length;
100 |
101 | var expectedValue = "11.1";
102 |
103 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
104 |
105 | Assert.AreEqual(expectedString, result.FormattedText.Content);
106 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
107 | Assert.AreEqual(expectedValue, result.ExtractedValue);
108 |
109 | Assert.AreEqual(2, result.Affinity);
110 | Assert.AreEqual(false, result.Complete);
111 | }
112 |
113 |
114 | [Test]
115 | public void TestApply_1111_returns_11dot11()
116 | {
117 | var inputString = "1111";
118 | var inputCaret = inputString.Length;
119 |
120 | var expectedString = "11.11";
121 | var expectedCaret = expectedString.Length;
122 |
123 | var expectedValue = "11.11";
124 |
125 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
126 |
127 | Assert.AreEqual(expectedString, result.FormattedText.Content);
128 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
129 | Assert.AreEqual(expectedValue, result.ExtractedValue);
130 |
131 | Assert.AreEqual(3, result.Affinity);
132 | Assert.AreEqual(false, result.Complete);
133 | }
134 |
135 |
136 | [Test]
137 | public void TestApply_123456_returns_12dot34dot56()
138 | {
139 | var inputString = "123456";
140 | var inputCaret = inputString.Length;
141 |
142 | var expectedString = "12.34.56";
143 | var expectedCaret = expectedString.Length;
144 |
145 | var expectedValue = "12.34.56";
146 |
147 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
148 |
149 | Assert.AreEqual(expectedString, result.FormattedText.Content);
150 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
151 | Assert.AreEqual(expectedValue, result.ExtractedValue);
152 |
153 | Assert.AreEqual(4, result.Affinity);
154 | Assert.AreEqual(false, result.Complete);
155 | }
156 |
157 |
158 | [Test]
159 | public void TestApply_12dot3_returns_12dot3()
160 | {
161 | var inputString = "12.3";
162 | var inputCaret = inputString.Length;
163 |
164 | var expectedString = "12.3";
165 | var expectedCaret = expectedString.Length;
166 |
167 | var expectedValue = "12.3";
168 |
169 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
170 |
171 | Assert.AreEqual(expectedString, result.FormattedText.Content);
172 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
173 | Assert.AreEqual(expectedValue, result.ExtractedValue);
174 |
175 | Assert.AreEqual(4, result.Affinity);
176 | Assert.AreEqual(false, result.Complete);
177 | }
178 |
179 |
180 | [Test]
181 | public void TestApply_12dot34_returns_12dot34()
182 | {
183 | var inputString = "12.34";
184 | var inputCaret = inputString.Length;
185 |
186 | var expectedString = "12.34";
187 | var expectedCaret = expectedString.Length;
188 |
189 | var expectedValue = "12.34";
190 |
191 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
192 |
193 | Assert.AreEqual(expectedString, result.FormattedText.Content);
194 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
195 | Assert.AreEqual(expectedValue, result.ExtractedValue);
196 |
197 | Assert.AreEqual(5, result.Affinity);
198 | Assert.AreEqual(false, result.Complete);
199 | }
200 |
201 |
202 | [Test]
203 | public void TestApply_12dot34dot5_returns_12dot34dot5()
204 | {
205 | var inputString = "12.34.5";
206 | var inputCaret = inputString.Length;
207 |
208 | var expectedString = "12.34.5";
209 | var expectedCaret = expectedString.Length;
210 |
211 | var expectedValue = "12.34.5";
212 |
213 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
214 |
215 | Assert.AreEqual(expectedString, result.FormattedText.Content);
216 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
217 | Assert.AreEqual(expectedValue, result.ExtractedValue);
218 |
219 | Assert.AreEqual(7, result.Affinity);
220 | Assert.AreEqual(false, result.Complete);
221 | }
222 |
223 |
224 | [Test]
225 | public void TestApply_12dot34dot56_returns_12dot34dot56()
226 | {
227 | var inputString = "12.34.56";
228 | var inputCaret = inputString.Length;
229 |
230 | var expectedString = "12.34.56";
231 | var expectedCaret = expectedString.Length;
232 |
233 | var expectedValue = "12.34.56";
234 |
235 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
236 |
237 | Assert.AreEqual(expectedString, result.FormattedText.Content);
238 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
239 | Assert.AreEqual(expectedValue, result.ExtractedValue);
240 |
241 | Assert.AreEqual(8, result.Affinity);
242 | Assert.AreEqual(false, result.Complete);
243 | }
244 |
245 |
246 | [Test]
247 | public void TestApply_1234567_returns_12dot34dot567()
248 | {
249 | var inputString = "1234567";
250 | var inputCaret = inputString.Length;
251 |
252 | var expectedString = "12.34.567";
253 | var expectedCaret = expectedString.Length;
254 |
255 | var expectedValue = "12.34.567";
256 |
257 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
258 |
259 | Assert.AreEqual(expectedString, result.FormattedText.Content);
260 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
261 | Assert.AreEqual(expectedValue, result.ExtractedValue);
262 |
263 | Assert.AreEqual(5, result.Affinity);
264 | Assert.AreEqual(false, result.Complete);
265 | }
266 |
267 |
268 | [Test]
269 | public void TestApply_12345678_returns_12dot34dot5678()
270 | {
271 | var inputString = "12345678";
272 | var inputCaret = inputString.Length;
273 |
274 |
275 | var expectedString = "12.34.5678";
276 | var expectedCaret = expectedString.Length;
277 |
278 | var expectedValue = "12.34.5678";
279 |
280 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
281 |
282 | Assert.AreEqual(expectedString, result.FormattedText.Content);
283 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
284 | Assert.AreEqual(expectedValue, result.ExtractedValue);
285 |
286 | Assert.AreEqual(6, result.Affinity);
287 | Assert.AreEqual(true, result.Complete);
288 | }
289 |
290 |
291 | [Test]
292 | public void TestApply_1111_StartIndex_returns_11dot11_StartIndex()
293 | {
294 | var inputString = "1111";
295 | var inputCaret = 0;
296 |
297 | var expectedString = "11.11";
298 | var expectedCaret = 0;
299 |
300 | var expectedValue = "11.11";
301 |
302 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
303 |
304 | Assert.AreEqual(expectedString, result.FormattedText.Content);
305 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
306 | Assert.AreEqual(expectedValue, result.ExtractedValue);
307 |
308 | Assert.AreEqual(3, result.Affinity);
309 | Assert.AreEqual(false, result.Complete);
310 | }
311 |
312 |
313 | [Test]
314 | public void TestApply_1111_ThirdIndex_returns_11dot11_FourthIndex()
315 | {
316 | var inputString = "1111";
317 | var inputCaret = 3;
318 |
319 | var expectedString = "11.11";
320 | var expectedCaret = 4;
321 |
322 | var expectedValue = "11.11";
323 |
324 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
325 |
326 | Assert.AreEqual(expectedString, result.FormattedText.Content);
327 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
328 | Assert.AreEqual(expectedValue, result.ExtractedValue);
329 |
330 | Assert.AreEqual(3, result.Affinity);
331 | Assert.AreEqual(false, result.Complete);
332 | }
333 |
334 |
335 | [Test]
336 | public void TestApply_abc1111_returns_11dot11()
337 | {
338 | var inputString = "abc1111";
339 | var inputCaret = inputString.Length;
340 |
341 | var expectedString = "11.11";
342 | var expectedCaret = expectedString.Length;
343 |
344 | var expectedValue = "11.11";
345 |
346 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
347 |
348 | Assert.AreEqual(expectedString, result.FormattedText.Content);
349 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
350 | Assert.AreEqual(expectedValue, result.ExtractedValue);
351 |
352 | Assert.AreEqual(0, result.Affinity);
353 | Assert.AreEqual(false, result.Complete);
354 | }
355 |
356 |
357 | [Test]
358 | public void TestApply_abc1de111_returns_11dot11()
359 | {
360 | var inputString = "abc1de111";
361 | var inputCaret = inputString.Length;
362 |
363 | var expectedString = "1.11.1";
364 | var expectedCaret = expectedString.Length;
365 |
366 | var expectedValue = "1.11.1";
367 |
368 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
369 |
370 | Assert.AreEqual(expectedString, result.FormattedText.Content);
371 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
372 | Assert.AreEqual(expectedValue, result.ExtractedValue);
373 |
374 | Assert.AreEqual(-4, result.Affinity);
375 | Assert.AreEqual(false, result.Complete);
376 | }
377 |
378 |
379 | [Test]
380 | public void TestApply_abc1de1fg11_returns_11dot11()
381 | {
382 | var inputString = "abc1de1fg11";
383 | var inputCaret = inputString.Length;
384 |
385 | var expectedString = "1.1.11";
386 | var expectedCaret = expectedString.Length;
387 |
388 | var expectedValue = "1.1.11";
389 |
390 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
391 |
392 | Assert.AreEqual(expectedString, result.FormattedText.Content);
393 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
394 | Assert.AreEqual(expectedValue, result.ExtractedValue);
395 |
396 | Assert.AreEqual(-7, result.Affinity);
397 | Assert.AreEqual(false, result.Complete);
398 | }
399 |
400 |
401 | [Test]
402 | public void TestApply_a_returns_empty()
403 | {
404 | var inputString = "a";
405 | var inputCaret = inputString.Length;
406 |
407 | var expectedString = "";
408 | var expectedCaret = expectedString.Length;
409 |
410 | var expectedValue = expectedString;
411 |
412 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
413 |
414 | Assert.AreEqual(expectedString, result.FormattedText.Content);
415 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
416 | Assert.AreEqual(expectedValue, result.ExtractedValue);
417 |
418 | Assert.AreEqual(-1, result.Affinity);
419 | Assert.AreEqual(false, result.Complete);
420 | }
421 |
422 |
423 | [Test]
424 | public void TestApplyAutocomplete_empty_returns_empty()
425 | {
426 | var inputString = "";
427 | var inputCaret = inputString.Length;
428 |
429 | var expectedString = "";
430 | var expectedCaret = expectedString.Length;
431 |
432 | var expectedValue = "";
433 |
434 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret), true);
435 |
436 | Assert.AreEqual(expectedString, result.FormattedText.Content);
437 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
438 | Assert.AreEqual(expectedValue, result.ExtractedValue);
439 |
440 | Assert.AreEqual(0, result.Affinity);
441 | Assert.AreEqual(false, result.Complete);
442 | }
443 |
444 |
445 | [Test]
446 | public void TestApplyAutocomplete_1_returns_1()
447 | {
448 | var inputString = "1";
449 | var inputCaret = inputString.Length;
450 |
451 | var expectedString = "1";
452 | var expectedCaret = expectedString.Length;
453 |
454 | var expectedValue = "1";
455 |
456 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret), true);
457 |
458 | Assert.AreEqual(expectedString, result.FormattedText.Content);
459 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
460 | Assert.AreEqual(expectedValue, result.ExtractedValue);
461 |
462 | Assert.AreEqual(1, result.Affinity);
463 | Assert.AreEqual(false, result.Complete);
464 | }
465 |
466 |
467 | [Test]
468 | public void TestApplyAutocomplete_11_returns_11dot()
469 | {
470 | var inputString = "11";
471 | var inputCaret = inputString.Length;
472 |
473 | var expectedString = "11.";
474 | var expectedCaret = expectedString.Length;
475 |
476 | var expectedValue = "11.";
477 |
478 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret), true);
479 |
480 | Assert.AreEqual(expectedString, result.FormattedText.Content);
481 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
482 | Assert.AreEqual(expectedValue, result.ExtractedValue);
483 |
484 | Assert.AreEqual(2, result.Affinity);
485 | Assert.AreEqual(false, result.Complete);
486 | }
487 |
488 |
489 | [Test]
490 | public void TestApplyAutocomplete_112_returns_11dot2()
491 | {
492 | var inputString = "112";
493 | var inputCaret = inputString.Length;
494 |
495 | var expectedString = "11.2";
496 | var expectedCaret = expectedString.Length;
497 |
498 | var expectedValue = "11.2";
499 |
500 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret), true);
501 |
502 | Assert.AreEqual(expectedString, result.FormattedText.Content);
503 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
504 | Assert.AreEqual(expectedValue, result.ExtractedValue);
505 |
506 | Assert.AreEqual(2, result.Affinity);
507 | Assert.AreEqual(false, result.Complete);
508 | }
509 |
510 |
511 | [Test]
512 | public void TestApplyAutocomplete_1122_returns_11dot22dot()
513 | {
514 | var inputString = "1122";
515 | var inputCaret = inputString.Length;
516 |
517 | var expectedString = "11.22.";
518 | var expectedCaret = expectedString.Length;
519 |
520 | var expectedValue = "11.22.";
521 |
522 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret), true);
523 |
524 | Assert.AreEqual(expectedString, result.FormattedText.Content);
525 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
526 | Assert.AreEqual(expectedValue, result.ExtractedValue);
527 |
528 | Assert.AreEqual(3, result.Affinity);
529 | Assert.AreEqual(false, result.Complete);
530 | }
531 |
532 |
533 | [Test]
534 | public void TestApplyAutocomplete_11223_returns_11dot22dot3()
535 | {
536 | var inputString = "11223";
537 | var inputCaret = inputString.Length;
538 |
539 | var expectedString = "11.22.3";
540 | var expectedCaret = expectedString.Length;
541 |
542 | var expectedValue = "11.22.3";
543 |
544 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret), true);
545 |
546 | Assert.AreEqual(expectedString, result.FormattedText.Content);
547 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
548 | Assert.AreEqual(expectedValue, result.ExtractedValue);
549 |
550 | Assert.AreEqual(3, result.Affinity);
551 | Assert.AreEqual(false, result.Complete);
552 | }
553 |
554 |
555 | [Test]
556 | public void TestApplyAutocomplete_112233_returns_11dot22dot33()
557 | {
558 | var inputString = "112233";
559 | var inputCaret = inputString.Length;
560 |
561 | var expectedString = "11.22.33";
562 | var expectedCaret = expectedString.Length;
563 |
564 | var expectedValue = "11.22.33";
565 |
566 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret), true);
567 |
568 | Assert.AreEqual(expectedString, result.FormattedText.Content);
569 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
570 | Assert.AreEqual(expectedValue, result.ExtractedValue);
571 |
572 | Assert.AreEqual(4, result.Affinity);
573 | Assert.AreEqual(false, result.Complete);
574 | }
575 |
576 |
577 | [Test]
578 | public void TestApplyAutocomplete_1122333_returns_11dot22dot333()
579 | {
580 | var inputString = "1122333";
581 | var inputCaret = inputString.Length;
582 |
583 | var expectedString = "11.22.333";
584 | var expectedCaret = expectedString.Length;
585 |
586 | var expectedValue = "11.22.333";
587 |
588 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret), true);
589 |
590 | Assert.AreEqual(expectedString, result.FormattedText.Content);
591 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
592 | Assert.AreEqual(expectedValue, result.ExtractedValue);
593 |
594 | Assert.AreEqual(5, result.Affinity);
595 | Assert.AreEqual(false, result.Complete);
596 | }
597 |
598 |
599 | [Test]
600 | public void TestApplyAutocomplete_11223333_returns_11dot22dot3333()
601 | {
602 | var inputString = "11223333";
603 | var inputCaret = inputString.Length;
604 |
605 | var expectedString = "11.22.3333";
606 | var expectedCaret = expectedString.Length;
607 |
608 | var expectedValue = "11.22.3333";
609 |
610 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret), true);
611 |
612 | Assert.AreEqual(expectedString, result.FormattedText.Content);
613 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
614 | Assert.AreEqual(expectedValue, result.ExtractedValue);
615 |
616 | Assert.AreEqual(6, result.Affinity);
617 | Assert.AreEqual(true, result.Complete);
618 | }
619 |
620 |
621 | [Test]
622 | public void TestApplyAutocomplete_112233334_returns_11dot22dot3333()
623 | {
624 | var inputString = "112233334";
625 | var inputCaret = inputString.Length;
626 |
627 | var expectedString = "11.22.3333";
628 | var expectedCaret = expectedString.Length;
629 |
630 | var expectedValue = "11.22.3333";
631 |
632 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret), true);
633 |
634 | Assert.AreEqual(expectedString, result.FormattedText.Content);
635 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
636 | Assert.AreEqual(expectedValue, result.ExtractedValue);
637 |
638 | Assert.AreEqual(5, result.Affinity);
639 | Assert.AreEqual(true, result.Complete);
640 | }
641 | }
642 | }
--------------------------------------------------------------------------------
/Source/InputMaskTests/Tests/PhoneCase.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using InputMask.Classes.Model;
3 | using NUnit.Framework;
4 |
5 | namespace InputMaskTests.Tests
6 | {
7 | [TestFixture]
8 | public class PhoneCase : MaskTestBase
9 | {
10 | public override string Format => "+7 ([000]) [000] [00] [00]";
11 |
12 | [Test]
13 | public void TestInit_correctFormat_maskInitialized()
14 | {
15 | Assert.NotNull(CreateMask());
16 | }
17 |
18 | [Test]
19 | public void TestGetPlaceholder_allSet_returnsCorrectPlaceholder()
20 | {
21 | var placeholder = CreateMask().Placeholder();
22 |
23 | Assert.AreEqual(placeholder, "+7 (000) 000 00 00");
24 | }
25 |
26 | [Test]
27 | public void TestAcceptableTextLength_allSet_returnsCorrectCount()
28 | {
29 | var acceptableTextLength = CreateMask().AcceptableTextLength();
30 | Assert.AreEqual(acceptableTextLength, 18);
31 | }
32 |
33 |
34 | [Test]
35 | public void TestTotalTextLength_allSet_returnsCorrectCount()
36 | {
37 | var totalTextLength = CreateMask().TotalTextLength();
38 | Assert.AreEqual(totalTextLength, 18);
39 | }
40 |
41 |
42 | [Test]
43 | public void TestAcceptableValueLength_allSet_returnsCorrectCount()
44 | {
45 | var acceptableValueLength = CreateMask().AcceptableValueLength();
46 | Assert.AreEqual(acceptableValueLength, 10);
47 | }
48 |
49 |
50 | [Test]
51 | public void TestTotalValueLength_allSet_returnsCorrectCount()
52 | {
53 | var totalValueLength = CreateMask().TotalValueLength();
54 |
55 | Assert.AreEqual(totalValueLength, 10);
56 | }
57 |
58 |
59 | [Test]
60 | public void TestApply_plus_return_plus()
61 | {
62 | var inputString = "+";
63 | var inputCaret = inputString.Length;
64 |
65 | var expectedString = "+";
66 | var expectedCaret = expectedString.Length;
67 |
68 | var expectedValue = "";
69 |
70 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
71 |
72 | Assert.AreEqual(expectedString, result.FormattedText.Content);
73 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
74 | Assert.AreEqual(expectedValue, result.ExtractedValue);
75 |
76 | Assert.AreEqual(false, result.Complete);
77 | }
78 |
79 |
80 | [Test]
81 | public void TestApply_plus7_return_plus7()
82 | {
83 | var inputString = "+7";
84 | var inputCaret = inputString.Length;
85 |
86 | var expectedString = "+7";
87 | var expectedCaret = expectedString.Length;
88 |
89 | var expectedValue = "";
90 |
91 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
92 |
93 | Assert.AreEqual(expectedString, result.FormattedText.Content);
94 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
95 | Assert.AreEqual(expectedValue, result.ExtractedValue);
96 |
97 | Assert.AreEqual(false, result.Complete);
98 | }
99 |
100 |
101 | [Test]
102 | public void TestApply_plus7space_return_plus7space()
103 | {
104 | var inputString = "+7 ";
105 | var inputCaret = inputString.Length;
106 |
107 | var expectedString = "+7 ";
108 | var expectedCaret = expectedString.Length;
109 |
110 | var expectedValue = "";
111 |
112 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
113 |
114 | Assert.AreEqual(expectedString, result.FormattedText.Content);
115 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
116 | Assert.AreEqual(expectedValue, result.ExtractedValue);
117 |
118 | Assert.AreEqual(false, result.Complete);
119 | }
120 |
121 |
122 | [Test]
123 | public void TestApply_plus7spaceBrace_return_plus7spaceBrace()
124 | {
125 | var inputString = "+7 (";
126 | var inputCaret = inputString.Length;
127 |
128 | var expectedString = "+7 (";
129 | var expectedCaret = expectedString.Length;
130 |
131 | var expectedValue = "";
132 |
133 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
134 |
135 | Assert.AreEqual(expectedString, result.FormattedText.Content);
136 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
137 | Assert.AreEqual(expectedValue, result.ExtractedValue);
138 |
139 | Assert.AreEqual(false, result.Complete);
140 | }
141 |
142 |
143 | [Test]
144 | public void TestApply_plus7spaceBrace1_return_plus7spaceBrace1()
145 | {
146 | var inputString = "+7 (1";
147 | var inputCaret = inputString.Length;
148 |
149 | var expectedString = "+7 (1";
150 | var expectedCaret = expectedString.Length;
151 |
152 | var expectedValue = "1";
153 |
154 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
155 |
156 | Assert.AreEqual(expectedString, result.FormattedText.Content);
157 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
158 | Assert.AreEqual(expectedValue, result.ExtractedValue);
159 |
160 | Assert.AreEqual(false, result.Complete);
161 | }
162 |
163 |
164 | [Test]
165 | public void TestApply_plus7spaceBrace12_return_plus7spaceBrace12()
166 | {
167 | var inputString = "+7 (12";
168 | var inputCaret = inputString.Length;
169 |
170 | var expectedString = "+7 (12";
171 | var expectedCaret = expectedString.Length;
172 |
173 | var expectedValue = "12";
174 |
175 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
176 |
177 | Assert.AreEqual(expectedString, result.FormattedText.Content);
178 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
179 | Assert.AreEqual(expectedValue, result.ExtractedValue);
180 |
181 | Assert.AreEqual(false, result.Complete);
182 | }
183 |
184 |
185 | [Test]
186 | public void TestApply_plus7spaceBrace123_return_plus7spaceBrace123()
187 | {
188 | var inputString = "+7 (123";
189 | var inputCaret = inputString.Length;
190 |
191 | var expectedString = "+7 (123";
192 | var expectedCaret = expectedString.Length;
193 |
194 | var expectedValue = "123";
195 |
196 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
197 |
198 | Assert.AreEqual(expectedString, result.FormattedText.Content);
199 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
200 | Assert.AreEqual(expectedValue, result.ExtractedValue);
201 |
202 | Assert.AreEqual(false, result.Complete);
203 | }
204 |
205 |
206 | [Test]
207 | public void TestApply_plus7spaceBrace123brace_return_plus7spaceBrace123brace()
208 | {
209 | var inputString = "+7 (123)";
210 | var inputCaret = inputString.Length;
211 |
212 | var expectedString = "+7 (123)";
213 | var expectedCaret = expectedString.Length;
214 |
215 | var expectedValue = "123";
216 |
217 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
218 |
219 | Assert.AreEqual(expectedString, result.FormattedText.Content);
220 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
221 | Assert.AreEqual(expectedValue, result.ExtractedValue);
222 |
223 | Assert.AreEqual(false, result.Complete);
224 | }
225 |
226 |
227 | [Test]
228 | public void TestApply_plus7spaceBrace123braceSpace_return_plus7spaceBrace123braceSpace()
229 | {
230 | var inputString = "+7 (123) ";
231 | var inputCaret = inputString.Length;
232 |
233 | var expectedString = "+7 (123) ";
234 | var expectedCaret = expectedString.Length;
235 |
236 | var expectedValue = "123";
237 |
238 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
239 |
240 | Assert.AreEqual(expectedString, result.FormattedText.Content);
241 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
242 | Assert.AreEqual(expectedValue, result.ExtractedValue);
243 |
244 | Assert.AreEqual(false, result.Complete);
245 | }
246 |
247 |
248 | [Test]
249 | public void TestApply_plus7spaceBrace123braceSpace4_return_plus7spaceBrace123braceSpace4()
250 | {
251 | var inputString = "+7 (123) 4";
252 | var inputCaret = inputString.Length;
253 |
254 | var expectedString = "+7 (123) 4";
255 | var expectedCaret = expectedString.Length;
256 |
257 | var expectedValue = "1234";
258 |
259 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
260 |
261 | Assert.AreEqual(expectedString, result.FormattedText.Content);
262 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
263 | Assert.AreEqual(expectedValue, result.ExtractedValue);
264 |
265 | Assert.AreEqual(false, result.Complete);
266 | }
267 |
268 |
269 | [Test]
270 | public void TestApply_plus7spaceBrace123braceSpace45_return_plus7spaceBrace123braceSpace45()
271 | {
272 | var inputString = "+7 (123) 45";
273 | var inputCaret = inputString.Length;
274 |
275 | var expectedString = "+7 (123) 45";
276 | var expectedCaret = expectedString.Length;
277 |
278 | var expectedValue = "12345";
279 |
280 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
281 |
282 | Assert.AreEqual(expectedString, result.FormattedText.Content);
283 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
284 | Assert.AreEqual(expectedValue, result.ExtractedValue);
285 |
286 | Assert.AreEqual(false, result.Complete);
287 | }
288 |
289 |
290 | [Test]
291 | public void TestApply_plus7spaceBrace123braceSpace456_return_plus7spaceBrace123braceSpace456()
292 | {
293 | var inputString = "+7 (123) 456";
294 | var inputCaret = inputString.Length;
295 |
296 | var expectedString = "+7 (123) 456";
297 | var expectedCaret = expectedString.Length;
298 |
299 | var expectedValue = "123456";
300 |
301 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
302 |
303 | Assert.AreEqual(expectedString, result.FormattedText.Content);
304 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
305 | Assert.AreEqual(expectedValue, result.ExtractedValue);
306 |
307 | Assert.AreEqual(false, result.Complete);
308 | }
309 |
310 |
311 | [Test]
312 | public void TestApply_plus7spaceBrace123braceSpace456space_return_plus7spaceBrace123braceSpace456space()
313 | {
314 | var inputString = "+7 (123) 456 ";
315 | var inputCaret = inputString.Length;
316 |
317 | var expectedString = "+7 (123) 456 ";
318 | var expectedCaret = expectedString.Length;
319 |
320 | var expectedValue = "123456";
321 |
322 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
323 |
324 | Assert.AreEqual(expectedString, result.FormattedText.Content);
325 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
326 | Assert.AreEqual(expectedValue, result.ExtractedValue);
327 |
328 | Assert.AreEqual(false, result.Complete);
329 | }
330 |
331 |
332 | [Test]
333 | public void TestApply_plus7spaceBrace123braceSpace456space7_return_plus7spaceBrace123braceSpace456space7()
334 | {
335 | var inputString = "+7 (123) 456 7";
336 | var inputCaret = inputString.Length;
337 |
338 | var expectedString = "+7 (123) 456 7";
339 | var expectedCaret = expectedString.Length;
340 |
341 | var expectedValue = "1234567";
342 |
343 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
344 |
345 | Assert.AreEqual(expectedString, result.FormattedText.Content);
346 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
347 | Assert.AreEqual(expectedValue, result.ExtractedValue);
348 |
349 | Assert.AreEqual(false, result.Complete);
350 | }
351 |
352 |
353 | [Test]
354 | public void TestApply_plus7spaceBrace123braceSpace456space78_return_plus7spaceBrace123braceSpace456space78()
355 | {
356 | var inputString = "+7 (123) 456 78";
357 | var inputCaret = inputString.Length;
358 |
359 | var expectedString = "+7 (123) 456 78";
360 | var expectedCaret = expectedString.Length;
361 |
362 | var expectedValue = "12345678";
363 |
364 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
365 |
366 | Assert.AreEqual(expectedString, result.FormattedText.Content);
367 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
368 | Assert.AreEqual(expectedValue, result.ExtractedValue);
369 |
370 | Assert.AreEqual(false, result.Complete);
371 | }
372 |
373 |
374 | [Test]
375 | public void TestApply_plus7spaceBrace123braceSpace456space78space_return_plus7spaceBrace123braceSpace456space78space()
376 | {
377 | var inputString = "+7 (123) 456 78 ";
378 | var inputCaret = inputString.Length;
379 |
380 | var expectedString = "+7 (123) 456 78 ";
381 | var expectedCaret = expectedString.Length;
382 |
383 | var expectedValue = "12345678";
384 |
385 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
386 |
387 | Assert.AreEqual(expectedString, result.FormattedText.Content);
388 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
389 | Assert.AreEqual(expectedValue, result.ExtractedValue);
390 |
391 | Assert.AreEqual(false, result.Complete);
392 | }
393 |
394 |
395 | [Test]
396 | public void TestApply_plus7spaceBrace123braceSpace456space78space9_return_plus7spaceBrace123braceSpace456space78space9()
397 | {
398 | var inputString = "+7 (123) 456 78 9";
399 | var inputCaret = inputString.Length;
400 |
401 | var expectedString = "+7 (123) 456 78 9";
402 | var expectedCaret = expectedString.Length;
403 |
404 | var expectedValue = "123456789";
405 |
406 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
407 |
408 | Assert.AreEqual(expectedString, result.FormattedText.Content);
409 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
410 | Assert.AreEqual(expectedValue, result.ExtractedValue);
411 |
412 | Assert.AreEqual(false, result.Complete);
413 | }
414 |
415 |
416 | [Test]
417 | public void TestApply_plus7spaceBrace123braceSpace456space78space90_return_plus7spaceBrace123braceSpace456space78space90()
418 | {
419 | var inputString = "+7 (123) 456 78 90";
420 | var inputCaret = inputString.Length;
421 |
422 | var expectedString = "+7 (123) 456 78 90";
423 | var expectedCaret = expectedString.Length;
424 |
425 | var expectedValue = "1234567890";
426 |
427 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
428 |
429 | Assert.AreEqual(expectedString, result.FormattedText.Content);
430 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
431 | Assert.AreEqual(expectedValue, result.ExtractedValue);
432 |
433 | Assert.AreEqual(true, result.Complete);
434 | }
435 |
436 |
437 | [Test]
438 | public void TestApply_7_return_plus7()
439 | {
440 | var inputString = "7";
441 | var inputCaret = inputString.Length;
442 |
443 | var expectedString = "+7";
444 | var expectedCaret = expectedString.Length;
445 |
446 | var expectedValue = "";
447 |
448 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
449 |
450 | Assert.AreEqual(expectedString, result.FormattedText.Content);
451 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
452 | Assert.AreEqual(expectedValue, result.ExtractedValue);
453 |
454 | Assert.AreEqual(false, result.Complete);
455 | }
456 |
457 |
458 | [Test]
459 | public void TestApply_9_return_plus7spaceBrace9()
460 | {
461 | var inputString = "9";
462 | var inputCaret = inputString.Length;
463 |
464 | var expectedString = "+7 (9";
465 | var expectedCaret = expectedString.Length;
466 |
467 | var expectedValue = "9";
468 |
469 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
470 |
471 | Assert.AreEqual(expectedString, result.FormattedText.Content);
472 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
473 | Assert.AreEqual(expectedValue, result.ExtractedValue);
474 |
475 | Assert.AreEqual(false, result.Complete);
476 | }
477 |
478 |
479 | [Test]
480 | public void TestApply_1234567890_return_plus7spaceBrace123braceSpace456space78space90()
481 | {
482 | var inputString = "1234567890";
483 | var inputCaret = inputString.Length;
484 |
485 | var expectedString = "+7 (123) 456 78 90";
486 | var expectedCaret = expectedString.Length;
487 |
488 | var expectedValue = "1234567890";
489 |
490 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
491 |
492 | Assert.AreEqual(expectedString, result.FormattedText.Content);
493 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
494 | Assert.AreEqual(expectedValue, result.ExtractedValue);
495 |
496 | Assert.AreEqual(true, result.Complete);
497 | }
498 |
499 |
500 | [Test]
501 | public void TestApply_12345678901_return_plus7spaceBrace123braceSpace456space78space90()
502 | {
503 | var inputString = "12345678901";
504 | var inputCaret = inputString.Length;
505 |
506 | var expectedString = "+7 (123) 456 78 90";
507 | var expectedCaret = expectedString.Length;
508 |
509 | var expectedValue = "1234567890";
510 |
511 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
512 |
513 | Assert.AreEqual(expectedString, result.FormattedText.Content);
514 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
515 | Assert.AreEqual(expectedValue, result.ExtractedValue);
516 |
517 | Assert.AreEqual(true, result.Complete);
518 | }
519 |
520 |
521 | [Test]
522 | public void TestApply_plus1234567890_return_plus7spaceBrace123braceSpace456space78space90()
523 | {
524 | var inputString = "+1234567890";
525 | var inputCaret = inputString.Length;
526 |
527 | var expectedString = "+7 (123) 456 78 90";
528 | var expectedCaret = expectedString.Length;
529 |
530 | var expectedValue = "1234567890";
531 |
532 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
533 |
534 | Assert.AreEqual(expectedString, result.FormattedText.Content);
535 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
536 | Assert.AreEqual(expectedValue, result.ExtractedValue);
537 |
538 | Assert.AreEqual(true, result.Complete);
539 | }
540 |
541 |
542 | [Test]
543 | public void TestApply_plusBrace123brace456dash78dash90_return_plus7spaceBrace123braceSpace456space78space90()
544 | {
545 | var inputString = "+(123)456-78-90";
546 | var inputCaret = inputString.Length;
547 |
548 | var expectedString = "+7 (123) 456 78 90";
549 | var expectedCaret = expectedString.Length;
550 |
551 | var expectedValue = "1234567890";
552 |
553 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret));
554 |
555 | Assert.AreEqual(expectedString, result.FormattedText.Content);
556 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
557 | Assert.AreEqual(expectedValue, result.ExtractedValue);
558 |
559 | Assert.AreEqual(true, result.Complete);
560 | }
561 |
562 |
563 | [Test]
564 | public void TestApplyAutocomplete_empty_return_plus7spaceBrace()
565 | {
566 | var inputString = "";
567 | var inputCaret = inputString.Length;
568 |
569 | var expectedString = "+7 (";
570 | var expectedCaret = expectedString.Length;
571 |
572 | var expectedValue = "";
573 |
574 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret), true);
575 |
576 | Assert.AreEqual(expectedString, result.FormattedText.Content);
577 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
578 | Assert.AreEqual(expectedValue, result.ExtractedValue);
579 |
580 | Assert.AreEqual(false, result.Complete);
581 | }
582 |
583 |
584 | [Test]
585 | public void TestApplyAutocomplete_plus_return_plus7spaceBrace()
586 | {
587 | var inputString = "+";
588 | var inputCaret = inputString.Length;
589 |
590 | var expectedString = "+7 (";
591 | var expectedCaret = expectedString.Length;
592 |
593 | var expectedValue = "";
594 |
595 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret), true);
596 |
597 | Assert.AreEqual(expectedString, result.FormattedText.Content);
598 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
599 | Assert.AreEqual(expectedValue, result.ExtractedValue);
600 |
601 | Assert.AreEqual(false, result.Complete);
602 | }
603 |
604 |
605 | [Test]
606 | public void TestApplyAutocomplete_plus7_return_plus7spaceBrace()
607 | {
608 | var inputString = "+7";
609 | var inputCaret = inputString.Length;
610 |
611 | var expectedString = "+7 (";
612 | var expectedCaret = expectedString.Length;
613 |
614 | var expectedValue = "";
615 |
616 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret), true);
617 |
618 | Assert.AreEqual(expectedString, result.FormattedText.Content);
619 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
620 | Assert.AreEqual(expectedValue, result.ExtractedValue);
621 |
622 | Assert.AreEqual(false, result.Complete);
623 | }
624 |
625 |
626 | [Test]
627 | public void TestApplyAutocomplete_plus7space_return_plus7spaceBrace()
628 | {
629 | var inputString = "+7 ";
630 | var inputCaret = inputString.Length;
631 |
632 | var expectedString = "+7 (";
633 | var expectedCaret = expectedString.Length;
634 |
635 | var expectedValue = "";
636 |
637 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret), true);
638 |
639 | Assert.AreEqual(expectedString, result.FormattedText.Content);
640 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
641 | Assert.AreEqual(expectedValue, result.ExtractedValue);
642 |
643 | Assert.AreEqual(false, result.Complete);
644 | }
645 |
646 |
647 | [Test]
648 | public void TestApplyAutocomplete_plus7spaceBrace_return_plus7spaceBrace()
649 | {
650 | var inputString = "+7 (";
651 | var inputCaret = inputString.Length;
652 |
653 | var expectedString = "+7 (";
654 | var expectedCaret = expectedString.Length;
655 |
656 | var expectedValue = "";
657 |
658 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret), true);
659 |
660 | Assert.AreEqual(expectedString, result.FormattedText.Content);
661 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
662 | Assert.AreEqual(expectedValue, result.ExtractedValue);
663 |
664 | Assert.AreEqual(false, result.Complete);
665 | }
666 |
667 |
668 | [Test]
669 | public void TestApplyAutocomplete_a_return_plus7spaceBrace()
670 | {
671 | var inputString = "a";
672 | var inputCaret = inputString.Length;
673 |
674 | var expectedString = "+7 (";
675 | var expectedCaret = expectedString.Length;
676 |
677 | var expectedValue = "";
678 |
679 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret), true);
680 |
681 | Assert.AreEqual(expectedString, result.FormattedText.Content);
682 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
683 | Assert.AreEqual(expectedValue, result.ExtractedValue);
684 |
685 | Assert.AreEqual(false, result.Complete);
686 | }
687 |
688 |
689 | [Test]
690 | public void TestApplyAutocomplete_aPlus7spaceBrace_return_plus7spaceBrace()
691 | {
692 | var inputString = "a+7 (";
693 | var inputCaret = inputString.Length;
694 |
695 | var expectedString = "+7 (7";
696 | var expectedCaret = expectedString.Length;
697 |
698 | var expectedValue = "7";
699 |
700 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret), true);
701 |
702 | Assert.AreEqual(expectedString, result.FormattedText.Content);
703 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
704 | Assert.AreEqual(expectedValue, result.ExtractedValue);
705 |
706 | Assert.AreEqual(false, result.Complete);
707 | }
708 |
709 |
710 | [Test]
711 | public void TestApplyAutocomplete_7space_return_plus7spaceBrace()
712 | {
713 | var inputString = "7 ";
714 | var inputCaret = inputString.Length;
715 |
716 | var expectedString = "+7 (";
717 | var expectedCaret = expectedString.Length;
718 |
719 | var expectedValue = "";
720 |
721 | var result = CreateMask().Apply(new CaretString(inputString, inputCaret), true);
722 |
723 | Assert.AreEqual(expectedString, result.FormattedText.Content);
724 | Assert.AreEqual(expectedCaret, result.FormattedText.CaretPosition);
725 | Assert.AreEqual(expectedValue, result.ExtractedValue);
726 |
727 | Assert.AreEqual(false, result.Complete);
728 | }
729 | }
730 | }
--------------------------------------------------------------------------------