1import ../make-test-python.nix ({ lib, ... }:
2rec {
3 name = "fcitx5";
4 meta.maintainers = with lib.maintainers; [ nevivurn ];
5
6 nodes.machine = { pkgs, ... }:
7 {
8 imports = [
9 ../common/user-account.nix
10 ];
11
12 environment.systemPackages = [
13 # To avoid clashing with xfce4-terminal
14 pkgs.alacritty
15 ];
16
17 services.xserver = {
18 enable = true;
19
20 displayManager = {
21 lightdm.enable = true;
22 autoLogin = {
23 enable = true;
24 user = "alice";
25 };
26 };
27
28 desktopManager.xfce.enable = true;
29 };
30
31 i18n.inputMethod = {
32 enabled = "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 = { nodes, ... }:
80 let
81 user = nodes.machine.users.users.alice;
82 xauth = "${user.home}/.Xauthority";
83 in
84 ''
85 start_all()
86
87 machine.wait_for_x()
88 machine.wait_for_file("${xauth}")
89 machine.succeed("xauth merge ${xauth}")
90 machine.sleep(5)
91
92 machine.wait_until_succeeds("pgrep fcitx5")
93 machine.succeed("su - ${user.name} -c 'kill $(pgrep fcitx5)'")
94 machine.sleep(1)
95
96 machine.succeed("su - ${user.name} -c 'alacritty >&2 &'")
97 machine.wait_for_window("alice@machine")
98
99 machine.succeed("su - ${user.name} -c 'fcitx5 >&2 &'")
100 machine.sleep(10)
101
102 ### Type on terminal
103 machine.send_chars("echo ")
104 machine.sleep(1)
105
106 ### Start fcitx Unicode input
107 machine.send_key("ctrl-alt-shift-u")
108 machine.sleep(1)
109
110 ### Search for smiling face
111 machine.send_chars("smil")
112 machine.sleep(1)
113
114 ### Navigate to the second one
115 machine.send_key("tab")
116 machine.sleep(1)
117
118 ### Choose it
119 machine.send_key("\n")
120 machine.sleep(1)
121
122 ### Start fcitx language input
123 machine.send_key("ctrl-spc")
124 machine.sleep(1)
125
126 ### Default wubi, enter 一下
127 machine.send_chars("gggh ")
128 machine.sleep(1)
129
130 ### Switch to Hangul
131 machine.send_key("alt-shift")
132 machine.sleep(1)
133
134 ### Enter 한
135 machine.send_chars("gks")
136 machine.sleep(1)
137
138 ### Switch to Harvard Kyoto
139 machine.send_key("alt-shift")
140 machine.sleep(1)
141
142 ### Enter क
143 machine.send_chars("ka")
144 machine.sleep(1)
145
146 ### Switch to Mozc
147 machine.send_key("alt-shift")
148 machine.sleep(1)
149
150 ### Enter か
151 machine.send_chars("ka\n")
152 machine.sleep(1)
153
154 ### Turn off Fcitx
155 machine.send_key("ctrl-spc")
156 machine.sleep(1)
157
158 ### Redirect typed characters to a file
159 machine.send_chars(" > fcitx_test.out\n")
160 machine.sleep(1)
161 machine.screenshot("terminal_chars")
162
163 ### Verify that file contents are as expected
164 file_content = machine.succeed("cat ${user.home}/fcitx_test.out")
165 assert file_content == "☺一下한कか\n"
166 ''
167 ;
168})