173 lines
3.4 KiB
C
173 lines
3.4 KiB
C
#include <criterion/criterion.h>
|
|
#include <stdio.h>
|
|
|
|
#include "transpile.h"
|
|
#include "map.h"
|
|
|
|
static const char *sample_md_1 =
|
|
"# Test\n"
|
|
"```c\n"
|
|
"int main() {\n"
|
|
" return 0;\n"
|
|
"}\n"
|
|
"```\n";
|
|
|
|
static const char *sample_md_2 =
|
|
"# Multiple blocks\n"
|
|
"```c\n"
|
|
"#include <stdio.h>\n"
|
|
"```\n"
|
|
"Some text\n"
|
|
"```c\n"
|
|
"int main() {\n"
|
|
" return 0;\n"
|
|
"}\n"
|
|
"```\n";
|
|
|
|
/*
|
|
** TESTS: transpile/core.c - Single code block
|
|
*/
|
|
|
|
Test(transpile, single_code_block)
|
|
{
|
|
FILE *in;
|
|
FILE *out;
|
|
t_map map;
|
|
char buffer[256];
|
|
int8_t ret;
|
|
|
|
in = fopen("/tmp/test_transpile_in.md", "w");
|
|
fprintf(in, "%s", sample_md_1);
|
|
fclose(in);
|
|
|
|
in = fopen("/tmp/test_transpile_in.md", "r");
|
|
out = fopen("/tmp/test_transpile_out.c", "w");
|
|
|
|
map_init(&map);
|
|
ret = transpile(in, out, "c", &map);
|
|
|
|
fclose(in);
|
|
fclose(out);
|
|
|
|
cr_assert_eq(ret, 0);
|
|
cr_assert_eq(map.count, 1);
|
|
cr_assert_eq(map.ranges[0].src_start, 3);
|
|
cr_assert_eq(map.ranges[0].src_end, 5);
|
|
cr_assert_eq(map.ranges[0].dst_start, 1);
|
|
cr_assert_eq(map.ranges[0].dst_end, 3);
|
|
|
|
out = fopen("/tmp/test_transpile_out.c", "r");
|
|
fgets(buffer, sizeof(buffer), out);
|
|
cr_assert_str_eq(buffer, "int main() {\n");
|
|
fgets(buffer, sizeof(buffer), out);
|
|
cr_assert_str_eq(buffer, " return 0;\n");
|
|
fgets(buffer, sizeof(buffer), out);
|
|
cr_assert_str_eq(buffer, "}\n");
|
|
fclose(out);
|
|
|
|
map_free(&map);
|
|
remove("/tmp/test_transpile_in.md");
|
|
remove("/tmp/test_transpile_out.c");
|
|
}
|
|
|
|
/*
|
|
** TESTS: transpile/core.c - Multiple blocks
|
|
*/
|
|
|
|
Test(transpile, multiple_blocks)
|
|
{
|
|
FILE *in;
|
|
FILE *out;
|
|
t_map map;
|
|
char buffer[256];
|
|
int8_t ret;
|
|
|
|
in = fopen("/tmp/test_transpile_multi_in.md", "w");
|
|
fprintf(in, "%s", sample_md_2);
|
|
fclose(in);
|
|
|
|
in = fopen("/tmp/test_transpile_multi_in.md", "r");
|
|
out = fopen("/tmp/test_transpile_multi_out.c", "w");
|
|
|
|
map_init(&map);
|
|
ret = transpile(in, out, "c", &map);
|
|
|
|
fclose(in);
|
|
fclose(out);
|
|
|
|
cr_assert_eq(ret, 0);
|
|
cr_assert_eq(map.count, 2);
|
|
|
|
out = fopen("/tmp/test_transpile_multi_out.c", "r");
|
|
fgets(buffer, sizeof(buffer), out);
|
|
cr_assert_str_eq(buffer, "#include <stdio.h>\n");
|
|
fgets(buffer, sizeof(buffer), out);
|
|
cr_assert_str_eq(buffer, "\n");
|
|
fgets(buffer, sizeof(buffer), out);
|
|
cr_assert_str_eq(buffer, "int main() {\n");
|
|
fclose(out);
|
|
|
|
map_free(&map);
|
|
remove("/tmp/test_transpile_multi_in.md");
|
|
remove("/tmp/test_transpile_multi_out.c");
|
|
}
|
|
|
|
/*
|
|
** TESTS: transpile/core.c - Edge cases
|
|
*/
|
|
|
|
Test(transpile, empty_input)
|
|
{
|
|
FILE *in;
|
|
FILE *out;
|
|
t_map map;
|
|
int8_t ret;
|
|
|
|
in = fopen("/tmp/test_transpile_empty_in.md", "w");
|
|
fclose(in);
|
|
|
|
in = fopen("/tmp/test_transpile_empty_in.md", "r");
|
|
out = fopen("/tmp/test_transpile_empty_out.c", "w");
|
|
|
|
map_init(&map);
|
|
ret = transpile(in, out, "c", &map);
|
|
|
|
fclose(in);
|
|
fclose(out);
|
|
|
|
cr_assert_eq(ret, 0);
|
|
cr_assert_eq(map.count, 0);
|
|
|
|
map_free(&map);
|
|
remove("/tmp/test_transpile_empty_in.md");
|
|
remove("/tmp/test_transpile_empty_out.c");
|
|
}
|
|
|
|
Test(transpile, no_matching_blocks)
|
|
{
|
|
FILE *in;
|
|
FILE *out;
|
|
t_map map;
|
|
int8_t ret;
|
|
const char *no_match = "```python\nprint('hello')\n```\n";
|
|
|
|
in = fopen("/tmp/test_transpile_nomatch_in.md", "w");
|
|
fprintf(in, "%s", no_match);
|
|
fclose(in);
|
|
|
|
in = fopen("/tmp/test_transpile_nomatch_in.md", "r");
|
|
out = fopen("/tmp/test_transpile_nomatch_out.c", "w");
|
|
|
|
map_init(&map);
|
|
ret = transpile(in, out, "c", &map);
|
|
|
|
fclose(in);
|
|
fclose(out);
|
|
|
|
cr_assert_eq(ret, 0);
|
|
cr_assert_eq(map.count, 0);
|
|
|
|
map_free(&map);
|
|
remove("/tmp/test_transpile_nomatch_in.md");
|
|
remove("/tmp/test_transpile_nomatch_out.c");
|
|
}
|