CMIteratorSpec.m 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. @import Quick;
  2. @import Nimble;
  3. #import <CocoaMarkdown/CocoaMarkdown.h>
  4. #import "CMNode_Private.h"
  5. QuickSpecBegin(CMIteratorSpec)
  6. it(@"should initialize", ^{
  7. CMNode *node = [[CMNode alloc] initWithNode:cmark_node_new(CMARK_NODE_PARAGRAPH) freeWhenDone:YES];
  8. CMIterator *iter = [[CMIterator alloc] initWithRootNode:node];
  9. expect(iter).toNot(beNil());
  10. });
  11. it(@"should traverse a node tree", ^{
  12. CMNode *parent = [[CMNode alloc] initWithNode:cmark_node_new(CMARK_NODE_DOCUMENT) freeWhenDone:YES];
  13. cmark_node *paragraph1 = cmark_node_new(CMARK_NODE_PARAGRAPH);
  14. cmark_node *paragraph2 = cmark_node_new(CMARK_NODE_PARAGRAPH);
  15. cmark_node_append_child(parent.node, paragraph1);
  16. cmark_node_append_child(parent.node, paragraph2);
  17. CMIterator *iter = [[CMIterator alloc] initWithRootNode:parent];
  18. __block NSInteger nodeCount = 0;
  19. __block NSInteger eventBalance = 0;
  20. [iter enumerateUsingBlock:^(CMNode *node, CMEventType event, BOOL *stop) {
  21. switch (event) {
  22. case CMARK_EVENT_ENTER:
  23. eventBalance++;
  24. break;
  25. case CMARK_EVENT_EXIT:
  26. eventBalance--;
  27. nodeCount++;
  28. break;
  29. default: break;
  30. }
  31. if (nodeCount == 2) *stop = YES;
  32. }];
  33. expect(@(nodeCount)).to(equal(@2));
  34. expect(@(eventBalance)).to(equal(@1));
  35. [iter resetToNode:parent withEventType:CMEventTypeEnter];
  36. expect(iter.currentNode).to(equal(parent));
  37. expect(@(iter.currentEvent)).to(equal(@(CMARK_EVENT_ENTER)));
  38. });
  39. QuickSpecEnd