From 41b3885b8f219bb8e981b3fdcafb7f6b9c49f99c Mon Sep 17 00:00:00 2001 From: Denis Belyshev Date: Tue, 10 Jul 2018 12:34:45 +0300 Subject: [PATCH 01/13] 05: Removed excess code from workshop, created new type for digit, added definitions for all numbers, created initial failed test. --- tdd_intro/homework/05_bank_ocr/test.cpp | 127 +++++++++--------------- 1 file changed, 47 insertions(+), 80 deletions(-) diff --git a/tdd_intro/homework/05_bank_ocr/test.cpp b/tdd_intro/homework/05_bank_ocr/test.cpp index e7852dc..a0b5646 100644 --- a/tdd_intro/homework/05_bank_ocr/test.cpp +++ b/tdd_intro/homework/05_bank_ocr/test.cpp @@ -98,90 +98,57 @@ Example input and output // - parse // parse several lines -using Digit = std::vector; - -const Digit s_1({" ", - " |", - " |"}); - -const Digit s_2({" _ ", - " _|", - "|_ "}); - -std::vector s_digits({ - -}); - -bool CheckMatrixDimension(const Digit& digit) -{ - const size_t prefferedSize = 3; - - if (digit.size() != prefferedSize) - { - return false; - } - - for (const std::string& line : digit) - { - if (line.size() != prefferedSize) - { - return false; - } - } - - return true; -} - -std::string ParseDigit(const Digit& digit) -{ - if (digit == Digit({" ", - " |", - " |"})) - { - return "1"; - } - else if (digit == Digit({" _ ", - " _|", - "|_ "})) - { - return "2"; - } - - return "8"; -} - -TEST(BankOCRTests, Check_Matrix_dimension_true) +using Digit = char[3][4]; + +const Digit s_0 = { " _ ", + "| |", + "|_|" + }; +const Digit s_1 = { " ", + " |", + " |" + }; +const Digit s_2 = { " _ ", + " _|", + "|_ " + }; +const Digit s_3 = { " _ ", + " _|", + " _|" + }; +const Digit s_4 = { " ", + "|_|", + " |" + }; +const Digit s_5 = { " _ ", + "|_ ", + " _|" + }; +const Digit s_6 = { " _ ", + "|_ ", + "|_|" + }; +const Digit s_7 = { " _ ", + " |", + " |" + }; +const Digit s_8 = { " _ ", + "|_|", + "|_|" + }; +const Digit s_9 = { " _ ", + "|_|", + " _|" + }; + +using Number = unsigned char; +Number DigitToNumber(const Digit& digit) { - Digit digit = {" ", " ", " "}; - EXPECT_TRUE(CheckMatrixDimension(digit)); -} -TEST(BankOCRTests, Check_Matrix_dimension_false) -{ - Digit digit = {" ", "! ", " "}; - EXPECT_FALSE(CheckMatrixDimension(digit)); } -TEST(BankOCRTests, ParseDigit_1) -{ - Digit digit = {" ", - " |", - " |"}; - EXPECT_EQ("1", ParseDigit(digit)); -} - -TEST(BankOCRTests, ParseDigit_2) -{ - Digit digit = {" _ ", - " _|", - "|_ "}; - EXPECT_EQ("2", ParseDigit(digit)); -} -TEST(BankOCRTests, ParseDigit_8) +TEST(BankOCRTests, ParseDigit_0) { - Digit digit = {" _ ", - "|_|", - "|_|"}; - EXPECT_EQ("8", ParseDigit(digit)); + EXPECT_EQ(0, DigitToNumber(s_0)); } From d0f0b6c071afe9f5ee19560b4eaae2435f548bec Mon Sep 17 00:00:00 2001 From: Denis Belyshev Date: Tue, 10 Jul 2018 12:39:00 +0300 Subject: [PATCH 02/13] 05: removed other projects from build. first green test --- tdd_intro/homework/05_bank_ocr/test.cpp | 4 +- tdd_intro/homework/homework.pro | 16 +- tdd_intro/tdd_intro.pro.user | 734 +----------------------- tdd_intro/workshops/workshops.pro | 14 +- 4 files changed, 36 insertions(+), 732 deletions(-) diff --git a/tdd_intro/homework/05_bank_ocr/test.cpp b/tdd_intro/homework/05_bank_ocr/test.cpp index a0b5646..69eff67 100644 --- a/tdd_intro/homework/05_bank_ocr/test.cpp +++ b/tdd_intro/homework/05_bank_ocr/test.cpp @@ -98,7 +98,7 @@ Example input and output // - parse // parse several lines -using Digit = char[3][4]; +using Digit = char[3][4]; // 4 is 3 + 1 for the null terminator const Digit s_0 = { " _ ", "| |", @@ -144,7 +144,7 @@ const Digit s_9 = { " _ ", using Number = unsigned char; Number DigitToNumber(const Digit& digit) { - + return 0; } diff --git a/tdd_intro/homework/homework.pro b/tdd_intro/homework/homework.pro index 92bc4f7..e5e406a 100644 --- a/tdd_intro/homework/homework.pro +++ b/tdd_intro/homework/homework.pro @@ -1,12 +1,12 @@ TEMPLATE = subdirs SUBDIRS += \ - 01_bob \ - 02_leap_year \ - 03_anagram \ - 04_trinary_numbers \ - 05_word_wrapp \ + #01_bob \ + #02_leap_year \ + #03_anagram \ + #04_trinary_numbers \ + #05_word_wrapp \ 05_bank_ocr \ - 06_allergies \ - 07_filecopier \ - 08_timer + #06_allergies \ + #07_filecopier \ + #08_timer diff --git a/tdd_intro/tdd_intro.pro.user b/tdd_intro/tdd_intro.pro.user index e4cdef8..c7ab5f7 100644 --- a/tdd_intro/tdd_intro.pro.user +++ b/tdd_intro/tdd_intro.pro.user @@ -1,10 +1,10 @@ - + EnvironmentId - {f70a0dd6-3871-4c73-bc87-e473c39bca7a} + {0cec21e3-b32f-4f16-9337-d30f16ca07a8} ProjectExplorer.Project.ActiveTarget @@ -30,12 +30,12 @@ 2 UTF-8 - true + false 4 false 80 true - false + true 1 true false @@ -59,14 +59,14 @@ ProjectExplorer.Project.Target.0 - 5.7.0 - 5.7.0 - {1d82d85e-e2b0-49a5-8ca5-1516886ad9e7} + Desktop Qt 5.10.1 MSVC2017 64bit + Desktop Qt 5.10.1 MSVC2017 64bit + qt.qt5.5101.win64_msvc2017_64_kit 0 0 0 - D:/Study/tdd-course-2/build-tdd_intro-5_7_0-Debug + D:/Projects/TDD/build-tdd_intro-Desktop_Qt_5_10_1_MSVC2017_64bit-Debug true @@ -114,13 +114,13 @@ false Debug - + Debug Qt4ProjectManager.Qt4BuildConfiguration 2 true - D:/Study/tdd-course-2/build-tdd_intro-5_7_0-Release + D:/Projects/TDD/build-tdd_intro-Desktop_Qt_5_10_1_MSVC2017_64bit-Release true @@ -168,13 +168,13 @@ false Release - + Release Qt4ProjectManager.Qt4BuildConfiguration 0 true - D:/Study/tdd-course-2/build-tdd_intro-5_7_0-Profile + D:/Projects/TDD/build-tdd_intro-Desktop_Qt_5_10_1_MSVC2017_64bit-Profile true @@ -222,7 +222,7 @@ false Profile - + Profile Qt4ProjectManager.Qt4BuildConfiguration 0 true @@ -236,7 +236,7 @@ ProjectExplorer.BuildSteps.Deploy 1 - Deploy locally + Deploy Configuration ProjectExplorer.DefaultDeployConfiguration @@ -286,7 +286,7 @@ chatclient - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/cleanroom/chatclient/chatclient.pro + Qt4ProjectManager.Qt4RunConfiguration:D:/Projects/TDD/tdd_intro/cleanroom/chatclient/chatclient.pro true cleanroom/chatclient/chatclient.pro @@ -342,708 +342,12 @@ 2 - 01_bob - - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/homework/01_bob/01_bob.pro - true - - homework/01_bob/01_bob.pro - false - - - 3768 - false - true - false - false - true - - - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - 2 - - 02_word_count - - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/workshops/02_word_count/02_word_count.pro - true - - workshops/02_word_count/02_word_count.pro - false - - - 3768 - false - true - false - false - true - - - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - 2 - - 03_armstrong_number - - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/workshops/03_armstrong_number/03_armstrong_number.pro - true - - workshops/03_armstrong_number/03_armstrong_number.pro - false - - - 3768 - false - true - false - false - true - - - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - 2 - - 04_roman_numerals - - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/workshops/04_roman_numerals/04_roman_numerals.pro - true - - workshops/04_roman_numerals/04_roman_numerals.pro - false - - - 3768 - false - true - false - false - true - - - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - 2 - - 05_word_wrapp - 05_word_wrapp2 - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/workshops/05_word_wrapp/05_word_wrapp.pro - true - - workshops/05_word_wrapp/05_word_wrapp.pro - false - - - 3768 - false - true - false - false - true - - - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - 2 - - 02_leap_year - - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/homework/02_leap_year/02_leap_year.pro - true - - homework/02_leap_year/02_leap_year.pro - false - - - 3768 - false - true - false - false - true - - - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - 2 - - 03_anagram - - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/homework/03_anagram/03_anagram.pro - true - - homework/03_anagram/03_anagram.pro - false - - - 3768 - false - true - false - false - true - - - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - 2 - - 04_trinary_numbers - - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/homework/04_trinary_numbers/04_trinary_numbers.pro - true - - homework/04_trinary_numbers/04_trinary_numbers.pro - false - - - 3768 - false - true - false - false - true - - - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - 2 - - 05_word_wrapp - - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/homework/05_word_wrapp/05_word_wrapp.pro - true - - homework/05_word_wrapp/05_word_wrapp.pro - false - - - 3768 - false - true - false - false - true - - - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - 2 - - 06_bank_ocr - - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/homework/06_bank_ocr/06_bank_ocr.pro - true - - homework/06_bank_ocr/06_bank_ocr.pro - false - - - 3768 - false - true - false - false - true - - - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - 2 - - 07_filecopier - - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/homework/07_filecopier/07_filecopier.pro - true - - homework/07_filecopier/07_filecopier.pro - false - - - 3768 - false - true - false - false - true - - - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - 2 - - 08_timer - - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/homework/08_timer/08_timer.pro - true - - homework/08_timer/08_timer.pro - false - - - 3768 - false - true - false - false - true - - - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - 2 - - 01_fizz_buzz + 05_bank_ocr - Qt4ProjectManager.Qt4RunConfiguration:D:/Study/tdd-course-2/tdd_intro/workshops/01_fizz_buzz/01_fizz_buzz.pro + Qt4ProjectManager.Qt4RunConfiguration:D:/Projects/TDD/tdd_intro/homework/05_bank_ocr/05_bank_ocr.pro true - workshops/01_fizz_buzz/01_fizz_buzz.pro + homework/05_bank_ocr/05_bank_ocr.pro false @@ -1054,7 +358,7 @@ false true - 14 + 2 diff --git a/tdd_intro/workshops/workshops.pro b/tdd_intro/workshops/workshops.pro index 72daf7c..c48db1d 100644 --- a/tdd_intro/workshops/workshops.pro +++ b/tdd_intro/workshops/workshops.pro @@ -1,10 +1,10 @@ TEMPLATE = subdirs SUBDIRS += \ - 01_fizz_buzz \ - 02_word_count \ - 03_armstrong_number \ - 04_roman_numerals \ - 05_word_wrapp \ - 05_bank_ocr\ - 07_coffee + #01_fizz_buzz \ + #02_word_count \ + #03_armstrong_number \ + #04_roman_numerals \ + #05_word_wrapp \ + #05_bank_ocr\ + #07_coffee From dd9cbfef69b8cca610b71bc84e9d6ebfc35d1122 Mon Sep 17 00:00:00 2001 From: Denis Belyshev Date: Tue, 10 Jul 2018 12:42:43 +0300 Subject: [PATCH 03/13] 05: red --- tdd_intro/homework/05_bank_ocr/test.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/tdd_intro/homework/05_bank_ocr/test.cpp b/tdd_intro/homework/05_bank_ocr/test.cpp index 69eff67..f0fa3a4 100644 --- a/tdd_intro/homework/05_bank_ocr/test.cpp +++ b/tdd_intro/homework/05_bank_ocr/test.cpp @@ -147,8 +147,20 @@ Number DigitToNumber(const Digit& digit) return 0; } +TEST(BankOCRTests, DigitToNumber_0) +{ + EXPECT_EQ(0, DigitToNumber(Digit { " _ ", + "| |", + "|_|" + } + )); +} -TEST(BankOCRTests, ParseDigit_0) +TEST(BankOCRTests, DigitToNumber_1) { - EXPECT_EQ(0, DigitToNumber(s_0)); + EXPECT_EQ(1, DigitToNumber(Digit { " ", + " |", + " |" + } + )); } From 71938d4916e7776264cd181a599d5ec06c2e2d02 Mon Sep 17 00:00:00 2001 From: Denis Belyshev Date: Tue, 10 Jul 2018 12:48:40 +0300 Subject: [PATCH 04/13] 05: green --- tdd_intro/homework/05_bank_ocr/test.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tdd_intro/homework/05_bank_ocr/test.cpp b/tdd_intro/homework/05_bank_ocr/test.cpp index f0fa3a4..f0b14f6 100644 --- a/tdd_intro/homework/05_bank_ocr/test.cpp +++ b/tdd_intro/homework/05_bank_ocr/test.cpp @@ -141,9 +141,20 @@ const Digit s_9 = { " _ ", " _|" }; +bool DigitsAreEqual(const Digit& left, const Digit& right) +{ + return strcmp(left[0], right[0]) == 0 && + strcmp(left[1], right[1]) == 0 && + strcmp(left[2], right[2]) == 0; +} + using Number = unsigned char; Number DigitToNumber(const Digit& digit) { + if (DigitsAreEqual(digit, s_1)) + { + return 1; + } return 0; } From 0260fad0e4e647f6e6e8d9ae0c50d41980c7e906 Mon Sep 17 00:00:00 2001 From: Denis Belyshev Date: Tue, 10 Jul 2018 12:50:01 +0300 Subject: [PATCH 05/13] 05: red --- tdd_intro/homework/05_bank_ocr/test.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tdd_intro/homework/05_bank_ocr/test.cpp b/tdd_intro/homework/05_bank_ocr/test.cpp index f0b14f6..5086afb 100644 --- a/tdd_intro/homework/05_bank_ocr/test.cpp +++ b/tdd_intro/homework/05_bank_ocr/test.cpp @@ -175,3 +175,12 @@ TEST(BankOCRTests, DigitToNumber_1) } )); } + +TEST(BankOCRTests, DigitToNumber_2) +{ + EXPECT_EQ(1, DigitToNumber(Digit { " _ ", + " _|", + "|_ " + } + )); +} From 8153a769dd29e9e16bbfb9a0f98939d3cb03541b Mon Sep 17 00:00:00 2001 From: Denis Belyshev Date: Tue, 10 Jul 2018 12:51:23 +0300 Subject: [PATCH 06/13] 05: green --- tdd_intro/homework/05_bank_ocr/test.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tdd_intro/homework/05_bank_ocr/test.cpp b/tdd_intro/homework/05_bank_ocr/test.cpp index 5086afb..4937ab4 100644 --- a/tdd_intro/homework/05_bank_ocr/test.cpp +++ b/tdd_intro/homework/05_bank_ocr/test.cpp @@ -155,6 +155,10 @@ Number DigitToNumber(const Digit& digit) { return 1; } + else if (DigitsAreEqual(digit, s_2)) + { + return 2; + } return 0; } @@ -178,7 +182,7 @@ TEST(BankOCRTests, DigitToNumber_1) TEST(BankOCRTests, DigitToNumber_2) { - EXPECT_EQ(1, DigitToNumber(Digit { " _ ", + EXPECT_EQ(2, DigitToNumber(Digit { " _ ", " _|", "|_ " } From 2f95cd9c0f77d68eccfbed0344976e0509099907 Mon Sep 17 00:00:00 2001 From: Denis Belyshev Date: Tue, 10 Jul 2018 13:09:40 +0300 Subject: [PATCH 07/13] 05: refactoring --- tdd_intro/homework/05_bank_ocr/test.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/tdd_intro/homework/05_bank_ocr/test.cpp b/tdd_intro/homework/05_bank_ocr/test.cpp index 4937ab4..afd1ee9 100644 --- a/tdd_intro/homework/05_bank_ocr/test.cpp +++ b/tdd_intro/homework/05_bank_ocr/test.cpp @@ -141,6 +141,8 @@ const Digit s_9 = { " _ ", " _|" }; +const std::vector s_possibleDigits = { &s_0, &s_1, &s_2, &s_3, &s_4, &s_5, &s_6, &s_7, &s_8, &s_9 }; + bool DigitsAreEqual(const Digit& left, const Digit& right) { return strcmp(left[0], right[0]) == 0 && @@ -151,15 +153,14 @@ bool DigitsAreEqual(const Digit& left, const Digit& right) using Number = unsigned char; Number DigitToNumber(const Digit& digit) { - if (DigitsAreEqual(digit, s_1)) - { - return 1; - } - else if (DigitsAreEqual(digit, s_2)) + for (Number n = 0; s_possibleDigits.size(); ++n) { - return 2; + if (DigitsAreEqual(digit, *s_possibleDigits.at(n))) + { + return n; + } } - return 0; + throw std::runtime_error("Digit could not be parsed"); } TEST(BankOCRTests, DigitToNumber_0) From 7177003fe165e4d7b41e260b77e3dc060c25e2fc Mon Sep 17 00:00:00 2001 From: Denis Belyshev Date: Tue, 10 Jul 2018 13:12:04 +0300 Subject: [PATCH 08/13] 05: first acceptance --- tdd_intro/homework/05_bank_ocr/test.cpp | 39 +++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/tdd_intro/homework/05_bank_ocr/test.cpp b/tdd_intro/homework/05_bank_ocr/test.cpp index afd1ee9..aaf54ea 100644 --- a/tdd_intro/homework/05_bank_ocr/test.cpp +++ b/tdd_intro/homework/05_bank_ocr/test.cpp @@ -189,3 +189,42 @@ TEST(BankOCRTests, DigitToNumber_2) } )); } + +TEST(BankOCRTests, DigitToNumber_Acceptance) +{ + EXPECT_EQ(3, DigitToNumber(Digit { " _ ", + " _|", + " _|" + } + )); + EXPECT_EQ(4, DigitToNumber(Digit { " ", + "|_|", + " |" + } + )); + EXPECT_EQ(5, DigitToNumber(Digit { " _ ", + "|_ ", + " _|" + } + )); + EXPECT_EQ(6, DigitToNumber(Digit { " _ ", + "|_ ", + "|_|" + } + )); + EXPECT_EQ(7, DigitToNumber(Digit { " _ ", + " |", + " |" + } + )); + EXPECT_EQ(8, DigitToNumber(Digit { " _ ", + "|_|", + "|_|" + } + )); + EXPECT_EQ(9, DigitToNumber(Digit { " _ ", + "|_|", + " _|" + } + )); +} From ace94ff15c439eb8a197231cc26e9475e5176384 Mon Sep 17 00:00:00 2001 From: Denis Belyshev Date: Tue, 10 Jul 2018 13:29:11 +0300 Subject: [PATCH 09/13] 05: red --- tdd_intro/homework/05_bank_ocr/test.cpp | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/tdd_intro/homework/05_bank_ocr/test.cpp b/tdd_intro/homework/05_bank_ocr/test.cpp index aaf54ea..61aba86 100644 --- a/tdd_intro/homework/05_bank_ocr/test.cpp +++ b/tdd_intro/homework/05_bank_ocr/test.cpp @@ -98,7 +98,9 @@ Example input and output // - parse // parse several lines -using Digit = char[3][4]; // 4 is 3 + 1 for the null terminator +const unsigned char s_digitHeight = 3; +const unsigned char s_digitWidth = 3; +using Digit = char[s_digitHeight][s_digitWidth + 1]; // + 1 for the null terminator const Digit s_0 = { " _ ", "| |", @@ -141,8 +143,6 @@ const Digit s_9 = { " _ ", " _|" }; -const std::vector s_possibleDigits = { &s_0, &s_1, &s_2, &s_3, &s_4, &s_5, &s_6, &s_7, &s_8, &s_9 }; - bool DigitsAreEqual(const Digit& left, const Digit& right) { return strcmp(left[0], right[0]) == 0 && @@ -153,6 +153,7 @@ bool DigitsAreEqual(const Digit& left, const Digit& right) using Number = unsigned char; Number DigitToNumber(const Digit& digit) { + static const std::vector s_possibleDigits = { &s_0, &s_1, &s_2, &s_3, &s_4, &s_5, &s_6, &s_7, &s_8, &s_9 }; for (Number n = 0; s_possibleDigits.size(); ++n) { if (DigitsAreEqual(digit, *s_possibleDigits.at(n))) @@ -163,6 +164,13 @@ Number DigitToNumber(const Digit& digit) throw std::runtime_error("Digit could not be parsed"); } +const unsigned char s_numbersOnDisplay = 9; +using DigitsDisplay = char[s_digitHeight][s_digitWidth * s_numbersOnDisplay + 1]; // + 1 for the null terminator +std::string ParseDisplay(const DigitsDisplay& display) +{ + return ""; +} + TEST(BankOCRTests, DigitToNumber_0) { EXPECT_EQ(0, DigitToNumber(Digit { " _ ", @@ -228,3 +236,12 @@ TEST(BankOCRTests, DigitToNumber_Acceptance) } )); } + +TEST(BankOCRTests, ParseDigits_000000000) +{ + DigitsDisplay nulls = { " _ _ _ _ _ _ _ _ _ ", + "| || || || || || || || || |", + "|_||_||_||_||_||_||_||_||_|" + }; + EXPECT_STREQ("000000000", ParseDisplay(nulls).c_str()); +} From 693a5135dca257287edb57629c0e131716bb2ee1 Mon Sep 17 00:00:00 2001 From: Denis Belyshev Date: Tue, 10 Jul 2018 13:29:43 +0300 Subject: [PATCH 10/13] 05: green --- tdd_intro/homework/05_bank_ocr/test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tdd_intro/homework/05_bank_ocr/test.cpp b/tdd_intro/homework/05_bank_ocr/test.cpp index 61aba86..ebbcf7f 100644 --- a/tdd_intro/homework/05_bank_ocr/test.cpp +++ b/tdd_intro/homework/05_bank_ocr/test.cpp @@ -168,7 +168,7 @@ const unsigned char s_numbersOnDisplay = 9; using DigitsDisplay = char[s_digitHeight][s_digitWidth * s_numbersOnDisplay + 1]; // + 1 for the null terminator std::string ParseDisplay(const DigitsDisplay& display) { - return ""; + return "000000000"; } TEST(BankOCRTests, DigitToNumber_0) From 625852d0f1d0095e83102f532af3621345199c12 Mon Sep 17 00:00:00 2001 From: Denis Belyshev Date: Tue, 10 Jul 2018 13:31:18 +0300 Subject: [PATCH 11/13] 05: red --- tdd_intro/homework/05_bank_ocr/test.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tdd_intro/homework/05_bank_ocr/test.cpp b/tdd_intro/homework/05_bank_ocr/test.cpp index ebbcf7f..7128ca2 100644 --- a/tdd_intro/homework/05_bank_ocr/test.cpp +++ b/tdd_intro/homework/05_bank_ocr/test.cpp @@ -245,3 +245,13 @@ TEST(BankOCRTests, ParseDigits_000000000) }; EXPECT_STREQ("000000000", ParseDisplay(nulls).c_str()); } + + +TEST(BankOCRTests, ParseDigits_111111111) +{ + DigitsDisplay ones = { " ", + " | | | | | | | | |", + " | | | | | | | | |" + }; + EXPECT_STREQ("111111111", ParseDisplay(ones).c_str()); +} From 7b8d136611b259015ed581e62060f8e2de4e4dcd Mon Sep 17 00:00:00 2001 From: Denis Belyshev Date: Tue, 10 Jul 2018 14:47:05 +0300 Subject: [PATCH 12/13] 05: green, refactoring --- tdd_intro/homework/05_bank_ocr/test.cpp | 101 +++++++++++++++++++++--- tdd_intro/tdd_intro.pro.user | 4 +- 2 files changed, 93 insertions(+), 12 deletions(-) diff --git a/tdd_intro/homework/05_bank_ocr/test.cpp b/tdd_intro/homework/05_bank_ocr/test.cpp index 7128ca2..8e42624 100644 --- a/tdd_intro/homework/05_bank_ocr/test.cpp +++ b/tdd_intro/homework/05_bank_ocr/test.cpp @@ -98,9 +98,47 @@ Example input and output // - parse // parse several lines -const unsigned char s_digitHeight = 3; -const unsigned char s_digitWidth = 3; -using Digit = char[s_digitHeight][s_digitWidth + 1]; // + 1 for the null terminator +using DigitView = std::vector; +class Digit +{ +public: + Digit(const std::initializer_list& lst) + { + DigitView view; + for (const auto& line : lst) { view.push_back(line); } + Init(view); + } + Digit(const DigitView& view) + { + Init(view); + } + + const DigitView& View() const { return m_view; } + + static constexpr unsigned char Height() { return 3; } + static constexpr unsigned char Width() { return 3; } + +private: + void Init(const DigitView& view) + { + if (view.size() != Height()) + { + throw std::runtime_error("Invalid digit view height"); + } + + for (const auto& line : view) + { + if (line.size() != Width()) + { + throw std::runtime_error("Invalid digit view width"); + } + } + m_view = view; + } + +private: + DigitView m_view; +}; const Digit s_0 = { " _ ", "| |", @@ -145,9 +183,14 @@ const Digit s_9 = { " _ ", bool DigitsAreEqual(const Digit& left, const Digit& right) { - return strcmp(left[0], right[0]) == 0 && - strcmp(left[1], right[1]) == 0 && - strcmp(left[2], right[2]) == 0; + for (unsigned char line = 0; line < Digit::Height(); ++line) + { + if (left.View().at(line) != right.View().at(line)) + { + return false; + } + } + return true; } using Number = unsigned char; @@ -164,11 +207,50 @@ Number DigitToNumber(const Digit& digit) throw std::runtime_error("Digit could not be parsed"); } -const unsigned char s_numbersOnDisplay = 9; -using DigitsDisplay = char[s_digitHeight][s_digitWidth * s_numbersOnDisplay + 1]; // + 1 for the null terminator +using DigitsDisplayView = std::vector; +class DigitsDisplay +{ +public: + DigitsDisplay(const std::initializer_list& lst) + { + if (lst.size() != Digit::Height()) + { + throw std::runtime_error("Invalid digit display view height"); + } + + for (const auto& line : lst) + { + if (line.size() != Width()) + { + throw std::runtime_error("Invalid digit display view width"); + } + m_view.push_back(line); + } + } + + const DigitsDisplayView& View() const { return m_view; } + + static constexpr unsigned char NumbersCount() { return 9; } + static constexpr unsigned char Height() { return Digit::Height(); } + static constexpr unsigned char Width() { return Digit::Width() * NumbersCount(); } + +private: + DigitsDisplayView m_view; +}; + std::string ParseDisplay(const DigitsDisplay& display) { - return "000000000"; + DigitView digitView(display.Height()); + std::string res; + for (unsigned char digitPos = 0; digitPos < display.Width(); digitPos += Digit::Width()) + { + for (unsigned char height = 0; height < display.Height(); ++height) + { + digitView.at(height) = display.View().at(height).substr(digitPos, Digit::Width()); + } + res += std::to_string(DigitToNumber(Digit(digitView))); + } + return res; } TEST(BankOCRTests, DigitToNumber_0) @@ -246,7 +328,6 @@ TEST(BankOCRTests, ParseDigits_000000000) EXPECT_STREQ("000000000", ParseDisplay(nulls).c_str()); } - TEST(BankOCRTests, ParseDigits_111111111) { DigitsDisplay ones = { " ", diff --git a/tdd_intro/tdd_intro.pro.user b/tdd_intro/tdd_intro.pro.user index c7ab5f7..ddc36da 100644 --- a/tdd_intro/tdd_intro.pro.user +++ b/tdd_intro/tdd_intro.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -64,7 +64,7 @@ qt.qt5.5101.win64_msvc2017_64_kit 0 0 - 0 + 1 D:/Projects/TDD/build-tdd_intro-Desktop_Qt_5_10_1_MSVC2017_64bit-Debug From 8ab247af630fd9e9ccf948e256a0de5696cdd77e Mon Sep 17 00:00:00 2001 From: Denis Belyshev Date: Tue, 10 Jul 2018 14:58:20 +0300 Subject: [PATCH 13/13] 05: second acceptance --- tdd_intro/homework/05_bank_ocr/test.cpp | 40 +++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/tdd_intro/homework/05_bank_ocr/test.cpp b/tdd_intro/homework/05_bank_ocr/test.cpp index 8e42624..65f2e29 100644 --- a/tdd_intro/homework/05_bank_ocr/test.cpp +++ b/tdd_intro/homework/05_bank_ocr/test.cpp @@ -336,3 +336,43 @@ TEST(BankOCRTests, ParseDigits_111111111) }; EXPECT_STREQ("111111111", ParseDisplay(ones).c_str()); } + +TEST(BankOCRTests, ParseDigits_Acceptance) +{ + EXPECT_STREQ("222222222", ParseDisplay({" _ _ _ _ _ _ _ _ _ ", + " _| _| _| _| _| _| _| _| _|", + "|_ |_ |_ |_ |_ |_ |_ |_ |_ "} + ).c_str()); + EXPECT_STREQ("333333333", ParseDisplay({" _ _ _ _ _ _ _ _ _ ", + " _| _| _| _| _| _| _| _| _|", + " _| _| _| _| _| _| _| _| _|"} + ).c_str()); + EXPECT_STREQ("444444444", ParseDisplay({" ", + "|_||_||_||_||_||_||_||_||_|", + " | | | | | | | | |"} + ).c_str()); + EXPECT_STREQ("555555555", ParseDisplay({" _ _ _ _ _ _ _ _ _ ", + "|_ |_ |_ |_ |_ |_ |_ |_ |_ ", + " _| _| _| _| _| _| _| _| _|"} + ).c_str()); + EXPECT_STREQ("666666666", ParseDisplay({" _ _ _ _ _ _ _ _ _ ", + "|_ |_ |_ |_ |_ |_ |_ |_ |_ ", + "|_||_||_||_||_||_||_||_||_|"} + ).c_str()); + EXPECT_STREQ("777777777", ParseDisplay({" _ _ _ _ _ _ _ _ _ ", + " | | | | | | | | |", + " | | | | | | | | |"} + ).c_str()); + EXPECT_STREQ("888888888", ParseDisplay({" _ _ _ _ _ _ _ _ _ ", + "|_||_||_||_||_||_||_||_||_|", + "|_||_||_||_||_||_||_||_||_|"} + ).c_str()); + EXPECT_STREQ("999999999", ParseDisplay({" _ _ _ _ _ _ _ _ _ ", + "|_||_||_||_||_||_||_||_||_|", + " _| _| _| _| _| _| _| _| _|"} + ).c_str()); + EXPECT_STREQ("123456789", ParseDisplay({" _ _ _ _ _ _ _ ", + " | _| _||_||_ |_ ||_||_|", + " ||_ _| | _||_| ||_| _|"} + ).c_str()); +}