diff --git a/abstract-document/src/main/java/com/iluwatar/abstractdocument/AbstractDocument.java b/abstract-document/src/main/java/com/iluwatar/abstractdocument/AbstractDocument.java index 665729008..701906041 100644 --- a/abstract-document/src/main/java/com/iluwatar/abstractdocument/AbstractDocument.java +++ b/abstract-document/src/main/java/com/iluwatar/abstractdocument/AbstractDocument.java @@ -36,41 +36,67 @@ import java.util.stream.Stream; */ public abstract class AbstractDocument implements Document { - private final Map properties; + private final Map documentProperties; protected AbstractDocument(Map properties) { Objects.requireNonNull(properties, "properties map is required"); - this.properties = properties; + this.documentProperties = properties; } @Override public Void put(String key, Object value) { - properties.put(key, value); + documentProperties.put(key, value); return null; } @Override public Object get(String key) { - return properties.get(key); + return documentProperties.get(key); } @Override - public Stream children(String key, Function, T> constructor) { + public Stream children(String key, Function, T> childConstructor) { return Stream.ofNullable(get(key)) - .filter(Objects::nonNull) - .map(el -> (List>) el) - .findAny() - .stream() - .flatMap(Collection::stream) - .map(constructor); + .filter(Objects::nonNull) + .map(el -> (List>) el) + .findAny() + .stream() + .flatMap(Collection::stream) + .map(childConstructor); } @Override public String toString() { + return buildStringRepresentation(); + } + + private String buildStringRepresentation() { var builder = new StringBuilder(); builder.append(getClass().getName()).append("["); - properties.forEach((key, value) -> builder.append("[").append(key).append(" : ").append(value) - .append("]")); + + // Explaining variable for document properties map + Map documentProperties = this.documentProperties; + + // Explaining variable for the size of document properties map + int numProperties = documentProperties.size(); + + // Explaining variable for tracking the current property index + int currentPropertyIndex = 0; + + // Iterate over document properties map + for (Map.Entry entry : documentProperties.entrySet()) { + String key = entry.getKey(); + Object value = entry.getValue(); + + // Append key-value pair + builder.append("[").append(key).append(" : ").append(value).append("]"); + + // Add comma if not last property + if (++currentPropertyIndex < numProperties) { + builder.append(", "); + } + } + builder.append("]"); return builder.toString(); } diff --git a/abstract-document/src/test/java/com/iluwatar/abstractdocument/AbstractDocumentTest.java b/abstract-document/src/test/java/com/iluwatar/abstractdocument/AbstractDocumentTest.java index 249f01f64..a86e6273d 100644 --- a/abstract-document/src/test/java/com/iluwatar/abstractdocument/AbstractDocumentTest.java +++ b/abstract-document/src/test/java/com/iluwatar/abstractdocument/AbstractDocumentTest.java @@ -80,4 +80,46 @@ class AbstractDocumentTest { assertTrue(document.toString().contains(VALUE)); } + @Test + void shouldHandleExceptionDuringConstruction() { + Map invalidProperties = null; // Invalid properties, causing NullPointerException + + // Throw null pointer exception + assertThrows(NullPointerException.class, () -> { + // Attempt to construct a document with invalid properties + new DocumentImplementation(invalidProperties); + }); + } + + @Test + void shouldPutAndGetNestedDocument() { + // Creating a nested document + DocumentImplementation nestedDocument = new DocumentImplementation(new HashMap<>()); + nestedDocument.put("nestedKey", "nestedValue"); + + + document.put("nested", nestedDocument); + + // Retrieving the nested document + DocumentImplementation retrievedNestedDocument = (DocumentImplementation) document.get("nested"); + + assertNotNull(retrievedNestedDocument); + assertEquals("nestedValue", retrievedNestedDocument.get("nestedKey")); + } + + @Test + void shouldUpdateExistingValue() { + // Arrange + final String key = "key"; + final String originalValue = "originalValue"; + final String updatedValue = "updatedValue"; + + document.put(key, originalValue); + + // Updating the value + document.put(key, updatedValue); + + //Verifying that the updated value is retrieved correctly + assertEquals(updatedValue, document.get(key)); + } }