Skip to content

Commit 99616df

Browse files
committed
Add new tests and attempt to fix old tests
1 parent 325023c commit 99616df

File tree

1 file changed

+94
-5
lines changed

1 file changed

+94
-5
lines changed

Algorithms.Tests/Strings/MinCostStringConversionTests.fs

Lines changed: 94 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,110 @@
22

33
open Microsoft.VisualStudio.TestTools.UnitTesting
44
open Algorithms.Strings
5+
open MinCostStringConversion
56

67
[<TestClass>]
78
type MinCostStringConversionTests () =
8-
9+
10+
let validateAndApply (source: string ) (operations: Operation array) : string =
11+
operations
12+
|> Array.mapFold (fun sourcePosition op ->
13+
match op with
14+
| Operation.Copy s ->
15+
Assert.AreEqual(source.[sourcePosition], s)
16+
Some s, sourcePosition + 1
17+
| Operation.Replace (s, d) ->
18+
Assert.AreEqual(source.[sourcePosition], s)
19+
Some d, sourcePosition + 1
20+
| Operation.Delete s ->
21+
Assert.AreEqual(source.[sourcePosition], s)
22+
None, sourcePosition + 1
23+
| Operation.Insert c ->
24+
Some c, sourcePosition
25+
) 0
26+
|> fst
27+
|> Array.choose id
28+
|> Array.map string
29+
|> String.concat ""
30+
31+
let calculateCost (operations: Operation array, copyCost:int, replaceCost:int, deleteCost:int, insertCost:int) =
32+
operations
33+
|> Array.sumBy (function
34+
| Operation.Copy _ -> copyCost
35+
| Operation.Replace _ -> replaceCost
36+
| Operation.Delete _ -> deleteCost
37+
| Operation.Insert _ -> insertCost
38+
)
39+
40+
41+
[<TestMethod>]
42+
[<DataRow("", "", 1, 2, 3, 4)>]
43+
[<DataRow("github", "", 1, 2, 3, 4)>]
44+
[<DataRow("", "github", 1, 2, 3, 4)>]
45+
[<DataRow("github", "github", 1, 2, 3, 4)>]
46+
[<DataRow("banana", "apple", 1, 2, 3, 4)>]
47+
[<DataRow("banana", "apple", 3, 1, 2, 4)>]
48+
[<DataRow("banana", "apple", 3, 1, 2, 4)>]
49+
member this.validateResult (source: string, destination: string, copyCost:int, replaceCost:int, deleteCost:int, insertCost:int) =
50+
let costs, ops = computeTransformTables (source, destination, copyCost, replaceCost, deleteCost, insertCost)
51+
52+
for i = 0 to source.Length do
53+
for j = 0 to destination.Length do
54+
let sourceSubstring = source.Substring(0, i)
55+
let destinationSubstring = destination.Substring(0, j)
56+
let operations = assembleTransformation (ops, i, j)
57+
let actualDestinationSubstring = validateAndApply sourceSubstring operations
58+
let calculatedCost = calculateCost (operations, copyCost, replaceCost, deleteCost, insertCost)
59+
Assert.AreEqual (destinationSubstring, actualDestinationSubstring)
60+
Assert.AreEqual (costs.[i].[j], calculatedCost)
61+
962
[<TestMethod>]
1063
[<DataRow("abbbaba", "abbba")>]
1164
[<DataRow("ababa", "ababa")>]
12-
member this.assembleTransformation (ops:string list, i:int, j:int, expected:string list) =
65+
member this.assembleTransformation (ops:Operation array array, i:int, j:int, expected:Operation array) =
1366
let actual = MinCostStringConversion.assembleTransformation(ops, i, j)
1467
Assert.AreEqual(expected, actual)
68+
69+
static member inputForComputeTransformTables =
70+
seq {
71+
yield [|
72+
"abbbaba" :> obj
73+
"ababa" :> obj
74+
1 :> obj
75+
2 :> obj
76+
3 :> obj
77+
3 :> obj
78+
([|
79+
[|0; 3; 6; 9; 12; 15|]
80+
[|3; 1; 4; 7; 10; 13|]
81+
[|6; 4; 2; 5; 8; 11|]
82+
[|9; 7; 5; 4; 6; 9|]
83+
[|12; 10; 8; 7; 5; 8|]
84+
[|15; 13; 11; 9; 8; 6|]
85+
[|18; 16; 14; 12; 10; 9|]
86+
[|21; 19; 17; 15; 13; 11|]
87+
|],
88+
[|
89+
[|Operation.Copy 'a'; Operation.Insert 'a'; Operation.Insert 'b'; Operation.Insert 'a'; Operation.Insert 'b'; Operation.Insert 'a'|]
90+
[|Operation.Delete 'a'; Operation.Copy 'a'; Operation.Insert 'b'; Operation.Copy 'a'; Operation.Insert 'b'; Operation.Copy 'a'|]
91+
[|Operation.Delete 'b'; Operation.Delete 'b'; Operation.Copy 'b'; Operation.Insert 'a'; Operation.Copy 'b'; Operation.Insert 'a'|]
92+
[|Operation.Delete 'b'; Operation.Delete 'b'; Operation.Copy 'b'; Operation.Replace ('b', 'a'); Operation.Copy 'b'; Operation.Insert 'a'|]
93+
[|Operation.Delete 'b'; Operation.Delete 'b'; Operation.Copy 'b'; Operation.Replace ('b', 'a'); Operation.Copy 'b'; Operation.Replace ('b', 'a')|]
94+
[|Operation.Delete 'a'; Operation.Copy 'a'; Operation.Delete 'a'; Operation.Copy 'a'; Operation.Delete 'a'; Operation.Copy 'a'|]
95+
[|Operation.Delete 'b'; Operation.Delete 'b'; Operation.Copy 'b'; Operation.Delete 'b'; Operation.Copy 'b'; Operation.Delete 'b'|]
96+
[|Operation.Delete 'a'; Operation.Copy 'a'; Operation.Delete 'a'; Operation.Copy 'a'; Operation.Delete 'a'; Operation.Copy 'a'|]
97+
|]) :> obj
98+
|]
99+
}
15100

16101
[<TestMethod>]
17-
[<DataRow("abbbaba", "abbba")>]
18-
[<DataRow("ababa", "ababa")>]
19-
member this.assembleTransformation (sourceString:string, destinationString:string, copyCost:int, replaceCost:int, deleteCost:int, insertCost:int, expected:int list * string list) =
102+
[<DynamicData(nameof(MinCostStringConversionTests.inputForComputeTransformTables))>]
103+
member this.computeTransformTables (sourceString:string, destinationString:string, copyCost:int, replaceCost:int, deleteCost:int, insertCost:int, expected:int array array * Operation array array) =
20104
let actual = MinCostStringConversion.computeTransformTables(sourceString,destinationString,copyCost,replaceCost,deleteCost,insertCost)
105+
printfn $"%A{actual}"
106+
printfn "-----"
107+
printfn $"%A{expected}"
21108
Assert.AreEqual(expected, actual)
109+
110+
22111

0 commit comments

Comments
 (0)