// Apurutiini, muodostaa seloluvusta ja tuloksesta merkkijonon, // Esim. selo 1441, tulos voitto -> "+1441" private string MuodostaOttelu(int selo, Vakiot.OttelunTulos_enum tulos) { string ottelu; switch (tulos) { case Vakiot.OttelunTulos_enum.TULOS_VOITTO: ottelu = "+"; break; case Vakiot.OttelunTulos_enum.TULOS_TASAPELI: ottelu = "="; break; case Vakiot.OttelunTulos_enum.TULOS_TAPPIO: ottelu = "-"; break; case Vakiot.OttelunTulos_enum.TULOS_EI_ANNETTU: ottelu = ""; break; default: ottelu = "*"; // VIRHE break; } ottelu += selo.ToString(); return(ottelu); }
public void TarkistaOttelulistaErillisinTuloksin() { // input Vakiot.Miettimisaika_enum aika = Vakiot.Miettimisaika_enum.MIETTIMISAIKA_VAH_90MIN; string selo = "1525"; string pelimaara = ""; string vastustajat = "+1525 +1441 -1973 +1718 -1784 -1660 -1966 =1234 1555"; Vakiot.OttelunTulos_enum tulos = Vakiot.OttelunTulos_enum.TULOS_MAARITTELEMATON; Syotetiedot s = new Syotetiedot(aika, selo, pelimaara, vastustajat, tulos); // // Check that the input was stored correctly! // Assert.AreEqual(aika, s.Miettimisaika); Assert.AreEqual(selo, s.AlkuperainenSelo_str); Assert.AreEqual(pelimaara, s.AlkuperainenPelimaara_str); Assert.AreEqual(vastustajat, s.VastustajienSelot_str); Assert.AreEqual(tulos, s.OttelunTulos); // // parse strings into numbers, create an array of opponents // int status = so.TarkistaSyote(s); Assert.AreEqual(Vakiot.SYOTE_STATUS_OK, status); int seloInt; if (int.TryParse(selo, out seloInt) == false) { Assert.AreEqual("Illegal test data (number)", selo); } Assert.AreEqual(seloInt, s.AlkuperainenSelo); Assert.AreEqual(Vakiot.PELIMAARA_TYHJA, s.AlkuperainenPelimaara); // // Tarkista ottelulista, ensin lukumäärä // string[] vastustajatStr = vastustajat.Split(' '); Assert.AreEqual(vastustajatStr.Length, s.Ottelut.Lukumaara); // Käy sitten tallennetut ottelut läpi int i = 0; Ottelulista lista = s.Ottelut; var ottelu = lista.HaeEnsimmainen(); // vastustajanSelo, ottelunTulos while (ottelu.Item2 != Vakiot.OttelunTulos_enum.TULOS_MAARITTELEMATON) { Assert.AreEqual(MuodostaOttelu(ottelu.Item1, ottelu.Item2), vastustajatStr[i]); ottelu = lista.HaeSeuraava(); i++; } }
// pelatusta shakkiottelusta lasketaan vahvuusluku // // IN: vastustajan_selo 1000-2999 // IN: ottelun tulos: 0 = tappio, 1 = tasapeli, 2 = voitto (oikeasti 0, 1/2 ja 1) // // Käyttää: uusiSelo ja UusiPelimaara // Päivittää: Odotustulos, MinSelo ja MaxSelo // Palauttaa: uusi vahvuusluku // private int PelaaOttelu(int vastustajanSelo, Vakiot.OttelunTulos_enum tulos, bool vaihdaVanhaksiPelaajaksi) { int odotustulos1; // yhden ottelun Odotustulos, lisätään turnauksen odotustulokseen int selo; // Erikoistapaus if (tulos == Vakiot.OttelunTulos_enum.TULOS_EI_ANNETTU) { tulos = Vakiot.OttelunTulos_enum.TULOS_TASAPELI; } // Vanhan pelaajan SELOn laskennassa käytetään odotustulosta ja kerrointa // if (vaihdaVanhaksiPelaajaksi) { odotustulos1 = MaaritaOdotustulos(UusiSelo, vastustajanSelo); } else { odotustulos1 = MaaritaOdotustulos(alkuperaisetSyotteet.AlkuperainenSelo, vastustajanSelo); } Odotustulos += odotustulos1; // monta ottelua, niin summa kunkin ottelun odotustuloksista TurnauksenTulos2x += (int)tulos; if (!vaihdaVanhaksiPelaajaksi && alkuperaisetSyotteet.UudenPelaajanLaskentaAlkupPelimaara()) { // // Uuden pelaajan laskennassa käytetään vastustajan seloa tuloksen mukaan -200 / +0 / +200 int[] selomuutos = { -200, 0, 200 }; // indeksinä tulos 2*(0, 1/2, 1) -> indeksi (0, 1, 2) // Uuden pelaajan SELO, kun pelimäärä 0-10 // XXX: Kun ensimmäinen ottelu, niin UusiSelo ja UusiPelimaara ovat käyttäjän antamat alkuarvot omaSelo ja pelimaara // XXX: Laskennan edetessä niitä päivitetään // Jos pelimäärä on 0, niin omalla selolla (selo-kenttä) ei ole merkitystä (UusiSelo * 0 on nolla) selo = (int)Math.Round((UusiSelo * UusiPelimaara + (vastustajanSelo + selomuutos[(int)tulos])) / (UusiPelimaara + 1F) + 0.01); } else { // Vanhan pelaajan laskenta // // XXX: Käytetään kerrointa ja lisäkerrointa, jotka lasketaan laskennan aikaisesta vahvuusluvusta, OK? int kerroin1 = MaaritaKerroin(UusiSelo); float lisakerroin = MaaritaLisakerroin(UusiSelo, alkuperaisetSyotteet.Miettimisaika); // vanhan pelaajan SELO, kun pelimäärä jätetty tyhjäksi tai on yli 10. selo = (int)Math.Round((UusiSelo + kerroin1 * lisakerroin * (((int)tulos / 2F) - (odotustulos1 / 100F)) + 0.1F) + 0.01); } // tallenna vaihteluväli (jos yksi ottelu, niin jäävät samoiksi) MinSelo = Math.Min(MinSelo, selo); MaxSelo = Math.Max(MaxSelo, selo); return(selo); }
// Tarkista valitun ottelun tulos -painikkeen kelvollisuus // // Painikkeesta ei voida saada väärää tulosta. // Mutta jos tulos oli kerrottu CSV-formaatissa, niin siellä on voinut olla virhe, // ks. SelvitaTulosCSV() // // Virhestatus palautetaan, jos oli TULOS_MAARITTELEMATON // // Tulos TULOS_EI_ANNETTU ei ole virhe, koska se koskee merkkijonossa annettua tulosta, // joka tarkoituksella on jätetty antamatta. TULOS_EI_ANNETTU lasketaan tasapelinä. // private static int TarkistaOttelunTulos(Vakiot.OttelunTulos_enum ottelunTulos) { int tulos = Vakiot.SYOTE_STATUS_OK; if (ottelunTulos == Vakiot.OttelunTulos_enum.TULOS_MAARITTELEMATON) { tulos = Vakiot.SYOTE_VIRHE_BUTTON_TULOS; } return(tulos); }
// Yksittäisen ottelun tulos joko "0", "0.0", "0,0", "0.5", "0,5", "1/2", "½" (alt-171), "1", "1.0" tai "1,0" // Toistaiseksi CSV-formaatin tuloksissa voi käyttää vain desimaalipistettä, joten ei voida syöttää // tuloksia pilkun kanssa kuten "0,0", "0,5" ja "1,0". Tarkistetaan ne kuitenkin varalta. private Vakiot.OttelunTulos_enum SelvitaTulosCSV(string s) { Vakiot.OttelunTulos_enum tulos = Vakiot.OttelunTulos_enum.TULOS_MAARITTELEMATON; if (s.Equals("0") || s.Equals("0.0") || s.Equals("0,0")) { tulos = Vakiot.OttelunTulos_enum.TULOS_TAPPIO; } else if (s.Equals("0.5") || s.Equals("0,5") || s.Equals("1/2") || s.Equals("½")) { tulos = Vakiot.OttelunTulos_enum.TULOS_TASAPELI; } else if (s.Equals("1") || s.Equals("1.0") || s.Equals("1,0")) { tulos = Vakiot.OttelunTulos_enum.TULOS_VOITTO; } return(tulos); }
// XXX: REFACTOR TarkistaVastustajanSelo() // ************ TARKISTA VASTUSTAJAN SELO-KENTTÄ ************ // // Ottelut (selot ja tulokset) tallennetaan listaan // // Syöte voi olla annettu kolmella eri formaatilla: // 1) 1720 -> ja sitten tulos valintanapeilla // 2) 2,5 1624 1700 1685 1400 Eli aloitetaan kokonaispistemäärällä. // SELOt ilman erillisiä tuloksia. // 3) +1624 -1700 =1685 +1400 jossa '+' voitto, '=' tasapeli ja '-' tappio. // Tasapeli voidaan myös antaa ilman '='-merkkiä. // // Yhden ottelun tulos voidaan antaa kolmella tavalla: // 1) 1720 ja tulos erikseen valintanapeilla, esim. 1=voitto, 1/2=tasapeli tai 0=tappio // 2) -1720 (tappio), =1720 (tasapeli) tai +1720 (voitto) // 3) 0 1720 (tappio), 0.5 1720 (tasapeli) tai 1 1720 (voitto) // // Kahden tai useamman ottelun tulos voidaan syöttää kahdella eri tavalla // 1) 2,5 1624 1700 1685 1400 // 2) +1624 -1700 =1685 +1400 (Huom! myös -1624 +1700 +1685 1400 laskee saman vahvuusluvun) // HUOM! Jos tuloksessa on desimaalit väärin, esim. 2.37 tai 0,9, // niin ylimääräiset desimaalit "pyöristyvät" alas -> 2,0 tai 0,5. // // Paluuarvo joko kelvollinen seloluku (vain yksi vastustaja annettu), nolla (jos ottelut ovat listassa) tai virhestatus. // // Jos syote sisältää '/' -merkin, on laskettava sitä edeltävät tulokset uuden pelaajan kaavalla // ja sen jälkeen normaalilla laskentakaavalla private int TarkistaVastustajanSelo(Ottelulista ottelut, string syote) { int vastustajanSelo = 0; // palautettava vastustajan selo tai nolla tai virhestatus int virhekoodi = 0; bool onko_turnauksen_tulos = false; // oliko tulos ensimmäisenä? float syotetty_tulos = 0F; // tähän sitten sen tulos desimaalilukuna (esim. 2,5) // kentässä voidaan antaa alussa turnauksen tulos, esim. 0.5, 2.0, 2.5, 7.5 eli saadut pisteet selopelaaja.SetAnnettuTurnauksenTulos(Vakiot.TURNAUKSEN_TULOS_ANTAMATTA); // oletus: ei annettu turnauksen tulosta // Ensin helpot tarkistukset: // 1) Kenttä ei saa olla tyhjä if (string.IsNullOrWhiteSpace(syote)) { virhekoodi = Vakiot.SYOTE_VIRHE_VASTUSTAJAN_SELO; } else if (syote.Length == Vakiot.SELO_PITUUS) { if (int.TryParse(syote, out vastustajanSelo) == false) { // 2) Jos on annettu neljä merkkiä (esim. 1728), niin sen on oltava numero virhekoodi = Vakiot.SYOTE_VIRHE_VASTUSTAJAN_SELO; } else if (vastustajanSelo < Vakiot.MIN_SELO || vastustajanSelo > Vakiot.MAX_SELO) { // 3) Numeron on oltava sallitulla lukualueella // Mutta jos oli OK, niin vastustajanSelo sisältää nyt sallitun vahvuusluvun eikä tulla tähän virhekoodi = Vakiot.SYOTE_VIRHE_VASTUSTAJAN_SELO; } // Jos OK, yhden ottelun tulosta ei kuitenkaan vielä tallenneta listaan // vaan nyt palataan tästä funktiosta ja seuraavaksi selvitetään ottelun tulos } else { // Jäljellä vielä hankalammat tapaukset: // 4) turnauksen tulos+vahvuusluvut, esim. 2,5 1624 1700 1685 1400 // 5) vahvuusluvut, joissa kussakin tulos +1624 -1700 =1685 +1400 // 6) vahvuusluvut tuloksineen ja välissä '/'-merkki +1624 -1700 / =1685 +1400 // // TULOSSA: // 7) turnauksen_tulos turnauksen_ottelumäärä vastustajien_selokeskiarvo, esim. 12.5 18 1885.2 // Apumuuttujat bool status = true; int selo1; // = Vakiot.MIN_SELO; bool ensimmainen = true; // ensimmäinen syötekentän numero tai merkkijono bool toinen = false; // toinen syötekenttä List <string> SyotteenOsat = syote.Split(' ').ToList(); // Tutki vastustajanSelo_comboBox-kenttä välilyönnein erotettu merkkijono kerrallaan foreach (string vastustaja in SyotteenOsat) { if (ensimmainen) { // need to use temporary variable because can't modify foreach iteration variable string tempString = vastustaja; // 4) Onko annettu kokonaispistemäärä? (eli useamman ottelun yhteistulos) ensimmainen = false; toinen = true; // Laita molemmat 1.5 ja 1,5 toimimaan, InvariantCulture // Huom! Pilkkua ei voidakaan käyttää, jos halutaan // että CSV-formaatti toimii - pilkulla erotetut arvot if (tempString.Contains(',')) // korvaa pilkku pisteellä... { tempString = tempString.Replace(',', '.'); } // Jos ottelutulon lopussa on puolikas, niin muuta se ".5":ksi, esim. 10½ -> 10.5 // Jos ottelutulos on ½, niin tässä se muutetaan "0.5":ksi if (tempString.IndexOf('½') == tempString.Length - 1) { if (tempString.Length > 1) { tempString = tempString.Replace("½", ".5"); } else { tempString = "0.5"; // muutetaan suoraan, koska oli pelkästään "½" } } if (float.TryParse(tempString, System.Globalization.NumberStyles.AllowDecimalPoint, System.Globalization.CultureInfo.InvariantCulture, out syotetty_tulos) == true) { if (syotetty_tulos >= 0.0F && syotetty_tulos <= Vakiot.TURNAUKSEN_TULOS_MAX) { // HUOM! Jos tuloksessa on desimaalit väärin, esim. 2.37 tai 0,9, // niin ylimääräiset desimaalit "pyöristyvät" alas -> 2,0 tai 0,5. onko_turnauksen_tulos = true; selopelaaja.SetAnnettuTurnauksenTulos(syotetty_tulos); // alussa oli annettu turnauksen lopputulos, jatka SELOjen tarkistamista // Nyt selojen on oltava ilman tulosmerkintää! continue; } // Jos ei saatu kelvollista lukua, joka käy tuloksena, niin jatketaan // ja katsotaan, saadaanko vahvuusluku sen sijaan (jossa voi olla +/=/-) } // XXX: EI MUKANA VIELÄ //} //else if (toinen && onko_turnauksen_tulos && (vastustaja.Length == 1 || vastustaja.Length == 2) && !vastustaja.Equals("/") && SyotteenOsat.Count == 3) //{ // // Format 7) This must be number of matches N or NN, and then 3rd item should be average SELO of the opponents // string pelimaara_str = SyotteenOsat[1]; // string keskiselo_str = SyotteenOsat[2]; // int pelimaara; // float keskiselo; // toinen = false; // if (int.TryParse(pelimaara_str, out pelimaara) == true) // { // // pelimaara >= GetAnnettu // if (pelimaara * 2 < selopelaaja.GetAnnettuTurnauksenTulos2x()) // { // virhekoodi = Vakiot.SYOTE_VIRHE_TURNAUKSEN_TULOS; // status = false; // break; // } // selopelaaja.VastustajienLkm = pelimaara; // // keskiselo yhdellä desimaalilla, piste tai pilkku // if (float.TryParse(keskiselo_str, System.Globalization.NumberStyles.AllowDecimalPoint, // System.Globalization.CultureInfo.InvariantCulture, out keskiselo)) // { // if (keskiselo < Vakiot.MIN_SELO || keskiselo > Vakiot.MAX_SELO) // { // virhekoodi = Vakiot.SYOTE_VIRHE_KESKIVAHVUUS; // status = false; // break; // } // selopelaaja.TurnauksenKeskivahvuus = (int)(keskiselo + 0.5 + 0.001); // selopelaaja.TurnauksenKeskivahvuus10x = (int)(10 * keskiselo + 0.001); // vastustajanSelo = selopelaaja.TurnauksenKeskivahvuus; // // status edelleen true // break; // } // virhekoodi = Vakiot.SYOTE_VIRHE_KESKIVAHVUUS; // status = false; // break; // } } else if (vastustaja.Equals("/")) { toinen = false; if (selopelaaja.UudenPelaajanPelitLKM > 0) { // joko oli kauttamerkki? Ei saa olla kahta! virhekoodi = Vakiot.SYOTE_VIRHE_UUDEN_PELAAJAN_OTTELUT_KAKSI_KAUTTAMERKKIA; status = false; break; } // '/' ei voi olla ensimmäisenä // '/' ei saa olla, jos oli annettu turnauksen tulos // täytyy olla ainakin yksi ottelutulos ja sen jälkeen pitäisi olla (ei pakko) lisää otteluita // // Jos alkuperäinen pelimäärä oli 0, niin on laskettava ainakin 11 peliä uuden kaavalla // tarkistus kutsuvalla tasolla if (onko_turnauksen_tulos || ottelut.Lukumaara < 1) { virhekoodi = Vakiot.SYOTE_VIRHE_UUDEN_PELAAJAN_OTTELUT_ENINT_10; status = false; break; } selopelaaja.UudenPelaajanPelitLKM = ottelut.Lukumaara; continue; } toinen = false; // Tarkista yksittäiset vastustajien vahvuusluvut // merkkijono voi alkaa merkillä '+', '=' tai '-' // Mutta tasapeli voidaan antaa myös ilman '='-merkkiä // Jos oli annettu turnauksen tulos, niin selot on syötettävä näin ilman tulosta if (vastustaja.Length == Vakiot.SELO_PITUUS) // numero (4 merkkiä) { if (int.TryParse(vastustaja, out selo1) == false) { virhekoodi = Vakiot.SYOTE_VIRHE_VASTUSTAJAN_SELO; // -> virheilmoitus, ei ollut numero status = false; break; } else if (selo1 < Vakiot.MIN_SELO || selo1 > Vakiot.MAX_SELO) { virhekoodi = Vakiot.SYOTE_VIRHE_VASTUSTAJAN_SELO; // -> virheilmoitus, ei sallittu numero status = false; break; } // Hm... miten tallennus? // //if (onko_turnauksen_tulos) { // Jos annettu turnauksen tulos, ei merkitystä, koska tehdään uusi laskenta, jossa käytetään turnauksen tulosta // ottelut.LisaaOttelunTulos(selo1, Vakiot.OttelunTulos_enum.TULOS_EI_ANNETTU); //} else { // // Tallenna tasapeli, jos tulokset formaatissa +1624 -1700 =1685 +1400, jossa tasapeli // // on annettu ilman '='-merkkiä eli vaikkapa "+1624 -1700 1685 +1400" // ottelut.LisaaOttelunTulos(selo1, Vakiot.OttelunTulos_enum.TULOS_TASAPELI); //} // Jos ottelun tulosta ei annettu, niin sitä ei tallenneta // Laskennassa tämä otetaan kuitenkin huomioon tasapelinä, jolloin "+1624 -1700 1685 +1400" menee oikein // Ks. Selopelaaja PelaaOttelu() // // Näin myös yksikkötestauksessa on helpompi tarkistaa tiedot, // koska syötteen "=1234" on eri tapaus kuin "1234". ottelut.LisaaOttelunTulos(selo1, Vakiot.OttelunTulos_enum.TULOS_EI_ANNETTU); // OK } else if (onko_turnauksen_tulos == false && vastustaja.Length == Vakiot.MAX_PITUUS) { // 5) // Erillisten tulosten antaminen hyväksytään vain, jos turnauksen // lopputulosta ei oltu jo annettu (onko_turnauksen_tulos false) Vakiot.OttelunTulos_enum tulos1 = Vakiot.OttelunTulos_enum.TULOS_MAARITTELEMATON; if (vastustaja[0] >= '0' && vastustaja[0] <= '9') { // tarkistetaan, voidaan olla annettu viisinumeroinen luku // 10000 - 99999... joten anna virheilmoitus vahvuusluvusta virhekoodi = Vakiot.SYOTE_VIRHE_VASTUSTAJAN_SELO; status = false; } else { // Ensimmäinen merkki kertoo tuloksen switch (vastustaja[0]) { case '+': tulos1 = Vakiot.OttelunTulos_enum.TULOS_VOITTO; break; case '=': tulos1 = Vakiot.OttelunTulos_enum.TULOS_TASAPELI; break; case '-': tulos1 = Vakiot.OttelunTulos_enum.TULOS_TAPPIO; break; default: // ei sallittu tuloksen kertova merkki virhekoodi = Vakiot.SYOTE_VIRHE_YKSITTAINEN_TULOS; status = false; break; } } // jos virhe, pois foreach-loopista if (!status) { break; } // Selvitä vielä tuloksen perässä oleva numero // tarkista sitten, että on sallitulla alueella if (int.TryParse(vastustaja.Substring(1), out selo1) == false) { virhekoodi = Vakiot.SYOTE_VIRHE_VASTUSTAJAN_SELO; // -> virheilmoitus, ei ollut numero status = false; } else if (selo1 < Vakiot.MIN_SELO || selo1 > Vakiot.MAX_SELO) { status = false; break; } // Tallennetaan tulos: vahvuusluku ja +/-/=-merkeistä selvitetty tulos listaan ottelut.LisaaOttelunTulos(selo1, tulos1); } else { // pituus ei ollut // - SELO_PITUUS (esim. 1234) // - MAX_PITUUS (esim. +1234) silloin kun tulos voidaan antaa // Tähän tullaan myös, jos turnauksen kokonaistulos oli annettu ennen vahvuuslukuja, // koska silloin annetaan vain pelkät vahvuusluvut ilman yksittäisiä tuloksia. // Ei ole sallittu 2,5 +1624 =1700 -1685 +1400 (oikein on 2,5 1624 1700 1685 1400) virhekoodi = Vakiot.SYOTE_VIRHE_VASTUSTAJAN_SELO; status = false; break; } // Oliko asetettu virhe, mutta ei vielä poistuttu foreach-loopista? if (!status) { break; } } // foreach (käydään läpi syötteen numerot) // Lisää tarkastuksia // 6) Annettu turnauksen tulos ei saa olla suurempi kuin pelaajien lukumäärä // Jos tulos on sama kuin pelaajien lkm, on voitettu kaikki ottelut. if (status && onko_turnauksen_tulos) { if (ottelut.Lukumaara == 0) { // jos ei otteluita, mutta oli saatu turnauksen tulos N tai NN, // niin annetaan virheilmoitus vastustajan selo virheellinen virhekoodi = Vakiot.SYOTE_VIRHE_VASTUSTAJAN_SELO; } // Vertailu kokonaislukuina, esim. syötetty tulos 3.5 ja pelaajia 4, vertailu 7 > 8. else if ((int)(2 * syotetty_tulos + 0.01F) > 2 * ottelut.Lukumaara) { virhekoodi = Vakiot.SYOTE_VIRHE_TURNAUKSEN_TULOS; // tästä oma virheilmoitus //status = false; // no need to clear status any more } } } // Palauta virhekoodi tai selvitetty yksittäisen vastustajan selo (joka on 0, jos ottelut listassa) return(virhekoodi < 0 ? virhekoodi : vastustajanSelo); }
// Ottelutuloksen (vastustaja ja tulos) lisääminen listaan public void LisaaOttelunTulos(int vastustajanSelo, Vakiot.OttelunTulos_enum ottelunTulos) { Ottelu ottelu = new Ottelu(vastustajanSelo, ottelunTulos); tallennetutOttelut.Add(ottelu); }
public Ottelu(int selo, Vakiot.OttelunTulos_enum tulos) // tallentaa { VastustajanSelo = selo; OttelunTulos = tulos; }
public void TarkistaOttelulistaTurnauksenTuloksella() { // input Vakiot.Miettimisaika_enum aika = Vakiot.Miettimisaika_enum.MIETTIMISAIKA_VAH_90MIN; string selo = "1525"; string pelimaara = ""; string vastustajat = "1.5 1525 1441 1973 1718 1784 1660 1966"; Vakiot.OttelunTulos_enum tulos = Vakiot.OttelunTulos_enum.TULOS_MAARITTELEMATON; Syotetiedot s = new Syotetiedot(aika, selo, pelimaara, vastustajat, tulos); // // Check that the input was stored correctly! // Assert.AreEqual(aika, s.Miettimisaika); Assert.AreEqual(selo, s.AlkuperainenSelo_str); Assert.AreEqual(pelimaara, s.AlkuperainenPelimaara_str); Assert.AreEqual(vastustajat, s.VastustajienSelot_str); Assert.AreEqual(tulos, s.OttelunTulos); // // parse strings into numbers, create an array of opponents // int status = so.TarkistaSyote(s); Assert.AreEqual(Vakiot.SYOTE_STATUS_OK, status); int seloInt; if (int.TryParse(selo, out seloInt) == false) { Assert.AreEqual("Illegal test data (number)", selo); } Assert.AreEqual(seloInt, s.AlkuperainenSelo); Assert.AreEqual(Vakiot.PELIMAARA_TYHJA, s.AlkuperainenPelimaara); // // Tarkista ottelulista, ensin lukumäärä // // Huom! Nyt vastustajatStr sisältää myös turnauksen tuloksen, joten vähennettävä lukumäärää yhdellä // string[] vastustajatStr = vastustajat.Split(' '); Assert.AreEqual(vastustajatStr.Length - 1, s.Ottelut.Lukumaara); // Käy sitten tallennetut ottelut läpi // Huom! Koska vastustajatStr sisältää myös turnauksen tuloksen, aloitetaan indeksistä 1 int i = 1; Ottelulista lista = s.Ottelut; var ottelu = lista.HaeEnsimmainen(); // vastustajanSelo, ottelunTulos while (ottelu.Item2 != Vakiot.OttelunTulos_enum.TULOS_MAARITTELEMATON) { // Koska käytetty turnauksen tulosta, niin listaan tallennettuihin otteluihin ei ole annettu tulosta Assert.AreEqual(MuodostaOttelu(ottelu.Item1, ottelu.Item2), vastustajatStr[i]); ottelu = lista.HaeSeuraava(); i++; } }
// -------------------------------------------------------------------------------- // Parametrien tarkistuksen ja laskennan testauksen apurutiinit // // Näissä kaikissa on string selo ja string vastustajat // Muiden parametrien puuttumisen varalta on useita versioita // -------------------------------------------------------------------------------- // Use old Tuple, because Visual Studio Community 2015 has older C# public Tuple <int, Selopelaaja> Testaa(Vakiot.Miettimisaika_enum aika, string selo, string pelimaara, string vastustajat, Vakiot.OttelunTulos_enum tulos) { Syotetiedot syotetiedot = new Syotetiedot(aika, selo, pelimaara, vastustajat, tulos, /*trim input strings*/ true); int status; Selopelaaja tulokset = null; if ((status = so.TarkistaSyote(syotetiedot)) == Vakiot.SYOTE_STATUS_OK) { // If the input was OK, continue and calculate // If wasn't, then tulokset is left null and error status will be returned tulokset = so.SuoritaLaskenta(syotetiedot); } return(Tuple.Create(status, tulokset)); }
// Jos aikaa, pelimäärää ei annettu, oletuksena 90 minuuttia ja "" public Tuple <int, Selopelaaja> Testaa(string selo, string vastustajat, Vakiot.OttelunTulos_enum tulos) { return(Testaa(Vakiot.Miettimisaika_enum.MIETTIMISAIKA_VAH_90MIN, selo, "", vastustajat, tulos)); }
// - TESTATTAESSA (UnitTest1.cs) // Syotetiedot ottelu = // new Syotetiedot(Vakiot.Miettimisaika_enum.MIETTIMISAIKA_VAH_90MIN, "1725", "1", "1441", Vakiot.OttelunTulos_enum.TULOS_VOITTO, /*doTrim*/true); // Testattaessa doTrim=true, koska välilyöntien poistoa ei tehdä yksikkötestauksessa vaan // poiston jättäminen tänne on osa testausta. public Syotetiedot(Vakiot.Miettimisaika_enum aika1, string selo1, string pelimaara1, string vastustajat1, Vakiot.OttelunTulos_enum tulos1, bool doTrim) { // XXX: Could check arguments everywhere: arg == null or sometimes string.IsNullOrEmpty(arg) if (selo1 == null) { throw new ArgumentNullException(nameof(selo1)); } if (pelimaara1 == null) { throw new ArgumentNullException(nameof(pelimaara1)); } if (vastustajat1 == null) { throw new ArgumentNullException(nameof(vastustajat1)); } // Copy arguments, might be modified Vakiot.Miettimisaika_enum aika = aika1; string selo = String.Copy(selo1); string pelimaara = String.Copy(pelimaara1); string vastustajat = String.Copy(vastustajat1); Vakiot.OttelunTulos_enum tulos = tulos1; // If CSV format, values there will override other parameters if (vastustajat.Contains(',')) { List <string> tmp = vastustajat.Split(',').ToList(); if (tmp.Count != 2 || (tmp.Count == 2 && tmp[0].Trim().Length >= 4)) { //vastustajat = so.SiistiVastustajatKentta(vastustajat.Trim()); List <string> data = vastustajat.Split(',').ToList(); if (data.Count == 5) { aika = this.SelvitaMiettimisaikaCSV(data[0]); selo = data[1]; pelimaara = data[2]; vastustajat = data[3]; tulos = this.SelvitaTulosCSV(data[4]); } else if (data.Count == 4) { // viimeinen osa voi sisältää vastustajat tuloksineen tai jos alkuperäinen pelimäärä on enintään 10, // niin ensin lasketaan uuden pelaajan kaavalla ja loput "/"-merkin jälkeen menevät normaalilaskentaan // "90,1525,0,+1525 +1441 -1973 +1718 -1784 -1660 -1966 +1321 -1678 -1864 -1944 / -1995 +1695 -1930 1901", aika = this.SelvitaMiettimisaikaCSV(data[0]); selo = data[1]; pelimaara = data[2]; vastustajat = data[3]; tulos = Vakiot.OttelunTulos_enum.TULOS_MAARITTELEMATON; } else if (data.Count == 3) { //aika = aika; selo = data[0]; pelimaara = data[1]; vastustajat = data[2]; tulos = Vakiot.OttelunTulos_enum.TULOS_MAARITTELEMATON; } else if (data.Count == 2) { //aika = aika; selo = data[0]; pelimaara = ""; vastustajat = data[1]; tulos = Vakiot.OttelunTulos_enum.TULOS_MAARITTELEMATON; } else { // XXX: CHECK WHAT HAPPENS HERE // XXX: Virheen pitää olla Vakiot.SYOTE_VIRHE_CSV_FORMAT //aika = aika; selo = ""; pelimaara = ""; vastustajat = ""; tulos = Vakiot.OttelunTulos_enum.TULOS_MAARITTELEMATON; } // The thinking time might be needed from the form if there are 2 or 3 values in CSV format //return so.SelvitaCSV(aika, vastustajat); } } Miettimisaika = aika; // if doTrim -> remove leading and trailing white spaces AlkuperainenSelo_str = doTrim ? selo.Trim() : selo; AlkuperainenPelimaara_str = doTrim ? pelimaara.Trim() : pelimaara; if (doTrim) { SelolaskuriOperations so = new SelolaskuriOperations(); vastustajat = so.SiistiVastustajatKentta(vastustajat.Trim()); } VastustajienSelot_str = vastustajat; OttelunTulos = tulos; // Clear these too although not actually needed AlkuperainenSelo = 0; AlkuperainenPelimaara = 0; UudenPelaajanPelitEnsinLKM = 0; YksiVastustajaTulosnapit = 0; // Create en empty list for matches (opponent's selo, match result) Ottelut = new Ottelulista(); }
} // sis. vastustajien selot ja ottelutulokset // Konstruktorin käyttö: // - Lomakkeelta (SelolaskuriForm.cs) // return new Syotetiedot(HaeMiettimisaika(), selo_in.Text, pelimaara_in.Text, vastustajanSelo_comboBox.Text, HaeOttelunTulos()); // Lomakkeella doTrim=false, koska ylimääräiset välilyönnit poistetaan jo ennen kutsua, jotta // ne saadaan päivitettyä myös lomakkeen kenttiin. public Syotetiedot(Vakiot.Miettimisaika_enum aika, string selo, string pelimaara, string vastustajat, Vakiot.OttelunTulos_enum tulos) : this(aika, selo, pelimaara, vastustajat, tulos, /*doTrim*/ false) { }