From 5ff1fbe175af17fbb808c5ea942f465a932da3af Mon Sep 17 00:00:00 2001 From: "Christopher R. Nelson" Date: Tue, 21 Jul 2026 11:44:41 -0400 Subject: Rename app from er_xdg_pipe_menu to xdg_pipe_menu 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 --- test/xdg_pipe_menu_desktop_entry_tests.erl | 183 +++++++++++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 test/xdg_pipe_menu_desktop_entry_tests.erl (limited to 'test/xdg_pipe_menu_desktop_entry_tests.erl') 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. -- cgit v1.2.3