From 81e487649aab8237d1a7aafbcec6ca5b9490b44d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Koivisto=20Ida=20Maria=20Hannuntyt=C3=A4r?=
 <ida.m.koivisto@student.jyu.fi>
Date: Wed, 26 Mar 2025 11:19:26 +0200
Subject: [PATCH] =?UTF-8?q?henkilotiedot=20saadaan=20luettua=20ja=20testej?=
 =?UTF-8?q?=C3=A4=20lis=C3=A4tty,=20tunnusNro=20ei=20toimi=20oikein?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 kerho/bin/RalliJava/Henkilo.class             | Bin 4468 -> 5322 bytes
 kerho/bin/RalliJava/Henkilot.class            | Bin 3503 -> 4445 bytes
 kerho/bin/RalliJava/Ralli.class               | Bin 3578 -> 3578 bytes
 kerho/bin/RalliJava/Rallit.class              | Bin 2645 -> 2645 bytes
 kerho/bin/RalliJava/Rekisteri.class           | Bin 3796 -> 3794 bytes
 kerho/bin/RalliJava/SailoException.class      | Bin 417 -> 417 bytes
 kerho/bin/RalliJava/test/HenkiloTest.class    | Bin 0 -> 2562 bytes
 kerho/bin/RalliJava/test/HenkilotTest.class   | Bin 0 -> 1891 bytes
 kerho/bin/application/Main.class              | Bin 2893 -> 2893 bytes
 kerho/bin/application/RalliController.class   | Bin 6216 -> 6212 bytes
 .../application/UudenlisaysController.class   | Bin 885 -> 885 bytes
 kerho/kerho/nimet.dat                         |   4 +-
 kerho/src/RalliJava/Henkilo.java              |  96 +++++++++++++++++-
 kerho/src/RalliJava/Henkilot.java             |  56 +++++++++-
 kerho/src/RalliJava/Rekisteri.java            |   3 +
 kerho/src/RalliJava/test/HenkiloTest.java     |  67 ++++++++++++
 kerho/src/RalliJava/test/HenkilotTest.java    |  44 ++++++++
 17 files changed, 261 insertions(+), 9 deletions(-)
 create mode 100644 kerho/bin/RalliJava/test/HenkiloTest.class
 create mode 100644 kerho/bin/RalliJava/test/HenkilotTest.class
 create mode 100644 kerho/src/RalliJava/test/HenkiloTest.java
 create mode 100644 kerho/src/RalliJava/test/HenkilotTest.java

diff --git a/kerho/bin/RalliJava/Henkilo.class b/kerho/bin/RalliJava/Henkilo.class
index dceb3beb503b8531c32b6e785c535ded2a34928b..075e1ad374b89ab47b3251c0a0ddeefee73d482c 100644
GIT binary patch
literal 5322
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
Dp<K~B

literal 4468
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
bcvFqPQsb}H_#6C=67od&d;Af9!iIkXOe*tt

