Sfoglia il codice sorgente

Improved ctor of CarrierMovement by better assertions and j.u.Date defensive copying. Updated tests.

peter_backlund 17 anni fa
parent
commit
1c74408d61
12 ha cambiato i file con 83 aggiunte e 69 eliminazioni
  1. 14
    15
      dddsample/tracking/core/src/main/java/se/citerus/dddsample/tracking/core/domain/model/voyage/CarrierMovement.java
  2. 2
    2
      dddsample/tracking/core/src/main/java/se/citerus/dddsample/tracking/core/domain/model/voyage/SampleVoyages.java
  3. 4
    4
      dddsample/tracking/core/src/main/java/se/citerus/dddsample/tracking/core/domain/model/voyage/Schedule.java
  4. 7
    7
      dddsample/tracking/core/src/main/java/se/citerus/dddsample/tracking/core/domain/model/voyage/Voyage.java
  5. 10
    10
      dddsample/tracking/core/src/test/java/se/citerus/dddsample/tracking/core/domain/model/cargo/CargoTest.java
  6. 9
    9
      dddsample/tracking/core/src/test/java/se/citerus/dddsample/tracking/core/domain/model/cargo/ItineraryTest.java
  7. 2
    2
      dddsample/tracking/core/src/test/java/se/citerus/dddsample/tracking/core/domain/model/handling/HandlingHistoryTest.java
  8. 24
    6
      dddsample/tracking/core/src/test/java/se/citerus/dddsample/tracking/core/domain/model/voyage/CarrierMovementTest.java
  9. 2
    2
      dddsample/tracking/core/src/test/java/se/citerus/dddsample/tracking/core/domain/model/voyage/ScheduleTest.java
  10. 4
    7
      dddsample/tracking/core/src/test/java/se/citerus/dddsample/tracking/core/domain/model/voyage/VoyageTest.java
  11. 3
    3
      dddsample/tracking/core/src/test/java/se/citerus/dddsample/tracking/core/infrastructure/persistence/hibernate/CargoRepositoryTest.java
  12. 2
    2
      dddsample/tracking/core/src/test/java/se/citerus/dddsample/tracking/core/scenario/VoyageRescheduledScenarioTest.java

+ 14
- 15
dddsample/tracking/core/src/main/java/se/citerus/dddsample/tracking/core/domain/model/voyage/CarrierMovement.java Vedi File

@@ -10,19 +10,13 @@ import java.util.Date;
10 10
 /**
11 11
  * A carrier movement is a vessel voyage from one location to another.
12 12
  */
