Skip to content

Commit 674cc31

Browse files
Generate flatten-array tests (exercism#109)
[no important files changed]
1 parent 5bf6929 commit 674cc31

3 files changed

Lines changed: 201 additions & 91 deletions

File tree

exercises/practice/flatten-array/FlattenArrayTest.lean

Lines changed: 139 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -6,109 +6,157 @@ open LeanTest
66
def flattenArrayTests : TestSuite :=
77
(TestSuite.empty "FlattenArray")
88
|>.addTest "empty" (do
9-
return assertEqual #[] (FlattenArray.flatten (FlattenArray.Box.many #[
10-
])))
9+
return assertEqual #[] (FlattenArray.flatten (FlattenArray.Box.many #[])))
1110
|>.addTest "no nesting" (do
12-
return assertEqual #[0, 1, 2] (FlattenArray.flatten (FlattenArray.Box.many #[
13-
(FlattenArray.Box.one 0),
14-
(FlattenArray.Box.one 1),
15-
(FlattenArray.Box.one 2)])))
11+
return assertEqual #[
12+
0, 1, 2
13+
] (FlattenArray.flatten (FlattenArray.Box.many #[
14+
(FlattenArray.Box.one 0),
15+
(FlattenArray.Box.one 1),
16+
(FlattenArray.Box.one 2)
17+
])))
1618
|>.addTest "flattens a nested array" (do
1719
return assertEqual #[] (FlattenArray.flatten (FlattenArray.Box.many #[
18-
(FlattenArray.Box.many #[
19-
(FlattenArray.Box.many #[
20-
])])])))
20+
(FlattenArray.Box.many #[
21+
(FlattenArray.Box.many #[])
22+
])
23+
])))
2124
|>.addTest "flattens array with just integers present" (do
22-
return assertEqual #[1, 2, 3, 4, 5, 6, 7, 8] (FlattenArray.flatten (FlattenArray.Box.many #[
23-
(FlattenArray.Box.one 1),
24-
(FlattenArray.Box.many #[
25-
(FlattenArray.Box.one 2),
26-
(FlattenArray.Box.one 3),
27-
(FlattenArray.Box.one 4),
28-
(FlattenArray.Box.one 5),
29-
(FlattenArray.Box.one 6),
30-
(FlattenArray.Box.one 7)]),
31-
(FlattenArray.Box.one 8)])))
25+
return assertEqual #[
26+
1, 2, 3, 4, 5, 6, 7, 8
27+
] (FlattenArray.flatten (FlattenArray.Box.many #[
28+
(FlattenArray.Box.one 1),
29+
(FlattenArray.Box.many #[
30+
(FlattenArray.Box.one 2),
31+
(FlattenArray.Box.one 3),
32+
(FlattenArray.Box.one 4),
33+
(FlattenArray.Box.one 5),
34+
(FlattenArray.Box.one 6),
35+
(FlattenArray.Box.one 7)
36+
]),
37+
(FlattenArray.Box.one 8)
38+
])))
3239
|>.addTest "5 level nesting" (do
33-
return assertEqual #[0, 2, 2, 3, 8, 100, 4, 50, (-2)] (FlattenArray.flatten (FlattenArray.Box.many #[
34-
(FlattenArray.Box.one 0),
35-
(FlattenArray.Box.one 2),
36-
(FlattenArray.Box.many #[
37-
(FlattenArray.Box.many #[
38-
(FlattenArray.Box.one 2),
39-
(FlattenArray.Box.one 3)]),
40-
(FlattenArray.Box.one 8),
41-
(FlattenArray.Box.one 100),
42-
(FlattenArray.Box.one 4),
43-
(FlattenArray.Box.many #[
44-
(FlattenArray.Box.many #[
45-
(FlattenArray.Box.many #[
46-
(FlattenArray.Box.one 50)])])])]),
47-
(FlattenArray.Box.one (-2))])))
40+
return assertEqual #[
41+
0, 2, 2, 3, 8, 100, 4, 50, (-2)
42+
] (FlattenArray.flatten (FlattenArray.Box.many #[
43+
(FlattenArray.Box.one 0),
44+
(FlattenArray.Box.one 2),
45+
(FlattenArray.Box.many #[
46+
(FlattenArray.Box.many #[
47+
(FlattenArray.Box.one 2),
48+
(FlattenArray.Box.one 3)
49+
]),
50+
(FlattenArray.Box.one 8),
51+
(FlattenArray.Box.one 100),
52+
(FlattenArray.Box.one 4),
53+
(FlattenArray.Box.many #[
54+
(FlattenArray.Box.many #[
55+
(FlattenArray.Box.many #[
56+
(FlattenArray.Box.one 50)
57+
])
58+
])
59+
])
60+
]),
61+
(FlattenArray.Box.one (-2))
62+
])))
4863
|>.addTest "6 level nesting" (do
49-
return assertEqual #[1, 2, 3, 4, 5, 6, 7, 8] (FlattenArray.flatten (FlattenArray.Box.many #[
50-
(FlattenArray.Box.one 1),
51-
(FlattenArray.Box.many #[
52-
(FlattenArray.Box.one 2),
53-
(FlattenArray.Box.many #[
54-
(FlattenArray.Box.many #[
55-
(FlattenArray.Box.one 3)])]),
56-
(FlattenArray.Box.many #[
57-
(FlattenArray.Box.one 4),
58-
(FlattenArray.Box.many #[
59-
(FlattenArray.Box.many #[
60-
(FlattenArray.Box.one 5)])])]),
61-
(FlattenArray.Box.one 6),
62-
(FlattenArray.Box.one 7)]),
63-
(FlattenArray.Box.one 8)])))
64+
return assertEqual #[
65+
1, 2, 3, 4, 5, 6, 7, 8
66+
] (FlattenArray.flatten (FlattenArray.Box.many #[
67+
(FlattenArray.Box.one 1),
68+
(FlattenArray.Box.many #[
69+
(FlattenArray.Box.one 2),
70+
(FlattenArray.Box.many #[
71+
(FlattenArray.Box.many #[
72+
(FlattenArray.Box.one 3)
73+
])
74+
]),
75+
(FlattenArray.Box.many #[
76+
(FlattenArray.Box.one 4),
77+
(FlattenArray.Box.many #[
78+
(FlattenArray.Box.many #[
79+
(FlattenArray.Box.one 5)
80+
])
81+
])
82+
]),
83+
(FlattenArray.Box.one 6),
84+
(FlattenArray.Box.one 7)
85+
]),
86+
(FlattenArray.Box.one 8)
87+
])))
6488
|>.addTest "null values are omitted from the final result" (do
65-
return assertEqual #[1, 2] (FlattenArray.flatten (FlattenArray.Box.many #[
66-
(FlattenArray.Box.one 1),
67-
(FlattenArray.Box.one 2),
68-
FlattenArray.Box.zero])))
89+
return assertEqual #[
90+
1, 2
91+
] (FlattenArray.flatten (FlattenArray.Box.many #[
92+
(FlattenArray.Box.one 1),
93+
(FlattenArray.Box.one 2),
94+
FlattenArray.Box.zero
95+
])))
6996
|>.addTest "consecutive null values at the front of the array are omitted from the final result" (do
70-
return assertEqual #[3] (FlattenArray.flatten (FlattenArray.Box.many #[
71-
FlattenArray.Box.zero,
72-
FlattenArray.Box.zero,
73-
(FlattenArray.Box.one 3)])))
97+
return assertEqual #[
98+
3
99+
] (FlattenArray.flatten (FlattenArray.Box.many #[
100+
FlattenArray.Box.zero,
101+
FlattenArray.Box.zero,
102+
(FlattenArray.Box.one 3)
103+
])))
74104
|>.addTest "consecutive null values in the middle of the array are omitted from the final result" (do
75-
return assertEqual #[1, 4] (FlattenArray.flatten (FlattenArray.Box.many #[
76-
(FlattenArray.Box.one 1),
77-
FlattenArray.Box.zero,
78-
FlattenArray.Box.zero,
79-
(FlattenArray.Box.one 4)])))
105+
return assertEqual #[
106+
1, 4
107+
] (FlattenArray.flatten (FlattenArray.Box.many #[
108+
(FlattenArray.Box.one 1),
109+
FlattenArray.Box.zero,
110+
FlattenArray.Box.zero,
111+
(FlattenArray.Box.one 4)
112+
])))
80113
|>.addTest "6 level nested array with null values" (do
81-
return assertEqual #[0, 2, 2, 3, 8, 100, (-2)] (FlattenArray.flatten (FlattenArray.Box.many #[
82-
(FlattenArray.Box.one 0),
83-
(FlattenArray.Box.one 2),
84-
(FlattenArray.Box.many #[
85-
(FlattenArray.Box.many #[
86-
(FlattenArray.Box.one 2),
87-
(FlattenArray.Box.one 3)]),
88-
(FlattenArray.Box.one 8),
89-
(FlattenArray.Box.many #[
90-
(FlattenArray.Box.many #[
91-
(FlattenArray.Box.one 100)])]),
92-
FlattenArray.Box.zero,
93-
(FlattenArray.Box.many #[
94-
(FlattenArray.Box.many #[
95-
FlattenArray.Box.zero])])]),
96-
(FlattenArray.Box.one (-2))])))
114+
return assertEqual #[
115+
0, 2, 2, 3, 8, 100, (-2)
116+
] (FlattenArray.flatten (FlattenArray.Box.many #[
117+
(FlattenArray.Box.one 0),
118+
(FlattenArray.Box.one 2),
119+
(FlattenArray.Box.many #[
120+
(FlattenArray.Box.many #[
121+
(FlattenArray.Box.one 2),
122+
(FlattenArray.Box.one 3)
123+
]),
124+
(FlattenArray.Box.one 8),
125+
(FlattenArray.Box.many #[
126+
(FlattenArray.Box.many #[
127+
(FlattenArray.Box.one 100)
128+
])
129+
]),
130+
FlattenArray.Box.zero,
131+
(FlattenArray.Box.many #[
132+
(FlattenArray.Box.many #[
133+
FlattenArray.Box.zero
134+
])
135+
])
136+
]),
137+
(FlattenArray.Box.one (-2))
138+
])))
97139
|>.addTest "all values in nested array are null" (do
98140
return assertEqual #[] (FlattenArray.flatten (FlattenArray.Box.many #[
99-
FlattenArray.Box.zero,
100-
(FlattenArray.Box.many #[
101-
(FlattenArray.Box.many #[
102-
(FlattenArray.Box.many #[
103-
FlattenArray.Box.zero])])]),
104-
FlattenArray.Box.zero,
105-
FlattenArray.Box.zero,
106-
(FlattenArray.Box.many #[
107-
(FlattenArray.Box.many #[
108-
FlattenArray.Box.zero,
109-
FlattenArray.Box.zero]),
110-
FlattenArray.Box.zero]),
111-
FlattenArray.Box.zero])))
141+
FlattenArray.Box.zero,
142+
(FlattenArray.Box.many #[
143+
(FlattenArray.Box.many #[
144+
(FlattenArray.Box.many #[
145+
FlattenArray.Box.zero
146+
])
147+
])
148+
]),
149+
FlattenArray.Box.zero,
150+
FlattenArray.Box.zero,
151+
(FlattenArray.Box.many #[
152+
(FlattenArray.Box.many #[
153+
FlattenArray.Box.zero,
154+
FlattenArray.Box.zero
155+
]),
156+
FlattenArray.Box.zero
157+
]),
158+
FlattenArray.Box.zero
159+
])))
112160

