X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/51fb8678192eaba41e4a446f092c0027d786bd05..598fe99d56158319f6b5f817c4670748f98bc70a:/tests/fswatcher/fswatchertest.cpp diff --git a/tests/fswatcher/fswatchertest.cpp b/tests/fswatcher/fswatchertest.cpp index f28fee917e..a3fc759dcc 100644 --- a/tests/fswatcher/fswatchertest.cpp +++ b/tests/fswatcher/fswatchertest.cpp @@ -17,6 +17,10 @@ #pragma hdrstop #endif +#ifndef WX_PRECOMP + #include "wx/timer.h" +#endif + #include "wx/evtloop.h" #include "wx/filename.h" #include "wx/filefn.h" @@ -331,19 +335,6 @@ public: const wxFileSystemWatcherEvent * const e = m_events.front(); - WX_ASSERT_EQUAL_MESSAGE - ( - ( - "Extra events received, first is of type %x, for path=\"%s\"," - "last is of type %x, path=\"%s\"", - e->GetChangeType(), - e->GetPath().GetFullPath(), - m_events.back()->GetChangeType(), - m_events.back()->GetPath().GetFullPath() - ), - 1, m_events.size() - ); - // this is our "reference event" const wxFileSystemWatcherEvent expected = ExpectedEvent(); @@ -356,6 +347,35 @@ public: CPPUNIT_ASSERT_EQUAL(expected.GetPath(), e->GetPath()); CPPUNIT_ASSERT_EQUAL(expected.GetNewPath(), e->GetNewPath()); + + // Under MSW extra modification events are sometimes reported after a + // rename and we just can't get rid of them, so ignore them in this + // test if they do happen. + if ( e->GetChangeType() == wxFSW_EVENT_RENAME && + m_events.size() == 2 ) + { + const wxFileSystemWatcherEvent* const e2 = m_events.back(); + if ( e2->GetChangeType() == wxFSW_EVENT_MODIFY && + e2->GetPath() == e->GetNewPath() ) + { + // This is a modify event for the new file, ignore it. + return; + } + } + + WX_ASSERT_EQUAL_MESSAGE + ( + ( + "Extra events received, last one is of type %x, path=\"%s\" " + "(the original event was for \"%s\" (\"%s\")", + m_events.back()->GetChangeType(), + m_events.back()->GetPath().GetFullPath(), + e->GetPath().GetFullPath(), + e->GetNewPath().GetFullPath() + ), + 1, m_events.size() + ); + } virtual void GenerateEvent() = 0; @@ -408,9 +428,9 @@ private: CPPUNIT_TEST( TestEventModify ); // MSW implementation doesn't detect file access events currently -#ifndef __WXMSW__ +#ifndef __WINDOWS__ CPPUNIT_TEST( TestEventAccess ); -#endif // __WXMSW__ +#endif // __WINDOWS__ #endif // !wxHAS_KQUEUE CPPUNIT_TEST( TestNoEventsAfterRemove ); @@ -610,45 +630,59 @@ void FileSystemWatcherTestCase::TestEventAccess() tester.Run(); } -void FileSystemWatcherTestCase::TestNoEventsAfterRemove() +namespace { - class EventTester : public EventHandler, - public wxTimer + +// We can't define this class locally inside TestNoEventsAfterRemove() for some +// reason with g++ 4.0 under OS X 10.5, it results in the following mysterious +// error: +// +// /var/tmp//ccTkNCkc.s:unknown:Non-global symbol: +// __ZThn80_ZN25FileSystemWatcherTestCase23TestNoEventsAfterRemoveEvEN11EventTester6NotifyEv.eh +// can't be a weak_definition +// +// So define this class outside the function instead. +class NoEventsAfterRemoveEventTester : public EventHandler, + public wxTimer +{ +public: + NoEventsAfterRemoveEventTester() { - public: - EventTester() - { - // We need to use an inactivity timer as we never get any file - // system events in this test, so we consider that the test is - // finished when this 1s timeout expires instead of, as usual, - // stopping after getting the file system events. - Start(1000, true); - } + // We need to use an inactivity timer as we never get any file + // system events in this test, so we consider that the test is + // finished when this 1s timeout expires instead of, as usual, + // stopping after getting the file system events. + Start(1000, true); + } - virtual void GenerateEvent() - { - m_watcher->Remove(EventGenerator::GetWatchDir()); - CPPUNIT_ASSERT(eg.CreateFile()); - } + virtual void GenerateEvent() + { + m_watcher->Remove(EventGenerator::GetWatchDir()); + CPPUNIT_ASSERT(eg.CreateFile()); + } - virtual void CheckResult() - { - CPPUNIT_ASSERT( m_events.empty() ); - } + virtual void CheckResult() + { + CPPUNIT_ASSERT( m_events.empty() ); + } - virtual wxFileSystemWatcherEvent ExpectedEvent() - { - CPPUNIT_FAIL( "Shouldn't be called" ); + virtual wxFileSystemWatcherEvent ExpectedEvent() + { + CPPUNIT_FAIL( "Shouldn't be called" ); - return wxFileSystemWatcherEvent(wxFSW_EVENT_ERROR); - } + return wxFileSystemWatcherEvent(wxFSW_EVENT_ERROR); + } - virtual void Notify() - { - SendIdle(); - } - }; + virtual void Notify() + { + SendIdle(); + } +}; - EventTester tester; +} // anonymous namespace + +void FileSystemWatcherTestCase::TestNoEventsAfterRemove() +{ + NoEventsAfterRemoveEventTester tester; tester.Run(); }