Skip to content

Commit db97b71

Browse files
GKotfisErikSchierboom
authored andcommitted
Add OCR Numbers Test Generator (#450)
* Add OCR Numbers Test Generator * - Cleanup using - Rename method to more meaningful * Revert unwanted .csproj changes * Simplify test generator * Set Exception for failure cases * Modify example to cover: - error cases: invalid lines/columns numbers - multiline input joined by commas * Regenerate tests
1 parent 3db8306 commit db97b71

File tree

3 files changed

+225
-98
lines changed

3 files changed

+225
-98
lines changed

exercises/ocr-numbers/Example.cs

Lines changed: 60 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,67 @@ public static class OcrNumbers
1010
public static string Convert(string input)
1111
{
1212
var lines = input.Split('\n');
13-
13+
14+
if (lines.Length > CharacterHeight)
15+
lines = GetTransformedInput(lines);
16+
1417
return Positions(lines).Aggregate("", (str, pos) => str + ConvertCharacter(lines, pos.Item1, pos.Item2));
1518
}
1619

20+
/// <summary>
21+
/// Transform multilines input into one line digits separate by comma
22+
/// </summary>
23+
/// <param name="lines"></param>
24+
/// <returns></returns>
25+
private static string[] GetTransformedInput(string[] lines)
26+
{
27+
string[] transformedLines = new string[CharacterHeight];
28+
29+
for (int x = 0, characterRow = 0; x < lines.Length; x++, characterRow++)
30+
{
31+
if (characterRow > 3)
32+
characterRow = 0;
33+
34+
for (int y = 0; y < lines[x].Length; y++)
35+
transformedLines[characterRow] += lines[x][y];
36+
37+
//for empty & last line add comma
38+
if (string.IsNullOrWhiteSpace(lines[x]) && lines.Length - 1 != x)
39+
{
40+
for (int i = 0; i < CharacterHeight; i++)
41+
transformedLines[i] += i == CharacterWidth - 1 ? " ," : " ";
42+
}
43+
}
44+
45+
return transformedLines;
46+
}
47+
1748
private static IEnumerable<Tuple<int, int>> Positions(string[] lines)
1849
{
1950
return from x in Enumerable.Range(0, Rows(lines))
2051
from y in Enumerable.Range(0, Cols(lines))
2152
select Tuple.Create(x, y);
2253
}
2354

24-
private static int Cols(string[] lines) => lines[0].Length / CharacterWidth;
55+
private static int Cols(string[] lines)
56+
{
57+
return lines[0].Length % CharacterWidth == 0
58+
? lines[0].Length / CharacterWidth
59+
: throw new ArgumentException();
60+
}
61+
62+
private static int Rows(string[] lines)
63+
{
64+
return lines.Length % CharacterHeight == 0
65+
? lines.Length / CharacterHeight
66+
: throw new ArgumentException();
67+
}
68+
69+
private static bool IsEmptyLine(string line)
70+
{
71+
return string.IsNullOrWhiteSpace(line);
72+
}
2573

26-
private static int Rows(string[] lines) => lines.Length / CharacterHeight;
27-
2874
private static char ConvertCharacter(string[] input, int row, int col) => MatchCharacter(Character(input, row, col));
2975

3076
private static string Character(string[] input, int row, int col)
@@ -41,9 +87,9 @@ private static char MatchCharacter(string character)
4187
private static readonly IReadOnlyDictionary<string, char> CharactersMap = new Dictionary<string, char>
4288
{
4389
{
44-
" _ " +
45-
"| |" +
46-
"|_|" +
90+
" _ " +
91+
"| |" +
92+
"|_|" +
4793
" ",
4894
'0'
4995
},
@@ -109,6 +155,13 @@ private static char MatchCharacter(string character)
109155
" _|" +
110156
" ",
111157
'9'
158+
},
159+
{
160+
" " +
161+
" " +
162+
" ," +
163+
" ",
164+
','
112165
}
113166
};
114167
}
Lines changed: 136 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,154 +1,199 @@
1-
using Xunit;
1+
// This file was auto-generated based on version 1.0.0 of the canonical data.
2+
3+
using Xunit;
4+
using System;
25