113161
def main : IO UInt32 := do
114162
runTestSuitesWithExitCode [flattenArrayTests]

generators/Generator/Generator.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import Generator.RomanNumeralsGenerator
4444
import Generator.ArmstrongNumbersGenerator
4545
import Generator.GrainsGenerator
4646
import Generator.LeapGenerator
47+
import Generator.FlattenArrayGenerator
4748
import Generator.ForthGenerator
4849
import Generator.TriangleGenerator
4950
import Generator.AnagramGenerator
@@ -105,6 +106,7 @@ def dispatch : Std.HashMap String (introGenerator × testCaseGenerator × endBod
105106
("ArmstrongNumbers", (ArmstrongNumbersGenerator.genIntro, ArmstrongNumbersGenerator.genTestCase, ArmstrongNumbersGenerator.genEnd)),
106107
("Grains", (GrainsGenerator.genIntro, GrainsGenerator.genTestCase, GrainsGenerator.genEnd)),
107108
("Leap", (LeapGenerator.genIntro, LeapGenerator.genTestCase, LeapGenerator.genEnd)),
109+
("FlattenArray", (FlattenArrayGenerator.genIntro, FlattenArrayGenerator.genTestCase, FlattenArrayGenerator.genEnd)),
108110
("Forth", (ForthGenerator.genIntro, ForthGenerator.genTestCase, ForthGenerator.genEnd)),
109111
("Triangle", (TriangleGenerator.genIntro, TriangleGenerator.genTestCase, TriangleGenerator.genEnd)),
110112
("Anagram", (AnagramGenerator.genIntro, AnagramGenerator.genTestCase, AnagramGenerator.genEnd))
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import Lean.Data.Json
2+
import Std
3+
import Helper
4+
5+
open Lean
6+
open Std
7+
open Helper
8+
9+
namespace FlattenArrayGenerator
10+
11+
def genIntro (exercise : String) : String := s!"import LeanTest
12+
import {exercise}
13+
14+
open LeanTest
15+
16+
def {exercise.decapitalize}Tests : TestSuite :=
17+
(TestSuite.empty \"{exercise}\")"
18+
19+
def serializeList2
20+
(indent : String)
21+
(json : Json)
22+
(serializer : Json → String := fun j => s!"{j}")
23+
: String :=
24+
let separator : String := s!",\n{indent} "
25+
let contents := serializeContent json serializer
26+
match contents with
27+
| [] => "[]"
28+
| xs =>
29+
let joined := String.intercalate separator xs
30+
s!"[\n{indent} {joined}\n{indent}]"
31+
32+
partial def serializeInt (num : Json) : String :=
33+
num |>.getInt? |> getOk |> intLiteral
34+
35+
partial def serializer (indent : String) (array : Json) : String :=
36+
match array with
37+
| .num _ => s!"(FlattenArray.Box.one {serializeInt array})"
38+
| .arr _ => "(FlattenArray.Box.many #" ++ (serializeList2 indent array (serializer (indent ++ " "))) ++ ")"
39+
| _ => "FlattenArray.Box.zero"
40+
41+
def genTestCase (exercise : String) (case : TreeMap.Raw String Json) : String :=
42+
let array := case.get! "input"
43+
|> (·.getObjValD "array")
44+
let expected := case.get! "expected"
45+
let description := case.get! "description"
46+
|> (·.compress)
47+
let funName := getFunName (case.get! "property")
48+
let call := s!"({exercise}.{funName} {serializer indent array})"
49+
s!"
50+
|>.addTest {description} (do
51+
return assertEqual #{serializeList expected serializeInt ", "} {call})"
52+
53+
def genEnd (exercise : String) : String :=
54+
s!"
55+
56+
def main : IO UInt32 := do
57+
runTestSuitesWithExitCode [{exercise.decapitalize}Tests]
58+
"
59+
60+
end FlattenArrayGenerator

0 commit comments

Comments
 (0)