diff --git a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/homework/06_bank_ocr/debug/06_bank_ocr.ilk b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/homework/06_bank_ocr/debug/06_bank_ocr.ilk index 86f7abf..7a12e67 100644 Binary files a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/homework/06_bank_ocr/debug/06_bank_ocr.ilk and b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/homework/06_bank_ocr/debug/06_bank_ocr.ilk differ diff --git a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/homework/06_bank_ocr/debug/06_bank_ocr.pdb b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/homework/06_bank_ocr/debug/06_bank_ocr.pdb index 419cd9e..cca58e6 100644 Binary files a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/homework/06_bank_ocr/debug/06_bank_ocr.pdb and b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/homework/06_bank_ocr/debug/06_bank_ocr.pdb differ diff --git a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/homework/06_bank_ocr/debug/06_bank_ocr.vc.pdb b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/homework/06_bank_ocr/debug/06_bank_ocr.vc.pdb index b205ae8..ccdb8e5 100644 Binary files a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/homework/06_bank_ocr/debug/06_bank_ocr.vc.pdb and b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/homework/06_bank_ocr/debug/06_bank_ocr.vc.pdb differ diff --git a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/02_word_count/debug/02_word_count.ilk b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/02_word_count/debug/02_word_count.ilk index ebaf6dc..6507b1f 100644 Binary files a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/02_word_count/debug/02_word_count.ilk and b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/02_word_count/debug/02_word_count.ilk differ diff --git a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/02_word_count/debug/02_word_count.pdb b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/02_word_count/debug/02_word_count.pdb index 36141c5..d0d7a00 100644 Binary files a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/02_word_count/debug/02_word_count.pdb and b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/02_word_count/debug/02_word_count.pdb differ diff --git a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/02_word_count/debug/02_word_count.vc.pdb b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/02_word_count/debug/02_word_count.vc.pdb index 4892c2d..6ecb9e8 100644 Binary files a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/02_word_count/debug/02_word_count.vc.pdb and b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/02_word_count/debug/02_word_count.vc.pdb differ diff --git a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/03_anagram/debug/03_anagram.ilk b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/03_anagram/debug/03_anagram.ilk index b5efbe7..662eeaa 100644 Binary files a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/03_anagram/debug/03_anagram.ilk and b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/03_anagram/debug/03_anagram.ilk differ diff --git a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/03_anagram/debug/03_anagram.pdb b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/03_anagram/debug/03_anagram.pdb index a74695f..47cb1c9 100644 Binary files a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/03_anagram/debug/03_anagram.pdb and b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/03_anagram/debug/03_anagram.pdb differ diff --git a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/03_anagram/debug/03_anagram.vc.pdb b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/03_anagram/debug/03_anagram.vc.pdb index 647130e..9e31b69 100644 Binary files a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/03_anagram/debug/03_anagram.vc.pdb and b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/03_anagram/debug/03_anagram.vc.pdb differ diff --git a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/04_trinary_numbers/debug/04_trinary_numbers.ilk b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/04_trinary_numbers/debug/04_trinary_numbers.ilk index 911a8a9..c740565 100644 Binary files a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/04_trinary_numbers/debug/04_trinary_numbers.ilk and b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/04_trinary_numbers/debug/04_trinary_numbers.ilk differ diff --git a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/04_trinary_numbers/debug/04_trinary_numbers.pdb b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/04_trinary_numbers/debug/04_trinary_numbers.pdb index 13edd25..dde9d68 100644 Binary files a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/04_trinary_numbers/debug/04_trinary_numbers.pdb and b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/04_trinary_numbers/debug/04_trinary_numbers.pdb differ diff --git a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/04_trinary_numbers/debug/04_trinary_numbers.vc.pdb b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/04_trinary_numbers/debug/04_trinary_numbers.vc.pdb index 74c0997..9e35c27 100644 Binary files a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/04_trinary_numbers/debug/04_trinary_numbers.vc.pdb and b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/04_trinary_numbers/debug/04_trinary_numbers.vc.pdb differ diff --git a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/05_word_wrapp/debug/05_word_wrapp.ilk b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/05_word_wrapp/debug/05_word_wrapp.ilk index 7091ff8..774bcd2 100644 Binary files a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/05_word_wrapp/debug/05_word_wrapp.ilk and b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/05_word_wrapp/debug/05_word_wrapp.ilk differ diff --git a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/05_word_wrapp/debug/05_word_wrapp.pdb b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/05_word_wrapp/debug/05_word_wrapp.pdb index e5df563..c09ac6e 100644 Binary files a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/05_word_wrapp/debug/05_word_wrapp.pdb and b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/05_word_wrapp/debug/05_word_wrapp.pdb differ diff --git a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/05_word_wrapp/debug/05_word_wrapp.vc.pdb b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/05_word_wrapp/debug/05_word_wrapp.vc.pdb index 3a83b02..b5047d5 100644 Binary files a/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/05_word_wrapp/debug/05_word_wrapp.vc.pdb and b/build-tdd_intro-Desktop_Qt_5_10_0_MSVC2015_32bit-Debug/workshops/05_word_wrapp/debug/05_word_wrapp.vc.pdb differ diff --git a/tdd_intro/homework/09_numbers/09_numbers.pro b/tdd_intro/homework/09_numbers/09_numbers.pro new file mode 100644 index 0000000..8dc1869 --- /dev/null +++ b/tdd_intro/homework/09_numbers/09_numbers.pro @@ -0,0 +1,11 @@ +include(../../gtest.pri) + +TEMPLATE = app +CONFIG += console c++11 +CONFIG -= app_bundle +CONFIG -= qt + +DEFINES += NOMINMAX + +SOURCES += \ + test.cpp diff --git a/tdd_intro/homework/09_numbers/test.cpp b/tdd_intro/homework/09_numbers/test.cpp new file mode 100644 index 0000000..173b725 --- /dev/null +++ b/tdd_intro/homework/09_numbers/test.cpp @@ -0,0 +1,215 @@ +/* +Say in C++ +Given a number from 0 to 99,999, spell out that number in English. + +Step 1 +Handle the basic case of 0 through 99. + +If the input to the program is 22, then the output should be 'twenty-two'. + +Your program should complain loudly if given a number outside the blessed range. + +Some good test cases for this program are: + +0 +14 +50 +98 +-1 +100 +Step 2 +Put it all together to get nothing but plain English. + +12345 should give twelve thousand three hundred forty-five. + +The program must also report any values that are out of range. + +Extensions +Use and (correctly) when spelling out the number in English: + +14 becomes "fourteen". +100 becomes "one hundred". +120 becomes "one hundred and twenty". +1002 becomes "one thousand and two". +1323 becomes "one thousand three hundred and twenty-three". +*/ + +#include +#include +#include + +std::map s_0To19Numbers = { + {0, "zero"}, + {1, "one"}, + {2, "two"}, + {3, "three"}, + {4, "four"}, + {5, "five"}, + {6, "six"}, + {7, "seven"}, + {8, "eight"}, + {9, "nine"}, + {10, "ten"}, + {11, "eleven"}, + {12, "twelve"}, + {13, "thirteen"}, + {14, "fourteen"}, + {15, "fifteen"}, + {16, "sixteen"}, + {17, "seventeen"}, + {18, "eighteen"}, + {19, "nineteen"} +}; + +std::map s_20To90Numbers = { + {20, "twenty"}, + {30, "thirty"}, + {40, "forty"}, + {50, "fifty"}, + {60, "sixty"}, + {70, "seventy"}, + {80, "eighty"}, + {90, "ninety"} +}; + +std::string s_hundred("hundred"); +std::string s_thoursand("thousand"); + +std::string GetTensPart(int number) +{ + int tens = (number % 100) / 10; + + if (tens > 1) + { + std::string tenPart = s_20To90Numbers.find(tens * 10)->second; + + int ones = number % 10; + if (ones != 0) + { + return tenPart + "-" + s_0To19Numbers.find(ones)->second; + } + else + { + return tenPart; + } + } + else + { + return s_0To19Numbers.find(number)->second; + } +} + + +std::string GetSpelling(int number) +{ + if (number < 0 || number > 99999) + { + throw std::out_of_range("Out of bounds value!"); + } + + std::string thoursandStr; + std::string hundredsStr; + std::string tensStr; + + int thoursands = number / 1000; + + if (thoursands > 0) + { + thoursandStr = GetTensPart(thoursands) + " " + s_thoursand; + + number -= thoursands * 1000; + } + + int hundreds = number / 100; + + if (hundreds > 0) + { + hundredsStr = s_0To19Numbers.find(hundreds)->second + " " + s_hundred; + + number -= hundreds * 100; + } + + tensStr = GetTensPart(number); + + std::string finalStr; + + if (!thoursandStr.empty()) + { + finalStr += thoursandStr + " "; + } + + if (hundredsStr.empty()) + { + finalStr += tensStr; + } + else if (tensStr.empty() || tensStr == "zero") + { + finalStr += hundredsStr; + } + else + { + finalStr += hundredsStr + " and " + tensStr; + } + + return finalStr; +} + +TEST(GetSpelling, Input_0_Get_Zero) +{ + EXPECT_EQ("zero", GetSpelling(0)); +} + +TEST(GetSpelling, Input_1_Get_One) +{ + EXPECT_EQ("one", GetSpelling(1)); +} + +TEST(GetSpelling, OutOfBounds) +{ + EXPECT_THROW(GetSpelling(-1), std::out_of_range); +} + +TEST(GetSpelling, Input_10_Get_Ten) +{ + EXPECT_EQ("ten", GetSpelling(10)); +} + +TEST(GetSpelling, Input_14_Get_Fourteen) +{ + EXPECT_EQ("fourteen", GetSpelling(14)); +} + +TEST(GetSpelling, Input_21_Get_TwentyOne) +{ + EXPECT_EQ("twenty-one", GetSpelling(21)); +} + +TEST(GetSpelling, Input_35_Get_ThirtyFive) +{ + EXPECT_EQ("thirty-five", GetSpelling(35)); +} + +TEST(GetSpelling, Input_100_Get_OneHundred) +{ + EXPECT_EQ("one hundred", GetSpelling(100)); +} + +TEST(GetSpelling, Input_135_Get_OneHundredAndThirtyFive) +{ + EXPECT_EQ("one hundred and thirty-five", GetSpelling(135)); +} + +TEST(GetSpelling, Input_1024_Get_OneThroursandTwentyFour) +{ + EXPECT_EQ("one thousand twenty-four", GetSpelling(1024)); +} + +TEST(GetSpelling, Input_2993_Get_TwoThoursandNineHundredAndNinetyThree) +{ + EXPECT_EQ("two thousand nine hundred and ninety-three", GetSpelling(2993)); +} + +TEST(GetSpelling, AcceptanceTest) +{ + EXPECT_EQ("twelve thousand three hundred and forty-five", GetSpelling(12345)); +} diff --git a/tdd_intro/homework/homework.pro b/tdd_intro/homework/homework.pro index dd4d892..7195deb 100644 --- a/tdd_intro/homework/homework.pro +++ b/tdd_intro/homework/homework.pro @@ -8,4 +8,5 @@ SUBDIRS += \ 05_word_wrapp \ 06_bank_ocr \ 07_filecopier \ - 08_timer + 08_timer \ + 09_numbers