diff --git a/tdd_intro/homework/05_bank_ocr/test.cpp b/tdd_intro/homework/05_bank_ocr/test.cpp index e7852dc..65f2e29 100644 --- a/tdd_intro/homework/05_bank_ocr/test.cpp +++ b/tdd_intro/homework/05_bank_ocr/test.cpp @@ -98,90 +98,281 @@ Example input and output // - parse // parse several lines -using Digit = std::vector; +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 Digit s_1({" ", - " |", - " |"}); + const DigitView& View() const { return m_view; } -const Digit s_2({" _ ", - " _|", - "|_ "}); + static constexpr unsigned char Height() { return 3; } + static constexpr unsigned char Width() { return 3; } -std::vector s_digits({ +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; + } -bool CheckMatrixDimension(const Digit& digit) +private: + DigitView m_view; +}; + +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 = { " _ ", + "|_|", + " _|" + }; + +bool DigitsAreEqual(const Digit& left, const Digit& right) { - const size_t prefferedSize = 3; - - if (digit.size() != prefferedSize) + for (unsigned char line = 0; line < Digit::Height(); ++line) { - return false; + if (left.View().at(line) != right.View().at(line)) + { + return false; + } } + return true; +} - for (const std::string& line : digit) +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 (line.size() != prefferedSize) + if (DigitsAreEqual(digit, *s_possibleDigits.at(n))) { - return false; + return n; } } - - return true; + throw std::runtime_error("Digit could not be parsed"); } -std::string ParseDigit(const Digit& digit) +using DigitsDisplayView = std::vector; +class DigitsDisplay { - if (digit == Digit({" ", - " |", - " |"})) +public: + DigitsDisplay(const std::initializer_list& lst) { - return "1"; + 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); + } } - else if (digit == Digit({" _ ", - " _|", - "|_ "})) + + 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) +{ + DigitView digitView(display.Height()); + std::string res; + for (unsigned char digitPos = 0; digitPos < display.Width(); digitPos += Digit::Width()) { - return "2"; + 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; +} - return "8"; +TEST(BankOCRTests, DigitToNumber_0) +{ + EXPECT_EQ(0, DigitToNumber(Digit { " _ ", + "| |", + "|_|" + } + )); +} + +TEST(BankOCRTests, DigitToNumber_1) +{ + EXPECT_EQ(1, DigitToNumber(Digit { " ", + " |", + " |" + } + )); } -TEST(BankOCRTests, Check_Matrix_dimension_true) +TEST(BankOCRTests, DigitToNumber_2) { - Digit digit = {" ", " ", " "}; - EXPECT_TRUE(CheckMatrixDimension(digit)); + EXPECT_EQ(2, DigitToNumber(Digit { " _ ", + " _|", + "|_ " + } + )); } -TEST(BankOCRTests, Check_Matrix_dimension_false) +TEST(BankOCRTests, DigitToNumber_Acceptance) { - Digit digit = {" ", "! ", " "}; - EXPECT_FALSE(CheckMatrixDimension(digit)); + 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 { " _ ", + "|_|", + " _|" + } + )); } -TEST(BankOCRTests, ParseDigit_1) +TEST(BankOCRTests, ParseDigits_000000000) { - Digit digit = {" ", - " |", - " |"}; - EXPECT_EQ("1", ParseDigit(digit)); + DigitsDisplay nulls = { " _ _ _ _ _ _ _ _ _ ", + "| || || || || || || || || |", + "|_||_||_||_||_||_||_||_||_|" + }; + EXPECT_STREQ("000000000", ParseDisplay(nulls).c_str()); } -TEST(BankOCRTests, ParseDigit_2) +TEST(BankOCRTests, ParseDigits_111111111) { - Digit digit = {" _ ", - " _|", - "|_ "}; - EXPECT_EQ("2", ParseDigit(digit)); + DigitsDisplay ones = { " ", + " | | | | | | | | |", + " | | | | | | | | |" + }; + EXPECT_STREQ("111111111", ParseDisplay(ones).c_str()); } -TEST(BankOCRTests, ParseDigit_8) +TEST(BankOCRTests, ParseDigits_Acceptance) { - Digit digit = {" _ ", - "|_|", - "|_|"}; - EXPECT_EQ("8", ParseDigit(digit)); + 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()); } 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..ddc36da 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 + 1 - 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