assertFalse(req.test(trace));
/* Test case that all events need to have the given fields */
- req = new TmfAnalysisEventFieldRequirement("", ImmutableSet.of(EVENT1_FIELD1, EVENT1_FIELD2));
+ req = new TmfAnalysisEventFieldRequirement("", ImmutableSet.of(EVENT1_FIELD1, EVENT1_FIELD2), PriorityLevel.MANDATORY);
assertTrue(req.test(trace));
+ /* Test case that all events need to have the given fields */
+ req = new TmfAnalysisEventFieldRequirement("", ImmutableSet.of(EVENT2_FIELD1), PriorityLevel.MANDATORY);
+ assertFalse(req.test(trace));
+
/* Test case that empty list of event fields behaves like Event Requirements */
req = new TmfAnalysisEventFieldRequirement(EVENT1, checkNotNull(Collections.EMPTY_LIST));
assertTrue(req.test(trace));
}
+ /**
+ * Test with {@link PriorityLevel#AT_LEAST_ONE} requirements
+ */
+ @Test
+ public void testAtLeastOneRequirements() {
+ /* Test at least one requirement */
+ TmfAbstractAnalysisRequirement req = new TmfAnalysisEventFieldRequirement(EVENT1, ImmutableSet.of(EVENT1_FIELD1), PriorityLevel.AT_LEAST_ONE);
+ assertTrue(req.test(trace));
+
+ req = new TmfAnalysisEventFieldRequirement(EVENT1, ImmutableSet.of(EVENT1_FIELD1, EVENT1_FIELD2), PriorityLevel.AT_LEAST_ONE);
+ assertTrue(req.test(trace));
+
+ /* EVENT3 is not part of the trace. Test case that the event is part of the trace */
+ req = new TmfAnalysisEventFieldRequirement(EVENT3, ImmutableSet.of(EVENT1_FIELD1, EVENT1_FIELD2), PriorityLevel.AT_LEAST_ONE);
+ assertFalse(req.test(trace));
+
+ /* EVENT_FIELD is not an event field of the trace */
+ req = new TmfAnalysisEventFieldRequirement(EVENT1, ImmutableSet.of(EVENT1_FIELD1, EVENT1_FIELD2, EVENT_FIELD), PriorityLevel.AT_LEAST_ONE);
+ assertTrue(req.test(trace));
+
+ /* Test case that all events need to have at least one of the given fields */
+ req = new TmfAnalysisEventFieldRequirement("", ImmutableSet.of(EVENT1_FIELD1, EVENT2_FIELD2), PriorityLevel.AT_LEAST_ONE);
+ assertTrue(req.test(trace));
+
+ /* Test case that all events need to have the given fields */
+ req = new TmfAnalysisEventFieldRequirement("", ImmutableSet.of(EVENT2_FIELD1), PriorityLevel.AT_LEAST_ONE);
+ assertFalse(req.test(trace));
+
+ /* Test case that empty list of event fields behaves like Event Requirements */
+ req = new TmfAnalysisEventFieldRequirement(EVENT1, checkNotNull(Collections.EMPTY_LIST), PriorityLevel.AT_LEAST_ONE);
+ assertTrue(req.test(trace));
+ }
+
+ /**
+ * Test with {@link PriorityLevel#ALL_OR_NOTHING} requirements
+ */
+ @Test
+ public void testAllOrNothingRequirements() {
+ /* Test at least one requirement */
+ TmfAbstractAnalysisRequirement req = new TmfAnalysisEventFieldRequirement(EVENT1, ImmutableSet.of(EVENT1_FIELD1), PriorityLevel.ALL_OR_NOTHING);
+ assertTrue(req.test(trace));
+
+ req = new TmfAnalysisEventFieldRequirement(EVENT1, ImmutableSet.of(EVENT1_FIELD1, EVENT1_FIELD2), PriorityLevel.ALL_OR_NOTHING);
+ assertTrue(req.test(trace));
+
+ /* EVENT3 is not part of the trace. Test case that the event is part of the trace */
+ req = new TmfAnalysisEventFieldRequirement(EVENT3, ImmutableSet.of(EVENT1_FIELD1, EVENT1_FIELD2), PriorityLevel.ALL_OR_NOTHING);
+ assertTrue(req.test(trace));
+
+ /* EVENT_FIELD is not an event field of the trace */
+ req = new TmfAnalysisEventFieldRequirement(EVENT1, ImmutableSet.of(EVENT1_FIELD1, EVENT1_FIELD2, EVENT_FIELD), PriorityLevel.ALL_OR_NOTHING);
+ assertFalse(req.test(trace));
+
+ /* Test case that all events need to have either all or none of the given fields */
+ req = new TmfAnalysisEventFieldRequirement("", ImmutableSet.of(EVENT1_FIELD1, EVENT2_FIELD2), PriorityLevel.ALL_OR_NOTHING);
+ assertFalse(req.test(trace));
+
+ /* Test case that all events need to have the given fields */
+ req = new TmfAnalysisEventFieldRequirement("", ImmutableSet.of(EVENT1_FIELD1), PriorityLevel.ALL_OR_NOTHING);
+ assertTrue(req.test(trace));
+
+ /* Test case that empty list of event fields behaves like Event Requirements */
+ req = new TmfAnalysisEventFieldRequirement(EVENT1, checkNotNull(Collections.EMPTY_LIST), PriorityLevel.ALL_OR_NOTHING);
+ assertTrue(req.test(trace));
+ }
+
/**
* Test event requirements on a trace with no pre-defined events. They
* should all pass
assertFalse(req.test(fTrace));
}
+ /**
+ * Test with {@link PriorityLevel#AT_LEAST_ONE} requirements
+ */
+ @Test
+ public void testAtLeastOneRequirements() {
+ /* Test mandatory requirement */
+ TmfAbstractAnalysisRequirement req = new TmfAnalysisEventRequirement(ImmutableSet.of(EVENT1), PriorityLevel.AT_LEAST_ONE);
+ assertTrue(req.test(fTrace));
+
+ req = new TmfAnalysisEventRequirement(ImmutableSet.of(EVENT1, EVENT2), PriorityLevel.AT_LEAST_ONE);
+ assertTrue(req.test(fTrace));
+
+ /* Event 3 is not an event of the trace */
+ req = new TmfAnalysisEventRequirement(ImmutableSet.of(EVENT1, EVENT2, EVENT3), PriorityLevel.AT_LEAST_ONE);
+ assertTrue(req.test(fTrace));
+
+ req = new TmfAnalysisEventRequirement(ImmutableSet.of(EVENT3), PriorityLevel.AT_LEAST_ONE);
+ assertFalse(req.test(fTrace));
+ }
+
+ /**
+ * Test with {@link PriorityLevel#ALL_OR_NOTHING} requirements
+ */
+ @Test
+ public void testAllOrNothingRequirements() {
+ /* Test mandatory requirement */
+ TmfAbstractAnalysisRequirement req = new TmfAnalysisEventRequirement(ImmutableSet.of(EVENT1), PriorityLevel.ALL_OR_NOTHING);
+ assertTrue(req.test(fTrace));
+
+ req = new TmfAnalysisEventRequirement(ImmutableSet.of(EVENT1, EVENT2), PriorityLevel.ALL_OR_NOTHING);
+ assertTrue(req.test(fTrace));
+
+ /* Event 3 is not an event of the trace */
+ req = new TmfAnalysisEventRequirement(ImmutableSet.of(EVENT1, EVENT2, EVENT3), PriorityLevel.ALL_OR_NOTHING);
+ assertFalse(req.test(fTrace));
+
+ req = new TmfAnalysisEventRequirement(ImmutableSet.of(EVENT3), PriorityLevel.ALL_OR_NOTHING);
+ assertTrue(req.test(fTrace));
+ }
+
/**
* Test event requirements on a trace with no pre-defined events. They
* should all pass
package org.eclipse.tracecompass.tmf.core.analysis.requirements;
import java.util.Collection;
-import java.util.Collections;
+import java.util.HashSet;
import java.util.Set;
import org.eclipse.jdt.annotation.NonNull;
@Override
public boolean test(ITmfTrace trace) {
- if ((trace instanceof ITmfTraceWithPreDefinedEvents)) {
- // TODO Implement for all levels of requirements
- Set<String> mandatoryValues = getPriorityLevel().equals(PriorityLevel.MANDATORY) ? getValues() : Collections.EMPTY_SET;
- if (mandatoryValues.isEmpty()) {
- return true;
- }
- Multimap<@NonNull String, @NonNull String> traceEvents =
- TmfEventTypeCollectionHelper.getEventFieldNames((((ITmfTraceWithPreDefinedEvents) trace).getContainedEventTypes()));
- if (fEventName.isEmpty()) {
+ if (!(trace instanceof ITmfTraceWithPreDefinedEvents)) {
+ return true;
+ }
+
+ Set<String> values = getValues();
+ if (values.isEmpty()) {
+ return true;
+ }
+
+ final Multimap<@NonNull String, @NonNull String> traceEvents = TmfEventTypeCollectionHelper.getEventFieldNames((((ITmfTraceWithPreDefinedEvents) trace).getContainedEventTypes()));
+
+ if (fEventName.isEmpty()) {
+ switch(getPriorityLevel()) {
+ case ALL_OR_NOTHING:
return traceEvents.keys().stream().allMatch(eventName -> {
- Collection<@NonNull String> fields = traceEvents.get(fEventName);
- return fields.containsAll(mandatoryValues);
+ Collection<@NonNull String> fields = new HashSet<>(traceEvents.get(eventName));
+ fields.retainAll(values);
+ return (fields.size() == 0 || fields.size() == values.size());
});
+ case AT_LEAST_ONE:
+ return traceEvents.keys().stream().allMatch(eventName -> {
+ Collection<@NonNull String> fields = new HashSet<>(traceEvents.get(eventName));
+ fields.retainAll(values);
+ return fields.size() > 0;
+ });
+ case MANDATORY:
+ return traceEvents.keys().stream().allMatch(eventName -> {
+ Collection<@NonNull String> fields = traceEvents.get(eventName);
+ return fields.containsAll(values);
+ });
+ case OPTIONAL:
+ return true;
+ default:
+ throw new IllegalStateException("Unknown value level: " + getPriorityLevel()); //$NON-NLS-1$
}
- Collection<@NonNull String> fields = traceEvents.get(fEventName);
- return fields.containsAll(mandatoryValues);
}
- return true;
+
+ // Check the level for required event only
+ Collection<@NonNull String> fields = traceEvents.get(fEventName);
+ switch(getPriorityLevel()) {
+ case ALL_OR_NOTHING:
+ fields.retainAll(values);
+ return (fields.size() == 0 || fields.size() == values.size());
+ case AT_LEAST_ONE:
+ fields.retainAll(values);
+ return fields.size() > 0;
+ case MANDATORY:
+ return fields.containsAll(values);
+ case OPTIONAL:
+ return true;
+ default:
+ throw new IllegalStateException("Unknown value level: " + getPriorityLevel()); //$NON-NLS-1$
+ }
+
}
}
package org.eclipse.tracecompass.tmf.core.analysis.requirements;
import java.util.Collection;
-import java.util.Collections;
import java.util.Set;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
@Override
public boolean test(ITmfTrace trace) {
- // TODO: implement for all levels
- if (trace instanceof ITmfTraceWithPreDefinedEvents) {
- Set<String> traceEvents = TmfEventTypeCollectionHelper.getEventNames(((ITmfTraceWithPreDefinedEvents) trace).getContainedEventTypes());
- Set<String> mandatoryValues = getPriorityLevel().equals(PriorityLevel.MANDATORY) ? getValues() : Collections.EMPTY_SET;
- return traceEvents.containsAll(mandatoryValues);
+ if (!(trace instanceof ITmfTraceWithPreDefinedEvents)) {
+ return true;
}
- return true;
+ Set<String> traceEvents = TmfEventTypeCollectionHelper.getEventNames(((ITmfTraceWithPreDefinedEvents) trace).getContainedEventTypes());
+ Set<String> values = getValues();
+
+ switch (getPriorityLevel()) {
+ case ALL_OR_NOTHING:
+ traceEvents.retainAll(values);
+ return (traceEvents.size() == 0 || traceEvents.size() == values.size());
+ case AT_LEAST_ONE:
+ traceEvents.retainAll(values);
+ return traceEvents.size() > 0;
+ case MANDATORY:
+ return traceEvents.containsAll(values);
+ case OPTIONAL:
+ return true;
+ default:
+ throw new IllegalStateException("Unknown value level: " + getPriorityLevel()); //$NON-NLS-1$
+ }
}
}