aboutsummaryrefslogtreecommitdiff
path: root/test/xdg_pipe_menu_desktop_entry_tests.erl
diff options
context:
space:
mode:
authorChristopher R. Nelson <christopher.nelson@languidnights.com>2026-07-21 11:44:41 -0400
committerChristopher R. Nelson <christopher.nelson@languidnights.com>2026-07-21 11:44:41 -0400
commit5ff1fbe175af17fbb808c5ea942f465a932da3af (patch)
treeb6a26b4b7e896e5ed5d85a5003c4d176ed5c8e9e /test/xdg_pipe_menu_desktop_entry_tests.erl
parent7e8472e1e2a0b39746ef86c041d56b92bab5a6b7 (diff)
Rename app from er_xdg_pipe_menu to xdg_pipe_menuHEADmain
Drop the "er-" prefix throughout: module/atom names, filenames, socket paths, and docs. It was an implementation detail, not part of the app's identity. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Diffstat (limited to 'test/xdg_pipe_menu_desktop_entry_tests.erl')
-rw-r--r--test/xdg_pipe_menu_desktop_entry_tests.erl183
1 files changed, 183 insertions, 0 deletions
diff --git a/test/xdg_pipe_menu_desktop_entry_tests.erl b/test/xdg_pipe_menu_desktop_entry_tests.erl
new file mode 100644
index 0000000..a55cd67
--- /dev/null
+++ b/test/xdg_pipe_menu_desktop_entry_tests.erl
@@ -0,0 +1,183 @@
+-module(xdg_pipe_menu_desktop_entry_tests).
+
+-include_lib("eunit/include/eunit.hrl").
+-include("xdg_pipe_menu.hrl").
+
+basic_entry_test() ->
+ Bin = <<
+ "[Desktop Entry]\n"
+ "Type=Application\n"
+ "Name=Firefox\n"
+ "Exec=firefox %u\n"
+ "Icon=firefox\n"
+ >>,
+ ?assertEqual(
+ {ok, #desktop_entry{
+ name = <<"Firefox">>, exec = <<"firefox">>, icon = <<"firefox">>, categories = [], hidden = false
+ }},
+ xdg_pipe_menu_desktop_entry:parse(Bin)
+ ).
+
+icon_is_optional_test() ->
+ Bin = <<
+ "[Desktop Entry]\n"
+ "Name=Foo\n"
+ "Exec=foo\n"
+ >>,
+ ?assertEqual(
+ {ok, #desktop_entry{name = <<"Foo">>, exec = <<"foo">>, icon = undefined, categories = [], hidden = false}},
+ xdg_pipe_menu_desktop_entry:parse(Bin)
+ ).
+
+categories_are_split_on_semicolon_test() ->
+ Bin = <<
+ "[Desktop Entry]\n"
+ "Name=Foo\n"
+ "Exec=foo\n"
+ "Categories=Utility;Development;\n"
+ >>,
+ {ok, Entry} = xdg_pipe_menu_desktop_entry:parse(Bin),
+ ?assertEqual([<<"Utility">>, <<"Development">>], Entry#desktop_entry.categories).
+
+categories_is_empty_list_when_absent_test() ->
+ Bin = <<"[Desktop Entry]\nName=Foo\nExec=foo\n">>,
+ {ok, Entry} = xdg_pipe_menu_desktop_entry:parse(Bin),
+ ?assertEqual([], Entry#desktop_entry.categories).
+
+repeated_category_separators_are_ignored_test() ->
+ Bin = <<
+ "[Desktop Entry]\n"
+ "Name=Foo\n"
+ "Exec=foo\n"
+ "Categories=Utility;;Development\n"
+ >>,
+ {ok, Entry} = xdg_pipe_menu_desktop_entry:parse(Bin),
+ ?assertEqual([<<"Utility">>, <<"Development">>], Entry#desktop_entry.categories).
+
+missing_name_test() ->
+ Bin = <<"[Desktop Entry]\nExec=foo\n">>,
+ ?assertEqual({error, missing_name}, xdg_pipe_menu_desktop_entry:parse(Bin)).
+
+missing_exec_test() ->
+ Bin = <<"[Desktop Entry]\nName=Foo\n">>,
+ ?assertEqual({error, missing_exec}, xdg_pipe_menu_desktop_entry:parse(Bin)).
+
+ignores_other_groups_test() ->
+ Bin = <<
+ "[Desktop Entry]\n"
+ "Name=Foo\n"
+ "Exec=foo\n"
+ "\n"
+ "[Desktop Action new-window]\n"
+ "Name=New Window\n"
+ "Exec=foo --new-window\n"
+ >>,
+ ?assertEqual(
+ {ok, #desktop_entry{name = <<"Foo">>, exec = <<"foo">>, icon = undefined, categories = [], hidden = false}},
+ xdg_pipe_menu_desktop_entry:parse(Bin)
+ ).
+
+ignores_comments_and_blank_lines_test() ->
+ Bin = <<
+ "# a comment\n"
+ "\n"
+ "[Desktop Entry]\n"
+ "# another comment\n"
+ "Name=Foo\n"
+ "\n"
+ "Exec=foo\n"
+ >>,
+ ?assertEqual(
+ {ok, #desktop_entry{name = <<"Foo">>, exec = <<"foo">>, icon = undefined, categories = [], hidden = false}},
+ xdg_pipe_menu_desktop_entry:parse(Bin)
+ ).
+
+strips_multiple_field_codes_test() ->
+ Bin = <<
+ "[Desktop Entry]\n"
+ "Name=Foo\n"
+ "Exec=foo %f --flag %i %c\n"
+ >>,
+ ?assertEqual(
+ {ok, #desktop_entry{name = <<"Foo">>, exec = <<"foo --flag">>, icon = undefined, categories = [], hidden = false}},
+ xdg_pipe_menu_desktop_entry:parse(Bin)
+ ).
+
+literal_percent_is_unescaped_test() ->
+ Bin = <<
+ "[Desktop Entry]\n"
+ "Name=Foo\n"
+ "Exec=foo --progress=%%\n"
+ >>,
+ ?assertEqual(
+ {ok, #desktop_entry{
+ name = <<"Foo">>, exec = <<"foo --progress=%">>, icon = undefined, categories = [], hidden = false
+ }},
+ xdg_pipe_menu_desktop_entry:parse(Bin)
+ ).
+
+unescapes_value_test() ->
+ Bin = <<"[Desktop Entry]\nName=Foo\\sBar\nExec=foo\n">>,
+ ?assertEqual(
+ {ok, #desktop_entry{name = <<"Foo Bar">>, exec = <<"foo">>, icon = undefined, categories = [], hidden = false}},
+ xdg_pipe_menu_desktop_entry:parse(Bin)
+ ).
+
+no_display_is_hidden_test() ->
+ Bin = <<"[Desktop Entry]\nName=Foo\nExec=foo\nNoDisplay=true\n">>,
+ {ok, Entry} = xdg_pipe_menu_desktop_entry:parse(Bin),
+ ?assertEqual(true, Entry#desktop_entry.hidden).
+
+hidden_key_is_hidden_test() ->
+ Bin = <<"[Desktop Entry]\nName=Foo\nExec=foo\nHidden=true\n">>,
+ {ok, Entry} = xdg_pipe_menu_desktop_entry:parse(Bin),
+ ?assertEqual(true, Entry#desktop_entry.hidden).
+
+non_application_type_is_hidden_test() ->
+ Bin = <<"[Desktop Entry]\nName=Foo\nExec=foo\nType=Link\n">>,
+ {ok, Entry} = xdg_pipe_menu_desktop_entry:parse(Bin),
+ ?assertEqual(true, Entry#desktop_entry.hidden).
+
+application_type_is_not_hidden_test() ->
+ Bin = <<"[Desktop Entry]\nName=Foo\nExec=foo\nType=Application\n">>,
+ {ok, Entry} = xdg_pipe_menu_desktop_entry:parse(Bin),
+ ?assertEqual(false, Entry#desktop_entry.hidden).
+
+missing_type_is_not_hidden_test() ->
+ Bin = <<"[Desktop Entry]\nName=Foo\nExec=foo\n">>,
+ {ok, Entry} = xdg_pipe_menu_desktop_entry:parse(Bin),
+ ?assertEqual(false, Entry#desktop_entry.hidden).
+
+false_values_are_not_hidden_test() ->
+ Bin = <<
+ "[Desktop Entry]\n"
+ "Name=Foo\n"
+ "Exec=foo\n"
+ "NoDisplay=false\n"
+ "Hidden=false\n"
+ "Type=Application\n"
+ >>,
+ {ok, Entry} = xdg_pipe_menu_desktop_entry:parse(Bin),
+ ?assertEqual(false, Entry#desktop_entry.hidden).
+
+parse_file_test() ->
+ Path = filename:join(test_tmp_dir(), "eunit-desktop-entry-test.desktop"),
+ ok = file:write_file(Path, <<"[Desktop Entry]\nName=Foo\nExec=foo\n">>),
+ Result = xdg_pipe_menu_desktop_entry:parse_file(Path),
+ ok = file:delete(Path),
+ ?assertEqual(
+ {ok, #desktop_entry{name = <<"Foo">>, exec = <<"foo">>, icon = undefined, categories = [], hidden = false}},
+ Result
+ ).
+
+parse_file_missing_test() ->
+ ?assertEqual(
+ {error, enoent},
+ xdg_pipe_menu_desktop_entry:parse_file("/nonexistent/does-not-exist.desktop")
+ ).
+
+test_tmp_dir() ->
+ case os:getenv("TMPDIR") of
+ false -> "/tmp";
+ Dir -> Dir
+ end.