File indexing completed on 2024-12-01 03:42:28

0001 /*
0002     SPDX-FileCopyrightText: 2021 Igor Kushnir <igorkuo@gmail.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "katemodemanager_test_base.h"
0008 
0009 #include <kateglobal.h>
0010 
0011 #include <QString>
0012 #include <QTest>
0013 
0014 namespace
0015 {
0016 struct FileTypeDataRow {
0017     const char *dataTag;
0018     const char *m_inputString;
0019     const char *m_fileTypeName;
0020 
0021     QString inputString() const
0022     {
0023         return QString::fromUtf8(m_inputString);
0024     }
0025     QString fileTypeName() const
0026     {
0027         return QString::fromUtf8(m_fileTypeName);
0028     }
0029 };
0030 // The two tables below have been copied from syntax-highlighting:autotests/repository_test_base.cpp and adjusted:
0031 // removed all except first definition/fileType names because only the first name is used in KTextEditor.
0032 // The two versions of the tables should be kept in sync.
0033 
0034 // Additional adjustments to the syntax-highlighting version of fileTypesForFileNames table:
0035 //  1) used the second, not first, definition/fileType name in the QRPG.ninja row because
0036 //     "ILERPG" < "Ninja" in KSyntaxHighlighting but "Sources/ILERPG" > "Other/Ninja" in KTextEditor.
0037 //  2) used the second, not first, definition/fileType name in the qrpg*.tt row because
0038 //     "ILERPG" < "TT2" in KSyntaxHighlighting but "Sources/ILERPG" > "Markup/TT2" in KTextEditor.
0039 constexpr FileTypeDataRow fileTypesForFileNames[] = {
0040     {"empty", "", ""},
0041 
0042     {"*.tar.gz", "noMatch.tar.gz", ""},
0043     {"No match", "a_random#filename", ""},
0044     {"Long path, no match", "/this/is/a/moderately/long/path/to/no-match", ""},
0045     {"Prefix in dir name", "Kconfig/no_match", ""},
0046 
0047     {"*.qml", "/bla/foo.qml", "QML"},
0048     {"*.frag", "flat.frag", "GLSL"},
0049     {"*.md", "highPriority.md", "Markdown"},
0050     {"*.octave", "lowPriority.octave", "Octave"},
0051     {"*.hats", "sameLastLetterPattern.hats", "ATS"},
0052 
0053     {"*.c", "test.c", "C"},
0054     {"*.fs", "test.fs", "FSharp"},
0055     {"*.m", "/bla/foo.m", "Objective-C"},
0056 
0057     {"Makefile", "Makefile", "Makefile"},
0058     {"Path to Makefile", "/some/path/to/Makefile", "Makefile"},
0059     {"Makefile.*", "Makefile.am", "Makefile"},
0060 
0061     {"not-Makefile.dic", "not-Makefile.dic", "Hunspell Dictionary File"},
0062     {"*qmakefile.cpp", "test_qmakefile.cpp", "C++"},
0063     {"*_makefile.mm", "bench_makefile.mm", "Objective-C++"},
0064 
0065     {"xorg.conf", "/etc/literal-pattern/xorg.conf", "x.org Configuration"},
0066     {".profile", "2-literal-patterns/.profile", "Bash"},
0067 
0068     {"Config.*", "Config.beginning", "Kconfig"},
0069     {"usr.libexec.*", "usr.libexec.", "AppArmor Security Profile"},
0070     {"Jam*", "Jam-beginning-no-dot", "Jam"},
0071     {"usr.li-*.ch", "usr.li-many-partial-prefix-matches.ch", "xHarbour"},
0072     {"QRPG*.*", "QRPG1u4[+.unusual", "ILERPG"},
0073 
0074     {"*patch", "no-dot-before-ending~patch", "Diff"},
0075     {"*.cmake.in", "two-dots-after-asterisk.cmake.in", "CMake"},
0076     {"*.html.mst", "two-dots-priority!=0.html.mst", "Mustache/Handlebars (HTML)"},
0077 
0078     {"*.desktop.cmake", "2_suffixes.desktop.cmake", ".desktop"},
0079     {"*.per.err", "2_suffixes-but-one-a-better-match.per.err", "4GL"},
0080     {"*.xml.eex", "2_suffixes-one-lang.xml.eex", "Elixir"},
0081     {"fishd.*.fish", "fishd.prefix,suffix=one-lang.fish", "Fish"},
0082 
0083     {"usr.bin.*.ftl", "usr.bin.heterogenousPatternMatch.ftl", "AppArmor Security Profile"},
0084     {"Doxyfile.*.pro", "Doxyfile.heterogenous.Pattern-Match.pro", "QMake"},
0085     {"Kconfig*.ml", "KconfigHeterogenous_pattern_match.ml", "Objective Caml"},
0086     {"snap-confine.*.html.rac", "snap-confine.2.-higher-priority.html.rac", "Mustache/Handlebars (HTML)"},
0087     {"file_contexts_*.fq.gz", "file_contexts_prefix-higher-priority.fq.gz", "SELinux File Contexts"},
0088     {"QRPG*.ninja", "QRPG.ninja", "Ninja"},
0089     {"qrpg*.tt", "qrpgTwoUnusualPatterns.tt", "TT2"},
0090     {"qrpg*.cl", "qrpg$heterogenous~pattern&match.cl", "OpenCL"},
0091     {".gitignore*.tt*.textile", ".gitignoreHeterogenous3.tt.textile", "Textile"},
0092 };
0093 
0094 constexpr FileTypeDataRow fileTypesForMimeTypeNames[] = {
0095     {"empty", "", ""},
0096 
0097     {"Nonexistent MIME type", "text/nonexistent-mt", ""},
0098     {"No match", "application/x-bzip-compressed-tar", ""},
0099 
0100     {"High priority", "text/rust", "Rust"},
0101     {"Negative priority", "text/octave", "Octave"},
0102 
0103     {"Multiple types match", "text/x-chdr", "C++"},
0104 };
0105 
0106 template<std::size_t size>
0107 void addFileTypeDataRows(const FileTypeDataRow (&array)[size])
0108 {
0109     for (const auto &row : array) {
0110         QTest::newRow(row.dataTag) << row.inputString() << row.fileTypeName();
0111     }
0112 }
0113 } // unnamed namespace
0114 
0115 KateModeManagerTestBase::KateModeManagerTestBase()
0116     : m_modeManager{KTextEditor::EditorPrivate::self()->modeManager()}
0117 {
0118 }
0119 
0120 void KateModeManagerTestBase::wildcardsFindTestData()
0121 {
0122     QTest::addColumn<QString>("fileName");
0123     QTest::addColumn<QString>("fileTypeName");
0124     addFileTypeDataRows(fileTypesForFileNames);
0125 }
0126 
0127 void KateModeManagerTestBase::mimeTypesFindTestData()
0128 {
0129     QTest::addColumn<QString>("mimeTypeName");
0130     QTest::addColumn<QString>("fileTypeName");
0131     addFileTypeDataRows(fileTypesForMimeTypeNames);
0132 }
0133 
0134 #include "moc_katemodemanager_test_base.cpp"