WmlUtils.java

1
package pro.verron.officestamper.utils;
2
3
import jakarta.xml.bind.JAXBElement;
4
import org.docx4j.TraversalUtil;
5
import org.docx4j.XmlUtils;
6
import org.docx4j.finders.CommentFinder;
7
import org.docx4j.openpackaging.exceptions.Docx4JException;
8
import org.docx4j.openpackaging.exceptions.InvalidFormatException;
9
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
10
import org.docx4j.openpackaging.parts.PartName;
11
import org.docx4j.openpackaging.parts.WordprocessingML.CommentsPart;
12
import org.docx4j.wml.*;
13
import org.jvnet.jaxb2_commons.ppp.Child;
14
import pro.verron.officestamper.api.OfficeStamperException;
15
16
import java.math.BigInteger;
17
import java.util.Collection;
18
import java.util.List;
19
import java.util.Objects;
20
import java.util.Optional;
21
import java.util.function.Predicate;
22
23
/// Utility class with methods to help in the interaction with WordprocessingMLPackage documents
24
/// and their elements, such as comments, parents, and child elements.
25
public final class WmlUtils {
26
    private WmlUtils() {
27
        throw new OfficeStamperException("Utility class shouldn't be instantiated");
28
    }
29
30
    /// Attempts to find the first parent of a given child element that is an instance of the specified class within
31
    /// the defined search depth.
32
    ///
33
    /// @param child the child element from which the search for a parent begins.
34
    /// @param clazz the class type to match for the parent
35
    /// @param depth the maximum amount levels to traverse up the parent hierarchy
36
    /// @param <T>   the type of the parent class to search for
37
    ///
38
    /// @return an Optional containing the first parent matching the specified class, or an empty Optional if no match
39
    /// found.
40
    public static <T> Optional<T> getFirstParentWithClass(Child child, Class<T> clazz, int depth) {
41
        var parent = child.getParent();
42
        var currentDepth = 0;
43 2 1. getFirstParentWithClass : changed conditional boundary → SURVIVED
2. getFirstParentWithClass : negated conditional → KILLED
        while (currentDepth <= depth) {
44 1 1. getFirstParentWithClass : Changed increment from 1 to -1 → SURVIVED
            currentDepth++;
45 1 1. getFirstParentWithClass : negated conditional → KILLED
            if (parent == null) return Optional.empty();
46 2 1. getFirstParentWithClass : negated conditional → KILLED
2. getFirstParentWithClass : replaced return value with Optional.empty for pro/verron/officestamper/utils/WmlUtils::getFirstParentWithClass → KILLED
            if (clazz.isInstance(parent)) return Optional.of(clazz.cast(parent));
47 1 1. getFirstParentWithClass : negated conditional → TIMED_OUT
            if (parent instanceof Child next) parent = next.getParent();
48
        }
49
        return Optional.empty();
50
    }
51
52
    /// Extracts a list of comment elements from the specified WordprocessingMLPackage document.
53
    ///
54
    /// @param document the WordprocessingMLPackage document from which to extract comment elements
55
    ///
56
    /// @return a list of Child objects representing the extracted comment elements
57
    public static List<Child> extractCommentElements(WordprocessingMLPackage document) {
58
        var commentFinder = new CommentFinder();
59 1 1. extractCommentElements : removed call to org/docx4j/TraversalUtil::visit → KILLED
        TraversalUtil.visit(document, true, commentFinder);
60 1 1. extractCommentElements : replaced return value with Collections.emptyList for pro/verron/officestamper/utils/WmlUtils::extractCommentElements → KILLED
        return commentFinder.getCommentElements();
61
    }
62
63
    /// Finds a comment with the given ID in the specified WordprocessingMLPackage document.
64
    ///
65
    /// @param document the WordprocessingMLPackage document to search for the comment
66
    /// @param id       the ID of the comment to find
67
    ///
68
    /// @return an Optional containing the Comment if found, or an empty Optional if not found.
69
    public static Optional<Comments.Comment> findComment(WordprocessingMLPackage document, BigInteger id) {
70
        var name = getPartName("/word/comments.xml");
71
        var parts = document.getParts();
72
        var wordComments = (CommentsPart) parts.get(name);
73
        var comments = getComments(wordComments);
74 1 1. findComment : replaced return value with Optional.empty for pro/verron/officestamper/utils/WmlUtils::findComment → KILLED
        return comments.getComment()
75
                       .stream()
76
                       .filter(idEqual(id))
77
                       .findFirst();
78
    }
79
80
    private static PartName getPartName(String partName) {
81
        try {
82 1 1. getPartName : replaced return value with null for pro/verron/officestamper/utils/WmlUtils::getPartName → KILLED
            return new PartName(partName);
83
        } catch (InvalidFormatException e) {
84
            throw new OfficeStamperException(e);
85
        }
86
    }
87
88
    private static Comments getComments(CommentsPart wordComments) {
89
        try {
90 1 1. getComments : replaced return value with null for pro/verron/officestamper/utils/WmlUtils::getComments → KILLED
            return wordComments.getContents();
91
        } catch (Docx4JException e) {
92
            throw new OfficeStamperException(e);
93
        }
94
    }
95
96
    private static Predicate<Comments.Comment> idEqual(BigInteger id) {
97 1 1. idEqual : replaced return value with null for pro/verron/officestamper/utils/WmlUtils::idEqual → KILLED
        return comment -> {
98
            var commentId = comment.getId();
99 2 1. lambda$idEqual$0 : replaced boolean return with false for pro/verron/officestamper/utils/WmlUtils::lambda$idEqual$0 → KILLED
2. lambda$idEqual$0 : replaced boolean return with true for pro/verron/officestamper/utils/WmlUtils::lambda$idEqual$0 → KILLED
            return commentId.equals(id);
100
        };
101
    }
102
103
104
    /// Removes the specified child element from its parent container.
105
    /// Depending on the type of the parent element, the removal process
106
    /// is delegated to the appropriate helper method. If the child is
107
    /// contained within a table cell and the cell is empty after removal,
108
    /// an empty paragraph is added to the cell.
109
    ///
110
    /// @param child the child element to be removed
111
    ///
112
    /// @throws OfficeStamperException if the parent of the child element is of an unexpected type
113
    public static void remove(Child child) {
114
        switch (child.getParent()) {
115 1 1. remove : removed call to pro/verron/officestamper/utils/WmlUtils::remove → KILLED
            case ContentAccessor parent -> remove(parent, child);
116 1 1. remove : removed call to pro/verron/officestamper/utils/WmlUtils::remove → KILLED
            case CTFootnotes parent -> remove(parent, child);
117 1 1. remove : removed call to pro/verron/officestamper/utils/WmlUtils::remove → KILLED
            case CTEndnotes parent -> remove(parent, child);
118 1 1. remove : removed call to pro/verron/officestamper/utils/WmlUtils::remove → NO_COVERAGE
            case SdtRun parent -> remove(parent, child);
119
            default -> throw new OfficeStamperException("Unexpected value: " + child.getParent());
120
        }
121 1 1. remove : negated conditional → KILLED
        if (child.getParent() instanceof Tc cell)
122 1 1. remove : removed call to pro/verron/officestamper/utils/WmlUtils::ensureValidity → SURVIVED
            ensureValidity(cell);
123
    }
124
125
    private static void remove(ContentAccessor parent, Child child) {
126
        var siblings = parent.getContent();
127
        var iterator = siblings.listIterator();
128 1 1. remove : negated conditional → KILLED
        while (iterator.hasNext()) {
129 1 1. remove : negated conditional → KILLED
            if (equals(iterator.next(), child)) {
130 1 1. remove : removed call to java/util/ListIterator::remove → KILLED
                iterator.remove();
131
                break;
132
            }
133
        }
134
    }
135
136
    @SuppressWarnings("SuspiciousMethodCalls")
137
    private static void remove(CTFootnotes parent, Child child) {
138
        parent.getFootnote()
139
              .remove(child);
140
    }
141
142
    @SuppressWarnings("SuspiciousMethodCalls")
143
    private static void remove(CTEndnotes parent, Child child) {
144
        parent.getEndnote()
145
              .remove(child);
146
    }
147
148
    private static void remove(SdtRun parent, Child child) {
149
        parent.getSdtContent()
150
              .getContent()
151
              .remove(child);
152
    }
153
154
    /// Utility method to ensure the validity of a table cell by adding an empty paragraph if necessary.
155
    ///
156
    /// @param cell the table cell to be checked and updated.
157
    public static void ensureValidity(Tc cell) {
158 1 1. ensureValidity : negated conditional → SURVIVED
        if (!containsAnElementOfAnyClasses(cell.getContent(), P.class, Tbl.class)) {
159 1 1. ensureValidity : removed call to pro/verron/officestamper/utils/WmlUtils::addEmptyParagraph → SURVIVED
            addEmptyParagraph(cell);
160
        }
161
    }
162
163
    private static boolean equals(Object o1, Object o2) {
164 1 1. equals : negated conditional → KILLED
        if (o1 instanceof JAXBElement<?> e1) o1 = e1.getValue();
165 1 1. equals : negated conditional → KILLED
        if (o2 instanceof JAXBElement<?> e2) o2 = e2.getValue();
166 2 1. equals : replaced boolean return with false for pro/verron/officestamper/utils/WmlUtils::equals → KILLED
2. equals : replaced boolean return with true for pro/verron/officestamper/utils/WmlUtils::equals → KILLED
        return Objects.equals(o1, o2);
167
    }
168
169
    private static boolean containsAnElementOfAnyClasses(Collection<Object> collection, Class<?>... classes) {
170
        for (Object element : collection) {
171 1 1. containsAnElementOfAnyClasses : negated conditional → SURVIVED
            if (isAnElementOfAnyClasses(element, classes)) {
172 1 1. containsAnElementOfAnyClasses : replaced boolean return with false for pro/verron/officestamper/utils/WmlUtils::containsAnElementOfAnyClasses → SURVIVED
                return true;
173
            }
174
        }
175 1 1. containsAnElementOfAnyClasses : replaced boolean return with true for pro/verron/officestamper/utils/WmlUtils::containsAnElementOfAnyClasses → SURVIVED
        return false;
176
    }
177
178
    private static void addEmptyParagraph(Tc cell) {
179
        var emptyParagraph = WmlFactory.newParagraph();
180
        var cellContent = cell.getContent();
181
        cellContent.add(emptyParagraph);
182
    }
183
184
    private static boolean isAnElementOfAnyClasses(Object element, Class<?>... classes) {
185
        for (var clazz : classes) {
186 2 1. isAnElementOfAnyClasses : replaced boolean return with false for pro/verron/officestamper/utils/WmlUtils::isAnElementOfAnyClasses → SURVIVED
2. isAnElementOfAnyClasses : negated conditional → SURVIVED
            if (clazz.isInstance(unwrapJAXBElement(element))) return true;
187
        }
188 1 1. isAnElementOfAnyClasses : replaced boolean return with true for pro/verron/officestamper/utils/WmlUtils::isAnElementOfAnyClasses → NO_COVERAGE
        return false;
189
    }
190
191
    private static Object unwrapJAXBElement(Object element) {
192 2 1. unwrapJAXBElement : replaced return value with null for pro/verron/officestamper/utils/WmlUtils::unwrapJAXBElement → SURVIVED
2. unwrapJAXBElement : negated conditional → KILLED
        return element instanceof JAXBElement<?> jaxbElement ? jaxbElement.getValue() : element;
193
    }
194
195
    /// Checks if the given object is serializable to XML.
196
    ///
197
    /// @param object the object to be checked for XML serialization
198
    ///
199
    /// @return true if the object can be serialized to XML, false otherwise
200
    public static boolean serializable(Object object) {
201
        try {
202
            XmlUtils.marshaltoString(object);
203 1 1. serializable : replaced boolean return with false for pro/verron/officestamper/utils/WmlUtils::serializable → KILLED
            return true;
204
        } catch (Exception _) {
205 1 1. serializable : replaced boolean return with true for pro/verron/officestamper/utils/WmlUtils::serializable → NO_COVERAGE
            return false;
206
        }
207
    }
208
}

