Podstawy programowania III WYKŁAD 6



Podobne dokumenty
PHP 5 język obiektowy

Dokumentacja techniczna API systemu SimPay.pl

Budowa aplikacji wielowarstwowych zastosowanie szablonów. Laboratorium 2 Programowanie komponentowe Zofia Kruczkiewicz

Programowanie poprzez testy z wykorzystaniem JUnit

Podstawy programowania III WYKŁAD 2

Programowanie zorientowane obiektowo. Mateusz Kołecki

Programowanie obiektowe

MVC w praktyce tworzymy system artykułów. cz. 1

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Projektowanie aplikacji w modelu MVC opartej o framework CodeIgniter

JUnit TESTY JEDNOSTKOWE. Waldemar Korłub. Platformy Technologiczne KASK ETI Politechnika Gdańska

Systemy baz danych Prowadzący: Adam Czyszczoń. Systemy baz danych. 1. Import bazy z MS Access do MS SQL Server 2012:

Ćwiczenia 2 IBM DB2 Data Studio

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

Przykładowa implementacja

METODY PROGRAMOWANIA

Wzorce logiki dziedziny

Backend Administratora

Laboratorium 7 Blog: dodawanie i edycja wpisów

app/ - folder zawiera pliki konfiguracyjne dla całej aplikacji Można wybrać sposób zapisu konfiguracji: YML, XML, PHP

Java: interfejsy i klasy wewnętrzne

