]> git.draconx.ca Git - gob-dx.git/blobdiff - tests/options.at
Add test cases for various command-line options.
[gob-dx.git] / tests / options.at
diff --git a/tests/options.at b/tests/options.at
new file mode 100644 (file)
index 0000000..2f85019
--- /dev/null
@@ -0,0 +1,613 @@
+dnl Copyright © 2020 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.
+
+dnl Check that the --help option exits successfully and prints only to
+dnl standard output.
+AT_SETUP([--help option])
+AT_KEYWORDS([option])dnl
+
+# Currently prints to standard error :(
+AT_XFAIL_IF([:])
+AT_CHECK([gob2 invalid-file.gob --help --invalid-option], [0], [ignore-nolog])
+
+AT_CLEANUP
+
+dnl Check that the --version option exits successfully, prints only to
+dnl standard output, and contains the correct version number.
+AT_SETUP([--version option])
+AT_KEYWORDS([option])dnl
+
+# Currently prints to standard error :(
+AT_XFAIL_IF([:])
+AT_CHECK([gob2 invalid-file.gob --version --invalid-option], [0], [stdout])
+AT_CHECK([awk 'NR == 1 { print $NF }' stdout], [0], [AT_PACKAGE_VERSION
+])
+
+AT_CLEANUP
+
+AT_SETUP([--exit-on-warn option])
+AT_KEYWORDS([option])dnl
+
+AT_DATA([test.gob], [[class :Test from G:Object
+{
+  private int x;
+  /* gob produces a warning due to override and nick combination */
+  property INT x ( override, nick = "hello", link );
+}
+]])
+
+AT_CHECK([gob2 test.gob], [0], [], [ignore])
+AT_CHECK([gob2 test.gob --exit-on-warn], [1], [], [ignore])
+AT_CHECK([gob2 test.gob --no-exit-on-warn -w], [1], [], [ignore])
+
+AT_CLEANUP
+
+AT_SETUP([--no-exit-on-warn option])
+AT_KEYWORDS([option])dnl
+
+AT_DATA([test.gob], [[class :Test from G:Object
+{
+  private int x;
+  /* gob produces a warning due to override and nick combination */
+  property INT x ( override, nick = "hello", link );
+}
+]])
+
+AT_CHECK([gob2 test.gob], [0], [], [ignore])
+AT_CHECK([gob2 test.gob --exit-on-warn], [1], [], [ignore])
+AT_CHECK([gob2 test.gob -w --no-exit-on-warn], [0], [], [ignore])
+AT_CHECK([gob2 test.gob --exit-on-warn --no-exit-on-warn], [0], [], [ignore])
+
+AT_CLEANUP
+
+AT_SETUP([--ondemand-private-header option])
+AT_KEYWORDS([option])dnl
+
+AT_DATA([priv.gob], [[class A:B:C from G:Object {
+  private int x;
+}
+%{
+TEST_WITNESS_C
+%}
+%h{
+TEST_WITNESS_H
+%}
+%privateheader{
+TEST_WITNESS_PRIVATE
+%}
+]])
+sed '/private int/d' priv.gob >nopriv.gob
+
+rm -f *.c *.h
+AT_CHECK([gob2 nopriv.gob])
+AT_CHECK([grep '^TEST_WITNESS' a-b-c.c], [0], [TEST_WITNESS_C
+TEST_WITNESS_PRIVATE
+])
+AT_CHECK([grep '^TEST_WITNESS' a-b-c.h], [0], [TEST_WITNESS_H
+])
+AT_CHECK([test ! -f a-b-c-private.h])
+
+rm -f *.c *.h
+AT_CHECK([gob2 priv.gob])
+AT_CHECK([grep '^TEST_WITNESS' a-b-c.c], [0], [TEST_WITNESS_C
+])
+AT_CHECK([grep '^TEST_WITNESS' a-b-c.h], [0], [TEST_WITNESS_H
+])
+AT_CHECK([grep '^TEST_WITNESS' a-b-c-private.h], [0], [TEST_WITNESS_PRIVATE
+])
+
+rm -f *.c *.h
+AT_CHECK([gob2 nopriv.gob --always-private-header --ondemand-private-header])
+AT_CHECK([grep '^TEST_WITNESS' a-b-c.c], [0], [TEST_WITNESS_C
+TEST_WITNESS_PRIVATE
+])
+AT_CHECK([grep '^TEST_WITNESS' a-b-c.h], [0], [TEST_WITNESS_H
+])
+AT_CHECK([test ! -f a-b-c-private.h])
+
+rm -f *.c *.h
+AT_CHECK([gob2 priv.gob --no-private-header --ondemand-private-header])
+AT_CHECK([grep '^TEST_WITNESS' a-b-c.c], [0], [TEST_WITNESS_C
+])
+AT_CHECK([grep '^TEST_WITNESS' a-b-c.h], [0], [TEST_WITNESS_H
+])
+AT_CHECK([grep '^TEST_WITNESS' a-b-c-private.h], [0], [TEST_WITNESS_PRIVATE
+])
+
+AT_CLEANUP
+
+AT_SETUP([--always-private-header option])
+AT_KEYWORDS([option])dnl
+
+AT_DATA([priv.gob], [[class A:B:C from G:Object {
+  private int x;
+}
+%{
+TEST_WITNESS_C
+%}
+%h{
+TEST_WITNESS_H
+%}
+%privateheader{
+TEST_WITNESS_PRIVATE
+%}
+]])
+sed '/private int/d' priv.gob >nopriv.gob
+
+rm -f *.c *.h
+AT_CHECK([gob2 nopriv.gob --always-private-header])
+AT_CHECK([grep '^TEST_WITNESS' a-b-c.c], [0], [TEST_WITNESS_C
+])
+AT_CHECK([grep '^TEST_WITNESS' a-b-c.h], [0], [TEST_WITNESS_H
+])
+AT_CHECK([grep '^TEST_WITNESS' a-b-c-private.h], [0], [TEST_WITNESS_PRIVATE
+])
+
+rm -f *.c *.h
+AT_CHECK([gob2 priv.gob --no-private-header --always-private-header])
+AT_CHECK([grep '^TEST_WITNESS' a-b-c.c], [0], [TEST_WITNESS_C
+])
+AT_CHECK([grep '^TEST_WITNESS' a-b-c.h], [0], [TEST_WITNESS_H
+])
+AT_CHECK([grep '^TEST_WITNESS' a-b-c-private.h], [0], [TEST_WITNESS_PRIVATE
+])
+
+rm -f *.c *.h
+AT_CHECK([gob2 nopriv.gob --ondemand-private-header --always-private-header])
+AT_CHECK([grep '^TEST_WITNESS' a-b-c.c], [0], [TEST_WITNESS_C
+])
+AT_CHECK([grep '^TEST_WITNESS' a-b-c.h], [0], [TEST_WITNESS_H
+])
+AT_CHECK([grep '^TEST_WITNESS' a-b-c-private.h], [0], [TEST_WITNESS_PRIVATE
+])
+
+AT_CLEANUP
+
+AT_SETUP([--no-private-header option])
+AT_KEYWORDS([option])dnl
+
+AT_DATA([priv.gob], [[class A:B:C from G:Object {
+  private int x;
+}
+%{
+TEST_WITNESS_C
+%}
+%h{
+TEST_WITNESS_H
+%}
+%privateheader{
+TEST_WITNESS_PRIVATE
+%}
+]])
+sed '/private int/d' priv.gob >nopriv.gob
+
+rm -f *.c *.h
+AT_CHECK([gob2 priv.gob --no-private-header])
+AT_CHECK([grep '^TEST_WITNESS' a-b-c.c], [0], [TEST_WITNESS_C
+TEST_WITNESS_PRIVATE
+])
+AT_CHECK([grep '^TEST_WITNESS' a-b-c.h], [0], [TEST_WITNESS_H
+])
+AT_CHECK([test ! -f a-b-c-private.h])
+
+rm -f *.c *.h
+AT_CHECK([gob2 nopriv.gob --always-private-header --no-private-header])
+AT_CHECK([grep '^TEST_WITNESS' a-b-c.c], [0], [TEST_WITNESS_C
+TEST_WITNESS_PRIVATE
+])
+AT_CHECK([grep '^TEST_WITNESS' a-b-c.h], [0], [TEST_WITNESS_H
+])
+AT_CHECK([test ! -f a-b-c-private.h])
+
+rm -f *.c *.h
+AT_CHECK([gob2 priv.gob --ondemand-private-header --no-private-header])
+AT_CHECK([grep '^TEST_WITNESS' a-b-c.c], [0], [TEST_WITNESS_C
+TEST_WITNESS_PRIVATE
+])
+AT_CHECK([grep '^TEST_WITNESS' a-b-c.h], [0], [TEST_WITNESS_H
+])
+AT_CHECK([test ! -f a-b-c-private.h])
+
+AT_CLEANUP
+
+AT_SETUP([--file-sep option])
+AT_KEYWORDS([option])dnl
+
+AT_DATA([test.gob], [[class A:B:C from G:Object {
+}
+%{
+TEST_WITNESS_C
+%}
+%h{
+TEST_WITNESS_H
+%}
+%privateheader{
+TEST_WITNESS_PRIVATE
+%}
+]])
+
+mkdir a; mkdir a/b
+AT_CHECK([gob2 test.gob --file-sep=/])
+AT_CHECK([grep '^TEST_WITNESS' a/b/c.c], [0], [TEST_WITNESS_C
+TEST_WITNESS_PRIVATE
+])
+AT_CHECK([grep '^TEST_WITNESS' a/b/c.h], [0], [TEST_WITNESS_H
+])
+
+AT_CHECK([gob2 test.gob --always-private-header --file-sep=])
+AT_CHECK([grep '^TEST_WITNESS' abc.c], [0], [TEST_WITNESS_C
+])
+AT_CHECK([grep '^TEST_WITNESS' abc.h], [0], [TEST_WITNESS_H
+])
+AT_CHECK([grep '^TEST_WITNESS' abcprivate.h], [0], [TEST_WITNESS_PRIVATE
+])
+
+rm -f abc*
+AT_CHECK([gob2 test.gob --file-sep])
+AT_CHECK([grep '^TEST_WITNESS' abc.c], [0], [TEST_WITNESS_C
+TEST_WITNESS_PRIVATE
+])
+AT_CHECK([grep '^TEST_WITNESS' abc.h], [0], [TEST_WITNESS_H
+])
+
+AT_CLEANUP
+
+AT_SETUP([--output-dir option])
+AT_KEYWORDS([option])dnl
+
+AT_DATA([test.gob], [[class A:B:C from G:Object {
+}
+%{
+TEST_WITNESS_C
+%}
+%h{
+TEST_WITNESS_H
+%}
+]])
+
+mkdir output-dir o
+AT_CHECK([gob2 test.gob --output-dir=output-dir])
+AT_CHECK([grep '^TEST_WITNESS' output-dir/a-b-c.c], [0], [TEST_WITNESS_C
+])
+AT_CHECK([grep '^TEST_WITNESS' output-dir/a-b-c.h], [0], [TEST_WITNESS_H
+])
+
+AT_CHECK([gob2 test.gob -o o])
+AT_CHECK([grep '^TEST_WITNESS' o/a-b-c.c], [0], [TEST_WITNESS_C
+])
+AT_CHECK([grep '^TEST_WITNESS' o/a-b-c.h], [0], [TEST_WITNESS_H
+])
+
+AT_CLEANUP
+
+dnl Check that the --no-touch option does not modify any files that would be
+dnl unchanged by gob, and that the --no-touch-headers option does not modify
+dnl any header files.
+m4_foreach([OPTION], [[[--no-touch]], [[--no-touch-headers]]],
+[AT_SETUP([OPTION option])
+AT_KEYWORDS([option])dnl
+
+# Sanity check for make implementation
+touch test.h; touch test-h
+AT_CHECK([mtime_uptodate test-h test.h || exit 77])
+TEST_MTIME_DELAY; touch test.h
+AT_CHECK([mtime_uptodate test-h test.h && exit 77], [1])
+rm -f test.h
+
+AT_DATA([test.gob], [[class :Test from G:Object
+{
+  private int x;
+}
+]])
+
+m4_if(OPTION, [--no-touch-headers],
+[#Currently, the private header is modified even with --no-touch-headers.
+AT_XFAIL_IF([:])])dnl
+
+AT_CHECK([gob2 test.gob])
+touch test-c test-h test-private
+TEST_MTIME_DELAY
+AT_CHECK([gob2 test.gob])
+AT_CHECK([mtime_uptodate test-c test.c], [1])
+AT_CHECK([mtime_uptodate test-h test.h], [1])
+AT_CHECK([mtime_uptodate test-private test-private.h], [1])
+
+touch test-c test-h test-private
+TEST_MTIME_DELAY
+AT_CHECK([gob2 test.gob OPTION])
+AT_CHECK([mtime_uptodate test-c test.c],
+  m4_if(OPTION, [--no-touch], [0], [1]))
+AT_CHECK([mtime_uptodate test-h test.h], [0])
+AT_CHECK([mtime_uptodate test-private test-private.h], [0])
+
+cat >>test.gob <<'EOF'
+%{
+/* some code */
+%}
+EOF
+touch test-c test-h test-private
+TEST_MTIME_DELAY
+AT_CHECK([gob2 test.gob OPTION])
+AT_CHECK([mtime_uptodate test-c test.c], [1])
+AT_CHECK([mtime_uptodate test-h test.h], [0])
+AT_CHECK([mtime_uptodate test-private test-private.h], [0])
+
+cat >>test.gob <<'EOF'
+%h{
+/* yonder comment */
+%}
+EOF
+touch test-c test-h test-private
+TEST_MTIME_DELAY
+AT_CHECK([gob2 test.gob OPTION])
+AT_CHECK([mtime_uptodate test-c test.c],
+  m4_if(OPTION, [--no-touch], [0], [1]))
+AT_CHECK([mtime_uptodate test-h test.h], [1])
+AT_CHECK([mtime_uptodate test-private test-private.h], [0])
+
+cat >>test.gob <<'EOF'
+%privateheader{
+/* once more unto the breach */
+%}
+EOF
+touch test-c test-h test-private
+TEST_MTIME_DELAY
+AT_CHECK([gob2 test.gob OPTION])
+AT_CHECK([mtime_uptodate test-c test.c],
+  m4_if(OPTION, [--no-touch], [0], [1]))
+AT_CHECK([mtime_uptodate test-h test.h], [0])
+AT_CHECK([mtime_uptodate test-private test-private.h], [1])
+
+AT_CLEANUP
+])
+
+AT_SETUP([--no-write option])
+AT_KEYWORDS([option])dnl
+
+mkdir outdir
+AT_DATA([outdir/test.gob], [[class :Test from G:Object
+{
+  private int x;
+}
+]])
+AT_CHECK([cd outdir && ls -Al], [0], [stdout-nolog])
+mv -f stdout expout
+
+AT_CHECK([cd outdir && gob2 test.gob --no-write && ls -Al], [0], [expout])
+AT_CHECK([cd outdir && gob2 test.gob -n && ls -Al], [0], [expout])
+
+AT_CHECK([cd outdir && gob2 test.gob && ls -Al], [0], [stdout-nolog])
+mv -f stdout expout
+
+AT_CHECK([cd outdir && gob2 test.gob --no-write && ls -Al], [0], [expout])
+AT_CHECK([cd outdir && gob2 test.gob -n && ls -Al], [0], [expout])
+
+AT_CLEANUP
+
+AT_SETUP([--no-extern-c option])
+AT_KEYWORDS([option])dnl
+
+AT_DATA([test.gob], [[class :Test from G:Object
+{
+  private int x;
+}
+]])
+
+AT_CHECK([gob2 test.gob])
+AT_CHECK([cat *.h | grep 'extern "C"'], [0], [extern "C" {
+extern "C" {
+])
+
+AT_CHECK([gob2 --no-extern-c test.gob])
+AT_CHECK([cat *.h | grep 'extern "C"'], [1])
+
+AT_CLEANUP
+
+AT_SETUP([--no-gnu option])
+AT_KEYWORDS([option])dnl
+
+AT_DATA([test.gob], [[enum TEST_ENUM {
+  TEST_ENUM_A
+} Test:Enum;
+
+flags TEST_FLAGS {
+  TEST_FLAG_A
+} Test:Flags;
+
+error TEST_ERROR {
+  TEST_ERROR_A
+} Test:Error;
+
+class :Test from G:Object
+{
+  private int x;
+}
+]])
+
+# --no-gnu is currently busted for the get_type function declaration.
+AT_XFAIL_IF([:])
+
+AT_CHECK([gob2 test.gob])
+AT_CHECK([cat test*.h test.c | grep '_GNUC_' >/dev/null], [0])
+
+AT_CHECK([gob2 --no-gnu test.gob])
+AT_CHECK([cat test*.h test.c | grep '_GNUC_'], [1])
+
+AT_CLEANUP
+
+dnl Check that --no-self-alias works as documented.  The self_xxx method
+dnl aliases are not documented to be affected by this option, so check that
+dnl they are unaffected.
+AT_SETUP([--no-self-alias option])
+AT_KEYWORDS([option])dnl
+
+AT_DATA([test.gob], [[class :Test from G:Object
+{
+  public void myfunction(self) { };
+}
+]])
+
+AT_CHECK([gob2 test.gob])
+AT_CHECK([:; { grep '#define.*SELF' test.c &&
+grep 'typedef.*Self' test.c &&
+grep '#define.*self_myfunction' test.c; } >/dev/null], [0])
+
+AT_CHECK([gob2 --no-self-alias test.gob])
+AT_CHECK([grep '#.*define.*SELF' test.c], [1])
+AT_CHECK([grep 'typedef.*Self' test.c], [1])
+AT_CHECK([grep '#define.*self_myfunction' test.c >/dev/null], [0])
+
+AT_CLEANUP
+
+AT_SETUP([--no-lines option])
+AT_KEYWORDS([option])dnl
+
+AT_DATA([test.gob], [[class :Test from G:Object
+{
+  public int foo(void) { return 42; }
+  private int x;
+}
+]])
+
+AT_CHECK([gob2 test.gob])
+AT_CHECK([cat test.h test-private.h test.c | grep '#.*line' >/dev/null])
+
+AT_CHECK([gob2 --no-lines test.gob])
+AT_CHECK([cat test.h test-private.h test.c | grep '#.*line'], [1])
+
+AT_CLEANUP
+
+dnl Check that the --no-kill-underscores option is ignored for compatibility.
+AT_SETUP([--no-kill-underscores option])
+AT_KEYWORDS([option])dnl
+
+AT_DATA([test.gob], [[class :Test from G:Object
+{
+}
+]])
+
+mkdir orig
+AT_CHECK([gob2 --output-dir orig test.gob])
+AT_CHECK([gob2 --no-kill-underscores test.gob])
+
+cp -f orig/test.c expout
+AT_CHECK([cat test.c], [0], [expout])
+
+cp -f orig/test.h expout
+AT_CHECK([cat test.h], [0], [expout])
+
+AT_CLEANUP
+
+AT_SETUP([--always-private-struct option])
+AT_KEYWORDS([option])dnl
+
+AT_DATA([test.gob], [[class :Test from G:Object
+{
+  public int my_public_member;
+}
+]])
+
+AT_CHECK([gob2 test.gob])
+AT_CHECK([sed -n '/my_public_member/,/^}/s/_priv/&/p' test.h])
+
+AT_CHECK([gob2 --always-private-struct test.gob])
+AT_CHECK([sed -n '/my_public_member/,/^}/s/[[  ]]*\(.*_priv;\)/\1/p' test.h],
+  [0], [TestPrivate *_priv;
+])
+
+AT_CLEANUP
+
+dnl Check the --gtk3 option.  The only effect of this option seems to be to
+dnl change the normal "Iface" suffix on interface types to "Interface".  So
+dnl let's make sure that behaviour is tested.
+AT_SETUP([--gtk3 option])
+AT_KEYWORDS([option])dnl
+
+AT_DATA([test.gob], [[class :Test from G:Object
+  (interface Gtk:Actionable)
+{
+}
+]])
+
+AT_CHECK([gob2 test.gob])
+AT_CHECK([sed -n \
+  's/.*Gtk_Actionable_init.*\(GtkActionable[[^ *]]*\).*/\1/p' test.c], [0],
+  [GtkActionableIface
+])
+
+AT_CHECK([gob2 --gtk3 test.gob])
+AT_CHECK([sed -n \
+  's/.*Gtk_Actionable_init.*\(GtkActionable[[^ *]]*\).*/\1/p' test.c], [0],
+  [GtkActionableInterface
+])
+
+AT_CLEANUP
+
+AT_SETUP([--m4-dir option])
+AT_KEYWORDS([option])dnl
+AT_CHECK_UNQUOTED([gob2 --m4-dir], [0], [$pkgdatadir/m4
+])
+AT_CLEANUP
+
+dnl Check that the --m4 option shells out to m4 and passes through
+dnl all remaining arguments.
+AT_SETUP([--m4 option])
+AT_KEYWORDS([option])dnl
+
+mkdir bin
+AT_DATA([bin/m4], [[#!/bin/sh
+test $][# != 0 && printf '%s\n' "$][*" >&2
+cat <<'EOF'
+class M4:Test from G:Object
+{
+}
+EOF
+]])
+chmod +x bin/m4
+
+PATH=$PWD/bin${PATH:+":$PATH"}
+AT_CHECK([gob2 --m4 filename], [0], [], [stderr])
+read gob_m4_args <stderr
+AT_CHECK([test -f m4-test.c])
+
+rm -f m4-test.c m4-test.h
+cat >experr <<EOF
+$gob_m4_args --help I am trapped in a test case factory --
+EOF
+AT_CHECK([gob2 --m4 filename --help I am trapped in a test case factory --],
+  [0], [], [experr])
+AT_CHECK([test -f m4-test.c])
+
+AT_CLEANUP
+
+dnl Check that the --m4 option shells out to m4 and passes through
+dnl all remaining arguments without adding any additional arguments.
+AT_SETUP([--m4-clean option])
+AT_KEYWORDS([option])dnl
+
+mkdir bin
+AT_DATA([bin/m4], [[#!/bin/sh
+test $][# != 0 && printf '%s\n' "$][*" >&2
+cat <<'EOF'
+class M4:Test from G:Object
+{
+}
+EOF
+]])
+chmod +x bin/m4
+
+PATH=$PWD/bin${PATH:+":$PATH"}
+AT_CHECK([gob2 --m4-clean filename], [0], [], [filename
+])
+AT_CHECK([test -f m4-test.c])
+
+rm -f m4-test.c m4-test.h
+AT_CHECK(
+  [gob2 --m4-clean filename --help I am trapped in a test case factory --],
+  [0], [], [filename --help I am trapped in a test case factory --
+])
+AT_CHECK([test -f m4-test.c])
+
+AT_CLEANUP