diff --git a/tdd_intro/homework/02_ternary_numbers/test.cpp b/tdd_intro/homework/02_ternary_numbers/test.cpp index 17503028..cbb928ca 100644 --- a/tdd_intro/homework/02_ternary_numbers/test.cpp +++ b/tdd_intro/homework/02_ternary_numbers/test.cpp @@ -16,3 +16,71 @@ 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. */ + +const int s_ternary_base = 3; +const int s_ascii_shift = 48; + +bool IsValidTernaryDigit(int digit) +{ + return (digit <= 3 && digit >= 0); +} + +long long ConvertTernaryToDecimal(const std::string& ternaryNumber) +{ + long long sum = 0; + long long value = 1; + int numberLen = ternaryNumber.length(); + + for(int i = numberLen - 1; i >= 0; --i) + { + int currentSymbol = static_cast(ternaryNumber[i]) - s_ascii_shift; + if(!IsValidTernaryDigit(currentSymbol)) + { + return 0; + } + + sum += currentSymbol * value; + value *= s_ternary_base; + } + + return sum; +} + + +TEST(TernaryNumber, OneConvertsToOneTest) +{ + EXPECT_EQ(1, ConvertTernaryToDecimal("1")); +} + +TEST(TernaryNumber, ConvertValidTernaryNumberTest) +{ + EXPECT_EQ(5, ConvertTernaryToDecimal("012")); +} + +TEST(TernaryNumber, ConvertAnotherValidTernaryNumberTest) +{ + EXPECT_EQ(302, ConvertTernaryToDecimal("102012")); +} + +TEST(TernaryNumber, InvalidTernaryNumberTest) +{ + EXPECT_EQ(0, ConvertTernaryToDecimal("502012")); +} + +TEST(TernaryNumber, BigTernaryNumberTest) +{ + EXPECT_EQ(10460353203, ConvertTernaryToDecimal("1000000000000000000000")); +} + +TEST(TernaryNumber, IsValidTernaryDigitNegativeTest) +{ + EXPECT_FALSE(IsValidTernaryDigit(-45)); +} + +TEST(TernaryNumber, AcceptanceTest) +{ + EXPECT_EQ(0, ConvertTernaryToDecimal("0")); + EXPECT_EQ(12, ConvertTernaryToDecimal("33")); + EXPECT_EQ(0, ConvertTernaryToDecimal("567")); + EXPECT_EQ(0, ConvertTernaryToDecimal("(567)bh")); +}