diff options
| author | Rafael G. Martins <rafael@rafaelmartins.eng.br> | 2015-05-04 22:34:37 -0300 | 
|---|---|---|
| committer | Rafael G. Martins <rafael@rafaelmartins.eng.br> | 2015-05-04 22:34:37 -0300 | 
| commit | af37850094238ae94ee4a48588a8490a210f9ad6 (patch) | |
| tree | ca1a254f08d829d5a358bc7d3449c247fba0153f | |
| parent | 6c36460f20548850b0704a462dd8281c7f5868a7 (diff) | |
| download | blogc-af37850094238ae94ee4a48588a8490a210f9ad6.tar.gz blogc-af37850094238ae94ee4a48588a8490a210f9ad6.tar.bz2 blogc-af37850094238ae94ee4a48588a8490a210f9ad6.zip | |
content-parser: minor fixes. added tests
| -rw-r--r-- | src/content-parser.c | 35 | ||||
| -rw-r--r-- | tests/check_content_parser.c | 231 | 
2 files changed, 252 insertions, 14 deletions
| diff --git a/src/content-parser.c b/src/content-parser.c index 75c0f34..8249322 100644 --- a/src/content-parser.c +++ b/src/content-parser.c @@ -87,7 +87,7 @@ blogc_content_parse(const char *src, size_t src_len, blogc_error_t **err)          switch (state) {              case CONTENT_START_LINE: -                if (c == '\n' || c == '\r') +                if (c == '\n' || c == '\r' || is_last)                      break;                  if (c == '#') {                      header_level = 1; @@ -140,18 +140,15 @@ blogc_content_parse(const char *src, size_t src_len, blogc_error_t **err)              case CONTENT_HEADER_TITLE_START:                  if (c == ' ' || c == '\t')                      break; -                if (c != '\n' || c != '\r') { -                    start = current; +                start = current; +                if (c != '\n' && c != '\r') {                      state = CONTENT_HEADER_TITLE;                      break;                  } -                *err = blogc_error_parser(BLOGC_ERROR_CONTENT_PARSER, src, src_len, -                    current, "Empty header"); -                break;              case CONTENT_HEADER_TITLE:                  if (c == '\n' || c == '\r' || is_last) { -                    end = is_last ? src_len : current; +                    end = is_last && c != '\n' && c != '\r' ? src_len : current;                      tmp = b_strndup(src + start, end - start);                      b_string_append_printf(rv, "<h%d>%s</h%d>\n", header_level,                          tmp, header_level); @@ -159,14 +156,13 @@ blogc_content_parse(const char *src, size_t src_len, blogc_error_t **err)                      tmp = NULL;                      state = CONTENT_START_LINE;                      start = current; -                    break;                  }                  break;              case CONTENT_HTML:                  if (c == '\n' || c == '\r' || is_last) {                      state = CONTENT_HTML_END; -                    end = is_last ? src_len : current; +                    end = is_last && c != '\n' && c != '\r' ? src_len : current;                  }                  if (!is_last)                      break; @@ -189,10 +185,11 @@ blogc_content_parse(const char *src, size_t src_len, blogc_error_t **err)                      break;                  prefix = b_strndup(src + start, current - start);                  state = CONTENT_BLOCKQUOTE_START; +                break;              case CONTENT_BLOCKQUOTE_START:                  if (c == '\n' || c == '\r' || is_last) { -                    end = is_last ? src_len : current; +                    end = is_last && c != '\n' && c != '\r' ? src_len : current;                      tmp = b_strndup(src + start, end - start);                      if (b_str_starts_with(tmp, prefix)) {                          lines = b_slist_append(lines, b_strdup(tmp + strlen(prefix))); @@ -202,6 +199,10 @@ blogc_content_parse(const char *src, size_t src_len, blogc_error_t **err)                          *err = blogc_error_parser(BLOGC_ERROR_CONTENT_PARSER, src, src_len,                              current, "Malformed blockquote, must use same prefix "                              "as previous line(s): %s", prefix); +                        free(prefix); +                        prefix = NULL; +                        b_slist_free_full(lines, free); +                        lines = NULL;                      }                      free(tmp);                      tmp = NULL; @@ -245,10 +246,11 @@ blogc_content_parse(const char *src, size_t src_len, blogc_error_t **err)                      break;                  prefix = b_strndup(src + start, current - start);                  state = CONTENT_CODE_START; +                break;              case CONTENT_CODE_START:                  if (c == '\n' || c == '\r' || is_last) { -                    end = is_last ? src_len : current; +                    end = is_last && c != '\n' && c != '\r' ? src_len : current;                      tmp = b_strndup(src + start, end - start);                      if (b_str_starts_with(tmp, prefix)) {                          lines = b_slist_append(lines, b_strdup(tmp + strlen(prefix))); @@ -258,6 +260,10 @@ blogc_content_parse(const char *src, size_t src_len, blogc_error_t **err)                          *err = blogc_error_parser(BLOGC_ERROR_CONTENT_PARSER, src, src_len,                              current, "Malformed code block, must use same prefix "                              "as previous line(s): '%s'", prefix); +                        free(prefix); +                        prefix = NULL; +                        b_slist_free_full(lines, free); +                        lines = NULL;                      }                      free(tmp);                      tmp = NULL; @@ -316,7 +322,7 @@ blogc_content_parse(const char *src, size_t src_len, blogc_error_t **err)              case CONTENT_UNORDERED_LIST_START:                  if (c == '\n' || c == '\r' || is_last) { -                    end = is_last ? src_len : current; +                    end = is_last && c != '\n' && c != '\r' ? src_len : current;                      tmp = b_strndup(src + start, end - start);                      if (b_str_starts_with(tmp, prefix)) {                          lines = b_slist_append(lines, b_strdup(tmp + strlen(prefix))); @@ -367,10 +373,11 @@ blogc_content_parse(const char *src, size_t src_len, blogc_error_t **err)                      break;                  prefix_len = current - start;                  state = CONTENT_ORDERED_LIST_START; +                break;              case CONTENT_ORDERED_LIST_START:                  if (c == '\n' || c == '\r' || is_last) { -                    end = is_last ? src_len : current; +                    end = is_last && c != '\n' && c != '\r' ? src_len : current;                      tmp = b_strndup(src + start, end - start);                      if (strlen(tmp) >= prefix_len) {                          tmp2 = b_strndup(tmp, prefix_len); @@ -436,7 +443,7 @@ err_li:              case CONTENT_PARAGRAPH:                  if (c == '\n' || c == '\r' || is_last) {                      state = CONTENT_PARAGRAPH_END; -                    end = is_last ? src_len : current; +                    end = is_last && c != '\n' && c != '\r' ? src_len : current;                  }                  if (!is_last)                      break; diff --git a/tests/check_content_parser.c b/tests/check_content_parser.c index df14df3..b3e7092 100644 --- a/tests/check_content_parser.c +++ b/tests/check_content_parser.c @@ -96,11 +96,242 @@ test_content_parse(void **state)  } +void +test_content_parse_header(void **state) +{ +    const char *a = "## bola"; +    blogc_error_t *err = NULL; +    char *html = blogc_content_parse(a, strlen(a), &err); +    assert_null(err); +    assert_non_null(html); +    assert_string_equal(html, "<h2>bola</h2>\n"); +    free(html); +    a = "## bola\n"; +    html = blogc_content_parse(a, strlen(a), &err); +    assert_null(err); +    assert_non_null(html); +    assert_string_equal(html, "<h2>bola</h2>\n"); +    free(html); +    a = +        "bola\n" +        "\n" +        "## bola\n" +        "\n" +        "guda\n"; +    html = blogc_content_parse(a, strlen(a), &err); +    assert_null(err); +    assert_non_null(html); +    assert_string_equal(html, +        "<p>bola</p>\n" +        "<h2>bola</h2>\n" +        "<p>guda</p>\n"); +    free(html); +} + + +void +test_content_parse_html(void **state) +{ +    const char *a = "<div>\n</div>"; +    blogc_error_t *err = NULL; +    char *html = blogc_content_parse(a, strlen(a), &err); +    assert_null(err); +    assert_non_null(html); +    assert_string_equal(html, "<div>\n</div>\n"); +    free(html); +    a = "<div>\n</div>\n"; +    html = blogc_content_parse(a, strlen(a), &err); +    assert_null(err); +    assert_non_null(html); +    assert_string_equal(html, "<div>\n</div>\n"); +    free(html); +    a = +        "bola\n" +        "\n" +        "<div>\n" +        "</div>\n" +        "\n" +        "chunda\n"; +    html = blogc_content_parse(a, strlen(a), &err); +    assert_null(err); +    assert_non_null(html); +    assert_string_equal(html, +        "<p>bola</p>\n" +        "<div>\n</div>\n" +        "<p>chunda</p>\n"); +    free(html); +} + + +void +test_content_parse_blockquote(void **state) +{ +    const char *a = ">  bola\n>  guda"; +    blogc_error_t *err = NULL; +    char *html = blogc_content_parse(a, strlen(a), &err); +    assert_null(err); +    assert_non_null(html); +    assert_string_equal(html, +        "<blockquote><p>bola\n" +        "guda</p>\n" +        "</blockquote>\n"); +    free(html); +    a = ">  bola\n>  guda\n"; +    html = blogc_content_parse(a, strlen(a), &err); +    assert_null(err); +    assert_non_null(html); +    assert_string_equal(html, +        "<blockquote><p>bola\n" +        "guda</p>\n" +        "</blockquote>\n"); +    free(html); +    a = +        "bola\n" +        "\n" +        ">   bola\n" +        ">   guda\n" +        "\n" +        "chunda\n"; +    html = blogc_content_parse(a, strlen(a), &err); +    assert_null(err); +    assert_non_null(html); +    assert_string_equal(html, +        "<p>bola</p>\n" +        "<blockquote><p>bola\n" +        "guda</p>\n" +        "</blockquote>\n" +        "<p>chunda</p>\n"); +    free(html); +} + + +void +test_content_parse_code(void **state) +{ +    const char *a = "  bola\n  guda"; +    blogc_error_t *err = NULL; +    char *html = blogc_content_parse(a, strlen(a), &err); +    assert_null(err); +    assert_non_null(html); +    assert_string_equal(html, +        "<pre><code>bola\n" +        "guda</code></pre>\n"); +    free(html); +    a = "  bola\n  guda\n"; +    html = blogc_content_parse(a, strlen(a), &err); +    assert_null(err); +    assert_non_null(html); +    assert_string_equal(html, +        "<pre><code>bola\n" +        "guda</code></pre>\n"); +    free(html); +    a = +        "bola\n" +        "\n" +        "   bola\n" +        "   guda\n" +        "\n" +        "chunda\n"; +    html = blogc_content_parse(a, strlen(a), &err); +    assert_null(err); +    assert_non_null(html); +    assert_string_equal(html, +        "<p>bola</p>\n" +        "<pre><code>bola\n" +        "guda</code></pre>\n" +        "<p>chunda</p>\n"); +    free(html); +} + + +void +test_content_parse_invalid_header(void **state) +{ +    const char *a = +        "asd\n" +        "\n" +        "##bola\n"; +    blogc_error_t *err = NULL; +    char *html = blogc_content_parse(a, strlen(a), &err); +    assert_non_null(err); +    assert_null(html); +    assert_int_equal(err->type, BLOGC_ERROR_CONTENT_PARSER); +    assert_string_equal(err->msg, +        "Malformed header, no space or tab after '#'\n" +        "Error occurred near to 'bola'"); +    blogc_error_free(err); +} + + +void +test_content_parse_invalid_header_empty(void **state) +{ +    const char *a = +        "asd\n" +        "\n" +        "##\n" +        "\n" +        "qwe\n"; +    blogc_error_t *err = NULL; +    char *html = blogc_content_parse(a, strlen(a), &err); +    assert_non_null(err); +    assert_null(html); +    assert_int_equal(err->type, BLOGC_ERROR_CONTENT_PARSER); +    assert_string_equal(err->msg, +        "Malformed header, no space or tab after '#'"); +    blogc_error_free(err); +} + + +void +test_content_parse_invalid_blockquote(void **state) +{ +    const char *a = +        ">   asd\n" +        "> bola\n" +        ">   foo\n"; +    blogc_error_t *err = NULL; +    char *html = blogc_content_parse(a, strlen(a), &err); +    assert_non_null(err); +    assert_null(html); +    assert_int_equal(err->type, BLOGC_ERROR_CONTENT_PARSER); +    assert_string_equal(err->msg, +        "Malformed blockquote, must use same prefix as previous line(s): >   "); +    blogc_error_free(err); +} + + +void +test_content_parse_invalid_code(void **state) +{ +    const char *a = +        "    asd\n" +        "  bola\n" +        "    foo\n"; +    blogc_error_t *err = NULL; +    char *html = blogc_content_parse(a, strlen(a), &err); +    assert_non_null(err); +    assert_null(html); +    assert_int_equal(err->type, BLOGC_ERROR_CONTENT_PARSER); +    assert_string_equal(err->msg, +        "Malformed code block, must use same prefix as previous line(s): '    '"); +    blogc_error_free(err); +} + +  int  main(void)  {      const UnitTest tests[] = {          unit_test(test_content_parse), +        unit_test(test_content_parse_header), +        unit_test(test_content_parse_html), +        unit_test(test_content_parse_blockquote), +        unit_test(test_content_parse_code), +        unit_test(test_content_parse_invalid_header), +        unit_test(test_content_parse_invalid_header_empty), +        unit_test(test_content_parse_invalid_blockquote), +        unit_test(test_content_parse_invalid_code),      };      return run_tests(tests);  } | 
