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.succeed("su - ${user.name} -c 'kill $(pgrep fcitx5)'")
93 machine.sleep(1)
94
95 machine.succeed("su - ${user.name} -c 'alacritty >&2 &'")
96 machine.succeed("su - ${user.name} -c 'fcitx5 >&2 &'")
97 machine.sleep(10)
98
99 ### Type on terminal
100 machine.send_chars("echo ")
101 machine.sleep(1)
102
103 ### Start fcitx Unicode input
104 machine.send_key("ctrl-alt-shift-u")
105 machine.sleep(1)
106
107 ### Search for smiling face
108 machine.send_chars("smil")
109 machine.sleep(1)
110
111 ### Navigate to the second one
112 machine.send_key("tab")
113 machine.sleep(1)
114
115 ### Choose it
116 machine.send_key("\n")
117 machine.sleep(1)
118
119 ### Start fcitx language input
120 machine.send_key("ctrl-spc")
121 machine.sleep(1)
122
123 ### Default wubi, enter 一下
124 machine.send_chars("gggh ")
125 machine.sleep(1)
126
127 ### Switch to Hangul
128 machine.send_key("alt-shift")
129 machine.sleep(1)
130
131 ### Enter 한
132 machine.send_chars("gks")
133 machine.sleep(1)
134
135 ### Switch to Harvard Kyoto
136 machine.send_key("alt-shift")
137 machine.sleep(1)
138
139 ### Enter क
140 machine.send_chars("ka")
141 machine.sleep(1)
142
143 ### Switch to Mozc
144 machine.send_key("alt-shift")
145 machine.sleep(1)
146
147 ### Enter か
148 machine.send_chars("ka\n")
149 machine.sleep(1)
150
151 ### Turn off Fcitx
152 machine.send_key("ctrl-spc")
153 machine.sleep(1)
154
155 ### Redirect typed characters to a file
156 machine.send_chars(" > fcitx_test.out\n")
157 machine.sleep(1)
158 machine.screenshot("terminal_chars")
159
160 ### Verify that file contents are as expected
161 file_content = machine.succeed("cat ${user.home}/fcitx_test.out")
162 assert file_content == "☺一下한कか\n"
163 ''
164 ;
165})