using System;
using System.Collections.Generic;
using System.Linq;
public class Test
{
public static Func<string,bool> MinimumLength(int _minLength)
{
return (password) =>
password != null
&& password.Length >= _minLength;
}
public static bool MustHaveDigits(string password)
{
if (password == null) return false;
return password.ToCharArray().Any(c => char.IsDigit(c));
}
public static bool MustHaveUppercase(string password)
{
if (password == null) return false;
return password.ToCharArray().Any(c => char.IsUpper(c));
}
public static void Main()
{
Func<IEnumerable<Func<string,bool>>, Func<string, bool>> createPasswordPolicy = (policy) => (pw) => policy.All(check => check(pw));
var isValidShort = createPasswordPolicy(new List<Func<string, bool>>() {
Test.MinimumLength(8),
Test.MustHaveDigits,
Test.MustHaveUppercase,
});
var isValidLong = createPasswordPolicy(new List<Func<string, bool>>() {
Test.MinimumLength(10),
Test.MustHaveDigits,
Test.MustHaveUppercase,
});
System.Console.WriteLine(isValidShort("Password1")); // True
System.Console.WriteLine(isValidShort("Password123")); // True
System.Console.WriteLine(isValidShort(null)); // False
System.Console.WriteLine(isValidShort("")); // False
System.Console.WriteLine(isValidLong("Password123")); // True
System.Console.WriteLine(isValidLong("Password1")); // False
System.Console.WriteLine(isValidLong(null)); // False
System.Console.WriteLine(isValidLong("")); // False
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CgpwdWJsaWMgY2xhc3MgVGVzdAp7CiAgICBwdWJsaWMgc3RhdGljIEZ1bmM8c3RyaW5nLGJvb2w+IE1pbmltdW1MZW5ndGgoaW50IF9taW5MZW5ndGgpCiAgICB7CiAgICAgICAgcmV0dXJuIChwYXNzd29yZCkgPT4KICAgICAgICAgICAgcGFzc3dvcmQgIT0gbnVsbAogICAgICAgICAgICAmJiBwYXNzd29yZC5MZW5ndGggPj0gX21pbkxlbmd0aDsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGJvb2wgTXVzdEhhdmVEaWdpdHMoc3RyaW5nIHBhc3N3b3JkKQogICAgewogICAgICAgIGlmIChwYXNzd29yZCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAgICAgcmV0dXJuIHBhc3N3b3JkLlRvQ2hhckFycmF5KCkuQW55KGMgPT4gY2hhci5Jc0RpZ2l0KGMpKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGJvb2wgTXVzdEhhdmVVcHBlcmNhc2Uoc3RyaW5nIHBhc3N3b3JkKQogICAgewogICAgICAgIGlmIChwYXNzd29yZCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAgICAgcmV0dXJuIHBhc3N3b3JkLlRvQ2hhckFycmF5KCkuQW55KGMgPT4gY2hhci5Jc1VwcGVyKGMpKTsKICAgIH0KCgogICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQogICAgewogICAgICAgIEZ1bmM8SUVudW1lcmFibGU8RnVuYzxzdHJpbmcsYm9vbD4+LCBGdW5jPHN0cmluZywgYm9vbD4+IGNyZWF0ZVBhc3N3b3JkUG9saWN5ID0gKHBvbGljeSkgPT4gKHB3KSA9PiBwb2xpY3kuQWxsKGNoZWNrID0+IGNoZWNrKHB3KSk7CiAgICAgICAgCiAgICAgICAgdmFyIGlzVmFsaWRTaG9ydCA9IGNyZWF0ZVBhc3N3b3JkUG9saWN5KG5ldyBMaXN0PEZ1bmM8c3RyaW5nLCBib29sPj4oKSB7CiAgICAgICAgCVRlc3QuTWluaW11bUxlbmd0aCg4KSwKICAgICAgICAJVGVzdC5NdXN0SGF2ZURpZ2l0cywKICAgICAgICAJVGVzdC5NdXN0SGF2ZVVwcGVyY2FzZSwKICAgICAgICB9KTsKICAgICAgICAKICAgICAgICB2YXIgaXNWYWxpZExvbmcgPSBjcmVhdGVQYXNzd29yZFBvbGljeShuZXcgTGlzdDxGdW5jPHN0cmluZywgYm9vbD4+KCkgewogICAgICAgIAlUZXN0Lk1pbmltdW1MZW5ndGgoMTApLAogICAgICAgIAlUZXN0Lk11c3RIYXZlRGlnaXRzLAogICAgICAgIAlUZXN0Lk11c3RIYXZlVXBwZXJjYXNlLAogICAgICAgIH0pOwogICAgICAgIAoKICAgICAgICBTeXN0ZW0uQ29uc29sZS5Xcml0ZUxpbmUoaXNWYWxpZFNob3J0KCJQYXNzd29yZDEiKSk7ICAgLy8gVHJ1ZQogICAgICAgIFN5c3RlbS5Db25zb2xlLldyaXRlTGluZShpc1ZhbGlkU2hvcnQoIlBhc3N3b3JkMTIzIikpOyAvLyBUcnVlCiAgICAgICAgU3lzdGVtLkNvbnNvbGUuV3JpdGVMaW5lKGlzVmFsaWRTaG9ydChudWxsKSk7ICAgICAgICAgIC8vIEZhbHNlCiAgICAgICAgU3lzdGVtLkNvbnNvbGUuV3JpdGVMaW5lKGlzVmFsaWRTaG9ydCgiIikpOyAgICAgICAgICAgIC8vIEZhbHNlCiAgICAgICAgCiAgICAgICAgU3lzdGVtLkNvbnNvbGUuV3JpdGVMaW5lKGlzVmFsaWRMb25nKCJQYXNzd29yZDEyMyIpKTsgIC8vIFRydWUKICAgICAgICBTeXN0ZW0uQ29uc29sZS5Xcml0ZUxpbmUoaXNWYWxpZExvbmcoIlBhc3N3b3JkMSIpKTsgICAgLy8gRmFsc2UKICAgICAgICBTeXN0ZW0uQ29uc29sZS5Xcml0ZUxpbmUoaXNWYWxpZExvbmcobnVsbCkpOyAgICAgICAgICAgLy8gRmFsc2UKICAgICAgICBTeXN0ZW0uQ29uc29sZS5Xcml0ZUxpbmUoaXNWYWxpZExvbmcoIiIpKTsgICAgICAgICAgICAgLy8gRmFsc2UKICAgIH0KCn0=