diff --git a/tdd_intro/demo/01_bob/test.cpp b/tdd_intro/demo/01_bob/test.cpp index dc9e42f..5840552 100644 --- a/tdd_intro/demo/01_bob/test.cpp +++ b/tdd_intro/demo/01_bob/test.cpp @@ -10,3 +10,45 @@ He answers 'Whatever.' to anything else. #include #include +const std::string g_tellBobAnswer = "Sure"; +const std::string g_yellBobAnswer = "Whoa, chill out!"; +const std::string g_emptyBobAnswer = "Fine. Be that way!"; +const std::string g_defaultBobAnswer = "Whatever."; + +std::string CallBob(const std::string& str) +{ + if (str.empty()) + { + return g_emptyBobAnswer; + } + if (str.back() == '!') + { + return g_yellBobAnswer; + } + else if (str.back() == '?') + { + return g_tellBobAnswer; + } + + return g_defaultBobAnswer; +} + +TEST(bob, AnswerSureOnQuestion) +{ + ASSERT_EQ(g_tellBobAnswer, CallBob("Are you ok?")); +} + +TEST(bob, AnswerChillOnYell) +{ + ASSERT_EQ(g_yellBobAnswer, CallBob("Yell!!!!")); +} + +TEST(bob, AnswerOnEmptyString) +{ + ASSERT_EQ(g_emptyBobAnswer, CallBob("")); +} + +TEST(bob, AnswerOnAnythingElse) +{ + ASSERT_EQ(g_defaultBobAnswer, CallBob("Anything else")); +} diff --git a/tdd_intro/demo/01_fizz_buzz/test.cpp b/tdd_intro/demo/01_fizz_buzz/test.cpp index 582ee51..49fa275 100644 --- a/tdd_intro/demo/01_fizz_buzz/test.cpp +++ b/tdd_intro/demo/01_fizz_buzz/test.cpp @@ -9,3 +9,64 @@ * a multiple of 15 = FizzBuzz * any other number = */ + +const std::string g_fizzString = "Fizz"; +const std::string g_buzzString = "Buzz"; +const std::string g_fizzBuzzString = "FizzBuzz"; + +std::string FizzBuzz(int num) +{ + std::string fizzBuzzStr; + + if (num % 3 == 0) + { + fizzBuzzStr = g_fizzString; + } + + if (num % 5 == 0) + { + fizzBuzzStr += g_buzzString; + } + + return fizzBuzzStr; +} + + +TEST(FizzBuzzTest, Fizz) +{ + EXPECT_EQ(g_fizzString, FizzBuzz(3)); +} + +TEST(FizzBuzzTest, Buzz) +{ + EXPECT_EQ(g_buzzString, FizzBuzz(5)); +} + +TEST(FizzBuzzTest, Fizz6) +{ + EXPECT_EQ(g_fizzString, FizzBuzz(6)); +} + +TEST(FizzBuzzTest, Buzz10) +{ + EXPECT_EQ(g_buzzString, FizzBuzz(10)); +} + +TEST(FizzBuzzTest, FizzBuzz) +{ + EXPECT_EQ(g_fizzBuzzString, FizzBuzz(15)); +} + +TEST(FizzBuzzTest, FizzBuzzEmpty) +{ + EXPECT_EQ("", FizzBuzz(1)); +} + +TEST(FizzBuzzTest, Acceptance) +{ + EXPECT_EQ(g_buzzString, FizzBuzz(35)); + EXPECT_EQ(g_fizzString, FizzBuzz(66)); + EXPECT_EQ(g_fizzBuzzString, FizzBuzz(45)); + EXPECT_EQ("", FizzBuzz(17)); + EXPECT_EQ("", FizzBuzz(-23)); +} diff --git a/tdd_intro/demo/02_anagram/test.cpp b/tdd_intro/demo/02_anagram/test.cpp index 4d65537..1c4d8e6 100644 --- a/tdd_intro/demo/02_anagram/test.cpp +++ b/tdd_intro/demo/02_anagram/test.cpp @@ -6,3 +6,76 @@ Given "listen" and a list of candidates like "enlists" "google" "inlets" "banana _from http://exercism.io/_ */ #include +typedef std::vector strings; + +bool IsAnagramPresent(std::string first, std::string second) +{ + std::sort(first.begin(), first.end()); + std::sort(second.begin(), second.end()); + + return first == second; +} + +strings ReturnAnagrams(std::string target, const strings& variants) +{ + strings anagrams; + for (std::string variant : variants) + { + if (IsAnagramPresent(target, variant)) + { + anagrams.push_back(variant); + } + } + + return anagrams; +} + +TEST (anagrams, emptyString) +{ + EXPECT_TRUE(IsAnagramPresent("", "")); +} + +TEST(anagrams, notEqualWords) +{ + EXPECT_FALSE(IsAnagramPresent("word", "lock")); +} + +TEST(anagrams, anagram) +{ + EXPECT_TRUE(IsAnagramPresent("listen", "inlets")); +} + +TEST(anagrams, returnEmptyString) +{ + EXPECT_EQ(strings(), ReturnAnagrams("", strings())); +} + +TEST(anagrams, singleAnagram) +{ + EXPECT_EQ( strings({"inlets"}), ReturnAnagrams("listen", strings({"inlets"}))); +} + +TEST(anagrams, otherSignleAnagram) +{ + EXPECT_EQ( strings({"letsin"}), ReturnAnagrams("listen", strings({"letsin"}))); +} + +TEST(anagrams, signleNotAnagram) +{ + EXPECT_EQ( strings(), ReturnAnagrams("listen", strings({"letiin"}))); +} + +TEST(anagrams, multipleWordsOnaAnagram) +{ + EXPECT_EQ(strings({"inlets"}), ReturnAnagrams("listen", strings({"inlets", "google"}))); +} + +TEST(anagrams, multipleAnagrams) +{ + EXPECT_EQ(strings({"inlets", "inelts"}), ReturnAnagrams("listen", strings({"inlets", "inelts"}))); +} + +TEST(anagrams, multipleAnagramsNotInOrder) +{ + EXPECT_EQ(strings({"inelts", "inlets"}), ReturnAnagrams("listen", strings({"inlets", "inelts"}))); +} diff --git a/tdd_intro/homework/02_ternary_numbers/test.cpp b/tdd_intro/homework/02_ternary_numbers/test.cpp index 1750302..e75a61a 100644 --- a/tdd_intro/homework/02_ternary_numbers/test.cpp +++ b/tdd_intro/homework/02_ternary_numbers/test.cpp @@ -16,3 +16,77 @@ The last place in a ternary number is the 1's place. The second to last is the 3 If your language provides a method in the standard library to perform the conversion, pretend it doesn't exist and implement it yourself. */ + +/* + * 1) 0 test + * 2) 1 test + * 3) 2 test + * 4) invalid digit test + * 5) Multiple digits tests + * 6) Invalid multiple digits tests + * 7) Acceptence test + */ + +bool TernaryNumber(int number) +{ + return number < 3; +} + +int ConvertTernaryNumbers(const std::string &number) +{ + int sum = 0; + for (int index = 0; index < number.size(); ++index) + { + int numberValue = std::stoi(std::string(1, number[number.size() - 1 - index])); + if (!TernaryNumber(numberValue)) + { + return 0; + } + sum += numberValue * std::pow(3, index); + } + + return sum; +} + +TEST(TernaryNumbers, ZeroTest) +{ + ASSERT_TRUE(TernaryNumber(0)); +} + +TEST(TernaryNumbers, CheckOne) +{ + ASSERT_TRUE(TernaryNumber(1)); +} + +TEST(TernaryNumbers, CheckTwo) +{ + ASSERT_TRUE(TernaryNumber(2)); +} + +TEST(TernaryNumbers, InvalidDigit) +{ + ASSERT_FALSE(TernaryNumber(3)); +} + +TEST(TernaryNumbers, MultipleDigits) +{ + ASSERT_EQ(0, ConvertTernaryNumbers("00")); +} + +TEST(TernaryNumbers, MultipleDigits111) +{ + ASSERT_EQ(13, ConvertTernaryNumbers("111")); +} + +TEST(TernaryNumbers, InvalidMultipleDigits) +{ + ASSERT_EQ(0, ConvertTernaryNumbers("113")); +} + +TEST(TernaryNumbers, Acceptance) +{ + ASSERT_EQ(0, ConvertTernaryNumbers("123")); + ASSERT_EQ(16, ConvertTernaryNumbers("121")); + ASSERT_EQ(439, ConvertTernaryNumbers("121021")); + ASSERT_EQ(597871, ConvertTernaryNumbers("1010101010101")); +} diff --git a/tdd_intro/homework/03_bank_ocr/test.cpp b/tdd_intro/homework/03_bank_ocr/test.cpp index a4b7ca8..0236831 100644 --- a/tdd_intro/homework/03_bank_ocr/test.cpp +++ b/tdd_intro/homework/03_bank_ocr/test.cpp @@ -86,3 +86,204 @@ Example input and output */ #include #include + + +/* + * - Parse digit (test for each 1..9) + * - Wrong digit + * - Get line + * - Wrong line + * - Get cell + * - Wrong cell + * - Get numbers + * - Aceptance + */ + +const std::string ZERO_DIGIT = " _ | ||_|"; +const std::string ONE_DIGIT = " | |"; +const std::string TWO_DIGIT = " _ _||_ "; +const std::string THREE_DIGIT = " _ _| _|"; +const std::string FOUR_DIGIT = " |_| |"; +const std::string FIVE_DIGIT = " _ |_ _|"; +const std::string SIX_DIGIT = " _ |_ |_|"; +const std::string SEVEN_DIGIT = " _ | |"; +const std::string EIGHT_DIGIT = " _ |_||_|"; +const std::string NINE_DIGIT = " _ |_| _|"; + +const unsigned int DIGIT_WIDTH = 3; +const unsigned int DIGIT_FIRST_LINE_INDEX = 0; +const unsigned int DIGIT_SECOND_LINE_INDEX = 27; +const unsigned int DIGIT_THIRD_LINE_INDEX = 54; + +const unsigned int MACHINE_LINE_LENGTH = 81; +const unsigned int MAX_DIGIT_INDEX = 9; + +std::string ParseNumberCell(const std::string &str) +{ + if (str == ZERO_DIGIT) return "0"; + if (str == ONE_DIGIT) return "1"; + if (str == TWO_DIGIT) return "2"; + if (str == THREE_DIGIT) return "3"; + if (str == FOUR_DIGIT) return "4"; + if (str == FIVE_DIGIT) return "5"; + if (str == SIX_DIGIT) return "6"; + if (str == SEVEN_DIGIT) return "7"; + if (str == EIGHT_DIGIT) return "8"; + if (str == NINE_DIGIT) return "9"; + + return ""; +} + +std::string GetDigitCell(const std::string &str, unsigned int digitIndex) +{ + if (str.size() != MACHINE_LINE_LENGTH || digitIndex > MAX_DIGIT_INDEX || digitIndex == 0) + { + return ""; + } + + unsigned int digitOffset = (digitIndex - 1) * DIGIT_WIDTH; + + std::string number = str.substr(DIGIT_FIRST_LINE_INDEX + digitOffset, DIGIT_WIDTH); + number += str.substr(DIGIT_SECOND_LINE_INDEX + digitOffset, DIGIT_WIDTH); + number += str.substr(DIGIT_THIRD_LINE_INDEX + digitOffset, DIGIT_WIDTH); + + return number; +} + +std::string GetNumbers(const std::string &machineNumber) +{ + std::string parsedNumbers; + for (unsigned int index = 0; index < MAX_DIGIT_INDEX; index++) + { + std::string number = GetDigitCell(machineNumber, index + 1); + std::string parsedNumber = ParseNumberCell(number); + parsedNumbers += parsedNumber; + } + + return parsedNumbers; +} + +TEST(BankOcr, MachineDigitToString0) +{ + ASSERT_EQ("0", ParseNumberCell(ZERO_DIGIT)); +} + +TEST(BankOcr, MachineWrongDigitToString) +{ + ASSERT_EQ("", ParseNumberCell("_---__--")); +} + +TEST(BankOcr, MachineDigitToString1) +{ + ASSERT_EQ("1", ParseNumberCell(ONE_DIGIT)); +} + +TEST(BankOcr, MachineDigitToString2) +{ + ASSERT_EQ("2", ParseNumberCell(TWO_DIGIT)); +} + +TEST(BankOcr, MachineDigitToString3) +{ + ASSERT_EQ("3", ParseNumberCell(THREE_DIGIT)); +} + +TEST(BankOcr, MachineDigitToString4) +{ + ASSERT_EQ("4", ParseNumberCell(FOUR_DIGIT)); +} + +TEST(BankOcr, MachineDigitToString5) +{ + ASSERT_EQ("5", ParseNumberCell(FIVE_DIGIT)); +} + +TEST(BankOcr, MachineDigitToString6) +{ + ASSERT_EQ("6", ParseNumberCell(SIX_DIGIT)); +} + +TEST(BankOcr, MachineDigitToString7) +{ + ASSERT_EQ("7", ParseNumberCell(SEVEN_DIGIT)); +} + +TEST(BankOcr, MachineDigitToString8) +{ + ASSERT_EQ("8", ParseNumberCell(EIGHT_DIGIT)); +} + +TEST(BankOcr, MachineDigitToString9) +{ + ASSERT_EQ("9", ParseNumberCell(NINE_DIGIT)); +} + +TEST(BankOcr, GetFirstLineDigitZero) +{ + ASSERT_EQ(ZERO_DIGIT, GetDigitCell(" _ _ _ _ _ _ _ _ _ " + "| || || || || || || || || |" + "|_||_||_||_||_||_||_||_||_|", 1)); +} + +TEST(BankOcr, GetFirstLineDigitOne) +{ + ASSERT_EQ(ONE_DIGIT, GetDigitCell(" " + " | | | | | | | | |" + " | | | | | | | | |", 1)); +} + +TEST(BankOcr, WrongLineLength) +{ + ASSERT_EQ("", GetDigitCell(" " + "| | | | | | | | | " + "| | | | | | | | |", 1)); +} + +TEST(BankOcr, GetSecondLineDigitFive) +{ + ASSERT_EQ(FIVE_DIGIT, GetDigitCell(" _ _ _ _ _ _ _ _ _ " + "|_ |_ |_ |_ |_ |_ |_ |_ |_ " + " _| _| _| _| _| _| _| _| _|" , 2)); +} + +TEST(BankOcr, GetWrongIndexDigit) +{ + ASSERT_EQ("", GetDigitCell(" _ _ _ _ _ _ _ _ _ " + "|_ |_ |_ |_ |_ |_ |_ |_ |_ " + " _| _| _| _| _| _| _| _| _|" , 10)); +} + +TEST(BankOcr, GetZeroIndexDigit) +{ + ASSERT_EQ("", GetDigitCell(" _ _ _ _ _ _ _ _ _ " + "|_ |_ |_ |_ |_ |_ |_ |_ |_ " + " _| _| _| _| _| _| _| _| _|" , 0)); +} + +TEST(BankOcr, GetNumbers123456789) +{ + ASSERT_EQ("123456789", GetNumbers(" _ _ _ _ _ _ _ " + " | _| _||_||_ |_ ||_||_|" + " ||_ _| | _||_| ||_| _|")); +} + +TEST(BankOcr, GetNumbers000000000) +{ + ASSERT_EQ("000000000", GetNumbers(" _ _ _ _ _ _ _ _ _ " + "| || || || || || || || || |" + "|_||_||_||_||_||_||_||_||_|")); +} + +TEST(BankOcr, Acceptance) +{ + ASSERT_EQ("", GetNumbers(" _ _ _ _ _ _ _ _ _ | || || " + "|| || || || || || ||_| || || ||_||_" + "||_||_||_||_||_||_|| || || ||_||_||_" + "||_||_||_||_||_|||")); + ASSERT_EQ("666666666", GetNumbers(" _ _ _ _ _ _ _ _ _ " + "|_ |_ |_ |_ |_ |_ |_ |_ |_ " + "|_||_||_||_||_||_||_||_||_|")); + ASSERT_EQ("868266669", GetNumbers(" _ _ _ _ _ _ _ _ _ " + "|_||_ |_| _||_ |_ |_ |_ |_|" + "|_||_||_||_ |_||_||_||_| _|")); +} diff --git a/tdd_intro/homework/homework.pro b/tdd_intro/homework/homework.pro index cf6c01b..07506ca 100644 --- a/tdd_intro/homework/homework.pro +++ b/tdd_intro/homework/homework.pro @@ -1,6 +1,7 @@ TEMPLATE = subdirs SUBDIRS += \ + 00_intro \ 01_leap_year \ 02_ternary_numbers \ 03_bank_ocr \