From 449cb073c0c3dbf3c19e288a38559f6ee952dc81 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 16 Apr 2009 14:47:22 +0000 Subject: [PATCH] added a failtest target to Makefile to test for the (expected) compilation failures git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60200 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- tests/Makefile.in | 17 +++++++++++++++ tests/events/evthandler.cpp | 43 +++++++++++++++++++++++++------------ tests/test.bkl | 18 ++++++++++++++++ 3 files changed, 64 insertions(+), 14 deletions(-) diff --git a/tests/Makefile.in b/tests/Makefile.in index 3ac2885e14..f5c1b47c29 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -628,6 +628,23 @@ printfbench_printfbench.o: $(srcdir)/benchmarks/printfbench.cpp $(PRINTFBENCH_OD @COND_USE_STC_1@monolib_stc.o monodll_stc.o stcdll_stc.o stclib_stc.o: \ @COND_USE_STC_1@ $(srcdir)/include/wx/stc/stc.h +# notice the ugly hack with using CXXWARNINGS: we can't use CPPFLAGS as +# currently the value in the makefile would be ignored if we did, but +# warnings don't matter when we expect compilation to fail anyhow so we can +# use this variable to enable the compilation of code which is supposed to +# fail +failtest: + @$(RM) test_evthandler.o + @for d in GLOBAL STATIC METHOD FUNCTOR DERIVED WRONG_CLASS; do \ + if $(MAKE) CXXWARNINGS=-DTEST_INVALID_BIND_$$d test_evthandler.o 2>/dev/null; then \ + echo "*** Compilation with TEST_INVALID_BIND_$$d unexpectedly succeeded.">&2; \ + exit 1; \ + fi; \ + done; \ + exit 0 + +.PHONY: failtest + # Include dependency info, if present: @IF_GNU_MAKE@-include ./.deps/*.d diff --git a/tests/events/evthandler.cpp b/tests/events/evthandler.cpp index 031a0658da..309b34442f 100644 --- a/tests/events/evthandler.cpp +++ b/tests/events/evthandler.cpp @@ -366,20 +366,35 @@ void EvtHandlerTestCase::InvalidBind() // automatically, you need to uncomment them manually and test that // compilation does indeed fail - //handler.Bind(MyEventType, GlobalOnAnotherEvent); - //IdleFunctor f; handler.Bind(MyEventType, f); - //handler.Bind(MyEventType, &MyHandler::StaticOnAnotherEvent); - //handler.Bind(MyEventType, &MyHandler::OnAnotherEvent, &handler); - - // Test that this sample (discussed on the mailing list) doesn't compile: - // >struct C1 : wxEvtHandler { }; - // >struct C2 : wxEvtHandler { void OnWhatever(wxEvent&) }; - // >C1 c1; - // >c1.Connect(&C2::OnWhatever); // BOOM - - //MySink mySink; - //MyHandler myHandler; - //myHandler.Bind( MyEventType, &MyHandler::OnMyEvent, &mySink ); + // connecting a handler with incompatible signature shouldn't work +#ifdef TEST_INVALID_BIND_GLOBAL + handler.Bind(MyEventType, GlobalOnAnotherEvent); +#endif +#ifdef TEST_INVALID_BIND_STATIC + handler.Bind(MyEventType, &MyHandler::StaticOnAnotherEvent); +#endif +#ifdef TEST_INVALID_BIND_METHOD + handler.Bind(MyEventType, &MyHandler::OnAnotherEvent, &handler); +#endif +#ifdef TEST_INVALID_BIND_FUNCTOR + IdleFunctor f; + handler.Bind(MyEventType, f); +#endif + + // calling a derived class method with a base class pointer must not work +#ifdef TEST_INVALID_BIND_DERIVED + struct C1 : wxEvtHandler { }; + struct C2 : wxEvtHandler { void OnWhatever(wxEvent&); }; + C1 c1; + c1.Bind(&C2::OnWhatever); +#endif + + // using object pointer incompatible with the method must not work +#ifdef TEST_INVALID_BIND_WRONG_CLASS + MySink mySink; + MyHandler myHandler; + myHandler.Bind(MyEventType, &MyHandler::OnMyEvent, &mySink); +#endif } #endif // !wxEVENTS_COMPATIBILITY_2_8 diff --git a/tests/test.bkl b/tests/test.bkl index 31507cdf56..b78a570a0c 100644 --- a/tests/test.bkl +++ b/tests/test.bkl @@ -168,5 +168,23 @@ base + +# notice the ugly hack with using CXXWARNINGS: we can't use CPPFLAGS as +# currently the value in the makefile would be ignored if we did, but +# warnings don't matter when we expect compilation to fail anyhow so we can +# use this variable to enable the compilation of code which is supposed to +# fail +failtest: + @$(RM) test_evthandler.o + @for d in GLOBAL STATIC METHOD FUNCTOR DERIVED WRONG_CLASS; do \ + if $(MAKE) CXXWARNINGS=-DTEST_INVALID_BIND_$$d test_evthandler.o 2>/dev/null; then \ + echo "*** Compilation with TEST_INVALID_BIND_$$d unexpectedly succeeded.">&2; \ + exit 1; \ + fi; \ + done; \ + exit 0 + +.PHONY: failtest + -- 2.45.2