1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
-module(er_xdg_pipe_menu_renderer_tests).
-include_lib("eunit/include/eunit.hrl").
-include_lib("xmerl/include/xmerl.hrl").
-include("er_xdg_pipe_menu.hrl").
entry(Name, Exec, Icon) ->
entry(Name, Exec, Icon, false).
entry(Name, Exec, Icon, Hidden) ->
#desktop_entry{name = Name, exec = Exec, icon = Icon, hidden = Hidden}.
empty_list_renders_empty_menu_test() ->
?assertEqual(
<<"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<openbox_pipe_menu>\n"
"</openbox_pipe_menu>\n">>,
er_xdg_pipe_menu_renderer:render([])
).
single_entry_with_icon_test() ->
Rendered = er_xdg_pipe_menu_renderer:render([entry(<<"Firefox">>, <<"firefox">>, <<"firefox">>)]),
?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"
"</openbox_pipe_menu>\n">>,
Rendered
).
entry_without_icon_omits_icon_attr_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"
"</openbox_pipe_menu>\n">>,
Rendered
).
hidden_entries_are_dropped_test() ->
Entries = [
entry(<<"Visible">>, <<"visible">>, undefined),
entry(<<"Invisible">>, <<"invisible">>, undefined, 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() ->
Entries = [
entry(<<"zeta">>, <<"zeta">>, undefined),
entry(<<"Alpha">>, <<"alpha">>, undefined),
entry(<<"beta">>, <<"beta">>, undefined)
],
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)).
escapes_special_characters_test() ->
Entry = entry(<<"Foo & <Bar> \"Baz\"">>, <<"foo --title=\"<x>&y\"">>, <<"icon\"&<>">>),
Rendered = er_xdg_pipe_menu_renderer:render([Entry]),
?assertEqual(
<<"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<openbox_pipe_menu>\n"
" <item label=\"Foo & <Bar> "Baz"\" icon=\"icon"&<>\">\n"
" <action name=\"Execute\">\n"
" <command>foo --title=\"<x>&y\"</command>\n"
" </action>\n"
" </item>\n"
"</openbox_pipe_menu>\n">>,
Rendered
).
output_is_well_formed_xml_test() ->
Entries = [
entry(<<"Firefox">>, <<"firefox">>, <<"firefox">>),
entry(<<"Foo & Bar">>, <<"foo">>, undefined)
],
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],
?assertEqual(2, length(Items)).
|