@@ -57,9 +57,11 @@ public AuditSequenceStrictValidator(AuditReader auditReader, AuditEntryDefinitio
5757 * Internal constructor for direct list initialization (used by tests).
5858 */
5959 AuditSequenceStrictValidator (List <AuditEntryDefinition > expectedDefinitions , List <AuditEntry > actualEntries , AuditReader auditReader ) {
60- this .expectations = expectedDefinitions .stream ()
60+ this .expectations = expectedDefinitions != null
61+ ? expectedDefinitions .stream ()
6162 .map (AuditEntryExpectation ::new )
62- .collect (Collectors .toList ());
63+ .collect (Collectors .toList ())
64+ : new ArrayList <>();
6365 this .auditReader = auditReader ;
6466 this .actualEntries = actualEntries != null ? actualEntries : new ArrayList <>();
6567 }
@@ -77,20 +79,6 @@ public ValidationResult validate() {
7779
7880 allErrors .addAll (getValidationErrors (expectations , actualEntries ));
7981
80- if (expectedSize > actualSize ) {
81- for (int i = actualSize ; i < expectedSize ; i ++) {
82- AuditEntryDefinition def = expectations .get (i ).getDefinition ();
83- allErrors .add (new MissingEntryError (i , def .getChangeId (), def .getState ()));
84- }
85- }
86-
87- if (expectedSize < actualSize ) {
88- for (int i = expectedSize ; i < actualSize ; i ++) {
89- AuditEntry actual = actualEntries .get (i );
90- allErrors .add (new UnexpectedEntryError (i , actual .getTaskId (), actual .getState ()));
91- }
92- }
93-
9482 if (allErrors .isEmpty ()) {
9583 return ValidationResult .success (VALIDATOR_NAME );
9684 }
@@ -100,16 +88,25 @@ public ValidationResult validate() {
10088
10189 private static List <ValidationError > getValidationErrors (List <AuditEntryExpectation > expectedEntries , List <AuditEntry > actualEntries ) {
10290 List <ValidationError > allErrors = new ArrayList <>();
103- if (expectedEntries == null || expectedEntries .isEmpty ()) {
91+ if (expectedEntries .isEmpty ()) {
10492 return allErrors ;
10593 }
106- int actualSize = actualEntries != null ? actualEntries .size () : 0 ;
107- int limit = Math .min (expectedEntries .size (), actualSize );
94+ int actualSize = actualEntries .size ();
95+ int limit = Math .max (expectedEntries .size (), actualSize );
96+
10897 for (int i = 0 ; i < limit ; i ++) {
109- AuditEntryExpectation expected = expectedEntries .get (i );
110- AuditEntry actual = actualEntries .get (i );
111- List <FieldMismatchError > entryErrors = expected .compareWith (actual );
112- allErrors .addAll (entryErrors );
98+ AuditEntryExpectation expected = i < expectedEntries .size () ? expectedEntries .get (i ) : null ;
99+ AuditEntry actual = i < actualEntries .size () ? actualEntries .get (i ) : null ;
100+ if ( expected != null && actual != null ) {
101+ allErrors .addAll (expected .compareWith (actual ));
102+ } else if ( expected != null ) {
103+ AuditEntryDefinition def = expected .getDefinition ();
104+ allErrors .add (new MissingEntryError (i , def .getChangeId (), def .getState ()));
105+ } else {
106+ assert actual != null ;
107+ allErrors .add (new UnexpectedEntryError (i , actual .getTaskId (), actual .getState ()));
108+ }
109+
113110 }
114111 return allErrors ;
115112 }
0 commit comments