using System.Diagnostics;
using System.Collections.Generic;
public static void Main()
var tester = new StringPatternTester();
public static string PrintStringPatterns(string input, int patternLength)
var repeatedPatterns = RetrieveStringPatterns(input, patternLength).ToArray();
StringBuilder stringBuilder = new StringBuilder("");
foreach (var entry in repeatedPatterns)
var output = string.Format("pattern = {0}, occurence value = {1}\n", entry.Key, entry.Value);
stringBuilder.Append(output);
if(stringBuilder.Length == 0){
return ErrorMessages.NoPattersFoundMessage;
return stringBuilder.ToString();
}catch(ArgumentException ex){
public static Dictionary<string, int> RetrieveStringPatterns(string input, int patternLength){
ValidateInputs(input, patternLength);
var processedInput = input.ToLower();
var patterns = new Dictionary<string, int>();
var endIndex = processedInput.Length - patternLength;
for (var i = 0; i <= endIndex; i++)
var substring = processedInput.Substring(i, patternLength);
if (patterns.ContainsKey(substring))
patterns[substring] += 1;
var repeatedPatterns = patterns.Where(x => x.Value > 1).ToDictionary(x => x.Key, x => x.Value);
public static void ValidateInputs(string input, int patternLength)
if(string.IsNullOrWhiteSpace(input)){
throw new ArgumentException(ErrorMessages.InputIsNullOrWhiteSpaceMessage);
throw new ArgumentException(ErrorMessages.PatternLengthInadequateMessage);
if (patternLength >= input.Length)
throw new ArgumentException(ErrorMessages.PatternLengthTooBigMessage);
public static class ErrorMessages
public const string PatternLengthInadequateMessage = "Pattern length must be at least 1";
public const string PatternLengthTooBigMessage = "Pattern length must not equal or exceed input length";
public const string InputIsNullOrWhiteSpaceMessage = "String was null or Empty or only contained whitespace";
public const string NoPattersFoundMessage = "No patterns found";
public class StringPatternTester{
Console.WriteLine("starting tests");
PrintStringPatterns_WhenInputIsNullOrEmpty_ReturnsExceptionMessage();
PrintStringPatterns_WhenPatternLengthIsInvalid_ReturnsExceptionMessage();
PrintStringPatterns_WhenPatternIsAllWhitespace_ReturnsErrorMessage();
PrintStringPatterns_WhenPatternHasMixedCase_ReturnsCaseInsensitivePattern();
PrintStringPatterns_WhenPatternInTypicalStrings_ReturnsCorrectPatterns();
PrintStringPatterns_WhenThereAreNoPatternsMatched_ReturnsNoPatternsMessage();
Console.WriteLine("finished tests");
private void PrintStringPatterns_WhenInputIsNullOrEmpty_ReturnsExceptionMessage(){
var result = Program.PrintStringPatterns("", 2);
Debug.Assert(result.Equals(ErrorMessages.InputIsNullOrWhiteSpaceMessage));
result = Program.PrintStringPatterns(null, 2);
Debug.Assert(result.Equals(ErrorMessages.InputIsNullOrWhiteSpaceMessage));
result = Program.PrintStringPatterns("", 2);
Debug.Assert(result.Equals(ErrorMessages.InputIsNullOrWhiteSpaceMessage));
private void PrintStringPatterns_WhenPatternLengthIsInvalid_ReturnsExceptionMessage(){
var result = Program.PrintStringPatterns("TestString", 20);
Debug.Assert(result.Equals(ErrorMessages.PatternLengthTooBigMessage));
result = Program.PrintStringPatterns("test", 4);
Debug.Assert(result.Equals(ErrorMessages.PatternLengthTooBigMessage));
result = Program.PrintStringPatterns("ababcab", -2);
Debug.Assert(result.Equals(ErrorMessages.PatternLengthInadequateMessage));
private void PrintStringPatterns_WhenPatternIsAllWhitespace_ReturnsErrorMessage(){
var result = Program.PrintStringPatterns(" ", 2);
Debug.Assert(result.Equals(ErrorMessages.InputIsNullOrWhiteSpaceMessage));
private void PrintStringPatterns_WhenPatternHasMixedCase_ReturnsCaseInsensitivePattern(){
var result = Program.PrintStringPatterns("aBAbcAB", 2);
var expectedResult = "pattern = ab, occurence value = 3\n";
Debug.Assert(result.Equals(expectedResult));
private void PrintStringPatterns_WhenPatternInTypicalStrings_ReturnsCorrectPatterns(){
var result = Program.PrintStringPatterns("ababcab", 2);
var expectedResult = "pattern = ab, occurence value = 3\n";
Debug.Assert(result.Equals(expectedResult));
result = Program.PrintStringPatterns("zf3kabxcde224lkzf3mabxc51+crsdtzf3nab=", 3);
expectedResult = "pattern = zf3, occurence value = 3\npattern = abx, occurence value = 2\npattern = bxc, occurence value = 2\n";
Debug.Assert(result.Equals(expectedResult));
private void PrintStringPatterns_WhenThereAreNoPatternsMatched_ReturnsNoPatternsMessage(){
var result = Program.PrintStringPatterns("abcdef", 3);
Debug.Assert(result.Equals(ErrorMessages.NoPattersFoundMessage));