Lab 2

Lab 2 SVV

JUnit 2

Consideram clasa de mai jos

   1 class VVSDate {
   2     public VVSDate(int day, int month, int year);
   3     public int getDays(VVSDate other);
   4 }

Construiți o clasă VVSDate cu o metodă care returnează distanța īn zile (pozitivă sau negativă) pānă la o alta dată.

Scrieți o clasă VVSDateTest și definiți īn ea cel puțin două teste īnainte de a scrie cod funcțional īn VVSDate.

Continuați apoi cu adăugarea de funcționalitate și de teste.

Numărul de zile se poate lua de pe internet tastānd īn google "days between dates" (atenție Google ia īn considerare data de cānd a īnceput aplicarea calendarului Gregorian (1582) pe cānd VVSDate consideră că acest calendar a fost aplicat īntotdeauna).

Completaţi pānă la o suită de teste pe care o consideraţi suficientă pentru toate cazurile reprezentative.

Dacă īn cursul programării se definesc alte metode ajutătoare se vor scrie teste unitare īnaintea implementării metodelor (de ex. metoda care să spună dacă un an e bisect sau nu.

   1 public class VVSDate {
   2         private int day,month,year;
   3 
   4         public VVSDate(int day, int month, int year) {
   5                 this.day = day;
   6                 this.month = month;
   7                 this.year = year;
   8         }
   9 
  10         public int getDays(VVSDate other) {
  11                 return daysSinceZero() - other.daysSinceZero();
  12         }
  13 
  14         private int daysSinceZero() {
  15                 int[] daySums = new int[]{0,31,59,90,120,151,181,212,243,273,304,334,365};
  16                 int d = day + daySums[month-1] + (year*365) + year/4 - year/100 + year/400;
  17                 if ((year%400==0 || (year%4==0 && year%100!=0)) && month<=2)
  18                         d--;
  19                 return d;
  20         }
  21 
  22 }

Problema Alternativa

Consideram clasa de mai jos

   1 class Promotion {
   2    private Calendar startDate = null;
   3    private Calendar endDate = null;
   4    private String weekdays = "1,2,3...7"; //1=Monday
   5    private String startHour = "10:30";
   6    private String endHour = "12:00";
   7 
   8    public boolean isActive(){
   9        Calendar now = Calendar.getInstance();
  10        return isActiveHelper(now);
  11    }
  12 
  13    boolean isActiveHelper(Calendar c){
  14        ...
  15    }
  16 }

Clasa Promotion are o metoda isActive() care returnează true dacă obiectul promoție este activ la momentul actual, false altfel. Deoarece testele pentru o astfel de metoda ar trece la momentul scrierii, dar ar putea să cadă ulterior, am adăugat și metoda isActiveHelper() care e testabilă prin intermediul argumentului de tip Calendar pe care īl primește.

Implementați metoda boolean isActiveHelper(Calendar c) avānd īn vedere că oricare din atributele clasei pot să fie nule. De exemplu:

   1 Promotion(null, null, "1,2", "08:00", "10:00"); //active on any Monday and Tuesday from 8 to 12 AM.
   2 Calendar d1 = Calendar.getInstance();
   3 d1.set(2011,d1.NOVEMBER,1);
   4 Promotion(null, d1, "6,7", null, "12:00"); //active until the 1st of November 2011 in weekend until 12 AM.

Completaţi pānă la o suită de teste pe care o consideraţi suficientă pentru toate cazurile reprezentative.

Urmați principiile de mai jos

  • implementați īn paralel codul și testele
  • dați testelor nume semnificative - care sa reflecte/descrie ce intenționați să testați
  • scrieți cate UN test pentru fiecare lucru pe care doriți să īl testați

Cateva link-uri utile pentru implementare:
https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html
https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.Builder.html