From 2858ac926d6c7cd5c0a6a79ea7a4d3952849dc82 Mon Sep 17 00:00:00 2001 From: Gega Anatoly Date: Thu, 10 Jan 2019 14:09:04 +0200 Subject: [PATCH 01/14] 04 - Weather client - 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 91eb0dbc1aca305414714985ab94af1d5ee6ab50 Mon Sep 17 00:00:00 2001 From: Gega Anatoly Date: Thu, 10 Jan 2019 14:20:46 +0200 Subject: [PATCH 02/14] 04 - Weather client - Added acceptance for GetAverageTemperature --- tdd_intro/homework/04_weather_client/test.cpp | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index 43c5d36..9089f6a 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -186,7 +186,7 @@ TEST(WeatherClient, CheckParsingValidString) Weather wether; wether.temperature = 27; wether.windDirection = 299; - wether.windSpeed = 4.0f; + wether.windSpeed = 4.0; ASSERT_EQ(wether, ParseWeather("27;299;4.0")); } @@ -198,17 +198,17 @@ TEST(WeatherClient, CheckParsingMultipleStrings) Weather wether0; wether0.temperature = 20; wether0.windDirection = 181; - wether0.windSpeed = 5.1f; + wether0.windSpeed = 5.1; Weather wether1; wether1.temperature = 23; wether1.windDirection = 204; - wether1.windSpeed = 4.9f; + wether1.windSpeed = 4.9; Weather wether2; wether2.temperature = 33; wether2.windDirection = 193; - wether2.windSpeed = 4.3f; + wether2.windSpeed = 4.3; std::vector result = {wether0, wether1, wether2}; ASSERT_EQ(result , ParseWeather(response)); @@ -219,5 +219,16 @@ TEST(WeatherClient, GetAverageTemperatureFor31_08_2018) WeatherServerStub server; WeatherClient client; - ASSERT_FLOAT_EQ(25.5f, client.GetAverageTemperature(server, "31.08.2018")); + ASSERT_DOUBLE_EQ(25.5, client.GetAverageTemperature(server, "31.08.2018")); +} + +TEST(WeatherClient, AverageTemperatureAcceptance) +{ + WeatherServerStub server; + WeatherClient client; + + ASSERT_DOUBLE_EQ(25.5, client.GetAverageTemperature(server, "31.08.2018")); + ASSERT_DOUBLE_EQ(24.0, client.GetAverageTemperature(server, "01.09.2018")); + ASSERT_DOUBLE_EQ(26.75, client.GetAverageTemperature(server, "02.09.2018")); + EXPECT_THROW(client.GetAverageTemperature(server, "03.09.2018"), std::runtime_error); } From ac17e6ec58c669e54bea182b5dc94e85ea7f280d Mon Sep 17 00:00:00 2001 From: Gega Anatoly Date: Thu, 10 Jan 2019 14:28:30 +0200 Subject: [PATCH 03/14] 04 - Weather client - Added red test for GetMinimumTemperature --- 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 9089f6a..974652c 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -232,3 +232,11 @@ TEST(WeatherClient, AverageTemperatureAcceptance) ASSERT_DOUBLE_EQ(26.75, client.GetAverageTemperature(server, "02.09.2018")); EXPECT_THROW(client.GetAverageTemperature(server, "03.09.2018"), std::runtime_error); } + +TEST(WeatherClient, GetMinimumTemperatureFor31_08_2018) +{ + WeatherServerStub server; + WeatherClient client; + + ASSERT_DOUBLE_EQ(20, client.GetMinimumTemperature(server, "31.08.2018")); +} From c1b8510bf3e5bd647bfff8fe1af8d22c72d2ccf4 Mon Sep 17 00:00:00 2001 From: Gega Anatoly Date: Thu, 10 Jan 2019 14:43:30 +0200 Subject: [PATCH 04/14] 04 - Weather client - Fixed test for GetMinimumTemperature --- tdd_intro/homework/04_weather_client/test.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index 974652c..6345c03 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 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; @@ -144,6 +144,18 @@ class WeatherClient : public IWeatherClient return result/4; } + + double GetMinimumTemperature(IWeatherServer& server, const std::string& date) + { + std::set results; + + results.insert(ParseWeather(server.GetWeather(date + ";03:00")).temperature); + results.insert(ParseWeather(server.GetWeather(date + ";09:00")).temperature); + results.insert(ParseWeather(server.GetWeather(date + ";15:00")).temperature); + results.insert(ParseWeather(server.GetWeather(date + ";21:00")).temperature); + + return *results.begin(); + } }; Weather ParseWeather(const std::string &data) From 9e19f9c2cc138a6ea63dbd2e01f947f464e874cb Mon Sep 17 00:00:00 2001 From: Gega Anatoly Date: Thu, 10 Jan 2019 14:47:18 +0200 Subject: [PATCH 05/14] 04 - Weather client - Added acceptance for GetMinimumTemperature --- tdd_intro/homework/04_weather_client/test.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index 6345c03..d47cace 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -252,3 +252,13 @@ TEST(WeatherClient, GetMinimumTemperatureFor31_08_2018) ASSERT_DOUBLE_EQ(20, client.GetMinimumTemperature(server, "31.08.2018")); } + +TEST(WeatherClient, MinimumTempertureAcceptance) +{ + WeatherServerStub server; + WeatherClient client; + + ASSERT_DOUBLE_EQ(19, client.GetMinimumTemperature(server, "01.09.2018")); + ASSERT_DOUBLE_EQ(21, client.GetMinimumTemperature(server, "02.09.2018")); + EXPECT_THROW(client.GetMinimumTemperature(server, "03.09.2018"), std::runtime_error); +} From fec5895467c9b2599c3f75b2c9d6a26ca81456ef Mon Sep 17 00:00:00 2001 From: Gega Anatoly Date: Thu, 10 Jan 2019 14:49:33 +0200 Subject: [PATCH 06/14] 04 - Weather client - Added red test for GetMaximumTemperature --- 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 d47cace..6fdb36a 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -262,3 +262,12 @@ TEST(WeatherClient, MinimumTempertureAcceptance) ASSERT_DOUBLE_EQ(21, client.GetMinimumTemperature(server, "02.09.2018")); EXPECT_THROW(client.GetMinimumTemperature(server, "03.09.2018"), std::runtime_error); } + +TEST(WeatherClient, GetMaximumTemperatureFor31_08_2018) +{ + WeatherServerStub server; + WeatherClient client; + + ASSERT_DOUBLE_EQ(33, client.GetMaximumTemperature(server, "31.08.2018")); +} + From f78aa669575d90e38ce4bdcb3fd551206465e89b Mon Sep 17 00:00:00 2001 From: Gega Anatoly Date: Thu, 10 Jan 2019 14:53:55 +0200 Subject: [PATCH 07/14] 04 - Weather client - Fixed test for GetMaximumTemperature --- tdd_intro/homework/04_weather_client/test.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index 6fdb36a..1d80706 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 double GetMinimumTemperature(IWeatherServer& server, const std::string& date) = 0; -// virtual double GetMaximumTemperature(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; }; @@ -156,6 +156,18 @@ class WeatherClient : public IWeatherClient return *results.begin(); } + + double GetMaximumTemperature(IWeatherServer& server, const std::string& date) + { + std::set results; + + results.insert(ParseWeather(server.GetWeather(date + ";03:00")).temperature); + results.insert(ParseWeather(server.GetWeather(date + ";09:00")).temperature); + results.insert(ParseWeather(server.GetWeather(date + ";15:00")).temperature); + results.insert(ParseWeather(server.GetWeather(date + ";21:00")).temperature); + + return *results.rbegin(); + } }; Weather ParseWeather(const std::string &data) From 7d05801a262a69add2524e913f344ad6a45d5554 Mon Sep 17 00:00:00 2001 From: Gega Anatoly Date: Thu, 10 Jan 2019 14:55:58 +0200 Subject: [PATCH 08/14] 04 - Weather client - Added acceptance for GetMaximumTemperature --- 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 1d80706..1680f91 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -283,3 +283,12 @@ TEST(WeatherClient, GetMaximumTemperatureFor31_08_2018) ASSERT_DOUBLE_EQ(33, client.GetMaximumTemperature(server, "31.08.2018")); } +TEST(WeatherClient, MaximumTemperatureAcceptance) +{ + WeatherServerStub server; + WeatherClient client; + + ASSERT_DOUBLE_EQ(31, client.GetMaximumTemperature(server, "01.09.2018")); + ASSERT_DOUBLE_EQ(34, client.GetMaximumTemperature(server, "02.09.2018")); + EXPECT_THROW(client.GetMaximumTemperature(server, "03.09.2018"), std::runtime_error); +} From 67a411a6fd411e78ed2f4d7ec29833e882404172 Mon Sep 17 00:00:00 2001 From: Gega Anatoly Date: Thu, 10 Jan 2019 14:58:11 +0200 Subject: [PATCH 09/14] 04 - Weather client - Added red test for GetAverageWindDirection --- 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 1680f91..a8eadd3 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -292,3 +292,11 @@ TEST(WeatherClient, MaximumTemperatureAcceptance) ASSERT_DOUBLE_EQ(34, client.GetMaximumTemperature(server, "02.09.2018")); EXPECT_THROW(client.GetMaximumTemperature(server, "03.09.2018"), std::runtime_error); } + +TEST(WeatherClient, GetAverageWindDirectionFor31_08_2018) +{ + WeatherServerStub server; + WeatherClient client; + + ASSERT_DOUBLE_EQ(666, client.GetAverageWindDirecion(server, "31.08.2018")); +} From db6158135bdd4ce3e996efd74ecbec5083b33d91 Mon Sep 17 00:00:00 2001 From: Gega Anatoly Date: Thu, 10 Jan 2019 15:02:31 +0200 Subject: [PATCH 10/14] 04 - Weather client - Added acceptance for GetAverageWindDirection --- tdd_intro/homework/04_weather_client/test.cpp | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index a8eadd3..6519f27 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 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 GetAverageWindDirection(IWeatherServer& server, const std::string& date) = 0; // virtual double GetMaximumWindSpeed(IWeatherServer& server, const std::string& date) = 0; }; @@ -168,6 +168,24 @@ class WeatherClient : public IWeatherClient return *results.rbegin(); } + + double GetAverageWindDirection(IWeatherServer& server, const std::string& date) + { + double 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 result/4; + } }; Weather ParseWeather(const std::string &data) @@ -298,5 +316,15 @@ TEST(WeatherClient, GetAverageWindDirectionFor31_08_2018) WeatherServerStub server; WeatherClient client; - ASSERT_DOUBLE_EQ(666, client.GetAverageWindDirecion(server, "31.08.2018")); + ASSERT_DOUBLE_EQ(189.25, client.GetAverageWindDirection(server, "31.08.2018")); +} + +TEST(WeatherClient, AverageWindDirectionAcceptance) +{ + WeatherServerStub server; + WeatherClient client; + + ASSERT_DOUBLE_EQ(135.75, client.GetAverageWindDirection(server, "01.09.2018")); + ASSERT_DOUBLE_EQ(229, client.GetAverageWindDirection(server, "02.09.2018")); + EXPECT_THROW(client.GetAverageWindDirection(server, "03.09.2018"), std::runtime_error); } From cf406ea6194d8bc1191508285095457d5ba95c6f Mon Sep 17 00:00:00 2001 From: Gega Anatoly Date: Thu, 10 Jan 2019 15:04:10 +0200 Subject: [PATCH 11/14] 04 - Weather client - Added red test for GetAverageWindSpeed --- 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 6519f27..fe69875 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -328,3 +328,11 @@ TEST(WeatherClient, AverageWindDirectionAcceptance) ASSERT_DOUBLE_EQ(229, client.GetAverageWindDirection(server, "02.09.2018")); EXPECT_THROW(client.GetAverageWindDirection(server, "03.09.2018"), std::runtime_error); } + +TEST(WeatherClient, GetAverageWindSpeedFor31_08_2018) +{ + WeatherServerStub server; + WeatherClient client; + + ASSERT_DOUBLE_EQ(0, client.GetAverageWindSpeed(server, "31.08.2018")); +} From ad36ef00d6155533065bc96ad9372cdf619d079e Mon Sep 17 00:00:00 2001 From: Gega Anatoly Date: Thu, 10 Jan 2019 15:19:48 +0200 Subject: [PATCH 12/14] 04 - Weather client - Fixed test for GetMaximumWindSpeed --- tdd_intro/homework/04_weather_client/test.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index fe69875..f07826d 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -96,7 +96,7 @@ class IWeatherClient 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; + virtual double GetMaximumWindSpeed(IWeatherServer& server, const std::string& date) = 0; }; class WeatherServerStub : public IWeatherServer @@ -186,6 +186,18 @@ class WeatherClient : public IWeatherClient return result/4; } + + double GetMaximumWindSpeed(IWeatherServer& server, const std::string& date) + { + std::set results; + + results.insert(ParseWeather(server.GetWeather(date + ";03:00")).windSpeed); + results.insert(ParseWeather(server.GetWeather(date + ";09:00")).windSpeed); + results.insert(ParseWeather(server.GetWeather(date + ";15:00")).windSpeed); + results.insert(ParseWeather(server.GetWeather(date + ";21:00")).windSpeed); + + return *results.rbegin(); + } }; Weather ParseWeather(const std::string &data) @@ -334,5 +346,5 @@ TEST(WeatherClient, GetAverageWindSpeedFor31_08_2018) WeatherServerStub server; WeatherClient client; - ASSERT_DOUBLE_EQ(0, client.GetAverageWindSpeed(server, "31.08.2018")); + ASSERT_DOUBLE_EQ(5.1, client.GetMaximumWindSpeed(server, "31.08.2018")); } From 39f94b165ed9cbe8d52512e320e53a054da75c2b Mon Sep 17 00:00:00 2001 From: Gega Anatoly Date: Thu, 10 Jan 2019 15:22:06 +0200 Subject: [PATCH 13/14] 04 - Weather client - Added acceptance for GetMaximumWindSpeed --- tdd_intro/homework/04_weather_client/test.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index f07826d..e5f586b 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -341,10 +341,20 @@ TEST(WeatherClient, AverageWindDirectionAcceptance) EXPECT_THROW(client.GetAverageWindDirection(server, "03.09.2018"), std::runtime_error); } -TEST(WeatherClient, GetAverageWindSpeedFor31_08_2018) +TEST(WeatherClient, GetMaximumWindSpeedFor31_08_2018) { WeatherServerStub server; WeatherClient client; ASSERT_DOUBLE_EQ(5.1, client.GetMaximumWindSpeed(server, "31.08.2018")); } + +TEST(WeatherClient, MaximumWindSpeedAcceptance) +{ + WeatherServerStub server; + WeatherClient client; + + ASSERT_DOUBLE_EQ(4.2, client.GetMaximumWindSpeed(server, "01.09.2018")); + ASSERT_DOUBLE_EQ(4.0, client.GetMaximumWindSpeed(server, "02.09.2018")); + EXPECT_THROW(client.GetMaximumWindSpeed(server, "03.09.2018"), std::runtime_error); +} From 3ad6830e4e23c57e03b0d475d59aa37eed0967c6 Mon Sep 17 00:00:00 2001 From: Gega Anatoly Date: Thu, 10 Jan 2019 15:45:36 +0200 Subject: [PATCH 14/14] 04 - Weather client - Refactoring --- tdd_intro/homework/04_weather_client/test.cpp | 91 ++++++++++--------- 1 file changed, 46 insertions(+), 45 deletions(-) diff --git a/tdd_intro/homework/04_weather_client/test.cpp b/tdd_intro/homework/04_weather_client/test.cpp index e5f586b..dcdd65c 100644 --- a/tdd_intro/homework/04_weather_client/test.cpp +++ b/tdd_intro/homework/04_weather_client/test.cpp @@ -126,77 +126,78 @@ class WeatherServerStub : public IWeatherServer 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; - } - - double GetMinimumTemperature(IWeatherServer& server, const std::string& date) + template + double GetMaximum(IWeatherServer& server, const std::string& date, TAccessor accessor) { std::set results; - results.insert(ParseWeather(server.GetWeather(date + ";03:00")).temperature); - results.insert(ParseWeather(server.GetWeather(date + ";09:00")).temperature); - results.insert(ParseWeather(server.GetWeather(date + ";15:00")).temperature); - results.insert(ParseWeather(server.GetWeather(date + ";21:00")).temperature); + results.insert(accessor(ParseWeather(server.GetWeather(date + ";03:00")))); + results.insert(accessor(ParseWeather(server.GetWeather(date + ";09:00")))); + results.insert(accessor(ParseWeather(server.GetWeather(date + ";15:00")))); + results.insert(accessor(ParseWeather(server.GetWeather(date + ";21:00")))); - return *results.begin(); + return *results.rbegin(); } - double GetMaximumTemperature(IWeatherServer& server, const std::string& date) + template + double GetMinimum(IWeatherServer& server, const std::string& date, TAccessor accessor) { std::set results; - results.insert(ParseWeather(server.GetWeather(date + ";03:00")).temperature); - results.insert(ParseWeather(server.GetWeather(date + ";09:00")).temperature); - results.insert(ParseWeather(server.GetWeather(date + ";15:00")).temperature); - results.insert(ParseWeather(server.GetWeather(date + ";21:00")).temperature); + results.insert(accessor(ParseWeather(server.GetWeather(date + ";03:00")))); + results.insert(accessor(ParseWeather(server.GetWeather(date + ";09:00")))); + results.insert(accessor(ParseWeather(server.GetWeather(date + ";15:00")))); + results.insert(accessor(ParseWeather(server.GetWeather(date + ";21:00")))); - return *results.rbegin(); + return *results.begin(); } - double GetAverageWindDirection(IWeatherServer& server, const std::string& date) + template + double GetAverage(IWeatherServer& server, const std::string& date, TAccessor accessor) { double result = 0; - std::string response = server.GetWeather(date + ";03:00"); - result += ParseWeather(response).windDirection; + result += accessor(ParseWeather(response)); response = server.GetWeather(date + ";09:00"); - result += ParseWeather(response).windDirection; + result += accessor(ParseWeather(response)); response = server.GetWeather(date + ";15:00"); - result += ParseWeather(response).windDirection; + result += accessor(ParseWeather(response)); response = server.GetWeather(date + ";21:00"); - result += ParseWeather(response).windDirection; - + result += accessor(ParseWeather(response)); return result/4; } - double GetMaximumWindSpeed(IWeatherServer& server, const std::string& date) +public: + double GetAverageTemperature(IWeatherServer& server, const std::string& date) { - std::set results; + auto accessor = [](const Weather& weather)->double{ return weather.temperature; }; + return GetAverage(server, date, accessor); + } - results.insert(ParseWeather(server.GetWeather(date + ";03:00")).windSpeed); - results.insert(ParseWeather(server.GetWeather(date + ";09:00")).windSpeed); - results.insert(ParseWeather(server.GetWeather(date + ";15:00")).windSpeed); - results.insert(ParseWeather(server.GetWeather(date + ";21:00")).windSpeed); + double GetMinimumTemperature(IWeatherServer& server, const std::string& date) + { + auto accessor = [](const Weather& weather)->double{ return weather.temperature; }; + return GetMinimum(server, date, accessor); + } - return *results.rbegin(); + double GetMaximumTemperature(IWeatherServer& server, const std::string& date) + { + auto accessor = [](const Weather& weather)->double{ return weather.temperature; }; + return GetMaximum(server, date, accessor); + } + + double GetAverageWindDirection(IWeatherServer& server, const std::string& date) + { + auto accessor = [](const Weather& weather)->double{ return weather.windDirection; }; + return GetAverage(server, date, accessor); + } + + double GetMaximumWindSpeed(IWeatherServer& server, const std::string& date) + { + auto accessor = [](const Weather& weather)->double{ return weather.windSpeed; }; + return GetMaximum(server, date, accessor); } };