Mercurial > irccd
diff tests/test-jsapi-file.c @ 963:371e1cc2c697
tests: add 80% of the Javascript API
author | David Demelier <markand@malikania.fr> |
---|---|
date | Thu, 28 Jan 2021 14:20:58 +0100 |
parents | |
children | a518664b20a0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-jsapi-file.c Thu Jan 28 14:20:58 2021 +0100 @@ -0,0 +1,452 @@ +/* + * test-jsapi-file.c -- test Irccd.File API + * + * Copyright (c) 2013-2021 David Demelier <markand@malikania.fr> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/stat.h> +#include <stdio.h> + +#define GREATEST_USE_ABBREVS 0 +#include <greatest.h> + +#include <irccd/js-plugin.h> +#include <irccd/plugin.h> + +static struct irc_plugin *plugin; +static struct irc_js_plugin_data *data; + +static void +setup(void *udata) +{ + (void)udata; + + plugin = irc_js_plugin_open(SOURCE "/data/example-plugin.js"); + data = plugin->data; + + duk_push_string(data->ctx, SOURCE); + duk_put_global_string(data->ctx, "SOURCE"); + + duk_push_string(data->ctx, BINARY); + duk_put_global_string(data->ctx, "BINARY"); +} + +static void +teardown(void *udata) +{ + (void)udata; + + irc_plugin_finish(plugin); + + plugin = NULL; + data = NULL; +} + +GREATEST_TEST +free_basename(void) +{ + if (duk_peval_string(data->ctx, "result = Irccd.File.basename('/usr/local/etc/irccd.conf');")) + GREATEST_FAIL(); + + GREATEST_ASSERT(duk_get_global_string(data->ctx, "result")); + GREATEST_ASSERT_STR_EQ("irccd.conf", duk_get_string(data->ctx, -1)); + + GREATEST_PASS(); +} + +GREATEST_TEST +free_dirname(void) +{ + if (duk_peval_string(data->ctx, "result = Irccd.File.dirname('/usr/local/etc/irccd.conf');")) + GREATEST_FAIL(); + + GREATEST_ASSERT(duk_get_global_string(data->ctx, "result")); + GREATEST_ASSERT_STR_EQ("/usr/local/etc", duk_get_string(data->ctx, -1)); + + GREATEST_PASS(); +} + +GREATEST_TEST +free_exists(void) +{ + if (duk_peval_string(data->ctx, "result = Irccd.File.exists(SOURCE + '/data/root/file-1.txt')")) + GREATEST_FAIL(); + + GREATEST_ASSERT(duk_get_global_string(data->ctx, "result")); + GREATEST_ASSERT(duk_get_boolean(data->ctx, -1)); + + GREATEST_PASS(); +} + +GREATEST_TEST +free_exists2(void) +{ + if (duk_peval_string(data->ctx, "result = Irccd.File.exists('file_which_does_not_exist.txt')")) + GREATEST_FAIL(); + + GREATEST_ASSERT(duk_get_global_string(data->ctx, "result")); + GREATEST_ASSERT(!duk_get_boolean(data->ctx, -1)); + + GREATEST_PASS(); +} + +GREATEST_TEST +free_remove(void) +{ + FILE *fp; + struct stat st; + + if (!(fp = fopen(BINARY "/test.bin", "w"))) + GREATEST_FAIL(); + + fclose(fp); + + if (duk_peval_string(data->ctx, "Irccd.File.remove(BINARY + '/test.bin')") != 0) + GREATEST_FAIL(); + + GREATEST_ASSERT(stat(BINARY "/test.bin", &st) < 0); + + GREATEST_PASS(); +} + +GREATEST_SUITE(suite_free) +{ + GREATEST_SET_SETUP_CB(setup, NULL); + GREATEST_SET_TEARDOWN_CB(teardown, NULL); + GREATEST_RUN_TEST(free_basename); + GREATEST_RUN_TEST(free_dirname); + GREATEST_RUN_TEST(free_exists); + GREATEST_RUN_TEST(free_exists2); + GREATEST_RUN_TEST(free_remove); +} + +GREATEST_TEST +object_basename(void) +{ + const int ret = duk_peval_string(data->ctx, + "f = new Irccd.File(SOURCE + '/data/root/file-1.txt', 'r');" + "result = f.basename();" + ); + + if (ret != 0) + GREATEST_FAIL(); + + GREATEST_ASSERT(duk_get_global_string(data->ctx, "result")); + GREATEST_ASSERT_STR_EQ("file-1.txt", duk_get_string(data->ctx, -1)); + + GREATEST_PASS(); +} + +GREATEST_TEST +object_basename_closed(void) +{ + const int ret = duk_peval_string(data->ctx, + "f = new Irccd.File(SOURCE + '/data/root/file-1.txt', 'r');" + "f.close();" + "result = f.basename();" + ); + + if (ret != 0) + GREATEST_FAIL(); + + GREATEST_ASSERT(duk_get_global_string(data->ctx, "result")); + GREATEST_ASSERT_STR_EQ("file-1.txt", duk_get_string(data->ctx, -1)); + + GREATEST_PASS(); +} + +GREATEST_TEST +object_dirname(void) +{ + const int ret = duk_peval_string(data->ctx, + "f = new Irccd.File(SOURCE + '/data/root/file-1.txt', 'r');" + "result = f.dirname();" + ); + + if (ret != 0) + GREATEST_FAIL(); + + GREATEST_ASSERT(duk_get_global_string(data->ctx, "result")); + GREATEST_ASSERT_STR_EQ(SOURCE "/data/root", duk_get_string(data->ctx, -1)); + + GREATEST_PASS(); +} + +GREATEST_TEST +object_dirname_closed(void) +{ + const int ret = duk_peval_string(data->ctx, + "f = new Irccd.File(SOURCE + '/data/root/file-1.txt', 'r');" + "f.close();" + "result = f.dirname();" + ); + + if (ret != 0) + GREATEST_FAIL(); + + GREATEST_ASSERT(duk_get_global_string(data->ctx, "result")); + GREATEST_ASSERT_STR_EQ(SOURCE "/data/root", duk_get_string(data->ctx, -1)); + + GREATEST_PASS(); +} + +GREATEST_TEST +object_lines(void) +{ + const int ret = duk_peval_string(data->ctx, + "result = new Irccd.File(SOURCE + '/data/root/lines.txt', 'r').lines();" + ); + + if (ret != 0) + GREATEST_FAIL(); + + GREATEST_ASSERT(duk_get_global_string(data->ctx, "result")); + GREATEST_ASSERT_EQ(3, duk_get_length(data->ctx, -1)); + GREATEST_ASSERT(duk_get_prop_index(data->ctx, -1, 0)); + GREATEST_ASSERT_STR_EQ("a", duk_get_string(data->ctx, -1)); + GREATEST_ASSERT(duk_get_prop_index(data->ctx, -2, 1)); + GREATEST_ASSERT_STR_EQ("b", duk_get_string(data->ctx, -1)); + GREATEST_ASSERT(duk_get_prop_index(data->ctx, -3, 2)); + GREATEST_ASSERT_STR_EQ("c", duk_get_string(data->ctx, -1)); + + GREATEST_PASS(); +} + +GREATEST_TEST +object_lines_closed(void) +{ + const int ret = duk_peval_string(data->ctx, + "try {" + " f = new Irccd.File(SOURCE + '/data/root/lines.txt', 'r');" + " f.close();" + " f.lines();" + "} catch (e) {" + " name = e.name;" + "}" + ); + + if (ret != 0) + GREATEST_FAIL(); + + GREATEST_ASSERT(duk_get_global_string(data->ctx, "name")); + GREATEST_ASSERT_STR_EQ("SystemError", duk_get_string(data->ctx, -1)); + + GREATEST_PASS(); +} + +GREATEST_TEST +object_seek1(void) +{ + const int ret = duk_peval_string(data->ctx, + "f = new Irccd.File(SOURCE + '/data/root/file-1.txt', 'r');" + "f.seek(Irccd.File.SeekSet, 6);" + "result = f.read(1);" + ); + + if (ret != 0) + GREATEST_FAIL(); + + GREATEST_ASSERT(duk_get_global_string(data->ctx, "result")); + GREATEST_ASSERT_STR_EQ(".", duk_get_string(data->ctx, -1)); + + GREATEST_PASS(); +} + +GREATEST_TEST +object_seek2(void) +{ + const int ret = duk_peval_string(data->ctx, + "f = new Irccd.File(SOURCE + '/data/root/file-1.txt', 'r');" + "f.seek(Irccd.File.SeekSet, 2);" + "f.seek(Irccd.File.SeekCur, 4);" + "result = f.read(1);" + ); + + if (ret != 0) + GREATEST_FAIL(); + + GREATEST_ASSERT(duk_get_global_string(data->ctx, "result")); + GREATEST_ASSERT_STR_EQ(".", duk_get_string(data->ctx, -1)); + + GREATEST_PASS(); +} + +GREATEST_TEST +object_seek3(void) +{ + const int ret = duk_peval_string(data->ctx, + "f = new Irccd.File(SOURCE + '/data/root/file-1.txt', 'r');" + "f.seek(Irccd.File.SeekEnd, -2);" + "result = f.read(1);" + ); + + if (ret != 0) + GREATEST_FAIL(); + + GREATEST_ASSERT(duk_get_global_string(data->ctx, "result")); + GREATEST_ASSERT_STR_EQ("t", duk_get_string(data->ctx, -1)); + + GREATEST_PASS(); +} + +GREATEST_TEST +object_seek_closed(void) +{ + const int ret = duk_peval_string(data->ctx, + "try {" + " f = new Irccd.File(SOURCE + '/data/root/file-1.txt', 'r');" + " f.close();" + " f.seek(Irccd.File.SeekEnd, -2);" + "} catch (e) {" + " name = e.name" + "}" + ); + + if (ret != 0) + GREATEST_FAIL(); + + GREATEST_ASSERT(duk_get_global_string(data->ctx, "name")); + GREATEST_ASSERT_STR_EQ("SystemError", duk_get_string(data->ctx, -1)); + + GREATEST_PASS(); +} + +GREATEST_TEST +object_read(void) +{ + const int ret = duk_peval_string(data->ctx, + "f = new Irccd.File(SOURCE + '/data/root/file-1.txt', 'r');" + "result = f.read();" + ); + + if (ret != 0) + GREATEST_FAIL(); + + GREATEST_ASSERT(duk_get_global_string(data->ctx, "result")); + GREATEST_ASSERT_STR_EQ("file-1.txt\n", duk_get_string(data->ctx, -1)); + + GREATEST_PASS(); +} + +GREATEST_TEST +object_read_closed(void) +{ + const int ret = duk_peval_string(data->ctx, + "try {" + " f = new Irccd.File(SOURCE + '/data/root/file-1.txt', 'r');" + " f.close();" + " f.read();" + "} catch (e) {" + " name = e.name;" + "}" + ); + + if (ret != 0) + GREATEST_FAIL(); + + GREATEST_ASSERT(duk_get_global_string(data->ctx, "name")); + GREATEST_ASSERT_STR_EQ("SystemError", duk_get_string(data->ctx, -1)); + + GREATEST_PASS(); +} + +GREATEST_TEST +object_readline(void) +{ + const int ret = duk_peval_string(data->ctx, + "result = [];" + "f = new Irccd.File(SOURCE + '/data/root/lines.txt', 'r');" + "for (var s; s = f.readline(); ) {" + " result.push(s);" + "}" + ); + + if (ret != 0) { + puts(duk_to_string(data->ctx, -1)); + GREATEST_FAIL(); + } + + GREATEST_ASSERT(duk_get_global_string(data->ctx, "result")); + GREATEST_ASSERT_EQ(3, duk_get_length(data->ctx, -1)); + GREATEST_ASSERT(duk_get_prop_index(data->ctx, -1, 0)); + GREATEST_ASSERT_STR_EQ("a", duk_get_string(data->ctx, -1)); + GREATEST_ASSERT(duk_get_prop_index(data->ctx, -2, 1)); + GREATEST_ASSERT_STR_EQ("b", duk_get_string(data->ctx, -1)); + GREATEST_ASSERT(duk_get_prop_index(data->ctx, -3, 2)); + GREATEST_ASSERT_STR_EQ("c", duk_get_string(data->ctx, -1)); + + GREATEST_PASS(); +} + +GREATEST_TEST +object_readline_closed(void) +{ + const int ret = duk_peval_string(data->ctx, + "try {" + " result = [];" + " f = new Irccd.File(SOURCE + '/data/root/lines.txt', 'r');" + " f.close();" + " for (var s; s = f.readline(); ) {" + " result.push(s);" + " }" + "} catch (e) {" + " name = e.name;" + "}\n" + + ); + + if (ret != 0) + GREATEST_FAIL(); + + GREATEST_ASSERT(duk_get_global_string(data->ctx, "result")); + GREATEST_ASSERT_EQ(0, duk_get_length(data->ctx, -1)); + GREATEST_ASSERT(duk_get_global_string(data->ctx, "name")); + GREATEST_ASSERT_STR_EQ("SystemError", duk_get_string(data->ctx, -1)); + + GREATEST_PASS(); +} + +GREATEST_SUITE(suite_object) +{ + GREATEST_SET_SETUP_CB(setup, NULL); + GREATEST_SET_TEARDOWN_CB(teardown, NULL); + GREATEST_RUN_TEST(object_basename); + GREATEST_RUN_TEST(object_basename_closed); + GREATEST_RUN_TEST(object_dirname); + GREATEST_RUN_TEST(object_dirname_closed); + GREATEST_RUN_TEST(object_lines); + GREATEST_RUN_TEST(object_lines_closed); + GREATEST_RUN_TEST(object_seek1); + GREATEST_RUN_TEST(object_seek2); + GREATEST_RUN_TEST(object_seek3); + GREATEST_RUN_TEST(object_seek_closed); + GREATEST_RUN_TEST(object_read); + GREATEST_RUN_TEST(object_read_closed); + GREATEST_RUN_TEST(object_readline); + GREATEST_RUN_TEST(object_readline_closed); +} + +GREATEST_MAIN_DEFS(); + +int +main(int argc, char **argv) +{ + GREATEST_MAIN_BEGIN(); + GREATEST_RUN_SUITE(suite_free); + GREATEST_RUN_SUITE(suite_object); + GREATEST_MAIN_END(); + + return 0; +}