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