230 lines
9.4 KiB
C++
230 lines
9.4 KiB
C++
#include "../syncthingignorepattern.h"
|
|
|
|
#include "../../testhelper/helper.h"
|
|
|
|
#include <cppunit/TestFixture.h>
|
|
|
|
using namespace std;
|
|
using namespace Data;
|
|
using namespace CppUtilities;
|
|
using namespace CppUtilities::Literals;
|
|
|
|
using namespace CPPUNIT_NS;
|
|
|
|
/*!
|
|
* \brief The MiscTests class tests various features of the connector library.
|
|
*/
|
|
class IgnorePatternTests : public TestFixture {
|
|
CPPUNIT_TEST_SUITE(IgnorePatternTests);
|
|
CPPUNIT_TEST(testBasicMatching);
|
|
CPPUNIT_TEST(testWildcards);
|
|
CPPUNIT_TEST(testCharacterRange);
|
|
CPPUNIT_TEST(testAlternatives);
|
|
CPPUNIT_TEST(testCaseInsensitiveMatching);
|
|
CPPUNIT_TEST(testGreediness);
|
|
CPPUNIT_TEST(testAlternativePathSeparators);
|
|
CPPUNIT_TEST_SUITE_END();
|
|
|
|
public:
|
|
IgnorePatternTests();
|
|
|
|
void testBasicMatching();
|
|
void testWildcards();
|
|
void testCharacterRange();
|
|
void testAlternatives();
|
|
void testCaseInsensitiveMatching();
|
|
void testGreediness();
|
|
void testAlternativePathSeparators();
|
|
|
|
void setUp() override;
|
|
void tearDown() override;
|
|
|
|
private:
|
|
};
|
|
|
|
CPPUNIT_TEST_SUITE_REGISTRATION(IgnorePatternTests);
|
|
|
|
IgnorePatternTests::IgnorePatternTests()
|
|
{
|
|
}
|
|
|
|
//
|
|
// test setup
|
|
//
|
|
|
|
void IgnorePatternTests::setUp()
|
|
{
|
|
}
|
|
|
|
void IgnorePatternTests::tearDown()
|
|
{
|
|
}
|
|
|
|
void IgnorePatternTests::testBasicMatching()
|
|
{
|
|
auto p1 = SyncthingIgnorePattern(QStringLiteral("foo"));
|
|
CPPUNIT_ASSERT(!p1.comment);
|
|
CPPUNIT_ASSERT(!p1.caseInsensitive);
|
|
CPPUNIT_ASSERT(p1.ignore);
|
|
CPPUNIT_ASSERT(!p1.allowRemovalOnParentDirRemoval);
|
|
CPPUNIT_ASSERT_EQUAL(QStringLiteral("foo"), p1.glob);
|
|
CPPUNIT_ASSERT(p1.matches(QStringLiteral("foo")));
|
|
CPPUNIT_ASSERT(!p1.matches(QStringLiteral("foofoo")));
|
|
CPPUNIT_ASSERT(p1.matches(QStringLiteral("foo/foo")));
|
|
|
|
auto p14 = SyncthingIgnorePattern(QStringLiteral("/rust/**/target"));
|
|
CPPUNIT_ASSERT(p14.matches(QStringLiteral("rust/formatter/target")));
|
|
CPPUNIT_ASSERT(!p14.matches(QStringLiteral("rust/formatter/target/CACHEDIR.TAG")));
|
|
|
|
auto p14a = SyncthingIgnorePattern(QStringLiteral("/rust/**/target/"));
|
|
CPPUNIT_ASSERT(!p14a.matches(QStringLiteral("rust/formatter/target")));
|
|
CPPUNIT_ASSERT(!p14a.matches(QStringLiteral("rust/formatter/target/CACHEDIR.TAG")));
|
|
|
|
auto p15 = SyncthingIgnorePattern(QStringLiteral("/fo[\\]o]/bar"));
|
|
CPPUNIT_ASSERT(p15.matches(QStringLiteral("foo/bar")));
|
|
CPPUNIT_ASSERT(p15.matches(QStringLiteral("fo]/bar")));
|
|
CPPUNIT_ASSERT(!p15.matches(QStringLiteral("fo\\/bar")));
|
|
|
|
auto p16 = SyncthingIgnorePattern(QStringLiteral("/fo{o\\},o}/bar"));
|
|
CPPUNIT_ASSERT(p16.matches(QStringLiteral("foo/bar")));
|
|
CPPUNIT_ASSERT(p16.matches(QStringLiteral("foo}/bar")));
|
|
CPPUNIT_ASSERT(!p16.matches(QStringLiteral("/foo\\,o}/bar")));
|
|
|
|
auto p17 = SyncthingIgnorePattern(QStringLiteral("///fo{o\\},o}/bar"));
|
|
CPPUNIT_ASSERT(p17.comment);
|
|
CPPUNIT_ASSERT(!p17.matches(QStringLiteral("foo/bar")));
|
|
}
|
|
|
|
void IgnorePatternTests::testWildcards()
|
|
{
|
|
auto p2 = SyncthingIgnorePattern(QStringLiteral("(?d)(?i)foo*"));
|
|
CPPUNIT_ASSERT(p2.allowRemovalOnParentDirRemoval);
|
|
CPPUNIT_ASSERT(p2.caseInsensitive);
|
|
CPPUNIT_ASSERT(p2.matches(QStringLiteral("foo")));
|
|
CPPUNIT_ASSERT(p2.matches(QStringLiteral("FooBar")));
|
|
CPPUNIT_ASSERT(!p2.matches(QStringLiteral("barfoo")));
|
|
CPPUNIT_ASSERT(p2.matches(QStringLiteral("bar/foo")));
|
|
CPPUNIT_ASSERT(p2.matches(QStringLiteral("bar/foobaz")));
|
|
CPPUNIT_ASSERT(!p2.matches(QStringLiteral("bar/foo/baz")));
|
|
|
|
auto p2a = SyncthingIgnorePattern(QStringLiteral("(?d)foo**"));
|
|
CPPUNIT_ASSERT(p2a.allowRemovalOnParentDirRemoval);
|
|
CPPUNIT_ASSERT(p2a.matches(QStringLiteral("foo")));
|
|
CPPUNIT_ASSERT(p2a.matches(QStringLiteral("foobar")));
|
|
CPPUNIT_ASSERT(!p2a.matches(QStringLiteral("barfoo")));
|
|
CPPUNIT_ASSERT(p2a.matches(QStringLiteral("bar/foo")));
|
|
CPPUNIT_ASSERT(p2a.matches(QStringLiteral("bar/foobaz")));
|
|
CPPUNIT_ASSERT(p2a.matches(QStringLiteral("bar/foo/baz")));
|
|
|
|
auto p3 = SyncthingIgnorePattern(QStringLiteral("fo*ar"));
|
|
CPPUNIT_ASSERT(!p3.matches(QStringLiteral("foo")));
|
|
CPPUNIT_ASSERT(p3.matches(QStringLiteral("foar")));
|
|
CPPUNIT_ASSERT(p3.matches(QStringLiteral("foobar")));
|
|
CPPUNIT_ASSERT(!p3.matches(QStringLiteral("foobaR")));
|
|
CPPUNIT_ASSERT(p3.matches(QStringLiteral("foobaRar")));
|
|
CPPUNIT_ASSERT(p3.matches(QStringLiteral("foo*bar")));
|
|
|
|
auto p4 = SyncthingIgnorePattern(QStringLiteral("fo\\*ar"));
|
|
CPPUNIT_ASSERT(!p4.matches(QStringLiteral("foar")));
|
|
CPPUNIT_ASSERT(!p4.matches(QStringLiteral("foobar")));
|
|
CPPUNIT_ASSERT(!p4.matches(QStringLiteral("foo*bar")));
|
|
CPPUNIT_ASSERT(p4.matches(QStringLiteral("fo*ar")));
|
|
|
|
auto p5 = SyncthingIgnorePattern(QStringLiteral("te*ne"));
|
|
CPPUNIT_ASSERT(p5.matches(QStringLiteral("telephone")));
|
|
CPPUNIT_ASSERT(p5.matches(QStringLiteral("subdir/telephone")));
|
|
CPPUNIT_ASSERT(!p5.matches(QStringLiteral("tele/phone")));
|
|
|
|
auto p6 = SyncthingIgnorePattern(QStringLiteral("te**ne"));
|
|
CPPUNIT_ASSERT(p6.matches(QStringLiteral("telephone")));
|
|
CPPUNIT_ASSERT(p6.matches(QStringLiteral("subdir/telephone")));
|
|
CPPUNIT_ASSERT(p6.matches(QStringLiteral("tele/phone")));
|
|
|
|
auto p7 = SyncthingIgnorePattern(QStringLiteral("te??st"));
|
|
CPPUNIT_ASSERT(p7.matches(QStringLiteral("tebest")));
|
|
CPPUNIT_ASSERT(!p7.matches(QStringLiteral("teb/st")));
|
|
CPPUNIT_ASSERT(!p7.matches(QStringLiteral("test")));
|
|
|
|
auto p9 = SyncthingIgnorePattern(QStringLiteral("/foo*"));
|
|
CPPUNIT_ASSERT(p9.matches(QStringLiteral("foo")));
|
|
CPPUNIT_ASSERT(p9.matches(QStringLiteral("foobar")));
|
|
CPPUNIT_ASSERT(!p9.matches(QStringLiteral("barfoo")));
|
|
CPPUNIT_ASSERT(!p9.matches(QStringLiteral("bar/foo")));
|
|
|
|
auto p10 = SyncthingIgnorePattern(QStringLiteral("/fo?"));
|
|
CPPUNIT_ASSERT(p10.matches(QStringLiteral("foO")));
|
|
CPPUNIT_ASSERT(!p10.matches(QStringLiteral("foO/")));
|
|
CPPUNIT_ASSERT(!p10.matches(QStringLiteral("fo/")));
|
|
CPPUNIT_ASSERT(!p10.matches(QStringLiteral("bar/foO")));
|
|
}
|
|
|
|
void IgnorePatternTests::testCharacterRange()
|
|
{
|
|
auto p11 = SyncthingIgnorePattern(QStringLiteral("/fo[o0.]/bar"));
|
|
CPPUNIT_ASSERT(p11.matches(QStringLiteral("foo/bar")));
|
|
CPPUNIT_ASSERT(p11.matches(QStringLiteral("fo0/bar")));
|
|
CPPUNIT_ASSERT(p11.matches(QStringLiteral("fo./bar")));
|
|
CPPUNIT_ASSERT(!p11.matches(QStringLiteral("foO/bar")));
|
|
CPPUNIT_ASSERT(!p11.matches(QStringLiteral("fo?/bar")));
|
|
|
|
auto p12 = SyncthingIgnorePattern(QStringLiteral("/f[oA-C0-3.]o/bar"));
|
|
CPPUNIT_ASSERT(p12.matches(QStringLiteral("f0o/bar")));
|
|
CPPUNIT_ASSERT(p12.matches(QStringLiteral("f1o/bar")));
|
|
CPPUNIT_ASSERT(p12.matches(QStringLiteral("f2o/bar")));
|
|
CPPUNIT_ASSERT(p12.matches(QStringLiteral("f3o/bar")));
|
|
CPPUNIT_ASSERT(!p12.matches(QStringLiteral("f4o/bar")));
|
|
CPPUNIT_ASSERT(p12.matches(QStringLiteral("foo/bar")));
|
|
CPPUNIT_ASSERT(!p12.matches(QStringLiteral("foO/bar")));
|
|
CPPUNIT_ASSERT(p12.matches(QStringLiteral("fAo/bar")));
|
|
CPPUNIT_ASSERT(p12.matches(QStringLiteral("fBo/bar")));
|
|
CPPUNIT_ASSERT(p12.matches(QStringLiteral("fCo/bar")));
|
|
CPPUNIT_ASSERT(!p12.matches(QStringLiteral("fDo/bar")));
|
|
}
|
|
|
|
void IgnorePatternTests::testAlternatives()
|
|
{
|
|
auto p13 = SyncthingIgnorePattern(QStringLiteral("/f{o,0o0,l}o/{bar,biz}"));
|
|
CPPUNIT_ASSERT(p13.matches(QStringLiteral("foo/bar")));
|
|
CPPUNIT_ASSERT(p13.matches(QStringLiteral("foo/biz")));
|
|
CPPUNIT_ASSERT(!p13.matches(QStringLiteral("f/biz")));
|
|
CPPUNIT_ASSERT(!p13.matches(QStringLiteral("f0o0/bar")));
|
|
CPPUNIT_ASSERT(p13.matches(QStringLiteral("f0o0o/bar")));
|
|
CPPUNIT_ASSERT(!p13.matches(QStringLiteral("f{o,0o0,}o/{bar,biz}")));
|
|
}
|
|
|
|
void IgnorePatternTests::testCaseInsensitiveMatching()
|
|
{
|
|
auto p11a = SyncthingIgnorePattern(QStringLiteral("(?i)/fo[o0.]/bar"));
|
|
CPPUNIT_ASSERT(p11a.caseInsensitive);
|
|
CPPUNIT_ASSERT(p11a.matches(QStringLiteral("foO/bar")));
|
|
}
|
|
|
|
void IgnorePatternTests::testGreediness()
|
|
{
|
|
auto p8 = SyncthingIgnorePattern(QStringLiteral("fo*ar*y"));
|
|
CPPUNIT_ASSERT(!p8.matches(QStringLiteral("fooy")));
|
|
CPPUNIT_ASSERT(p8.matches(QStringLiteral("foary")));
|
|
CPPUNIT_ASSERT(p8.matches(QStringLiteral("foobary")));
|
|
CPPUNIT_ASSERT(!p8.matches(QStringLiteral("foobaRy")));
|
|
CPPUNIT_ASSERT(p8.matches(QStringLiteral("foobaRary")));
|
|
CPPUNIT_ASSERT(!p8.matches(QStringLiteral("foobaRaRy")));
|
|
CPPUNIT_ASSERT(p8.matches(QStringLiteral("foobaRaRarxy")));
|
|
CPPUNIT_ASSERT(p8.matches(QStringLiteral("bar/foobaRaRarxy")));
|
|
}
|
|
|
|
void IgnorePatternTests::testAlternativePathSeparators()
|
|
{
|
|
auto p18 = SyncthingIgnorePattern(QStringLiteral("!Saved\\Logs"));
|
|
CPPUNIT_ASSERT(!p18.matches(QStringLiteral("Documents\\Saved\\Logs")));
|
|
CPPUNIT_ASSERT(p18.matches(QStringLiteral("Documents\\Saved\\Logs"), QChar('\\')));
|
|
CPPUNIT_ASSERT(!p18.matches(QStringLiteral("Documents/Saved/Logs"), QChar('/'))); // see remarks in doc
|
|
auto p18a = SyncthingIgnorePattern(QStringLiteral("!Saved/Logs"));
|
|
CPPUNIT_ASSERT(p18a.matches(QStringLiteral("Documents\\Saved\\Logs"), QChar('\\')));
|
|
CPPUNIT_ASSERT(p18a.matches(QStringLiteral("Documents/Saved/Logs"), QChar('\\')));
|
|
auto p18b = SyncthingIgnorePattern(QStringLiteral("!/Documents/Saved/Logs"));
|
|
CPPUNIT_ASSERT(p18b.matches(QStringLiteral("Documents\\Saved\\Logs"), QChar('\\')));
|
|
CPPUNIT_ASSERT(p18b.matches(QStringLiteral("Documents/Saved/Logs"), QChar('\\')));
|
|
CPPUNIT_ASSERT(!p18b.matches(QStringLiteral("Saved\\Logs"), QChar('\\')));
|
|
CPPUNIT_ASSERT(!p18b.matches(QStringLiteral("Saved/Logs"), QChar('\\')));
|
|
}
|