void event_check(Event *event) { EventTree *eventTree = event_getEventTree(event); Event *ancestorEvent = event_getParent(event); //Check event and eventree properly linked cactusCheck(eventTree_getEvent(event_getEventTree(event), event_getName(event)) == event); //Event has parent, unless it is root. if (eventTree_getRootEvent(eventTree) == event) { cactusCheck(ancestorEvent == NULL); } else { //not root, so must have ancestor. cactusCheck(ancestorEvent != NULL); } //Each child event has event as parent. int64_t i = 0; for (i = 0; i < event_getChildNumber(event); i++) { Event *childEvent = event_getChild(event, i); cactusCheck(event_getParent(childEvent) == event); } //Ancestor-event --> event edge is consistent with any event tree that is in the parent of the containing flower. Group *parentGroup = flower_getParentGroup(eventTree_getFlower( event_getEventTree(event))); if (parentGroup != NULL) { EventTree *parentEventTree = flower_getEventTree(group_getFlower( parentGroup)); Event *parentEvent = eventTree_getEvent(parentEventTree, event_getName( event)); if (parentEvent != NULL) { if (ancestorEvent == NULL) { //the case where they are both root. cactusCheck(eventTree_getRootEvent(parentEventTree) == parentEvent); } else { //Check edge ancestorEvent --> event is in parent event tree. while (1) { Event *parentAncestorEvent = eventTree_getEvent( parentEventTree, event_getName(ancestorEvent)); if (parentAncestorEvent != NULL) { cactusCheck(event_isAncestor(parentEvent, parentAncestorEvent)); break; } ancestorEvent = event_getParent(ancestorEvent); cactusCheck(ancestorEvent != NULL); } } } } }
void testEvent_isAncestor(CuTest* testCase) { cactusEventTestSetup(); //negatives CuAssertTrue(testCase, !event_isAncestor(leafEvent1, leafEvent2)); CuAssertTrue(testCase, !event_isAncestor(leafEvent2, leafEvent1)); CuAssertTrue(testCase, !event_isAncestor(internalEvent, leafEvent1)); CuAssertTrue(testCase, !event_isAncestor(internalEvent, leafEvent2)); CuAssertTrue(testCase, !event_isAncestor(rootEvent, leafEvent1)); CuAssertTrue(testCase, !event_isAncestor(rootEvent, leafEvent2)); CuAssertTrue(testCase, !event_isAncestor(rootEvent, internalEvent)); //selfs CuAssertTrue(testCase, !event_isAncestor(leafEvent1, leafEvent1)); CuAssertTrue(testCase, !event_isAncestor(leafEvent2, leafEvent2)); CuAssertTrue(testCase, !event_isAncestor(internalEvent, internalEvent)); CuAssertTrue(testCase, !event_isAncestor(rootEvent, rootEvent)); //positives CuAssertTrue(testCase, event_isAncestor(leafEvent1, internalEvent)); CuAssertTrue(testCase, event_isAncestor(leafEvent2, internalEvent)); CuAssertTrue(testCase, event_isAncestor(leafEvent1, rootEvent)); CuAssertTrue(testCase, event_isAncestor(leafEvent2, rootEvent)); CuAssertTrue(testCase, event_isAncestor(internalEvent, rootEvent)); cactusEventTestTeardown(); }