Skip to content

Commit

Permalink
More unittests
Browse files Browse the repository at this point in the history
  • Loading branch information
FreeSlave committed Jun 10, 2016
1 parent 6327214 commit e2e5d5e
Show file tree
Hide file tree
Showing 11 changed files with 140 additions and 20 deletions.
2 changes: 0 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,12 @@ language: d
matrix:
allow_failures:
- d: gdc-4.9.2
- d: ldc-0.14.0
include:
- d: dmd-2.069.2
env: USE_DOVERALLS=true
- d: dmd-2.067.1
- d: gdc-4.9.2
- d: ldc-0.15.1
- d: ldc-0.14.0

script:
- chmod +x travis-script.sh
Expand Down
2 changes: 1 addition & 1 deletion dub.selections.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"fileVersion": 1,
"versions": {
"desktopfile": "1.0.0-beta3",
"desktopfile": "1.0.0-beta4",
"isfreedesktop": "0.1.0",
"inilike": "1.0.0-beta2",
"xdgpaths": "0.2.1",
Expand Down
125 changes: 108 additions & 17 deletions source/mimeapps.d
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,29 @@ private @trusted void validateMimeType(string groupName, string mimeType, string

static if (isFreedesktop)
{
version(unittest) {
import std.process : environment;

package struct EnvGuard
{
this(string env) {
envVar = env;
envValue = environment.get(env);
}

~this() {
if (envValue is null) {
environment.remove(envVar);
} else {
environment[envVar] = envValue;
}
}

string envVar;
string envValue;
}
}

/**
* Find all known mimeapps.list files locations. Found paths are not checked for existence.
* Returns: Paths of mimeapps.list files in the system.
Expand All @@ -122,6 +145,27 @@ static if (isFreedesktop)
return toReturn ~ configPaths ~ appPaths;
}

///
unittest
{
auto dataHomeGuard = EnvGuard("XDG_DATA_HOME");
auto dataDirsGuard = EnvGuard("XDG_DATA_DIRS");

auto configHomeGuard = EnvGuard("XDG_CONFIG_HOME");
auto configDirsGuard = EnvGuard("XDG_CONFIG_DIRS");

environment["XDG_DATA_HOME"] = "/home/user/data";
environment["XDG_DATA_DIRS"] = "/usr/local/data:/usr/data";

environment["XDG_CONFIG_HOME"] = "/home/user/config";
environment["XDG_CONFIG_DIRS"] = "/etc/xdg";

assert(mimeAppsListPaths() == [
"/home/user/config/mimeapps.list", "/home/user/data/applications/mimeapps.list", "/etc/xdg/mimeapps.list",
"/usr/local/data/applications/mimeapps.list", "/usr/data/applications/mimeapps.list"
]);
}

/**
* Find all known mimeinfo.cache files locations. Found paths are not checked for existence.
* Returns: Paths of mimeinfo.cache files in the system.
Expand All @@ -131,6 +175,21 @@ static if (isFreedesktop)
{
return xdgAllDataDirs("applications/mimeinfo.cache");
}

///
unittest
{
auto dataHomeGuard = EnvGuard("XDG_DATA_HOME");
auto dataDirsGuard = EnvGuard("XDG_DATA_DIRS");

environment["XDG_DATA_HOME"] = "/home/user/data";
environment["XDG_DATA_DIRS"] = "/usr/local/data:/usr/data";

assert(mimeInfoCachePaths() == [
"/home/user/data/applications/mimeinfo.cache",
"/usr/local/data/applications/mimeinfo.cache", "/usr/data/applications/mimeinfo.cache"
]);
}
}

/**
Expand Down Expand Up @@ -437,12 +496,6 @@ private:
string baseDir;
}

static struct BaseDirItem
{
string path;
bool valid;
}

public:
/**
* Construct using applicationsPaths.
Expand All @@ -451,8 +504,8 @@ public:
* binPaths = Paths where executable files are stored.
* options = Options used to read desktop files.
*/
@trusted this(const(string)[] applicationsPaths, in string[] binPaths, DesktopFile.DesktopReadOptions options = DesktopFile.DesktopReadOptions.init) {
_baseDirItems = applicationsPaths.dup;
@trusted this(in string[] applicationsPaths, in string[] binPaths, DesktopFile.DesktopReadOptions options = DesktopFile.DesktopReadOptions.init) {
_baseDirs = applicationsPaths.dup;
_readOptions = options;
_binPaths = binPaths.dup;
}
Expand All @@ -479,8 +532,8 @@ public:
private:
DesktopFileItem getDesktopFileItem(string desktopId)
{
string baseDirItem;
string filePath = findDesktopFilePath(desktopId, baseDirItem);
string baseDir;
string filePath = findDesktopFilePath(desktopId, baseDir);
if (filePath.length) {
try {
auto desktopFile = new DesktopFile(filePath, _readOptions);
Expand All @@ -492,28 +545,28 @@ private:
}
}

return DesktopFileItem(desktopFile, baseDirItem);
return DesktopFileItem(desktopFile, baseDir);
} catch(Exception e) {
return DesktopFileItem.init;
}
}
return DesktopFileItem.init;
}

string findDesktopFilePath(string desktopId, out string dirItem)
string findDesktopFilePath(string desktopId, out string dir)
{
foreach(baseDirItem; _baseDirItems) {
auto filePath = findDesktopFile(desktopId, only(baseDirItem));
foreach(baseDir; _baseDirs) {
auto filePath = findDesktopFile(desktopId, only(baseDir));
if (filePath.length) {
dirItem = baseDirItem;
dir = baseDir;
return filePath;
}
}
return null;
}

DesktopFileItem[string] _cache;
string[] _baseDirItems;
string[] _baseDirs;
DesktopFile.DesktopReadOptions _readOptions;
string[] _binPaths;
}
Expand Down Expand Up @@ -599,6 +652,18 @@ body {
return findAssociatedApplicationsImpl(mimeType, mimeAppsListFiles, mimeInfoCacheFiles, desktopFileProvider);
}

///
unittest
{
auto desktopProvider = new DesktopFileProvider(["test/applications"]);
auto mimeAppsList = new MimeAppsListFile("test/applications/mimeapps.list");
auto mimeInfoCache = new MimeInfoCacheFile("test/applications/mimeinfo.cache");
assert(findAssociatedApplications("text/plain", [null, mimeAppsList], [null, mimeInfoCache], desktopProvider)
.map!(d => d.displayName()).equal(["Geany", "Kate", "Emacs"]));
assert(findAssociatedApplications("application/nonexistent", [mimeAppsList], [mimeInfoCache], desktopProvider).length == 0);
assert(findAssociatedApplications("application/x-data", [mimeAppsList], [mimeInfoCache], desktopProvider).length == 0);
}

/**
* Find all known associated applications for mimeType, including explicitly removed by user.
* Params:
Expand All @@ -609,10 +674,23 @@ body {
* Returns: Array of found $(B DesktopFile) object capable of opening file of given MIME type or url of given scheme.
*/
const(DesktopFile)[] findKnownAssociatedApplications(ListRange, CacheRange)(string mimeType, ListRange mimeAppsListFiles, CacheRange mimeInfoCacheFiles, IDesktopFileProvider desktopFileProvider)
{
in {
assert(desktopFileProvider !is null);
}
body {
return findAssociatedApplicationsImpl(mimeType, mimeAppsListFiles, mimeInfoCacheFiles, desktopFileProvider, FindAssocFlag.ignoreRemovedGroup);
}

///
unittest
{
auto desktopProvider = new DesktopFileProvider(["test/applications"]);
auto mimeAppsList = new MimeAppsListFile("test/applications/mimeapps.list");
auto mimeInfoCache = new MimeInfoCacheFile("test/applications/mimeinfo.cache");
assert(findKnownAssociatedApplications("text/plain", [null, mimeAppsList], [null, mimeInfoCache], desktopProvider)
.map!(d => d.displayName()).equal(["Geany", "Kate", "Emacs", "Okular"]));
}

/**
* Find default application for mimeType.
* Params:
Expand Down Expand Up @@ -649,3 +727,16 @@ body {
auto desktopFiles = findAssociatedApplicationsImpl(mimeType, mimeAppsListFiles, mimeInfoCacheFiles, desktopFileProvider, FindAssocFlag.onlyFirst);
return desktopFiles.length ? desktopFiles.front : null;
}

///
unittest
{
auto desktopProvider = new DesktopFileProvider(["test/applications"]);
auto mimeAppsList = new MimeAppsListFile("test/applications/mimeapps.list");
auto mimeInfoCache = new MimeInfoCacheFile("test/applications/mimeinfo.cache");
assert(findDefaultApplication("text/plain", [null, mimeAppsList], [null, mimeInfoCache], desktopProvider).displayName() == "Geany");
assert(findDefaultApplication("image/png", [mimeAppsList], [mimeInfoCache], desktopProvider).displayName() == "Gwenview");
assert(findDefaultApplication("application/pdf", [mimeAppsList], [mimeInfoCache], desktopProvider).displayName() == "Okular");
assert(findDefaultApplication("application/nonexistent", [mimeAppsList], [mimeInfoCache], desktopProvider) is null);
assert(findDefaultApplication("application/x-data", [mimeAppsList], [mimeInfoCache], desktopProvider) is null);
}
3 changes: 3 additions & 0 deletions test/applications/emacs.desktop
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[Desktop Entry]
Name=Emacs
Exec=emacs
3 changes: 3 additions & 0 deletions test/applications/geany.desktop
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[Desktop Entry]
Name=Geany
Exec=geany
3 changes: 3 additions & 0 deletions test/applications/gthumb.desktop
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[Desktop Entry]
Name=gThumb
Exec=gthumb
3 changes: 3 additions & 0 deletions test/applications/gwenview.desktop
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[Desktop Entry]
Name=Gwenview
Exec=gwenview
3 changes: 3 additions & 0 deletions test/applications/kate.desktop
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[Desktop Entry]
Name=Kate
Exec=kate
9 changes: 9 additions & 0 deletions test/applications/mimeapps.list
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
[Default Applications]
text/plain=geany.desktop

[Added Associations]
application/pdf=okular.desktop;
text/plain=geany.desktop;kate.desktop;kate.desktop;

[Removed Associations]
text/plain=okular.desktop
4 changes: 4 additions & 0 deletions test/applications/mimeinfo.cache
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
[MIME Cache]
application/x-data=nonexistent.desktop;
image/png=gwenview.desktop;gthumb.desktop;
text/plain=geany.desktop;kate.desktop;emacs.desktop;okular.desktop
3 changes: 3 additions & 0 deletions test/applications/okular.desktop
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[Desktop Entry]
Name=Okular
Exec=okular

0 comments on commit e2e5d5e

Please sign in to comment.