From c09e2dde38813019ada0da7e8fc1592a3928e9a6 Mon Sep 17 00:00:00 2001 From: Viacheslav Konstantinov Date: Wed, 14 Nov 2018 17:52:26 +0200 Subject: [PATCH 01/24] First practice (Bob) --- tdd_intro/demo/01_bob/test.cpp | 42 ++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) 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")); +} From 1d7fe3c190120c116f66fd7a95bf9fcf7abfd5b3 Mon Sep 17 00:00:00 2001 From: Viacheslav Konstantinov Date: Mon, 19 Nov 2018 19:05:51 +0200 Subject: [PATCH 02/24] Added 00_intro to the project --- tdd_intro/homework/homework.pro | 1 + 1 file changed, 1 insertion(+) 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 \ From 7685d7386fabb2e48c4ca4bc35651f81c9070a6f Mon Sep 17 00:00:00 2001 From: Viacheslav Konstantinov Date: Tue, 27 Nov 2018 14:46:27 +0200 Subject: [PATCH 03/24] Second practice --- tdd_intro/demo/01_fizz_buzz/test.cpp | 61 ++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) 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)); +} From b15d2ff103d193d1d6a546cc612ec5635062747c Mon Sep 17 00:00:00 2001 From: Viacheslav Konstantinov Date: Tue, 4 Dec 2018 18:45:43 +0200 Subject: [PATCH 04/24] Anagram task added --- tdd_intro/demo/02_anagram/test.cpp | 73 ++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) 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"}))); +} From ead3e320d3245980bac4e540e82ce1ff06278086 Mon Sep 17 00:00:00 2001 From: Viacheslav Konstantinov Date: Tue, 18 Dec 2018 23:58:14 +0200 Subject: [PATCH 05/24] Practical class --- .../homework/02_ternary_numbers/test.cpp | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) 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")); +} From f19306038a96f6866ea5c767985bc46167065886 Mon Sep 17 00:00:00 2001 From: Viacheslav Konstantinov Date: Tue, 8 Jan 2019 22:03:56 +0200 Subject: [PATCH 06/24] Class work --- tdd_intro/homework/04_weather_client/test.cpp | 175 ++++++++++++++++++ 1 file changed, 175 insertions(+) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index 9fe711c..43c5d36 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -44,5 +44,180 @@ Each line means "" : "": 2. Implement IWeatherClient using fake server. */ +/* + * - Empty string parsing + * - Valid data parsing + * - Invalid data parsing // TODO + * - Parse data list + * + * - Weather server stub + * - Test GetAverageTemperature for 31.08.2018 + * - Acceptance test for GetAverageTemperature + * - Test GetMinimumTemperature for 31.08.2018 + * - Acceptance test for GetMinimumTemperature + * - Test GetMaximumTemperature for 31.08.2018 + * - Acceptance test for GetMaximumTemperature + * - Test GetAverageWindDirection for 31.08.2018 + * - Acceptance test for GetAverageWindDirection + * - Test GetMaximumWindSpeed for 31.08.2018 + * - Acceptance test for GetMaximumWindSpeed + */ + #include #include + +struct Weather +{ + short temperature = 0; + unsigned short windDirection = 0; + double windSpeed = 0; + bool operator==(const Weather& right) const + { + return temperature == right.temperature && + windDirection == right.windDirection && + std::abs(windSpeed - right.windSpeed) < 0.01; + } +}; + +class IWeatherServer +{ +public: + virtual ~IWeatherServer() { } + // Returns raw response with weather for the given day and time in request + virtual std::string GetWeather(const std::string& request) = 0; +}; + +// Implement this interface +class IWeatherClient +{ +public: + virtual ~IWeatherClient() { } + virtual double GetAverageTemperature(IWeatherServer& server, const std::string& date) = 0; +// virtual double GetMinimumTemperature(IWeatherServer& server, const std::string& date) = 0; +// virtual double GetMaximumTemperature(IWeatherServer& server, const std::string& date) = 0; +// virtual double GetAverageWindDirection(IWeatherServer& server, const std::string& date) = 0; +// virtual double GetMaximumWindSpeed(IWeatherServer& server, const std::string& date) = 0; +}; + +class WeatherServerStub : public IWeatherServer +{ +public: + std::string GetWeather(const std::string& request) + { + static std::map weatherMap = {{"31.08.2018;03:00" , "20;181;5.1"}, + {"31.08.2018;09:00" , "23;204;4.9"}, + {"31.08.2018;15:00" , "33;193;4.3"}, + {"31.08.2018;21:00" , "26;179;4.5"}, + + {"01.09.2018;03:00" , "19;176;4.2"}, + {"01.09.2018;09:00" , "22;131;4.1"}, + {"01.09.2018;15:00" , "31;109;4.0"}, + {"01.09.2018;21:00" , "24;127;4.1"}, + + {"02.09.2018;03:00" , "21;158;3.8"}, + {"02.09.2018;09:00" , "25;201;3.5"}, + {"02.09.2018;15:00" , "34;258;3.7"}, + {"02.09.2018;21:00" , "27;299;4.0"}}; + auto result = weatherMap.find(request); + return result == weatherMap.end() ? "" : result->second; + } +}; + +Weather ParseWeather(const std::string &data); +class WeatherClient : public IWeatherClient +{ +public: + double GetAverageTemperature(IWeatherServer& server, const std::string& date) + { + double result = 0; + + + std::string response = server.GetWeather(date + ";03:00"); + result += ParseWeather(response).temperature; + response = server.GetWeather(date + ";09:00"); + result += ParseWeather(response).temperature; + response = server.GetWeather(date + ";15:00"); + result += ParseWeather(response).temperature; + response = server.GetWeather(date + ";21:00"); + result += ParseWeather(response).temperature; + + + return result/4; + } +}; + +Weather ParseWeather(const std::string &data) +{ + if (data.empty()) + { + throw std::runtime_error(""); + } + Weather weather; + std::istringstream stream(data); + + stream >> weather.temperature; + stream.ignore(); + stream >> weather.windDirection; + stream.ignore(); + stream >> weather.windSpeed; + + return weather; +} + +std::vector ParseWeather(const std::vector &response) +{ + std::vector result; + for (auto data : response) + { + Weather weather = ParseWeather(data); + result.push_back(weather); + } + + return result; +} + +TEST(WeatherClient, CheckParsingEmptyString) +{ + EXPECT_THROW(ParseWeather(""), std::runtime_error); +} + +TEST(WeatherClient, CheckParsingValidString) +{ + Weather wether; + wether.temperature = 27; + wether.windDirection = 299; + wether.windSpeed = 4.0f; + + ASSERT_EQ(wether, ParseWeather("27;299;4.0")); +} + +TEST(WeatherClient, CheckParsingMultipleStrings) +{ + std::vector response = {"20;181;5.1", "23;204;4.9", "33;193;4.3"}; + + Weather wether0; + wether0.temperature = 20; + wether0.windDirection = 181; + wether0.windSpeed = 5.1f; + + Weather wether1; + wether1.temperature = 23; + wether1.windDirection = 204; + wether1.windSpeed = 4.9f; + + Weather wether2; + wether2.temperature = 33; + wether2.windDirection = 193; + wether2.windSpeed = 4.3f; + + std::vector result = {wether0, wether1, wether2}; + ASSERT_EQ(result , ParseWeather(response)); +} + +TEST(WeatherClient, GetAverageTemperatureFor31_08_2018) +{ + WeatherServerStub server; + WeatherClient client; + + ASSERT_FLOAT_EQ(25.5f, client.GetAverageTemperature(server, "31.08.2018")); +} From e7c70e86e537805b3f52b2f948e413ae33da69e2 Mon Sep 17 00:00:00 2001 From: Viacheslav Konstantinov Date: Tue, 8 Jan 2019 22:21:11 +0200 Subject: [PATCH 07/24] Invalid parsing red test --- tdd_intro/homework/04_weather_client/test.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index 43c5d36..b904cc0 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -191,6 +191,11 @@ TEST(WeatherClient, CheckParsingValidString) ASSERT_EQ(wether, ParseWeather("27;299;4.0")); } +TEST(WeatherClient, CheckParsingInvalidString) +{ + EXPECT_THROW(ParseWeather("asd;11;aaa"), std::runtime_error); +} + TEST(WeatherClient, CheckParsingMultipleStrings) { std::vector response = {"20;181;5.1", "23;204;4.9", "33;193;4.3"}; From 84a36ac03f9634e5097422b490f56bfd0907a316 Mon Sep 17 00:00:00 2001 From: Viacheslav Konstantinov Date: Tue, 8 Jan 2019 22:24:52 +0200 Subject: [PATCH 08/24] Invalid parsing green test --- tdd_intro/homework/04_weather_client/test.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index b904cc0..3d9fb59 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -156,10 +156,24 @@ Weather ParseWeather(const std::string &data) std::istringstream stream(data); stream >> weather.temperature; + if (stream.fail()) + { + throw std::runtime_error(""); + } + stream.ignore(); stream >> weather.windDirection; + if (stream.fail()) + { + throw std::runtime_error(""); + } + stream.ignore(); stream >> weather.windSpeed; + if (stream.fail()) + { + throw std::runtime_error(""); + } return weather; } From e8ad60ee29e295a326e21aa22cc24059b0d2a19f Mon Sep 17 00:00:00 2001 From: Viacheslav Konstantinov Date: Tue, 8 Jan 2019 22:31:20 +0200 Subject: [PATCH 09/24] Invalid parsing refactoring test --- tdd_intro/homework/04_weather_client/test.cpp | 43 +++++++++++-------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index 3d9fb59..547da38 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -152,27 +152,36 @@ Weather ParseWeather(const std::string &data) { throw std::runtime_error(""); } + Weather weather; std::istringstream stream(data); - stream >> weather.temperature; - if (stream.fail()) - { - throw std::runtime_error(""); - } - - stream.ignore(); - stream >> weather.windDirection; - if (stream.fail()) + for (unsigned int operationIndex = 0; operationIndex < 3; ++operationIndex) { - throw std::runtime_error(""); - } - - stream.ignore(); - stream >> weather.windSpeed; - if (stream.fail()) - { - throw std::runtime_error(""); + switch (operationIndex) + { + case 0: + stream >> weather.temperature; + break; + + case 1: + stream >> weather.windDirection; + break; + + case 2: + stream >> weather.windSpeed; + break; + + default: + break; + } + + if (stream.fail()) + { + throw std::runtime_error(""); + } + + stream.ignore(); } return weather; From 083b310c7280dbc2174b0971f9c25017e8d5d5a8 Mon Sep 17 00:00:00 2001 From: Viacheslav Konstantinov Date: Tue, 8 Jan 2019 22:40:35 +0200 Subject: [PATCH 10/24] Get average temp acceptence test --- tdd_intro/homework/04_weather_client/test.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index 547da38..4e694bf 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -249,3 +249,12 @@ TEST(WeatherClient, GetAverageTemperatureFor31_08_2018) ASSERT_FLOAT_EQ(25.5f, client.GetAverageTemperature(server, "31.08.2018")); } + +TEST(WeatherClient, GetAverageTemperatureAcceptence) +{ + WeatherServerStub server; + WeatherClient client; + + ASSERT_FLOAT_EQ(24.0f, client.GetAverageTemperature(server, "01.09.2018")); + ASSERT_FLOAT_EQ(26.75f, client.GetAverageTemperature(server, "02.09.2018")); +} From c7b7b0a6d7c97be7c7db4947139e2e42d67c984c Mon Sep 17 00:00:00 2001 From: Viacheslav Konstantinov Date: Tue, 8 Jan 2019 22:47:44 +0200 Subject: [PATCH 11/24] Get average temp acceptence test (updated) --- tdd_intro/homework/04_weather_client/test.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index 4e694bf..75c344e 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -257,4 +257,6 @@ TEST(WeatherClient, GetAverageTemperatureAcceptence) ASSERT_FLOAT_EQ(24.0f, client.GetAverageTemperature(server, "01.09.2018")); ASSERT_FLOAT_EQ(26.75f, client.GetAverageTemperature(server, "02.09.2018")); + EXPECT_THROW(client.GetAverageTemperature(server, "sdsdfdf"), std::runtime_error); + EXPECT_ANY_THROW(client.GetAverageTemperature(server, "01.11.2018")); // Использовал этот метод, почему то 2 метода EXPECT_THROW не компилируются в одном методе... } From 654f1698d1544ccf98e6523a595428b972cc50c1 Mon Sep 17 00:00:00 2001 From: Viacheslav Konstantinov Date: Tue, 8 Jan 2019 22:49:07 +0200 Subject: [PATCH 12/24] Get min temp red test --- tdd_intro/homework/04_weather_client/test.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index 75c344e..eb4eb02 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -260,3 +260,11 @@ TEST(WeatherClient, GetAverageTemperatureAcceptence) EXPECT_THROW(client.GetAverageTemperature(server, "sdsdfdf"), std::runtime_error); EXPECT_ANY_THROW(client.GetAverageTemperature(server, "01.11.2018")); // Использовал этот метод, почему то 2 метода EXPECT_THROW не компилируются в одном методе... } + +TEST(WeatherClient, GetMinimumTemperatureFor31_08_2018) +{ + WeatherServerStub server; + WeatherClient client; + + ASSERT_FLOAT_EQ(25.5f, client.GetMinimumTemperature(server, "31.08.2018")); +} From 98e7bf37c4c354fa61dee7ef2f01678dd9b79852 Mon Sep 17 00:00:00 2001 From: Viacheslav Konstantinov Date: Tue, 8 Jan 2019 23:02:02 +0200 Subject: [PATCH 13/24] Get min temp green test --- tdd_intro/homework/04_weather_client/test.cpp | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index eb4eb02..5be1c05 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -93,7 +93,7 @@ class IWeatherClient public: virtual ~IWeatherClient() { } virtual double GetAverageTemperature(IWeatherServer& server, const std::string& date) = 0; -// virtual double GetMinimumTemperature(IWeatherServer& server, const std::string& date) = 0; + virtual short GetMinimumTemperature(IWeatherServer& server, const std::string& date) = 0; // virtual double GetMaximumTemperature(IWeatherServer& server, const std::string& date) = 0; // virtual double GetAverageWindDirection(IWeatherServer& server, const std::string& date) = 0; // virtual double GetMaximumWindSpeed(IWeatherServer& server, const std::string& date) = 0; @@ -144,6 +144,22 @@ class WeatherClient : public IWeatherClient return result/4; } + + short GetMinimumTemperature(IWeatherServer& server, const std::string& date) + { + std::vector temps; + std::string response = server.GetWeather(date + ";03:00"); + temps.push_back(ParseWeather(response).temperature); + response = server.GetWeather(date + ";09:00"); + temps.push_back(ParseWeather(response).temperature); + response = server.GetWeather(date + ";15:00"); + temps.push_back(ParseWeather(response).temperature); + response = server.GetWeather(date + ";21:00"); + temps.push_back(ParseWeather(response).temperature); + + std::vector::iterator result = std::min_element(std::begin(temps), std::end(temps)); + return *result; + } }; Weather ParseWeather(const std::string &data) @@ -266,5 +282,5 @@ TEST(WeatherClient, GetMinimumTemperatureFor31_08_2018) WeatherServerStub server; WeatherClient client; - ASSERT_FLOAT_EQ(25.5f, client.GetMinimumTemperature(server, "31.08.2018")); + ASSERT_EQ(20, client.GetMinimumTemperature(server, "31.08.2018")); } From 2cdaa0cb9fa1de495057f8d2383ffb685a1d56a4 Mon Sep 17 00:00:00 2001 From: Viacheslav Konstantinov Date: Tue, 8 Jan 2019 23:05:22 +0200 Subject: [PATCH 14/24] Get min temp acceptence test --- tdd_intro/homework/04_weather_client/test.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index 5be1c05..7d407ad 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -284,3 +284,14 @@ TEST(WeatherClient, GetMinimumTemperatureFor31_08_2018) ASSERT_EQ(20, client.GetMinimumTemperature(server, "31.08.2018")); } + +TEST(WeatherClient, GetMinimumTemperatureAcceptence) +{ + WeatherServerStub server; + WeatherClient client; + + ASSERT_EQ(19, client.GetMinimumTemperature(server, "01.09.2018")); + ASSERT_EQ(21, client.GetMinimumTemperature(server, "02.09.2018")); + EXPECT_THROW(client.GetAverageTemperature(server, "sdsdfdf"), std::runtime_error); + EXPECT_ANY_THROW(client.GetAverageTemperature(server, "01.11.2018")); // Использовал этот метод, почему то 2 метода EXPECT_THROW не компилируются в одном методе... +} From 3e9759a792e1fd0fdc1f5d8d4ef706cf9d6e562c Mon Sep 17 00:00:00 2001 From: Viacheslav Konstantinov Date: Tue, 8 Jan 2019 23:07:10 +0200 Subject: [PATCH 15/24] Get max temp red test --- tdd_intro/homework/04_weather_client/test.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index 7d407ad..982876f 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -295,3 +295,11 @@ TEST(WeatherClient, GetMinimumTemperatureAcceptence) EXPECT_THROW(client.GetAverageTemperature(server, "sdsdfdf"), std::runtime_error); EXPECT_ANY_THROW(client.GetAverageTemperature(server, "01.11.2018")); // Использовал этот метод, почему то 2 метода EXPECT_THROW не компилируются в одном методе... } + +TEST(WeatherClient, GetMaximumTemperatureFor31_08_2018) +{ + WeatherServerStub server; + WeatherClient client; + + ASSERT_EQ(33, client.GetMaximumTemperature(server, "31.08.2018")); +} From 79566396b8ac11fa57b9066ddef1a364e7852c33 Mon Sep 17 00:00:00 2001 From: Viacheslav Konstantinov Date: Tue, 8 Jan 2019 23:08:59 +0200 Subject: [PATCH 16/24] Get max temp green test --- tdd_intro/homework/04_weather_client/test.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index 982876f..f5e6729 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -94,7 +94,7 @@ class IWeatherClient virtual ~IWeatherClient() { } virtual double GetAverageTemperature(IWeatherServer& server, const std::string& date) = 0; virtual short GetMinimumTemperature(IWeatherServer& server, const std::string& date) = 0; -// virtual double GetMaximumTemperature(IWeatherServer& server, const std::string& date) = 0; + virtual short GetMaximumTemperature(IWeatherServer& server, const std::string& date) = 0; // virtual double GetAverageWindDirection(IWeatherServer& server, const std::string& date) = 0; // virtual double GetMaximumWindSpeed(IWeatherServer& server, const std::string& date) = 0; }; @@ -160,6 +160,22 @@ class WeatherClient : public IWeatherClient std::vector::iterator result = std::min_element(std::begin(temps), std::end(temps)); return *result; } + + short GetMaximumTemperature(IWeatherServer& server, const std::string& date) + { + std::vector temps; + std::string response = server.GetWeather(date + ";03:00"); + temps.push_back(ParseWeather(response).temperature); + response = server.GetWeather(date + ";09:00"); + temps.push_back(ParseWeather(response).temperature); + response = server.GetWeather(date + ";15:00"); + temps.push_back(ParseWeather(response).temperature); + response = server.GetWeather(date + ";21:00"); + temps.push_back(ParseWeather(response).temperature); + + std::vector::iterator result = std::max_element(std::begin(temps), std::end(temps)); + return *result; + } }; Weather ParseWeather(const std::string &data) From ffe8e075120316959e940a5f51a760e1c3eb8724 Mon Sep 17 00:00:00 2001 From: Viacheslav Konstantinov Date: Tue, 8 Jan 2019 23:11:39 +0200 Subject: [PATCH 17/24] Get max temp acceptence test (+ fix for min acceptence test) --- tdd_intro/homework/04_weather_client/test.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index f5e6729..6ccfd50 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -308,8 +308,8 @@ TEST(WeatherClient, GetMinimumTemperatureAcceptence) ASSERT_EQ(19, client.GetMinimumTemperature(server, "01.09.2018")); ASSERT_EQ(21, client.GetMinimumTemperature(server, "02.09.2018")); - EXPECT_THROW(client.GetAverageTemperature(server, "sdsdfdf"), std::runtime_error); - EXPECT_ANY_THROW(client.GetAverageTemperature(server, "01.11.2018")); // Использовал этот метод, почему то 2 метода EXPECT_THROW не компилируются в одном методе... + EXPECT_THROW(client.GetMinimumTemperature(server, "sdsdfdf"), std::runtime_error); + EXPECT_ANY_THROW(client.GetMinimumTemperature(server, "01.11.2018")); // Использовал этот метод, почему то 2 метода EXPECT_THROW не компилируются в одном методе... } TEST(WeatherClient, GetMaximumTemperatureFor31_08_2018) @@ -319,3 +319,14 @@ TEST(WeatherClient, GetMaximumTemperatureFor31_08_2018) ASSERT_EQ(33, client.GetMaximumTemperature(server, "31.08.2018")); } + +TEST(WeatherClient, GetMaximumTemperatureAcceptence) +{ + WeatherServerStub server; + WeatherClient client; + + ASSERT_EQ(31, client.GetMaximumTemperature(server, "01.09.2018")); + ASSERT_EQ(34, client.GetMaximumTemperature(server, "02.09.2018")); + EXPECT_THROW(client.GetMaximumTemperature(server, "sdsdfdf"), std::runtime_error); + EXPECT_ANY_THROW(client.GetMaximumTemperature(server, "01.11.2018")); // Использовал этот метод, почему то 2 метода EXPECT_THROW не компилируются в одном методе... +} From 9be12416de1df474f401bc0086ff670320e5e165 Mon Sep 17 00:00:00 2001 From: Viacheslav Konstantinov Date: Tue, 8 Jan 2019 23:14:00 +0200 Subject: [PATCH 18/24] Get average wind direction red test --- tdd_intro/homework/04_weather_client/test.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index 6ccfd50..49735c5 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -330,3 +330,11 @@ TEST(WeatherClient, GetMaximumTemperatureAcceptence) EXPECT_THROW(client.GetMaximumTemperature(server, "sdsdfdf"), std::runtime_error); EXPECT_ANY_THROW(client.GetMaximumTemperature(server, "01.11.2018")); // Использовал этот метод, почему то 2 метода EXPECT_THROW не компилируются в одном методе... } + +TEST(WeatherClient, GetAverageWindDirectionFor31_08_2018) +{ + WeatherServerStub server; + WeatherClient client; + + ASSERT_FLOAT_EQ(189.25, client.GetAverageWindDirection(server, "31.08.2018")); +} From 8d897187c0f7d706f76a011e4bc054a289d63ff4 Mon Sep 17 00:00:00 2001 From: Viacheslav Konstantinov Date: Tue, 8 Jan 2019 23:17:55 +0200 Subject: [PATCH 19/24] Get average wind direction green test --- tdd_intro/homework/04_weather_client/test.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index 49735c5..9f5753f 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -95,7 +95,7 @@ class IWeatherClient virtual double GetAverageTemperature(IWeatherServer& server, const std::string& date) = 0; virtual short GetMinimumTemperature(IWeatherServer& server, const std::string& date) = 0; virtual short GetMaximumTemperature(IWeatherServer& server, const std::string& date) = 0; -// virtual double GetAverageWindDirection(IWeatherServer& server, const std::string& date) = 0; + virtual double GetAverageWindDirection(IWeatherServer& server, const std::string& date) = 0; // virtual double GetMaximumWindSpeed(IWeatherServer& server, const std::string& date) = 0; }; @@ -176,6 +176,22 @@ class WeatherClient : public IWeatherClient std::vector::iterator result = std::max_element(std::begin(temps), std::end(temps)); return *result; } + + double GetAverageWindDirection(IWeatherServer& server, const std::string& date) + { + unsigned short result = 0; + + std::string response = server.GetWeather(date + ";03:00"); + result += ParseWeather(response).windDirection; + response = server.GetWeather(date + ";09:00"); + result += ParseWeather(response).windDirection; + response = server.GetWeather(date + ";15:00"); + result += ParseWeather(response).windDirection; + response = server.GetWeather(date + ";21:00"); + result += ParseWeather(response).windDirection; + + return static_cast(result)/4; + } }; Weather ParseWeather(const std::string &data) From d238b5f3bf650c6f15da098de91e72697f1d4c51 Mon Sep 17 00:00:00 2001 From: Viacheslav Konstantinov Date: Tue, 8 Jan 2019 23:21:22 +0200 Subject: [PATCH 20/24] Get average wind direction acceptence test --- tdd_intro/homework/04_weather_client/test.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index 9f5753f..3dedaf2 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -354,3 +354,14 @@ TEST(WeatherClient, GetAverageWindDirectionFor31_08_2018) ASSERT_FLOAT_EQ(189.25, client.GetAverageWindDirection(server, "31.08.2018")); } + +TEST(WeatherClient, GetAverageWindDirectionAcceptence) +{ + WeatherServerStub server; + WeatherClient client; + + ASSERT_FLOAT_EQ(135.75f, client.GetAverageWindDirection(server, "01.09.2018")); + ASSERT_FLOAT_EQ(229.0f, client.GetAverageWindDirection(server, "02.09.2018")); + EXPECT_THROW(client.GetAverageWindDirection(server, "sdsdfdf"), std::runtime_error); + EXPECT_ANY_THROW(client.GetAverageWindDirection(server, "01.11.2018")); // Использовал этот метод, почему то 2 метода EXPECT_THROW не компилируются в одном методе... +} From 7caf78f351ef6266d9e5901e44e0398659aed047 Mon Sep 17 00:00:00 2001 From: Viacheslav Konstantinov Date: Tue, 8 Jan 2019 23:24:31 +0200 Subject: [PATCH 21/24] Get max wind speed red test --- tdd_intro/homework/04_weather_client/test.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index 3dedaf2..0e4a6c7 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -365,3 +365,11 @@ TEST(WeatherClient, GetAverageWindDirectionAcceptence) EXPECT_THROW(client.GetAverageWindDirection(server, "sdsdfdf"), std::runtime_error); EXPECT_ANY_THROW(client.GetAverageWindDirection(server, "01.11.2018")); // Использовал этот метод, почему то 2 метода EXPECT_THROW не компилируются в одном методе... } + +TEST(WeatherClient, GetMaximumWindSpeedFor31_08_2018) +{ + WeatherServerStub server; + WeatherClient client; + + ASSERT_FLOAT_EQ(5.1f, client.GetMaximumWindSpeed(server, "31.08.2018")); +} From 266e8b78aacb738678343c56f028c3673b85bbc3 Mon Sep 17 00:00:00 2001 From: Viacheslav Konstantinov Date: Tue, 8 Jan 2019 23:29:40 +0200 Subject: [PATCH 22/24] Get max wind speed green test --- tdd_intro/homework/04_weather_client/test.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index 0e4a6c7..65ec871 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -192,6 +192,23 @@ class WeatherClient : public IWeatherClient return static_cast(result)/4; } + + double GetMaximumWindSpeed(IWeatherServer& server, const std::string& date) + { + std::vector speeds; + + std::string response = server.GetWeather(date + ";03:00"); + speeds.push_back(ParseWeather(response).windSpeed); + response = server.GetWeather(date + ";09:00"); + speeds.push_back(ParseWeather(response).windSpeed); + response = server.GetWeather(date + ";15:00"); + speeds.push_back(ParseWeather(response).windSpeed); + response = server.GetWeather(date + ";21:00"); + speeds.push_back(ParseWeather(response).windSpeed); + + std::vector::iterator result = std::max_element(std::begin(speeds), std::end(speeds)); + return *result; + } }; Weather ParseWeather(const std::string &data) From 00b5ba8f2ab3d55247bb9411fa455e84e717d0e4 Mon Sep 17 00:00:00 2001 From: Viacheslav Konstantinov Date: Tue, 8 Jan 2019 23:30:12 +0200 Subject: [PATCH 23/24] Get max wind speed acceptence test --- tdd_intro/homework/04_weather_client/test.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index 65ec871..8ca6e8d 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -390,3 +390,14 @@ TEST(WeatherClient, GetMaximumWindSpeedFor31_08_2018) ASSERT_FLOAT_EQ(5.1f, client.GetMaximumWindSpeed(server, "31.08.2018")); } + +TEST(WeatherClient, GetMaximumWindSpeedAcceptence) +{ + WeatherServerStub server; + WeatherClient client; + + ASSERT_FLOAT_EQ(4.2f, client.GetMaximumWindSpeed(server, "01.09.2018")); + ASSERT_FLOAT_EQ(4.0f, client.GetMaximumWindSpeed(server, "02.09.2018")); + EXPECT_THROW(client.GetMaximumWindSpeed(server, "sdsdfdf"), std::runtime_error); + EXPECT_ANY_THROW(client.GetMaximumWindSpeed(server, "01.11.2018")); // Использовал этот метод, почему то 2 метода EXPECT_THROW не компилируются в одном методе... +} From 83ab16390d26860fade2baa183044e705fae8b83 Mon Sep 17 00:00:00 2001 From: Viacheslav Konstantinov Date: Tue, 8 Jan 2019 23:37:29 +0200 Subject: [PATCH 24/24] Little final refactorng --- tdd_intro/homework/04_weather_client/test.cpp | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index 8ca6e8d..74cc453 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -66,6 +66,13 @@ Each line means "" : "": #include #include +class Weather; + +using WeatherVector = std::vector; +using WeatherMap = std::map; +using TemperatureVector = std::vector; +using WindSpeedVector = std::vector; + struct Weather { short temperature = 0; @@ -96,7 +103,7 @@ class IWeatherClient virtual short GetMinimumTemperature(IWeatherServer& server, const std::string& date) = 0; virtual short GetMaximumTemperature(IWeatherServer& server, const std::string& date) = 0; virtual double GetAverageWindDirection(IWeatherServer& server, const std::string& date) = 0; -// virtual double GetMaximumWindSpeed(IWeatherServer& server, const std::string& date) = 0; + virtual double GetMaximumWindSpeed(IWeatherServer& server, const std::string& date) = 0; }; class WeatherServerStub : public IWeatherServer @@ -104,7 +111,7 @@ class WeatherServerStub : public IWeatherServer public: std::string GetWeather(const std::string& request) { - static std::map weatherMap = {{"31.08.2018;03:00" , "20;181;5.1"}, + static WeatherMap weatherMap = {{"31.08.2018;03:00" , "20;181;5.1"}, {"31.08.2018;09:00" , "23;204;4.9"}, {"31.08.2018;15:00" , "33;193;4.3"}, {"31.08.2018;21:00" , "26;179;4.5"}, @@ -131,7 +138,6 @@ class WeatherClient : public IWeatherClient { double result = 0; - std::string response = server.GetWeather(date + ";03:00"); result += ParseWeather(response).temperature; response = server.GetWeather(date + ";09:00"); @@ -141,13 +147,12 @@ class WeatherClient : public IWeatherClient response = server.GetWeather(date + ";21:00"); result += ParseWeather(response).temperature; - return result/4; } short GetMinimumTemperature(IWeatherServer& server, const std::string& date) { - std::vector temps; + TemperatureVector temps; std::string response = server.GetWeather(date + ";03:00"); temps.push_back(ParseWeather(response).temperature); response = server.GetWeather(date + ";09:00"); @@ -157,13 +162,13 @@ class WeatherClient : public IWeatherClient response = server.GetWeather(date + ";21:00"); temps.push_back(ParseWeather(response).temperature); - std::vector::iterator result = std::min_element(std::begin(temps), std::end(temps)); + TemperatureVector::iterator result = std::min_element(std::begin(temps), std::end(temps)); return *result; } short GetMaximumTemperature(IWeatherServer& server, const std::string& date) { - std::vector temps; + TemperatureVector temps; std::string response = server.GetWeather(date + ";03:00"); temps.push_back(ParseWeather(response).temperature); response = server.GetWeather(date + ";09:00"); @@ -173,7 +178,7 @@ class WeatherClient : public IWeatherClient response = server.GetWeather(date + ";21:00"); temps.push_back(ParseWeather(response).temperature); - std::vector::iterator result = std::max_element(std::begin(temps), std::end(temps)); + TemperatureVector::iterator result = std::max_element(std::begin(temps), std::end(temps)); return *result; } @@ -195,7 +200,7 @@ class WeatherClient : public IWeatherClient double GetMaximumWindSpeed(IWeatherServer& server, const std::string& date) { - std::vector speeds; + WindSpeedVector speeds; std::string response = server.GetWeather(date + ";03:00"); speeds.push_back(ParseWeather(response).windSpeed); @@ -206,7 +211,7 @@ class WeatherClient : public IWeatherClient response = server.GetWeather(date + ";21:00"); speeds.push_back(ParseWeather(response).windSpeed); - std::vector::iterator result = std::max_element(std::begin(speeds), std::end(speeds)); + WindSpeedVector::iterator result = std::max_element(std::begin(speeds), std::end(speeds)); return *result; } }; @@ -252,9 +257,9 @@ Weather ParseWeather(const std::string &data) return weather; } -std::vector ParseWeather(const std::vector &response) +WeatherVector ParseWeather(const std::vector &response) { - std::vector result; + WeatherVector result; for (auto data : response) { Weather weather = ParseWeather(data); @@ -303,7 +308,7 @@ TEST(WeatherClient, CheckParsingMultipleStrings) wether2.windDirection = 193; wether2.windSpeed = 4.3f; - std::vector result = {wether0, wether1, wether2}; + WeatherVector result = {wether0, wether1, wether2}; ASSERT_EQ(result , ParseWeather(response)); }