Sprawdzenie czy połączenie przebiegło poprawnie if (mysqli_connect_errno()) { echo Błąd; Połączenie z bazą danych nie powiodło się.

MVC w praktyce tworzymy system artykułów. cz. 2

Bazy danych dla producenta mebli tapicerowanych. Bartosz Janiak Marcin Sikora Wrocław r.

D:\DYDAKTYKA\ZAI_BIS\_Ćwiczenia_wzorce\04\04_poprawiony.doc 2009-lis-23, 17:44

Testy aplikacji webowych

BAZY DANYCH. Obsługa bazy z poziomu języka PHP. opracowanie: Michał Lech

PHP: bloki kodu, tablice, obiekty i formularze

Kurs WWW. Paweł Rajba.

Wstęp. Ale po co? Implementacja

I.Wojnicki, PHP. Smarty. Igor Wojnicki. Katedra Informatyki Stosowanej Akademia Górniczo-Hutnicza w Krakowie. 28 marca 2014

Oracle Application Express

Języki skryptowe - PHP. PHP i bazy danych. Paweł Kasprowski. pawel@kasprowski.pl. vl07

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Całościowe podejście do testowania automatycznego dla programistów. /C#/PHP (TDD, BDD, Spec. by Example, wzorce, narzędzia)

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Klasy i obiekty cz II

Kurs języka Python. Wykład 11. Marcin Młotkowski. 4 stycznia Kontrola poprawności podczas biegu programu. 2 Testowanie oprogramowania

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

UML a kod. C++, Java i C#

Testy jednostkowe - zastosowanie oprogramowania JUNIT 4.0 Zofia Kruczkiewicz

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

Testowanie aplikacji. Kurs języka Ruby

Laboratorium z przedmiotu: Inżynieria Oprogramowania INP002017_ Laboratorium 11 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych:

Podstawy programowania III

Laboratorium 1. Wzorce oprogramowania lab1, Zofia Kruczkiewicz

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Programowanie obiektowe

Baza danych do przechowywania użytkowników

Programowanie obiektowe

Przewodnik użytkownika (instrukcja) AutoMagicTest

Zaawansowane aplikacje internetowe

REFERAT O PRACY DYPLOMOWEJ

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Programowanie Obiektowe Ćwiczenie 4

Wzorce dystrybucji i wspólbieżności autonomicznej

Programowanie w Sieci Internet Blok 2 - PHP. Kraków, 09 listopada 2012 mgr Piotr Rytko Wydział Matematyki i Informatyki

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Podstawy programowania III WYKŁAD 5

SMS Kod Automatyczny

Wykład 7: Pakiety i Interfejsy

Podstawy programowania III WYKŁAD 4

Język PHP. Studium Podyplomowe Sieci Komputerowe i Aplikacje Internetowe. v1.7, 2007/11/23

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Automatyczne generowanie kodu. 4Developers, 26 marca 2010

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Aplikacje w środowisku Java

REFERAT PRACY DYPLOMOWEJ

Architektura MVC w ASP.NET. Autor wykładu: Marek Wojciechowski

Programowanie obiektowe

Poznaj ASP.NET MVC. Kamil Cieślak Microsoft Student Partner

Programowanie obiektowe

Na przykładzie języków Java, C# i odrobiny C++ Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Scenariusz Web Design DHTML na 10 sesji. - Strony statyczne I dynamiczne. - Dodawanie kodu VBScript do strony HTML. Rysunek nie jest potrzebny

Programowanie zespołowe

Całościowe podejście do testowania automatycznego dla programistów. (TDD, BDD, Spec. by Example, wzorce, narzędzia)

BEAN VALIDATION. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Programowanie obiektowe

NoSQL Not Only SQL, CouchDB. I.Wojnicki, NoSQL. Apache CouchDB has started. Time to relax. Igor Wojnicki

SMS Kod Automatyczny

Aplikacje w środowisku Java

Wielojęzykowość w aplikacjach J2EE. Tomasz.Skutnik@e-point.pl

Klasy abstrakcyjne, interfejsy i polimorfizm

1.1. System otwartych baz danych ODBC. System otwartych baz danych ODBC. Interfejs ODBC. Interfejs ODBC. System otwartych baz danych ODBC

Test przykładowy 2 PAI WSB Wrocław /06/2018

Wykład VII. Programowanie III - semestr III Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Platformy Programistyczne Podstawy języka Java

Testowanie aplikacji Java Servlets

Testowanie jednostkowe. Jacek Starzyński, ZETiIS PW

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

Testowanie II. Celem zajęć jest zapoznanie studentów z oceną jakości testów przy wykorzystaniu metryk pokrycia kodu testami (ang. code coverage).

Typy metod: konstruktory, destruktory, selektory, zapytania, iteratory.

Podstawy wzorca MVC MODEL KON- TROLER WIDOK. Odpowiada za wyświetlenie danych użytkownikowi. Zawiera dane aplikacji oraz jej logikę.

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Programowanie obiektowe

Wprowadzenie do laboratorium. Zasady obowiązujące na zajęciach. Wprowadzenie do narzędzi wykorzystywanych podczas laboratorium.

Transkrypt:

Podstawy programowania III WYKŁAD 6 Jan Kazimirski 1

Projekt: Katalog książek elektronicznych c.d. 2

Diagram przypadków użycia 3

Iteracja 1 Zaprojektowanie panelu głównego aplikacji Realizacja przypadków użycia: Włącz tryb edycji Wyłącz tryb edycji 4

Panel główny Obszar lewy: logo aplikacji (1) przycisk zmiany trybu (2) menu główne (3) Obszar prawy: główny panel roboczy (4) (1) (2) (3) (4) 5

Klasa HtmlTools Metody head wyświetlanie nagłówka strony tail wyświetlanie stopki strony page wyświetlanie układu strony (lpan część dynamiczna lewego panelu, rpan prawy panel) 6

HtmlTools <?php class HtmlTools { public function head() { echo '<html><head>'."\n"; echo '<TITLE>e-Bookshelf</TITLE>'."\n"; echo '<meta http-equiv="content-type" content="text/html; charset=utf-8">'."\n"; echo '<link rel="stylesheet" type="text/css" href="bookshelf.css" />'."\n"; echo '</head><body>'; public function tail() { echo '<div id="tail"><hr>(c) 2010 by jankazim</div>'."\n"; echo '</body></html>'."\n"; public function page($lm,$rs) { self::head(); // left side (top,middle,bottom) echo '<div id="lside">'."\n"; echo '<div id="ltop"><img src="img/books.png"></div>'."\n"; echo '<div id="lmid">'.$lm.'</div>'."\n"; echo '<div id="lbot">'.$menu.'</div>'."\n"; echo '</div>'; // right side (top,bottom) echo '<div id="rside">'.$rs.'</div>'."\n"; self::tail(); ; 7

Zmiana trybu edycji Zmiana trybu pracy: tryb edycji wyłączony lub włączony 8

Klasa AccMode Odpowiedzialność: 1. Wyświetlenie przycisków włączenia i wyłączenia trybu edycji 2. Informacja o aktualnym trybie 3. Ustawienie domyślnego trybu edycji. 9

Dygresja - TDD Podejście klasyczne: projektowanie -> implementowanie -> testowanie TDD Test Driven Development: projektowanie -> tworzenie testów -> (testowanie -> implementowanie -> testowanie).. W metodologii TDD najpierw tworzymy testy a później implementujemy funkcjonalność. 10

Dygresja TDD c.d. Typowy przebieg czynności Projektujemy klasę/moduł i tworzymy pusty szkielet Tworzymy testy dla poszczególnych metod i funkcji Uruchamiamy testy wszystkie zakończą się niepowodzeniem Implementujemy fragment funkcjonalności Uruchamiamy testy część testów powinna się powieść Dodajemy funkcjonalność, refaktoryzujemy itp. Uruchamiamy testy... Kod jest gotowy gdy wszystkie testy są poprawne 11

Dygresja TDD c.d. Zalety metodologii TDD Lepszy projekt (projektowanie testu wymusza lepszy design metod). Mniej błędów w kodzie. Bezpieczniejsza manipulacja kodem (refaktoryzacja, zmiany koncepcji). Automatyzacja procesu testowania. Lepsza kontrola nad postępem prac nad projektem (liczba poprawnych vs. niepoprawnych testów). 12

TDD - xunit Środowisko xunit tworzenie i uruchamianie testów jednostkowych. Dostępne dla wielu języków programowania m.in.: Java (Junit) C++ (CppUnit) PHP (PHPUnit) 13

AccMode szkielet klasy <?php // Access mode manipulations. class AccMode { // Set default and change current mode. public function setmode($cmdlist) { // Get HTML code for the change mode button. public function getmodebutton() { // Return TRUE if edit mode is on. public function iseditmode() { ;?> 14

AccModeTest testy jednostkowe $_SESSION = array(); require_once("accmode.php"); // Unit tests for AccMode class class AccModeTest extends PHPUnit_Framework_TestCase { public function testdefaultvalue() { AccMode::setMode(array()); $this->assertequals("view",$_session["accmode"]); public function testchangeeditmode() { AccMode::setMode(array("cmd"=>"E+")); $this->assertequals("edit",$_session["accmode"]); AccMode::setMode(array("cmd"=>"E-")); $this->assertequals("view",$_session["accmode"]); public function testraporteditmode() { AccMode::setMode(array("cmd"=>"E+")); $this->assertequals(true,accmode::iseditmode()); AccMode::setMode(array("cmd"=>"E-")); $this->assertequals(false,accmode::iseditmode()); ; 15

Iteracja 1.0 - testy PHPUnit 3.5.7 by Sebastian Bergmann. EEF Time: 0 seconds, Memory: 4.50Mb There were 2 errors: 1) AccModeTest::testDefaultValue Undefined index: AccMode /home/jankazim/public_html/bookshelf/accmodetest.php:12 2) AccModeTest::testChangeEditMode Undefined index: AccMode /home/jankazim/public_html/bookshelf/accmodetest.php:17 -- Dwa błędy, jeden wynik nieprawidłowy BŁĄD BŁĄD 16

Iteracja 1.0 testy c.d. There was 1 failure: 1) AccModeTest::testRaportEditMode Failed asserting that <null> matches expected <boolean:true>. /home/jankazim/public_html/bookshelf/accmodetest.php:24 Test zakończony niepowodzeniem FAILURES! Tests: 3, Assertions: 1, Failures: 1, Errors: 2. Podsumowanie 17

class AccMode { Iteracja 1.1 AccMode::setMode // Set default and change current mode. public function setmode($cmdlist) { if(!isset($_session['accmode'])) $_SESSION["AccMode"]="View"; if(isset($cmdlist["cmd"])) { if($cmdlist["cmd"]=="e+") $_SESSION["AccMode"]="Edit"; if($cmdlist["cmd"]=="e-") $_SESSION["AccMode"]="View"; ;... ;..F There was 1 failure: 1) AccModeTest::testRaportEditMode Failed asserting that <null> matches expected <boolean:true>. FAILURES! Tests: 3, Assertions: 4, Failures: 1. 18

Iteracja 1.2 AccMode::isEditMode class AccMode {... // Return TRUE if edit mode is on. public function iseditmode() { return ($_SESSION['AccMode']=="Edit"); ; PHPUnit 3.5.7 by Sebastian Bergmann.... Time: 0 seconds, Memory: 4.25Mb OK (3 tests, 5 assertions) 19

Iteracja 1.3 AccMode::getModeButton class AccMode {... // Get HTML code for the change mode button. public function getmodebutton() { $str = "<form action=".$_server['php_self']." method=\"get\">"; if($_session['accmode']=="edit") { $str.= "<input type=\"hidden\" name=\"cmd\" value=\"e-\">"; $str.= "<input type=\"submit\" value=\"edit mode on\"></form>"; else { $str.= "<input type=\"hidden\" name=\"cmd\" value=\"e+\">"; $str.= "<input type=\"submit\" value=\"edit mode off\"></form>"; ; return $str; OSTROŻNIE!!! Brak pokrycia testami... ; 20

Iteracja 1.4 program główny <?php session_start(); date_default_timezone_set('utc'); error_reporting(e_all); require_once("htmltools.php"); require_once("accmode.php"); AccMode::setMode($_REQUEST); $rpan = AccMode::getModeButton(); Html::page($rpan,"");?> 21

Iteracja 1 - KONIEC 22

Iteracja 2 Realizacja przypadków użycia Dodaj kategorię Wyświetl listę kategorii Edytuj kategorię Usuń kategorię 23

Obsługa kategorii Dodanie kategorii Lista kategorii, dodaj, usuń kategorię 24

Moduł CatModule - klasy 25

Klasa DataBase Klasa DataBase realizacja wzorca singleton. Realizacja zapytań do bazy danych: query zapytanie bez danych zwrotnych getrow zapytanie z jednym rezultatem getall zapytanie zwracające listę rezultatów Rezultaty zwracane w postaci tablicy 1 lub 2- wymiarowej zmiennych typu string. 26

DataBase - szkielet <?php // PostgreSQL database interface class DataBase { private $conn = NULL; private function constructor() { // Return DataBase object public function instance() { // Execute query with no results public function query($q) { // Execute query with one result public function getrow($q) { // Execute query with many results public function getall($q) { ; 27

DataBase testy jednostkowe Zaimplementowane testy: testconnection testvalidquery testinvalidquery testvalidgetrow testinvalidgetrow testvalidgetall testinvalidgetall Na tym etapie testy nie dają się nawet uruchomić: FPHP Fatal error: Call to a member function query() on a non-object in /home/jankazim/public_html/bookshe lf/databasetest.php on line 15 28

DataBase implementacja (1) class DataBase { private $conn = NULL; private function construct() { $this->conn = @pg_connect('host=localhost dbname=jankazim'. ' user=jankazim password=jankazim'); if($this->conn==null) throw new Exception("DatabaseConnectionError"); // Return DataBase object public function instance() { static $objdb; if(!isset($objdb)) $objdb = new DataBase(); return $objdb; testconnection testvalidquery testinvalidquery testvalidgetrow testinvalidgetrow testvalidgetall testinvalidgetall... ; 29

DataBase implementacja (2) class DataBase {... // Execute query with no results public function query($q) { $pgq=@pg_query($this->conn,$q); if($pgq==null) throw new Exception("DataBaseInvalidQueryError"); return TRUE;... ; testconnection testvalidquery testinvalidquery testvalidgetrow testinvalidgetrow testvalidgetall testinvalidgetall 30

DataBase implementacja (3) class DataBase {...... // Execute query with one result public function getrow($q) { $pgq=@pg_query($this->conn,$q); if($pgq==null) throw new Exception("DataBaseInvalidQueryError"); if($row=pg_fetch_assoc($pgq)) { return $row; else return FALSE; testconnection testvalidquery testinvalidquery testvalidgetrow testinvalidgetrow testvalidgetall testinvalidgetall ; 31

DataBase implementacja (4) class DataBase {... // Execute query with many results public function getall($q) { $res = array(); $pgq=@pg_query($this->conn,$q); if($pgq==null) throw new Exception("DataBaseInvalidQueryError"); while($row=pg_fetch_assoc($pgq)) $res[] = $row; return $res; ; testconnection testvalidquery testinvalidquery testvalidgetrow testinvalidgetrow testvalidgetall testinvalidgetall 32

CatModule - szkielet require_once("commandint.php"); class Category {; class CatList {; class CatModDB {; class CatModGUI {; class CatModule implements CommandInt { public function action($req) { ;?> 33

Category, CatList - szkielet... class Category { private $cid; private $cname; public function construct($cn,$ci) { public function getid() { public function getname() { ; class CatList implements Iterator { private $list; public function construct() { public function add(category $cat) { public function current() { public function next() { public function key() { public function valid() { public function rewind() { public function count() { ;... UNIT TESTS - Category testemptyconstructor testconstructorwithname testcompleteconstructor UNIT TESTS - CatList testconstructor testaddcategory testiterator 34

Category - implementacja class Category { private $cid; private $cname; public function construct($cn=null,$ci=null) { $this->cid = $ci; $this->cname = $cn; public function getid() { return $this->cid; public function getname() { return $this->cname; UNIT TESTS - Category testemptyconstructor testconstructorwithname testcompleteconstructor UNIT TESTS - CatList testconstructor testaddcategory testiterator 35

CatList implementacja (1) class CatList implements Iterator { private $list; public function construct() { $this->list = array(); public function add(category $cat) { $this->list[] = $cat; public function current() { public function next() { public function key() { public function valid() { public function rewind() { public function count() { return count($this->list); ; UNIT TESTS - Category testemptyconstructor testconstructorwithname testcompleteconstructor UNIT TESTS - CatList testconstructor testaddcategory testiterator 36

CatList implementacja (2) class CatList implements Iterator { private $list; private $ptr; public function construct() { $this->list = array(); $this->ptr = 0;... public function current() { return $this->list[$this->ptr]; public function next() { $this->ptr++; public function key() { return $this->list[$this->ptr]->getid(); public function valid() { return isset($this->list[$this->ptr]); UNIT TESTS - Category testemptyconstructor testconstructorwithname testcompleteconstructor UNIT TESTS - CatList testconstructor testaddcategory testiterator public function rewind() { $this->ptr = 0;... 37

CatModDB - szkielet class CatModDB { public function getcat($id) { public function addcat(category $cat) { public function getcatlist() { public function deletecat($id) { public function updatecat(category $cat) { ; UNIT TESTS - CatModDB testdbgetcat testdbgetcatlist testdbaddcat testdbdeletecat testdbupdatecat testdbaddcatduplicatename testdbupdatecatduplicatename testdbgetcatinvalidid testdbdeletecatinvalidid 38

CatModDB implementacja (2) public function getcat($id) { $db = DataBase::instance(); $res=$db->getrow("select * from bookshelf_catlist where id_c=$id;"); return new Category($res["cname"],$res["id_c"]); public function addcat(category $cat) { $name = $cat->getname(); $db = DataBase::instance(); $query = "insert into bookshelf_catlist(cname) values ('$name');"; $db->query($query); public function getcatlist() { $cl = new CatList(); $db = DataBase::instance(); $res=$db->getall("select * from bookshelf_catlist;"); foreach($res as $r) $cl->add(new Category($r["cname"],$r["id_c"])); return $cl; UNIT TESTS - CatModDB testdbgetcat testdbgetcatlist testdbaddcat testdbdeletecat testdbupdatecat testdbaddcatduplicatename testdbupdatecatduplicatename testdbgetcatinvalidid testdbdeletecatinvalidid 39

CatModDB implementacja (3) public function deletecat($id) { $db = DataBase::instance(); $query = "delete from bookshelf_catlist where id_c=$id;"; $db->query($query); UNIT TESTS - CatModDB testdbgetcat testdbgetcatlist testdbaddcat public function updatecat(category $cat) { testdbdeletecat $name = $cat->getname(); $id = $cat->getid(); testdbupdatecat $db = DataBase::instance(); testdbaddcatduplicatename $query = "update bookshelf_catlist set cname='$name' where id_c=$id;"; $db->query($query); testdbupdatecatduplicatename testdbgetcatinvalidid testdbdeletecatinvalidid 40

CatModDB implementacja (4) public function getcat($id) { $db = DataBase::instance(); $res=$db->getrow("select * from bookshelf_catlist where id_c=$id;"); if($res==false) throw new Exception("InvalidCategoryID"); return new Category($res["cname"],$res["id_c"]);... public function deletecat($id) { $db = DataBase::instance(); $res = $db->getrow("select * from bookshelf_catlist where id_c=$id;"); if($res==false) throw new Exception("InvalidCategoryId"); $db->query("delete from bookshelf_catlist where id_c=$id;"); UNIT TESTS - CatModDB testdbgetcat testdbgetcatlist testdbaddcat testdbdeletecat testdbupdatecat testdbaddcatduplicatename testdbupdatecatduplicatename testdbgetcatinvalidid testdbdeletecatinvalidid 41

CatModGUI - szablon class CatModGUI { public function buttonaddcat() { public function buttonupdatecat() { public function buttonrmovecat() { public function buttonlistcat() { public function formcategory() { public function receivecategory() { public function showcatlist() { ; 42

Formularze typu przycisk Klasa CatModGUI zawiera szereg metod o nazwach button* - są to formularze złożone z jednego przycisku Takie same przyciski występowały już w klasie AccMod. Osobna implementacja każdego 1-przyciskowego formularza prowadzi do niepotrzebnego duplikowania kodu. Czas na REFAKTORING. 43

REFAKTORING Refaktoring modyfikacja kodu bez zmiany jego funkcjonalności. W naszym przypadku modyfikacja klasy AccMod i przeniesienie kodu generującego 1-przyciskowy formularz do klasy HtmlTools. W ten sposób uprościmy metodę AccMod::getModeButton i przeniesiemy kod wykorzystujący HTML do klasy HtmlTools. Dodatkowym bonusem będzie możliwość użycia tego samego kodu w kolejnych modułach. 44

AccMod::getModeButton public function getmodebutton() { $str = "<form action=".$_server['php_self']." method=\"get\">"; if($_session['accmode']=="edit") { $str.= "<input type=\"hidden\" name=\"cmd\" value=\"e-\">"; $str.= "<input type=\"submit\" value=\"edit mode on\"></form>"; else { $str.= "<input type=\"hidden\" name=\"cmd\" value=\"e+\">"; $str.= "<input type=\"submit\" value=\"edit mode off\"></form>"; ; return $str; 45

Refaktoryzacja i testy jednostkowe W celu zwiększenia bezpieczeństwa refaktoringu modyfikowany kod powinien być pokryty testami. Przygotujemy dodatkowe testy dla metody AccMod::getModeButton. Celem testów będzie weryfikacja podstawowych elementów generowanego kodu HTML. 46

AccModeTest public function testeditonbutton() { AccMode::setMode(array("cmd"=>"E+")); $str = AccMode::getModeButton(); $this->assertequals(1,preg_match("/^<form.*form>\$/i",$str)); $this->assertequals(1,preg_match("/<input type=\"hidden\" name=\"cmd\" value=\"e-\">/i",$str)); $this->assertequals(1,preg_match("/<input type=\"submit\" value=\"edit mode on\">/i",$str)); public function testeditoffbutton() { AccMode::setMode(array("cmd"=>"E-")); $str = AccMode::getModeButton(); $this->assertequals(1,preg_match("/^<form.*form>\$/i",$str)); $this->assertequals(1,preg_match("/<input type=\"hidden\" name=\"cmd\" value=\"e\+\">/i",$str)); $this->assertequals(1,preg_match("/<input type=\"submit\" value=\"edit mode off\">/i",$str)); 47

HtmlTools class HtmlTools {... ; public function formbutton($name,$fields) { return $str; Szablon metody formbutton. Metoda powinna zwracać formularz złożony z przycisku o nazwie $name i polach ukrytych zdefiniowanych w tablicy $fields (klucz nazwa pola ukrytego, wartość wartość pola ukrytego) 48

HtmlToolsTest class HtmlToolsTest extends PHPUnit_Framework_TestCase { public function testformbuttonnohidden() { $str = HtmlTools::formButton("test",array()); $this->assertequals(1,preg_match("/^<form.*form>\$/i",$str)); $this->assertequals(0,preg_match("/<input type=\"hidden\" name=/i",$str)); $this->assertequals(1,preg_match("/<input type=\"submit\" value=\"test\">/i",$str)); public function testformbuttononehidden() { $str = HtmlTools::formButton("test",array("h1"=>"v1")); $this->assertequals(1,preg_match("/^<form.*form>\$/i",$str)); $this->assertequals(1,preg_match("/<input type=\"hidden\" name=\"h1\" value=\"v1\">/i",$str)); $this->assertequals(1,preg_match("/<input type=\"submit\" value=\"test\">/i",$str)); public function testformbuttontwohidden() { $str = HtmlTools::formButton("test",array("h1"=>"v1","h2"=>"v2")); $this->assertequals(1,preg_match("/^<form.*form>\$/i",$str)); $this->assertequals(1,preg_match("/<input type=\"hidden\" name=\"h1\" value=\"v1\">/i",$str)); $this->assertequals(1,preg_match("/<input type=\"hidden\" name=\"h2\" value=\"v2\">/i",$str)); $this->assertequals(1,preg_match("/<input type=\"submit\" value=\"test\">/i",$str)); 49

formbutton - implementacja public function formbutton($name,$fields) { $str = "<form action=".$_server['php_self']." method=\"get\">"; foreach($fields as $k=>$v) { $str.= "<input type=\"hidden\" name=\"$k\" value=\"$v\">"; ; $str.= "<input type=\"submit\" value=\"$name\"></form>"; return $str; UNIT TESTS - HtmlTools testformbuttonnohidden testformbuttononehidden testformbuttontwohidden 50

Refaktoryzacja metody AccMode::getModeButton public function getmodebutton() { if($_session['accmode']=="edit") $str = HtmlTools::formButton("Edit mode on",array("cmd"=>"e-")); else $str = HtmlTools::formButton("Edit mode off",array("cmd"=>"e+")); return $str; UNIT TESTS - AccMode... testeditonbutton testeditoffbutton 51

CatModGUI szablon (usunięte metody button*) class CatModGUI { public function formcategory() { public function receivecategory() { public function showcatlist() { ; 52