public void TypoString()
{
var original = "Testing";
var entered = "Tesying";
// get LCS
var alignments = LongestCommonSubsequence.LeftAlignedLCS(original, entered);
// find all character additions
var additions = LongestCommonSubsequence.GetAddedCharIndices(entered, alignments);
// find all character omissions
var omissions = LongestCommonSubsequence.GetMissingCharIndices(original, alignments);
// find all transpositions
var outputs = LongestCommonSubsequence.FixTranspositions(alignments, additions, omissions, original, entered);
// new string
string entered2 = outputs.Item1;
// new alignments
var alignments2 = outputs.Item2;
// new additions
var additions2 = outputs.Item3;
// new omissions
var omissions2 = outputs.Item4;
// deltas
var deltas = outputs.Item5;
// get typos
var typos = LongestCommonSubsequence.GetTypos(alignments2, original, entered2);
// there are two outcomes:
// 1) 's' -> "sy" and 't' -> ""
// 2) 's' -> "s" and 't' -> "y"
Tuple<OptChar, string>[] t1 = { new Tuple<OptChar, string>(OptChar.None, ""), new Tuple<OptChar, string>(OptChar.Some('T'), "T"), new Tuple<OptChar, string>(OptChar.Some('e'), "e"), new Tuple<OptChar, string>(OptChar.Some('s'), "sy"), new Tuple<OptChar, string>(OptChar.Some('t'), ""), new Tuple<OptChar, string>(OptChar.Some('i'), "i"), new Tuple<OptChar, string>(OptChar.Some('n'), "n"), new Tuple<OptChar, string>(OptChar.Some('g'), "g") };
Tuple<OptChar, string>[] t2 = { new Tuple<OptChar, string>(OptChar.None, ""), new Tuple<OptChar, string>(OptChar.Some('T'), "T"), new Tuple<OptChar, string>(OptChar.Some('e'), "e"), new Tuple<OptChar, string>(OptChar.Some('s'), "s"), new Tuple<OptChar, string>(OptChar.Some('t'), "y"), new Tuple<OptChar, string>(OptChar.Some('i'), "i"), new Tuple<OptChar, string>(OptChar.Some('n'), "n"), new Tuple<OptChar, string>(OptChar.Some('g'), "g") };
Assert.AreEqual(true, typos.SequenceEqual(t1) || typos.SequenceEqual(t2));
}