1import ../make-test-python.nix (
2 { lib, ... }:
3 rec {
4 name = "fcitx5";
5 meta.maintainers = with lib.maintainers; [ nevivurn ];
6
7 nodes.machine =
8 { pkgs, ... }:
9 {
10 imports = [
11 ../common/user-account.nix
12 ];
13
14 environment.systemPackages = [
15 # To avoid clashing with xfce4-terminal
16 pkgs.alacritty
17 ];
18
19 services.displayManager.autoLogin = {
20 enable = true;
21 user = "alice";
22 };
23
24 services.xserver = {
25 enable = true;
26 displayManager.lightdm.enable = true;
27 desktopManager.xfce.enable = true;
28 };
29
30 i18n.inputMethod = {
31 enable = true;
32 type = "fcitx5";
33 fcitx5.addons = [
34 pkgs.fcitx5-chinese-addons
35 pkgs.fcitx5-hangul
36 pkgs.fcitx5-m17n
37 pkgs.fcitx5-mozc
38 ];
39 fcitx5.settings = {
40 globalOptions = {
41 "Hotkey"."EnumerateSkipFirst" = "False";
42 "Hotkey/TriggerKeys"."0" = "Control+space";
43 "Hotkey/EnumerateForwardKeys"."0" = "Alt+Shift_L";
44 "Hotkey/EnumerateBackwardKeys"."0" = "Alt+Shift_R";
45 };
46 inputMethod = {
47 "GroupOrder" = {
48 "0" = "NixOS_test";
49 };
50 "Groups/0" = {
51 "Default Layout" = "us";
52 "DefaultIM" = "wbx";
53 "Name" = "NixOS_test";
54 };
55 "Groups/0/Items/0" = {
56 "Name" = "keyboard-us";
57 };
58 "Groups/0/Items/1" = {
59 "Layout" = "us";
60 "Name" = "wbx";
61 };
62 "Groups/0/Items/2" = {
63 "Layout" = "us";
64 "Name" = "hangul";
65 };
66 "Groups/0/Items/3" = {
67 "Layout" = "us";
68 "Name" = "m17n_sa_harvard-kyoto";
69 };
70 "Groups/0/Items/4" = {
71 "Layout" = "us";
72 "Name" = "mozc";
73 };
74 };
75 };
76 };
77 };
78
79 testScript =
80 { nodes, ... }:
81 let
82 user = nodes.machine.users.users.alice;
83 xauth = "${user.home}/.Xauthority";
84 in
85 ''
86 start_all()
87
88 machine.wait_for_x()
89 machine.wait_for_file("${xauth}")
90 machine.succeed("xauth merge ${xauth}")
91 machine.sleep(5)
92
93 machine.wait_until_succeeds("pgrep fcitx5")
94 machine.succeed("su - ${user.name} -c 'kill $(pgrep fcitx5)'")
95 machine.sleep(1)
96
97 machine.succeed("su - ${user.name} -c 'alacritty >&2 &'")
98 machine.wait_for_window("alice@machine")
99
100 machine.succeed("su - ${user.name} -c 'fcitx5 >&2 &'")
101 machine.sleep(10)
102
103 ### Type on terminal
104 machine.send_chars("echo ")
105 machine.sleep(1)
106
107 ### Start fcitx Unicode input
108 machine.send_key("ctrl-alt-shift-u")
109 machine.sleep(1)
110
111 ### Search for smiling face
112 machine.send_chars("smil")
113 machine.sleep(1)
114
115 ### Navigate to the second one
116 machine.send_key("tab")
117 machine.sleep(1)
118
119 ### Choose it
120 machine.send_key("\n")
121 machine.sleep(1)
122
123 ### Start fcitx language input
124 machine.send_key("ctrl-spc")
125 machine.sleep(1)
126
127 ### Default wubi, enter 一下
128 machine.send_chars("gggh ")
129 machine.sleep(1)
130
131 ### Switch to Hangul
132 machine.send_key("alt-shift")
133 machine.sleep(1)
134
135 ### Enter 한
136 machine.send_chars("gks")
137 machine.sleep(1)
138
139 ### Switch to Harvard Kyoto
140 machine.send_key("alt-shift")
141 machine.sleep(1)
142
143 ### Enter क
144 machine.send_chars("ka")
145 machine.sleep(1)
146
147 ### Switch to Mozc
148 machine.send_key("alt-shift")
149 machine.sleep(1)
150
151 ### Enter か
152 machine.send_chars("ka\n")
153 machine.sleep(1)
154
155 ### Turn off Fcitx
156 machine.send_key("ctrl-spc")
157 machine.sleep(1)
158
159 ### Redirect typed characters to a file
160 machine.send_chars(" > fcitx_test.out\n")
161 machine.sleep(1)
162 machine.screenshot("terminal_chars")
163
164 ### Verify that file contents are as expected
165 file_content = machine.succeed("cat ${user.home}/fcitx_test.out")
166 assert file_content == "☺一下한कか\n", f'output does not match input:\n{file_content}'
167 '';
168 }
169)