aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClombrong <cromblong@egregore.fun>2025-07-02 01:14:04 +0200
committerClombrong <cromblong@egregore.fun>2025-07-26 21:55:50 +0200
commit5267e59dc1cb470a1b2ed169a5853273bce4af93 (patch)
treec271567cdb17950d9470b1dedda5bf5d0d7558a5
parent6ac86e89debfd98746457fea98e7d1361865e780 (diff)
test(jid): add all RFC7622 examples
-rw-r--r--lib/jid.ml43
1 files changed, 43 insertions, 0 deletions
diff --git a/lib/jid.ml b/lib/jid.ml
index 6bbdd93..d2c7361 100644
--- a/lib/jid.ml
+++ b/lib/jid.ml
@@ -60,6 +60,9 @@ let show ({ localpart; domainpart; resourcepart } : t) =
resourcepart = %s }|}
(show_opt localpart) domainpart (show_opt resourcepart)
+
+(* RFC7622 3.5 examples *)
+
let%expect_test {|A "bare JID"|} =
"juliet@example.com" |> of_string |> show |> print_string;
[%expect {|
@@ -74,6 +77,46 @@ let%expect_test {|A "full JID"|} =
domainpart = "example.com";
resourcepart = Some "foo" } |}]
+let%expect_test {|Single space in resourcepart|} =
+ "juliet@example.com/foo bar" |> of_string |> show |> print_string
+
+let%expect_test {|"At" sign in resourcepart|} =
+ "juliet@example.com/foo@bar" |> of_string |> show |> print_string
+
+let%expect_test {|Single space in localpart, as optionally escaped using the XMPP JID Escaping extension|} =
+ "foo\\20bar@example.com" |> of_string |> show |> print_string
+
+let%expect_test {|Another bare JID|} =
+ "fussball@example.com" |> of_string |> show |> print_string
+
+let%expect_test {|The third character is LATIN SMALL LETTER SHARP S (U+00DF)|} =
+ "fußball@example.com" |> of_string |> show |> print_string
+
+let%expect_test {|A localpart of GREEK SMALL LETTER PI (U+03C0)|} =
+ "π@example.com" |> of_string |> show |> print_string
+
+let%expect_test {|A localpart of GREEK CAPITAL LETTER SIGMA (U+03A3)|} =
+ "Σ@example.com/foo" |> of_string |> show |> print_string
+
+let%expect_test {|A localpart of GREEK SMALL LETTER SIGMA (U+03C3)|} =
+ "σ@example.com/foo" |> of_string |> show |> print_string
+
+let%expect_test {|A localpart of GREEK SMALL LETTER FINAL SIGMA (U+03C2)|} =
+ "ς@example.com/foo" |> of_string |> show |> print_string
+
+let%expect_test {|A resourcepart of the Unicode character BLACK CHESS KING (U+265A)|} =
+ "king@example.com/♚" |> of_string |> show |> print_string
+
+let%expect_test {|A domainpart|} =
+ "example.com" |> of_string |> show |> print_string
+
+let%expect_test {|A domainpart and resourcepart|} =
+ "example.com/foobar" |> of_string |> show |> print_string
+
+let%expect_test {|A domainpart followed by a resourcepart that contains an "at" sign|} =
+ "a.example.com/b@example.net" |> of_string |> show |> print_string
+
+
let to_string ({ localpart; domainpart; resourcepart } : t) =
let local = Option.fold ~none:"" ~some:(fun l -> l ^ "@") localpart
and resource = Option.fold ~none:"" ~some:(fun r -> "/" ^ r) resourcepart