diff --git a/TDDKata/Calculator.cpp b/TDDKata/Calculator.cpp index beeae06..75bc02c 100644 --- a/TDDKata/Calculator.cpp +++ b/TDDKata/Calculator.cpp @@ -3,10 +3,50 @@ int Calculator::Add(std::string expression) { + return 0; } -int Calculator::Add(char* expression) +int Calculator::Add(const char* expression) { - throw 0; + const char* delim = ",\n"; + char* dup = strdup(expression); + int sum = 0; + size_t len = strlen(expression); + if (!len) + return 0; + if (strstr(dup, ",\n") != NULL) + return -1; + char* new_delim = strstr(dup, "//"); + if ((new_delim) && (new_delim == dup)) { + if (strstr(dup, "\n") == NULL) { + return -1; + } else { + char * dup2 = strdup(dup); + strcpy(dup2, new_delim + 2); + char *ch = dup2; + while (*ch != '\n') + ch++; + *ch = 0; + delim = dup2; + + dup = strstr(dup, "\n") + 1 ; + + } + } + + char* operand = strtok(dup, delim); + while (operand != NULL){ + char* ch = operand; + while (*ch) { + if (!isdigit(*ch)) + return -1; + ch++; + } + + sum += atoi(operand); + operand = strtok(NULL, delim); + } + + return sum; } diff --git a/TDDKata/Calculator.h b/TDDKata/Calculator.h index a508def..92ece41 100644 --- a/TDDKata/Calculator.h +++ b/TDDKata/Calculator.h @@ -5,6 +5,9 @@ /// class Calculator { + +public: + /// /// Sum of elements expression /// @@ -16,6 +19,6 @@ class Calculator /// /// Input expression /// Value of sum expression of expression - int Add(char* expression); + int Add(const char* expression); }; diff --git a/TDDKata/TDDKata.vcxproj b/TDDKata/TDDKata.vcxproj index 1300175..ffef900 100644 --- a/TDDKata/TDDKata.vcxproj +++ b/TDDKata/TDDKata.vcxproj @@ -35,9 +35,12 @@ + + + Create @@ -45,6 +48,7 @@ Create Create + diff --git a/TDDKata/TestFixture.cpp b/TDDKata/TestFixture.cpp new file mode 100644 index 0000000..003974b --- /dev/null +++ b/TDDKata/TestFixture.cpp @@ -0,0 +1,12 @@ +#include "pch.h" +#include "TestFixture.h" + +void TestFixture::SetUp() +{ + calc = new Calculator(); +} + +void TestFixture::TearDown() +{ + delete calc; +} \ No newline at end of file diff --git a/TDDKata/TestFixture.h b/TDDKata/TestFixture.h new file mode 100644 index 0000000..369338f --- /dev/null +++ b/TDDKata/TestFixture.h @@ -0,0 +1,12 @@ +#pragma once +#include "pch.h" +#include "Calculator.h" +class TestFixture: public ::testing::Test +{ +protected: + Calculator * calc; + void SetUp() override; + + void TearDown() override; +}; + diff --git a/TDDKata/TestFixtureWithParam.cpp b/TDDKata/TestFixtureWithParam.cpp new file mode 100644 index 0000000..a733d83 --- /dev/null +++ b/TDDKata/TestFixtureWithParam.cpp @@ -0,0 +1,24 @@ +#include "pch.h" +#include "TestFixtureWithParam.h" + +INSTANTIATE_TEST_CASE_P(PositiveSet, TestFixtureWithParam, + ::testing::Values( + Param("0,1,2" , 3), + Param("0,0,0", 0), + Param("1", 1), + Param("1,2", 3), + Param("", 0), + Param("1,2,3,4,5,6", 21), + Param("1\n,2,3", 6), + Param("//;\n1;2", 3) + )); + +INSTANTIATE_TEST_CASE_P(NegativeSet, TestFixtureWithParam, + ::testing::Values( + Param("abc", -1), + Param("a,1,2", -1), + Param("1,2,a", -1), + Param("1 2", -1), + Param("1,\n", -1), + Param("//;1;2", -1) + )); diff --git a/TDDKata/TestFixtureWithParam.h b/TDDKata/TestFixtureWithParam.h new file mode 100644 index 0000000..6b7d4a3 --- /dev/null +++ b/TDDKata/TestFixtureWithParam.h @@ -0,0 +1,15 @@ +#pragma once +#include "TestFixture.h" +struct Param +{ + const char * expression; + int expected; + Param(const char * expression, int expected) : + expression(expression), expected(expected) {} +}; + +class TestFixtureWithParam : + public TestFixture, public ::testing::WithParamInterface +{ +}; + diff --git a/TDDKata/test.cpp b/TDDKata/test.cpp index 6c6f375..9bfcb64 100644 --- a/TDDKata/test.cpp +++ b/TDDKata/test.cpp @@ -1,5 +1,165 @@ #include "pch.h" - TEST(TDDKata, TestName) { - ASSERT_EQ(1, 1); - ASSERT_TRUE(true); - } \ No newline at end of file +#include "Calculator.h" +#include "TestFixture.h" +#include "TestFixtureWithParam.h" + + +TEST_P(TestFixtureWithParam, Sets) +{ + const char* nums = GetParam().expression; + int expected = GetParam().expected; + // act + int actual = calc->Add(nums); + //assert + ASSERT_EQ(actual, expected); +} +/* +TEST_F(TestFixture, PositiveUsual) { + // arrange + char* nums = "0,1,2"; + int expected = 3; + // act + int actual = calc->Add(nums); + //assert + ASSERT_EQ(actual, expected); +} + +TEST_F(TestFixture, PositiveZero) { + // arrange + char* nums = "0,0,0"; + int expected = 0; + // act + int actual = calc->Add(nums); + //assert + ASSERT_EQ(actual, expected); +} + + +TEST_F(TestFixture, PositiveOne) { + // arrange + char* nums = "1"; + int expected = 1; + // act + int actual = calc->Add(nums); + //assert + + ASSERT_EQ(actual, expected); +} + +TEST_F(TestFixture, PositiveTwo) { + // arrange + char* nums = "1,2"; + int expected = 3; + // act + int actual = calc->Add(nums); + //assert + + ASSERT_EQ(actual, expected); +} + +TEST_F(TestFixture, PositiveEmpty) { + // arrange + char* nums = ""; + int expected = 0; + // act + int actual = calc->Add(nums); + //assert + + ASSERT_EQ(actual, expected); +} + +TEST_F(TestFixture, NegativeNotNumAll) { + // arrange + char* nums = "abc"; + int expected = -1; + // act + int actual = calc->Add(nums); + //assert + + ASSERT_EQ(actual, expected); +} + +TEST_F(TestFixture, NegativeNotNumOne) { + // arrange + char* nums = "a,1,2"; + int expected = -1; + // act + int actual = calc->Add(nums); + //assert + + ASSERT_EQ(actual, expected); +} + +TEST_F(TestFixture, NegativeNotNumOneAtEnd) { + // arrange + char* nums = "1,2,a"; + int expected = -1; + // act + int actual = calc->Add(nums); + //assert + ASSERT_EQ(actual, -1); +} + +TEST_F(TestFixture, NegativeWrongSeparator) { + // arrange + char* nums = "1 2"; + int expected = -1; + // act + int actual = calc->Add(nums); + //assert + + ASSERT_EQ(actual, expected); +} + +TEST_F(TestFixture, PositiveFewCountOfNumbers) { + // arrange + char* nums = "1,2,3,4,5,6"; + int expected = 21; + // act + int actual = calc->Add(nums); + //assert + ASSERT_EQ(actual, expected); +} + +TEST_F(TestFixture, PositiveNewLineSeparator) { + // arrange + char* nums = "1\n,2,3"; + int expected = 6; + // act + int actual = calc->Add(nums); + //assert + ASSERT_EQ(actual, expected); +} + + +TEST_F(TestFixture, NegativeNewLineSeparator) { + // arrange + char* nums = "1,\n"; + int expected = -1; + // act + int actual = calc->Add(nums); + //assert + ASSERT_EQ(actual, expected); +} +TEST_F(TestFixture, PositiveSetSeparator) { + // arrange + char* nums = "//;\n1;2"; + int expected = 3; + // act + int actual = calc->Add(nums); + //assert + + ASSERT_EQ(actual, expected); +} + +TEST_F(TestFixture, NegativeSetSeparatorNoNeLine) { + // arrange + char* nums = "//;1;2"; + int expected = -1; + // act + int actual = calc->Add(nums); + //assert + + ASSERT_EQ(actual, expected); +} +*/ \ No newline at end of file