p->content = NULL;
p->next = NULL;
p->type = type;
+ p->heading = 0;
if(type == MD_BLOCK_H) {
MD_BLOCK_H_DETAIL *heading = detail;
}
void mddoc_free(MDDoc *doc) {
- cxMempoolFree(doc->mp);
+ if(doc) {
+ cxMempoolFree(doc->mp);
+ }
}
cxstring mdnode_get_text(MDNode *node) {
}
}
+static int md_node_equal(MDNode *node0, MDNode *node1) {
+ while(node0) {
+ if(node1 == NULL) {
+ return 0;
+ }
+ if(node0->type != node1->type ||
+ node0->type0 != node1->type0) {
+ return 0;
+ }
+ if(cx_strcmp(node0->text, node1->text)) {
+ return 0;
+ }
+ if(cx_strcmp(node0->link, node1->link)) {
+ return 0;
+ }
+
+ if(node0->children_begin) {
+ if(!node1->children_begin) {
+ return 0;
+ }
+ if(!md_node_equal(node0->children_begin, node1->children_begin)) {
+ return 0;
+ }
+ }
+
+ node0 = node0->next;
+ node1 = node1->next;
+ }
+
+ return node1 == NULL;
+}
+
+static int md_equal(cxmutstr md0, cxmutstr md1) {
+ MDDoc *doc0 = parse_markdown(cx_strcast(md0));
+ MDDoc *doc1 = parse_markdown(cx_strcast(md1));
+
+ if(!doc0 || !doc1) {
+ mddoc_free(doc0);
+ mddoc_free(doc1);
+ return 0;
+ }
+
+ MDPara *para0 = doc0->content;
+ MDPara *para1 = doc1->content;
+
+ while(para0) {
+ if(!para1) {
+ return 0;
+ }
+ if(para0->type != para1->type) {
+ return 0;
+ }
+ if(para0->heading != para1->heading) {
+ return 0;
+ }
+ if(!md_node_equal(para0->content, para1->content)) {
+ return 0;
+ }
+
+ para0 = para0->next;
+ para1 = para1->next;
+ }
+
+ mddoc_free(doc0);
+ mddoc_free(doc1);
+
+ return para1 == NULL;
+}
+
CX_TEST(test_editor_load_markdown_para1) {
CX_TEST_DO {
UiObject *obj = ui_simple_window("test");
editor_load_markdown(¬e, textview, md0);
cxmutstr mdtext = editor_get_markdown(text, a);
- CX_TEST_ASSERT(!cx_strcmp(cx_strtrim(mdtext), md0));
+ CX_TEST_ASSERT(md_equal(md0, mdtext));
// TODO: cleanup
ui_close(obj);