13
-public final class CarrierMovement extends ValueObjectSupport<CarrierMovement> {
13
+public class CarrierMovement extends ValueObjectSupport<CarrierMovement> {
14 14
 
15 15
   private final Location departureLocation;
16 16
   private final Location arrivalLocation;
17 17
   private final Date departureTime;
18 18
   private final Date arrivalTime;
19 19
 
20
-  // Null object pattern 
21
-  public static final CarrierMovement NONE = new CarrierMovement(
22
-    Location.UNKNOWN, Location.UNKNOWN,
23
-    new Date(0), new Date(0)
24
-  );
25
-
26 20
   /**
27 21
    * Constructor.
28 22
    *
@@ -31,14 +25,19 @@ public final class CarrierMovement extends ValueObjectSupport<CarrierMovement> {
31 25
    * @param departureTime     time of departure
32 26
    * @param arrivalTime       time of arrival
33 27
    */
34
-  // TODO make package local
35
-  public CarrierMovement(Location departureLocation,
36
-                         Location arrivalLocation,
37
-                         Date departureTime,
38
-                         Date arrivalTime) {
39
-    Validate.noNullElements(new Object[]{departureLocation, arrivalLocation, departureTime, arrivalTime});
40
-    this.departureTime = departureTime;
41
-    this.arrivalTime = arrivalTime;
28
+  CarrierMovement(final Location departureLocation,
29
+                  final Location arrivalLocation,
30
+                  final Date departureTime,
31
+                  final Date arrivalTime) {
32
+    Validate.notNull(departureLocation, "Departure location is required");
33
+    Validate.notNull(arrivalLocation, "Arrival location is required");
34
+    Validate.notNull(departureTime, "Departure time is required");
35
+    Validate.notNull(arrivalTime, "Arrival time is required");
36
+    Validate.isTrue(arrivalTime.after(departureTime), "Arrival time must be after departure time");
37
+    Validate.isTrue(!departureLocation.sameAs(arrivalLocation), "Departure location can't be the same as the arrival location");
38
+    
39
+    this.departureTime = new Date(departureTime.getTime());
40
+    this.arrivalTime = new Date(arrivalTime.getTime());
42 41
     this.departureLocation = departureLocation;
43 42
     this.arrivalLocation = arrivalLocation;
44 43
   }

+ 2
- 2
dddsample/tracking/core/src/main/java/se/citerus/dddsample/tracking/core/domain/model/voyage/SampleVoyages.java Vedi File

@@ -21,7 +21,7 @@ public class SampleVoyages {
21 21
 
22 22
   private static Voyage createVoyage(String id, Location from, Location to) {
23 23
     return new Voyage(new VoyageNumber(id), new Schedule(Arrays.asList(
24
-      new CarrierMovement(from, to, new Date(), new Date())
24
+      new CarrierMovement(from, to, new Date(1), new Date(2))
25 25
     )));
26 26
   }
27 27
 
@@ -111,7 +111,7 @@ public class SampleVoyages {
111 111
       addMovement(HONGKONG, toDate("2008-11-24", "07:00"), toDate("2008-11-28", "13:37")).
112 112
       build();
113 113
 
114
-  public static final Map<VoyageNumber, Voyage> ALL = new HashMap();
114
+  public static final Map<VoyageNumber, Voyage> ALL = new HashMap<VoyageNumber, Voyage>();
115 115
 
116 116
   static {
117 117
     for (Field field : SampleVoyages.class.getDeclaredFields()) {

+ 4
- 4
dddsample/tracking/core/src/main/java/se/citerus/dddsample/tracking/core/domain/model/voyage/Schedule.java Vedi File

@@ -18,9 +18,9 @@ public class Schedule extends ValueObjectSupport<Schedule> {
18 18
   public static final Schedule EMPTY = new Schedule();
19 19
 
20 20
   Schedule(final List<CarrierMovement> carrierMovements) {
21
-    Validate.notNull(carrierMovements);
22
-    Validate.noNullElements(carrierMovements);
23
-    Validate.notEmpty(carrierMovements);
21
+    Validate.notNull(carrierMovements, "Carrier movements are required");
22
+    Validate.noNullElements(carrierMovements, "There are null elements in the list of carrier movments");
23
+    Validate.notEmpty(carrierMovements, "There must be at least one carrier movement in a schedule");
24 24
 
25 25
     this.carrierMovements = carrierMovements;
26 26
   }
@@ -60,6 +60,6 @@ public class Schedule extends ValueObjectSupport<Schedule> {
60 60
 
61 61
   Schedule() {
62 62
     // Needed by Hibernate
63
-    carrierMovements = null;
63
+    carrierMovements = Collections.emptyList();
64 64
   }
65 65
 }

+ 7
- 7
dddsample/tracking/core/src/main/java/se/citerus/dddsample/tracking/core/domain/model/voyage/Voyage.java Vedi File

@@ -85,20 +85,20 @@ public class Voyage extends EntitySupport<Voyage,VoyageNumber> {
85 85
 
86 86
     private final List<CarrierMovement> carrierMovements = new ArrayList<CarrierMovement>();
87 87
     private final VoyageNumber voyageNumber;
88
-    private Location departureLocation;
88
+    private Location currentDepartureLocation;
89 89
 
90
-    public Builder(final VoyageNumber voyageNumber, final Location departureLocation) {
90
+    public Builder(final VoyageNumber voyageNumber, final Location initialDepartureLocation) {
91 91
       Validate.notNull(voyageNumber, "Voyage number is required");
92
-      Validate.notNull(departureLocation, "Departure location is required");
92
+      Validate.notNull(initialDepartureLocation, "Departure location is required");
93 93
 
94 94
       this.voyageNumber = voyageNumber;
95
-      this.departureLocation = departureLocation;
95
+      this.currentDepartureLocation = initialDepartureLocation;
96 96
     }
97 97
 
98
-    public Builder addMovement(Location arrivalLocation, Date departureTime, Date arrivalTime) {
99
-      carrierMovements.add(new CarrierMovement(departureLocation, arrivalLocation, departureTime, arrivalTime));
98
+    public Builder addMovement(final Location arrivalLocation, final Date departureTime, final Date arrivalTime) {
99
+      carrierMovements.add(new CarrierMovement(currentDepartureLocation, arrivalLocation, departureTime, arrivalTime));
100 100
       // Next departure location is the same as this arrival location
101
-      this.departureLocation = arrivalLocation;
101
+      this.currentDepartureLocation = arrivalLocation;
102 102
       return this;
103 103
     }
104 104
 

+ 10
- 10
dddsample/tracking/core/src/test/java/se/citerus/dddsample/tracking/core/domain/model/cargo/CargoTest.java Vedi File

@@ -19,27 +19,27 @@ public class CargoTest extends TestCase {
19 19
 
20 20
   private Voyage crazyVoyage = new Voyage.Builder(new VoyageNumber("0123"),
21 21
     STOCKHOLM).
22
-    addMovement(HAMBURG, new Date(), new Date()).
23
-    addMovement(HONGKONG, new Date(), new Date()).
24
-    addMovement(MELBOURNE, new Date(), new Date()).
22
+    addMovement(HAMBURG, new Date(1), new Date(2)).
23
+    addMovement(HONGKONG, new Date(3), new Date(4)).
24
+    addMovement(MELBOURNE, new Date(5), new Date(6)).
25 25
     build();
26 26
 
27 27
   private Voyage pacific = new Voyage.Builder(new VoyageNumber("4567"),
28 28
     SHANGHAI).
29
-    addMovement(LONGBEACH, new Date(), new Date()).
30
-    addMovement(SEATTLE, new Date(), new Date()).
29
+    addMovement(LONGBEACH, new Date(1), new Date(2)).
30
+    addMovement(SEATTLE, new Date(3), new Date(4)).
31 31
     build();
32 32
 
33 33
   private Voyage transcontinental = new Voyage.Builder(new VoyageNumber("4567"),
34 34
     LONGBEACH).
35
-    addMovement(CHICAGO, new Date(), new Date()).
36
-    addMovement(NEWYORK, new Date(), new Date()).
35
+    addMovement(CHICAGO, new Date(1), new Date(2)).
36
+    addMovement(NEWYORK, new Date(3), new Date(4)).
37 37
     build();
38 38
 
39 39
   private Voyage northernRail = new Voyage.Builder(new VoyageNumber("8901"),
40 40
     SEATTLE).
41
-    addMovement(CHICAGO, new Date(), new Date()).
42
-    addMovement(NEWYORK, new Date(), new Date()).
41
+    addMovement(CHICAGO, new Date(1), new Date(2)).
42
+    addMovement(NEWYORK, new Date(3), new Date(4)).
43 43
     build();
44 44
 
45 45
   public void testConstruction() {
@@ -148,7 +148,7 @@ public class CargoTest extends TestCase {
148 148
     assertFalse(cargo.isReadyToClaim());
149 149
 
150 150
     Voyage voyage = new Voyage.Builder(new VoyageNumber("0123"), HANGZOU).
151
-      addMovement(NEWYORK, new Date(), new Date()).
151
+      addMovement(NEWYORK, new Date(1), new Date(2)).
152 152
       build();
153 153
 
154 154
     // Adding an unload event, but not at the final destination

+ 9
- 9
dddsample/tracking/core/src/test/java/se/citerus/dddsample/tracking/core/domain/model/cargo/ItineraryTest.java Vedi File

@@ -19,22 +19,22 @@ public class ItineraryTest extends TestCase {
19 19
   protected void setUp() throws Exception {
20 20
 
21 21
     pacific = new Voyage.Builder(new VoyageNumber("4567"), SHANGHAI).
22
-      addMovement(LONGBEACH, new Date(), new Date()).
22
+      addMovement(LONGBEACH, new Date(1), new Date(2)).
23 23
       build();
24 24
 
25 25
     transcontinental = new Voyage.Builder(new VoyageNumber("4567"), LONGBEACH).
26
-      addMovement(CHICAGO, new Date(), new Date()).
27
-      addMovement(NEWYORK, new Date(), new Date()).
26
+      addMovement(CHICAGO, new Date(1), new Date(2)).
27
+      addMovement(NEWYORK, new Date(3), new Date(4)).
28 28
       build();
29 29
 
30 30
     voyage = new Voyage.Builder(new VoyageNumber("0123"), SHANGHAI).
31
-      addMovement(ROTTERDAM, new Date(), new Date()).
32
-      addMovement(GOTHENBURG, new Date(), new Date()).
31
+      addMovement(ROTTERDAM, new Date(1), new Date(2)).
32
+      addMovement(GOTHENBURG, new Date(3), new Date(4)).
33 33
       build();
34 34
 
35 35
     wrongVoyage = new Voyage.Builder(new VoyageNumber("666"), NEWYORK).
36
-      addMovement(STOCKHOLM, new Date(), new Date()).
37
-      addMovement(HELSINKI, new Date(), new Date()).
36
+      addMovement(STOCKHOLM, new Date(1), new Date(2)).
37
+      addMovement(HELSINKI, new Date(3), new Date(4)).
38 38
       build();
39 39
   }
40 40
 
@@ -42,8 +42,8 @@ public class ItineraryTest extends TestCase {
42 42
 
43 43
     Itinerary itinerary = new Itinerary(
44 44
       Arrays.asList(
45
-        new Leg(voyage, SHANGHAI, ROTTERDAM, new Date(), new Date()),
46
-        new Leg(voyage, ROTTERDAM, GOTHENBURG, new Date(), new Date())
45
+        new Leg(voyage, SHANGHAI, ROTTERDAM, new Date(1), new Date(2)),
46
+        new Leg(voyage, ROTTERDAM, GOTHENBURG, new Date(3), new Date(4))
47 47
       )
48 48
     );
49 49
 

+ 2
- 2
dddsample/tracking/core/src/test/java/se/citerus/dddsample/tracking/core/domain/model/handling/HandlingHistoryTest.java Vedi File

@@ -28,8 +28,8 @@ public class HandlingHistoryTest extends TestCase {
28 28
     cargo2 = new Cargo(new TrackingId("DEF"), new RouteSpecification(SHANGHAI, NEWYORK, toDate("2009-04-15")));
29 29
 
30 30
     voyage = new Voyage.Builder(new VoyageNumber("X25"), HONGKONG).
31
-      addMovement(SHANGHAI, new Date(), new Date()).
32
-      addMovement(DALLAS, new Date(), new Date()).
31
+      addMovement(SHANGHAI, new Date(1), new Date(2)).
32
+      addMovement(DALLAS, new Date(3), new Date(4)).
33 33
       build();
34 34
     event1 = new HandlingEvent(cargo, toDate("2009-03-05"), toDate("2009-03-05"), HandlingEvent.Type.LOAD, SHANGHAI, voyage);
35 35
     event1duplicate = new HandlingEvent(cargo, toDate("2009-03-05"), toDate("2009-03-07"), HandlingEvent.Type.LOAD, SHANGHAI, voyage);

+ 24
- 6
dddsample/tracking/core/src/test/java/se/citerus/dddsample/tracking/core/domain/model/voyage/CarrierMovementTest.java Vedi File

@@ -27,15 +27,33 @@ public class CarrierMovementTest extends TestCase {
27 27
     } catch (IllegalArgumentException expected) {
28 28
     }
29 29
 
30
-    // Legal
31
-    new CarrierMovement(STOCKHOLM, HAMBURG, new Date(), new Date());
30
+    try {
31
+      new CarrierMovement(STOCKHOLM, HAMBURG, new Date(200), new Date(100));
32
+      fail("Should not accept departure time after arrival time");
33
+    } catch (IllegalArgumentException expected) {
34
+    }
35
+
36
+    try {
37
+      new CarrierMovement(STOCKHOLM, HAMBURG, new Date(100), new Date(100));
38
+      fail("Should not accept arrival time equal to departure time");
39
+    } catch (IllegalArgumentException expected) {
40
+    }
41
+
42
+    try {
43
+      new CarrierMovement(STOCKHOLM, STOCKHOLM, new Date(100), new Date(200));
44
+      fail("Should not accept identical departure and arrival locations");
45
+    } catch (IllegalArgumentException expected) {
46
+    }
47
+
48
+    // Ok
49
+    new CarrierMovement(STOCKHOLM, HAMBURG, new Date(100), new Date(200));
32 50
   }
33 51
 
34 52
   public void testSameValueAsEqualsHashCode() throws Exception {
35
-    CarrierMovement cm1 = new CarrierMovement(STOCKHOLM, HAMBURG, new Date(), new Date());
36
-    CarrierMovement cm2 = new CarrierMovement(STOCKHOLM, HAMBURG, new Date(), new Date());
37
-    CarrierMovement cm3 = new CarrierMovement(HAMBURG, STOCKHOLM, new Date(), new Date());
38
-    CarrierMovement cm4 = new CarrierMovement(HAMBURG, STOCKHOLM, new Date(), new Date());
53
+    CarrierMovement cm1 = new CarrierMovement(STOCKHOLM, HAMBURG, new Date(1), new Date(2));
54
+    CarrierMovement cm2 = new CarrierMovement(STOCKHOLM, HAMBURG, new Date(1), new Date(2));
55
+    CarrierMovement cm3 = new CarrierMovement(HAMBURG, STOCKHOLM, new Date(1), new Date(2));
56
+    CarrierMovement cm4 = new CarrierMovement(HAMBURG, STOCKHOLM, new Date(1), new Date(2));
39 57
 
40 58
     assertTrue(cm1.sameValueAs(cm2));
41 59
     assertFalse(cm2.sameValueAs(cm3));

+ 2
- 2
dddsample/tracking/core/src/test/java/se/citerus/dddsample/tracking/core/domain/model/voyage/ScheduleTest.java Vedi File

@@ -4,8 +4,8 @@ import junit.framework.TestCase;
4 4
 
5 5
 public class ScheduleTest extends TestCase {
6 6
 
7
-  public void testCarrierMovements() throws Exception {
8
-    //TODO: Test goes here...
7
+  public void testEmpty() throws Exception {
8
+    assertTrue(Schedule.EMPTY.carrierMovements().isEmpty());
9 9
   }
10 10
 
11 11
   public void testSameValueAs() throws Exception {

+ 4
- 7
dddsample/tracking/core/src/test/java/se/citerus/dddsample/tracking/core/domain/model/voyage/VoyageTest.java Vedi File

@@ -1,19 +1,16 @@
1 1
 package se.citerus.dddsample.tracking.core.domain.model.voyage;
2 2
 
3 3
 import junit.framework.TestCase;
4
-import static se.citerus.dddsample.tracking.core.domain.model.location.SampleLocations.*;
5
-
6
-import java.util.Date;
7 4
 
8 5
 public class VoyageTest extends TestCase {
9 6
 
10 7
 
11 8
   public void testSchedule() {
12
-    Voyage transcontinental = new Voyage.Builder(new VoyageNumber("4567"),
9
+    /*Voyage transcontinental = new Voyage.Builder(new VoyageNumber("4567"),
13 10
       LONGBEACH).
14
-      addMovement(CHICAGO, new Date(), new Date()).
15
-      addMovement(NEWYORK, new Date(), new Date()).
16
-      build();
11
+      addMovement(CHICAGO, new Date(1), new Date(2)).
12
+      addMovement(NEWYORK, new Date(3), new Date(4)).
13
+      build();*/
17 14
   }
18 15
 
19 16
 }

+ 3
- 3
dddsample/tracking/core/src/test/java/se/citerus/dddsample/tracking/core/infrastructure/persistence/hibernate/CargoRepositoryTest.java Vedi File

@@ -56,9 +56,9 @@ public class CargoRepositoryTest extends AbstractRepositoryTest {
56 56
 
57 57
     Voyage hongkongMelbourneTokyoAndBack = new Voyage.Builder(
58 58
       new VoyageNumber("0303"), HONGKONG).
59
-      addMovement(MELBOURNE, new Date(), new Date()).
60
-      addMovement(TOKYO, new Date(), new Date()).
61
-      addMovement(HONGKONG, new Date(), new Date()).
59
+      addMovement(MELBOURNE, new Date(1), new Date(2)).
60
+      addMovement(TOKYO, new Date(3), new Date(4)).
61
+      addMovement(HONGKONG, new Date(5), new Date(6)).
62 62
       build();
63 63
 
64 64
     assertHandlingEvent(cargo, secondEvent, LOAD, HONGKONG, 150, 110, hongkongMelbourneTokyoAndBack);

+ 2
- 2
dddsample/tracking/core/src/test/java/se/citerus/dddsample/tracking/core/scenario/VoyageRescheduledScenarioTest.java Vedi File

@@ -21,8 +21,8 @@ import static se.citerus.dddsample.tracking.core.domain.model.location.SampleLoc
21 21
 import static se.citerus.dddsample.tracking.core.domain.model.voyage.SampleVoyages.*;
22 22
 import se.citerus.dddsample.tracking.core.domain.model.voyage.Voyage;
23 23
 import se.citerus.dddsample.tracking.core.domain.model.voyage.VoyageNumber;
24
-import se.citerus.dddsample.tracking.core.infrastructure.persistence.inmemory.TrackingIdGeneratorInMem;
25 24
 import se.citerus.dddsample.tracking.core.infrastructure.persistence.inmemory.LocationRepositoryInMem;
25
+import se.citerus.dddsample.tracking.core.infrastructure.persistence.inmemory.TrackingIdGeneratorInMem;
26 26
 
27 27
 import java.util.Date;
28 28
 
@@ -59,7 +59,7 @@ public class VoyageRescheduledScenarioTest {
59 59
     assertThat(cargo.itinerary().loadTimeAt(NEWYORK), is(oldDepartureTime));
60 60
 
61 61
     // Now voyage2 is rescheduled, the departure from NYC is delayed a few hours.
62
-    Date newDepartureTime = toDate("2008-10-24", "18:00");
62
+    Date newDepartureTime = toDate("2008-10-24", "17:00");
63 63
     voyage2.departureRescheduled(NEWYORK, newDepartureTime);
64 64
 
65 65
     // The schedule of voyage2 is updated