aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/er_xdg_pipe_menu_desktop_entry_tests.erl41
-rw-r--r--test/er_xdg_pipe_menu_renderer_tests.erl129
2 files changed, 133 insertions, 37 deletions
diff --git a/test/er_xdg_pipe_menu_desktop_entry_tests.erl b/test/er_xdg_pipe_menu_desktop_entry_tests.erl
index 399e3a5..bcea976 100644
--- a/test/er_xdg_pipe_menu_desktop_entry_tests.erl
+++ b/test/er_xdg_pipe_menu_desktop_entry_tests.erl
@@ -13,7 +13,7 @@ basic_entry_test() ->
>>,
?assertEqual(
{ok, #desktop_entry{
- name = <<"Firefox">>, exec = <<"firefox">>, icon = <<"firefox">>, hidden = false
+ name = <<"Firefox">>, exec = <<"firefox">>, icon = <<"firefox">>, categories = [], hidden = false
}},
er_xdg_pipe_menu_desktop_entry:parse(Bin)
).
@@ -25,10 +25,35 @@ icon_is_optional_test() ->
"Exec=foo\n"
>>,
?assertEqual(
- {ok, #desktop_entry{name = <<"Foo">>, exec = <<"foo">>, icon = undefined, hidden = false}},
+ {ok, #desktop_entry{name = <<"Foo">>, exec = <<"foo">>, icon = undefined, categories = [], hidden = false}},
er_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} = er_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} = er_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} = er_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}, er_xdg_pipe_menu_desktop_entry:parse(Bin)).
@@ -48,7 +73,7 @@ ignores_other_groups_test() ->
"Exec=foo --new-window\n"
>>,
?assertEqual(
- {ok, #desktop_entry{name = <<"Foo">>, exec = <<"foo">>, icon = undefined, hidden = false}},
+ {ok, #desktop_entry{name = <<"Foo">>, exec = <<"foo">>, icon = undefined, categories = [], hidden = false}},
er_xdg_pipe_menu_desktop_entry:parse(Bin)
).
@@ -63,7 +88,7 @@ ignores_comments_and_blank_lines_test() ->
"Exec=foo\n"
>>,
?assertEqual(
- {ok, #desktop_entry{name = <<"Foo">>, exec = <<"foo">>, icon = undefined, hidden = false}},
+ {ok, #desktop_entry{name = <<"Foo">>, exec = <<"foo">>, icon = undefined, categories = [], hidden = false}},
er_xdg_pipe_menu_desktop_entry:parse(Bin)
).
@@ -74,7 +99,7 @@ strips_multiple_field_codes_test() ->
"Exec=foo %f --flag %i %c\n"
>>,
?assertEqual(
- {ok, #desktop_entry{name = <<"Foo">>, exec = <<"foo --flag">>, icon = undefined, hidden = false}},
+ {ok, #desktop_entry{name = <<"Foo">>, exec = <<"foo --flag">>, icon = undefined, categories = [], hidden = false}},
er_xdg_pipe_menu_desktop_entry:parse(Bin)
).
@@ -86,7 +111,7 @@ literal_percent_is_unescaped_test() ->
>>,
?assertEqual(
{ok, #desktop_entry{
- name = <<"Foo">>, exec = <<"foo --progress=%">>, icon = undefined, hidden = false
+ name = <<"Foo">>, exec = <<"foo --progress=%">>, icon = undefined, categories = [], hidden = false
}},
er_xdg_pipe_menu_desktop_entry:parse(Bin)
).
@@ -94,7 +119,7 @@ literal_percent_is_unescaped_test() ->
unescapes_value_test() ->
Bin = <<"[Desktop Entry]\nName=Foo\\sBar\nExec=foo\n">>,
?assertEqual(
- {ok, #desktop_entry{name = <<"Foo Bar">>, exec = <<"foo">>, icon = undefined, hidden = false}},
+ {ok, #desktop_entry{name = <<"Foo Bar">>, exec = <<"foo">>, icon = undefined, categories = [], hidden = false}},
er_xdg_pipe_menu_desktop_entry:parse(Bin)
).
@@ -141,7 +166,7 @@ parse_file_test() ->
Result = er_xdg_pipe_menu_desktop_entry:parse_file(Path),
ok = file:delete(Path),
?assertEqual(
- {ok, #desktop_entry{name = <<"Foo">>, exec = <<"foo">>, icon = undefined, hidden = false}},
+ {ok, #desktop_entry{name = <<"Foo">>, exec = <<"foo">>, icon = undefined, categories = [], hidden = false}},
Result
).
diff --git a/test/er_xdg_pipe_menu_renderer_tests.erl b/test/er_xdg_pipe_menu_renderer_tests.erl
index 1fc0192..7273625 100644
--- a/test/er_xdg_pipe_menu_renderer_tests.erl
+++ b/test/er_xdg_pipe_menu_renderer_tests.erl
@@ -5,10 +5,15 @@
-include("er_xdg_pipe_menu.hrl").
entry(Name, Exec, Icon) ->
- entry(Name, Exec, Icon, false).
+ entry(Name, Exec, Icon, []).
-entry(Name, Exec, Icon, Hidden) ->
- #desktop_entry{name = Name, exec = Exec, icon = Icon, hidden = Hidden}.
+entry(Name, Exec, Icon, Categories) ->
+ entry(Name, Exec, Icon, Categories, false).
+
+entry(Name, Exec, Icon, Categories, Hidden) ->
+ #desktop_entry{
+ name = Name, exec = Exec, icon = Icon, categories = Categories, hidden = Hidden
+ }.
empty_list_renders_empty_menu_test() ->
?assertEqual(
@@ -19,47 +24,76 @@ empty_list_renders_empty_menu_test() ->
).
single_entry_with_icon_test() ->
- Rendered = er_xdg_pipe_menu_renderer:render([entry(<<"Firefox">>, <<"firefox">>, <<"firefox">>)]),
+ Rendered = er_xdg_pipe_menu_renderer:render([
+ entry(<<"Firefox">>, <<"firefox">>, <<"firefox">>, [<<"Network">>])
+ ]),
?assertEqual(
<<"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<openbox_pipe_menu>\n"
- " <item label=\"Firefox\" icon=\"firefox\">\n"
- " <action name=\"Execute\">\n"
- " <command>firefox</command>\n"
- " </action>\n"
- " </item>\n"
+ " <menu id=\"Network\" label=\"Network\">\n"
+ " <item label=\"Firefox\" icon=\"firefox\">\n"
+ " <action name=\"Execute\">\n"
+ " <command>firefox</command>\n"
+ " </action>\n"
+ " </item>\n"
+ " </menu>\n"
"</openbox_pipe_menu>\n">>,
Rendered
).
entry_without_icon_omits_icon_attr_test() ->
+ Rendered = er_xdg_pipe_menu_renderer:render([
+ entry(<<"Foo">>, <<"foo">>, undefined, [<<"Utility">>])
+ ]),
+ ?assertEqual(
+ <<"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<openbox_pipe_menu>\n"
+ " <menu id=\"Utility\" label=\"Utility\">\n"
+ " <item label=\"Foo\">\n"
+ " <action name=\"Execute\">\n"
+ " <command>foo</command>\n"
+ " </action>\n"
+ " </item>\n"
+ " </menu>\n"
+ "</openbox_pipe_menu>\n">>,
+ Rendered
+ ).
+
+entries_without_categories_go_in_other_submenu_test() ->
Rendered = er_xdg_pipe_menu_renderer:render([entry(<<"Foo">>, <<"foo">>, undefined)]),
?assertEqual(
<<"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<openbox_pipe_menu>\n"
- " <item label=\"Foo\">\n"
- " <action name=\"Execute\">\n"
- " <command>foo</command>\n"
- " </action>\n"
- " </item>\n"
+ " <menu id=\"Other\" label=\"Other\">\n"
+ " <item label=\"Foo\">\n"
+ " <action name=\"Execute\">\n"
+ " <command>foo</command>\n"
+ " </action>\n"
+ " </item>\n"
+ " </menu>\n"
"</openbox_pipe_menu>\n">>,
Rendered
).
hidden_entries_are_dropped_test() ->
Entries = [
- entry(<<"Visible">>, <<"visible">>, undefined),
- entry(<<"Invisible">>, <<"invisible">>, undefined, true)
+ entry(<<"Visible">>, <<"visible">>, undefined, [<<"Utility">>]),
+ entry(<<"Invisible">>, <<"invisible">>, undefined, [<<"Utility">>], true)
],
Rendered = er_xdg_pipe_menu_renderer:render(Entries),
?assertNot(binary:match(Rendered, <<"Invisible">>) =/= nomatch),
?assert(binary:match(Rendered, <<"Visible">>) =/= nomatch).
-entries_are_sorted_case_insensitively_test() ->
+hidden_entry_leaves_no_empty_submenu_test() ->
+ Entries = [entry(<<"Invisible">>, <<"invisible">>, undefined, [<<"Utility">>], true)],
+ Rendered = er_xdg_pipe_menu_renderer:render(Entries),
+ ?assertNot(binary:match(Rendered, <<"Utility">>) =/= nomatch).
+
+entries_are_sorted_case_insensitively_within_a_submenu_test() ->
Entries = [
- entry(<<"zeta">>, <<"zeta">>, undefined),
- entry(<<"Alpha">>, <<"alpha">>, undefined),
- entry(<<"beta">>, <<"beta">>, undefined)
+ entry(<<"zeta">>, <<"zeta">>, undefined, [<<"Utility">>]),
+ entry(<<"Alpha">>, <<"alpha">>, undefined, [<<"Utility">>]),
+ entry(<<"beta">>, <<"beta">>, undefined, [<<"Utility">>])
],
Rendered = er_xdg_pipe_menu_renderer:render(Entries),
Positions = [
@@ -69,28 +103,65 @@ entries_are_sorted_case_insensitively_test() ->
],
?assertEqual(Positions, lists:sort(Positions)).
+submenus_are_sorted_case_insensitively_test() ->
+ Entries = [
+ entry(<<"Zed App">>, <<"zed">>, undefined, [<<"zeta">>]),
+ entry(<<"Alpha App">>, <<"alpha">>, undefined, [<<"Alpha">>]),
+ entry(<<"Beta App">>, <<"beta">>, undefined, [<<"beta">>])
+ ],
+ Rendered = er_xdg_pipe_menu_renderer:render(Entries),
+ Positions = [
+ element(1, binary:match(Rendered, <<"label=\"Alpha\"">>)),
+ element(1, binary:match(Rendered, <<"label=\"beta\"">>)),
+ element(1, binary:match(Rendered, <<"label=\"zeta\"">>))
+ ],
+ ?assertEqual(Positions, lists:sort(Positions)).
+
+entry_with_multiple_categories_appears_in_each_submenu_test() ->
+ Entries = [entry(<<"Foo">>, <<"foo">>, undefined, [<<"Utility">>, <<"Development">>])],
+ Rendered = er_xdg_pipe_menu_renderer:render(Entries),
+ {Doc, _Rest} = xmerl_scan:string(binary_to_list(Rendered)),
+ Menus = [E || E = #xmlElement{name = menu} <- Doc#xmlElement.content],
+ ?assertEqual([<<"Development">>, <<"Utility">>], lists:sort([menu_id(M) || M <- Menus])),
+ Items = [I || M <- Menus, I = #xmlElement{name = item} <- M#xmlElement.content],
+ ?assertEqual(2, length(Items)).
+
escapes_special_characters_test() ->
- Entry = entry(<<"Foo & <Bar> \"Baz\"">>, <<"foo --title=\"<x>&y\"">>, <<"icon\"&<>">>),
+ Entry = entry(
+ <<"Foo & <Bar> \"Baz\"">>,
+ <<"foo --title=\"<x>&y\"">>,
+ <<"icon\"&<>">>,
+ [<<"Foo & <Bar>">>]
+ ),
Rendered = er_xdg_pipe_menu_renderer:render([Entry]),
?assertEqual(
<<"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<openbox_pipe_menu>\n"
- " <item label=\"Foo &amp; &lt;Bar&gt; &quot;Baz&quot;\" icon=\"icon&quot;&amp;&lt;&gt;\">\n"
- " <action name=\"Execute\">\n"
- " <command>foo --title=\"&lt;x&gt;&amp;y\"</command>\n"
- " </action>\n"
- " </item>\n"
+ " <menu id=\"Foo &amp; &lt;Bar>\" label=\"Foo &amp; &lt;Bar>\">\n"
+ " <item label=\"Foo &amp; &lt;Bar> &quot;Baz&quot;\" icon=\"icon&quot;&amp;&lt;>\">\n"
+ " <action name=\"Execute\">\n"
+ " <command>foo --title=\"&lt;x&gt;&amp;y\"</command>\n"
+ " </action>\n"
+ " </item>\n"
+ " </menu>\n"
"</openbox_pipe_menu>\n">>,
Rendered
).
output_is_well_formed_xml_test() ->
Entries = [
- entry(<<"Firefox">>, <<"firefox">>, <<"firefox">>),
- entry(<<"Foo & Bar">>, <<"foo">>, undefined)
+ entry(<<"Firefox">>, <<"firefox">>, <<"firefox">>, [<<"Network">>]),
+ entry(<<"Foo & Bar">>, <<"foo">>, undefined, [<<"Network">>])
],
Rendered = er_xdg_pipe_menu_renderer:render(Entries),
{Doc, _Rest} = xmerl_scan:string(binary_to_list(Rendered)),
?assertEqual(openbox_pipe_menu, Doc#xmlElement.name),
- Items = [E || E = #xmlElement{name = item} <- Doc#xmlElement.content],
+ Menus = [E || E = #xmlElement{name = menu} <- Doc#xmlElement.content],
+ ?assertEqual(1, length(Menus)),
+ [Menu] = Menus,
+ Items = [E || E = #xmlElement{name = item} <- Menu#xmlElement.content],
?assertEqual(2, length(Items)).
+
+menu_id(#xmlElement{attributes = Attrs}) ->
+ [Value] = [V || #xmlAttribute{name = id, value = V} <- Attrs],
+ list_to_binary(Value).