forked from
futur.blue/pegasus
objective categorical abstract machine language personal data server
1open Alcotest
2open Hermes_cli.Naming
3
4(** helpers *)
5let test_string = testable Fmt.string String.equal
6
7let test_camel_to_snake_simple () =
8 check test_string "simple camelCase" "first_name" (camel_to_snake "firstName")
9
10let test_camel_to_snake_single () =
11 check test_string "single word" "name" (camel_to_snake "name")
12
13let test_camel_to_snake_already_snake () =
14 check test_string "already snake_case" "first_name"
15 (camel_to_snake "first_name")
16
17let test_camel_to_snake_multiple_caps () =
18 check test_string "multiple caps" "auth_factor_token"
19 (camel_to_snake "authFactorToken")
20
21let test_camel_to_snake_leading_cap () =
22 check test_string "leading capital" "name" (camel_to_snake "Name")
23
24let test_camel_to_snake_all_caps () =
25 check test_string "all caps sequence" "d_i_d" (camel_to_snake "DID")
26
27let test_camel_to_snake_empty () =
28 check test_string "empty string" "" (camel_to_snake "")
29
30let test_is_reserved_type () =
31 check bool "type is reserved" true (is_reserved "type")
32
33let test_is_reserved_module () =
34 check bool "module is reserved" true (is_reserved "module")
35
36let test_is_reserved_and () =
37 check bool "and is reserved" true (is_reserved "and")
38
39let test_is_reserved_user () =
40 check bool "user is not reserved" false (is_reserved "user")
41
42let test_is_reserved_case_insensitive () =
43 check bool "TYPE is reserved (case insensitive)" true (is_reserved "TYPE")
44
45let test_escape_keyword_reserved () =
46 check test_string "escapes type" "type_" (escape_keyword "type")
47
48let test_escape_keyword_not_reserved () =
49 check test_string "does not escape user" "user" (escape_keyword "user")
50
51let test_escape_keyword_module () =
52 check test_string "escapes module" "module_" (escape_keyword "module")
53
54let test_field_name_camel () =
55 check test_string "converts camelCase" "first_name" (field_name "firstName")
56
57let test_field_name_reserved () =
58 check test_string "escapes reserved" "type_" (field_name "type")
59
60let test_field_name_camel_reserved () =
61 check test_string "converts and escapes" "to_" (field_name "to")
62
63let test_module_name_simple () =
64 check test_string "capitalizes" "App" (module_name_of_segment "app")
65
66let test_module_name_already_cap () =
67 check test_string "already capitalized" "App" (module_name_of_segment "App")
68
69let test_module_name_empty () =
70 check test_string "empty string" "" (module_name_of_segment "")
71
72let test_module_path_simple () =
73 check (list test_string) "simple path" ["App"; "Bsky"; "Graph"]
74 (module_path_of_nsid "app.bsky.graph")
75
76let test_module_path_single () =
77 check (list test_string) "single segment" ["App"] (module_path_of_nsid "app")
78
79let test_module_path_full () =
80 check (list test_string) "full nsid"
81 ["Com"; "Atproto"; "Server"; "CreateSession"]
82 (module_path_of_nsid "com.atproto.server.createSession")
83
84let test_type_name_of_nsid () =
85 check test_string "extracts last segment" "get_profile"
86 (type_name_of_nsid "app.bsky.actor.getProfile")
87
88let test_type_name_simple () =
89 check test_string "converts name" "invite_code" (type_name "inviteCode")
90
91let test_type_name_reserved () =
92 check test_string "escapes reserved" "type_" (type_name "type")
93
94let test_def_module_name () =
95 check test_string "capitalizes" "InviteCode" (def_module_name "inviteCode")
96
97let test_variant_local_ref () =
98 check test_string "local ref" "Relationship"
99 (variant_name_of_ref "#relationship")
100
101let test_variant_external_ref () =
102 check test_string "external ref" "SomeDef"
103 (variant_name_of_ref "com.example.defs#someDef")
104
105let test_variant_just_nsid () =
106 check test_string "just nsid" "Defs" (variant_name_of_ref "com.example.defs")
107
108let test_flat_module_name () =
109 check test_string "flat name" "Com_atproto_server_defs"
110 (flat_module_name_of_nsid "com.atproto.server.defs")
111
112let test_flat_module_name_short () =
113 check test_string "short nsid" "App_bsky"
114 (flat_module_name_of_nsid "app.bsky")
115
116let test_file_path () =
117 check test_string "file path" "com_atproto_server_defs.ml"
118 (file_path_of_nsid "com.atproto.server.defs")
119
120let test_key_annotation_needed () =
121 check test_string "annotation needed" " [@key \"firstName\"]"
122 (key_annotation "firstName" "first_name")
123
124let test_key_annotation_not_needed () =
125 check test_string "annotation not needed" "" (key_annotation "name" "name")
126
127let camel_to_snake_tests =
128 [ ("simple camelCase", `Quick, test_camel_to_snake_simple)
129 ; ("single word", `Quick, test_camel_to_snake_single)
130 ; ("already snake_case", `Quick, test_camel_to_snake_already_snake)
131 ; ("multiple caps", `Quick, test_camel_to_snake_multiple_caps)
132 ; ("leading capital", `Quick, test_camel_to_snake_leading_cap)
133 ; ("all caps", `Quick, test_camel_to_snake_all_caps)
134 ; ("empty string", `Quick, test_camel_to_snake_empty) ]
135
136let is_reserved_tests =
137 [ ("type is reserved", `Quick, test_is_reserved_type)
138 ; ("module is reserved", `Quick, test_is_reserved_module)
139 ; ("and is reserved", `Quick, test_is_reserved_and)
140 ; ("user is not reserved", `Quick, test_is_reserved_user)
141 ; ("case insensitive", `Quick, test_is_reserved_case_insensitive) ]
142
143let escape_keyword_tests =
144 [ ("escapes reserved", `Quick, test_escape_keyword_reserved)
145 ; ("does not escape non-reserved", `Quick, test_escape_keyword_not_reserved)
146 ; ("escapes module", `Quick, test_escape_keyword_module) ]
147
148let field_name_tests =
149 [ ("converts camelCase", `Quick, test_field_name_camel)
150 ; ("escapes reserved", `Quick, test_field_name_reserved)
151 ; ("converts and escapes", `Quick, test_field_name_camel_reserved) ]
152
153let module_name_tests =
154 [ ("capitalizes segment", `Quick, test_module_name_simple)
155 ; ("already capitalized", `Quick, test_module_name_already_cap)
156 ; ("empty string", `Quick, test_module_name_empty)
157 ; ("module path simple", `Quick, test_module_path_simple)
158 ; ("module path single", `Quick, test_module_path_single)
159 ; ("module path full", `Quick, test_module_path_full) ]
160
161let type_name_tests =
162 [ ("type_name_of_nsid", `Quick, test_type_name_of_nsid)
163 ; ("type_name simple", `Quick, test_type_name_simple)
164 ; ("type_name reserved", `Quick, test_type_name_reserved)
165 ; ("def_module_name", `Quick, test_def_module_name) ]
166
167let variant_name_tests =
168 [ ("local ref", `Quick, test_variant_local_ref)
169 ; ("external ref", `Quick, test_variant_external_ref)
170 ; ("just nsid", `Quick, test_variant_just_nsid) ]
171
172let flat_module_tests =
173 [ ("flat module name", `Quick, test_flat_module_name)
174 ; ("flat module short", `Quick, test_flat_module_name_short)
175 ; ("file path", `Quick, test_file_path) ]
176
177let annotation_tests =
178 [ ("annotation needed", `Quick, test_key_annotation_needed)
179 ; ("annotation not needed", `Quick, test_key_annotation_not_needed) ]
180
181let () =
182 run "Naming"
183 [ ("camel_to_snake", camel_to_snake_tests)
184 ; ("is_reserved", is_reserved_tests)
185 ; ("escape_keyword", escape_keyword_tests)
186 ; ("field_name", field_name_tests)
187 ; ("module_name", module_name_tests)
188 ; ("type_name", type_name_tests)
189 ; ("variant_name", variant_name_tests)
190 ; ("flat_module", flat_module_tests)
191 ; ("annotations", annotation_tests) ]