36
public class OcrNumbersTest
47
{
58
[Fact]
6-
public void Recognizes_zero()
9+
public void Recognizes_0()
710
{
8-
var converted = OcrNumbers.Convert(" _ " + "\n" +
9-
"| |" + "\n" +
10-
"|_|" + "\n" +
11-
" ");
12-
Assert.Equal("0", converted);
11+
var input = " _ " + "\n" +
12+
"| |" + "\n" +
13+
"|_|" + "\n" +
14+
" ";
15+
var actual = OcrNumbers.Convert(input);
16+
Assert.Equal("0", actual);
1317
}
1418

1519
[Fact(Skip = "Remove to run test")]
16-
public void Recognizes_one()
20+
public void Recognizes_1()
1721
{
18-
var converted = OcrNumbers.Convert(" " + "\n" +
19-
" |" + "\n" +
20-
" |" + "\n" +
21-
" ");
22-
Assert.Equal("1", converted);
22+
var input = " " + "\n" +
23+
" |" + "\n" +
24+
" |" + "\n" +
25+
" ";
26+
var actual = OcrNumbers.Convert(input);
27+
Assert.Equal("1", actual);
2328
}
2429

2530
[Fact(Skip = "Remove to run test")]
26-
public void Recognizes_two()
31+
public void Unreadable_but_correctly_sized_inputs_return_()
2732
{
28-
var converted = OcrNumbers.Convert(" _ " + "\n" +
29-
" _|" + "\n" +
30-
"|_ " + "\n" +
31-
" ");
32-
Assert.Equal("2", converted);
33+
var input = " " + "\n" +
34+
" _" + "\n" +
35+
" |" + "\n" +
36+
" ";
37+
var actual = OcrNumbers.Convert(input);
38+
Assert.Equal("?", actual);
3339
}
3440

3541
[Fact(Skip = "Remove to run test")]
36-
public void Recognizes_three()
42+
public void Input_with_a_number_of_lines_that_is_not_a_multiple_of_four_raises_an_error()
3743
{
38-
var converted = OcrNumbers.Convert(" _ " + "\n" +
39-
" _|" + "\n" +
40-
" _|" + "\n" +
41-
" ");
42-
Assert.Equal("3", converted);
44+
var input = " _ " + "\n" +
45+
"| |" + "\n" +
46+
" ";
47+
Assert.Throws<ArgumentException>(() => OcrNumbers.Convert(input));
4348
}
4449

4550
[Fact(Skip = "Remove to run test")]
46-
public void Recognizes_four()
51+
public void Input_with_a_number_of_columns_that_is_not_a_multiple_of_three_raises_an_error()
4752
{
48-
var converted = OcrNumbers.Convert(" " + "\n" +
49-
"|_|" + "\n" +
50-
" |" + "\n" +
51-
" ");
52-
Assert.Equal("4", converted);
53+
var input = " " + "\n" +
54+
" |" + "\n" +
55+
" |" + "\n" +
56+
" ";
57+
Assert.Throws<ArgumentException>(() => OcrNumbers.Convert(input));
5358
}
5459

5560
[Fact(Skip = "Remove to run test")]
56-
public void Recognizes_five()
61+
public void Recognizes_110101100()
5762
{
58-
var converted = OcrNumbers.Convert(" _ " + "\n" +
59-
"|_ " + "\n" +
60-
" _|" + "\n" +
61-
" ");
62-
Assert.Equal("5", converted);
63+
var input = " _ _ _ _ " + "\n" +
64+
" | || | || | | || || |" + "\n" +
65+
" | ||_| ||_| | ||_||_|" + "\n" +
66+
" ";
67+
var actual = OcrNumbers.Convert(input);
68+
Assert.Equal("110101100", actual);
6369
}
6470

6571
[Fact(Skip = "Remove to run test")]
66-
public void Recognizes_six()
72+
public void Garbled_numbers_in_a_string_are_replaced_with_()
6773
{
68-
var converted = OcrNumbers.Convert(" _ " + "\n" +
69-
"|_ " + "\n" +
70-
"|_|" + "\n" +
71-
" ");
72-
Assert.Equal("6", converted);
74+
var input = " _ _ _ " + "\n" +
75+
" | || | || | || || |" + "\n" +
76+
" | | _| ||_| | ||_||_|" + "\n" +
77+
" ";
78+
var actual = OcrNumbers.Convert(input);
79+
Assert.Equal("11?10?1?0", actual);
7380
}
7481

7582
[Fact(Skip = "Remove to run test")]
76-
public void Recognizes_seven()
83+
public void Recognizes_2()
7784
{
78-
var converted = OcrNumbers.Convert(" _ " + "\n" +
79-
" |" + "\n" +
80-
" |" + "\n" +
81-
" ");
82-
Assert.Equal("7", converted);
85+
var input = " _ " + "\n" +
86+
" _|" + "\n" +
87+
"|_ " + "\n" +
88+
" ";
89+
var actual = OcrNumbers.Convert(input);
90+
Assert.Equal("2", actual);
8391
}
8492

8593
[Fact(Skip = "Remove to run test")]
86-
public void Recognizes_eight()
94+
public void Recognizes_3()
8795
{
88-
var converted = OcrNumbers.Convert(" _ " + "\n" +
89-
"|_|" + "\n" +
90-
"|_|" + "\n" +
91-
" ");
92-
Assert.Equal("8", converted);
96+
var input = " _ " + "\n" +
97+
" _|" + "\n" +
98+
" _|" + "\n" +
99+
" ";
100+
var actual = OcrNumbers.Convert(input);
101+
Assert.Equal("3", actual);
93102
}
94103

95104
[Fact(Skip = "Remove to run test")]
96-
public void Recognizes_nine()
105+
public void Recognizes_4()
97106
{
98-
var converted = OcrNumbers.Convert(" _ " + "\n" +
99-
"|_|" + "\n" +
100-
" _|" + "\n" +
101-
" ");
102-
Assert.Equal("9", converted);
107+
var input = " " + "\n" +
108+
"|_|" + "\n" +
109+
" |" + "\n" +
110+
" ";
111+
var actual = OcrNumbers.Convert(input);
112+
Assert.Equal("4", actual);
103113
}
104114

105115
[Fact(Skip = "Remove to run test")]
106-
public void Recognizes_garble()
116+
public void Recognizes_5()
107117
{
108-
var converted = OcrNumbers.Convert(" " + "\n" +
109-
"| |" + "\n" +
110-
"| |" + "\n" +
111-
" ");
112-
Assert.Equal("?", converted);
118+
var input = " _ " + "\n" +
119+
"|_ " + "\n" +
120+
" _|" + "\n" +
121+
" ";
122+
var actual = OcrNumbers.Convert(input);
123+
Assert.Equal("5", actual);
113124
}
114125

115126
[Fact(Skip = "Remove to run test")]
116-
public void Recognizes_ten()
127+
public void Recognizes_6()
117128
{
118-
var converted = OcrNumbers.Convert(" _ " + "\n" +
119-
" || |" + "\n" +
120-
" ||_|" + "\n" +
121-
" ");
122-
Assert.Equal("10", converted);
129+
var input = " _ " + "\n" +
130+
"|_ " + "\n" +
131+
"|_|" + "\n" +
132+
" ";
133+
var actual = OcrNumbers.Convert(input);
134+
Assert.Equal("6", actual);
123135
}
124136

125137
[Fact(Skip = "Remove to run test")]
126-
public void Recognizes_110101100()
138+
public void Recognizes_7()
139+
{
140+
var input = " _ " + "\n" +
141+
" |" + "\n" +
142+
" |" + "\n" +
143+
" ";
144+
var actual = OcrNumbers.Convert(input);
145+
Assert.Equal("7", actual);
146+
}
147+
148+
[Fact(Skip = "Remove to run test")]
149+
public void Recognizes_8()
150+
{
151+
var input = " _ " + "\n" +
152+
"|_|" + "\n" +
153+
"|_|" + "\n" +
154+
" ";
155+
var actual = OcrNumbers.Convert(input);
156+
Assert.Equal("8", actual);
157+
}
158+
159+
[Fact(Skip = "Remove to run test")]
160+
public void Recognizes_9()
127161
{
128-
var converted = OcrNumbers.Convert(" _ _ _ _ " + "\n" +
129-
" | || | || | | || || |" + "\n" +
130-
" | ||_| ||_| | ||_||_|" + "\n" +
131-
" ");
132-
Assert.Equal("110101100", converted);
162+
var input = " _ " + "\n" +
163+
"|_|" + "\n" +
164+
" _|" + "\n" +
165+
" ";
166+
var actual = OcrNumbers.Convert(input);
167+
Assert.Equal("9", actual);
133168
}
134169

135170
[Fact(Skip = "Remove to run test")]
136-
public void Recognizes_numbers_and_garble()
171+
public void Recognizes_string_of_decimal_numbers()
137172
{
138-
var converted = OcrNumbers.Convert(" _ _ _ " + "\n" +
139-
" | || | || | || || |" + "\n" +
140-
" | | _| ||_| | ||_||_|" + "\n" +
141-
" ");
142-
Assert.Equal("11?10?1?0", converted);
173+
var input = " _ _ _ _ _ _ _ _ " + "\n" +
174+
" | _| _||_||_ |_ ||_||_|| |" + "\n" +
175+
" ||_ _| | _||_| ||_| _||_|" + "\n" +
176+
" ";
177+
var actual = OcrNumbers.Convert(input);
178+
Assert.Equal("1234567890", actual);
143179
}
144180

145181
[Fact(Skip = "Remove to run test")]
146-
public void Recognizes_1234567890()
182+
public void Numbers_separated_by_empty_lines_are_recognized_lines_are_joined_by_commas_()
147183
{
148-
var converted = OcrNumbers.Convert(" _ _ _ _ _ _ _ _ " + "\n" +
149-
" | _| _||_||_ |_ ||_||_|| |" + "\n" +
150-
" ||_ _| | _||_| ||_| _||_|" + "\n" +
151-
" ");
152-
Assert.Equal("1234567890", converted);
184+
var input = " _ _ " + "\n" +
185+
" | _| _|" + "\n" +
186+
" ||_ _|" + "\n" +
187+
" " + "\n" +
188+
" _ _ " + "\n" +
189+
"|_||_ |_ " + "\n" +
190+
" | _||_|" + "\n" +
191+
" " + "\n" +
192+
" _ _ _ " + "\n" +
193+
" ||_||_|" + "\n" +
194+
" ||_| _|" + "\n" +
195+
" ";
196+
var actual = OcrNumbers.Convert(input);
197+
Assert.Equal("123,456,789", actual);
153198
}
154199
}

0 commit comments

Comments
 (0)