From ea2c42f505a11b9d1d9d752835988e33117aeb86 Mon Sep 17 00:00:00 2001 From: eha140 <46747143+eha140@users.noreply.github.com> Date: Fri, 22 Mar 2019 11:56:35 +0100 Subject: [PATCH] Add files via upload --- WeatherGraph-master/README.md | 24 ++++ .../display_results.cpython-37.pyc | Bin 0 -> 3788 bytes WeatherGraph-master/display_results.py | 118 ++++++++++++++++++ WeatherGraph-master/get_temperatures.sh | 10 ++ WeatherGraph-master/strip_spaces.sh | 10 ++ WeatherGraph-master/tempgraph | 3 + WeatherGraph-master/test.bmp | Bin 0 -> 1920054 bytes WeatherGraph-master/test_display.py | 61 +++++++++ 8 files changed, 226 insertions(+) create mode 100644 WeatherGraph-master/README.md create mode 100644 WeatherGraph-master/__pycache__/display_results.cpython-37.pyc create mode 100644 WeatherGraph-master/display_results.py create mode 100644 WeatherGraph-master/get_temperatures.sh create mode 100644 WeatherGraph-master/strip_spaces.sh create mode 100644 WeatherGraph-master/tempgraph create mode 100644 WeatherGraph-master/test.bmp create mode 100644 WeatherGraph-master/test_display.py diff --git a/WeatherGraph-master/README.md b/WeatherGraph-master/README.md new file mode 100644 index 0000000..2919371 --- /dev/null +++ b/WeatherGraph-master/README.md @@ -0,0 +1,24 @@ +# WeatherGrapher + +A system for generating temperature graphs. + +## Components + +`tempgraph` + +The full executable which downloads data, parses it, displays it and generates a graph. +This component orchestrates communication between the other components. + +`strip_spaces.sh` + +Removes extra spaces between elements. + +`get_temperature.sh` + +Get only the first two columns. + +`display_.py` + +Generate a view of the data as it is processed, and save the final data to file. + +`` diff --git a/WeatherGraph-master/__pycache__/display_results.cpython-37.pyc b/WeatherGraph-master/__pycache__/display_results.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35641efd4f5b79db36923f79fd912560a019b84f GIT binary patch literal 3788 zcmZu!PjB1E6`vs~ik4+3&U$TkyFl4&|EW#vcCl!IHs~fB?{mIdijZ@F*6C*;Y(}Zysmf4Eg^3-qU9*D-DLL z|L?EAe7VBdf9YX%xnLgR*1I5rMNDwvWIW<_bRx%&Zsa~;!WG_EOn7Hb#wyU6<8Jk-6UE$?gDlPWP%glXREo3O~k z{on2WX0LIOnxoJh$*_|uZNllMM2AnGK6|#me=kgOVb?##nCM0lzDcsaY&_2jqwRuy z#!KnFoqpanDGo0>p-H>4v7fw=m6%8jzN-k0?AlN1E2+0%c6*Hr7=Z1yiOwzu%tPGz zFCdb^D2xmexxx`H)b|7oL1qvz14ds2VhLkiG{iE-Ks3b)#wD>TZeeVQ+hPslvbZDO z!`Kw-;(d%OVgrWTELV0@-OG~G7gF~#Gkn$vaXrowt;0^C!X9)rX?_@59r~Ks-sxe| zmG?s3PBK^(igi+B^*fSwJIPw6&7lNcGM&8# z93{Dy`Oa=}l4k{CdgnkUh*I@LCB38j-9#IycBY>dBa+}Yz1=%4gE%Gy;&>fL>pLKf z2i)fk-n2jBh8x%1y*=B~rm&-noHTcoz{7}t>5QGRYuJdKgB<-9JDYM3m~p1F&V1Iv zEE~Cyb?36+tZX$qlSN2BK>ovJ?w<9^1^K7tl`br&fEo;3GEl2_R^7r7E#>lLYHdC! z`Kh&IMb>D;`*FXA@RRY>_?0idgC%VN2^QI~zu`v`g zW%w8ojAy{u^qI_sC&8xA-pCud!d+*ZFe8l>57oWB3$pzMoqq8E1To?wep)rFaOn}2 zMBY)+SCJ2;`Udf)WxL45qVCQ35HVV<=^x-I9e^-?+x~_hEGT?M_?n)SFpp_B9Wmk) zcFv|Dz(+20g%c-m`#B$5tvUq2e6Qt}H2?_`sMbN)8bvmrE0LwSjFw0hZIW(JZDLVv z5TQJ{;=fg^0|AKj+&!#LwP?b12;dKI&|)rr4R1(!tH;-1PD2DFaH9%fJHm5Y?Aw@& zodcGC;4$OAYN%gwpwbMN{={q`Dj|k5#uNR?beD~!l0IkG>Lpjgo0gtkI0XR{17DaULu|q;f5jrP!v&- z*U8de%d4`J_aa}(B#Q^r@f|>F#zG}0(~|Ki4$$;YW)XRd)9;FseV+|I+NRTxjpDY+C{arn;Zga zG&WijwVX=H0A)?)DEW)Q)F9E=ZhL|gG<_uVhFjO8pRIQ4Ik7-jIrHKWk3aAnh@;t+0g;CxeAZ_qYk(~+7^Mh1(aa;9w!B96u z*)c{oj8PxP?%?jo(VqZ)opVMwD_pd^KYmVy)!Sra*G4^=s4|vYMZGgzJE@w5?Y7?T zr)E1Z(l7qO*cT<$RbLnFSJFglXmF@T0!DIao7U1(vi+v4wX;IY8ESKlZnGfZ?)0RNiF@jIrVQbG%VAX8K*(%>HV9G?eH07Plt(0j}_U5ko&j8p$2_=E}&8bvbA$VT|y zH#}@PrFV=bON9`cMQPJ^_pvq#u(tSxO`7h-_78y;^p*4?2Ao^WzN>mF zY{b<6^)up|as0ZUWYd*;9E+kI$BI6>3L&a~RYc8$N!_QppAz{6kzWzH3@Xb}52GlJ zsM*m}AOp|i!E#U!eEe2|0CXu>wK8oi+v^%QJjaw_XKc(2V(JX3G`MS=V;6|K1tT)_ z**0bj_+yXOUvC`Pw4z>{(=JqbjLyWrf~dp#qcGKB@oIQ`@o&saA`vcNsjW-1=*RcTLTvhnPj&I;#;Z&;Jh@ C{(7AN literal 0 HcmV?d00001 diff --git a/WeatherGraph-master/display_results.py b/WeatherGraph-master/display_results.py new file mode 100644 index 0000000..c16349a --- /dev/null +++ b/WeatherGraph-master/display_results.py @@ -0,0 +1,118 @@ +#!/usr/bin/env python3 +''' +Reads a two-column space-seperated input on STDIN +With the first column as HHMMSS, and the 2nd as +a value +Plots the values as a function of time +Saves the data to temperatures.bmp +''' + +import sys +import socket + +import pygame + +class DisplayResult: + ''' + Class for plotting data using pygame, scaled to fit to the + data + ''' + def __init__(self): + pygame.init() + self._screen_size = 800 + self._screen = pygame.display.set_mode((self._screen_size, + self._screen_size)) + self._point = pygame.Surface((3,3)) + self._point.fill((255,0,0)) + self.points = [] + self.minmax_x = [999999, -999999] + self.minmax_y = [999999, -999999] + + def _update_minmax_points(self, new_point): + x, y = new_point + self.minmax_x[0] = min(x, self.minmax_x[0]) + self.minmax_x[1] = max(x, self.minmax_x[1]) + self.minmax_y[0] = min(y, self.minmax_y[0]) + self.minmax_y[1] = max(y, self.minmax_y[1]) + + def _get_seconds(self, time): + hour = int(time[:2]) + minute = int(time[2:4]) + second = int(time[4:]) + return second + (minute * 60) + (hour * 60 * 60) + + def _get_datapoint(self, line): + timestamp, y = line.split() + y = float(y) + x = self._get_seconds(timestamp) + return (x, y) + + def _update_scaling_factors(self): + try: + self.x_factor = self._screen_size / (self.minmax_x[1] - self.minmax_x[0]) + except ZeroDivisionError: + self.x_factor = 1 + self.x_constant = self.minmax_x[0] + + try: + self.y_factor = self._screen_size / (self.minmax_y[1] - self.minmax_y[0]) + except ZeroDivisionError: + self.y_factor = 1 + self.y_constant = self.minmax_y[0] + + def _draw_screen(self): + self._screen.fill((0,0,0)) + for p in self.points: + real_x = int((p[0] - self.x_constant) * self.x_factor) + real_y = int((p[1] - self.y_constant) * self.y_factor) + self._screen.blit(self._point, (real_x, real_y)) + pygame.display.flip() + + def save_image(self, filename): + ''' + Save the current graph to file. + ''' + pygame.image.save(self._screen, filename) + + def new_data(self, line): + ''' + Add a new data point to the graph. + ''' + self.points.append(self._get_datapoint(line)) + self._update_minmax_points(self.points[-1]) + self._update_scaling_factors() + self._draw_screen() + + def get_data(self): + s = socket.create_connection(('weather.cs.uit.no', 44102)) + done = False + full_data = "" + #print("Socket created at {}".format(s)) + while not done: + data = s.recv() + #print("Data: ", data) + if data == "": + break + full_data = full_data + data + socket.close(s) + return full_data + + def strip_spaces(self, input_string): + input_string = " ".join(input_string.split()) + return input_string + + +def mainloop(): + A = DisplayResult() + print("A is ok") + for line in sys.stdin: + A.new_data(line) + #A.strip_spaces(A.new_data) + print(A.new_data) + A.save_image("temperatures.bmp") + print("about to exit!") + sys.exit() + +if __name__ == "__main__": + mainloop() + diff --git a/WeatherGraph-master/get_temperatures.sh b/WeatherGraph-master/get_temperatures.sh new file mode 100644 index 0000000..db4e346 --- /dev/null +++ b/WeatherGraph-master/get_temperatures.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +# Gets the first two columns of a space-seperated input on STDIN +# Outputs the first two columns on STDOUT + +while read line +do + a="$(echo "$line" | cut -d ' ' -f 1,2)" + echo "$a" +done < "${1:-/dev/stdin}" diff --git a/WeatherGraph-master/strip_spaces.sh b/WeatherGraph-master/strip_spaces.sh new file mode 100644 index 0000000..68060fb --- /dev/null +++ b/WeatherGraph-master/strip_spaces.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +# Reads data from STDIN, and strips repeated spaces +# Outputs the stdin data with spaces removed to STDOUT + +while read line +do + a="$(echo "$line" | sed -r 's/ +/ /g')" + echo "$a" +done < "${1:-/dev/stdin}" diff --git a/WeatherGraph-master/tempgraph b/WeatherGraph-master/tempgraph new file mode 100644 index 0000000..5671aca --- /dev/null +++ b/WeatherGraph-master/tempgraph @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +nc -Nd weather.cs.uit.no 44102 | ./strip_spaces.sh | ./get_temperatures.sh |./display_results.py diff --git a/WeatherGraph-master/test.bmp b/WeatherGraph-master/test.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ebf5c05d34f0520acc6c5d97a5870f0dca027664 GIT binary patch literal 1920054 zcmeIuu?>JQ3Zb+Z3D*a};4mfq6a-92l}9yKF#XRdSSh*sx_@4t&p zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAn*r) E7oF<@RR910 literal 0 HcmV?d00001 diff --git a/WeatherGraph-master/test_display.py b/WeatherGraph-master/test_display.py new file mode 100644 index 0000000..b2656c9 --- /dev/null +++ b/WeatherGraph-master/test_display.py @@ -0,0 +1,61 @@ +import unittest +import unittest.mock as m +import subprocess + +import display_results + +class FakeConnection: + def __init__(self): + self.lines = ["000031 1.6 2.2 254.2 -3.3 72.2 "\ + "993.3 -15.8 0.0 0.0 0.0 0.0 " \ + "0.0\n000131 1.4 1.9 253.5 -3.2 72.9 "\ + "993.5 -21.0 0.0 0.0 0.0 0.0 0.0", + ""] + self.recv_called = 0 + + def recv(self, *args): + self.recv_called += 1 + return self.lines.pop(0) + + def __next__(self): + return self + + +class TestDisplay(unittest.TestCase): + def setUp(self): + self.disp = display_results.DisplayResult() + self.disp.draw_screen = lambda x: None + + def test_update_points(self): + self.disp.new_data("000010 123") + self.assertEqual(self.disp.points[0][0], 10) + self.assertEqual(self.disp.points[0][1], 123) + self.disp.new_data("000012 12") + self.assertEqual(self.disp.points[-1][0], 12) + self.assertEqual(self.disp.points[-1][1], 12) + self.assertEqual(self.disp.minmax_x[0], 10) + self.assertEqual(self.disp.minmax_x[1], 12) + self.assertEqual(self.disp.minmax_y[0], 12) + self.assertEqual(self.disp.minmax_y[1], 123) + + def test_write_image(self): + self.disp.save_image("test.bmp") + val = subprocess.run(["md5sum", "test.bmp"], stdout=subprocess.PIPE).stdout + self.assertEqual(val, b'777e538381377589c8a6f9d6d53a2006 test.bmp\n') + + @m.patch("socket.create_connection") + def test_get_data(self, socket): + fc = FakeConnection() + expected_result = "".join(fc.lines) + socket.side_effect = fc + data = self.disp.get_data() + self.assertEqual(fc.recv_called, 2) + self.assertEqual(expected_result, data) + + def test_strip_spaces(self): + input_string = "hello world two" + output_string = "hello world two" + self.assertEqual(self.disp.strip_spaces(input_string), output_string) + +if __name__ == "__main__": + unittest.main()