-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.