Mutations

43

1.1
Location : getFirstParentWithClass
Killed by : none
changed conditional boundary → SURVIVED
Covering tests

2.2
Location : getFirstParentWithClass
Killed by : pro.verron.officestamper.test.ProcessorDisplayIfTest.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.ProcessorDisplayIfTest]/[test-template:conditionalDisplayOfTableRowsTest(pro.verron.officestamper.test.ContextFactory)]/[test-template-invocation:#2]
negated conditional → KILLED

44

1.1
Location : getFirstParentWithClass
Killed by : none
Changed increment from 1 to -1 → SURVIVED
Covering tests

45

1.1
Location : getFirstParentWithClass
Killed by : pro.verron.officestamper.test.ProcessorDisplayIfTest.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.ProcessorDisplayIfTest]/[test-template:conditionalDisplayOfTableRowsTest(pro.verron.officestamper.test.ContextFactory)]/[test-template-invocation:#2]
negated conditional → KILLED

46

1.1
Location : getFirstParentWithClass
Killed by : pro.verron.officestamper.test.ProcessorDisplayIfTest.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.ProcessorDisplayIfTest]/[test-template:conditionalDisplayOfTableRowsTest(pro.verron.officestamper.test.ContextFactory)]/[test-template-invocation:#2]
negated conditional → KILLED

2.2
Location : getFirstParentWithClass
Killed by : pro.verron.officestamper.test.ProcessorDisplayIfTest.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.ProcessorDisplayIfTest]/[test-template:conditionalDisplayOfTableRowsTest(pro.verron.officestamper.test.ContextFactory)]/[test-template-invocation:#2]
replaced return value with Optional.empty for pro/verron/officestamper/utils/WmlUtils::getFirstParentWithClass → KILLED

47

1.1
Location : getFirstParentWithClass
Killed by : none
negated conditional → TIMED_OUT

59

1.1
Location : extractCommentElements
Killed by : pro.verron.officestamper.test.FailOnUnresolvedPlaceholderTest.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.FailOnUnresolvedPlaceholderTest]/[test-template:fails(pro.verron.officestamper.test.ContextFactory)]/[test-template-invocation:#1]
removed call to org/docx4j/TraversalUtil::visit → KILLED

60

1.1
Location : extractCommentElements
Killed by : pro.verron.officestamper.test.FailOnUnresolvedPlaceholderTest.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.FailOnUnresolvedPlaceholderTest]/[test-template:fails(pro.verron.officestamper.test.ContextFactory)]/[test-template-invocation:#1]
replaced return value with Collections.emptyList for pro/verron/officestamper/utils/WmlUtils::extractCommentElements → KILLED

74

1.1
Location : findComment
Killed by : pro.verron.officestamper.test.DefaultTests.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.DefaultTests]/[test-template:features(java.lang.String, pro.verron.officestamper.api.OfficeStamperConfiguration, java.lang.Object, java.io.InputStream, java.lang.String)]/[test-template-invocation:#10]
replaced return value with Optional.empty for pro/verron/officestamper/utils/WmlUtils::findComment → KILLED

82

1.1
Location : getPartName
Killed by : pro.verron.officestamper.test.DefaultTests.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.DefaultTests]/[test-template:features(java.lang.String, pro.verron.officestamper.api.OfficeStamperConfiguration, java.lang.Object, java.io.InputStream, java.lang.String)]/[test-template-invocation:#10]
replaced return value with null for pro/verron/officestamper/utils/WmlUtils::getPartName → KILLED

90

1.1
Location : getComments
Killed by : pro.verron.officestamper.test.DefaultTests.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.DefaultTests]/[test-template:features(java.lang.String, pro.verron.officestamper.api.OfficeStamperConfiguration, java.lang.Object, java.io.InputStream, java.lang.String)]/[test-template-invocation:#10]
replaced return value with null for pro/verron/officestamper/utils/WmlUtils::getComments → KILLED

97

1.1
Location : idEqual
Killed by : pro.verron.officestamper.test.DefaultTests.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.DefaultTests]/[test-template:features(java.lang.String, pro.verron.officestamper.api.OfficeStamperConfiguration, java.lang.Object, java.io.InputStream, java.lang.String)]/[test-template-invocation:#10]
replaced return value with null for pro/verron/officestamper/utils/WmlUtils::idEqual → KILLED

99

1.1
Location : lambda$idEqual$0
Killed by : pro.verron.officestamper.test.DefaultTests.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.DefaultTests]/[test-template:features(java.lang.String, pro.verron.officestamper.api.OfficeStamperConfiguration, java.lang.Object, java.io.InputStream, java.lang.String)]/[test-template-invocation:#10]
replaced boolean return with false for pro/verron/officestamper/utils/WmlUtils::lambda$idEqual$0 → KILLED

2.2
Location : lambda$idEqual$0
Killed by : pro.verron.officestamper.test.DefaultTests.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.DefaultTests]/[test-template:features(java.lang.String, pro.verron.officestamper.api.OfficeStamperConfiguration, java.lang.Object, java.io.InputStream, java.lang.String)]/[test-template-invocation:#10]
replaced boolean return with true for pro/verron/officestamper/utils/WmlUtils::lambda$idEqual$0 → KILLED

115

1.1
Location : remove
Killed by : pro.verron.officestamper.test.ProcessorDisplayIfTest.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.ProcessorDisplayIfTest]/[test-template:conditionalDisplayOfTableRowsTest(pro.verron.officestamper.test.ContextFactory)]/[test-template-invocation:#2]
removed call to pro/verron/officestamper/utils/WmlUtils::remove → KILLED

116

1.1
Location : remove
Killed by : pro.verron.officestamper.test.ProcessorDisplayIfTest.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.ProcessorDisplayIfTest]/[test-template:conditionalDisplayOfFootnotes(pro.verron.officestamper.test.ContextFactory)]/[test-template-invocation:#2]
removed call to pro/verron/officestamper/utils/WmlUtils::remove → KILLED

117

1.1
Location : remove
Killed by : pro.verron.officestamper.test.ProcessorDisplayIfTest.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.ProcessorDisplayIfTest]/[test-template:conditionalDisplayOfEndnotes(pro.verron.officestamper.test.ContextFactory)]/[test-template-invocation:#2]
removed call to pro/verron/officestamper/utils/WmlUtils::remove → KILLED

118

1.1
Location : remove
Killed by : none
removed call to pro/verron/officestamper/utils/WmlUtils::remove → NO_COVERAGE

121

1.1
Location : remove
Killed by : pro.verron.officestamper.test.ProcessorDisplayIfTest.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.ProcessorDisplayIfTest]/[test-template:conditionalDisplayOfTableRowsTest(pro.verron.officestamper.test.ContextFactory)]/[test-template-invocation:#2]
negated conditional → KILLED

122

1.1
Location : remove
Killed by : none
removed call to pro/verron/officestamper/utils/WmlUtils::ensureValidity → SURVIVED
Covering tests

128

1.1
Location : remove
Killed by : pro.verron.officestamper.test.ProcessorDisplayIfTest.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.ProcessorDisplayIfTest]/[test-template:conditionalDisplayOfTableRowsTest(pro.verron.officestamper.test.ContextFactory)]/[test-template-invocation:#2]
negated conditional → KILLED

129

1.1
Location : remove
Killed by : pro.verron.officestamper.test.ProcessorDisplayIfTest.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.ProcessorDisplayIfTest]/[test-template:conditionalDisplayOfTableRowsTest(pro.verron.officestamper.test.ContextFactory)]/[test-template-invocation:#2]
negated conditional → KILLED

130

1.1
Location : remove
Killed by : pro.verron.officestamper.test.ProcessorDisplayIfTest.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.ProcessorDisplayIfTest]/[test-template:conditionalDisplayOfTableRowsTest(pro.verron.officestamper.test.ContextFactory)]/[test-template-invocation:#2]
removed call to java/util/ListIterator::remove → KILLED

158

1.1
Location : ensureValidity
Killed by : none
negated conditional → SURVIVED
Covering tests

159

1.1
Location : ensureValidity
Killed by : none
removed call to pro/verron/officestamper/utils/WmlUtils::addEmptyParagraph → SURVIVED
Covering tests

164

1.1
Location : equals
Killed by : pro.verron.officestamper.test.ProcessorDisplayIfTest.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.ProcessorDisplayIfTest]/[test-template:conditionalDisplayOfTableRowsTest(pro.verron.officestamper.test.ContextFactory)]/[test-template-invocation:#2]
negated conditional → KILLED

165

1.1
Location : equals
Killed by : pro.verron.officestamper.test.ProcessorDisplayIfTest.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.ProcessorDisplayIfTest]/[test-template:conditionalDisplayOfTableRowsTest(pro.verron.officestamper.test.ContextFactory)]/[test-template-invocation:#2]
negated conditional → KILLED

166

1.1
Location : equals
Killed by : pro.verron.officestamper.test.ProcessorDisplayIfTest.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.ProcessorDisplayIfTest]/[test-template:conditionalDisplayOfTableRowsTest(pro.verron.officestamper.test.ContextFactory)]/[test-template-invocation:#2]
replaced boolean return with false for pro/verron/officestamper/utils/WmlUtils::equals → KILLED

2.2
Location : equals
Killed by : pro.verron.officestamper.test.ProcessorDisplayIfTest.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.ProcessorDisplayIfTest]/[test-template:conditionalDisplayOfTableRowsTest(pro.verron.officestamper.test.ContextFactory)]/[test-template-invocation:#2]
replaced boolean return with true for pro/verron/officestamper/utils/WmlUtils::equals → KILLED

171

1.1
Location : containsAnElementOfAnyClasses
Killed by : none
negated conditional → SURVIVED
Covering tests

172

1.1
Location : containsAnElementOfAnyClasses
Killed by : none
replaced boolean return with false for pro/verron/officestamper/utils/WmlUtils::containsAnElementOfAnyClasses → SURVIVED
Covering tests

175

1.1
Location : containsAnElementOfAnyClasses
Killed by : none
replaced boolean return with true for pro/verron/officestamper/utils/WmlUtils::containsAnElementOfAnyClasses → SURVIVED
Covering tests

186

1.1
Location : isAnElementOfAnyClasses
Killed by : none
replaced boolean return with false for pro/verron/officestamper/utils/WmlUtils::isAnElementOfAnyClasses → SURVIVED
Covering tests

2.2
Location : isAnElementOfAnyClasses
Killed by : none
negated conditional → SURVIVED Covering tests

188

1.1
Location : isAnElementOfAnyClasses
Killed by : none
replaced boolean return with true for pro/verron/officestamper/utils/WmlUtils::isAnElementOfAnyClasses → NO_COVERAGE

192

1.1
Location : unwrapJAXBElement
Killed by : none
replaced return value with null for pro/verron/officestamper/utils/WmlUtils::unwrapJAXBElement → SURVIVED
Covering tests

2.2
Location : unwrapJAXBElement
Killed by : pro.verron.officestamper.test.ProcessorDisplayIfTest.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.ProcessorDisplayIfTest]/[test-template:conditionalDisplayOfTableBug32Test(pro.verron.officestamper.test.ContextFactory)]/[test-template-invocation:#2]
negated conditional → KILLED

203

1.1
Location : serializable
Killed by : pro.verron.officestamper.test.ResolutionTest.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.ResolutionTest]/[test-template:testCustomResolution(java.lang.String, boolean, boolean, boolean, boolean, boolean, java.lang.String, boolean, java.lang.String)]/[test-template-invocation:#13]
replaced boolean return with false for pro/verron/officestamper/utils/WmlUtils::serializable → KILLED

205

1.1
Location : serializable
Killed by : none
replaced boolean return with true for pro/verron/officestamper/utils/WmlUtils::serializable → NO_COVERAGE

Active mutators

Tests examined


Report generated by PIT 1.21.0