diff --git a/kerho/bin/RalliJava/Henkilot.class b/kerho/bin/RalliJava/Henkilot.class
index 4aa4aef19a48b842e56e094154c23f78445581a2..75edad3a3371181932eeee1c4f7d3166892c2a67 100644
GIT binary patch
delta 1974
zcmYjS`%_d^9RD1+ckgxCRUWhA1tol-;G(3KPD?hU4kiXTqYk>5<`u7SWm$B0G3?=5
znU-m&w<joSVymVpJ{AL$P}4Gd*lYTs{t?HCK4-;=x%ZyO_jNw!`~94A&*%R$$$j_V
zzUu(y;m;m-NQn!K4z*e<ZEIsoG{)D=MjA>rY!b-YY;H5lT4Q#oY(>2p4qFiojRLtT
zvE5R(*bZ5h;VrGP6|snAHoMV)%^rBrMAzb~kyhm;wQg8wmfEnuxc{~B5dns+ws^1=
z3k3AA)fTI=!<LSy0NgOq>cKX=Ea0-XwwfVIeZ!GLX1Jkj*@n$leXP8sPMU7_;1#?|
z)A~j;vLGg)6jzokaw7+svf1H598&}~sawoQ)N(`M4G;1$UgCVqgI#!AKx;IkH3T7$
zUM!<pSelJ=lnQub!wC!5*v+;;n$2zHJlgZfgp~`3sD}N{cBR;>pxuKRI3QtHI)!OI
zvCp}sOq-zNBLTI^iZr%J9G`elk13<jfx{X)oif!|cLZyR!HPuOD8Nw<j>-JE8?0Eh
z6^)t=gr9@YJUD?R6i2KkI~ubhEw&V&^x$)N1x9T%SzNO*)FLCF^58|R)p5pIs?PPQ
zXqTqvJopmlo&9Q2sg53j>?+%CGR;CW)MU5VF|#o6q{Mg0gJPLF#f&tt1Ub%qB`1^R
zYP7;lcBqBfO0(LWC9Vn1OjlmIhAU2^Yqo0;H#OXFj=B8emUGY5Rq>6EI|3P^ENnMh
zv6&mqn2zrW|1lK{g^nKt@+$1YC_#{<u~@5F_&D*V)c@$TYg5F}&Sh<q@~c3RbKh0u
z((t=L0fz<7Wc?|jIji+~-U2Ad#V9<1EEGD2^^o@&j70#2D93a>>-a`JoLGU;Sd1bp
zfghEagQb|yaV4s-1J!89GH15?T%5Jx37Nnnq%au;^nn<J%GkhFe;+mi)%_?5miD5o
zMg$ZQQ2Sv8`_T}b(F?m5p@1ua`GzZrmVjnxw=pX_VrWUkIxx-9(vxV*EI$U?82!iz
z_TsgGZs^kB_34J5jAN&CeY0a|&~V*GrJU?eU_n5UQ#~~`l!1V1D0kpC)PRyemZ2Ex
zNzT|MQ6<$%KMI1Seb@u^V$whlX*~@gZ09D%;vGIfCK7yVsmbMRF1&1O5!bMasvynl
zn7K8WMJCl?Ev4)Dtmppg7-$1dlf}K*gmH9R4xQ~)7|3HUN2?iu2Mj%2D#(0h;uQVX
zq+qPWyVwgCBhSHm)XEjTtjknJIUQueU*a+f0RS(+Jwz0m2BE=By(Jo|Q?CU)#AM1I
zz_*f;2gq2+&g&iGddf%->0CR;`P)5R>~^$_$vl_-jPd?`!TdhFFB5cdVESeF@@HS*
zl8@3cnmurU_t`=2>5vo2D2X3}!#$A?X}Q#D)DQGSu!0{{`LjPv;^PEHS6{@ZrAc%p
zv2eJ$BulEwHIJ*UP=9<Co9-EMz^2<!<Vd#NekykQDctFo^PLxw$Ue<z>2u?10!4lw
zD;x;8DE6t!`aXOCP-{p*5@&a*!l(L^s5n0KR|4LEN;ugUXpjPUF@emKNYX??l(f*f
zqb%}#IXcnB{uD2X9`=v&5W#rvvx8Pg;xz0+HjYwsf`_CVr8tSF$)Nz9o+BX^;S8Q9
zqH3IFxbrOQ1(K(SWVwXRxPmQ&+QxM6Awk+X??gYZx@+_v<f1odbraWdCq=1E{2?&G
zxJ)~6`Ci16tORc@DtZ|pjSxEV6<Ndo87tGrQ99x5WzealPcvqcuP&b4HWFO2%f-cX
zlItpEmyj_$k~CWieTYd&({PQvk#s2_?^b|!jTC6e;X8&O|5Fo(=&DlTtn=nA`kLNp
l1U<lBuJA40Z>QStMvU*K#`jX~Pxytl@}j+u-|z>F{{Yiry8-|J

delta 1039
zcmXYw{clrM7{@<n?d|RDZkukix~^<?K)10nCliM2Vxky~MDQ1gVJeX8cGs15>uAeh
z3Jzg&pyHIH6G5lQ%Y2D1ASua~=+7Dxe^nCy6XSetS?;~h^PKN_&iDDA=bZb`#vc=*
z-~U_r1$dV4ZifnfpUH^6Z*+z07`5pktB7^&(aE})8rG>m=aCRiL_ITMQzWbimE3%;
zTyaaqoChDXDS5Cp<&-OqGgc^uP*iLZY_OQ(q{#_I^r$oC^cI|nZ14VQSv+p@Du;r+
zuKx=3hkcBCRHtp;WJV{<)B$hhTQ+Aor0}_=Qjl3i<KA2@?>I@Pkk1u!6(^Z_JjmM$
zBkz{RYGu#cbg?-^8}Hb>%QK=j>sI!;<+77?^=oFg{=sb43udcq`=b8M><e7xipi&1
z1=H%P?g=iXJ_)j<s8_ucxpBAh*oadJ@}=+`$hjlMa;2D5LB7&aYqPqccUT+MvOZ{a
z`@d1N=~t{aeZ$(W0{U-jXE=eMhp^Z{1FgC>R0yYdm=2P3(oL6M4E@`_jR<|D*iM=q
zJV8HCNxX+Ar4a)xFsOg7|6UJ7I@QbCiEMg)Sn?r@k2>+~iL2Ci-=!gOorYD0hY~Be
zaF4NH1&t;8ev%{~kBE(khY@T^Xkk?U5!o`6<EWgJ5UM|g&XoCEtEi!S<oB-9B)+h3
z-M_f*Gybhr#^syr5ij3l+%JJ=Ces3!(}I=L-ne{+<Bii*cKP~^Wj3W_MwLt^AZW~3
z;SH$Huq*D3tDKrORLn?M*?n#8{xac=afdUF=VWoZajwezGSM0o7mf>p-WIuoayRDW
zoEP|*%i<qwbCkGjV}c-)L^(#Y+|70>(&6K5kt@~13AS-k`aI3dAg6em)9jXJzrY#x
z3*`{!aF`W}IY~b&&w1v#AZ0E}q4&8W(M_}vBNy26dd7P)hm>5B`4;JDltszv5RuJ-
zd?1leM9lG_M1EdkD~AbSJST->qO3y(^RoO1moTJ2{d&|Xqyq%jL{q>-n<$f}2d{!h
u*Cf#p{8B^9&W|LuPV_B`Z;=|GiHgr__KTXmR<qYdIe35PExzVk;{OBnaoS-3

diff --git a/kerho/bin/RalliJava/Ralli.class b/kerho/bin/RalliJava/Ralli.class
index d00ee8801a7c6a95ab2a078af392af1c2060eb2b..0fc36168a0b480ec791a2e1cd74b49c0910e1254 100644
GIT binary patch
delta 17
Zcmew*{Y#qT)W2Q(7#JALH*$R91prGI2VwvK

delta 17
Zcmew*{Y#qT)W2Q(7#J9wH*$R91prG^2W|iW

diff --git a/kerho/bin/RalliJava/Rallit.class b/kerho/bin/RalliJava/Rallit.class
index ada51a5827284973604ea60f607fb2ef501aed01..7285af94649461203393c4eb58d48e09ff02056c 100644
GIT binary patch
delta 17
ZcmcaAa#e)m)W2Q(7#JALH*)xL0RTi;24VmJ

delta 17
ZcmcaAa#e)m)W2Q(7#J9wH*)xL0RTjl25tZV

diff --git a/kerho/bin/RalliJava/Rekisteri.class b/kerho/bin/RalliJava/Rekisteri.class
index f50f040b8d1c22eee72461074bed396d551ddc7b..129c925b531495b15dc3a1284d45aa2c3ee93dcc 100644
GIT binary patch
delta 1242
zcmYL|T~JhI7{`Av?Cv>x_CO3uaU=**gawQyj7C6c#$wVzv6ztpNf%sUZTZ{<AqB!n
zD-l25KGcfBOsuR#>m*z>UN$w;MPuG};bq=6-A2z@nQ6|<^FAN{=Y9Uqy#I42|Mz_B
zmw%Uk0-j-c(V9<J`TAOV<MTT$T6o#!71|V`kw_vLiM$kv$72d#>Gtp*3q?hc4)z(m
zs>nJN8HrTJBYoYKEn|sfwAW@o5nbndJkVuxfT%v;D^cBg##h}C<28driZ!X8Sbyd2
zp;%wCB{>w0NL!pI6~=&<iuZX_`fQ%2I$IbH*bFkHmA^XN<yD4l>ew3MFk=Rzip<o7
z!^v2@vMH8G+PuyYz2CpFaGXhl2}Sn*fbGfXP$bzuWb+17`ij4#alj(RTQ<i%0{#?%
z5aYaU^A7I{rJhJ)S9CO~NG}bydE;kn9wk4UG^BL{r)|z~_U4*Ep;B6JHmU+&^0mQN
zy4MJ&4{}XkFy?$$O}^8$rW0ILq^Uxao4Ug+^SO#*J!cdL3~nh3#4XTw%xH#<k4zqt
zZymO73^u5T_3_{ie<3DCdfa+M-w#&#!xELHqFQUK|0#*8B-){BQ@KB_di9(x2vr4N
z6sj4Z+I3r~cx`KiOY<g|rdBb{j?eS-nNa;?s}pe9BUS*<y0kh*Dl`P<h2@UlrM=t(
ziIrNr<G;aPmrf_JdKwQ-vDpV*deW=S1)}9Srb};4P_jAZGW{SW#|vE&<xbEgSz|fY
z(j+5_8he2f$6n&7;x;WcA%Qs|mt)Jk=`~I}UdEd#m=lVND}PLzD#t8$IXS;_-aD$z
z)k&vPlNQL_DGAwWR^~3s`<bdqHOs^K$Q5zjph9db<|OT8u~(8E6tRzuqU16nRMJTm
zU2G9K*K?3<bn^l|?4noN`UKT40vZrI$S6Zhkl+MKPBF{}qS22fdx<fwa)j#~<(7!+
zHk16!6u)tdyRz9mrkVUpB>1;TF2qTd$BbGp{wAi>7G_lgr&SYY)o#wIHo4Xj&a)yB
zc~s7!B{EeD?~y0_WvM#eCoGSit2PTZOgcrXoDaqG3FUt{&lC8C_<b&j7ZCdQxY#MK
z!LPDW4Yi`By8<nhmY|TT;Un3@5^A}8BDjzc%3#jJ2_=h9`Ao*m3k_QcJiuR){O6LH
zAh05f1`RIjip<B<W!;pSmvvZXjl=pC=~ykT+g3oDpbWV}8EmkG_ZM<O8dq45bFIYR
XNbTE{y`Hi+_+BdBU-<(+vV`*=NN5y;

delta 1218
zcmYL{TTql`7{`Avd-%Tn_G2T2iBCn=1UYHQFm2<eB-7-CAvU80B8sbEENmQ>h0u)k
zlxP`LuNB#mis+ywSYJU?(@fJ$Q#T!Nx@xAIF1qNZyNaG&nd#zt-v4uYpa1i{{~wBf
zDz?7)cky%JZa$r}raj8imp$9_T5Osrw%E;Hn>P08e>|)G2RLZZp-a4lo*0Mp9o}30
zoi<$@(H-7$)vd?9kw6a#gI>i7-QZoZ&gNk@DU5++yf2mLvrzQg+)gB4CJx#p8Pb1y
zBbA+*%!thvwgwsHn88s+s3$fOs~Jwk6E#iop_I*|9M}7N>%(K5Fi0!%|1W4vbtPk|
z{-n)GPU&f1`SwAJ9?sf~X9)PR1cHol-sTCO6iVH(q2{j9l)_U{*_Ijql+9|2^T|P4
zOL^Mn8J@i!@`shWsB4Tm|9f0EcwcuLl}3^)im3|yy-}pE8K>62YjRCdaBo*%Z#?m(
z8y<+odt*aGv1nMC%qwzK*yKaqYF2qaR+Q;EbB$Hn)ZgDbJYcY(ubO9bExg#=L@q0_
zbVJ}SRiIA>cKFs{Qlh^TR4%AO&@DP*ZS`#uuQuyVT6Jo37X4z?s|M`^>jKTPMlPsU
z{Xnqn<_#{pHo7#)x6APg&=bM>bgSccd9cOtOM072t7BwcL#i@vwc~SXug(;Sm0Y{y
zn`ghvVaLCG8aGa{`473oJrQ%3uIfV5r7s$gXrZ~t07%NoxGt$`C*U$1wH#|9%_EAa
zJxjS`FYuV+3wB3?Qsx9*PA_sM)A+cPiDYI<%{j%TrJv83s?e-<xiGynl{q5j@}!CE
zq*+2cB_KOZ%G^15SW`8sCV5dWMWVWSHi+GWnWmLI_DZmgwX{>lekwV@MmnhFAQ58R
z$zit9$vvX-`$SKB=#{DjM?}{N`WU8PR5>7A2Srv%G$~$`=xdBHBSOByQ9j}rpK+Y8
zM19|q=0{HOtH?C{JE!@RaZ$)QRm6D}7F@-ciike9a6vUPp>{H<TI5<sI8PADyr_5=
z#WU6YJjW{8FHdded7+*|k*ehdK_1qs3Z?{kh4NoQ={9^q{0}Y(@(canc<GQpgRf<a
zsO)J9uNEq#B_O1tyv!?DLam5br7kFha%C&26G|4ZGcDuZ5E`}+xKaP6#NU$082%+$
zG+;2Jt3oAeM(+r%${UqgW3X;XI+jx_^<>CbKV!%Z%AnK|+HXsL4zs)?XMy-vCHFzr
T&SmX&`J2cbCDQnWMV$Wt{h$y9

diff --git a/kerho/bin/RalliJava/SailoException.class b/kerho/bin/RalliJava/SailoException.class
index 0bdb65f2b5fe49194423f15a4f4c27615f3df2a4..81ebc6b05318672c5e1f228aae3dbadd050095b1 100644
GIT binary patch
delta 17
ZcmZ3;ypWmW)W2Q(7#JALH*(Bm1OPl~1{(kX

delta 17
ZcmZ3;ypWmW)W2Q(7#J9wH*(Bm1OPmx1}6Xj

diff --git a/kerho/bin/RalliJava/test/HenkiloTest.class b/kerho/bin/RalliJava/test/HenkiloTest.class
new file mode 100644
index 0000000000000000000000000000000000000000..1a7a07ad49856e879a24c606d1fb2ee6be817dbc
GIT binary patch
literal 2562
zcmaJ?ZBr9h6n<_J%o10D$V;`Tu_6MZApzwj;2RYM16rV1wTer!k|mqnxVxdXrR^s_
z^dEHkx!*heqKuvCbf(|>n>w97cXuJF1~ZerFX!BIp7We@&;9$~w|@W_#}9Et1Wqh#
zrfDo_+gjSwT`zq{x5|cTuW}woOrU*BicHPgOyAqs(hHuzp=rZ1ysHAyfx$I_*sNXD
z6NsW!MGFoIwB-#;U#e9$bZ1rDFm-`s-Y#h7n&udC9d5?FlHm&U<_|`YqkoBNSuY!|
zr#rSWniV*{T(dl*qOTdQL31}O%l0(Suq|3^&)d#sdaFi&X&FN<j-)_G-9;E*0v%{o
z&?V44=h&60RJflqiG3<HIwlo*RD6Wv0-c+>7s{>Gnq}48CCB!|pHJXpoQ$KFp6iZp
zxUTMaDo)|FfU5bcTQ6#wNq{{A`8uO3o?}>>xrK$nHR<n+ich4!gtH&7g1!SFj*SQ?
zr65}wfnyCchFHnoo&s5mmOQG7d4I<BQAzA=-CHs$MrJ%C{a;jZNha{{w&r@8c9)gG
z#CBjrMFu<)Cl6Acj0_CEABKW4(%_#;E!*3gRn?upeo5d8CgK>U=-t3oOk#>=E1Fj*
z=_IGC2|0t0k}TJ06*FMT^;ER7K5JVA&3j;YCC-S{@_2Tl$=UZYHi0cucwNN}++;03
z*9`Lj94z&C$TvA$H`irdzZ()ckFGlu9a-_TLU~cEhSlCC>0Y&ijAte;D_CICvO9I6
zc6{b`B;k1#ixN&tRdZZj!951vtV}Z#6A65Vl{l7J<aI1JZQIl}OT{WaC+cm@tm*fj
zvycWJH4+f2<)q68D!!08R=g0S%-bUsk7b4uB-!y?$+%?ei7f4>0+S!6Jm?p>29ClV
z*)>$j$9)-IHZ!6?J0QYrX0(Orm%oStwvwhiWHVz)2yDtCDarKBH-;JBG6h=)9-kD5
zl-Sx5D|XE(=yQhbTJ7OIl6~ZoB$r#H%yT_Qt1jwZ$u7DHRN=(&LZGiszhQ0LWj!7E
z4T^P6D|oi^QUYYH{?tfZs2v!*qgh2$cl+|TU9MFdxeKFcVDo<mS6^23ChCtH^!M0r
z*a}U|@}{pCo}Ozv1Y5zjK(=YQjgO^@w(h3ba8v%Jok~3xPf}-Q<e=bd_7}m_&Rdr5
z%$l<Cxp90eaPB>BnnfGOcLJwAtjgCXpay4{@TgxHEu8V;;Wy58nxo*@GV}(@Z?bNX
z;8%))qd3g38Ypl)!WCN~r4h7+TJ0RAp<iiK*51tT=y>>s4K~@?df_#?U+v-q$JB#x
ze{onYq~t1R-B)7Cvt6-R@zqJGSO?ILRvPPuf*u^>yTX?RDV)GLUZ^4TVgx5K&3h#Q
zjs=cGfC?^CtDitq)H%;tgeQ(+0E1*;gh32(7Nh(^(?EWtevDSn?*&4v!~CZglcP(+
z7hmJ@&p0xC@hx(|F0M()QJ=G<f9xC~_Y;bAJmA9{3e4@pJB?W%UI)7HDQ?kSCz6=s
zEQ;H-ra=6I{y4jgz@4TLi?kS_X5T)<<os*gO)kZDai37v<nkfsyZEwBX@D<H`y<R@
z24|7=@pT8b_VM+G_ypFQdjFGj%Tjv!j`wGs*pPXZiA)xoK%p?m{LF>k_ReQ-@f;v*
ze>-W&t=O|ydlu@rhkSM?iF=B;b1Z;qMli!PU**m<a&{egK1fe+(~l<=pxcjUEsSRh
leJC^a5z0;CkDvmJ<5A8$a$WPkU*RS95?p_S9ej`D{{ePaQd<B3

literal 0
HcmV?d00001

diff --git a/kerho/bin/RalliJava/test/HenkilotTest.class b/kerho/bin/RalliJava/test/HenkilotTest.class
new file mode 100644
index 0000000000000000000000000000000000000000..0888dfd61eb1043330212aff258d450c7cea1d2b
GIT binary patch
literal 1891
zcmaJ>-BTM?6#reaVV96vNYf@jY1dL}LPA6NC?%;?+JYrrKpPC!FWe;Cu#oIxcB8yI
z&UD7{$-kfvj?aA%7~4AIjQZf{zob2Pvzw%aHIvzU&OIOZcYf#G``5p}{0d+mnus2T
zkq2t6rsvhK)QqiJcIKXD?CLes-XKMUz%a1GZ8g=XX4XqPTG?jky{Q|zeTyNGNER7{
zJ7z@-A%MOxg6L&9t>}if)~uJb#)ev|X$%p?EUUGm+R(Y~ZVL9cZZV81{{tb%(9dxx
zx}~Z!3k;#9{j#=a>!x9e7-Wcdf(t4EZ<`s09yASGuWLo!(&^Mi!!T{tiKMC&vr*0L
zG^vgZFEuCPEWzv~^LPj$iarr>hQVXT5Mt<)Fv1X9ZkY9~>;=g+A|NZz&hY5bFfQOC
zu~yY=Ww-9Iwi3dd7!z@ckaU17T9($Z!?=ubhOp{rOJ6qC8nF~hD4j+W?1pYsbNPI-
z$WM4Hj0BPl!5U|Y;asANQWsM$S(K3SMLH{C($_c_q=DhT9tqccy{>y+0SR-yUh^FA
zd>A)C%@kC_aPY1qPe9B$%5gSsGAx`>eitFF$;=(!;Z@V1`t;|9gm-<73leVo8Rw=X
z++~>c8lIKsrsTVNMWzvx?d^v7wY*|fwEgv_z5eL7*)%FvdoX!f%VE5Sdqlt^npuXk
zCsfB<n};IeKEqh2^}cDtSj8IM51O)7&9c-gUAt%^*+q#vH4@(UE$f=sLqWoZuh+Ea
z6_oH1L$Zs7nb%l&^-hK`0EI!?b{`o+c)ag6-FeT0rtQpek1mI4x=vf#7Q=W~p}rhZ
z;BZ&ESHY3-RKZruyQ}J+`$B~ZX0uV&mUaGy4SHqr_u?w=2sM(9Z`}-%=<TDgNP31=
zMr&~55YkhAaS);}Hv?~=pT6Oi1Ffe>W3<~#sZNtDkT!q_N!<Sot(1~Iq4b>gf1V-w
z@DS&eXNb`{wCb*Fk>S470nUGW1UZ#Hz?H~EsI5<OJsri>_KxE*6~(l-6PZn?0tdK$
zgly#P$&}!V@1#>fS6ob|dR_6(5te>Je^wYGzm?6_dFxSp;ALy=6r%XBz2jim><)am
z`ILy+$76g)lYWTb@H-VAaHz^V1jHd>2yqN!3?rDqc`RWRoAjQRa1nLL6nzQbko7S=
z6F*=aKjI2yO5iz?ly3rmBjwP2i^wGMT)HLvfsgTtL-Y%Liq8l~96#f8k^=aie7Eog
nHR4Z4Qb{UN^aTk25mZ406A={=qdyn(;+}{B+C`bXdQf=@t)<Vi

literal 0
HcmV?d00001

diff --git a/kerho/bin/application/Main.class b/kerho/bin/application/Main.class
index 3e51077fe58f2e490b5c78d8e648ab216863e9a7..9b57e137721be5b392c06e464365e1f04d3955c8 100644
GIT binary patch
delta 17
ZcmX>rc2<nz)W2Q(7#JALH*&ag0{}yX22TJ0

delta 17
ZcmX>rc2<nz)W2Q(7#J9wH*&ag0{}z823r6C

diff --git a/kerho/bin/application/RalliController.class b/kerho/bin/application/RalliController.class
index 5ae638ca7e31336f6d258077af71425512a5fe76..1b3c72ecc35719929000e55f864b68dff6c3bec3 100644
GIT binary patch
delta 356
zcmX9(yG{a86r5Rz3zuD%m%Ln%mja6kXk%hyXJw%_#%ST%kx;4e1N;CBZ*Omb1|g8B
zp|UVG78VvZet;4iiIsYd&75;)Cg+^FZ`?J+!}s+Nz#`{5B4Y5ln=u4S7zv!xXV8yF
zB5>p$9J=m?+iEohju|lUNkgug+Y=GSbVg;zEPEyymoMfk!}2zmPA3J(DT5})md<nt
zW5H?Wb>`$pu*QP4tut@d#~C@a>a56-<#-(;EAv*iyA)cUh_|7^qh4FML33+>x7Au7
z@0;=@UfByH1sh*V&MQL!K80<C7cg;&Fs_u|MFu@o(Z@Un$^+#7*P)1#ntX7mAqFa+
zK@Yv^+_~bT(0*XcWMbW~J3Z{w`V?|Mu}f1vC06P|WzlFcq-sQU33!;I%?yhwaEY^u
M|BGH`l{KV(0f=lsQ~&?~

delta 392
zcmX9)y)Q#?6g{V{zSrmXK2+OR>Z7f%*Ot6iVlo&c5<$cw5eBV@5HX2=z-H`k@h?bx
zgf?xEm<(dEvDy(6G2thcbMHOp<ldWeTf8e8_up4H046zdZbSu>wQgb1rY7)?Cj(VR
z1Pxg-V__liK~v6{%i(s$HOAzzITTFLm5=80Sd@r+vs>l8vcFy4+3@EpTkC7P<GDqL
z9R|oQK?|R@#*~9kgK1_pX5@=iXz3#kJ(;nRRcl(#*_zz9M?<|j2j!*hhjPS#oUq)g
zWrZ~sh@SsRtBpAm;rKBE2&(@}*VtTY;&ryrz?(cscohdpr0}KGjMB5v6`m+Og}@mc
zTqwPUF4W<nfg+m91El}Ap%49P(vf2TF;MvggAA!_M~ZJp;0Gxga~C3dzK)ebgROGM
oU8N--+$rBymH-{LsTx&X5<zydn?3ATNepmE@qd|k%ySqWzYi-#UH||9

diff --git a/kerho/bin/application/UudenlisaysController.class b/kerho/bin/application/UudenlisaysController.class
index 9034e7dc1912c0fc3e068ecee7617713649d0899..2ab50a320567f86e543525885bf56c5dd6b2dd53 100644
GIT binary patch
delta 17
Zcmey$_LYs})W2Q(7#JALH*(}M0{}+t2A==`

delta 17
Zcmey$_LYs})W2Q(7#J9wH*(}M0{}-U2CD!7

diff --git a/kerho/kerho/nimet.dat b/kerho/kerho/nimet.dat
index ce1596a..8b13789 100644
--- a/kerho/kerho/nimet.dat
+++ b/kerho/kerho/nimet.dat
@@ -1,3 +1 @@
-0|Rovanperä|Oskari|18|Keuruu|Kuopion nopeet|59|41|
-1|Sokka|Oskari|54|Rovaniemi|Rovaniemen nopeet shamaanit|83|17|
-2|Rovanperä|Teemu|59|Seinäjoki|Kuopion nopeet|99|76|
+
diff --git a/kerho/src/RalliJava/Henkilo.java b/kerho/src/RalliJava/Henkilo.java
index ba68560..39e6ff9 100644
--- a/kerho/src/RalliJava/Henkilo.java
+++ b/kerho/src/RalliJava/Henkilo.java
@@ -3,6 +3,8 @@ package RalliJava;
 import java.io.PrintStream;
 import java.util.Random;
 
+import fi.jyu.mit.ohj2.Mjonot;
+
 /**
  * @author idamk
  * @version 12.2.2025
@@ -11,7 +13,7 @@ import java.util.Random;
  */
 public class Henkilo {
     
-    private int     henkilonTunnusNro       = 0;
+    private int     henkilonTunnusNro;
     private String  etunimi            = "";
     private String  sukunimi        = "";
     private int     ika             = 0;
@@ -20,15 +22,28 @@ public class Henkilo {
     private String  seura           = "";
     private String  kotipaikkakunta = "";
     
-    private static int seuraavaNro = 0;
+    private static int seuraavaNro = 1;
     
     
     /**
-     * 
+     * Antaa henkilölle identifioivan tunnusnumeron
+     * @return uusi tunnusnumero
+     * @example
+     * <pre name="test">
+     * Henkilo henkilo1 = new Henkilo();
+     * henkilo1.getHenkilonTunnusNro()===0;
+     * henkilo1.rekisteroi();
+     * Henkilo henkilo2 = new Henkilo();
+     * henkilo2.rekisteroi();
+     * int ht1 = henkilo1.getHenkilonTunnusNro();
+     * int ht2 = henkilo2.getHenkilonTunnusNro();
+     * ht1 === ht2-1;
+     * </pre>
      */
-    public void rekisteroi() {
+    public int rekisteroi() {
         henkilonTunnusNro = seuraavaNro;
         seuraavaNro++;
+        return henkilonTunnusNro;
     }
     
     
@@ -74,6 +89,23 @@ public class Henkilo {
         henkilo.tulosta(System.out);
     }
     
+    /**
+     * selkeä tulostus
+     */
+    public void vastaaKalle() {
+        
+        etunimi = "Kalle";
+        sukunimi = "Rovanperä";
+        ika = 25;
+        kotipaikkakunta = "Jyväskylä";
+        seura = "Toyota Gazoo Racing WRT";
+        rallienMaara = 24;
+        voitetutRallit = 24;
+        
+        Henkilo henkilo = new Henkilo(henkilonTunnusNro, etunimi, sukunimi, ika, kotipaikkakunta, seura, rallienMaara, voitetutRallit);
+        henkilo.tulosta(System.out);
+    }
+    
     
     /**
      * @return tunnusnro
@@ -82,6 +114,16 @@ public class Henkilo {
         return henkilonTunnusNro;
     }
     
+    
+    /**
+     * @param numero numero
+     */
+    public void setHenkilonTunnusNro(int numero) {
+        henkilonTunnusNro = numero;
+        // jos tunnusnumero on varattu, seuraavaa numeroa kasvatetaan yhtä suuremmaksi kuin hlon tunnusnro
+        if (henkilonTunnusNro >= seuraavaNro) seuraavaNro = henkilonTunnusNro + 1;
+    }
+    
     /**
      * Alustaa henkilön
      */
@@ -125,11 +167,27 @@ public class Henkilo {
     
     /**
      * @return henkilön nimi
+     * @example
+     * <pre name="test">
+     *  Henkilo henkilo = new Henkilo();
+     *  henkilo.vastaaKalle();
+     *  henkilo.getNimi() =R= "Kalle Rovanperä";
      */
     public String getNimi() {
         return this.etunimi + " " + this.sukunimi;
     }
     
+    
+    /*
+     * Palauttaa tiedot tiedostoon tallennettavana merkkijonona
+     * @return henkilon tiedot merkkijonona
+     * @example 
+     * <pre name="test">
+     * Henkilo henkilo = new Henkilo();
+     * henkilo.parse("2|Rovanperä|Kalle|");
+     * henkilo.toString().startsWith("2|Rovanperä|Kalle|") === true;
+     * </pre>
+     */
     @Override
     public String toString() {
         return "" + 
@@ -143,6 +201,36 @@ public class Henkilo {
                 voitetutRallit          + "|";
     }
     
+    
+    /**
+     * Pilkkoo henkilötiedot osiin merkkijonosta
+     * Mukana myös setHenkilonTunnusNro() mikä pitää huolen henkilön tunnusnumerosta
+     * @param rivi rivi joka pilkotaan osiin
+     * @example
+     * <pre name="test">
+     * Henkilo henkilo = new Henkilo();
+     * henkilo.parse("2|Rovanperä|Kalle|");
+     * henkilo.getHenkilonTunnusNro()===2;
+     * henkilo.toString().startsWith("2|Rovanperä|Kalle|")===true;
+     * henkilo.rekisteroi();
+     * int ht = henkilo.getHenkilonTunnusNro();
+     * henkilo.parse(""+(ht+20));
+     * henkilo.rekisteroi();
+     * henkilo.getHenkilonTunnusNro() === ht+20+1;
+     * </pre>
+     */
+    public void parse(String rivi) {
+        StringBuffer sb = new StringBuffer(rivi);
+        setHenkilonTunnusNro(Mjonot.erota(sb, '|', getHenkilonTunnusNro())); // seuraavan numeron käsittely
+        sukunimi = Mjonot.erota(sb, '|', sukunimi);
+        etunimi = Mjonot.erota(sb, '|', etunimi);
+        ika = Mjonot.erota(sb, '|', ika);
+        kotipaikkakunta = Mjonot.erota(sb, '|', kotipaikkakunta);
+        seura = Mjonot.erota(sb, '|', seura);
+        rallienMaara = Mjonot.erota(sb, '|', rallienMaara);
+        voitetutRallit = Mjonot.erota(sb, '|', voitetutRallit);
+    }
+    
     /**
      * @param args ei käytössä
      */
diff --git a/kerho/src/RalliJava/Henkilot.java b/kerho/src/RalliJava/Henkilot.java
index 1471cdc..1b0e429 100644
--- a/kerho/src/RalliJava/Henkilot.java
+++ b/kerho/src/RalliJava/Henkilot.java
@@ -3,7 +3,10 @@ package RalliJava;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
+import java.io.FileInputStream;
 import java.io.PrintStream;
+import java.util.Scanner;
+//import fi.jyu.mit.ohj2.Mjonot;
 
 //import java.util.ArrayList;
 //import java.util.List;
@@ -32,6 +35,23 @@ public class Henkilot {
     /**
      * @param henkilo lisättävä henkilö
      * @throws SailoException säilö
+     * @example
+     * <pre name="test">
+     * #THROWS SailoException
+     * Henkilot henkilot = new Henkilot();
+     * Henkilo henkilo1 = new Henkilo(), henkilo2 = new Henkilo();
+     * henkilot.getLkm() === 0;
+     * henkilot.lisaa(henkilo1); henkilot.getLkm()===1;
+     * henkilot.lisaa(henkilo2); henkilot.getLkm()===2;
+     * henkilot.lisaa(henkilo1); henkilot.getLkm()===3;
+     * henkilot.anna(0)===henkilo1;
+     * henkilot.anna(1)===henkilo2;
+     * henkilot.anna(2)===henkilo1;
+     * henkilot.anna(3)===henkilo1; #THROWS IndexOutOfBoundsException
+     * henkilot.lisaa(henkilo1); henkilot.getLkm()===4;
+     * henkilot.lisaa(henkilo1); henkilot.getLkm()===5;
+     * henkilot.lisaa(henkilo2); #THROWS SailoException
+     * </pre>
      */
     public void lisaa(Henkilo henkilo) throws SailoException {
         if (lkm >= alkiot.length) throw new SailoException("Liikaa alkioita");
@@ -57,6 +77,30 @@ public class Henkilot {
                 throw new SailoException("Tiedosto " + tiedosto.getAbsolutePath());
             }
     }
+    
+    /**
+     * @param hakemisto mistä haetaan
+     * @throws SailoException jos tiedoston lukemisessa jotain ongelmaa
+     */
+    public void lueTiedostosta(String hakemisto) throws SailoException {
+        String tiedostonNimi = hakemisto + "/nimet.dat";
+        File tiedosto = new File(tiedostonNimi);
+        
+        try (Scanner in = new Scanner(new FileInputStream(tiedosto))) {
+            while (in.hasNext() ) { // jos on seuraava olemassa niin luetaan seuraava nimi
+                String s = in.nextLine();
+                if (s == null || "".equals(s) || s.charAt(0) == ';') continue;
+                Henkilo henkilo = new Henkilo();
+                henkilo.parse(s); //TODO: PARSE MJONOT.JYU juttu!!!!!
+                
+                lisaa(henkilo);
+            }
+        } catch (FileNotFoundException e) {
+            throw new SailoException("Ei saa luettua tiedostoa " + tiedostonNimi);
+        }
+        
+    }
+
 
     /**
      * @param rallinTunnusNro tarkasteltavan rallin tunnusnumero
@@ -109,6 +153,13 @@ public class Henkilot {
     public static void main(String[] args) {
         Henkilot henkilot = new Henkilot();
         
+        try {
+            henkilot.lueTiedostosta("kerho");
+        } catch (SailoException ex) {
+            System.err.println(ex.getMessage());
+        }
+        
+        
         Henkilo rovis = new Henkilo();
         Henkilo asunmaa = new Henkilo();
         Henkilo elfyn = new Henkilo();
@@ -123,13 +174,13 @@ public class Henkilot {
         try {
             henkilot.lisaa(rovis);
             henkilot.lisaa(asunmaa);
-            henkilot.lisaa(elfyn);
+            henkilot.lisaa(elfyn); 
             
             System.out.println("==================== Testi ======================");
             
             for (int i = 0; i < henkilot.getLkm(); i++) {
                 Henkilo henkilo = henkilot.anna(i);
-                System.out.println("Henkilo nro: " + i);
+                System.out.println("Henkilo nro: " + (i+1));
                 henkilo.tulosta(System.out);
             }
             
@@ -137,6 +188,7 @@ public class Henkilot {
                 System.err.println("Liikaa alkioita :0"); //kun alkioita enemmän kun MAX sallii
         }
         
+        // tallentaminen hakemistoon "kerho"
         try {
             henkilot.tallenna("kerho");
         } catch (SailoException e) {
diff --git a/kerho/src/RalliJava/Rekisteri.java b/kerho/src/RalliJava/Rekisteri.java
index 5c4e478..14dd529 100644
--- a/kerho/src/RalliJava/Rekisteri.java
+++ b/kerho/src/RalliJava/Rekisteri.java
@@ -5,6 +5,8 @@ import java.util.List;
 /**
  * @author idamk
  * @version 25.2.2025
+ * TODO: nimien toistuvuustarkistin
+ * TODO: 
  *
  */
 public class Rekisteri {
@@ -57,6 +59,7 @@ public class Rekisteri {
         return henkilot.anna(i);  
     }
     
+    
     /**
      * @param henkilo Henkilö kenen rallit halutaan tietää
      * @return listan näistä ralleista
diff --git a/kerho/src/RalliJava/test/HenkiloTest.java b/kerho/src/RalliJava/test/HenkiloTest.java
new file mode 100644
index 0000000..589f76d
--- /dev/null
+++ b/kerho/src/RalliJava/test/HenkiloTest.java
@@ -0,0 +1,67 @@
+package RalliJava.test;
+// Generated by ComTest BEGIN
+import static org.junit.Assert.*;
+import org.junit.*;
+import RalliJava.*;
+// Generated by ComTest END
+
+/**
+ * Test class made by ComTest
+ * @version 2025.03.26 10:56:37 // Generated by ComTest
+ *
+ */
+@SuppressWarnings({ "all" })
+public class HenkiloTest {
+
+
+
+  // Generated by ComTest BEGIN
+  /** testRekisteroi32 */
+  @Test
+  public void testRekisteroi32() {    // Henkilo: 32
+    Henkilo henkilo1 = new Henkilo(); 
+    assertEquals("From: Henkilo line: 34", 0, henkilo1.getHenkilonTunnusNro()); 
+    henkilo1.rekisteroi(); 
+    Henkilo henkilo2 = new Henkilo(); 
+    henkilo2.rekisteroi(); 
+    int ht1 = henkilo1.getHenkilonTunnusNro(); 
+    int ht2 = henkilo2.getHenkilonTunnusNro(); 
+    assertEquals("From: Henkilo line: 40", ht2-1, ht1); 
+  } // Generated by ComTest END
+
+
+  // Generated by ComTest BEGIN
+  /** testGetNimi171 */
+  @Test
+  public void testGetNimi171() {    // Henkilo: 171
+    Henkilo henkilo = new Henkilo(); 
+    henkilo.vastaaKalle(); 
+    { String _l_=henkilo.getNimi(),_r_="Kalle Rovanperä"; if ( !_l_.matches(_r_) ) fail("From: Henkilo line: 174" + " does not match: ["+ _l_ + "] != [" + _r_ + "]");}; 
+  } // Generated by ComTest END
+
+
+  // Generated by ComTest BEGIN
+  /** testToString185 */
+  @Test
+  public void testToString185() {    // Henkilo: 185
+    Henkilo henkilo = new Henkilo(); 
+    henkilo.parse("2|Rovanperä|Kalle|"); 
+    assertEquals("From: Henkilo line: 188", true, henkilo.toString().startsWith("2|Rovanperä|Kalle|")); 
+  } // Generated by ComTest END
+
+
+  // Generated by ComTest BEGIN
+  /** testParse210 */
+  @Test
+  public void testParse210() {    // Henkilo: 210
+    Henkilo henkilo = new Henkilo(); 
+    henkilo.parse("2|Rovanperä|Kalle|"); 
+    assertEquals("From: Henkilo line: 213", 2, henkilo.getHenkilonTunnusNro()); 
+    assertEquals("From: Henkilo line: 214", true, henkilo.toString().startsWith("2|Rovanperä|Kalle|")); 
+    henkilo.rekisteroi(); 
+    int ht = henkilo.getHenkilonTunnusNro(); 
+    henkilo.parse(""+(ht+20)); 
+    henkilo.rekisteroi(); 
+    assertEquals("From: Henkilo line: 219", ht+20+1, henkilo.getHenkilonTunnusNro()); 
+  } // Generated by ComTest END
+}
\ No newline at end of file
diff --git a/kerho/src/RalliJava/test/HenkilotTest.java b/kerho/src/RalliJava/test/HenkilotTest.java
new file mode 100644
index 0000000..14c971d
--- /dev/null
+++ b/kerho/src/RalliJava/test/HenkilotTest.java
@@ -0,0 +1,44 @@
+package RalliJava.test;
+// Generated by ComTest BEGIN
+import static org.junit.Assert.*;
+import org.junit.*;
+import RalliJava.*;
+// Generated by ComTest END
+
+/**
+ * Test class made by ComTest
+ * @version 2025.03.26 11:05:27 // Generated by ComTest
+ *
+ */
+@SuppressWarnings({ "all" })
+public class HenkilotTest {
+
+
+  // Generated by ComTest BEGIN
+  /** 
+   * testLisaa39 
+   * @throws SailoException when error
+   */
+  @Test
+  public void testLisaa39() throws SailoException {    // Henkilot: 39
+    Henkilot henkilot = new Henkilot(); 
+    Henkilo henkilo1 = new Henkilo(), henkilo2 = new Henkilo(); 
+    assertEquals("From: Henkilot line: 43", 0, henkilot.getLkm()); 
+    henkilot.lisaa(henkilo1); assertEquals("From: Henkilot line: 44", 1, henkilot.getLkm()); 
+    henkilot.lisaa(henkilo2); assertEquals("From: Henkilot line: 45", 2, henkilot.getLkm()); 
+    henkilot.lisaa(henkilo1); assertEquals("From: Henkilot line: 46", 3, henkilot.getLkm()); 
+    assertEquals("From: Henkilot line: 47", henkilo1, henkilot.anna(0)); 
+    assertEquals("From: Henkilot line: 48", henkilo2, henkilot.anna(1)); 
+    assertEquals("From: Henkilot line: 49", henkilo1, henkilot.anna(2)); 
+    try {
+    assertEquals("From: Henkilot line: 50", henkilo1, henkilot.anna(3)); 
+    fail("Henkilot: 50 Did not throw IndexOutOfBoundsException");
+    } catch(IndexOutOfBoundsException _e_){ _e_.getMessage(); }
+    henkilot.lisaa(henkilo1); assertEquals("From: Henkilot line: 51", 4, henkilot.getLkm()); 
+    henkilot.lisaa(henkilo1); assertEquals("From: Henkilot line: 52", 5, henkilot.getLkm()); 
+    try {
+    henkilot.lisaa(henkilo2); 
+    fail("Henkilot: 53 Did not throw SailoException");
+    } catch(SailoException _e_){ _e_.getMessage(); }
+  } // Generated by ComTest END
+}
\ No newline at end of file
-- 
GitLab