This commit is contained in:
swrup 2025-11-11 02:07:51 +01:00
parent aa2ff7b2f0
commit 2f3113f55d
11742 changed files with 1223940 additions and 0 deletions

View file

@ -0,0 +1,160 @@
open! Import
open! Char
let%test _ = not (is_whitespace '\008')
(* backspace *)
let%test _ = is_whitespace '\009'
(* '\t': horizontal tab *)
let%test _ = is_whitespace '\010'
(* '\n': line feed *)
let%test _ = is_whitespace '\011'
(* '\v': vertical tab *)
let%test _ = is_whitespace '\012'
(* '\f': form feed *)
let%test _ = is_whitespace '\013'
(* '\r': carriage return *)
let%test _ = not (is_whitespace '\014')
(* shift out *)
let%test _ = is_whitespace '\032'
(* space *)
let%expect_test "hash coherence" =
check_hash_coherence [%here] (module Char) [ min_value; 'a'; max_value ];
[%expect {| |}]
;;
let%test_module "int to char conversion" =
(module struct
let%test_unit "of_int bounds" =
let bounds_check i =
[%test_result: t option] (of_int i) ~expect:None ~message:(Int.to_string i)
in
for i = 1 to 100 do
bounds_check (-i);
bounds_check (255 + i)
done
;;
let%test_unit "of_int_exn vs of_int" =
for i = -100 to 300 do
[%test_eq: t option]
(of_int i)
(Option.try_with (fun () -> of_int_exn i))
~message:(Int.to_string i)
done
;;
let%test_unit "unsafe_of_int vs of_int_exn" =
for i = 0 to 255 do
[%test_eq: t] (unsafe_of_int i) (of_int_exn i) ~message:(Int.to_string i)
done
;;
end)
;;
let%expect_test "all" =
Ref.set_temporarily sexp_style To_string_hum ~f:(fun () ->
print_s [%sexp (all : t list)]);
[%expect
{|
("\000" "\001" "\002" "\003" "\004" "\005" "\006" "\007" "\b" "\t" "\n"
"\011" "\012" "\r" "\014" "\015" "\016" "\017" "\018" "\019" "\020" "\021"
"\022" "\023" "\024" "\025" "\026" "\027" "\028" "\029" "\030" "\031" " " !
"\"" # $ % & ' "(" ")" * + , - . / 0 1 2 3 4 5 6 7 8 9 : ";" < = > ? @ A B C
D E F G H I J K L M N O P Q R S T U V W X Y Z [ "\\" ] ^ _ ` a b c d e f g h
i j k l m n o p q r s t u v w x y z { | } ~ "\127" "\128" "\129" "\130"
"\131" "\132" "\133" "\134" "\135" "\136" "\137" "\138" "\139" "\140" "\141"
"\142" "\143" "\144" "\145" "\146" "\147" "\148" "\149" "\150" "\151" "\152"
"\153" "\154" "\155" "\156" "\157" "\158" "\159" "\160" "\161" "\162" "\163"
"\164" "\165" "\166" "\167" "\168" "\169" "\170" "\171" "\172" "\173" "\174"
"\175" "\176" "\177" "\178" "\179" "\180" "\181" "\182" "\183" "\184" "\185"
"\186" "\187" "\188" "\189" "\190" "\191" "\192" "\193" "\194" "\195" "\196"
"\197" "\198" "\199" "\200" "\201" "\202" "\203" "\204" "\205" "\206" "\207"
"\208" "\209" "\210" "\211" "\212" "\213" "\214" "\215" "\216" "\217" "\218"
"\219" "\220" "\221" "\222" "\223" "\224" "\225" "\226" "\227" "\228" "\229"
"\230" "\231" "\232" "\233" "\234" "\235" "\236" "\237" "\238" "\239" "\240"
"\241" "\242" "\243" "\244" "\245" "\246" "\247" "\248" "\249" "\250" "\251"
"\252" "\253" "\254" "\255")
|}]
;;
let%expect_test "predicates" =
Ref.set_temporarily sexp_style To_string_hum ~f:(fun () ->
print_s [%sexp (List.filter all ~f:is_digit : t list)];
[%expect {| (0 1 2 3 4 5 6 7 8 9) |}];
print_s [%sexp (List.filter all ~f:is_lowercase : t list)];
[%expect {| (a b c d e f g h i j k l m n o p q r s t u v w x y z) |}];
print_s [%sexp (List.filter all ~f:is_uppercase : t list)];
[%expect {| (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) |}];
print_s [%sexp (List.filter all ~f:is_alpha : t list)];
[%expect
{|
(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l
m n o p q r s t u v w x y z)
|}];
print_s [%sexp (List.filter all ~f:is_alphanum : t list)];
[%expect
{|
(0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b
c d e f g h i j k l m n o p q r s t u v w x y z)
|}];
print_s [%sexp (List.filter all ~f:is_print : t list)];
[%expect
{|
(" " ! "\"" # $ % & ' "(" ")" * + , - . / 0 1 2 3 4 5 6 7 8 9 : ";" < = > ? @
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ "\\" ] ^ _ ` a b c d e
f g h i j k l m n o p q r s t u v w x y z { | } ~)
|}];
print_s [%sexp (List.filter all ~f:is_whitespace : t list)];
[%expect {| ("\t" "\n" "\011" "\012" "\r" " ") |}];
print_s [%sexp (List.filter all ~f:is_hex_digit : t list)];
[%expect {| (0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f) |}];
print_s [%sexp (List.filter all ~f:is_hex_digit_lower : t list)];
[%expect {| (0 1 2 3 4 5 6 7 8 9 a b c d e f) |}];
print_s [%sexp (List.filter all ~f:is_hex_digit_upper : t list)];
[%expect {| (0 1 2 3 4 5 6 7 8 9 A B C D E F) |}])
;;
let%expect_test "get_hex_digit" =
Ref.set_temporarily sexp_style To_string_hum ~f:(fun () ->
let hex_digit_alist =
List.filter_map Char.all ~f:(fun char ->
Option.map (get_hex_digit char) ~f:(fun digit -> char, digit))
in
print_s [%sexp (hex_digit_alist : (char * int) list)];
[%expect
{|
((0 0) (1 1) (2 2) (3 3) (4 4) (5 5) (6 6) (7 7) (8 8) (9 9) (A 10) (B 11)
(C 12) (D 13) (E 14) (F 15) (a 10) (b 11) (c 12) (d 13) (e 14) (f 15))
|}];
require_equal
[%here]
(module struct
type t = (char * int) list [@@deriving equal, sexp_of]
end)
(Char.all
|> List.filter ~f:is_hex_digit
|> List.map ~f:(fun char -> char, get_hex_digit_exn char))
hex_digit_alist;
[%expect {| |}];
require_does_raise [%here] (fun () -> get_hex_digit_exn Char.min_value);
[%expect {| ("Char.get_hex_digit_exn: not a hexadecimal digit" (char "\000")) |}])
;;
let%test_module "Caseless Comparable" =
(module struct
(* examples from docs *)
let%test _ = Caseless.equal 'A' 'a'
let%test _ = Caseless.('a' < 'B')
let%test _ = Int.( <> ) (Caseless.compare 'a' 'B') (compare 'a' 'B')
let%test _ = List.is_sorted ~compare:Caseless.compare [ 'A'; 'b'; 'C' ]
end)
;;