From b4aebcc03935f4a1eff853f518aad4dbb3aba620 Mon Sep 17 00:00:00 2001 From: Pogosian Tigran Date: Fri, 29 Nov 2024 09:35:32 +0300 Subject: [PATCH 1/2] laba4 --- __pycache__/circle.cpython-311.pyc | Bin 0 -> 10798 bytes __pycache__/rectangle.cpython-311.pyc | Bin 0 -> 13395 bytes __pycache__/square.cpython-311.pyc | Bin 0 -> 7526 bytes __pycache__/triangle.cpython-311.pyc | Bin 0 -> 9109 bytes circle.py | 120 ++++++++++++++++++++- docs/README.md | 10 -- rectangle.py | 147 ++++++++++++++++++++++++++ square.py | 95 +++++++++++++++++ test.py | 18 ++++ triangle.py | 110 +++++++++++++++++++ 10 files changed, 489 insertions(+), 11 deletions(-) create mode 100644 __pycache__/circle.cpython-311.pyc create mode 100644 __pycache__/rectangle.cpython-311.pyc create mode 100644 __pycache__/square.cpython-311.pyc create mode 100644 __pycache__/triangle.cpython-311.pyc delete mode 100644 docs/README.md create mode 100644 rectangle.py create mode 100644 test.py create mode 100644 triangle.py diff --git a/__pycache__/circle.cpython-311.pyc b/__pycache__/circle.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7cbabee78e8d95a804a8b778cd36a25ea17bdb2 GIT binary patch literal 10798 zcmeHNYitu&7M}4VaS|sXJQ4ylI6!I4!^Cl%*gzp^csC^F{a6;)%}iW_%B# z0Sl`g+h1nRJ#+7!^WAgrId}5M;^IOEjveoA^^MJ7n1A6#;xNWfCXd6(1%_idHozQ| z|FQ>JPIs0$sN?j2dL6Tw;S6UP&d9Sz42cS^>KW!5{N&@HkzB1dN>3Q3Q+E|gt|_HL zX-H|EfwrzfE!UKqPO~Q&PIr`ElhROuTpuE*PuC1l3(6Wt@)DXSnK1NI#$Aln(EB&2 ztk437_^~)HekFb(4Tz)CkT@#dl1^L1+u}FkIK8|nMJ(di(tvbE{IfWUCF2(HCKQi} z--)*@;w=!5Tkvj>j!9>vQ=nBtth91$KsgaVgBDQlTWkYrJhxgYLq%e#=?rvxLl&qS zs<-%qA?xa7TchcXBzsk;)RXx%(Aqfm^DF4?sPqx^_dBTnR%+97!`NE32bY@=KZ6Gt zqYnVxw}92oLB-?Z7vgBLLNDRHH4ZC2lBLdNt81)xI27*=CIl8 z?M`=HgVW)3xf|V%RINIj6ZPzFTZ5zC?X0hL)w>-Hb+vM3k5>cB;*}%;DSX|8?tLSE ziO+2jZ%F6B@(~NzVGM`@j>T^Y4#LN4pSlk52G%S^q(Lxm?MQyC&@cFdLdYBJ;A46q zFJ`24#tL@#_wXAD=_awlz1~1?{M^vx4ZR=J_4r5F7)t~k+?F33TUH<1Bk)8x6!QCs z_t1v!z95VVPB^r6*Uop^+YkBp?k+w={2iWv|Gh&Ue$o-(Z9V-l1DcbRK_%#A!cKqz z=5ZBcE=8|S?&q5Zn@=AfIR2ny zu2{KGD%l?`*)N**KPW1VG@jovwC0ntq4lC+-Xzq@yv)we8MNI$#rciBQf}vud$)AP z0u0Np|0Q_MxO7T74SxB;rvN%>#3vWk*nWmypP0{Je$#m3r||tAp7>#W@+3Y1*j+a8 zRi_ht+wOF@8XFYHPHM_?K!dH$<*>V)j@m|hquc4y(v;@`yVKTK+vsj^)HO7^>s{^! zS(V_xr_M}pNt!^nCb$5Q5&+r12rQ~htUzg-%z^89So~}p=6;d+x1mU%;xJ?;)ZGC; z<)CXATunv*E-*X;D>ts&EUw#h4L8s=+=%P+xgeKPwsUZji77R3OY$LOwGGF)1Gk5-8ZEc#s zYG6{#>j`)}cws~rEAt94Cx)5>UEM-xLeP5;PKKW2-hiL; zz(maZc;XSdyn#U2s(M6QPSrZ-gkS|2VD6jD-_t~6ilyVN(FH+oDoRY@jy z)Z`WuUzzL#!Ek3XGcond1EiW})5VjQPKqmA#XWnearQ+``^3ce#T)0}&_Os1O};fP|2z=++|e|F^Fj^- z%}*Z?bp4KxoHuff9F?LA+7Oljq#CE?V*jOnaoO5CJE(0oM@^f>#5ad+jzC2hAa1<^ ze>0C<4yTT`k0_4G>2N8`;fmC117~f`K4|Xq-_Pq(4J)gGyarP0d&G=q#R%!+EQ=ZC zQ8o=TQpGh;v#<(4!;F7ga{Z0b4I{QYWz?1}QB#YU_-5J?mjHbJ$=?9vu%(iVFidJr z;e-q*ghMBOq-Q5Mjo~LXqmd`K#f+U141Ky2`U6ZK%Q6R`F1chx*G3ns5q-=oPj5TD zet{QA5i}#4INh*wlH)VXlWq_3a{gW+T&+DaRVwSCO5s-kV9esO?~AMM6<1vjOU28g z#mgWdESOEJvg*@&oETQWTT7Xq`QI@`CRI=oK zX=ibkva7yQEaf@s?B4e}NIi0t?mkO$(c|gp?&=BfC&IPUr73a8wkhcP-*c+8mFs7& zOl+GrP4l#A3U&wi@Y1QtLA|yqD5*dvs6Y>zJ+v*dZEzcUkSwGn=s^|eK`I$7(1N%J zWmnDNL2`PQHSl_hV8NHRnfdcbf%S*Hj=rPmKv|dx_=V7Pm_a>EfQ63$)G>nQ+*bWU zX17U;GbSGyks)`(|pGfbkfO>Yh_-HDQ1Te9psPZ#6G+H<3!XqM5^pPL6?b z;~--mTSOg1*!PN0V&a<_0V}rZfy#13 zz)F^&mA-4|6EvG(DeA84HPd@Tn_sul$RxAVk$4(GO_)86$ZbqHo0z^ass2HD{>cUa zbyCqkTrMrFjV`Pmt-i(G^xar~Cr_%|bXQLBcSKE)u*JVQEc={BAz1>Q^&NKYv4)SV zYLX`an&3BsJY)D-G>4xmHw~|ta`36Ne+g}5WU~Fkvo3yk=|gc<^WADX_FAK+Rx$C- zVWI!h*dsM)DcoO@6aNiQYdCqJP1kT#`(0>5zkSv}(?Y^3s%?<5X#>#?qvz*MauTk-k>q;$Qi|Jmd-;8yv&nK=h|X4x&Zd&l z0xgI;TXxkK;cU+&uO+LIFiqAL=3tGcx67x=6)Fo;_|^h6^8#du8)}cV54IycvXGV_ zJqwT?m5df>L7blKsyXO+33J>DItM;AM>Nr$E=Q=`haBa|c9R^D7sC>6(WmUVzL=yf z`#ahA>)3)OIe2b@{^f|E)1y2&jqnG1dbKtnl2M*Y?*nWBcUWlz+-98{GkH8gZx`?J z#0ov0u5PY3fahk92j2k8CB%X^EJ9d{fG=!`4Z)7!M8G$41m7o-HxY2Fooqzdf`FTZ zWIIAT!Y+ip2>TI!fq;q7h}J9osIE~A105FV-nRdfWPfHHO%W$YvaG|Xaw4h2>yXH>SLm1VKV+5eociOyX7gRJlNvkFg(MvA?6^% z+s-ftS>6t4voX6F-f@QEodWZoJ$2zFIJ=^k4mt!UUvSihQc`APK(j#Cgp(_&0>i=` z_S1h~VG?WGyXjS$f&;#>)rso>7nlgE)x*~y6ESFBg7YhSnN&>CWV35ZrIFM#Lz_H% z3GQ%3zsqTM5T5-gElUN1Z0ekpMheqC;q94M4YC8!?taGS=)VV-7kS~3&&zk^zsc8> zs64I=%j5D5<+NA6C*PLu(&BYx1d2*j`L+BRRDCG_1@vz#Bk~>jrhH2tUs*((QJYeJ z0mAF@9p#*S!wVFv#Djdcg<>_cLnI7 zI@t1KV5em@ZS3(+fNlBr%4wh_3Qd5ab6OFt4b;hhRW+}|E*JFRp#W zu+CHL9}kYRH`XZ)8{!Qc)S8DS3*@R3O3BH1$w}FD@Y#|2bU{!7+Oi zMiRsn9PIz+VdR)VL>QU^NkuRSv-w*{4s7ap(_03y>15m?^P zML;_#hij6^dC~;{p|&_6L2QledcQvqqJi=>SO97(H0~hy&tLnb1>f-#-z*yODs()8K_5;P$7I{gIAQ4>U(}9)Co&y5u^GhNx z_yalYY0z2+txkLd0QPj3ec`UV@2% zsq9PC`bt+#Uu1RmU7>Y)xjdQg!SBp%k5-LWf>X0cz9TixC##DAy zg0X1!kn`Wk$;l-3Axm;R>6jZ9dIAygxRCOrrmWG~q`4VM%FCC^W1TO+mu4A5blvnd z&}8jCSs4lr# zlflyLgV?CI0~*bUGp7`{FYfkXl&GhGab{kuN8#$?T%F9-VVqGVRE%+^9^;ImE`71- zOp7zwRc9AfV*fQali)UOT)Te#+D*+Z>zi9h^9+~@=E+oW_cTmVx_rn~D#5lSY-?6qvs0b+qhMd;h(DZmk^x^SN{SgTQUSn34rYd$o+qpQZMoU+#90iB>j_e)UiyW!dRE8W?BS(fh zDzE~LqwK1)izBiM%%>66&^9xUg86b3+@Ci`WwD*#5{~f4i;UdEQ|u{i?K#}X5auw# zh5LIU(bkR8PRJ4F%&PB9L(f8VgoWrr^J8SVeWZP;9bHJRrZRM)h3GS@iUqesrRlvlJ4gNS-XA>W`77VF2S6(l8mN1KlE6+`WiUr|$L3 zTkW?TTMIvD*{xaj`p+eUm&9#g5|gh<0&v+zs^N=fWHVOPs+;I(+bOv_%hiCT>LF-9 zBX#8&TRTP+&$75@*{6FIS8LqWDyRN(q^_QeNywYfLs6RC&WQ6TKV-=F&>-gIowY60 z3|?NgpsL+y3mxNE1J`paRAmoOJ3I?KRz5Wn?38%;f6 zzJFSa8nScN?wuZ82Gzr8(Ht3~)XuFU#*c1)wR6i%y^7C#X~1y-O1U72(x{|y#Q*w(F|l4`V^wrb3dmQInt_WQMI+{~za+=?~B%5)KiwMA-7 zY*sjLob$?@7h|F-p<;}Qi!de{>Zrg9w3wJ(b#}$XM8Vp1EgPEGCI0}HB)HJen7wkb z6`ToML41!T!^aG4rDw1sWA;}wSf-DWpMnJw_BHF9t*NRvIhHxAIIuFeZ<+OfHVt8o z=pl{hUPs293b!=QEtR>Y=w7OXiqX9q(Y*|HRA2>~du3OhUGAmkx7xP1(G8L{X|*QO zrY0E&mglBys`hChY{I;hH+YyAZSFO=H%ma(a@}q zenoJzoMTA8oLNE~)HxzhE<@2&;WX2R(NL(5Mv!m=m?dAB9@OLo#-Ux%p>|(w!sYje z1HFRZpD6PCd;9qQ5T0{>KfZsbN=PjltR7(r0;Zb?zC}mYAhaNCM0g!xD?%H>8wfiQ z@b^2i7hxYlC&JqZnDHiE2!{|bn?(eKBM7+1Cn12#49!~6cmGHQ)*`$H|I!#F8>0H> zk%M(ML10cn0qbmIv8-c(%?Yn!>ENIzSOJ z!8&9XA@6Q;YG9HUvChrdYYpHjcG0KM5uU=-6Idvfw`15h?y3(F0g zQv;B~_|#!WMg20BJfsYVTW>%N`~AMcgsVR+MsT`UU%|l5QNncq$~yw^1}LSu7wa5& z1vv(%=~3{F>veUoZYBL7z*h>TApn@XS@r=_8l|5{j&io_5u-y>IlBOh8Z-$k3r}Z_ xu^+`NmVQZvUl~=}?TmvP8n|!w$ac>IM_KgEGkZViIMWfOpGP3A1_ABq{{W)rUk3mH literal 0 HcmV?d00001 diff --git a/__pycache__/square.cpython-311.pyc b/__pycache__/square.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c537bf9a10c63c955af31d2ca809449772f30394 GIT binary patch literal 7526 zcmeHM|8EmV7N7N(WRtA(1xkn^Brdcx4wM5YAr!$8uAnrhG^q+bwJ6eNo820>j+4$h zaQM*4qjRRVUrOH*2rg z_S&>3A(7Lqoew+n-oBZ6pLz41mp}P@^#rc%<3r&AiI8uwk-xmTo3$9+Tp=n^g(x{i zRM$mvN>JT^E*BXjs^=n6y&8GfoqzB;+}*HRr#zZht$ELdQrhAopjl&S!p)6*g9tFf z3H}$XUBTXw3BeK);(>d#y7p^;DkJv%F$ zhZViY+q5ZOYg#~5-Q}9+Ndj!0AVJT}ui%mT09@?%Y>9ovzBH0-!I)zUY|)qvu&>!| zw#1t^jdXzhjeQA{n_Op>EuefUz;1%lEq0eJ2G}C|3-lNlj9GXr2^Q}fmjYc%u%3^> z$N2>8!x-!ij$kB>O9w3(%9TJ@Bo+@IESOy=wO2X~oAI(mz%WZVv9Dl$3&sa9!MiZm z#o{sZBUWFnISl&*W`B#%9_AhZhg|~WOX!$_QH5$sS8ov46WF)kS|9HYnccm-_u;ER z5&N{@E_7;{mv4go+w8BngaG@(xCDMn2aMmrVs69ecLK1kTgC;Xirt~OV;&y+ug$VA za4;inq`+-^=RMi_h#raQaV0jPW!*qcw(jJ)Y3(?rQ#4!u3ne;Z-p>nJLD6vo2EOlq z`QX?ax<>V}cqB}fv13zbW6>!^)yIZTy#Ctg=vY{rn$+SnG9gDJZ;$Ek&wyw4OrOho z&_lEljPM8E&86b#(Sj z^2~$AHs+U&#_>$!I1|U08>H0xbA8F-H84eb5|ZMM!bKsQ3W z4Rx9jngJ%@&${@*46U`d0j@yufYbwtM-?FbxOpn_@Kof*G<2#)^#azaHGra83s|R$ zfc0t}V1rr@D5(vAK2-v2RDFO=Y9nB?+5`uCbGG3GkE)ZJ9@mTZJ+6sI*D#;Td2$W@ zEx+QZleVv34!&-G8aFq}m zdI6x=2k#pGV8$P0yN(#*Kt>#3`ER)!a9i`u@FCn>Ar&`+RfZ5!Tu$^sxl^q$!L5NG zrwy}%>?6A8tm~KVx5!yRAa8*!b1TieMtA_uyR(wHi(XeEx~5Ys^Y~t(rB2*f*d+;# zPRV*i)e@b~+sIPr19SRs0lF&{^M^4>^zBMRa$sd~!xNmt5)qX7;sx6A!r(nIff^9>Y#Mx~?7B@z0H>M^mH7j@ij2$WA-5W9#Dr zC&;l=S(V~pvrZVv3cd4gIB$TFIs~k!%DCBT<7O%*LusdlH46Vu&%_fiRN$vn@i16k zD~+IYhA)`$1<}o|9FU`pb3^H&)DUuHc5(@F)QTM0`U=mL+~qi`th%l^s_p9y_4I{a zqCqEiwpC$A4kdy=kRLg86s(t>aW;njA4Qc?P#8Q1muJA4AzSJ44*a@_=OU*<>0(nk z4o2xNgt8+A%Y`RZoUOb9#v=i!g63V+kHcfpT6QdK;TzAYY>UdWon^buQSawqx2!hv zUkiP-?c;5qyA5%7M%>Nv-}0j5Njf3&&HZr_Nz1M6RC}t;@U_$X@Lb3I6ffM8sN@dmZ2z^S)!7}Wh|49Fv zV$oC<)9odk6qQ+tt}46~X`V!GQUDdo{b64mm%O>Z2DDa}weVz#1lw_-p|%#EZ+QX@!;*~ukH%2p)B*2e`-kRzqC zDko(m*pd}xIi^f%vYf4#<;f{^CW`lxEaUq(Q$pL(FC7Rw5U@z0-3WUS_95Ua5!#P% z5aAHQ0K(4@jseV@?>G4?P`U|w5nhBp9sj#4X?<2bf_En@Di1Y+_o#qv3u|0nc*SCY z=<>p^5euLRKlLoAF0B{5FQV-nz*zm*%mEApN!|i51xdvMXu@%20W={9EPy7szZ`hs z#@CL%pHw0-Sq|1_#hF+nj>m!ds~eB_tauXIFDvjml>6&A_IdCLiZ!`u2;V4wFCH?P z`zggL5?@&ANdVYEg0M`QlKivk*&wv65(~PmJKopbC%}Bm;c{1I!;WuJ@LfSVEf9~C hO5Ah%ncKhYX-U3v@zo2X7e|x)v+5?EEg;}C{10!#NfQ77 literal 0 HcmV?d00001 diff --git a/__pycache__/triangle.cpython-311.pyc b/__pycache__/triangle.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42b1530341ac419da21458658e9aeb1a7761626b GIT binary patch literal 9109 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 literal 0 HcmV?d00001 diff --git a/circle.py b/circle.py index c3eb8647c9..ead0e1a058 100644 --- a/circle.py +++ b/circle.py @@ -1,10 +1,128 @@ import math - +import unittest def area(r): + ''' + Возвращает площадь круга по длине его радиуса (r) + + Параметры: + r (float или int): длина радиуса круга + + Возвращаемое значение: + (float): площадь круга + + Примеры вызова: + area(3) 28.274333882308138 + area(1) 3.141592653589793 + area(2.5) 19.634954084936208 + ''' + if not isinstance(r, (int, float)): + raise TypeError("Радиус круга должен быть числом") + if r <= 0: + raise ValueError("Радиус круга должен быть больше 0") return math.pi * r * r def perimeter(r): + ''' + Возвращает длину окружности по длине его радиуса (r) + + Параметры: + r (float или int): радиус круга + + Возвращаемое значение: + (float): длина окружности + + Примеры вызова: + perimeter(3) 18.84955592153876 + perimeter(1) 6.283185307179586 + perimeter(2.5) 15.707963267948966 + ''' + if not isinstance(r, (int, float)): + raise TypeError("Радиус круга должен быть числом") + if r <= 0: + raise ValueError("Радиус круга должен быть больше 0") return 2 * math.pi * r + +class CircleTests(unittest.TestCase): + # Tests for area function + def test_area_valid_integer_small(self): + self.assertAlmostEqual(area(2), 12.566, places=3) + + def test_area_valid_integer_large(self): + self.assertAlmostEqual(area(999222), 3.141592653589793 * 999222 ** 2, places=2) + + def test_area_valid_float_small(self): + self.assertAlmostEqual(area(2.5), 19.634954084936208, places=5) + + def test_area_valid_float_large(self): + self.assertAlmostEqual(area(1e6), math.pi * 1e12, places=2) + + def test_area_zero_radius(self): + with self.assertRaises(ValueError): + area(0) + + def test_area_negative_radius(self): + with self.assertRaises(ValueError): + area(-3214234) + + def test_area_non_numeric_string(self): + with self.assertRaises(TypeError): + area('1') + + def test_area_non_numeric_string_complex(self): + with self.assertRaises(TypeError): + area("321abc") + + def test_area_non_numeric_none(self): + with self.assertRaises(TypeError): + area(None) + + def test_area_non_numeric_list(self): + with self.assertRaises(TypeError): + area([5]) + + # Tests for perimeter function + def test_perimeter_valid_integer_small(self): + self.assertAlmostEqual(perimeter(4), 25.133, places=3) + + def test_perimeter_valid_integer_large(self): + self.assertAlmostEqual(perimeter(345346), 2 * math.pi * 345346, places=2) + + def test_perimeter_valid_float_small(self): + self.assertAlmostEqual(perimeter(2.5), 15.707963267948966, places=5) + + def test_perimeter_valid_float_large(self): + self.assertAlmostEqual(perimeter(1e6), 2 * math.pi * 1e6, places=2) + + def test_perimeter_zero_radius(self): + with self.assertRaises(ValueError): + perimeter(0) + + def test_perimeter_negative_radius(self): + with self.assertRaises(ValueError): + perimeter(-4234234) + + def test_perimeter_non_numeric_string(self): + with self.assertRaises(TypeError): + perimeter('5') + + def test_perimeter_non_numeric_string_complex(self): + with self.assertRaises(TypeError): + perimeter("2343xyz") + + def test_perimeter_non_numeric_none(self): + with self.assertRaises(TypeError): + perimeter(None) + + def test_perimeter_non_numeric_list(self): + with self.assertRaises(TypeError): + perimeter([10]) + + def test_perimeter_float_input(self): + self.assertAlmostEqual(perimeter(3.1415), 2 * math.pi * 3.1415, places=4) + + +if __name__ == '__main__': + unittest.main() diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index 63f8727939..0000000000 --- a/docs/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Math formulas -## Area -- Circle: S = πR² -- Rectangle: S = ab -- Square: S = a² - -## Perimeter -- Circle: P = 2πR -- Rectangle: P = 2a + 2b -- Square: P = 4a \ No newline at end of file diff --git a/rectangle.py b/rectangle.py new file mode 100644 index 0000000000..4bf0a70923 --- /dev/null +++ b/rectangle.py @@ -0,0 +1,147 @@ +import unittest + +def area(a, b): + ''' + Возвращает площадь прямоугольника. + + Входные данные: + a (int): длина прямоугольника + b (int): ширина прямоугольника + + Выходные данные: + area (int): площадь прямоугольника + + Пример вызова: + area(5, 10) - вернёт 50 + ''' + if not isinstance(a, int) or not isinstance(b, int): + raise TypeError("Стороны прямоугольника должны быть целыми числами") + if a <= 0 or b <= 0: + raise ValueError("Стороны прямоугольника должны быть больше 0") + return a * b + +def perimeter(a, b): + ''' + Возвращает периметр прямоугольника. + + Входные данные: + a (int): длина прямоугольника + b (int): ширина прямоугольника + + Выходные данные: + perimeter (int): периметр прямоугольника + + Пример вызова: + perimeter(5, 10) - вернёт 30 + ''' + if not isinstance(a, int) or not isinstance(b, int): + raise TypeError("Стороны прямоугольника должны быть целыми числами") + if a <= 0 or b <= 0: + raise ValueError("Стороны прямоугольника должны быть больше 0") + return 2 * (a + b) + +class RectangleTests(unittest.TestCase): + # Tests for area function + def test_area_valid_small(self): + self.assertEqual(area(2, 4), 8) + + def test_area_valid_large(self): + self.assertEqual(area(999221, 214531), 999221 * 214531) + + def test_area_zero_side_a(self): + with self.assertRaises(ValueError): + area(0, 134) + + def test_area_zero_side_b(self): + with self.assertRaises(ValueError): + area(61, -634764) + + def test_area_negative_side_a(self): + with self.assertRaises(ValueError): + area(-5, 10) + + def test_area_negative_side_b(self): + with self.assertRaises(ValueError): + area(5, -10) + + def test_area_non_integer_a(self): + with self.assertRaises(TypeError): + area('4', 8395142) + + def test_area_non_integer_b(self): + with self.assertRaises(TypeError): + area(897653, "982662945645") + + def test_area_both_non_integer(self): + with self.assertRaises(TypeError): + area("5", "10") + + def test_area_float_inputs_a(self): + with self.assertRaises(TypeError): + area(5.5, 10) + + def test_area_float_inputs_b(self): + with self.assertRaises(TypeError): + area(5, 10.5) + + def test_area_non_numeric_none(self): + with self.assertRaises(TypeError): + area(None, 10) + + def test_area_non_numeric_list(self): + with self.assertRaises(TypeError): + area([5], 10) + + # Tests for perimeter function + def test_perimeter_valid_small(self): + self.assertEqual(perimeter(34, 23), 2 * (34 + 23)) # 114 + + def test_perimeter_valid_large(self): + self.assertEqual(perimeter(23, 4325235), 2 * (23 + 4325235)) # 8650516 + + def test_perimeter_zero_side_a(self): + with self.assertRaises(ValueError): + perimeter(4357, 0) + + def test_perimeter_zero_side_b(self): + with self.assertRaises(ValueError): + perimeter(432, -4234234) + + def test_perimeter_negative_side_a(self): + with self.assertRaises(ValueError): + perimeter(-10, 20) + + def test_perimeter_negative_side_b(self): + with self.assertRaises(ValueError): + perimeter(10, -20) + + def test_perimeter_non_integer_a(self): + with self.assertRaises(TypeError): + perimeter(234, '36') + + def test_perimeter_non_integer_b(self): + with self.assertRaises(TypeError): + perimeter("235743", 164) + + def test_perimeter_both_non_integer(self): + with self.assertRaises(TypeError): + perimeter("235743", "164") + + def test_perimeter_float_inputs_a(self): + with self.assertRaises(TypeError): + perimeter(34.5, 23) + + def test_perimeter_float_inputs_b(self): + with self.assertRaises(TypeError): + perimeter(34, 23.5) + + def test_perimeter_non_numeric_none(self): + with self.assertRaises(TypeError): + perimeter(None, 23) + + def test_perimeter_non_numeric_list(self): + with self.assertRaises(TypeError): + perimeter([34], 23) + +if __name__ == '__main__': + unittest.main() diff --git a/square.py b/square.py index 0f98724205..87e38b022e 100644 --- a/square.py +++ b/square.py @@ -1,7 +1,102 @@ +import unittest def area(a): + ''' + Возвращает площадь квадрата по длине его стороны (a) + + Параметры: + a (int): длина стороны квадрата + + Возвращаемое значение: + (int): площадь квадрата + + Примеры вызова: + area(4) 16 + area(2) 4 + ''' + if not isinstance(a, int): + raise TypeError("Сторона квадрата должна быть целым числом") + if a <= 0: + raise ValueError("Сторона квадрата должна быть больше 0") return a * a def perimeter(a): + ''' + Возвращает периметр квадрата по длине его стороны (a) + + Параметры: + a (int): длина стороны квадрата + + Возвращаемое значение: + (int): периметр квадрата + + Примеры вызова: + perimeter(4) 16 + perimeter(2) 8 + ''' + if not isinstance(a, int): + raise TypeError("Сторона квадрата должна быть целым числом") + if a <= 0: + raise ValueError("Сторона квадрата должна быть больше 0") return 4 * a + + +class SquareTests(unittest.TestCase): + # Tests for area function + def test_area_valid_small(self): + self.assertEqual(area(4), 16) + + def test_area_valid_large(self): + self.assertEqual(area(6342645421), 40229150936532267241) + + def test_area_zero_side(self): + with self.assertRaises(ValueError): + area(0) + + def test_area_negative_side(self): + with self.assertRaises(ValueError): + area(-56235552) + + def test_area_non_integer_input(self): + with self.assertRaises(TypeError): + area('4') + + def test_area_non_integer_input_2(self): + with self.assertRaises(TypeError): + area("5423529") + + def test_area_float_input(self): + with self.assertRaises(TypeError): + area(2.5) + + # Tests for perimeter function + def test_perimeter_valid_small(self): + self.assertEqual(perimeter(72), 288) + + def test_perimeter_valid_large(self): + self.assertEqual(perimeter(6346723), 25386892) + + def test_perimeter_zero_side(self): + with self.assertRaises(ValueError): + perimeter(0) + + def test_perimeter_negative_side(self): + with self.assertRaises(ValueError): + perimeter(-7542546) + + def test_perimeter_non_integer_input(self): + with self.assertRaises(TypeError): + perimeter('52384') + + def test_perimeter_non_integer_input_2(self): + with self.assertRaises(TypeError): + perimeter("72313==3?sg33473") + + def test_perimeter_float_input(self): + with self.assertRaises(TypeError): + perimeter(2.5) + + +if __name__ == '__main__': + unittest.main() diff --git a/test.py b/test.py new file mode 100644 index 0000000000..25e4793934 --- /dev/null +++ b/test.py @@ -0,0 +1,18 @@ +from circle import CircleTests +from triangle import TriangleTests +from rectangle import RectangleTests +from square import SquareTests +import unittest + + +def suite(): + suite_circle = unittest.TestLoader().loadTestsFromTestCase(CircleTests) + suite_triangle = unittest.TestLoader().loadTestsFromTestCase(TriangleTests) + suite_rectangle = unittest.TestLoader().loadTestsFromTestCase(RectangleTests) + suite_square = unittest.TestLoader().loadTestsFromTestCase(SquareTests) + + return unittest.TestSuite([suite_circle, suite_triangle, suite_rectangle, suite_square]) + + +if __name__ == '__main__': + unittest.TextTestRunner().run(suite()) \ No newline at end of file diff --git a/triangle.py b/triangle.py new file mode 100644 index 0000000000..107d9ee9b3 --- /dev/null +++ b/triangle.py @@ -0,0 +1,110 @@ +import unittest + +def area(a, h): + ''' + Возвращает площадь треугольника по длинам его высоты и стороны (a, h) + + Параметры: + a (float): длина стороны треугольника + h (float): длина высоты треугольника + + Возвращаемое значение: + (float): полученная площадь треугольника + + Примеры вызова: + area(3.0, 4.0) 6.0 + area(6.5, 7.2) 23.4 + ''' + if not isinstance(a, int) or not isinstance(h, int): + raise TypeError("Сторона и высота треугольника должны быть целыми числами") + if a <= 0 or h <= 0: + raise ValueError("Сторона и высота треугольника должны быть больше 0") + return a * h / 2 + +def perimeter(a, b, c): + ''' + Возвращает периметр треугольника по длинам его сторон (a, b, c) + + Параметры: + a (float): длина первой стороны треугольника + b (float): длина второй стороны треугольника + c (float): длина третьей стороны треугольника + + Возвращаемое значение: + (float): периметр треугольника + + Примеры вызова: + perimeter(3.0, 4.0, 5.0) 12.0 + perimeter(6.5, 7.2, 8.3) 22.0 + ''' + if not isinstance(a, int) or not isinstance(b, int) or not isinstance(c, int): + raise TypeError("Стороны треугольника должны быть целыми числами") + if a <= 0 or b <= 0 or c <= 0: + raise ValueError("Стороны треугольника должны быть больше 0") + return a + b + c + +class TriangleTests(unittest.TestCase): + # Tests for area function + def test_area_valid_small(self): + self.assertAlmostEqual(area(2, 4), 4.0, places=2) + + def test_area_valid_large(self): + self.assertAlmostEqual(area(999221, 214531), 107181940175.5, places=2) + + def test_area_zero_side(self): + with self.assertRaises(ValueError): + area(0, 1) + + def test_area_negative_height(self): + with self.assertRaises(ValueError): + area(223, -3214234) + + def test_area_non_integer_side(self): + with self.assertRaises(TypeError): + area('1', 23) + + def test_area_non_integer_height(self): + with self.assertRaises(TypeError): + area(3324, "321") + + def test_area_float_inputs(self): + with self.assertRaises(TypeError): + area(5.5, 10) + + # Tests for perimeter function + def test_perimeter_valid_small(self): + self.assertEqual(perimeter(4, 34, 23), 61) + + def test_perimeter_valid_large(self): + self.assertEqual(perimeter(234, 23, 4325235), 4325492) + + def test_perimeter_zero_side(self): + with self.assertRaises(ValueError): + perimeter(0, 324, 4) + + def test_perimeter_negative_side(self): + with self.assertRaises(ValueError): + perimeter(432, 43, -4234234) + + def test_perimeter_non_integer_side(self): + with self.assertRaises(TypeError): + perimeter(234, 4, '5') + + def test_perimeter_non_integer_side2(self): + with self.assertRaises(TypeError): + perimeter(65, "2343", 164) + + def test_perimeter_float_inputs(self): + with self.assertRaises(TypeError): + perimeter(10.0, 20, 30) + + # Additional tests for triangle inequality (optional) + def test_triangle_inequality_violation(self): + # Although not implemented in the perimeter function, + # it's a logical test to ensure triangle validity + # This will pass since perimeter doesn't check it + self.assertEqual(perimeter(1, 2, 3), 6) + # To enforce triangle inequality, you would need to modify the perimeter function + +if __name__ == '__main__': + unittest.main() From 464370deec07b661591f8d5302b824284ad12285 Mon Sep 17 00:00:00 2001 From: Pogosian Tigran Date: Fri, 29 Nov 2024 09:50:58 +0300 Subject: [PATCH 2/2] efd --- docs/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 docs/README.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000000..63f8727939 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,10 @@ +# Math formulas +## Area +- Circle: S = πR² +- Rectangle: S = ab +- Square: S = a² + +## Perimeter +- Circle: P = 2πR +- Rectangle: P = 2a + 2b +- Square: P = 4a \ No newline at end of file