X-Git-Url: https://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/9e15b38133dbce39d340806433ea84f995753717..998925c8d088559a780a9f4fa63f66bad3e3321e:/tests/general.at diff --git a/tests/general.at b/tests/general.at index 7b03f4e..a9d2def 100644 --- a/tests/general.at +++ b/tests/general.at @@ -1,4 +1,4 @@ -dnl Copyright © 2019-2020 Nick Bowler +dnl Copyright © 2019-2023 Nick Bowler dnl License GPLv2+: GNU General Public License version 2 or any later version. dnl This is free software: you are free to change and redistribute it. dnl There is NO WARRANTY, to the extent permitted by law. @@ -21,23 +21,48 @@ AT_CLEANUP AT_SETUP([str.gob]) +# check if compiler supports format warnings +AT_DATA([fmt.c], +[[#include +#include + +void foo(const char *, ...) G_GNUC_PRINTF(1, 2); +void bar(void) { +#line 99 "VERIFY" +foo("%s", 0); +} +]]) +AT_DATA([fmt.awk], +[[BEGIN { pass=0; FS=":"; } +/%s/ && $1 == "VERIFY" && $2 == 99 { pass=1; } +END { exit(!pass); } +]]) + +fmt_warnings=false +set x $CPPFLAGS $CFLAGS $LIBGOBJECT_CFLAGS; shift +AS_IF([$CC "$@" -c fmt.c 1>/dev/null 2>out && $AWK -f fmt.awk out], + [fmt_warnings=:], + [AS_IF([$CC "$@" -Wformat -c fmt.c 1>/dev/null 2>out && $AWK -f fmt.awk out], + [CFLAGS="$CFLAGS -Wformat" fmt_warnings=:])]) + AT_DATA([main.c], [[#include #include "str.h" int main(void) { - g_type_init (); - - int the_answer = 42; + Str *test_good, *test_bad; char *stupid_pointer = "ug"; + int the_answer = 42; + + g_type_init (); /* This works fine. */ - Str *test_good = (Str *) (str_new ("%d", the_answer)); + test_good = (Str *) (str_new ("%d", the_answer)); test_good = test_good; /* This gets a warning thanks to our function attribute. */ - Str *test_bad = (Str *) (str_new ("%d", stupid_pointer)); + test_bad = (Str *) (str_new ("%d", stupid_pointer)); test_bad = test_bad; return 0; @@ -46,25 +71,46 @@ int main(void) str_gob=$abs_top_srcdir/t/str.gob AT_CHECK([gob2 "$str_gob"]) +AT_CHECK([$HAVE_GOBJECT_PRIVATES || exit 77]) + TEST_COMPILE_GOBJECT([str.c], [0], [], [stderr]) mv stderr str_stderr +TEST_COMPILE_GOBJECT([main.c], [0], [], [stderr]) +mv stderr main_stderr +TEST_LINK_GOBJECT([main], [str.o main.o]) + +AT_DATA([str.awk], +[[/want a string/ { lines[NR] = 1; } +END { + FS=":"; + while ((rc = getline < "str_stderr") > 0) { + sub(/.*[\/]/, "", $1); + if (/%s/ && $1 == "str.gob" && $2 in lines) + lines[$2]--; + } -# Check for correct diagnostic messages on the target lines... -AT_CHECK([awk '/want a string/ { print NR }' "$str_gob" >str_lines]) -total=0 -exec 3 #include "test.h" int main(void) { + g_type_init(); test_register_type(NULL); } ]]) - -TEST_COMPILE_GOBJECT([test.c], [0], [], [ignore]) TEST_COMPILE_GOBJECT([main.c], [0], [], [ignore]) -AT_CHECK([$CC $CFLAGS $LDFLAGS $LIBGOBJECT_LIBS -o main test.o main.o]) +TEST_LINK_GOBJECT([main], [test.o main.o]) AT_CLEANUP @@ -138,6 +184,8 @@ int main(void) guint handler; Test *t; + g_type_init(); + /* should fail, suppress internal glib logging... */ handler = g_log_set_handler("GLib-GObject", G_LOG_LEVEL_MASK, devnull, 0); t = g_object_new(test_get_type(), NULL); @@ -158,9 +206,7 @@ int main(void) } ]]) TEST_COMPILE_GOBJECT([main.c], [0], [], [ignore]) - -AT_CHECK([$CC $CFLAGS $LDFLAGS $LIBGOBJECT_LIBS -o main \ - test.o test-mod.o main.o]) +TEST_LINK_GOBJECT([main], [test.o test-mod.o main.o]) AT_CHECK([./main], [0], [Hello, World ]) @@ -189,6 +235,7 @@ AT_DATA([test.in], [[@GOB2@ cat >configure.ac < +%} +class :Test from G:Object +{ + private int x = 42; + + public int get_x(G:Object *go) { return TEST(go)->_priv->x; } + public void set_x(G:Object *go, int val) { TEST(go)->_priv->x = val; } +} +]]) +AT_CHECK([gob2 test.gob]) +AT_CHECK([$HAVE_GOBJECT_PRIVATES || exit 77]) +TEST_COMPILE_GOBJECT([test.c], [0], [], [ignore]) + +AT_DATA([main.c], [[#include +#include +#include "test.h" + +int main(void) +{ + GObject *go; + + g_type_init(); + go = g_object_new(test_get_type(), NULL); + + printf("%d\n", test_get_x(go)); + printf("%d\n", (test_set_x(go, 123), test_get_x(go))); + + return 0; +} +]]) +TEST_COMPILE_GOBJECT([main.c], [0], [], [ignore]) +TEST_LINK_GOBJECT([main], [test.o main.o]) +AT_CHECK([./main], [0], [42 +123 +]) + +AT_CLEANUP + +AT_SETUP([private data members (dynamic)]) + +AT_DATA([test.gob], [[%ctop{ +#include +%} +class :Test from G:Object (dynamic) +{ + private int x = 54; + + public int get_x(G:Object *go) { return TEST(go)->_priv->x; } + public void set_x(G:Object *go, int val) { TEST(go)->_priv->x = val; } +} +]]) +AT_CHECK([gob2 test.gob]) +AT_CHECK([$HAVE_GOBJECT_PRIVATES || exit 77]) +TEST_COMPILE_GOBJECT([test.c], [0], [], [ignore]) + +TEST_TYPE_MODULE([:Test]) + +AT_DATA([main.c], [[#include +#include +#include "test.h" +#include "test-mod.h" + +int main(void) +{ + GObject *go; + + g_type_init(); + g_type_module_use(g_object_new(test_mod_get_type(), NULL)); + go = g_object_new(test_get_type(), NULL); + + printf("%d\n", test_get_x(go)); + printf("%d\n", (test_set_x(go, 123), test_get_x(go))); + + return 0; +} +]]) +TEST_COMPILE_GOBJECT([main.c], [0], [], [ignore]) +TEST_LINK_GOBJECT([main], [test.o test-mod.o main.o]) +AT_CHECK([./main], [0], [54 +123 +]) + +AT_CLEANUP